From 8269163332f3aebf2533e7bd0573c098331ae094 Mon Sep 17 00:00:00 2001 From: Sara Freimer Date: Fri, 10 Dec 2021 11:48:35 -0500 Subject: [PATCH] Fix some modules not being able to be reactivated with the mode change key. Also improve handling slightly for whether handle mode key gets forcibly disabled in cases like grav unit and jetpack --- .../java/mekanism/api/gear/ICustomModule.java | 12 ++++++++++++ src/api/java/mekanism/api/gear/IModule.java | 2 +- .../mekanism/common/content/gear/Module.java | 2 +- .../common/content/gear/ModuleConfigItem.java | 17 ++++++++++++----- .../ModuleGravitationalModulatingUnit.java | 5 +++++ .../mekasuit/ModuleMagneticAttractionUnit.java | 5 +++++ .../mekasuit/ModuleVisionEnhancementUnit.java | 5 +++++ .../common/item/gear/ItemMekaSuitArmor.java | 2 +- .../mekanism/common/item/gear/ItemMekaTool.java | 2 +- .../network/to_server/PacketModeChange.java | 2 +- 10 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/api/java/mekanism/api/gear/ICustomModule.java b/src/api/java/mekanism/api/gear/ICustomModule.java index 0a61426b4e9..7a00db9b362 100644 --- a/src/api/java/mekanism/api/gear/ICustomModule.java +++ b/src/api/java/mekanism/api/gear/ICustomModule.java @@ -74,6 +74,18 @@ default void addHUDStrings(IModule module, Consumer hudS default void addHUDElements(IModule module, Consumer hudElementAdder) { } + /** + * Called to check if this module can change modes when disabled or if it should be skipped. This should be overridden for modules where the mode change key toggles + * whether the module is active. + * + * @param module Module instance. + * + * @return {@code true} if this module can change modes when disabled. + */ + default boolean canChangeModeWhenDisabled(IModule module) { + return false; + } + /** * Called to change the mode of the module. This will only be called if {@link ModuleData#handlesModeChange()} is {@code true}. {@link * IModule#displayModeChange(PlayerEntity, ITextComponent, IHasTextComponent)} is provided to help display the mode change when {@code displayChangeMessage} is {@code diff --git a/src/api/java/mekanism/api/gear/IModule.java b/src/api/java/mekanism/api/gear/IModule.java index 02508b86dda..7e4835d0d3b 100644 --- a/src/api/java/mekanism/api/gear/IModule.java +++ b/src/api/java/mekanism/api/gear/IModule.java @@ -43,7 +43,7 @@ public interface IModule> { boolean isEnabled(); /** - * Gets if this module type ({@link #getData()}) handles mode changes and if this module is configured to handle mode changes in the Module Tweaker. + * Gets if this module type ({@link #getData()}) can currently handle mode changes and if this module is configured to handle mode changes in the Module Tweaker. * * @return {@code true} if this module can handle mode changes. */ diff --git a/src/main/java/mekanism/common/content/gear/Module.java b/src/main/java/mekanism/common/content/gear/Module.java index c5a782e2074..823180acf7f 100644 --- a/src/main/java/mekanism/common/content/gear/Module.java +++ b/src/main/java/mekanism/common/content/gear/Module.java @@ -278,7 +278,7 @@ public void changeMode(@Nonnull PlayerEntity player, @Nonnull ItemStack stack, i @Override public boolean handlesModeChange() { - return data.handlesModeChange() && handleModeChange.get(); + return data.handlesModeChange() && handleModeChange.get() && (isEnabled() || customModule.canChangeModeWhenDisabled(this)); } public void setModeHandlingDisabledForce() { diff --git a/src/main/java/mekanism/common/content/gear/ModuleConfigItem.java b/src/main/java/mekanism/common/content/gear/ModuleConfigItem.java index 58b2578fd90..bc2a0cd44a7 100644 --- a/src/main/java/mekanism/common/content/gear/ModuleConfigItem.java +++ b/src/main/java/mekanism/common/content/gear/ModuleConfigItem.java @@ -49,14 +49,21 @@ public void set(@Nonnull TYPE val, @Nullable Runnable callback) { data.set(val); // validity checks for (Module m : ModuleHelper.INSTANCE.loadAll(module.getContainer())) { - // disable other exclusive modules - if (name.equals(Module.ENABLED_KEY) && val == Boolean.TRUE && module.getData().isExclusive()) { - if (m.getData().isExclusive() && m.getData() != module.getData()) { - m.setDisabledForce(callback != null); + boolean checkModeState; + if (name.equals(Module.ENABLED_KEY) && val == Boolean.TRUE) { + // disable other exclusive modules + if (module.getData().isExclusive()) { + if (m.getData().isExclusive() && m.getData() != module.getData()) { + m.setDisabledForce(callback != null); + } } + //If enabled state of the module changes, recheck about mode changes + checkModeState = true; + } else { + checkModeState = name.equals(Module.HANDLE_MODE_CHANGE_KEY) && val == Boolean.TRUE; } // turn off mode change handling for other modules - if (name.equals(Module.HANDLE_MODE_CHANGE_KEY) && val == Boolean.TRUE && module.handlesModeChange()) { + if (checkModeState && module.handlesModeChange()) { if (m.handlesModeChange() && m.getData() != module.getData()) { m.setModeHandlingDisabledForce(); } diff --git a/src/main/java/mekanism/common/content/gear/mekasuit/ModuleGravitationalModulatingUnit.java b/src/main/java/mekanism/common/content/gear/mekasuit/ModuleGravitationalModulatingUnit.java index 15c54d77c9f..f0cd4eb2b96 100644 --- a/src/main/java/mekanism/common/content/gear/mekasuit/ModuleGravitationalModulatingUnit.java +++ b/src/main/java/mekanism/common/content/gear/mekasuit/ModuleGravitationalModulatingUnit.java @@ -38,6 +38,11 @@ public void addHUDElements(IModule module, Co hudElementAdder.accept(MekanismAPI.getModuleHelper().hudElementEnabled(icon, module.isEnabled())); } + @Override + public boolean canChangeModeWhenDisabled(IModule module) { + return true; + } + @Override public void changeMode(IModule module, PlayerEntity player, ItemStack stack, int shift, boolean displayChangeMessage) { module.toggleEnabled(player, MekanismLang.MODULE_GRAVITATIONAL_MODULATION.translate()); diff --git a/src/main/java/mekanism/common/content/gear/mekasuit/ModuleMagneticAttractionUnit.java b/src/main/java/mekanism/common/content/gear/mekasuit/ModuleMagneticAttractionUnit.java index d363fadacab..25f34d180c7 100644 --- a/src/main/java/mekanism/common/content/gear/mekasuit/ModuleMagneticAttractionUnit.java +++ b/src/main/java/mekanism/common/content/gear/mekasuit/ModuleMagneticAttractionUnit.java @@ -76,6 +76,11 @@ private void pullItem(PlayerEntity player, ItemEntity item) { player.position().add(0, 0.2, 0), item.position(), (int) (diff.length() * 4)), player); } + @Override + public boolean canChangeModeWhenDisabled(IModule module) { + return true; + } + @Override public void changeMode(IModule module, PlayerEntity player, ItemStack stack, int shift, boolean displayChangeMessage) { module.toggleEnabled(player, MekanismLang.MODULE_MAGNETIC_ATTRACTION.translate()); diff --git a/src/main/java/mekanism/common/content/gear/mekasuit/ModuleVisionEnhancementUnit.java b/src/main/java/mekanism/common/content/gear/mekasuit/ModuleVisionEnhancementUnit.java index 8f4c58caa3c..73c3054a34c 100644 --- a/src/main/java/mekanism/common/content/gear/mekasuit/ModuleVisionEnhancementUnit.java +++ b/src/main/java/mekanism/common/content/gear/mekasuit/ModuleVisionEnhancementUnit.java @@ -29,6 +29,11 @@ public void addHUDElements(IModule module, Consumer hudElementAdder.accept(MekanismAPI.getModuleHelper().hudElementEnabled(icon, module.isEnabled())); } + @Override + public boolean canChangeModeWhenDisabled(IModule module) { + return true; + } + @Override public void changeMode(IModule module, PlayerEntity player, ItemStack stack, int shift, boolean displayChangeMessage) { module.toggleEnabled(player, MekanismLang.MODULE_VISION_ENHANCEMENT.translate()); diff --git a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java index fd2cadc6f97..8b632ad3e69 100644 --- a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java +++ b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java @@ -234,7 +234,7 @@ public void changeMode(@Nonnull PlayerEntity player, @Nonnull ItemStack stack, i @Override public boolean supportsSlotType(ItemStack stack, @Nonnull EquipmentSlotType slotType) { - return slotType == getSlot() && getModules(stack).stream().anyMatch(module -> module.isEnabled() && module.handlesModeChange()); + return slotType == getSlot() && getModules(stack).stream().anyMatch(Module::handlesModeChange); } @Override diff --git a/src/main/java/mekanism/common/item/gear/ItemMekaTool.java b/src/main/java/mekanism/common/item/gear/ItemMekaTool.java index 9bde6754f48..e3894f8a1f6 100644 --- a/src/main/java/mekanism/common/item/gear/ItemMekaTool.java +++ b/src/main/java/mekanism/common/item/gear/ItemMekaTool.java @@ -344,7 +344,7 @@ public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantmen @Override public boolean supportsSlotType(ItemStack stack, @Nonnull EquipmentSlotType slotType) { - return IModeItem.super.supportsSlotType(stack, slotType) && getModules(stack).stream().anyMatch(module -> module.isEnabled() && module.handlesModeChange()); + return IModeItem.super.supportsSlotType(stack, slotType) && getModules(stack).stream().anyMatch(Module::handlesModeChange); } @Override diff --git a/src/main/java/mekanism/common/network/to_server/PacketModeChange.java b/src/main/java/mekanism/common/network/to_server/PacketModeChange.java index 325d6f39c48..77fdf04f22c 100644 --- a/src/main/java/mekanism/common/network/to_server/PacketModeChange.java +++ b/src/main/java/mekanism/common/network/to_server/PacketModeChange.java @@ -22,7 +22,7 @@ public PacketModeChange(EquipmentSlotType slot, int shift) { this(slot, shift, false); } - public PacketModeChange(EquipmentSlotType slot, int shift, boolean displayChangeMessage) { + private PacketModeChange(EquipmentSlotType slot, int shift, boolean displayChangeMessage) { this.slot = slot; this.shift = shift; this.displayChangeMessage = displayChangeMessage;