From 33aafe69abd84edc14dc0c8401ff63f2cb06c3cc Mon Sep 17 00:00:00 2001 From: Alastors <78517796+Alastors@users.noreply.github.com> Date: Mon, 19 Feb 2024 01:35:08 -0500 Subject: [PATCH] Slow Boots + Omni Toggle (#25) --- src/main/java/thaumicboots/api/ItemBoots.java | 61 +++++++++++++++--- .../thaumicboots/api/ItemElectricBoots.java | 2 +- .../java/thaumicboots/api/ItemVoidBoots.java | 2 +- .../api/serverfiles/PacketHandler.java | 2 + .../api/serverfiles/PacketOmniToggle.java | 35 ++++++++++ .../api/serverfiles/PacketOmniToggleAck.java | 42 ++++++++++++ .../item/boots/unique/ItemSlowBoots.java | 23 +++++++ src/main/java/thaumicboots/main/Config.java | 5 ++ .../thaumicboots/main/utils/BootKeys.java | 12 ++++ .../main/utils/compat/ThaumcraftHelper.java | 28 +++++++- .../assets/thaumicboots/lang/en_US.lang | 10 +++ .../assets/thaumicboots/model/slowboots.png | Bin 0 -> 535 bytes .../textures/32_bit/bootsSlow.png | Bin 0 -> 943 bytes .../textures/items/bootsSlow_16x.png | Bin 0 -> 766 bytes 14 files changed, 207 insertions(+), 15 deletions(-) create mode 100644 src/main/java/thaumicboots/api/serverfiles/PacketOmniToggle.java create mode 100644 src/main/java/thaumicboots/api/serverfiles/PacketOmniToggleAck.java create mode 100644 src/main/java/thaumicboots/item/boots/unique/ItemSlowBoots.java create mode 100644 src/main/resources/assets/thaumicboots/model/slowboots.png create mode 100644 src/main/resources/assets/thaumicboots/textures/32_bit/bootsSlow.png create mode 100644 src/main/resources/assets/thaumicboots/textures/items/bootsSlow_16x.png diff --git a/src/main/java/thaumicboots/api/ItemBoots.java b/src/main/java/thaumicboots/api/ItemBoots.java index b9c52e5..2f70139 100644 --- a/src/main/java/thaumicboots/api/ItemBoots.java +++ b/src/main/java/thaumicboots/api/ItemBoots.java @@ -46,9 +46,11 @@ public class ItemBoots extends ItemArmor public String unlocalisedName; public double jumpBonus; + public boolean omniMovement; public static final String TAG_MODE_JUMP = "jump"; public static final String TAG_MODE_SPEED = "speed"; + public static final String TAG_MOD_OMNI = "omni"; public ItemBoots(ArmorMaterial par2EnumArmorMaterial, int par3, int par4) { super(par2EnumArmorMaterial, par3, par4); @@ -60,6 +62,7 @@ protected void setBootsData() { visDiscount = 0; runBonus = 0.165F; jumpBonus = 0.0D; + omniMovement = false; tier = 0; steadyBonus = false; // this is the toggle for the longrunningbonus. negateFall = true; // certain boots don't have fall damage in base. @@ -72,6 +75,7 @@ protected void setBootsData() { public double getJumpModifier() { return jumpBonus; + } public static double changeJump(double prevJump) { @@ -122,6 +126,28 @@ public static void setModeSpeed(ItemStack stack, double state) { stack.stackTagCompound.setDouble(TAG_MODE_SPEED, state); } + public boolean getOmniState() { + return omniMovement; + } + + public static boolean changeOmniState(boolean prevState) { + return !prevState; + } + + public static boolean isOmniEnabled(final ItemStack stack) { + if (stack.stackTagCompound == null) { + return false; + } + return stack.stackTagCompound.getBoolean(TAG_MOD_OMNI); + } + + public static void setModeOmni(ItemStack stack, boolean state) { + if (stack.stackTagCompound == null) { + stack.setTagCompound(new NBTTagCompound()); + } + stack.stackTagCompound.setBoolean(TAG_MOD_OMNI, state); + } + // TODO: the part not from interfaces @SideOnly(Side.CLIENT) // this method is important, it's what initializes the texture @@ -174,8 +200,7 @@ public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) protected float computeBonus(ItemStack itemStack, EntityPlayer player) { int ticks = player.inventory.armorItemInSlot(0).stackTagCompound.getInteger("runTicks"); - float bonus = runBonus + ((ticks * 0.2F) * longrunningbonus); - return bonus; + return runBonus + ((ticks * 0.2F) * longrunningbonus); } @Override @@ -183,8 +208,9 @@ public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { if (negateFall && player.fallDistance > 0.0F) { player.fallDistance = 0.0F; } - - if (player.moveForward == 0F && player.moveStrafing == 0F) { + boolean omniMode = isOmniEnabled(itemStack); + if ((player.moveForward == 0F && player.moveStrafing == 0F && omniMode) + || (player.moveForward <= 0F && !omniMode)) { return; } @@ -199,8 +225,8 @@ public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { } public void applyFinalBonus(float bonus, EntityPlayer player, ItemStack itemStack) { - bonus *= itemStack.stackTagCompound.getDouble(TAG_MODE_SPEED); - applyBonus(player, bonus); + bonus *= isSpeedEnabled(itemStack); + applyBonus(player, bonus, itemStack); } public void stepHeight(EntityPlayer player) { @@ -222,7 +248,7 @@ public void runningTicks(EntityPlayer player) { } } - public void applyBonus(EntityPlayer player, float bonus) { + public void applyBonus(EntityPlayer player, float bonus, ItemStack itemStack) { if (waterEffects && player.isInWater()) { bonus *= 0.25F; } @@ -230,7 +256,7 @@ public void applyBonus(EntityPlayer player, float bonus) { if (player.moveForward != 0.0) { player.moveFlying(0.0F, player.moveForward, bonus); } - if (player.moveStrafing != 0.0) { + if (player.moveStrafing != 0.0 && itemStack.stackTagCompound.getBoolean(TAG_MOD_OMNI)) { player.moveFlying(player.moveStrafing, 0.0F, bonus); } } else if (Hover.getHover(player.getEntityId())) { @@ -270,6 +296,23 @@ public static void renderHUDSpeedNotification() { GTNHLib.proxy.printMessageAboveHotbar(text, 60, true, true); } + @Optional.Method(modid = "gtnhlib") + @SideOnly(Side.CLIENT) + public static void renderHUDOmniNotification() { + Minecraft mc = Minecraft.getMinecraft(); + String result = "thaumicboots.omniState" + getBoots(mc.thePlayer).stackTagCompound.getBoolean(TAG_MOD_OMNI); + String midResult, finalResult; + if (getBoots(mc.thePlayer).stackTagCompound.getBoolean(TAG_MOD_OMNI)) { + midResult = EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocal(result); + } else { + midResult = EnumChatFormatting.DARK_RED + StatCollector.translateToLocal(result); + } + finalResult = EnumChatFormatting.GOLD + StatCollector.translateToLocal("thaumicboots.omniEffect") + + " " + + midResult; + GTNHLib.proxy.printMessageAboveHotbar(finalResult, 60, true, true); + } + @Optional.Method(modid = "gtnhlib") public static String getModeText(String effect, double val) { String endResult = (int) val + "%"; @@ -281,8 +324,6 @@ public static String getModeText(String effect, double val) { case 100 -> EnumChatFormatting.AQUA + StatCollector.translateToLocal(endResult); default -> EnumChatFormatting.DARK_GRAY + StatCollector.translateToLocal(endResult); }; - return EnumChatFormatting.GOLD + StatCollector.translateToLocal(effect) + " " + result; - } } diff --git a/src/main/java/thaumicboots/api/ItemElectricBoots.java b/src/main/java/thaumicboots/api/ItemElectricBoots.java index bdfeccb..b98befe 100644 --- a/src/main/java/thaumicboots/api/ItemElectricBoots.java +++ b/src/main/java/thaumicboots/api/ItemElectricBoots.java @@ -154,6 +154,6 @@ public void applyFinalBonus(float bonus, EntityPlayer player, ItemStack itemStac bonus *= 0; } bonus *= itemStack.stackTagCompound.getDouble(TAG_MODE_SPEED); - applyBonus(player, bonus); + applyBonus(player, bonus, itemStack); } } diff --git a/src/main/java/thaumicboots/api/ItemVoidBoots.java b/src/main/java/thaumicboots/api/ItemVoidBoots.java index 7055a5b..a8e7c6a 100644 --- a/src/main/java/thaumicboots/api/ItemVoidBoots.java +++ b/src/main/java/thaumicboots/api/ItemVoidBoots.java @@ -115,7 +115,7 @@ public void onArmorTick(final World world, final EntityPlayer player, final Item // speed boost float bonus = getSpeedModifier() * sashEquiped(player); bonus *= stack.stackTagCompound.getDouble(TAG_MODE_SPEED); - applyBonus(player, bonus); + applyBonus(player, bonus, stack); } public float sashEquiped(final EntityPlayer player) { diff --git a/src/main/java/thaumicboots/api/serverfiles/PacketHandler.java b/src/main/java/thaumicboots/api/serverfiles/PacketHandler.java index 86d6e18..8501953 100644 --- a/src/main/java/thaumicboots/api/serverfiles/PacketHandler.java +++ b/src/main/java/thaumicboots/api/serverfiles/PacketHandler.java @@ -17,5 +17,7 @@ public static void initPackets() { INSTANCE.registerMessage(PacketJumpToggleAck.class, PacketJumpToggleAck.class, 2, Side.CLIENT); INSTANCE.registerMessage(PacketSpeedToggle.class, PacketSpeedToggle.class, 3, Side.SERVER); INSTANCE.registerMessage(PacketSpeedToggleAck.class, PacketSpeedToggleAck.class, 4, Side.CLIENT); + INSTANCE.registerMessage(PacketOmniToggle.class, PacketOmniToggle.class, 5, Side.SERVER); + INSTANCE.registerMessage(PacketOmniToggleAck.class, PacketOmniToggleAck.class, 6, Side.CLIENT); } } diff --git a/src/main/java/thaumicboots/api/serverfiles/PacketOmniToggle.java b/src/main/java/thaumicboots/api/serverfiles/PacketOmniToggle.java new file mode 100644 index 0000000..68bda3c --- /dev/null +++ b/src/main/java/thaumicboots/api/serverfiles/PacketOmniToggle.java @@ -0,0 +1,35 @@ +package thaumicboots.api.serverfiles; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import io.netty.buffer.ByteBuf; +import thaumicboots.api.ItemBoots; + +public class PacketOmniToggle implements IMessage, IMessageHandler { + + public void fromBytes(ByteBuf byteBuf) { + // not needed + } + + public void toBytes(ByteBuf byteBuf) { + // not needed + } + + @Override + public IMessage onMessage(PacketOmniToggle message, MessageContext ctx) { + EntityPlayerMP player = ctx.getServerHandler().playerEntity; + final ItemStack boots = ItemBoots.getBoots(player); + if (boots != null) { + boolean omniState = ItemBoots.changeOmniState(ItemBoots.isOmniEnabled(boots)); + ItemBoots.setModeOmni(boots, omniState); + PacketOmniToggleAck ackMessage = new PacketOmniToggleAck(); + ackMessage.state = omniState; + PacketHandler.INSTANCE.sendTo(ackMessage, player); + } + return null; + } +} diff --git a/src/main/java/thaumicboots/api/serverfiles/PacketOmniToggleAck.java b/src/main/java/thaumicboots/api/serverfiles/PacketOmniToggleAck.java new file mode 100644 index 0000000..f77e411 --- /dev/null +++ b/src/main/java/thaumicboots/api/serverfiles/PacketOmniToggleAck.java @@ -0,0 +1,42 @@ +package thaumicboots.api.serverfiles; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import thaumicboots.api.ItemBoots; +import thaumicboots.main.utils.compat.GTNHLibHelper; + +public class PacketOmniToggleAck implements IMessage, IMessageHandler { + + public boolean state; + + @Override + public void fromBytes(ByteBuf byteBuf) { + state = byteBuf.readBoolean(); + } + + @Override + public void toBytes(ByteBuf byteBuf) { + byteBuf.writeBoolean(state); + } + + @SideOnly(Side.CLIENT) + public IMessage onMessage(PacketOmniToggleAck message, MessageContext ctx) { + Minecraft mc = Minecraft.getMinecraft(); + final ItemStack boots = ItemBoots.getBoots(mc.thePlayer); + if (boots != null) { + ItemBoots.setModeOmni(boots, message.state); + if (GTNHLibHelper.isActive()) { + ItemBoots.renderHUDOmniNotification(); + } + } + + return null; + } +} diff --git a/src/main/java/thaumicboots/item/boots/unique/ItemSlowBoots.java b/src/main/java/thaumicboots/item/boots/unique/ItemSlowBoots.java new file mode 100644 index 0000000..204005b --- /dev/null +++ b/src/main/java/thaumicboots/item/boots/unique/ItemSlowBoots.java @@ -0,0 +1,23 @@ +package thaumicboots.item.boots.unique; + +import thaumicboots.api.ItemBoots; +import thaumicboots.main.utils.TabThaumicBoots; + +public class ItemSlowBoots extends ItemBoots { + + public ItemSlowBoots(ArmorMaterial par2EnumArmorMaterial, int par3, int par4) { + super(par2EnumArmorMaterial, par3, par4); + setCreativeTab(TabThaumicBoots.tabThaumicBoots); + setUnlocalizedName(unlocalisedName); + } + + protected void setBootsData() { + super.setBootsData(); + tier = 2; + runBonus = -0.035F; + negateFall = true; + unlocalisedName = "ItemSlowBoots"; + iconResPath = "thaumicboots:bootsSlow_16x"; + armorResPath = "thaumicboots:model/slowboots.png"; + } +} diff --git a/src/main/java/thaumicboots/main/Config.java b/src/main/java/thaumicboots/main/Config.java index 998506e..bc06135 100644 --- a/src/main/java/thaumicboots/main/Config.java +++ b/src/main/java/thaumicboots/main/Config.java @@ -13,6 +13,7 @@ import thaumcraft.api.ThaumcraftApi; import thaumicboots.item.boots.unique.ItemChristmasBoots; import thaumicboots.item.boots.unique.ItemSeasonBoots; +import thaumicboots.item.boots.unique.ItemSlowBoots; import thaumicboots.item.tools.ItemThaumicInterfacer; import thaumicboots.main.utils.VersionInfo; @@ -30,6 +31,7 @@ public class Config { public static Item arcaniumLens; public static Item seasonBoots; public static Item christmasBoots; + public static Item slowBoots; // ----- Config State info ---------------------------------- public static Configuration configuration; private static Config instance = null; @@ -75,6 +77,9 @@ public static void setupItems() { christmasBoots = new ItemChristmasBoots(ThaumcraftApi.armorMatSpecial, 4, 3); GameRegistry.registerItem(christmasBoots, christmasBoots.getUnlocalizedName()); + + slowBoots = new ItemSlowBoots(ThaumcraftApi.armorMatSpecial, 4, 3); + GameRegistry.registerItem(slowBoots, slowBoots.getUnlocalizedName()); } private static void processConfigFile() { diff --git a/src/main/java/thaumicboots/main/utils/BootKeys.java b/src/main/java/thaumicboots/main/utils/BootKeys.java index 5d3f9f8..e17f154 100644 --- a/src/main/java/thaumicboots/main/utils/BootKeys.java +++ b/src/main/java/thaumicboots/main/utils/BootKeys.java @@ -12,6 +12,7 @@ import cpw.mods.fml.relauncher.SideOnly; import thaumicboots.api.serverfiles.PacketHandler; import thaumicboots.api.serverfiles.PacketJumpToggle; +import thaumicboots.api.serverfiles.PacketOmniToggle; import thaumicboots.api.serverfiles.PacketSpeedToggle; public class BootKeys { @@ -24,11 +25,16 @@ public class BootKeys { "keybinding.speedtoggle", Keyboard.KEY_NONE, "Thaumic Boots"); + private final KeyBinding keyOmniToggle = new KeyBinding( + "keybinding.omniToggle", + Keyboard.KEY_NONE, + "Thaumic Boots"); public BootKeys() { FMLCommonHandler.instance().bus().register(this); ClientRegistry.registerKeyBinding(keyJumpToggle); ClientRegistry.registerKeyBinding(keySpeedToggle); + ClientRegistry.registerKeyBinding(keyOmniToggle); } @SideOnly(Side.CLIENT) @@ -42,6 +48,8 @@ private void checkKeys() { toggleJump(); } else if (keySpeedToggle.isPressed()) { toggleSpeed(); + } else if (keyOmniToggle.isPressed()) { + toggleOmni(); } } @@ -52,4 +60,8 @@ private static void toggleJump() { private static void toggleSpeed() { PacketHandler.INSTANCE.sendToServer(new PacketSpeedToggle()); } + + private static void toggleOmni() { + PacketHandler.INSTANCE.sendToServer(new PacketOmniToggle()); + } } diff --git a/src/main/java/thaumicboots/main/utils/compat/ThaumcraftHelper.java b/src/main/java/thaumicboots/main/utils/compat/ThaumcraftHelper.java index 224f14d..6863315 100644 --- a/src/main/java/thaumicboots/main/utils/compat/ThaumcraftHelper.java +++ b/src/main/java/thaumicboots/main/utils/compat/ThaumcraftHelper.java @@ -263,6 +263,7 @@ public static void getItems() { public static InfusionRecipe seasonalBoot; public static CrucibleRecipe seasonalToChristmas; + public static CrucibleRecipe slowBoot; public static void setupCrafting() { thaumaturgicCombinator = ThaumcraftApi.addCrucibleRecipe( @@ -284,6 +285,12 @@ public static void setupCrafting() { new ItemStack(Items.iron_sword), new ItemStack(Blocks.lit_pumpkin), new ItemStack(ConfigItems.itemFocusFrost), new ItemStack(Blocks.sapling, 1, 1) }); + slowBoot = ThaumcraftApi.addCrucibleRecipe( + "TB_Unique_Boots", + new ItemStack(Config.slowBoots), + new ItemStack(ConfigItems.itemBootsTraveller), + new AspectList().add(Aspect.TRAP, 25).add(TB_Aspect.BOOTS, 25).add(Aspect.EXCHANGE, 10)); + if (CalendarHelper.isChristmas()) { seasonalToChristmas = ThaumcraftApi.addCrucibleRecipe( "TB_Seasonal_Boots", @@ -374,9 +381,9 @@ public static void setupResearch() { new ResourceLocation(VersionInfo.ModID, "textures/gui/research_bg1_b.png")); ResearchItem coreResearch; - ResearchItem explorationsCore, taintedCore, seasonalCore, seasonalStabilized; + ResearchItem explorationsCore, taintedCore, seasonalCore, seasonalStabilized, uniqueCore; ResearchPage core1, core2, explorationsCore1, explorationsCore2, taintedCore1, taintedCore2, seasonalCore1, - seasonalCore2, seasonalStabilized1, seasonalStabilized2; + seasonalCore2, seasonalStabilized1, seasonalStabilized2, uniqueCore1, uniqueCore2; ResearchPage explorationsTainted1, explorationsTainted2, explorationsTainted3, explorationsCompat1, explorationsCompat2, explorationsCompat3; @@ -424,12 +431,27 @@ public static void setupResearch() { if (CalendarHelper.isChristmas()) { seasonalStabilized2 = new ResearchPage(seasonalToChristmas); } else { - seasonalStabilized2 = new ResearchPage("seasonalStabilized2"); + seasonalStabilized2 = new ResearchPage("seasonalStabilized.2"); } seasonalStabilized.setPages(seasonalStabilized1, seasonalStabilized2); seasonalStabilized.setParents("TB_Seasonal_Boots"); ResearchCategories.addResearch(seasonalStabilized); + uniqueCore = new ResearchItem( + "TB_Unique_Boots", + category, + new AspectList().add(TB_Aspect.BOOTS, 25).add(Aspect.EXCHANGE, 25).add(Aspect.TOOL, 25) + .add(Aspect.MAGIC, 25).add(Aspect.ENERGY, 25), + -2, + 0, + 0, + new ItemStack(Config.slowBoots)); + uniqueCore1 = new ResearchPage("UniqueCore.1"); + uniqueCore2 = new ResearchPage(slowBoot); + uniqueCore.setPages(uniqueCore1, uniqueCore2); + uniqueCore.setParents("TB_Core_Research"); + ResearchCategories.addResearch(uniqueCore); + if (!EMTHelper.isActive() && !ExplorationsHelper.isActive() && !TaintedHelper.isActive()) { return; } diff --git a/src/main/resources/assets/thaumicboots/lang/en_US.lang b/src/main/resources/assets/thaumicboots/lang/en_US.lang index 6a9105b..b30edd8 100644 --- a/src/main/resources/assets/thaumicboots/lang/en_US.lang +++ b/src/main/resources/assets/thaumicboots/lang/en_US.lang @@ -49,6 +49,7 @@ item.ItemPurpleVoidwalkerBoots.name=Altered Boots of the Purple Haze item.ItemSeasonBoots.name=Boots of the Seasons item.ItemChristmasBoots.name=Boots of Christmas Spirit +item.ItemSlowBoots.name=Boots of the Sloth #Research things tc.research_category.THAUMICBOOTS=Thaumic Boots @@ -74,6 +75,9 @@ tc.research_text.TB_Seasonal_Boots=Christmas Spirits and Other Magickal Phenomen tc.research_name.TB_Seasonal_Stabilized=Stabilized Seasonal Magicks tc.research_text.TB_Seasonal_Stabilized=Stabilization of Seasonal Magicks +tc.research_name.TB_Unique_Boots=Unique Magicks +tc.research_text.TB_Unique_Boots=The Study of Unreplicable Magicks + #Actual Researches Core.1=In your studies, you have discovered something rather... peculiar. In this, you found that you were somehow able to equally combine different forms of magick energy to create something...

Unique.

A new form of energy, somehow greater than the sum of its original parts.

You wonder where else this could be applied. ExplorationsCore.1=Your study of the sky and stars yielded, after intense research of these celestial bodies, you discovered what you call "comets" and "meteors."

In this, you discovered some magicks innate to the heavens, able to be infused into your boots.

And yet, you feel as if there were still more to discover... @@ -87,6 +91,7 @@ ExplorationsEMT.1=As you continued your studies of electricity, you noticed some SeasonalCore.1=In your studies of magickal phenomena, you discovered something peculiar: there are spikes of magickal energies around specific parts of the solar calendar.

These spikes have been known to cause various tranformations, such as transforming chests to presents, and vice versa as they pass. Interestingly, you've managed to capture this chaotic energy.

Yet you wonder if there is some way you may be able to stabilize these energies... SeasonalStabilized.1=As you continued your studies of the seasonal magick phenomena, you noticed something interesting, it actually is possible to attune these energies into a specific phenomena, resulting in a drastically boosted seasonal effect... with one caveat: these effects become incredibly diminished after the season has passed.

The first of these effects you've noticed is a drastic increase in the steady running speed over time, while freezing water similar to that of comet attuned magicks

Though, you almost swear you can hear sleigh bells... SeasonalStabilized.2=You believe you should come back to this in December... +UniqueCore.1=In your studies of magickal phenomena, you've run upon something peculiar: there are certain magicks that can only be recreated in exact scenarios. The first of these you've stumbled upon, being a seemingly simple slowness curse.

However, while you were able to reproduce the boots themselves, you cannot for the life of you understand how the magick energy works, nor how to recreate it directly.

You begin to wonder if you'll stumble upon energies in similar situations... #Aspects tc.aspect.caelum=Celestial Space @@ -96,6 +101,11 @@ itemGroup.Thaumic Boots=Thaumic Boots keybinding.speedtoggle=Modulate Speed Boost keybinding.jumptoggle=Modulate Jump Boost +keybinding.omnitoggle=Modulate Jump Boost thaumicboots.jumpEffect=Jump Boost: thaumicboots.speedEffect=Speed Boost: +thaumicboots.omniEffect=Omni Mode: + +thaumicboots.omniStatetrue=Activated +thaumicboots.omniStatefalse=Deactivated diff --git a/src/main/resources/assets/thaumicboots/model/slowboots.png b/src/main/resources/assets/thaumicboots/model/slowboots.png new file mode 100644 index 0000000000000000000000000000000000000000..e09173f1a7befdde76ccd98b92c406fe58752d7c GIT binary patch literal 535 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQk(@Ik;M!Q+(IDCc^WqtdCps7e6_{Ka zI0P7#99WPz0*V(hOd>W$r2MRz*ZH%aIc0^EmIzml)m*PgrHKyPZ-=f6{QFt|sc)!Z zkKvKWg)^3QrWmc9ls&zFrPjKz)kV))TZ(qBnG`$^VsMF4Ld86FeRJFW;#X|Dr|g%j zsqRz%yIgO|*#%$sI*8~q76@!oJzjVrYwMFeK`Re@|GVI09K#ERt-pFNy#3*u&0tY> z;D~@i#oELw-Xqje5nzhX}-P;T0k}j5QD&_ Q;K?A$)78&qol`;+0H~4mThFN7{4Auqa&2=USj3A~U9x~eV`Bv$RBAS6#l)W|bZA#%%Yrp~oFbxZ&M^A=~a z>z(M_{LXvc_q=u0X*kuqUX%$yyq`%ugx>z8?iebnMpda)Lrgqqj%Fk-HWIJ znNI^?d%0 zHNn^241S0*BktExg9zq31EMMlGw)qqH(2bS|Az7VDD%TYjB$NUVL)AKZvZ1nN^|Ea zYfGWaJPHWUT`m`lbvPX0jkl}`J=T}tqMiq?dYJ&UFco+_zX@jb-f>E!61}~*K+zv4 zwt1{DO-EFo-wEY^tLA2&;<2$MP}G0hDr-Sm346koTq8K8v04re4uYbC68k2TNpTA$ zihc%4gaY;T^{~w2@qil}8{qi(IM~tA0s4GC@Z+a1;FCuW!Sfe7LDBI90s)MNhlfGY z8;alY`~7%s9tA`f91I3w+3f5rD85-#?{??r7!`6AGoRIB0oM~e3+-pmfHgIYlD@t^ z(4wzvYHGrGU|;|&z5*~~|FSpOaVo7=X1H{kr!|vd^VZPFmS-UpD*S(Pf4;@(#6IyD z6Gpj(8L>*HBFRnWi*WRZIXa@>GSV1)9nPXH0000EWmrjOO-%qQ00008000000002e RQmLUq_odKC|#hTewK|$TF zGSm(4_F*<+77caEyv^2lmBF0B-w1j2>FO_W(yS8lLDUbooMzT|{Gw4nkj1}vv~!rw zns&kKCel$d`g^}+hC93to!rTntpZzne>nf_;BMe2W5bt?EZGW2O*c2g8m~X*7>)HK z3Y_7*12IJ5e0uM|h`sszgHL&x%|eX_aT}vUJ>)7@9>2`A+*sE)_aGb&6N|-o{^1w) zU6rqUCkzKYq_?W%4(nK@CQs7sjEtvfc3nY|q=)+AJ+hrG(V1*87-V7LyYc?YuA&pm zY-_!|$herAn!@YVC#*v(l@4=}mX?-SUtecsWrfMfNfbq4Zf=h2H*Qm|TZlv=w70i2 zJw46p>MH4Unm{062uY%Y#l=N7Ha3i)P|oLatgWedJ#J*Xor6-Dq1aV?J|7bk6WDcM ze}6y8WD@DxP=uY_z9!4E-gbprtwB$3H=EgP%aRR*LRzt~kIiny