From bce12469eb6afa383f82c361173a16ee45fc10f3 Mon Sep 17 00:00:00 2001 From: mewacaser Date: Tue, 7 Jun 2022 17:20:33 -0500 Subject: [PATCH 1/9] Jetpack thrust vectorization --- .../mekanism/assets/mekanism/lang/en_ud.json | 1 + .../mekanism/assets/mekanism/lang/en_us.json | 1 + .../client/lang/MekanismLangProvider.java | 1 + .../mekanism/client/ClientTickHandler.java | 5 ++- .../common/CommonPlayerTickHandler.java | 3 +- .../java/mekanism/common/MekanismLang.java | 1 + .../common/item/gear/ItemJetpack.java | 5 +++ .../common/item/gear/ItemMekaSuitArmor.java | 9 ++++ .../common/item/interfaces/IJetpackItem.java | 41 +++++++++++------- .../common/registries/MekanismModules.java | 2 +- .../mekanism/gui/hud/jetpack_vector.png | Bin 0 -> 1866 bytes 11 files changed, 49 insertions(+), 20 deletions(-) create mode 100644 src/main/resources/assets/mekanism/gui/hud/jetpack_vector.png diff --git a/src/datagen/generated/mekanism/assets/mekanism/lang/en_ud.json b/src/datagen/generated/mekanism/assets/mekanism/lang/en_ud.json index 143c5935058..626ac2dd586 100644 --- a/src/datagen/generated/mekanism/assets/mekanism/lang/en_ud.json +++ b/src/datagen/generated/mekanism/assets/mekanism/lang/en_ud.json @@ -1220,6 +1220,7 @@ "jetpack.mekanism.hover": "ɹǝʌoH", "jetpack.mekanism.mode_change": "%s :oʇ pǝᵷuɐɥɔ ǝpoɯ ʞɔɐdʇǝՐ", "jetpack.mekanism.normal": "ɹɐꞁnᵷǝᴚ", + "jetpack.mekanism.vector": "ɹoʇɔǝΛ", "key.mekanism.chest_mode": "ɥɔʇᴉʍS ǝpoW ʇsǝɥƆ", "key.mekanism.description": "uoᴉʇdᴉɹɔsǝᗡ ʍoɥS", "key.mekanism.details": "sꞁᴉɐʇǝᗡ ʍoɥS", diff --git a/src/datagen/generated/mekanism/assets/mekanism/lang/en_us.json b/src/datagen/generated/mekanism/assets/mekanism/lang/en_us.json index dafcf32fc30..09b466a11fb 100644 --- a/src/datagen/generated/mekanism/assets/mekanism/lang/en_us.json +++ b/src/datagen/generated/mekanism/assets/mekanism/lang/en_us.json @@ -1220,6 +1220,7 @@ "jetpack.mekanism.hover": "Hover", "jetpack.mekanism.mode_change": "Jetpack mode changed to: %1$s", "jetpack.mekanism.normal": "Regular", + "jetpack.mekanism.vector": "Vector", "key.mekanism.chest_mode": "Chest Mode Switch", "key.mekanism.description": "Show Description", "key.mekanism.details": "Show Details", diff --git a/src/datagen/main/java/mekanism/client/lang/MekanismLangProvider.java b/src/datagen/main/java/mekanism/client/lang/MekanismLangProvider.java index 1a64c089d2b..48af12676a3 100644 --- a/src/datagen/main/java/mekanism/client/lang/MekanismLangProvider.java +++ b/src/datagen/main/java/mekanism/client/lang/MekanismLangProvider.java @@ -1298,6 +1298,7 @@ private void addMisc() { add(MekanismLang.JETPACK_MODE_CHANGE, "Jetpack mode changed to: %1$s"); add(MekanismLang.JETPACK_NORMAL, "Regular"); add(MekanismLang.JETPACK_HOVER, "Hover"); + add(MekanismLang.JETPACK_VECTOR, "Vector"); add(MekanismLang.JETPACK_DISABLED, "Disabled"); //Disassembler Mode add(MekanismLang.DISASSEMBLER_MODE_CHANGE, "Mode toggled to: %1$s (%2$s)"); diff --git a/src/main/java/mekanism/client/ClientTickHandler.java b/src/main/java/mekanism/client/ClientTickHandler.java index 46bfab5dde3..7a8f36ac571 100644 --- a/src/main/java/mekanism/client/ClientTickHandler.java +++ b/src/main/java/mekanism/client/ClientTickHandler.java @@ -83,7 +83,7 @@ public static boolean isJetpackInUse(Player player, ItemStack jetpack) { boolean guiOpen = minecraft.screen != null; boolean ascending = minecraft.player.input.jumping; boolean rising = ascending && !guiOpen; - if (mode == JetpackMode.NORMAL) { + if (mode == JetpackMode.NORMAL || mode == JetpackMode.VECTOR) { return rising; } else if (mode == JetpackMode.HOVER) { boolean descending = minecraft.player.input.shiftKeyDown; @@ -199,7 +199,8 @@ public void tickStart() { JetpackMode primaryMode = ((IJetpackItem) primaryJetpack.getItem()).getJetpackMode(primaryJetpack); JetpackMode mode = IJetpackItem.getPlayerJetpackMode(minecraft.player, primaryMode, () -> minecraft.player.input.jumping); MekanismClient.updateKey(minecraft.player.input.jumping, KeySync.ASCEND); - if (jetpackInUse && IJetpackItem.handleJetpackMotion(minecraft.player, mode, () -> minecraft.player.input.jumping)) { + double jetpackThrust = ((IJetpackItem) primaryJetpack.getItem()).getJetpackThrust(primaryJetpack); + if (jetpackInUse && IJetpackItem.handleJetpackMotion(minecraft.player, mode, jetpackThrust, () -> minecraft.player.input.jumping)) { minecraft.player.resetFallDistance(); } } diff --git a/src/main/java/mekanism/common/CommonPlayerTickHandler.java b/src/main/java/mekanism/common/CommonPlayerTickHandler.java index 6c8b4f1ca07..9434243f90e 100644 --- a/src/main/java/mekanism/common/CommonPlayerTickHandler.java +++ b/src/main/java/mekanism/common/CommonPlayerTickHandler.java @@ -126,8 +126,9 @@ private void tickEnd(Player player) { if (!primaryJetpack.isEmpty()) { JetpackMode primaryMode = ((IJetpackItem) primaryJetpack.getItem()).getJetpackMode(primaryJetpack); JetpackMode mode = IJetpackItem.getPlayerJetpackMode(player, primaryMode, () -> Mekanism.keyMap.has(player.getUUID(), KeySync.ASCEND)); + double jetpackThrust = ((IJetpackItem) primaryJetpack.getItem()).getJetpackThrust(primaryJetpack); if (mode != JetpackMode.DISABLED) { - if (IJetpackItem.handleJetpackMotion(player, mode, () -> Mekanism.keyMap.has(player.getUUID(), KeySync.ASCEND))) { + if (IJetpackItem.handleJetpackMotion(player, mode, jetpackThrust, () -> Mekanism.keyMap.has(player.getUUID(), KeySync.ASCEND))) { player.resetFallDistance(); if (player instanceof ServerPlayer serverPlayer) { serverPlayer.connection.aboveGroundTickCount = 0; diff --git a/src/main/java/mekanism/common/MekanismLang.java b/src/main/java/mekanism/common/MekanismLang.java index 05bf21bff9b..1772acb6235 100644 --- a/src/main/java/mekanism/common/MekanismLang.java +++ b/src/main/java/mekanism/common/MekanismLang.java @@ -643,6 +643,7 @@ public enum MekanismLang implements ILangEntry { JETPACK_MODE_CHANGE("jetpack", "mode_change"), JETPACK_NORMAL("jetpack", "normal"), JETPACK_HOVER("jetpack", "hover"), + JETPACK_VECTOR("jetpack", "vector"), JETPACK_DISABLED("jetpack", "disabled"), //Disassembler Mode DISASSEMBLER_MODE_CHANGE("disassembler", "mode_change"), diff --git a/src/main/java/mekanism/common/item/gear/ItemJetpack.java b/src/main/java/mekanism/common/item/gear/ItemJetpack.java index a7a41114d72..75918b29b20 100644 --- a/src/main/java/mekanism/common/item/gear/ItemJetpack.java +++ b/src/main/java/mekanism/common/item/gear/ItemJetpack.java @@ -87,6 +87,11 @@ public JetpackMode getJetpackMode(ItemStack stack) { return getMode(stack); } + @Override + public double getJetpackThrust(ItemStack stack) { + return 0.15D; + } + @Override public void useJetpackFuel(ItemStack stack) { useGas(stack, 1); diff --git a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java index 87ee7af23ed..842699e83de 100644 --- a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java +++ b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java @@ -362,6 +362,15 @@ public JetpackMode getJetpackMode(ItemStack stack) { return JetpackMode.DISABLED; } + @Override + public double getJetpackThrust(ItemStack stack) { + IModule module = getModule(stack, MekanismModules.JETPACK_UNIT); + if (module != null && module.isEnabled()) { + return 0.15D * module.getInstalledCount(); + } + return 0D; + } + @Override public void useJetpackFuel(ItemStack stack) { useGas(stack, MekanismGases.HYDROGEN.get(), 1); diff --git a/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java b/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java index b2b99779090..0fb9bb714c4 100644 --- a/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java +++ b/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java @@ -16,6 +16,7 @@ import mekanism.common.util.MekanismUtils.ResourceType; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -29,12 +30,15 @@ public interface IJetpackItem { JetpackMode getJetpackMode(ItemStack stack); + double getJetpackThrust(ItemStack stack); + void useJetpackFuel(ItemStack stack); @NothingNullByDefault enum JetpackMode implements IIncrementalEnum, IHasTextComponent { NORMAL(MekanismLang.JETPACK_NORMAL, EnumColor.DARK_GREEN, MekanismUtils.getResource(ResourceType.GUI_HUD, "jetpack_normal.png")), HOVER(MekanismLang.JETPACK_HOVER, EnumColor.DARK_AQUA, MekanismUtils.getResource(ResourceType.GUI_HUD, "jetpack_hover.png")), + VECTOR(MekanismLang.JETPACK_VECTOR, EnumColor.ORANGE, MekanismUtils.getResource(ResourceType.GUI_HUD, "jetpack_vector.png")), DISABLED(MekanismLang.JETPACK_DISABLED, EnumColor.DARK_RED, MekanismUtils.getResource(ResourceType.GUI_HUD, "jetpack_off.png")); private static final JetpackMode[] MODES = values(); @@ -113,33 +117,38 @@ private static ItemStack getJetpack(LivingEntity entity, Predicate ma /** * @return If fall distance should get reset or not */ - static boolean handleJetpackMotion(Player player, JetpackMode mode, BooleanSupplier ascendingSupplier) { + static boolean handleJetpackMotion(Player player, JetpackMode mode, double thrust, BooleanSupplier ascendingSupplier) { Vec3 motion = player.getDeltaMovement(); - if (mode == JetpackMode.NORMAL) { - if (player.isFallFlying()) { - Vec3 forward = player.getLookAngle(); - Vec3 delta = forward.multiply(forward.scale(0.15)) - .add(forward.scale(1.5).subtract(motion).scale(0.5)); - player.setDeltaMovement(motion.add(delta)); - return false; - } else { - player.setDeltaMovement(motion.x(), Math.min(motion.y() + 0.15D, 0.5D), motion.z()); - } + if ((mode == JetpackMode.NORMAL || mode == JetpackMode.VECTOR) && player.isFallFlying()) { + Vec3 forward = player.getLookAngle(); + Vec3 delta = forward.multiply(forward.scale(thrust)) + .add(forward.scale(1.5).subtract(motion).scale(0.5)); + player.setDeltaMovement(motion.add(delta)); + return false; + } else if (mode == JetpackMode.NORMAL) { + player.setDeltaMovement(motion.x(), Math.min(motion.y() + thrust, 0.5D), motion.z()); + } else if (mode == JetpackMode.VECTOR) { + Vec3 forward = player.getLookAngle(); + float theta = player.getYRot() * ((float) Math.PI / 180F); + Vec3 left = new Vec3(Mth.cos(theta), 0, Mth.sin(theta)); + Vec3 up = forward.cross(left); + Vec3 velocity = motion.add(up.scale(thrust)); + player.setDeltaMovement(new Vec3(velocity.x, Math.min(0.5D, velocity.y), velocity.z)); } else if (mode == JetpackMode.HOVER) { boolean ascending = ascendingSupplier.getAsBoolean(); boolean descending = player.isDescending(); if (ascending == descending) { if (motion.y() > 0) { - player.setDeltaMovement(motion.x(), Math.max(motion.y() - 0.15D, 0), motion.z()); + player.setDeltaMovement(motion.x(), Math.max(motion.y() - thrust, 0), motion.z()); } else if (motion.y() < 0) { if (!CommonPlayerTickHandler.isOnGroundOrSleeping(player)) { - player.setDeltaMovement(motion.x(), Math.min(motion.y() + 0.15D, 0), motion.z()); + player.setDeltaMovement(motion.x(), Math.min(motion.y() + thrust, 0), motion.z()); } } } else if (ascending) { - player.setDeltaMovement(motion.x(), Math.min(motion.y() + 0.15D, 0.2D), motion.z()); + player.setDeltaMovement(motion.x(), Math.min(motion.y() + thrust, 0.2D), motion.z()); } else if (!CommonPlayerTickHandler.isOnGroundOrSleeping(player)) { - player.setDeltaMovement(motion.x(), Math.max(motion.y() - 0.15D, -0.2D), motion.z()); + player.setDeltaMovement(motion.x(), Math.max(motion.y() - thrust, -0.2D), motion.z()); } } return true; @@ -153,7 +162,7 @@ static JetpackMode getPlayerJetpackMode(Player player, JetpackMode mode, Boolean if (ascending && !player.isDescending() || !CommonPlayerTickHandler.isOnGroundOrSleeping(player)) { return mode; } - } else if (mode == JetpackMode.NORMAL && ascending) { + } else if (ascending) { return mode; } } diff --git a/src/main/java/mekanism/common/registries/MekanismModules.java b/src/main/java/mekanism/common/registries/MekanismModules.java index 05514f0cc2d..98623109d07 100644 --- a/src/main/java/mekanism/common/registries/MekanismModules.java +++ b/src/main/java/mekanism/common/registries/MekanismModules.java @@ -89,7 +89,7 @@ private MekanismModules() { public static final ModuleRegistryObject GEIGER_UNIT = MODULES.register("geiger_unit", ModuleGeigerUnit::new, () -> MekanismItems.MODULE_GEIGER.asItem(), builder -> builder.rarity(Rarity.UNCOMMON).rendersHUD()); public static final ModuleRegistryObject JETPACK_UNIT = MODULES.register("jetpack_unit", - ModuleJetpackUnit::new, () -> MekanismItems.MODULE_JETPACK.asItem(), builder -> builder.rarity(Rarity.RARE).handlesModeChange().rendersHUD() + ModuleJetpackUnit::new, () -> MekanismItems.MODULE_JETPACK.asItem(), builder -> builder.maxStackSize(4).rarity(Rarity.RARE).handlesModeChange().rendersHUD() .exclusive(ExclusiveFlag.OVERRIDE_JUMP)); public static final ModuleRegistryObject CHARGE_DISTRIBUTION_UNIT = MODULES.register("charge_distribution_unit", ModuleChargeDistributionUnit::new, () -> MekanismItems.MODULE_CHARGE_DISTRIBUTION.asItem(), builder -> builder.rarity(Rarity.RARE)); diff --git a/src/main/resources/assets/mekanism/gui/hud/jetpack_vector.png b/src/main/resources/assets/mekanism/gui/hud/jetpack_vector.png new file mode 100644 index 0000000000000000000000000000000000000000..066fd8582c7b83e634a979daa64d26a9a476e38d GIT binary patch literal 1866 zcmV-Q2etT#P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+TB-MvMVPH{AU$e0+JAdDc^CBqk~t=$9n(glguE>85NMwXdLem_ z%$@x+x{;4*+3CimUmWS+%L(9{olY8jPD}?8zD^X`q25XEy@uY~wYucIGU``FO|oH! zQOB&5(|pWp8$nseGF#LZY_dfqueR8%tw01+Rk{HO6%ur4voBB-qQi!&2_hDxX$z`R z#6m+SHyU&lic~46k_DR~QZpVbF!RQluRzeu71R|$gTa*l7tMS(`AIXqmq8KOaJW)j zIOF0QshVuvnl}0SQR8XB9BHe;K;4d2uxpO^f=6VHmMM- zJ4;lXNJ+(VjA=o%n*INCjw`;l&j!;f^s z-zjH?bpM8OMx}e#?F-fFc+Zuo*tH7>rw~SLdJh5VHoFF>ssYHO~m|78W?qWm$7tQp+ir?G@{` zrTQTr7!R1&Ae$sD`-QB*9;Lp#Bmv(+CPVJFIQ$fln{1eoY6GIQl1E&FlDB;65Y+Dk z!B&kn!TN^$tbpjG&Ss0ldlC*6cBgb3vIu+$M|*uiZaDHGoX2WMv6@T!erKuqogf@j z+4_Y&w|ikQOT9bN-}T;~6221Ynayv^#W(d1tQ_y<5-*De^5x^LC8vPTl)3MacUWOp zN6z>4@!kme;^-4@{8is+Zx+gZ$KU4{6kpA6 zc&&ZY;7&c!uBYzYfoOhM#rTFo&OtL_o3GZ<`Z*`>g({HGsf5q)%@2>{wN)P*y52YK zU0?D1o?PfHzzvYr(Kl!D-B2DHJPUTKqbGsBd*I>ULVQ|{`J}AB>;ET#r0dTd{kv`c z1~Rgf?z+A@w*UYEglR)VP)S2WAaHVTW@&6?004NLeUUv#!$2IxUsG*GDh?JAamY}e zEQpFYN)?M>p|llRbuhW~3z{?}DK3tJYr(;f#j1mgv#t)Vf*|+-;^^e0=prTlFDbN$ z@!+^0@9sVB-T^|R!c?bq^n3@1i`* z``n+SPsy7M@QK88OgAjz4dR(iOXs{#9A+g+AwDM_H|T=Ik6f2se&bwpSm2pqBa@mZ z4ik&T4wgHZl?;`5nmD4U8s!UFmle)ioYhK=weHDZ7|LraX|B^8K^#j+APEsNYAB-u z3sG7%QcR?1Kjz^dcKk_l$>b`7kz)Z>sE`~#_#gc4)+|g-x=EoJ(EVcDAEQ8U7iiXP z`}^3onmKj!>Fn*_Gp+u90QKf_bs+@7WdHyGa!^cE zMF0Q*ySuyl`}^zb>+J08>gwwM|Nrpt@bvWb>FMe6^78HN?d$97=jZ3{?(XmJ@9^;O z@$vEc`ughX>h$#V?Ck95=;*StvbVRlxVX5%!NJDH#?jHy)YR15+uQQ;^7Hfa+}zyv z_xJet_^+?8`}_OD*cnt?07$@u+|QlYumbqHvi3kBAcIzI zGit=uoX$B1G6M9q&yNvUV>l+4-y-$+SC{dp)64(p07Xay?wsYuQUCw|07*qoM6N<$ Ef`hP;DF6Tf literal 0 HcmV?d00001 From cccee5a459b785ca1a0ccc24211cc62cbb2eaa7d Mon Sep 17 00:00:00 2001 From: mewacaser Date: Sun, 7 Jan 2024 15:45:50 -0600 Subject: [PATCH 2/9] Cleaned up some of the jetpack logic and added a slider to control mekasuit thrust --- .../mekanism/assets/mekanism/lang/en_ud.json | 1 + .../mekanism/assets/mekanism/lang/en_us.json | 1 + .../client/lang/MekanismLangProvider.java | 1 + .../java/mekanism/common/MekanismLang.java | 1 + .../gear/mekasuit/ModuleJetpackUnit.java | 36 +++++++++++++++++++ .../common/item/gear/ItemJetpack.java | 2 +- .../common/item/gear/ItemMekaSuitArmor.java | 2 +- .../common/item/interfaces/IJetpackItem.java | 10 +++--- 8 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/datagen/generated/mekanism/assets/mekanism/lang/en_ud.json b/src/datagen/generated/mekanism/assets/mekanism/lang/en_ud.json index 626ac2dd586..744f091eff9 100644 --- a/src/datagen/generated/mekanism/assets/mekanism/lang/en_ud.json +++ b/src/datagen/generated/mekanism/assets/mekanism/lang/en_ud.json @@ -1316,6 +1316,7 @@ "module.mekanism.inhalation_purification_unit": "ʇᴉu∩ uoᴉʇɐɔᴉɟᴉɹnԀ uoᴉʇɐꞁɐɥuI", "module.mekanism.installed": "%s :pǝꞁꞁɐʇsuI", "module.mekanism.jetpack_mode": "ǝpoW ʞɔɐdʇǝՐ", + "module.mekanism.jetpack_mult": "ɹǝᴉꞁdᴉʇꞁnW ʇsnɹɥ⟘", "module.mekanism.jetpack_unit": "ʇᴉu∩ ʞɔɐdʇǝՐ", "module.mekanism.jump_boost": "ʇsooᗺ dɯnՐ", "module.mekanism.laser_dissipation_unit": "ʇᴉu∩ uoᴉʇɐdᴉssᴉᗡ ɹǝsɐꞀ", diff --git a/src/datagen/generated/mekanism/assets/mekanism/lang/en_us.json b/src/datagen/generated/mekanism/assets/mekanism/lang/en_us.json index 09b466a11fb..c77f65dd57b 100644 --- a/src/datagen/generated/mekanism/assets/mekanism/lang/en_us.json +++ b/src/datagen/generated/mekanism/assets/mekanism/lang/en_us.json @@ -1316,6 +1316,7 @@ "module.mekanism.inhalation_purification_unit": "Inhalation Purification Unit", "module.mekanism.installed": "Installed: %1$s", "module.mekanism.jetpack_mode": "Jetpack Mode", + "module.mekanism.jetpack_mult": "Thrust Multiplier", "module.mekanism.jetpack_unit": "Jetpack Unit", "module.mekanism.jump_boost": "Jump Boost", "module.mekanism.laser_dissipation_unit": "Laser Dissipation Unit", diff --git a/src/datagen/main/java/mekanism/client/lang/MekanismLangProvider.java b/src/datagen/main/java/mekanism/client/lang/MekanismLangProvider.java index 48af12676a3..2ebd288e070 100644 --- a/src/datagen/main/java/mekanism/client/lang/MekanismLangProvider.java +++ b/src/datagen/main/java/mekanism/client/lang/MekanismLangProvider.java @@ -1471,6 +1471,7 @@ private void addMisc() { add(MekanismLang.MODULE_EFFICIENCY, "Efficiency"); add(MekanismLang.MODULE_MODE_CHANGE, "%1$s bumped to: %2$s"); add(MekanismLang.MODULE_JETPACK_MODE, "Jetpack Mode"); + add(MekanismLang.MODULE_JETPACK_MULT, "Thrust Multiplier"); add(MekanismLang.MODULE_GRAVITATIONAL_MODULATION, "Gravitational Modulation"); add(MekanismLang.MODULE_MAGNETIC_ATTRACTION, "Magnetic Attraction"); add(MekanismLang.MODULE_CHARGE_SUIT, "Charge Suit"); diff --git a/src/main/java/mekanism/common/MekanismLang.java b/src/main/java/mekanism/common/MekanismLang.java index 1772acb6235..8ca9dce2413 100644 --- a/src/main/java/mekanism/common/MekanismLang.java +++ b/src/main/java/mekanism/common/MekanismLang.java @@ -826,6 +826,7 @@ public enum MekanismLang implements ILangEntry { MODULE_EFFICIENCY("module", "efficiency"), MODULE_BREATHING_HELD("module", "breathing.held"), MODULE_JETPACK_MODE("module", "jetpack_mode"), + MODULE_JETPACK_MULT("module", "jetpack_mult"), MODULE_GRAVITATIONAL_MODULATION("module", "gravitational_modulation"), MODULE_MAGNETIC_ATTRACTION("module", "magnetic_attraction"), MODULE_MODE_CHANGE("module", "mode_change"), diff --git a/src/main/java/mekanism/common/content/gear/mekasuit/ModuleJetpackUnit.java b/src/main/java/mekanism/common/content/gear/mekasuit/ModuleJetpackUnit.java index b236575cc90..38486b49c73 100644 --- a/src/main/java/mekanism/common/content/gear/mekasuit/ModuleJetpackUnit.java +++ b/src/main/java/mekanism/common/content/gear/mekasuit/ModuleJetpackUnit.java @@ -1,6 +1,7 @@ package mekanism.common.content.gear.mekasuit; import java.util.function.Consumer; +import mekanism.api.annotations.NothingNullByDefault; import mekanism.api.annotations.ParametersAreNotNullByDefault; import mekanism.api.chemical.gas.GasStack; import mekanism.api.chemical.gas.IGasHandler; @@ -11,12 +12,15 @@ import mekanism.api.gear.config.IModuleConfigItem; import mekanism.api.gear.config.ModuleConfigItemCreator; import mekanism.api.gear.config.ModuleEnumData; +import mekanism.api.text.IHasTextComponent; +import mekanism.api.text.TextComponentUtil; import mekanism.common.MekanismLang; import mekanism.common.capabilities.Capabilities; import mekanism.common.config.MekanismConfig; import mekanism.common.item.interfaces.IJetpackItem.JetpackMode; import mekanism.common.registries.MekanismGases; import mekanism.common.util.StorageUtils; +import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -24,10 +28,12 @@ public class ModuleJetpackUnit implements ICustomModule { private IModuleConfigItem jetpackMode; + private IModuleConfigItem thrustMultiplier; @Override public void init(IModule module, ModuleConfigItemCreator configItemCreator) { jetpackMode = configItemCreator.createConfigItem("jetpack_mode", MekanismLang.MODULE_JETPACK_MODE, new ModuleEnumData<>(JetpackMode.NORMAL)); + thrustMultiplier = configItemCreator.createConfigItem("jetpack_mult", MekanismLang.MODULE_JETPACK_MULT, new ModuleEnumData<>(ThrustMultiplier.NORMAL, module.getInstalledCount() + 1)); } @Override @@ -55,4 +61,34 @@ public void changeMode(IModule module, Player player, ItemSta public JetpackMode getMode() { return jetpackMode.get(); } + + public float getThrustMultiplier() { + return thrustMultiplier.get().getMultiplier(); + } + + @NothingNullByDefault + public enum ThrustMultiplier implements IHasTextComponent { + HALF(.5f), + NORMAL(1f), + FAST(2f), + FASTER(4f), + FASTEST(8f); + + private final float mult; + private final Component label; + + ThrustMultiplier(float mult) { + this.mult = mult; + this.label = TextComponentUtil.getString(Float.toString(mult)); + } + + @Override + public Component getTextComponent() { + return label; + } + + public float getMultiplier() { + return mult; + } + } } diff --git a/src/main/java/mekanism/common/item/gear/ItemJetpack.java b/src/main/java/mekanism/common/item/gear/ItemJetpack.java index 75918b29b20..2cbc9160fe3 100644 --- a/src/main/java/mekanism/common/item/gear/ItemJetpack.java +++ b/src/main/java/mekanism/common/item/gear/ItemJetpack.java @@ -89,7 +89,7 @@ public JetpackMode getJetpackMode(ItemStack stack) { @Override public double getJetpackThrust(ItemStack stack) { - return 0.15D; + return 0.1D; } @Override diff --git a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java index 842699e83de..84dce4492e9 100644 --- a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java +++ b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java @@ -366,7 +366,7 @@ public JetpackMode getJetpackMode(ItemStack stack) { public double getJetpackThrust(ItemStack stack) { IModule module = getModule(stack, MekanismModules.JETPACK_UNIT); if (module != null && module.isEnabled()) { - return 0.15D * module.getInstalledCount(); + return 0.1D * module.getCustomInstance().getThrustMultiplier(); } return 0D; } diff --git a/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java b/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java index 0fb9bb714c4..4bb65d5f929 100644 --- a/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java +++ b/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java @@ -121,19 +121,19 @@ static boolean handleJetpackMotion(Player player, JetpackMode mode, double thrus Vec3 motion = player.getDeltaMovement(); if ((mode == JetpackMode.NORMAL || mode == JetpackMode.VECTOR) && player.isFallFlying()) { Vec3 forward = player.getLookAngle(); - Vec3 delta = forward.multiply(forward.scale(thrust)) - .add(forward.scale(1.5).subtract(motion).scale(0.5)); + Vec3 drag = forward.scale(1.5).subtract(motion).scale(0.5); + Vec3 delta = forward.scale(thrust).add(drag); player.setDeltaMovement(motion.add(delta)); return false; } else if (mode == JetpackMode.NORMAL) { - player.setDeltaMovement(motion.x(), Math.min(motion.y() + thrust, 0.5D), motion.z()); + player.setDeltaMovement(motion.x(), motion.y() + thrust * Math.min(1, Math.exp(-motion.y())), motion.z()); } else if (mode == JetpackMode.VECTOR) { Vec3 forward = player.getLookAngle(); float theta = player.getYRot() * ((float) Math.PI / 180F); Vec3 left = new Vec3(Mth.cos(theta), 0, Mth.sin(theta)); Vec3 up = forward.cross(left); - Vec3 velocity = motion.add(up.scale(thrust)); - player.setDeltaMovement(new Vec3(velocity.x, Math.min(0.5D, velocity.y), velocity.z)); + Vec3 thrustVec = up.scale(thrust); + player.setDeltaMovement(motion.add(new Vec3(thrustVec.x, thrustVec.y * Math.min(1, Math.exp(-motion.y())), thrustVec.z))); } else if (mode == JetpackMode.HOVER) { boolean ascending = ascendingSupplier.getAsBoolean(); boolean descending = player.isDescending(); From 57f36561371880e48247a2cbb29d7233836aa8c3 Mon Sep 17 00:00:00 2001 From: Sara Freimer Date: Wed, 28 Feb 2024 22:20:38 -0600 Subject: [PATCH 3/9] Fix compile error --- .../java/mekanism/common/item/gear/ItemMekaSuitArmor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java index 84dce4492e9..f191a9c7221 100644 --- a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java +++ b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java @@ -364,8 +364,8 @@ public JetpackMode getJetpackMode(ItemStack stack) { @Override public double getJetpackThrust(ItemStack stack) { - IModule module = getModule(stack, MekanismModules.JETPACK_UNIT); - if (module != null && module.isEnabled()) { + IModule module = getEnabledModule(stack, MekanismModules.JETPACK_UNIT); + if (module != null) { return 0.1D * module.getCustomInstance().getThrustMultiplier(); } return 0D; From 29e77c5d0d2cb7f4c4cee2aef43e119732ab0eb5 Mon Sep 17 00:00:00 2001 From: mewacaser Date: Sun, 3 Mar 2024 16:29:50 -0600 Subject: [PATCH 4/9] Added dynamic fuel usage and some cleanup --- .../common/CommonPlayerTickHandler.java | 5 +++-- .../common/item/gear/ItemMekaSuitArmor.java | 6 +++++- .../common/item/interfaces/IJetpackItem.java | 18 ++++++++++++------ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/main/java/mekanism/common/CommonPlayerTickHandler.java b/src/main/java/mekanism/common/CommonPlayerTickHandler.java index 9434243f90e..be414b5cbc6 100644 --- a/src/main/java/mekanism/common/CommonPlayerTickHandler.java +++ b/src/main/java/mekanism/common/CommonPlayerTickHandler.java @@ -124,10 +124,11 @@ private void tickEnd(Player player) { if (!jetpack.isEmpty()) { ItemStack primaryJetpack = IJetpackItem.getPrimaryJetpack(player); if (!primaryJetpack.isEmpty()) { - JetpackMode primaryMode = ((IJetpackItem) primaryJetpack.getItem()).getJetpackMode(primaryJetpack); + IJetpackItem jetpackItem = (IJetpackItem) primaryJetpack.getItem(); + JetpackMode primaryMode = jetpackItem.getJetpackMode(primaryJetpack); JetpackMode mode = IJetpackItem.getPlayerJetpackMode(player, primaryMode, () -> Mekanism.keyMap.has(player.getUUID(), KeySync.ASCEND)); - double jetpackThrust = ((IJetpackItem) primaryJetpack.getItem()).getJetpackThrust(primaryJetpack); if (mode != JetpackMode.DISABLED) { + double jetpackThrust = jetpackItem.getJetpackThrust(primaryJetpack); if (IJetpackItem.handleJetpackMotion(player, mode, jetpackThrust, () -> Mekanism.keyMap.has(player.getUUID(), KeySync.ASCEND))) { player.resetFallDistance(); if (player instanceof ServerPlayer serverPlayer) { diff --git a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java index f191a9c7221..7c88e85837c 100644 --- a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java +++ b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java @@ -66,6 +66,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.tags.DamageTypeTags; +import net.minecraft.util.Mth; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; @@ -373,7 +374,10 @@ public double getJetpackThrust(ItemStack stack) { @Override public void useJetpackFuel(ItemStack stack) { - useGas(stack, MekanismGases.HYDROGEN.get(), 1); + IModule module = getEnabledModule(stack, MekanismModules.JETPACK_UNIT); + if (module != null) { + useGas(stack, MekanismGases.HYDROGEN.get(), Mth.ceil(module.getCustomInstance().getThrustMultiplier())); + } } @NotNull diff --git a/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java b/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java index 4bb65d5f929..89b50cbee53 100644 --- a/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java +++ b/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java @@ -123,17 +123,19 @@ static boolean handleJetpackMotion(Player player, JetpackMode mode, double thrus Vec3 forward = player.getLookAngle(); Vec3 drag = forward.scale(1.5).subtract(motion).scale(0.5); Vec3 delta = forward.scale(thrust).add(drag); - player.setDeltaMovement(motion.add(delta)); + player.addDeltaMovement(delta); return false; } else if (mode == JetpackMode.NORMAL) { - player.setDeltaMovement(motion.x(), motion.y() + thrust * Math.min(1, Math.exp(-motion.y())), motion.z()); + Vec3 delta = new Vec3(0, thrust * getVerticalCoefficient(motion.y()), 0); + player.addDeltaMovement(delta); } else if (mode == JetpackMode.VECTOR) { Vec3 forward = player.getLookAngle(); - float theta = player.getYRot() * ((float) Math.PI / 180F); + float theta = player.getYRot() * Mth.DEG_TO_RAD; Vec3 left = new Vec3(Mth.cos(theta), 0, Mth.sin(theta)); Vec3 up = forward.cross(left); Vec3 thrustVec = up.scale(thrust); - player.setDeltaMovement(motion.add(new Vec3(thrustVec.x, thrustVec.y * Math.min(1, Math.exp(-motion.y())), thrustVec.z))); + Vec3 delta = new Vec3(thrustVec.x, thrustVec.y * getVerticalCoefficient(motion.y()), thrustVec.z); + player.addDeltaMovement(delta); } else if (mode == JetpackMode.HOVER) { boolean ascending = ascendingSupplier.getAsBoolean(); boolean descending = player.isDescending(); @@ -146,14 +148,18 @@ static boolean handleJetpackMotion(Player player, JetpackMode mode, double thrus } } } else if (ascending) { - player.setDeltaMovement(motion.x(), Math.min(motion.y() + thrust, 0.2D), motion.z()); + player.setDeltaMovement(motion.x(), Math.min(motion.y() + thrust, 2 * thrust), motion.z()); } else if (!CommonPlayerTickHandler.isOnGroundOrSleeping(player)) { - player.setDeltaMovement(motion.x(), Math.max(motion.y() - thrust, -0.2D), motion.z()); + player.setDeltaMovement(motion.x(), Math.max(motion.y() - thrust, -2 * thrust), motion.z()); } } return true; } + private static double getVerticalCoefficient(double currentYVelocity) { + return Math.min(1, Math.exp(-currentYVelocity)); + } + static JetpackMode getPlayerJetpackMode(Player player, JetpackMode mode, BooleanSupplier ascendingSupplier) { if (!player.isSpectator()) { if (mode != JetpackMode.DISABLED) { From 50dc96d5a8cf483ed74055690a5b7f1c12b478b5 Mon Sep 17 00:00:00 2001 From: Sara Freimer Date: Fri, 8 Mar 2024 10:05:06 -0600 Subject: [PATCH 5/9] Scale mekasuit hydrogen tank size with number of installed jetpack units, and cap thrust applied based on available/remaining gas --- .../chemical/item/ChemicalTankSpec.java | 27 ++++++++- .../mekanism/common/config/GearConfig.java | 4 +- .../gear/mekasuit/ModuleJetpackUnit.java | 23 +++++++- .../common/item/gear/ItemMekaSuitArmor.java | 58 +++++++++++-------- .../mekanism/common/util/StorageUtils.java | 8 +-- 5 files changed, 87 insertions(+), 33 deletions(-) diff --git a/src/main/java/mekanism/common/capabilities/chemical/item/ChemicalTankSpec.java b/src/main/java/mekanism/common/capabilities/chemical/item/ChemicalTankSpec.java index 8414a61ee54..b008443491a 100644 --- a/src/main/java/mekanism/common/capabilities/chemical/item/ChemicalTankSpec.java +++ b/src/main/java/mekanism/common/capabilities/chemical/item/ChemicalTankSpec.java @@ -3,6 +3,7 @@ import java.util.function.BiPredicate; import java.util.function.LongSupplier; import java.util.function.Predicate; +import java.util.function.ToLongFunction; import mekanism.api.AutomationType; import mekanism.api.IContentsListener; import mekanism.api.chemical.Chemical; @@ -18,22 +19,40 @@ public class ChemicalTankSpec> extends GenericTankSpec { + private static final LongSupplier EMPTY = () -> 0; + private final LongSupplier rate; private final LongSupplier capacity; @Nullable + private final ToLongFunction stackBasedCapacity; + @Nullable private final ChemicalAttributeValidator validator; - public ChemicalTankSpec(LongSupplier rate, LongSupplier capacity, BiPredicate<@NotNull CHEMICAL, @NotNull AutomationType> canExtract, + private ChemicalTankSpec(LongSupplier rate, LongSupplier capacity, BiPredicate<@NotNull CHEMICAL, @NotNull AutomationType> canExtract, + TriPredicate<@NotNull CHEMICAL, @NotNull AutomationType, @NotNull ItemStack> canInsert, Predicate<@NotNull CHEMICAL> isValid, + @Nullable ChemicalAttributeValidator validator, Predicate<@NotNull ItemStack> supportsStack) { + this(rate, capacity, null, canExtract, canInsert, isValid, validator, supportsStack); + } + + private ChemicalTankSpec(LongSupplier rate, ToLongFunction stackBasedCapacity, BiPredicate<@NotNull CHEMICAL, @NotNull AutomationType> canExtract, TriPredicate<@NotNull CHEMICAL, @NotNull AutomationType, @NotNull ItemStack> canInsert, Predicate<@NotNull CHEMICAL> isValid, @Nullable ChemicalAttributeValidator validator, Predicate<@NotNull ItemStack> supportsStack) { + this(rate, EMPTY, stackBasedCapacity, canExtract, canInsert, isValid, validator, supportsStack); + } + + private ChemicalTankSpec(LongSupplier rate, LongSupplier capacity, @Nullable ToLongFunction stackBasedCapacity, + BiPredicate<@NotNull CHEMICAL, @NotNull AutomationType> canExtract, TriPredicate<@NotNull CHEMICAL, @NotNull AutomationType, @NotNull ItemStack> canInsert, + Predicate<@NotNull CHEMICAL> isValid, @Nullable ChemicalAttributeValidator validator, Predicate<@NotNull ItemStack> supportsStack) { super(canExtract, canInsert, isValid, supportsStack); this.rate = rate; this.capacity = capacity; + this.stackBasedCapacity = stackBasedCapacity; this.validator = validator; } public , TANK extends IChemicalTank> TANK createTank(TankFromSpecCreator tankCreator, ItemStack stack) { + LongSupplier capacity = stackBasedCapacity == null ? this.capacity : () -> stackBasedCapacity.applyAsLong(stack); return tankCreator.create(rate, capacity, canExtract, (chemical, automationType) -> canInsert.test(chemical, automationType, stack), isValid, validator, null); } @@ -53,6 +72,12 @@ public static > ChemicalTankSpec c return new ChemicalTankSpec<>(rate, capacity, ConstantPredicates.notExternal(), (chemical, automation, stack) -> supportsStack.test(stack), isValid, null, supportsStack); } + public static > ChemicalTankSpec createFillOnly(LongSupplier rate, ToLongFunction stackBasedCapacity, + Predicate<@NotNull CHEMICAL> isValid, Predicate<@NotNull ItemStack> supportsStack) { + return new ChemicalTankSpec<>(rate, stackBasedCapacity, ConstantPredicates.notExternal(), + (chemical, automation, stack) -> supportsStack.test(stack), isValid, null, supportsStack); + } + @FunctionalInterface public interface TankFromSpecCreator, STACK extends ChemicalStack, TANK extends IChemicalTank> { diff --git a/src/main/java/mekanism/common/config/GearConfig.java b/src/main/java/mekanism/common/config/GearConfig.java index bcf44f8173a..9d627a14f08 100644 --- a/src/main/java/mekanism/common/config/GearConfig.java +++ b/src/main/java/mekanism/common/config/GearConfig.java @@ -370,8 +370,8 @@ public class GearConfig extends BaseMekanismConfig { .defineInRange("nutritionalMaxStorage", 128_000, 1, Integer.MAX_VALUE)); mekaSuitNutritionalTransferRate = CachedIntValue.wrap(this, builder.comment("Rate at which Nutritional Paste can be transferred into the nutritional injection unit.") .defineInRange("nutritionalTransferRate", 256, 1, Integer.MAX_VALUE)); - mekaSuitJetpackMaxStorage = CachedLongValue.wrap(this, builder.comment("Maximum amount of Hydrogen storable in the jetpack unit.") - .defineInRange("jetpackMaxStorage", 48_000, 1, Long.MAX_VALUE)); + mekaSuitJetpackMaxStorage = CachedLongValue.wrap(this, builder.comment("Maximum amount of Hydrogen storable per installed jetpack unit.") + .defineInRange("jetpackMaxStorage", 24_000, 1, Long.MAX_VALUE)); mekaSuitJetpackTransferRate = CachedLongValue.wrap(this, builder.comment("Rate at which Hydrogen can be transferred into the jetpack unit.") .defineInRange("jetpackTransferRate", 256, 1, Long.MAX_VALUE)); mekaSuitHelmetArmor = CachedIntValue.wrap(this, builder.comment("Armor value of MekaSuit Helmets.") diff --git a/src/main/java/mekanism/common/content/gear/mekasuit/ModuleJetpackUnit.java b/src/main/java/mekanism/common/content/gear/mekasuit/ModuleJetpackUnit.java index 38486b49c73..bd44257d37d 100644 --- a/src/main/java/mekanism/common/content/gear/mekasuit/ModuleJetpackUnit.java +++ b/src/main/java/mekanism/common/content/gear/mekasuit/ModuleJetpackUnit.java @@ -16,7 +16,6 @@ import mekanism.api.text.TextComponentUtil; import mekanism.common.MekanismLang; import mekanism.common.capabilities.Capabilities; -import mekanism.common.config.MekanismConfig; import mekanism.common.item.interfaces.IJetpackItem.JetpackMode; import mekanism.common.registries.MekanismGases; import mekanism.common.util.StorageUtils; @@ -40,8 +39,9 @@ public void init(IModule module, ModuleConfigItemCreator conf public void addHUDElements(IModule module, Player player, Consumer hudElementAdder) { if (module.isEnabled()) { IGasHandler gasHandler = module.getContainer().getCapabilityFromStack(Capabilities.GAS.item()); - GasStack stored = StorageUtils.getContainedGas(gasHandler, MekanismGases.HYDROGEN.get()); - double ratio = StorageUtils.getRatio(stored.getAmount(), MekanismConfig.gear.mekaSuitJetpackMaxStorage.getAsLong()); + GasStack stored = StorageUtils.getContainedGas(gasHandler, MekanismGases.HYDROGEN); + long capacity = gasHandler == null ? 0 : gasHandler.getTankCapacity(0); + double ratio = StorageUtils.getRatio(stored.getAmount(), capacity); hudElementAdder.accept(IModuleHelper.INSTANCE.hudElementPercent(jetpackMode.get().getHUDIcon(), ratio)); } } @@ -58,6 +58,23 @@ public void changeMode(IModule module, Player player, ItemSta } } + @Override + public void onRemoved(IModule module, boolean last) { + //Vent the excess hydrogen from the jetpack + IGasHandler gasHandler = module.getContainer().getCapabilityFromStack(Capabilities.GAS.item()); + if (gasHandler != null) { + for (int tank = 0, tanks = gasHandler.getTanks(); tank < tanks; tank++) { + GasStack stored = gasHandler.getChemicalInTank(tank); + if (!stored.isEmpty()) { + long capacity = gasHandler.getTankCapacity(tank); + if (stored.getAmount() > capacity) { + gasHandler.setChemicalInTank(tank, new GasStack(stored, capacity)); + } + } + } + } + } + public JetpackMode getMode() { return jetpackMode.get(); } diff --git a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java index 7c88e85837c..034fde9483a 100644 --- a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java +++ b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java @@ -15,6 +15,7 @@ import mekanism.api.chemical.gas.GasStack; import mekanism.api.chemical.gas.IGasHandler; import mekanism.api.chemical.gas.IGasTank; +import mekanism.api.datamaps.MekaSuitAbsorption; import mekanism.api.energy.IEnergyContainer; import mekanism.api.fluid.IExtendedFluidTank; import mekanism.api.gear.ICustomModule; @@ -49,7 +50,6 @@ import mekanism.common.content.gear.mekasuit.ModuleElytraUnit; import mekanism.common.content.gear.mekasuit.ModuleJetpackUnit; import mekanism.common.content.gear.shared.ModuleEnergyUnit; -import mekanism.api.datamaps.MekaSuitAbsorption; import mekanism.common.item.interfaces.IJetpackItem; import mekanism.common.lib.attribute.AttributeCache; import mekanism.common.lib.attribute.IAttributeRefresher; @@ -122,8 +122,13 @@ public ItemMekaSuitArmor(ArmorItem.Type armorType, Properties properties) { armorConfig = MekanismConfig.gear.mekaSuitHelmetArmor; } case CHESTPLATE -> { - gasTankSpecs.add(ChemicalTankSpec.createFillOnly(MekanismConfig.gear.mekaSuitJetpackTransferRate, MekanismConfig.gear.mekaSuitJetpackMaxStorage, - gas -> gas == MekanismGases.HYDROGEN.get(), stack -> hasModule(stack, MekanismModules.JETPACK_UNIT))); + gasTankSpecs.add(ChemicalTankSpec.createFillOnly(MekanismConfig.gear.mekaSuitJetpackTransferRate, stack -> { + //Note: We intentionally don't require the module to be enabled for purposes of calculating capacity + return moduleContainer(stack) + .map(container -> container.get(MekanismModules.JETPACK_UNIT)) + .map(moduleJetpackUnitIModule -> MekanismConfig.gear.mekaSuitJetpackMaxStorage.get() * moduleJetpackUnitIModule.getInstalledCount()) + .orElse(0L); + }, gas -> gas == MekanismGases.HYDROGEN.get(), stack -> hasModule(stack, MekanismModules.JETPACK_UNIT))); absorption = 0.4F; laserDissipation = 0.3; laserRefraction = 0.4; @@ -290,15 +295,6 @@ public List getFluidTankSpecs() { return fluidTankSpecsView; } - @NotNull - public GasStack useGas(ItemStack stack, Gas type, long amount) { - IGasHandler gasHandlerItem = Capabilities.GAS.getCapability(stack); - if (gasHandlerItem != null) { - return gasHandlerItem.extractChemical(new GasStack(type, amount), Action.EXECUTE); - } - return GasStack.EMPTY; - } - @Override public boolean supportsSlotType(ItemStack stack, @NotNull EquipmentSlot slotType) { //Note: We ignore radial modes as those are just for the Meka-Tool currently @@ -318,7 +314,7 @@ public boolean canElytraFly(ItemStack stack, LivingEntity entity) { // only mark that we can use the elytra if the jetpack is not set to hover or if it is if it has no hydrogen stored IModule jetpack = moduleContainer.get().getIfEnabled(MekanismModules.JETPACK_UNIT); return jetpack == null || jetpack.getCustomInstance().getMode() != JetpackMode.HOVER || - StorageUtils.getContainedGas(stack, MekanismGases.HYDROGEN.get()).isEmpty(); + StorageUtils.getContainedGas(stack, MekanismGases.HYDROGEN).isEmpty(); } } return false; @@ -367,7 +363,19 @@ public JetpackMode getJetpackMode(ItemStack stack) { public double getJetpackThrust(ItemStack stack) { IModule module = getEnabledModule(stack, MekanismModules.JETPACK_UNIT); if (module != null) { - return 0.1D * module.getCustomInstance().getThrustMultiplier(); + float thrustMultiplier = module.getCustomInstance().getThrustMultiplier(); + int neededGas = Mth.ceil(thrustMultiplier); + //Note: We verified we have at least one mB of gas before we get to the point of getting the thrust, + // so we only need to do extra validation if we need more than a single mB of hydrogen + if (neededGas > 1) { + GasStack containedGas = StorageUtils.getContainedGas(stack, MekanismGases.HYDROGEN); + if (neededGas < containedGas.getAmount()) { + //If we don't have enough gas stored to go at the set thrust, scale down the thrust + // to be whatever gas we have remaining + thrustMultiplier = containedGas.getAmount(); + } + } + return 0.1D * thrustMultiplier; } return 0D; } @@ -376,7 +384,11 @@ public double getJetpackThrust(ItemStack stack) { public void useJetpackFuel(ItemStack stack) { IModule module = getEnabledModule(stack, MekanismModules.JETPACK_UNIT); if (module != null) { - useGas(stack, MekanismGases.HYDROGEN.get(), Mth.ceil(module.getCustomInstance().getThrustMultiplier())); + IGasHandler gasHandlerItem = Capabilities.GAS.getCapability(stack); + if (gasHandlerItem != null) { + int amount = Mth.ceil(module.getCustomInstance().getThrustMultiplier()); + gasHandlerItem.extractChemical(MekanismGases.HYDROGEN.getStack(amount), Action.EXECUTE); + } } } @@ -478,14 +490,14 @@ private static float getDamageAbsorbed(Player player, DamageSource source, float } // Next lookup the ratio at which we can absorb the given damage type from the data map absorbRatio = source.typeHolder().unwrapKey() - // Reference holders can query data map values - .map(type -> source.typeHolder()) - // Note: In theory the above path should always be done as vanilla only makes damage sources with reference holders - // but just in case have the fallback to look up the name from the registry - .or(() -> player.level().registryAccess().registry(Registries.DAMAGE_TYPE).map(registry -> registry.wrapAsHolder(source.type()))) - .map(holder -> holder.getData(MekanismDataMapTypes.MEKA_SUIT_ABSORPTION)) - .map(MekaSuitAbsorption::absorption) - .orElseGet(MekanismConfig.gear.mekaSuitUnspecifiedDamageRatio::get); + // Reference holders can query data map values + .map(type -> source.typeHolder()) + // Note: In theory the above path should always be done as vanilla only makes damage sources with reference holders + // but just in case have the fallback to look up the name from the registry + .or(() -> player.level().registryAccess().registry(Registries.DAMAGE_TYPE).map(registry -> registry.wrapAsHolder(source.type()))) + .map(holder -> holder.getData(MekanismDataMapTypes.MEKA_SUIT_ABSORPTION)) + .map(MekaSuitAbsorption::absorption) + .orElseGet(MekanismConfig.gear.mekaSuitUnspecifiedDamageRatio::get); if (absorbRatio == 0) { //If the config or the data map specifies that the damage type shouldn't be blocked at all // stop checking if the armor is able to diff --git a/src/main/java/mekanism/common/util/StorageUtils.java b/src/main/java/mekanism/common/util/StorageUtils.java index c0bbf614445..1f40af341a6 100644 --- a/src/main/java/mekanism/common/util/StorageUtils.java +++ b/src/main/java/mekanism/common/util/StorageUtils.java @@ -8,7 +8,6 @@ import mekanism.api.chemical.ChemicalStack; import mekanism.api.chemical.IChemicalHandler; import mekanism.api.chemical.IChemicalTank; -import mekanism.api.chemical.gas.Gas; import mekanism.api.chemical.gas.GasStack; import mekanism.api.chemical.gas.IGasHandler; import mekanism.api.chemical.infuse.InfusionStack; @@ -21,6 +20,7 @@ import mekanism.api.heat.IHeatCapacitor; import mekanism.api.math.FloatingLong; import mekanism.api.math.MathUtils; +import mekanism.api.providers.IGasProvider; import mekanism.api.text.EnumColor; import mekanism.api.text.ILangEntry; import mekanism.api.text.TextComponentUtil; @@ -168,13 +168,13 @@ public static void addStoredSubstance(@NotNull ItemStack stack, @NotNull List Date: Fri, 8 Mar 2024 10:13:51 -0600 Subject: [PATCH 6/9] Fix inverted if statement --- src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java index 034fde9483a..b35586803cf 100644 --- a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java +++ b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java @@ -369,7 +369,7 @@ public double getJetpackThrust(ItemStack stack) { // so we only need to do extra validation if we need more than a single mB of hydrogen if (neededGas > 1) { GasStack containedGas = StorageUtils.getContainedGas(stack, MekanismGases.HYDROGEN); - if (neededGas < containedGas.getAmount()) { + if (neededGas > containedGas.getAmount()) { //If we don't have enough gas stored to go at the set thrust, scale down the thrust // to be whatever gas we have remaining thrustMultiplier = containedGas.getAmount(); From 531ac0493a35ce37229ab1053c43d3f4e9ac1c09 Mon Sep 17 00:00:00 2001 From: Sara Freimer Date: Fri, 8 Mar 2024 10:50:38 -0600 Subject: [PATCH 7/9] Use method on entity to calculate up for vector and revert the base thrust back to 0.15 so that the jetpack doesn't feel as slugish against gravity --- src/main/java/mekanism/common/item/gear/ItemJetpack.java | 2 +- .../java/mekanism/common/item/gear/ItemMekaSuitArmor.java | 4 ++-- .../java/mekanism/common/item/interfaces/IJetpackItem.java | 7 +------ 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/java/mekanism/common/item/gear/ItemJetpack.java b/src/main/java/mekanism/common/item/gear/ItemJetpack.java index 2cbc9160fe3..eac42430549 100644 --- a/src/main/java/mekanism/common/item/gear/ItemJetpack.java +++ b/src/main/java/mekanism/common/item/gear/ItemJetpack.java @@ -89,7 +89,7 @@ public JetpackMode getJetpackMode(ItemStack stack) { @Override public double getJetpackThrust(ItemStack stack) { - return 0.1D; + return 0.15; } @Override diff --git a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java index b35586803cf..70191c7995e 100644 --- a/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java +++ b/src/main/java/mekanism/common/item/gear/ItemMekaSuitArmor.java @@ -375,9 +375,9 @@ public double getJetpackThrust(ItemStack stack) { thrustMultiplier = containedGas.getAmount(); } } - return 0.1D * thrustMultiplier; + return 0.15 * thrustMultiplier; } - return 0D; + return 0; } @Override diff --git a/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java b/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java index 89b50cbee53..e866f0d29cd 100644 --- a/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java +++ b/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java @@ -16,7 +16,6 @@ import mekanism.common.util.MekanismUtils.ResourceType; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -129,11 +128,7 @@ static boolean handleJetpackMotion(Player player, JetpackMode mode, double thrus Vec3 delta = new Vec3(0, thrust * getVerticalCoefficient(motion.y()), 0); player.addDeltaMovement(delta); } else if (mode == JetpackMode.VECTOR) { - Vec3 forward = player.getLookAngle(); - float theta = player.getYRot() * Mth.DEG_TO_RAD; - Vec3 left = new Vec3(Mth.cos(theta), 0, Mth.sin(theta)); - Vec3 up = forward.cross(left); - Vec3 thrustVec = up.scale(thrust); + Vec3 thrustVec = player.getUpVector(1F).scale(thrust); Vec3 delta = new Vec3(thrustVec.x, thrustVec.y * getVerticalCoefficient(motion.y()), thrustVec.z); player.addDeltaMovement(delta); } else if (mode == JetpackMode.HOVER) { From fe3ba8cba81ede7bd5fb25aae1e51952cf7b3d83 Mon Sep 17 00:00:00 2001 From: Sara Freimer Date: Fri, 8 Mar 2024 15:34:48 -0600 Subject: [PATCH 8/9] Lower jetpack module's max thrust and allow modes to color themselves for module mode changes --- src/main/java/mekanism/common/content/gear/Module.java | 7 ++++++- .../common/content/gear/mekasuit/ModuleJetpackUnit.java | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/mekanism/common/content/gear/Module.java b/src/main/java/mekanism/common/content/gear/Module.java index e0cdd9db990..2faeb4d0618 100644 --- a/src/main/java/mekanism/common/content/gear/Module.java +++ b/src/main/java/mekanism/common/content/gear/Module.java @@ -380,7 +380,12 @@ boolean remove() { @Override public void displayModeChange(Player player, Component modeName, IHasTextComponent mode) { - player.sendSystemMessage(MekanismUtils.logFormat(MekanismLang.MODULE_MODE_CHANGE.translate(modeName, EnumColor.INDIGO, mode))); + Component modeComponent = mode.getTextComponent(); + if (modeComponent.getStyle().getColor() != null) { + player.sendSystemMessage(MekanismUtils.logFormat(MekanismLang.MODULE_MODE_CHANGE.translate(modeName, modeComponent))); + } else { + player.sendSystemMessage(MekanismUtils.logFormat(MekanismLang.MODULE_MODE_CHANGE.translate(modeName, EnumColor.INDIGO, modeComponent))); + } } @Override diff --git a/src/main/java/mekanism/common/content/gear/mekasuit/ModuleJetpackUnit.java b/src/main/java/mekanism/common/content/gear/mekasuit/ModuleJetpackUnit.java index bd44257d37d..afdb08f2579 100644 --- a/src/main/java/mekanism/common/content/gear/mekasuit/ModuleJetpackUnit.java +++ b/src/main/java/mekanism/common/content/gear/mekasuit/ModuleJetpackUnit.java @@ -88,8 +88,8 @@ public enum ThrustMultiplier implements IHasTextComponent { HALF(.5f), NORMAL(1f), FAST(2f), - FASTER(4f), - FASTEST(8f); + FASTER(3f), + FASTEST(4f); private final float mult; private final Component label; From eaeddb7e9efb618c95ea608e7fd705facf928676 Mon Sep 17 00:00:00 2001 From: Sara Freimer Date: Fri, 8 Mar 2024 17:33:44 -0600 Subject: [PATCH 9/9] Add tick marks to Enum based toggles in the module tweaker, and add support for using icons for them instead --- .../api/gear/config/IHasModeIcon.java | 21 ++++++++++ .../gui/element/custom/module/EnumToggle.java | 39 ++++++++++++++---- .../common/item/interfaces/IJetpackItem.java | 23 +++++++---- .../mekanism/common/util/MekanismUtils.java | 2 +- .../mekanism/gui/hud/jetpack_vector.png | Bin 1866 -> 178 bytes .../mekanism/gui/mode/jetpack_hover.png | Bin 0 -> 130 bytes .../mekanism/gui/mode/jetpack_normal.png | Bin 0 -> 129 bytes .../assets/mekanism/gui/mode/jetpack_off.png | Bin 0 -> 134 bytes .../mekanism/gui/mode/jetpack_vector.png | Bin 0 -> 135 bytes 9 files changed, 68 insertions(+), 17 deletions(-) create mode 100644 src/api/java/mekanism/api/gear/config/IHasModeIcon.java create mode 100644 src/main/resources/assets/mekanism/gui/mode/jetpack_hover.png create mode 100644 src/main/resources/assets/mekanism/gui/mode/jetpack_normal.png create mode 100644 src/main/resources/assets/mekanism/gui/mode/jetpack_off.png create mode 100644 src/main/resources/assets/mekanism/gui/mode/jetpack_vector.png diff --git a/src/api/java/mekanism/api/gear/config/IHasModeIcon.java b/src/api/java/mekanism/api/gear/config/IHasModeIcon.java new file mode 100644 index 00000000000..0ccdbb4fba0 --- /dev/null +++ b/src/api/java/mekanism/api/gear/config/IHasModeIcon.java @@ -0,0 +1,21 @@ +package mekanism.api.gear.config; + +import mekanism.api.text.IHasTextComponent; +import net.minecraft.resources.ResourceLocation; + +/** + * Conveys that an option should be represented by the corresponding mode icon when displayed in the module tweaker. + * + * @apiNote Currently only supported for {@link ModuleEnumData}. + * @since 10.5.3 + */ +public interface IHasModeIcon extends IHasTextComponent { + + /** + * @return The icon to use for displaying this mode. + * + * @implNote The file is currently expected to be 16x16, and be 5 wide, down two pixels and eight pixels tall. Ideally this will be made less strict, but for now just + * look at how the jetpack icons are. + */ + ResourceLocation getModeIcon(); +} \ No newline at end of file diff --git a/src/main/java/mekanism/client/gui/element/custom/module/EnumToggle.java b/src/main/java/mekanism/client/gui/element/custom/module/EnumToggle.java index 27073d3a9dc..edb680fa7b6 100644 --- a/src/main/java/mekanism/client/gui/element/custom/module/EnumToggle.java +++ b/src/main/java/mekanism/client/gui/element/custom/module/EnumToggle.java @@ -1,8 +1,11 @@ package mekanism.client.gui.element.custom.module; import java.util.List; +import mekanism.api.gear.config.IHasModeIcon; import mekanism.api.gear.config.ModuleEnumData; import mekanism.api.text.IHasTextComponent; +import mekanism.client.gui.GuiUtils; +import mekanism.common.MekanismLang; import mekanism.common.content.gear.ModuleConfigItem; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; @@ -20,18 +23,21 @@ class EnumToggle & IHasTextComponent> extends MiniElemen private final int BAR_LENGTH; private final ModuleConfigItem data; private final int optionDistance; + private final boolean usesIcons; boolean dragging = false; EnumToggle(GuiModuleScreen parent, ModuleConfigItem data, int xPos, int yPos) { super(parent, xPos, yPos); this.data = data; BAR_LENGTH = this.parent.getScreenWidth() - 24; - this.optionDistance = (BAR_LENGTH / (getData().getEnums().size() - 1)); + List options = getData().getEnums(); + this.optionDistance = (BAR_LENGTH / (options.size() - 1)); + this.usesIcons = options.stream().findFirst().filter(option -> option instanceof IHasModeIcon).isPresent(); } @Override protected int getNeededHeight() { - return 28; + return usesIcons ? 31 : 28; } private ModuleEnumData getData() { @@ -48,25 +54,42 @@ protected void renderBackground(GuiGraphics guiGraphics, int mouseX, int mouseY) @Override protected void renderForeground(GuiGraphics guiGraphics, int mouseX, int mouseY) { int textColor = parent.screenTextColor(); - parent.drawTextWithScale(guiGraphics, data.getDescription(), getRelativeX() + 3, getRelativeY(), textColor, 0.8F); + Component description = data.getDescription(); + if (usesIcons) { + description = MekanismLang.GENERIC_STORED.translate(description, getData().get()); + } + parent.drawTextWithScale(guiGraphics, description, getRelativeX() + 3, getRelativeY(), textColor, usesIcons ? 0.75F : 0.8F); List options = getData().getEnums(); for (int i = 0, count = options.size(); i < count; i++) { int center = optionDistance * i; - Component text = options.get(i).getTextComponent(); + TYPE option = options.get(i); + Component text = option.getTextComponent(); //Similar to logic for drawScaledCenteredText except shifts values slightly if they go past the max length int textWidth = parent.getStringWidth(text); - float widthScaling = (textWidth / 2F) * TEXT_SCALE; - float left = BAR_START + center - widthScaling; + float widthScaling = usesIcons ? 2.5F : (textWidth / 2F) * TEXT_SCALE; + int optionCenter = BAR_START + center; + float left = optionCenter - widthScaling; if (left < 0) { left = 0; } else { int max = parent.getScreenWidth() - 1; - int end = xPos + Mth.ceil(left + textWidth * TEXT_SCALE); + float objectWidth = usesIcons ? 5 : textWidth * TEXT_SCALE; + int end = xPos + Mth.ceil(left + objectWidth); if (end > max) { left -= end - max; } } - parent.drawTextWithScale(guiGraphics, text, getRelativeX() + left, getRelativeY() + 20, textColor, TEXT_SCALE); + int color = textColor; + if (text.getStyle().getColor() != null) { + color = 0xFF000000 | text.getStyle().getColor().getValue(); + } + GuiUtils.fill(guiGraphics, getRelativeX() + optionCenter, getRelativeY() + 17, 1, 3, color); + if (usesIcons) { + IHasModeIcon hasModeIcon = (IHasModeIcon) option; + guiGraphics.blit(hasModeIcon.getModeIcon(), (int) (getRelativeX() + optionCenter - 8), getRelativeY() + 19, 0, 0, 16, 16, 16, 16); + } else { + parent.drawTextWithScale(guiGraphics, text, getRelativeX() + left, getRelativeY() + 20, textColor, TEXT_SCALE); + } } } diff --git a/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java b/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java index e866f0d29cd..a4b2b1bda6f 100644 --- a/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java +++ b/src/main/java/mekanism/common/item/interfaces/IJetpackItem.java @@ -4,9 +4,9 @@ import java.util.function.Predicate; import mekanism.api.IIncrementalEnum; import mekanism.api.annotations.NothingNullByDefault; +import mekanism.api.gear.config.IHasModeIcon; import mekanism.api.math.MathUtils; import mekanism.api.text.EnumColor; -import mekanism.api.text.IHasTextComponent; import mekanism.api.text.ILangEntry; import mekanism.common.CommonPlayerTickHandler; import mekanism.common.Mekanism; @@ -34,21 +34,23 @@ public interface IJetpackItem { void useJetpackFuel(ItemStack stack); @NothingNullByDefault - enum JetpackMode implements IIncrementalEnum, IHasTextComponent { - NORMAL(MekanismLang.JETPACK_NORMAL, EnumColor.DARK_GREEN, MekanismUtils.getResource(ResourceType.GUI_HUD, "jetpack_normal.png")), - HOVER(MekanismLang.JETPACK_HOVER, EnumColor.DARK_AQUA, MekanismUtils.getResource(ResourceType.GUI_HUD, "jetpack_hover.png")), - VECTOR(MekanismLang.JETPACK_VECTOR, EnumColor.ORANGE, MekanismUtils.getResource(ResourceType.GUI_HUD, "jetpack_vector.png")), - DISABLED(MekanismLang.JETPACK_DISABLED, EnumColor.DARK_RED, MekanismUtils.getResource(ResourceType.GUI_HUD, "jetpack_off.png")); + enum JetpackMode implements IIncrementalEnum, IHasModeIcon { + NORMAL(MekanismLang.JETPACK_NORMAL, EnumColor.DARK_GREEN, "jetpack_normal.png"), + HOVER(MekanismLang.JETPACK_HOVER, EnumColor.DARK_AQUA, "jetpack_hover.png"), + VECTOR(MekanismLang.JETPACK_VECTOR, EnumColor.ORANGE, "jetpack_vector.png"), + DISABLED(MekanismLang.JETPACK_DISABLED, EnumColor.DARK_RED, "jetpack_off.png"); private static final JetpackMode[] MODES = values(); private final ILangEntry langEntry; private final EnumColor color; private final ResourceLocation hudIcon; + private final ResourceLocation modeIcon; - JetpackMode(ILangEntry langEntry, EnumColor color, ResourceLocation hudIcon) { + JetpackMode(ILangEntry langEntry, EnumColor color, String icon) { this.langEntry = langEntry; this.color = color; - this.hudIcon = hudIcon; + this.hudIcon = MekanismUtils.getResource(ResourceType.GUI_HUD, icon); + this.modeIcon = MekanismUtils.getResource(ResourceType.GUI_MODE, icon); } @Override @@ -68,6 +70,11 @@ public ResourceLocation getHUDIcon() { public static JetpackMode byIndexStatic(int index) { return MathUtils.getByIndexMod(MODES, index); } + + @Override + public ResourceLocation getModeIcon() { + return modeIcon; + } } /** diff --git a/src/main/java/mekanism/common/util/MekanismUtils.java b/src/main/java/mekanism/common/util/MekanismUtils.java index 0831b21d07b..40d82b19d4a 100644 --- a/src/main/java/mekanism/common/util/MekanismUtils.java +++ b/src/main/java/mekanism/common/util/MekanismUtils.java @@ -26,7 +26,6 @@ import mekanism.api.inventory.IInventorySlot; import mekanism.api.math.FloatingLong; import mekanism.api.math.MathUtils; -import mekanism.api.text.APILang; import mekanism.api.text.EnumColor; import mekanism.client.MekanismClient; import mekanism.common.Mekanism; @@ -802,6 +801,7 @@ public enum ResourceType { GUI_GAUGE("gui/gauge"), GUI_HUD("gui/hud"), GUI_ICONS("gui/icons"), + GUI_MODE("gui/mode"), GUI_PROGRESS("gui/progress"), GUI_RADIAL("gui/radial"), GUI_SLOT("gui/slot"), diff --git a/src/main/resources/assets/mekanism/gui/hud/jetpack_vector.png b/src/main/resources/assets/mekanism/gui/hud/jetpack_vector.png index 066fd8582c7b83e634a979daa64d26a9a476e38d..a97e457845652003f94b5ef4ce89d539a51c3b83 100644 GIT binary patch delta 161 zcmX@bw~29rWIY2ASj||l7f3Oc1o;IsFqBO`YXRhCd%8G=NJz3C+{nl1D8g{y=l}T= zGcru8I{W^ee7kRNw91prGeBjipcwpy%{AxF0 z&0tu8-~^r*jm%?QpFye}FFUvuD7I_hV~}U4c?BxVaY9)icVJ!J_-@IVPhW(?+6%ye#h!XrBpsA$gC?o&7Vqk&kKF>BgmB9O>Z8 z3E-QZP8xhpOn(OvzD^X`q25XEy@uY~wYucIGU``FO|oH!QOB&5(|pWp8$nseGF#LZ zY_dfqueR8%tw01+Rk{HO6%ur4voBB-qQi!&2_hDxX$z`R#6m+SHyU&lic~46k_DR~ zQZpVbF!RQluRzeu71R|$gTa*l7tMS(`AIXqmq8KOaDTW`TsZ1lVGQNQUAw>rK$?@q&esUlg(F%%M7+D;OYEzu|&#g9WS35gRHFCsyrq(H$14n9Z-A%+w&lAeJaeUuntj47c> znkZ?kr2a`Q88c;@@+q!x@kL4~v80NXsvZ;7SE-@Kni`m2Pr_jIW3Ar)Y5(5@!cf8Scz2dpgl!w9a zcz^4T$?>w~SLdJh5VHoFF>ssYHO~m|78W?qWm$7tQp+ir?G@{`rTQTr7!R1&Ae$sD z`-QB*9;Lp#Bmv(+CPVJFIQ$fln{1eoY6GIQl1E&FlDB;65Y+Dk!B&kn!TN^$tbpjG z&Ss0ldlC*6cBgb3vIu+$M|*uiZaDHGoPWn^N3ohq`+jGs`JEsfQ`!23J-2&dFiX8V z(%<#opAx6y)M%*8kL4y+vS`&y>0Ekat*NS4YnG_3_>a`Qqpk zZsfi@R&O4_+m?0Lf&Qjm1N>D%9&ORwg#1S(FeaGMD7ZhL3Z+NYJ)8I}$(SNR| z?%aWBepto$hCLIkv&MmKpe$iQ*A{m4i*t{$WWauh>AE$6^me@ zv=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_ z0Yam~RI_UWP&La)#baVNw<-o-5kL@w00I&-^+b9x1JChw4b`7kz)Z>sDF?gKlmT~?$#_!O}a^;7|{J<+aIGqa2IISZTtJ!wwot_ z{~5T_+Wu+-nEfQZ-qs>VK>s#yaoyJBJ>YT&7<$qrLvkcPO`%W#-p}Zpa=^eX(7WdL z*4oGE1CXJvmT!QALtv~(+3Ozf?&<99-!rZLegO66a&;jD!DRpd0Dp2&OjJbx006tY zyZih5>+9?6?Ck35>i_@$@bK{T^z`ZJ>GJaO?d|RB>+9#|=kD(A@9*#M@bK~R@%sAu z>gwwB^z`iP?C9v|va+(bx3{>sxWU1}#>U3c(b3e@)Z5$J^78WY^Yh%?-1qnQ`1ts* zudn<2`@`f-YybcN0e^H-PE!Ct=GbNc0004EOGiWihy@);00009a7bBm000XU000XU z0RWnu7ytkO2XskIMF-{v2NnZ2m1VXl0001JNklpb`D|a9gqsx8B|*UNWg^L&z;w>0zde=vi3kBAcIzIGit=u zoX$B1G6M9q&yNvUV>l+4-y-$+SC{dp)64(p07Xay?wsYuQUCw|07*qoM6N<$f}E0< Ai2wiq diff --git a/src/main/resources/assets/mekanism/gui/mode/jetpack_hover.png b/src/main/resources/assets/mekanism/gui/mode/jetpack_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..73c683773cc385850d328a2f90aaa444586ce6df GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_&Z}{r~?TNLIYBeGU|4 zDhcunW?(3reAWWUQ}c9j4B?1Q=3r%FQ&GxNozU@sMR2Zxl82yMivd%ofdKbHiK7e* XLENHBP7Wb_KphO8u6{1-oD!MrXa|cW_l<> agN=b9?2Ra6kGCSoCI(MeKbLh*2~7a0Umptq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/mekanism/gui/mode/jetpack_vector.png b/src/main/resources/assets/mekanism/gui/mode/jetpack_vector.png new file mode 100644 index 0000000000000000000000000000000000000000..6118a59246f2f683fc6c002cdfe0d7309b5a805d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u7Bpo|Ns9VNKSlp=Lb-b zsU*lRn1P{e@>vTYPutVQF@z&JnS+&yO+_h7bwbAj7D3}gmkCNe9EmJKiK`Sk!zLt! diR^V?Uxw^!5_CBCC22WQ%mvv4FO#po&CXoOD literal 0 HcmV?d00001