From 60f1fcc4bfddf9b2fca6cf3343b0cca745246483 Mon Sep 17 00:00:00 2001 From: Koud-Wind Date: Sun, 31 Mar 2024 22:34:00 +0800 Subject: [PATCH 1/4] Fix Weapon reload freeze --- .../weaponlib/WeaponReloadAspect.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java b/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java index e3dd6dfb7..48b63bb90 100644 --- a/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java +++ b/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java @@ -273,9 +273,16 @@ public void setStateManager(StateManager new CompoundPermit(s), modContext.getPlayerItemInstanceRegistry()::update, permitManager) .manual() + .in(this) + .change(WeaponState.COMPOUND_RELOAD_FINISH).to(WeaponState.READY) + .when(weaponInstance -> WeaponAttachmentAspect.getActiveAttachment(AttachmentCategory.MAGAZINE, weaponInstance) == null) + .withAction(this::rollbackMagazine) + .automatic() + .in(this) .change(WeaponState.COMPOUND_RELOAD_FINISHED).to(WeaponState.READY) .when(shouldFinishCompoundReload) @@ -592,10 +599,8 @@ private void processActualCompoundPermit(CompoundPermit p, PlayerWeaponInstance Weapon weapon = instance.getWeapon(); List compatibleMagazines = weapon.getCompatibleMagazines().stream().filter(compatibleMagazine -> WeaponAttachmentAspect.hasRequiredAttachments(compatibleMagazine, instance)).collect(Collectors.toList()); - - // Unload weapon - ItemAttachment attachment = modContext.getAttachmentAspect().removeAttachment(AttachmentCategory.MAGAZINE, instance); + previousMagazine = modContext.getAttachmentAspect().removeAttachment(AttachmentCategory.MAGAZINE, instance); // processUnloadPermit(new UnloadPermit(p.getState()), instance); @@ -616,13 +621,13 @@ private void processActualCompoundPermit(CompoundPermit p, PlayerWeaponInstance Tags.setAmmo(weaponItemStack, ammo); WeaponAttachmentAspect.addAttachment((ItemAttachment) magazineStack.getItem(), instance); instance.setAmmo(ammo); - + p.setStatus(Status.GRANTED); - if (attachment == null) + if (previousMagazine == null) p.setStatus(Status.DENIED); - else if (attachment instanceof ItemMagazine && !player.isCreative()) { - ItemStack attachmentItemStack = ((ItemMagazine) attachment).create(originalAmmo); + else if (previousMagazine instanceof ItemMagazine && !player.isCreative()) { + ItemStack attachmentItemStack = ((ItemMagazine) previousMagazine).create(originalAmmo); if (!player.inventory.addItemStackToInventory(attachmentItemStack)) player.dropItem(attachmentItemStack, false); p.setStatus(Status.GRANTED); @@ -816,4 +821,8 @@ public void furtherLoadInstructionsReceived(PlayerWeaponInstance weaponInstance) weaponInstance.setLoadAfterUnloadEnabled(true); stateManager.changeState(this, weaponInstance, WeaponState.UNLOAD, WeaponState.LOAD, WeaponState.ALERT); } + + public void rollbackMagazine(PlayerWeaponInstance weaponInstance) { + WeaponAttachmentAspect.addAttachment(previousMagazine, weaponInstance); + } } From 4db1754373ab4502135da9541b10e6a239901859 Mon Sep 17 00:00:00 2001 From: Koud-Wind Date: Sun, 30 Jun 2024 20:36:07 +0800 Subject: [PATCH 2/4] Update --- .../weaponlib/WeaponReloadAspect.java | 79 +++++++++---------- .../paneedah/weaponlib/WeaponRenderer.java | 8 +- 2 files changed, 40 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java b/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java index 48b63bb90..db1cb82df 100644 --- a/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java +++ b/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java @@ -278,9 +278,8 @@ public void setStateManager(StateManager WeaponAttachmentAspect.getActiveAttachment(AttachmentCategory.MAGAZINE, weaponInstance) == null) - .withAction(this::rollbackMagazine) .automatic() .in(this) @@ -409,43 +408,38 @@ public void clientCompoundReload(PlayerWeaponInstance instance) { public void reloadMainHeldItem(EntityPlayer player) { PlayerWeaponInstance instance = modContext.getPlayerItemInstanceRegistry().getMainHandItemInstance(player, PlayerWeaponInstance.class); + if (instance == null) + return; - if (instance != null) { - if (AnimationModeProcessor.getInstance().isLegacyMode()) { - furtherLoadInstructionsReceived(instance); - stateManager.changeState(this, instance, WeaponState.READY); + if (AnimationModeProcessor.getInstance().isLegacyMode()) { + furtherLoadInstructionsReceived(instance); + stateManager.changeState(this, instance, WeaponState.READY); + return; + } + + if (WeaponAttachmentAspect.getActiveAttachment(AttachmentCategory.MAGAZINE, instance) == null) { + ItemStack nextAttachment = getNextBestMagazineStack(instance); + if (instance.getWeapon().getRenderer().getBuilder().isHasLoadEmpty() && nextAttachment != null && Tags.getAmmo(nextAttachment) == 0) + instance.getWeapon().getRenderer().setShouldDoEmptyVariant(true); + + stateManager.changeState(this, instance, WeaponState.AWAIT_FURTHER_LOAD_INSTRUCTIONS, WeaponState.READY); + } else { + if (instance.getState() != WeaponState.READY && instance.getState() != WeaponState.COMPOUND_REQUESTED) + return; + + ItemAttachment nextAttachment = getNextMagazine(instance); + if (nextAttachment == null) + return; + + instance.markReloadDirt(); + instance.markMagSwapReady(); + if (instance.getAmmo() == 0) { + instance.getWeapon().getRenderer().setMagicMag(instance, nextAttachment, WeaponState.COMPOUND_RELOAD_EMPTY); + stateManager.changeState(this, instance, WeaponState.COMPOUND_RELOAD_EMPTY); } else { - if (WeaponAttachmentAspect.getActiveAttachment(AttachmentCategory.MAGAZINE, instance) == null) { - ItemStack nextAttachment = getNextBestMagazineStack(instance); - if (instance.getWeapon().getRenderer().getBuilder().isHasLoadEmpty() && nextAttachment != null && Tags.getAmmo(nextAttachment) == 0) - instance.getWeapon().getRenderer().setShouldDoEmptyVariant(true); - - stateManager.changeState(this, instance, WeaponState.AWAIT_FURTHER_LOAD_INSTRUCTIONS, WeaponState.READY); - } else { - if (instance.getState() != WeaponState.READY && instance.getState() != WeaponState.COMPOUND_REQUESTED) - return; - - ItemAttachment nextAttachment = getNextMagazine(instance); - - instance.markReloadDirt(); - instance.markMagSwapReady(); - if (instance.getAmmo() == 0) { - if (nextAttachment != null) - instance.getWeapon().getRenderer().setMagicMag(instance, nextAttachment, WeaponState.COMPOUND_RELOAD_EMPTY); - - else - return; - - stateManager.changeState(this, instance, WeaponState.COMPOUND_RELOAD_EMPTY); - } else { - if (nextAttachment != null) - instance.getWeapon().getRenderer().setMagicMag(instance, nextAttachment, WeaponState.COMPOUND_RELOAD); - else - return; - instance.setIsAwaitingCompoundInstructions(true); - stateManager.changeState(this, instance, WeaponState.COMPOUND_REQUESTED, WeaponState.READY); - } - } + instance.getWeapon().getRenderer().setMagicMag(instance, nextAttachment, WeaponState.COMPOUND_RELOAD); + instance.setIsAwaitingCompoundInstructions(true); + stateManager.changeState(this, instance, WeaponState.COMPOUND_REQUESTED, WeaponState.READY); } } } @@ -611,10 +605,13 @@ private void processActualCompoundPermit(CompoundPermit p, PlayerWeaponInstance if (compatibleMagazines.isEmpty()) return; - ItemStack magazineStack = MWCUtil.consumeItemsFromPlayerInventory(compatibleMagazines, (stack1, stack2) -> Integer.compare(Tags.getAmmo(stack1), Tags.getAmmo(stack2)), player); + ItemStack magazineStack = MWCUtil.consumeItemsFromPlayerInventory(compatibleMagazines, Comparator.comparingInt(Tags::getAmmo), player); - if (magazineStack == null) + if (magazineStack == null) { + Tags.setAmmo(weaponItemStack, 0); + instance.setAmmo(0); return; + } //ItemStack magazineStack = ItemStack.EMPTY; int ammo = Tags.getAmmo(magazineStack); @@ -821,8 +818,4 @@ public void furtherLoadInstructionsReceived(PlayerWeaponInstance weaponInstance) weaponInstance.setLoadAfterUnloadEnabled(true); stateManager.changeState(this, weaponInstance, WeaponState.UNLOAD, WeaponState.LOAD, WeaponState.ALERT); } - - public void rollbackMagazine(PlayerWeaponInstance weaponInstance) { - WeaponAttachmentAspect.addAttachment(previousMagazine, weaponInstance); - } } diff --git a/src/main/java/com/paneedah/weaponlib/WeaponRenderer.java b/src/main/java/com/paneedah/weaponlib/WeaponRenderer.java index c4a501817..1f50c3e7c 100644 --- a/src/main/java/com/paneedah/weaponlib/WeaponRenderer.java +++ b/src/main/java/com/paneedah/weaponlib/WeaponRenderer.java @@ -2327,7 +2327,7 @@ protected StateDescriptor getFirstPersonStateDescriptor(EntityLivingBase player, rate = getBuilder().firingRandomizingRate; amplitude = getBuilder().zoomRandomizingAmplitude; } else { - currentState = RenderableState.NORMAL; + currentState = RenderableState.RECOILED; rate = getBuilder().firingRandomizingRate; amplitude = getBuilder().firingRandomizingAmplitude; } @@ -2354,7 +2354,7 @@ protected StateDescriptor getFirstPersonStateDescriptor(EntityLivingBase player, } amplitude = getBuilder().zoomRandomizingAmplitude; } else { - currentState = RenderableState.NORMAL; + currentState = RenderableState.SHOOTING; if(!isLongPaused) { rate = getBuilder().firingRandomizingRate; amplitude = getBuilder().firingRandomizingAmplitude; @@ -2533,7 +2533,7 @@ protected StateDescriptor getThirdPersonStateDescriptor(EntityLivingBase player, rate = getBuilder().firingRandomizingRate; amplitude = getBuilder().zoomRandomizingAmplitude; } else { - currentState = RenderableState.NORMAL; + currentState = RenderableState.RECOILED; rate = getBuilder().firingRandomizingRate; amplitude = getBuilder().firingRandomizingAmplitude; } @@ -2559,7 +2559,7 @@ protected StateDescriptor getThirdPersonStateDescriptor(EntityLivingBase player, } amplitude = getBuilder().zoomRandomizingAmplitude; } else { - currentState = RenderableState.NORMAL; + currentState = RenderableState.SHOOTING; if(!isLongPaused) { rate = getBuilder().firingRandomizingRate; amplitude = getBuilder().firingRandomizingAmplitude; From 37814b06c4bef4feb7dcc4740e210ca8e4fe1299 Mon Sep 17 00:00:00 2001 From: Koud-Wind Date: Sun, 30 Jun 2024 20:49:37 +0800 Subject: [PATCH 3/4] unload --- .../paneedah/weaponlib/WeaponReloadAspect.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java b/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java index db1cb82df..37dbc5c29 100644 --- a/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java +++ b/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java @@ -610,16 +610,17 @@ private void processActualCompoundPermit(CompoundPermit p, PlayerWeaponInstance if (magazineStack == null) { Tags.setAmmo(weaponItemStack, 0); instance.setAmmo(0); - return; - } + player.addItemStackToInventory(previousMagazine.getItemStack()); + } else { - //ItemStack magazineStack = ItemStack.EMPTY; - int ammo = Tags.getAmmo(magazineStack); - Tags.setAmmo(weaponItemStack, ammo); - WeaponAttachmentAspect.addAttachment((ItemAttachment) magazineStack.getItem(), instance); - instance.setAmmo(ammo); + //ItemStack magazineStack = ItemStack.EMPTY; + int ammo = Tags.getAmmo(magazineStack); + Tags.setAmmo(weaponItemStack, ammo); + WeaponAttachmentAspect.addAttachment((ItemAttachment) magazineStack.getItem(), instance); + instance.setAmmo(ammo); - p.setStatus(Status.GRANTED); + p.setStatus(Status.GRANTED); + } if (previousMagazine == null) p.setStatus(Status.DENIED); From 0d7c54e3e97b8f1c98b76d5fc4911f3fc76548de Mon Sep 17 00:00:00 2001 From: Koud-Wind Date: Sun, 30 Jun 2024 21:13:21 +0800 Subject: [PATCH 4/4] clean --- .../weaponlib/WeaponReloadAspect.java | 31 +++++++------------ 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java b/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java index 37dbc5c29..3190f898d 100644 --- a/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java +++ b/src/main/java/com/paneedah/weaponlib/WeaponReloadAspect.java @@ -593,42 +593,35 @@ private void processActualCompoundPermit(CompoundPermit p, PlayerWeaponInstance Weapon weapon = instance.getWeapon(); List compatibleMagazines = weapon.getCompatibleMagazines().stream().filter(compatibleMagazine -> WeaponAttachmentAspect.hasRequiredAttachments(compatibleMagazine, instance)).collect(Collectors.toList()); + if (compatibleMagazines.isEmpty()) + return; previousMagazine = modContext.getAttachmentAspect().removeAttachment(AttachmentCategory.MAGAZINE, instance); + if (previousMagazine == null) { + p.setStatus(Status.DENIED); + return; + } // processUnloadPermit(new UnloadPermit(p.getState()), instance); - int originalAmmo = instance.getAmmo(); - - // Mag list is empty - - if (compatibleMagazines.isEmpty()) - return; ItemStack magazineStack = MWCUtil.consumeItemsFromPlayerInventory(compatibleMagazines, Comparator.comparingInt(Tags::getAmmo), player); - - if (magazineStack == null) { - Tags.setAmmo(weaponItemStack, 0); - instance.setAmmo(0); - player.addItemStackToInventory(previousMagazine.getItemStack()); - } else { - + if (magazineStack != null) { //ItemStack magazineStack = ItemStack.EMPTY; int ammo = Tags.getAmmo(magazineStack); Tags.setAmmo(weaponItemStack, ammo); - WeaponAttachmentAspect.addAttachment((ItemAttachment) magazineStack.getItem(), instance); instance.setAmmo(ammo); - + WeaponAttachmentAspect.addAttachment((ItemAttachment) magazineStack.getItem(), instance); p.setStatus(Status.GRANTED); + } else { + Tags.setAmmo(weaponItemStack, 0); + instance.setAmmo(0); } - if (previousMagazine == null) - p.setStatus(Status.DENIED); - else if (previousMagazine instanceof ItemMagazine && !player.isCreative()) { + if (previousMagazine instanceof ItemMagazine && !player.isCreative()) { ItemStack attachmentItemStack = ((ItemMagazine) previousMagazine).create(originalAmmo); if (!player.inventory.addItemStackToInventory(attachmentItemStack)) player.dropItem(attachmentItemStack, false); - p.setStatus(Status.GRANTED); } }