From 19f994b0ef021628378e3384501658f32bca84c0 Mon Sep 17 00:00:00 2001 From: alone13141 <108046873+alone13141@users.noreply.github.com> Date: Wed, 15 Apr 2026 20:56:45 -0400 Subject: [PATCH 01/21] added logic / walkers / still imcomplete MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added walkers, uhhh pipe logic and 6 more slots to everything 🤤 TODO Make/add upgrades move methods some to BaseNode class make retrieval stop (go onto a different chest and reset) if different item --- .editorconfig | 22 + .gitattributes | 44 + .github/workflows/build-and-test.yml | 13 + .github/workflows/release-tags.yml | 14 + .gitignore | 38 + CODEOWNERS | 3 + LICENSE | 165 +++ README.md | 42 + build.gradle.kts | 4 + dependencies.gradle | 60 + gradle.properties | 194 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43705 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 251 ++++ gradlew.bat | 94 ++ jitpack.yml | 2 + models/underworld_portal.json | 149 ++ repositories.gradle | 5 + settings.gradle.kts | 21 + .../utilitiesinexcess/ClientProxy.java | 104 ++ .../utilitiesinexcess/CommonProxy.java | 48 + .../utilitiesinexcess/ModBiomes.java | 50 + .../utilitiesinexcess/ModBlocks.java | 255 ++++ .../utilitiesinexcess/ModDimensions.java | 57 + .../utilitiesinexcess/ModItems.java | 124 ++ .../utilitiesinexcess/UtilitiesInExcess.java | 238 +++ .../utilitiesinexcess/api/QEDRecipe.java | 83 ++ .../utilitiesinexcess/api/QEDRegistry.java | 114 ++ .../utilitiesinexcess/client/IMCForNEI.java | 195 +++ .../common/blocks/BlockBedrockium.java | 42 + .../common/blocks/BlockBlackoutCurtains.java | 84 ++ .../common/blocks/BlockColored.java | 108 ++ .../common/blocks/BlockCompressed.java | 94 ++ .../common/blocks/BlockConveyor.java | 86 ++ .../common/blocks/BlockCursedEarth.java | 222 +++ .../common/blocks/BlockDecorative.java | 83 ++ .../common/blocks/BlockDecorativeGlass.java | 98 ++ .../common/blocks/BlockDrum.java | 260 ++++ .../common/blocks/BlockEnderLotus.java | 126 ++ .../common/blocks/BlockEtherealGlass.java | 125 ++ .../common/blocks/BlockFloating.java | 68 + .../common/blocks/BlockInverted.java | 15 + .../common/blocks/BlockLapisAetherius.java | 100 ++ .../common/blocks/BlockMagicWood.java | 23 + .../blocks/BlockMarginallyMaximisedChest.java | 168 +++ .../common/blocks/BlockPacifistsBench.java | 27 + .../common/blocks/BlockPortalEndOfTime.java | 281 ++++ .../common/blocks/BlockPortalUnderWorld.java | 264 ++++ .../common/blocks/BlockPureLove.java | 49 + .../blocks/BlockRadicallyReducedChest.java | 21 + .../common/blocks/BlockRainMuffler.java | 84 ++ .../common/blocks/BlockRedstoneClock.java | 58 + .../blocks/BlockSignificantlyShrunkChest.java | 61 + .../common/blocks/BlockSmartPump.java | 22 + .../common/blocks/BlockSoundMuffler.java | 66 + .../common/blocks/BlockSpike.java | 214 +++ .../common/blocks/BlockTradingPost.java | 64 + .../common/blocks/BlockTrashCanEnergy.java | 38 + .../common/blocks/BlockTrashCanFluid.java | 68 + .../common/blocks/BlockTrashCanItem.java | 50 + .../common/blocks/BlockUpdateDetector.java | 63 + .../blocks/generators/BlockBaseGenerator.java | 40 + .../generators/BlockEnderGenerator.java | 18 + .../blocks/generators/BlockFoodGenerator.java | 18 + .../generators/BlockFurnaceGenerator.java | 18 + .../BlockHighTemperatureFurnaceGenerator.java | 18 + .../blocks/generators/BlockLavaGenerator.java | 18 + .../BlockLowTemperatureFurnaceGenerator.java | 18 + .../generators/BlockNetherStarGenerator.java | 18 + .../blocks/generators/BlockPinkGenerator.java | 18 + .../generators/BlockPotionGenerator.java | 18 + .../generators/BlockRedstoneGenerator.java | 18 + .../generators/BlockSolarGenerator.java | 18 + .../blocks/generators/BlockTNTGenerator.java | 18 + .../blocks/transfer/BlockRetrievalNode.java | 27 + .../transfer/BlockRetrievalNodeFluid.java | 25 + .../blocks/transfer/BlockTransferNode.java | 19 + .../transfer/BlockTransferNodeBase.java | 141 ++ .../transfer/BlockTransferNodeEnergy.java | 25 + .../transfer/BlockTransferNodeFluid.java | 24 + .../BlockTransferNodeHyperEnergy.java | 25 + .../blocks/transfer/BlockTransferPipe.java | 85 ++ .../common/dimensions/UIETeleporter.java | 40 + .../dimensions/UIEWorldChunkManager.java | 65 + .../endoftime/BiomeGenEndOfTime.java | 23 + .../endoftime/ChunkProviderEndOfTime.java | 94 ++ .../endoftime/DimensionPortalData.java | 58 + .../dimensions/endoftime/EndOfTimeEvents.java | 26 + .../endoftime/EndOfTimeSourceProperty.java | 56 + .../endoftime/WorldProviderEndOfTime.java | 102 ++ .../underworld/BiomeDecoratorUnderWorld.java | 60 + .../underworld/BiomeGenUnderWorld.java | 21 + .../underworld/ChunkProviderUnderWorld.java | 486 ++++++ .../underworld/UnderWorldEvents.java | 269 ++++ .../underworld/UnderWorldSourceProperty.java | 56 + .../underworld/WorldGenBoulders.java | 64 + .../underworld/WorldProviderUnderWorld.java | 100 ++ .../common/entities/EntitySiegeProperty.java | 60 + .../common/events/WateringCanEvent.java | 31 + .../common/items/ItemAnalyzer.java | 53 + .../common/items/ItemArchitectsWand.java | 144 ++ .../common/items/ItemBedrockiumIngot.java | 19 + .../common/items/ItemDisabled.java | 29 + .../common/items/ItemEnderLotusSeed.java | 65 + .../common/items/ItemFireBattery.java | 83 ++ .../common/items/ItemGlove.java | 118 ++ .../common/items/ItemGoldenBag.java | 156 ++ .../common/items/ItemHeavenlyRing.java | 184 +++ .../items/ItemInversionSigilActive.java | 588 ++++++++ .../items/ItemInversionSigilInactive.java | 226 +++ .../common/items/ItemInvertedIngot.java | 135 ++ .../common/items/ItemMobJar.java | 120 ++ .../items/ItemPseudoInversionSigil.java | 25 + .../common/items/ItemUpgrade.java | 56 + .../common/items/ItemWateringCan.java | 390 +++++ .../common/items/ItemXRayGlasses.java | 106 ++ .../tools/ItemAntiParticulateShovel.java | 67 + .../items/tools/ItemDestructionPickaxe.java | 85 ++ .../common/items/tools/ItemEthericSword.java | 81 + .../common/items/tools/ItemGluttonsAxe.java | 125 ++ .../items/tools/ItemPrecisionShears.java | 119 ++ .../common/items/tools/ItemReversingHoe.java | 82 + .../common/recipe/DisableableItemStack.java | 111 ++ .../common/recipe/RecipeGlove.java | 35 + .../common/recipe/RecipeInvertedIngot.java | 38 + .../common/recipe/RecipeLoader.java | 1313 +++++++++++++++++ .../renderers/BlackoutCurtainsRenderer.java | 249 ++++ .../common/renderers/FireBatteryRenderer.java | 59 + .../common/renderers/GloveRenderer.java | 171 +++ .../renderers/HeavenlyRingRenderer.java | 102 ++ .../renderers/InvertedIngotRenderer.java | 78 + .../renderers/LapisAetheriusRenderer.java | 75 + .../common/renderers/SpikeRenderer.java | 111 ++ .../common/renderers/WireframeRenderer.java | 85 ++ .../common/renderers/XRayRenderer.java | 129 ++ .../transfer/TransferNodeRenderer.java | 145 ++ .../transfer/TransferPipeRenderer.java | 106 ++ .../TileEntityBlockUpdateDetector.java | 37 + .../tileentities/TileEntityConveyor.java | 72 + .../common/tileentities/TileEntityDrum.java | 86 ++ .../TileEntityMarginallyMaximisedChest.java | 138 ++ .../TileEntityPacifistsBench.java | 129 ++ .../TileEntityPortalUnderWorld.java | 54 + .../tileentities/TileEntityPureLove.java | 47 + .../TileEntityRadicallyReducedChest.java | 80 + .../tileentities/TileEntityRainMuffler.java | 73 + .../tileentities/TileEntityRedstoneClock.java | 70 + .../TileEntitySignificantlyShrunkChest.java | 63 + .../tileentities/TileEntitySmartPump.java | 300 ++++ .../tileentities/TileEntitySoundMuffler.java | 169 +++ .../common/tileentities/TileEntitySpike.java | 94 ++ .../tileentities/TileEntityTradingPost.java | 270 ++++ .../TileEntityTrashCanEnergy.java | 29 + .../tileentities/TileEntityTrashCanFluid.java | 267 ++++ .../tileentities/TileEntityTrashCanItem.java | 144 ++ .../generators/TileEntityBaseGenerator.java | 255 ++++ .../TileEntityBaseGeneratorWithItemFuel.java | 148 ++ .../generators/TileEntityEnderGenerator.java | 49 + .../generators/TileEntityFoodGenerator.java | 42 + .../TileEntityFurnaceGenerator.java | 35 + ...EntityHighTemperatureFurnaceGenerator.java | 35 + .../generators/TileEntityLavaGenerator.java | 118 ++ ...eEntityLowTemperatureFurnaceGenerator.java | 35 + .../TileEntityNetherStarGenerator.java | 40 + .../generators/TileEntityPinkGenerator.java | 42 + .../generators/TileEntityPotionGenerator.java | 76 + .../TileEntityRedstoneGenerator.java | 158 ++ .../generators/TileEntitySolarGenerator.java | 86 ++ .../generators/TileEntityTNTGenerator.java | 59 + .../transfer/ITransferNetworkComponent.java | 11 + .../transfer/TileEntityRetrievalNode.java | 163 ++ .../transfer/TileEntityTransferNode.java | 296 ++++ .../transfer/TileEntityTransferNodeBase.java | 77 + .../transfer/TileEntityTransferNodeFluid.java | 91 ++ .../transfer/TileEntityTransferPipe.java | 93 ++ .../common/worldgen/WorldGenEnderLotus.java | 40 + .../common/worldgen/util/Box.java | 231 +++ .../common/worldgen/util/ChunkBlockView.java | 53 + .../common/worldgen/util/IBlockView.java | 32 + .../worldgen/util/IMutableBlockView.java | 40 + .../worldgen/util/MutableSubBlockView.java | 48 + .../common/worldgen/util/SubBlockView.java | 65 + .../wrappers/MerchantRecipeListWrapper.java | 99 ++ .../utilitiesinexcess/compat/Mods.java | 44 + .../crafttweaker/QEDCraftTweakerSupport.java | 107 ++ .../compat/findit/FindItHelper.java | 35 + .../compat/mui/tradingpost/SearchBar.java | 85 ++ .../compat/mui/tradingpost/TradeWidget.java | 185 +++ .../mui/tradingpost/VillagerColumn.java | 28 + .../tradingpost/VillagerEntityDisplay.java | 93 ++ .../mui/tradingpost/VillagerSyncHandler.java | 309 ++++ .../mui/tradingpost/VillagerWidget.java | 147 ++ .../compat/nei/NEIConfig.java | 38 + .../compat/nei/QEDRecipeHandler.java | 80 + .../tinkers/BedrockiumActiveToolMod.java | 28 + .../compat/tinkers/TinkersCompat.java | 20 + .../compat/tinkers/TinkersEvents.java | 46 + .../compat/tinkers/TinkersMaterials.java | 204 +++ .../utilitiesinexcess/config/OtherConfig.java | 35 + .../config/blocks/BlockConfig.java | 183 +++ .../config/blocks/CursedEarthConfig.java | 32 + .../config/blocks/EnderLotusConfig.java | 33 + .../config/blocks/GeneratorConfig.java | 226 +++ .../config/dimensions/DimensionConfig.java | 17 + .../config/dimensions/EndOfTimeConfig.java | 42 + .../config/dimensions/UnderWorldConfig.java | 47 + .../config/items/FireBatteryConfig.java | 34 + .../config/items/InversionConfig.java | 57 + .../config/items/ItemConfig.java | 55 + .../config/items/WateringCanConfig.java | 78 + .../AntiParticulateShovelConfig.java | 20 + .../DestructionPickaxeConfig.java | 27 + .../unstabletools/EthericSwordConfig.java | 22 + .../unstabletools/GluttonsAxeConfig.java | 35 + .../unstabletools/PrecisionShearsConfig.java | 25 + .../unstabletools/ReversingHoeConfig.java | 16 + .../items/unstabletools/UnstableTools.java | 24 + .../utilitiesinexcess/mixins/Mixins.java | 69 + .../utilitiesinexcess/mixins/TargetedMod.java | 24 + .../mixins/UIEMixinLoader.java | 64 + .../MixinBlockEnchantmentTable_MagicWood.java | 27 + .../minecraft/MixinItemRenderer_Glove.java | 35 + ...obSpawnerBaseLogic_CursedEarthSpawner.java | 91 ++ .../minecraft/MixinModelBiped_Baubles.java | 87 ++ .../minecraft/MixinModelRenderer_Baubles.java | 44 + .../MixinNetHandlerPlayServer_Glove.java | 122 ++ .../MixinPlayerControllerMP_Glove.java | 30 + .../minecraft/accessors/AccessorBlock.java | 13 + .../accessors/AccessorBlock_Client.java | 13 + .../accessors/AccessorClientMinecraft.java | 14 + .../accessors/AccessorEntityLivingBase.java | 21 + .../accessors/AccessorEntityZombie.java | 13 + .../accessors/AccessorItemRenderer.java | 16 + .../accessors/AccessorItemSword.java | 16 + .../minecraft/accessors/AccessorItemTool.java | 16 + .../accessors/AccessorMerchantRecipe.java | 19 + .../accessors/AccessorPotionEffect.java | 13 + .../network/PacketHandler.java | 32 + .../client/PacketAggressiveMobSpawn.java | 83 ++ .../network/client/PacketRainMuffledSync.java | 50 + .../client/PacketUnderworldAttack.java | 80 + .../network/client/ParticlePacket.java | 60 + .../render/BlockColoredTexture.java | 78 + .../render/ISBRHUnderworldPortal.java | 54 + .../render/ScaledCubeFaceIcon.java | 82 + .../render/TESRUnderworldPortal.java | 105 ++ .../transfer/filter/ITransferFilter.java | 4 + .../transfer/upgrade/TransferUpgrade.java | 82 + .../transfer/upgrade/UpgradeInventory.java | 178 +++ .../transfer/walk/BreadthWalker.java | 61 + .../transfer/walk/DepthWalker.java | 65 + .../transfer/walk/ITransferWalker.java | 105 ++ .../transfer/walk/StandardWalker.java | 62 + .../utils/ArchitectsWandUtils.java | 150 ++ .../utilitiesinexcess/utils/ColorUtils.java | 26 + .../utils/FMLEventHandler.java | 39 + .../utils/ForgeEventHandler.java | 174 +++ .../utilitiesinexcess/utils/IntRange.java | 15 + .../utils/ModelPartRenderHelper.java | 60 + .../utils/PinkFuelHelper.java | 95 ++ .../utils/PumpChunkLoadingCallback.java | 27 + .../utilitiesinexcess/utils/RenderUtils.java | 16 + .../utils/RenderableCube.java | 115 ++ .../utils/SoundVolumeChecks.java | 35 + .../utilitiesinexcess/utils/UIEUtils.java | 83 ++ .../utils/VoidingInventory.java | 75 + .../mui/FilteredFluidSlotSyncHandler.java | 27 + .../utils/mui/TooltipItemDisplayWidget.java | 99 ++ .../utils/noise/NoiseSampler.java | 9 + .../utils/noise/OctavesSampler.java | 55 + .../utils/noise/ScaledNoise.java | 45 + .../utils/noise/SimplexNoiseSampler.java | 186 +++ .../META-INF/utilitiesinexcess_at.cfg | 6 + .../minecraft/mcpatcher/ctm/glass_0/0.png | Bin 0 -> 110 bytes .../minecraft/mcpatcher/ctm/glass_0/1.png | Bin 0 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_0/10.png | Bin 0 -> 87 bytes .../minecraft/mcpatcher/ctm/glass_0/11.png | Bin 0 -> 85 bytes .../minecraft/mcpatcher/ctm/glass_0/12.png | Bin 0 -> 104 bytes .../minecraft/mcpatcher/ctm/glass_0/13.png | Bin 0 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_0/14.png | Bin 0 -> 85 bytes .../minecraft/mcpatcher/ctm/glass_0/15.png | Bin 0 -> 98 bytes .../minecraft/mcpatcher/ctm/glass_0/16.png | Bin 0 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_0/17.png | Bin 0 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_0/18.png | Bin 0 -> 96 bytes .../minecraft/mcpatcher/ctm/glass_0/19.png | Bin 0 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_0/2.png | Bin 0 -> 96 bytes .../minecraft/mcpatcher/ctm/glass_0/20.png | Bin 0 -> 90 bytes .../minecraft/mcpatcher/ctm/glass_0/21.png | Bin 0 -> 89 bytes .../minecraft/mcpatcher/ctm/glass_0/22.png | Bin 0 -> 85 bytes .../minecraft/mcpatcher/ctm/glass_0/23.png | Bin 0 -> 83 bytes .../minecraft/mcpatcher/ctm/glass_0/24.png | Bin 0 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_0/25.png | Bin 0 -> 91 bytes .../minecraft/mcpatcher/ctm/glass_0/26.png | Bin 0 -> 75 bytes .../minecraft/mcpatcher/ctm/glass_0/27.png | Bin 0 -> 96 bytes .../minecraft/mcpatcher/ctm/glass_0/28.png | Bin 0 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_0/29.png | Bin 0 -> 89 bytes .../minecraft/mcpatcher/ctm/glass_0/3.png | Bin 0 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_0/30.png | Bin 0 -> 95 bytes .../minecraft/mcpatcher/ctm/glass_0/31.png | Bin 0 -> 94 bytes .../minecraft/mcpatcher/ctm/glass_0/32.png | Bin 0 -> 80 bytes .../minecraft/mcpatcher/ctm/glass_0/33.png | Bin 0 -> 81 bytes .../minecraft/mcpatcher/ctm/glass_0/34.png | Bin 0 -> 83 bytes .../minecraft/mcpatcher/ctm/glass_0/35.png | Bin 0 -> 85 bytes .../minecraft/mcpatcher/ctm/glass_0/36.png | Bin 0 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_0/37.png | Bin 0 -> 97 bytes .../minecraft/mcpatcher/ctm/glass_0/38.png | Bin 0 -> 85 bytes .../minecraft/mcpatcher/ctm/glass_0/39.png | Bin 0 -> 106 bytes .../minecraft/mcpatcher/ctm/glass_0/4.png | Bin 0 -> 106 bytes .../minecraft/mcpatcher/ctm/glass_0/40.png | Bin 0 -> 90 bytes .../minecraft/mcpatcher/ctm/glass_0/41.png | Bin 0 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_0/42.png | Bin 0 -> 94 bytes .../minecraft/mcpatcher/ctm/glass_0/43.png | Bin 0 -> 104 bytes .../minecraft/mcpatcher/ctm/glass_0/44.png | Bin 0 -> 83 bytes .../minecraft/mcpatcher/ctm/glass_0/45.png | Bin 0 -> 80 bytes .../minecraft/mcpatcher/ctm/glass_0/46.png | Bin 0 -> 92 bytes .../minecraft/mcpatcher/ctm/glass_0/5.png | Bin 0 -> 106 bytes .../minecraft/mcpatcher/ctm/glass_0/6.png | Bin 0 -> 107 bytes .../minecraft/mcpatcher/ctm/glass_0/7.png | Bin 0 -> 94 bytes .../minecraft/mcpatcher/ctm/glass_0/8.png | Bin 0 -> 88 bytes .../minecraft/mcpatcher/ctm/glass_0/9.png | Bin 0 -> 87 bytes .../mcpatcher/ctm/glass_0/glass_0.properties | 6 + .../minecraft/mcpatcher/ctm/glass_1/0.png | Bin 0 -> 162 bytes .../minecraft/mcpatcher/ctm/glass_1/1.png | Bin 0 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_1/10.png | Bin 0 -> 137 bytes .../minecraft/mcpatcher/ctm/glass_1/11.png | Bin 0 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_1/12.png | Bin 0 -> 157 bytes .../minecraft/mcpatcher/ctm/glass_1/13.png | Bin 0 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_1/14.png | Bin 0 -> 117 bytes .../minecraft/mcpatcher/ctm/glass_1/15.png | Bin 0 -> 142 bytes .../minecraft/mcpatcher/ctm/glass_1/16.png | Bin 0 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_1/17.png | Bin 0 -> 169 bytes .../minecraft/mcpatcher/ctm/glass_1/18.png | Bin 0 -> 146 bytes .../minecraft/mcpatcher/ctm/glass_1/19.png | Bin 0 -> 170 bytes .../minecraft/mcpatcher/ctm/glass_1/2.png | Bin 0 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_1/20.png | Bin 0 -> 157 bytes .../minecraft/mcpatcher/ctm/glass_1/21.png | Bin 0 -> 142 bytes .../minecraft/mcpatcher/ctm/glass_1/22.png | Bin 0 -> 120 bytes .../minecraft/mcpatcher/ctm/glass_1/23.png | Bin 0 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_1/24.png | Bin 0 -> 161 bytes .../minecraft/mcpatcher/ctm/glass_1/25.png | Bin 0 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_1/26.png | Bin 0 -> 75 bytes .../minecraft/mcpatcher/ctm/glass_1/27.png | Bin 0 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_1/28.png | Bin 0 -> 152 bytes .../minecraft/mcpatcher/ctm/glass_1/29.png | Bin 0 -> 137 bytes .../minecraft/mcpatcher/ctm/glass_1/3.png | Bin 0 -> 152 bytes .../minecraft/mcpatcher/ctm/glass_1/30.png | Bin 0 -> 143 bytes .../minecraft/mcpatcher/ctm/glass_1/31.png | Bin 0 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_1/32.png | Bin 0 -> 95 bytes .../minecraft/mcpatcher/ctm/glass_1/33.png | Bin 0 -> 120 bytes .../minecraft/mcpatcher/ctm/glass_1/34.png | Bin 0 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_1/35.png | Bin 0 -> 143 bytes .../minecraft/mcpatcher/ctm/glass_1/36.png | Bin 0 -> 164 bytes .../minecraft/mcpatcher/ctm/glass_1/37.png | Bin 0 -> 139 bytes .../minecraft/mcpatcher/ctm/glass_1/38.png | Bin 0 -> 118 bytes .../minecraft/mcpatcher/ctm/glass_1/39.png | Bin 0 -> 157 bytes .../minecraft/mcpatcher/ctm/glass_1/4.png | Bin 0 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_1/40.png | Bin 0 -> 131 bytes .../minecraft/mcpatcher/ctm/glass_1/41.png | Bin 0 -> 161 bytes .../minecraft/mcpatcher/ctm/glass_1/42.png | Bin 0 -> 142 bytes .../minecraft/mcpatcher/ctm/glass_1/43.png | Bin 0 -> 152 bytes .../minecraft/mcpatcher/ctm/glass_1/44.png | Bin 0 -> 115 bytes .../minecraft/mcpatcher/ctm/glass_1/45.png | Bin 0 -> 95 bytes .../minecraft/mcpatcher/ctm/glass_1/46.png | Bin 0 -> 157 bytes .../minecraft/mcpatcher/ctm/glass_1/5.png | Bin 0 -> 162 bytes .../minecraft/mcpatcher/ctm/glass_1/6.png | Bin 0 -> 163 bytes .../minecraft/mcpatcher/ctm/glass_1/7.png | Bin 0 -> 153 bytes .../minecraft/mcpatcher/ctm/glass_1/8.png | Bin 0 -> 139 bytes .../minecraft/mcpatcher/ctm/glass_1/9.png | Bin 0 -> 148 bytes .../mcpatcher/ctm/glass_1/glass_1.properties | 6 + .../minecraft/mcpatcher/ctm/glass_10/0.png | Bin 0 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_10/1.png | Bin 0 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_10/10.png | Bin 0 -> 130 bytes .../minecraft/mcpatcher/ctm/glass_10/11.png | Bin 0 -> 122 bytes .../minecraft/mcpatcher/ctm/glass_10/12.png | Bin 0 -> 146 bytes .../minecraft/mcpatcher/ctm/glass_10/13.png | Bin 0 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_10/14.png | Bin 0 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_10/15.png | Bin 0 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_10/16.png | Bin 0 -> 149 bytes .../minecraft/mcpatcher/ctm/glass_10/17.png | Bin 0 -> 158 bytes .../minecraft/mcpatcher/ctm/glass_10/18.png | Bin 0 -> 142 bytes .../minecraft/mcpatcher/ctm/glass_10/19.png | Bin 0 -> 150 bytes .../minecraft/mcpatcher/ctm/glass_10/2.png | Bin 0 -> 141 bytes .../minecraft/mcpatcher/ctm/glass_10/20.png | Bin 0 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_10/21.png | Bin 0 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_10/22.png | Bin 0 -> 124 bytes .../minecraft/mcpatcher/ctm/glass_10/23.png | Bin 0 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_10/24.png | Bin 0 -> 146 bytes .../minecraft/mcpatcher/ctm/glass_10/25.png | Bin 0 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_10/26.png | Bin 0 -> 111 bytes .../minecraft/mcpatcher/ctm/glass_10/27.png | Bin 0 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_10/28.png | Bin 0 -> 138 bytes .../minecraft/mcpatcher/ctm/glass_10/29.png | Bin 0 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_10/3.png | Bin 0 -> 150 bytes .../minecraft/mcpatcher/ctm/glass_10/30.png | Bin 0 -> 131 bytes .../minecraft/mcpatcher/ctm/glass_10/31.png | Bin 0 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_10/32.png | Bin 0 -> 116 bytes .../minecraft/mcpatcher/ctm/glass_10/33.png | Bin 0 -> 118 bytes .../minecraft/mcpatcher/ctm/glass_10/34.png | Bin 0 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_10/35.png | Bin 0 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_10/36.png | Bin 0 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_10/37.png | Bin 0 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_10/38.png | Bin 0 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_10/39.png | Bin 0 -> 152 bytes .../minecraft/mcpatcher/ctm/glass_10/4.png | Bin 0 -> 142 bytes .../minecraft/mcpatcher/ctm/glass_10/40.png | Bin 0 -> 141 bytes .../minecraft/mcpatcher/ctm/glass_10/41.png | Bin 0 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_10/42.png | Bin 0 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_10/43.png | Bin 0 -> 141 bytes .../minecraft/mcpatcher/ctm/glass_10/44.png | Bin 0 -> 125 bytes .../minecraft/mcpatcher/ctm/glass_10/45.png | Bin 0 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_10/46.png | Bin 0 -> 135 bytes .../minecraft/mcpatcher/ctm/glass_10/5.png | Bin 0 -> 142 bytes .../minecraft/mcpatcher/ctm/glass_10/6.png | Bin 0 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_10/7.png | Bin 0 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_10/8.png | Bin 0 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_10/9.png | Bin 0 -> 131 bytes .../ctm/glass_10/glass_10.properties | 6 + .../minecraft/mcpatcher/ctm/glass_11/0.png | Bin 0 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_11/1.png | Bin 0 -> 117 bytes .../minecraft/mcpatcher/ctm/glass_11/10.png | Bin 0 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_11/11.png | Bin 0 -> 107 bytes .../minecraft/mcpatcher/ctm/glass_11/12.png | Bin 0 -> 117 bytes .../minecraft/mcpatcher/ctm/glass_11/13.png | Bin 0 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_11/14.png | Bin 0 -> 105 bytes .../minecraft/mcpatcher/ctm/glass_11/15.png | Bin 0 -> 109 bytes .../minecraft/mcpatcher/ctm/glass_11/16.png | Bin 0 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_11/17.png | Bin 0 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_11/18.png | Bin 0 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_11/19.png | Bin 0 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_11/2.png | Bin 0 -> 120 bytes .../minecraft/mcpatcher/ctm/glass_11/20.png | Bin 0 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_11/21.png | Bin 0 -> 122 bytes .../minecraft/mcpatcher/ctm/glass_11/22.png | Bin 0 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_11/23.png | Bin 0 -> 111 bytes .../minecraft/mcpatcher/ctm/glass_11/24.png | Bin 0 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_11/25.png | Bin 0 -> 100 bytes .../minecraft/mcpatcher/ctm/glass_11/26.png | Bin 0 -> 86 bytes .../minecraft/mcpatcher/ctm/glass_11/27.png | Bin 0 -> 104 bytes .../minecraft/mcpatcher/ctm/glass_11/28.png | Bin 0 -> 120 bytes .../minecraft/mcpatcher/ctm/glass_11/29.png | Bin 0 -> 115 bytes .../minecraft/mcpatcher/ctm/glass_11/3.png | Bin 0 -> 125 bytes .../minecraft/mcpatcher/ctm/glass_11/30.png | Bin 0 -> 107 bytes .../minecraft/mcpatcher/ctm/glass_11/31.png | Bin 0 -> 115 bytes .../minecraft/mcpatcher/ctm/glass_11/32.png | Bin 0 -> 95 bytes .../minecraft/mcpatcher/ctm/glass_11/33.png | Bin 0 -> 96 bytes .../minecraft/mcpatcher/ctm/glass_11/34.png | Bin 0 -> 110 bytes .../minecraft/mcpatcher/ctm/glass_11/35.png | Bin 0 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_11/36.png | Bin 0 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_11/37.png | Bin 0 -> 110 bytes .../minecraft/mcpatcher/ctm/glass_11/38.png | Bin 0 -> 101 bytes .../minecraft/mcpatcher/ctm/glass_11/39.png | Bin 0 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_11/4.png | Bin 0 -> 118 bytes .../minecraft/mcpatcher/ctm/glass_11/40.png | Bin 0 -> 116 bytes .../minecraft/mcpatcher/ctm/glass_11/41.png | Bin 0 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_11/42.png | Bin 0 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_11/43.png | Bin 0 -> 115 bytes .../minecraft/mcpatcher/ctm/glass_11/44.png | Bin 0 -> 105 bytes .../minecraft/mcpatcher/ctm/glass_11/45.png | Bin 0 -> 101 bytes .../minecraft/mcpatcher/ctm/glass_11/46.png | Bin 0 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_11/5.png | Bin 0 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_11/6.png | Bin 0 -> 126 bytes .../minecraft/mcpatcher/ctm/glass_11/7.png | Bin 0 -> 126 bytes .../minecraft/mcpatcher/ctm/glass_11/8.png | Bin 0 -> 122 bytes .../minecraft/mcpatcher/ctm/glass_11/9.png | Bin 0 -> 121 bytes .../mcpatcher/ctm/glass_11/glass_0.properties | 6 + .../minecraft/mcpatcher/ctm/glass_3/0.png | Bin 0 -> 220 bytes .../minecraft/mcpatcher/ctm/glass_3/1.png | Bin 0 -> 202 bytes .../minecraft/mcpatcher/ctm/glass_3/10.png | Bin 0 -> 188 bytes .../minecraft/mcpatcher/ctm/glass_3/11.png | Bin 0 -> 188 bytes .../minecraft/mcpatcher/ctm/glass_3/12.png | Bin 0 -> 216 bytes .../minecraft/mcpatcher/ctm/glass_3/13.png | Bin 0 -> 198 bytes .../minecraft/mcpatcher/ctm/glass_3/14.png | Bin 0 -> 186 bytes .../minecraft/mcpatcher/ctm/glass_3/15.png | Bin 0 -> 214 bytes .../minecraft/mcpatcher/ctm/glass_3/16.png | Bin 0 -> 202 bytes .../minecraft/mcpatcher/ctm/glass_3/17.png | Bin 0 -> 225 bytes .../minecraft/mcpatcher/ctm/glass_3/18.png | Bin 0 -> 194 bytes .../minecraft/mcpatcher/ctm/glass_3/19.png | Bin 0 -> 223 bytes .../minecraft/mcpatcher/ctm/glass_3/2.png | Bin 0 -> 196 bytes .../minecraft/mcpatcher/ctm/glass_3/20.png | Bin 0 -> 191 bytes .../minecraft/mcpatcher/ctm/glass_3/21.png | Bin 0 -> 188 bytes .../minecraft/mcpatcher/ctm/glass_3/22.png | Bin 0 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_3/23.png | Bin 0 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_3/24.png | Bin 0 -> 226 bytes .../minecraft/mcpatcher/ctm/glass_3/25.png | Bin 0 -> 188 bytes .../minecraft/mcpatcher/ctm/glass_3/26.png | Bin 0 -> 179 bytes .../minecraft/mcpatcher/ctm/glass_3/27.png | Bin 0 -> 223 bytes .../minecraft/mcpatcher/ctm/glass_3/28.png | Bin 0 -> 198 bytes .../minecraft/mcpatcher/ctm/glass_3/29.png | Bin 0 -> 190 bytes .../minecraft/mcpatcher/ctm/glass_3/3.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_3/30.png | Bin 0 -> 193 bytes .../minecraft/mcpatcher/ctm/glass_3/31.png | Bin 0 -> 190 bytes .../minecraft/mcpatcher/ctm/glass_3/32.png | Bin 0 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_3/33.png | Bin 0 -> 183 bytes .../minecraft/mcpatcher/ctm/glass_3/34.png | Bin 0 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_3/35.png | Bin 0 -> 186 bytes .../minecraft/mcpatcher/ctm/glass_3/36.png | Bin 0 -> 229 bytes .../minecraft/mcpatcher/ctm/glass_3/37.png | Bin 0 -> 194 bytes .../minecraft/mcpatcher/ctm/glass_3/38.png | Bin 0 -> 189 bytes .../minecraft/mcpatcher/ctm/glass_3/39.png | Bin 0 -> 228 bytes .../minecraft/mcpatcher/ctm/glass_3/4.png | Bin 0 -> 201 bytes .../minecraft/mcpatcher/ctm/glass_3/40.png | Bin 0 -> 190 bytes .../minecraft/mcpatcher/ctm/glass_3/41.png | Bin 0 -> 225 bytes .../minecraft/mcpatcher/ctm/glass_3/42.png | Bin 0 -> 194 bytes .../minecraft/mcpatcher/ctm/glass_3/43.png | Bin 0 -> 221 bytes .../minecraft/mcpatcher/ctm/glass_3/44.png | Bin 0 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_3/45.png | Bin 0 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_3/46.png | Bin 0 -> 191 bytes .../minecraft/mcpatcher/ctm/glass_3/5.png | Bin 0 -> 216 bytes .../minecraft/mcpatcher/ctm/glass_3/6.png | Bin 0 -> 201 bytes .../minecraft/mcpatcher/ctm/glass_3/7.png | Bin 0 -> 195 bytes .../minecraft/mcpatcher/ctm/glass_3/8.png | Bin 0 -> 189 bytes .../minecraft/mcpatcher/ctm/glass_3/9.png | Bin 0 -> 186 bytes .../mcpatcher/ctm/glass_3/glass_3.properties | 6 + .../minecraft/mcpatcher/ctm/glass_4/0.png | Bin 0 -> 109 bytes .../minecraft/mcpatcher/ctm/glass_4/1.png | Bin 0 -> 106 bytes .../minecraft/mcpatcher/ctm/glass_4/10.png | Bin 0 -> 87 bytes .../minecraft/mcpatcher/ctm/glass_4/11.png | Bin 0 -> 85 bytes .../minecraft/mcpatcher/ctm/glass_4/12.png | Bin 0 -> 103 bytes .../minecraft/mcpatcher/ctm/glass_4/13.png | Bin 0 -> 101 bytes .../minecraft/mcpatcher/ctm/glass_4/14.png | Bin 0 -> 85 bytes .../minecraft/mcpatcher/ctm/glass_4/15.png | Bin 0 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_4/16.png | Bin 0 -> 115 bytes .../minecraft/mcpatcher/ctm/glass_4/17.png | Bin 0 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_4/18.png | Bin 0 -> 97 bytes .../minecraft/mcpatcher/ctm/glass_4/19.png | Bin 0 -> 106 bytes .../minecraft/mcpatcher/ctm/glass_4/2.png | Bin 0 -> 96 bytes .../minecraft/mcpatcher/ctm/glass_4/20.png | Bin 0 -> 89 bytes .../minecraft/mcpatcher/ctm/glass_4/21.png | Bin 0 -> 90 bytes .../minecraft/mcpatcher/ctm/glass_4/22.png | Bin 0 -> 86 bytes .../minecraft/mcpatcher/ctm/glass_4/23.png | Bin 0 -> 84 bytes .../minecraft/mcpatcher/ctm/glass_4/24.png | Bin 0 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_4/25.png | Bin 0 -> 93 bytes .../minecraft/mcpatcher/ctm/glass_4/26.png | Bin 0 -> 75 bytes .../minecraft/mcpatcher/ctm/glass_4/27.png | Bin 0 -> 97 bytes .../minecraft/mcpatcher/ctm/glass_4/28.png | Bin 0 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_4/29.png | Bin 0 -> 89 bytes .../minecraft/mcpatcher/ctm/glass_4/3.png | Bin 0 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_4/30.png | Bin 0 -> 97 bytes .../minecraft/mcpatcher/ctm/glass_4/31.png | Bin 0 -> 94 bytes .../minecraft/mcpatcher/ctm/glass_4/32.png | Bin 0 -> 80 bytes .../minecraft/mcpatcher/ctm/glass_4/33.png | Bin 0 -> 81 bytes .../minecraft/mcpatcher/ctm/glass_4/34.png | Bin 0 -> 83 bytes .../minecraft/mcpatcher/ctm/glass_4/35.png | Bin 0 -> 85 bytes .../minecraft/mcpatcher/ctm/glass_4/36.png | Bin 0 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_4/37.png | Bin 0 -> 97 bytes .../minecraft/mcpatcher/ctm/glass_4/38.png | Bin 0 -> 85 bytes .../minecraft/mcpatcher/ctm/glass_4/39.png | Bin 0 -> 107 bytes .../minecraft/mcpatcher/ctm/glass_4/4.png | Bin 0 -> 105 bytes .../minecraft/mcpatcher/ctm/glass_4/40.png | Bin 0 -> 89 bytes .../minecraft/mcpatcher/ctm/glass_4/41.png | Bin 0 -> 99 bytes .../minecraft/mcpatcher/ctm/glass_4/42.png | Bin 0 -> 93 bytes .../minecraft/mcpatcher/ctm/glass_4/43.png | Bin 0 -> 104 bytes .../minecraft/mcpatcher/ctm/glass_4/44.png | Bin 0 -> 82 bytes .../minecraft/mcpatcher/ctm/glass_4/45.png | Bin 0 -> 80 bytes .../minecraft/mcpatcher/ctm/glass_4/46.png | Bin 0 -> 93 bytes .../minecraft/mcpatcher/ctm/glass_4/5.png | Bin 0 -> 110 bytes .../minecraft/mcpatcher/ctm/glass_4/6.png | Bin 0 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_4/7.png | Bin 0 -> 95 bytes .../minecraft/mcpatcher/ctm/glass_4/8.png | Bin 0 -> 89 bytes .../minecraft/mcpatcher/ctm/glass_4/9.png | Bin 0 -> 88 bytes .../mcpatcher/ctm/glass_4/glass_4.properties | 6 + .../minecraft/mcpatcher/ctm/glass_5/0.png | Bin 0 -> 218 bytes .../minecraft/mcpatcher/ctm/glass_5/1.png | Bin 0 -> 216 bytes .../minecraft/mcpatcher/ctm/glass_5/10.png | Bin 0 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_5/11.png | Bin 0 -> 152 bytes .../minecraft/mcpatcher/ctm/glass_5/12.png | Bin 0 -> 221 bytes .../minecraft/mcpatcher/ctm/glass_5/13.png | Bin 0 -> 188 bytes .../minecraft/mcpatcher/ctm/glass_5/14.png | Bin 0 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_5/15.png | Bin 0 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_5/16.png | Bin 0 -> 226 bytes .../minecraft/mcpatcher/ctm/glass_5/17.png | Bin 0 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_5/18.png | Bin 0 -> 199 bytes .../minecraft/mcpatcher/ctm/glass_5/19.png | Bin 0 -> 202 bytes .../minecraft/mcpatcher/ctm/glass_5/2.png | Bin 0 -> 197 bytes .../minecraft/mcpatcher/ctm/glass_5/20.png | Bin 0 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_5/21.png | Bin 0 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_5/22.png | Bin 0 -> 141 bytes .../minecraft/mcpatcher/ctm/glass_5/23.png | Bin 0 -> 158 bytes .../minecraft/mcpatcher/ctm/glass_5/24.png | Bin 0 -> 220 bytes .../minecraft/mcpatcher/ctm/glass_5/25.png | Bin 0 -> 164 bytes .../minecraft/mcpatcher/ctm/glass_5/26.png | Bin 0 -> 75 bytes .../minecraft/mcpatcher/ctm/glass_5/27.png | Bin 0 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_5/28.png | Bin 0 -> 186 bytes .../minecraft/mcpatcher/ctm/glass_5/29.png | Bin 0 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_5/3.png | Bin 0 -> 210 bytes .../minecraft/mcpatcher/ctm/glass_5/30.png | Bin 0 -> 199 bytes .../minecraft/mcpatcher/ctm/glass_5/31.png | Bin 0 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_5/32.png | Bin 0 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_5/33.png | Bin 0 -> 124 bytes .../minecraft/mcpatcher/ctm/glass_5/34.png | Bin 0 -> 154 bytes .../minecraft/mcpatcher/ctm/glass_5/35.png | Bin 0 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_5/36.png | Bin 0 -> 226 bytes .../minecraft/mcpatcher/ctm/glass_5/37.png | Bin 0 -> 205 bytes .../minecraft/mcpatcher/ctm/glass_5/38.png | Bin 0 -> 154 bytes .../minecraft/mcpatcher/ctm/glass_5/39.png | Bin 0 -> 188 bytes .../minecraft/mcpatcher/ctm/glass_5/4.png | Bin 0 -> 216 bytes .../minecraft/mcpatcher/ctm/glass_5/40.png | Bin 0 -> 190 bytes .../minecraft/mcpatcher/ctm/glass_5/41.png | Bin 0 -> 186 bytes .../minecraft/mcpatcher/ctm/glass_5/42.png | Bin 0 -> 173 bytes .../minecraft/mcpatcher/ctm/glass_5/43.png | Bin 0 -> 189 bytes .../minecraft/mcpatcher/ctm/glass_5/44.png | Bin 0 -> 117 bytes .../minecraft/mcpatcher/ctm/glass_5/45.png | Bin 0 -> 115 bytes .../minecraft/mcpatcher/ctm/glass_5/46.png | Bin 0 -> 190 bytes .../minecraft/mcpatcher/ctm/glass_5/5.png | Bin 0 -> 210 bytes .../minecraft/mcpatcher/ctm/glass_5/6.png | Bin 0 -> 217 bytes .../minecraft/mcpatcher/ctm/glass_5/7.png | Bin 0 -> 199 bytes .../minecraft/mcpatcher/ctm/glass_5/8.png | Bin 0 -> 185 bytes .../minecraft/mcpatcher/ctm/glass_5/9.png | Bin 0 -> 161 bytes .../mcpatcher/ctm/glass_5/glass_5.properties | 6 + .../minecraft/mcpatcher/ctm/glass_7/0.png | Bin 0 -> 218 bytes .../minecraft/mcpatcher/ctm/glass_7/1.png | Bin 0 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_7/10.png | Bin 0 -> 158 bytes .../minecraft/mcpatcher/ctm/glass_7/11.png | Bin 0 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_7/12.png | Bin 0 -> 221 bytes .../minecraft/mcpatcher/ctm/glass_7/13.png | Bin 0 -> 191 bytes .../minecraft/mcpatcher/ctm/glass_7/14.png | Bin 0 -> 146 bytes .../minecraft/mcpatcher/ctm/glass_7/15.png | Bin 0 -> 185 bytes .../minecraft/mcpatcher/ctm/glass_7/16.png | Bin 0 -> 218 bytes .../minecraft/mcpatcher/ctm/glass_7/17.png | Bin 0 -> 225 bytes .../minecraft/mcpatcher/ctm/glass_7/18.png | Bin 0 -> 215 bytes .../minecraft/mcpatcher/ctm/glass_7/19.png | Bin 0 -> 228 bytes .../minecraft/mcpatcher/ctm/glass_7/2.png | Bin 0 -> 207 bytes .../minecraft/mcpatcher/ctm/glass_7/20.png | Bin 0 -> 188 bytes .../minecraft/mcpatcher/ctm/glass_7/21.png | Bin 0 -> 192 bytes .../minecraft/mcpatcher/ctm/glass_7/22.png | Bin 0 -> 156 bytes .../minecraft/mcpatcher/ctm/glass_7/23.png | Bin 0 -> 161 bytes .../minecraft/mcpatcher/ctm/glass_7/24.png | Bin 0 -> 224 bytes .../minecraft/mcpatcher/ctm/glass_7/25.png | Bin 0 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_7/26.png | Bin 0 -> 75 bytes .../minecraft/mcpatcher/ctm/glass_7/27.png | Bin 0 -> 160 bytes .../minecraft/mcpatcher/ctm/glass_7/28.png | Bin 0 -> 192 bytes .../minecraft/mcpatcher/ctm/glass_7/29.png | Bin 0 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_7/3.png | Bin 0 -> 217 bytes .../minecraft/mcpatcher/ctm/glass_7/30.png | Bin 0 -> 193 bytes .../minecraft/mcpatcher/ctm/glass_7/31.png | Bin 0 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_7/32.png | Bin 0 -> 118 bytes .../minecraft/mcpatcher/ctm/glass_7/33.png | Bin 0 -> 124 bytes .../minecraft/mcpatcher/ctm/glass_7/34.png | Bin 0 -> 161 bytes .../minecraft/mcpatcher/ctm/glass_7/35.png | Bin 0 -> 156 bytes .../minecraft/mcpatcher/ctm/glass_7/36.png | Bin 0 -> 221 bytes .../minecraft/mcpatcher/ctm/glass_7/37.png | Bin 0 -> 197 bytes .../minecraft/mcpatcher/ctm/glass_7/38.png | Bin 0 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_7/39.png | Bin 0 -> 189 bytes .../minecraft/mcpatcher/ctm/glass_7/4.png | Bin 0 -> 216 bytes .../minecraft/mcpatcher/ctm/glass_7/40.png | Bin 0 -> 187 bytes .../minecraft/mcpatcher/ctm/glass_7/41.png | Bin 0 -> 193 bytes .../minecraft/mcpatcher/ctm/glass_7/42.png | Bin 0 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_7/43.png | Bin 0 -> 196 bytes .../minecraft/mcpatcher/ctm/glass_7/44.png | Bin 0 -> 121 bytes .../minecraft/mcpatcher/ctm/glass_7/45.png | Bin 0 -> 122 bytes .../minecraft/mcpatcher/ctm/glass_7/46.png | Bin 0 -> 218 bytes .../minecraft/mcpatcher/ctm/glass_7/5.png | Bin 0 -> 221 bytes .../minecraft/mcpatcher/ctm/glass_7/6.png | Bin 0 -> 222 bytes .../minecraft/mcpatcher/ctm/glass_7/7.png | Bin 0 -> 210 bytes .../minecraft/mcpatcher/ctm/glass_7/8.png | Bin 0 -> 183 bytes .../minecraft/mcpatcher/ctm/glass_7/9.png | Bin 0 -> 186 bytes .../mcpatcher/ctm/glass_7/glass_7.properties | 6 + .../minecraft/mcpatcher/ctm/glass_8/0.png | Bin 0 -> 197 bytes .../minecraft/mcpatcher/ctm/glass_8/1.png | Bin 0 -> 176 bytes .../minecraft/mcpatcher/ctm/glass_8/10.png | Bin 0 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_8/11.png | Bin 0 -> 150 bytes .../minecraft/mcpatcher/ctm/glass_8/12.png | Bin 0 -> 194 bytes .../minecraft/mcpatcher/ctm/glass_8/13.png | Bin 0 -> 172 bytes .../minecraft/mcpatcher/ctm/glass_8/14.png | Bin 0 -> 150 bytes .../minecraft/mcpatcher/ctm/glass_8/15.png | Bin 0 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_8/16.png | Bin 0 -> 175 bytes .../minecraft/mcpatcher/ctm/glass_8/17.png | Bin 0 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_8/18.png | Bin 0 -> 162 bytes .../minecraft/mcpatcher/ctm/glass_8/19.png | Bin 0 -> 179 bytes .../minecraft/mcpatcher/ctm/glass_8/2.png | Bin 0 -> 161 bytes .../minecraft/mcpatcher/ctm/glass_8/20.png | Bin 0 -> 163 bytes .../minecraft/mcpatcher/ctm/glass_8/21.png | Bin 0 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_8/22.png | Bin 0 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_8/23.png | Bin 0 -> 150 bytes .../minecraft/mcpatcher/ctm/glass_8/24.png | Bin 0 -> 198 bytes .../minecraft/mcpatcher/ctm/glass_8/25.png | Bin 0 -> 169 bytes .../minecraft/mcpatcher/ctm/glass_8/26.png | Bin 0 -> 141 bytes .../minecraft/mcpatcher/ctm/glass_8/27.png | Bin 0 -> 170 bytes .../minecraft/mcpatcher/ctm/glass_8/28.png | Bin 0 -> 173 bytes .../minecraft/mcpatcher/ctm/glass_8/29.png | Bin 0 -> 154 bytes .../minecraft/mcpatcher/ctm/glass_8/3.png | Bin 0 -> 179 bytes .../minecraft/mcpatcher/ctm/glass_8/30.png | Bin 0 -> 171 bytes .../minecraft/mcpatcher/ctm/glass_8/31.png | Bin 0 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_8/32.png | Bin 0 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_8/33.png | Bin 0 -> 146 bytes .../minecraft/mcpatcher/ctm/glass_8/34.png | Bin 0 -> 149 bytes .../minecraft/mcpatcher/ctm/glass_8/35.png | Bin 0 -> 158 bytes .../minecraft/mcpatcher/ctm/glass_8/36.png | Bin 0 -> 198 bytes .../minecraft/mcpatcher/ctm/glass_8/37.png | Bin 0 -> 172 bytes .../minecraft/mcpatcher/ctm/glass_8/38.png | Bin 0 -> 152 bytes .../minecraft/mcpatcher/ctm/glass_8/39.png | Bin 0 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_8/4.png | Bin 0 -> 174 bytes .../minecraft/mcpatcher/ctm/glass_8/40.png | Bin 0 -> 156 bytes .../minecraft/mcpatcher/ctm/glass_8/41.png | Bin 0 -> 176 bytes .../minecraft/mcpatcher/ctm/glass_8/42.png | Bin 0 -> 166 bytes .../minecraft/mcpatcher/ctm/glass_8/43.png | Bin 0 -> 177 bytes .../minecraft/mcpatcher/ctm/glass_8/44.png | Bin 0 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_8/45.png | Bin 0 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_8/46.png | Bin 0 -> 158 bytes .../minecraft/mcpatcher/ctm/glass_8/5.png | Bin 0 -> 174 bytes .../minecraft/mcpatcher/ctm/glass_8/6.png | Bin 0 -> 174 bytes .../minecraft/mcpatcher/ctm/glass_8/7.png | Bin 0 -> 158 bytes .../minecraft/mcpatcher/ctm/glass_8/8.png | Bin 0 -> 154 bytes .../minecraft/mcpatcher/ctm/glass_8/9.png | Bin 0 -> 154 bytes .../mcpatcher/ctm/glass_8/glass_8.properties | 6 + .../resources/assets/tinker/lang/en_US.lang | 5 + .../textures/blocks/liquid_bedrockium.png | Bin 0 -> 9137 bytes .../blocks/liquid_bedrockium.png.mcmeta | 45 + .../blocks/liquid_bedrockium_flow.png | Bin 0 -> 13201 bytes .../blocks/liquid_bedrockium_flow.png.mcmeta | 5 + .../textures/blocks/liquid_inverted.png | Bin 0 -> 6915 bytes .../blocks/liquid_inverted.png.mcmeta | 45 + .../textures/blocks/liquid_inverted_flow.png | Bin 0 -> 7156 bytes .../blocks/liquid_inverted_flow.png.mcmeta | 5 + .../arrow/bedrockium_uie_arrow_fletching.png | Bin 0 -> 185 bytes .../items/arrow/bedrockium_uie_arrow_head.png | Bin 0 -> 168 bytes .../arrow/bedrockium_uie_arrow_shaft.png | Bin 0 -> 257 bytes .../items/arrow/inverted_arrow_fletching.png | Bin 0 -> 321 bytes .../items/arrow/inverted_arrow_head.png | Bin 0 -> 284 bytes .../items/arrow/inverted_arrow_shaft.png | Bin 0 -> 374 bytes .../items/arrow/magical_wood_arrow_head.png | Bin 0 -> 166 bytes .../items/arrow/magical_wood_arrow_shaft.png | Bin 0 -> 187 bytes .../items/axe/bedrockium_uie_axe_handle.png | Bin 0 -> 180 bytes .../items/axe/bedrockium_uie_axe_head.png | Bin 0 -> 233 bytes .../axe/bedrockium_uie_axe_head_broken.png | Bin 0 -> 212 bytes .../items/axe/inverted_axe_handle.png | Bin 0 -> 353 bytes .../textures/items/axe/inverted_axe_head.png | Bin 0 -> 252 bytes .../items/axe/inverted_axe_head_broken.png | Bin 0 -> 224 bytes .../items/axe/magical_wood_axe_handle.png | Bin 0 -> 537 bytes .../items/axe/magical_wood_axe_head.png | Bin 0 -> 189 bytes .../axe/magical_wood_axe_head_broken.png | Bin 0 -> 188 bytes .../bedrockium_uie_battleaxe_back.png | Bin 0 -> 146 bytes .../bedrockium_uie_battleaxe_backhead.png | Bin 0 -> 215 bytes .../bedrockium_uie_battleaxe_binding.png | Bin 0 -> 146 bytes .../bedrockium_uie_battleaxe_front.png | Bin 0 -> 207 bytes .../bedrockium_uie_battleaxe_fronthead.png | Bin 0 -> 207 bytes ...rockium_uie_battleaxe_fronthead_broken.png | Bin 0 -> 219 bytes .../bedrockium_uie_battleaxe_handle.png | Bin 0 -> 232 bytes .../bedrockium_uie_battleaxe_head.png | Bin 0 -> 215 bytes .../bedrockium_uie_battleaxe_head_broken.png | Bin 0 -> 219 bytes .../battleaxe/inverted_battleaxe_back.png | Bin 0 -> 252 bytes .../battleaxe/inverted_battleaxe_backhead.png | Bin 0 -> 326 bytes .../battleaxe/inverted_battleaxe_binding.png | Bin 0 -> 250 bytes .../battleaxe/inverted_battleaxe_front.png | Bin 0 -> 315 bytes .../inverted_battleaxe_fronthead.png | Bin 0 -> 306 bytes .../inverted_battleaxe_fronthead_broken.png | Bin 0 -> 332 bytes .../battleaxe/inverted_battleaxe_handle.png | Bin 0 -> 346 bytes .../battleaxe/inverted_battleaxe_head.png | Bin 0 -> 332 bytes .../inverted_battleaxe_head_broken.png | Bin 0 -> 325 bytes .../battleaxe/magical_wood_battleaxe_back.png | Bin 0 -> 512 bytes .../magical_wood_battleaxe_backhead.png | Bin 0 -> 580 bytes .../magical_wood_battleaxe_binding.png | Bin 0 -> 512 bytes .../magical_wood_battleaxe_front.png | Bin 0 -> 585 bytes .../magical_wood_battleaxe_fronthead.png | Bin 0 -> 585 bytes ...agical_wood_battleaxe_fronthead_broken.png | Bin 0 -> 571 bytes .../magical_wood_battleaxe_handle.png | Bin 0 -> 563 bytes .../battleaxe/magical_wood_battleaxe_head.png | Bin 0 -> 580 bytes .../magical_wood_battleaxe_head_broken.png | Bin 0 -> 571 bytes .../bedrockium_uie_battlesign_handle.png | Bin 0 -> 161 bytes .../bedrockium_uie_battlesign_head.png | Bin 0 -> 417 bytes .../bedrockium_uie_battlesign_head_broken.png | Bin 0 -> 399 bytes .../battlesign/inverted_battlesign_handle.png | Bin 0 -> 261 bytes .../battlesign/inverted_battlesign_head.png | Bin 0 -> 449 bytes .../inverted_battlesign_head_broken.png | Bin 0 -> 444 bytes .../magical_wood_battlesign_handle.png | Bin 0 -> 136 bytes .../magical_wood_battlesign_head.png | Bin 0 -> 278 bytes .../magical_wood_battlesign_head_broken.png | Bin 0 -> 281 bytes .../bolt/bedrockium_uie_bolt_fletching.png | Bin 0 -> 166 bytes .../items/bolt/bedrockium_uie_bolt_head.png | Bin 0 -> 142 bytes .../items/bolt/bedrockium_uie_bolt_shaft.png | Bin 0 -> 206 bytes .../items/bolt/inverted_bolt_fletching.png | Bin 0 -> 298 bytes .../items/bolt/inverted_bolt_head.png | Bin 0 -> 246 bytes .../items/bolt/inverted_bolt_shaft.png | Bin 0 -> 317 bytes .../items/bolt/magical_wood_bolt_head.png | Bin 0 -> 510 bytes .../items/bolt/magical_wood_bolt_shaft.png | Bin 0 -> 554 bytes .../bedrockium_uie_sword_accessory.png | Bin 0 -> 234 bytes .../broadsword/bedrockium_uie_sword_blade.png | Bin 0 -> 263 bytes .../bedrockium_uie_sword_blade_broken.png | Bin 0 -> 264 bytes .../bedrockium_uie_sword_handle.png | Bin 0 -> 193 bytes .../broadsword/inverted_sword_accessory.png | Bin 0 -> 391 bytes .../items/broadsword/inverted_sword_blade.png | Bin 0 -> 416 bytes .../inverted_sword_blade_broken.png | Bin 0 -> 396 bytes .../broadsword/inverted_sword_handle.png | Bin 0 -> 295 bytes .../magical_wood_sword_accessory.png | Bin 0 -> 584 bytes .../broadsword/magical_wood_sword_blade.png | Bin 0 -> 560 bytes .../magical_wood_sword_blade_broken.png | Bin 0 -> 592 bytes .../broadsword/magical_wood_sword_handle.png | Bin 0 -> 549 bytes .../chisel/bedrockium_uie_chisel_handle.png | Bin 0 -> 158 bytes .../chisel/bedrockium_uie_chisel_head.png | Bin 0 -> 222 bytes .../bedrockium_uie_chisel_head_broken.png | Bin 0 -> 172 bytes .../items/chisel/inverted_chisel_handle.png | Bin 0 -> 264 bytes .../items/chisel/inverted_chisel_head.png | Bin 0 -> 369 bytes .../chisel/inverted_chisel_head_broken.png | Bin 0 -> 295 bytes .../chisel/magical_wood_chisel_handle.png | Bin 0 -> 513 bytes .../items/chisel/magical_wood_chisel_head.png | Bin 0 -> 567 bytes .../magical_wood_chisel_head_broken.png | Bin 0 -> 513 bytes .../cleaver/bedrockium_uie_cleaver_guard.png | Bin 0 -> 139 bytes .../cleaver/bedrockium_uie_cleaver_handle.png | Bin 0 -> 180 bytes .../cleaver/bedrockium_uie_cleaver_head.png | Bin 0 -> 318 bytes .../bedrockium_uie_cleaver_head_broken.png | Bin 0 -> 290 bytes .../cleaver/bedrockium_uie_cleaver_shield.png | Bin 0 -> 261 bytes .../items/cleaver/inverted_cleaver_guard.png | Bin 0 -> 266 bytes .../items/cleaver/inverted_cleaver_handle.png | Bin 0 -> 269 bytes .../items/cleaver/inverted_cleaver_head.png | Bin 0 -> 464 bytes .../cleaver/inverted_cleaver_head_broken.png | Bin 0 -> 503 bytes .../items/cleaver/inverted_cleaver_shield.png | Bin 0 -> 357 bytes .../cleaver/magical_wood_cleaver_guard.png | Bin 0 -> 515 bytes .../cleaver/magical_wood_cleaver_handle.png | Bin 0 -> 540 bytes .../cleaver/magical_wood_cleaver_head.png | Bin 0 -> 571 bytes .../magical_wood_cleaver_head_broken.png | Bin 0 -> 598 bytes .../cleaver/magical_wood_cleaver_shield.png | Bin 0 -> 562 bytes .../bedrockium_uie_crossbow_binding.png | Bin 0 -> 148 bytes .../crossbow/bedrockium_uie_crossbow_body.png | Bin 0 -> 271 bytes .../crossbow/bedrockium_uie_crossbow_bow.png | Bin 0 -> 304 bytes .../bedrockium_uie_crossbow_bow_1.png | Bin 0 -> 304 bytes .../bedrockium_uie_crossbow_bow_2.png | Bin 0 -> 313 bytes .../bedrockium_uie_crossbow_bow_3.png | Bin 0 -> 305 bytes .../crossbow/inverted_crossbow_binding.png | Bin 0 -> 327 bytes .../items/crossbow/inverted_crossbow_body.png | Bin 0 -> 407 bytes .../items/crossbow/inverted_crossbow_bow.png | Bin 0 -> 462 bytes .../crossbow/inverted_crossbow_bow_1.png | Bin 0 -> 448 bytes .../crossbow/inverted_crossbow_bow_2.png | Bin 0 -> 461 bytes .../crossbow/inverted_crossbow_bow_3.png | Bin 0 -> 516 bytes .../magical_wood_crossbow_binding.png | Bin 0 -> 509 bytes .../crossbow/magical_wood_crossbow_body.png | Bin 0 -> 622 bytes .../crossbow/magical_wood_crossbow_bow.png | Bin 0 -> 599 bytes .../crossbow/magical_wood_crossbow_bow_1.png | Bin 0 -> 599 bytes .../crossbow/magical_wood_crossbow_bow_2.png | Bin 0 -> 605 bytes .../crossbow/magical_wood_crossbow_bow_3.png | Bin 0 -> 613 bytes .../cutlass/bedrockium_uie_cutlass_blade.png | Bin 0 -> 326 bytes .../bedrockium_uie_cutlass_blade_broken.png | Bin 0 -> 303 bytes .../cutlass/bedrockium_uie_cutlass_guard.png | Bin 0 -> 118 bytes .../cutlass/bedrockium_uie_cutlass_handle.png | Bin 0 -> 146 bytes .../items/cutlass/inverted_cutlass_blade.png | Bin 0 -> 463 bytes .../cutlass/inverted_cutlass_blade_broken.png | Bin 0 -> 470 bytes .../items/cutlass/inverted_cutlass_guard.png | Bin 0 -> 233 bytes .../items/cutlass/inverted_cutlass_handle.png | Bin 0 -> 255 bytes .../cutlass/magical_wood_cutlass_blade.png | Bin 0 -> 599 bytes .../magical_wood_cutlass_blade_broken.png | Bin 0 -> 591 bytes .../cutlass/magical_wood_cutlass_guard.png | Bin 0 -> 499 bytes .../cutlass/magical_wood_cutlass_handle.png | Bin 0 -> 515 bytes .../bedrockium_uie_dagger_accessory.png | Bin 0 -> 174 bytes .../dagger/bedrockium_uie_dagger_blade.png | Bin 0 -> 245 bytes .../bedrockium_uie_dagger_blade_broken.png | Bin 0 -> 214 bytes .../dagger/bedrockium_uie_dagger_handle.png | Bin 0 -> 169 bytes .../dagger/inverted_dagger_accessory.png | Bin 0 -> 302 bytes .../items/dagger/inverted_dagger_blade.png | Bin 0 -> 370 bytes .../dagger/inverted_dagger_blade_broken.png | Bin 0 -> 364 bytes .../items/dagger/inverted_dagger_handle.png | Bin 0 -> 259 bytes .../dagger/magical_wood_dagger_accessory.png | Bin 0 -> 527 bytes .../dagger/magical_wood_dagger_blade.png | Bin 0 -> 554 bytes .../magical_wood_dagger_blade_broken.png | Bin 0 -> 556 bytes .../dagger/magical_wood_dagger_handle.png | Bin 0 -> 529 bytes .../bedrockium_uie_excavator_binding.png | Bin 0 -> 168 bytes .../bedrockium_uie_excavator_grip.png | Bin 0 -> 148 bytes .../bedrockium_uie_excavator_handle.png | Bin 0 -> 222 bytes .../bedrockium_uie_excavator_head.png | Bin 0 -> 267 bytes .../bedrockium_uie_excavator_head_broken.png | Bin 0 -> 256 bytes .../excavator/inverted_excavator_binding.png | Bin 0 -> 285 bytes .../excavator/inverted_excavator_grip.png | Bin 0 -> 243 bytes .../excavator/inverted_excavator_handle.png | Bin 0 -> 351 bytes .../excavator/inverted_excavator_head.png | Bin 0 -> 415 bytes .../inverted_excavator_head_broken.png | Bin 0 -> 397 bytes .../magical_wood_excavator_binding.png | Bin 0 -> 548 bytes .../excavator/magical_wood_excavator_grip.png | Bin 0 -> 529 bytes .../magical_wood_excavator_handle.png | Bin 0 -> 576 bytes .../excavator/magical_wood_excavator_head.png | Bin 0 -> 599 bytes .../magical_wood_excavator_head_broken.png | Bin 0 -> 603 bytes .../frypan/bedrockium_uie_frypan_handle.png | Bin 0 -> 279 bytes .../frypan/bedrockium_uie_frypan_head.png | Bin 0 -> 454 bytes .../bedrockium_uie_frypan_head_broken.png | Bin 0 -> 462 bytes .../items/frypan/inverted_frypan_handle.png | Bin 0 -> 200 bytes .../items/frypan/inverted_frypan_head.png | Bin 0 -> 519 bytes .../frypan/inverted_frypan_head_broken.png | Bin 0 -> 561 bytes .../frypan/magical_wood_frypan_handle.png | Bin 0 -> 571 bytes .../items/frypan/magical_wood_frypan_head.png | Bin 0 -> 659 bytes .../magical_wood_frypan_head_broken.png | Bin 0 -> 710 bytes .../hammer/bedrockium_uie_hammer_back.png | Bin 0 -> 180 bytes .../hammer/bedrockium_uie_hammer_front.png | Bin 0 -> 177 bytes .../hammer/bedrockium_uie_hammer_handle.png | Bin 0 -> 256 bytes .../bedrockium_uie_hammer_handle_broken.png | Bin 0 -> 220 bytes .../hammer/bedrockium_uie_hammer_head.png | Bin 0 -> 329 bytes .../items/hammer/inverted_hammer_back.png | Bin 0 -> 196 bytes .../items/hammer/inverted_hammer_front.png | Bin 0 -> 209 bytes .../items/hammer/inverted_hammer_handle.png | Bin 0 -> 363 bytes .../hammer/inverted_hammer_handle_broken.png | Bin 0 -> 364 bytes .../items/hammer/inverted_hammer_head.png | Bin 0 -> 367 bytes .../items/hammer/magical_wood_hammer_back.png | Bin 0 -> 547 bytes .../hammer/magical_wood_hammer_front.png | Bin 0 -> 555 bytes .../hammer/magical_wood_hammer_handle.png | Bin 0 -> 554 bytes .../magical_wood_hammer_handle_broken.png | Bin 0 -> 568 bytes .../items/hammer/magical_wood_hammer_head.png | Bin 0 -> 626 bytes .../bedrockium_uie_javelin_accessory.png | Bin 0 -> 174 bytes .../javelin/bedrockium_uie_javelin_handle.png | Bin 0 -> 179 bytes .../javelin/bedrockium_uie_javelin_head.png | Bin 0 -> 189 bytes .../bedrockium_uie_javelin_head_broken.png | Bin 0 -> 136 bytes .../javelin/inverted_javelin_accessory.png | Bin 0 -> 293 bytes .../items/javelin/inverted_javelin_handle.png | Bin 0 -> 318 bytes .../items/javelin/inverted_javelin_head.png | Bin 0 -> 323 bytes .../javelin/inverted_javelin_head_broken.png | Bin 0 -> 243 bytes .../magical_wood_javelin_accessory.png | Bin 0 -> 542 bytes .../javelin/magical_wood_javelin_handle.png | Bin 0 -> 544 bytes .../javelin/magical_wood_javelin_head.png | Bin 0 -> 563 bytes .../magical_wood_javelin_head_broken.png | Bin 0 -> 524 bytes .../longbow/bedrockium_uie_bow_bottom.png | Bin 0 -> 184 bytes .../longbow/bedrockium_uie_bow_bottom_1.png | Bin 0 -> 230 bytes .../longbow/bedrockium_uie_bow_bottom_2.png | Bin 0 -> 216 bytes .../longbow/bedrockium_uie_bow_bottom_3.png | Bin 0 -> 224 bytes .../items/longbow/bedrockium_uie_bow_grip.png | Bin 0 -> 158 bytes .../items/longbow/bedrockium_uie_bow_top.png | Bin 0 -> 187 bytes .../longbow/bedrockium_uie_bow_top_1.png | Bin 0 -> 197 bytes .../longbow/bedrockium_uie_bow_top_2.png | Bin 0 -> 209 bytes .../longbow/bedrockium_uie_bow_top_3.png | Bin 0 -> 185 bytes .../items/longbow/inverted_bow_bottom.png | Bin 0 -> 308 bytes .../items/longbow/inverted_bow_bottom_1.png | Bin 0 -> 354 bytes .../items/longbow/inverted_bow_bottom_2.png | Bin 0 -> 343 bytes .../items/longbow/inverted_bow_bottom_3.png | Bin 0 -> 334 bytes .../items/longbow/inverted_bow_grip.png | Bin 0 -> 277 bytes .../items/longbow/inverted_bow_top.png | Bin 0 -> 307 bytes .../items/longbow/inverted_bow_top_1.png | Bin 0 -> 327 bytes .../items/longbow/inverted_bow_top_2.png | Bin 0 -> 325 bytes .../items/longbow/inverted_bow_top_3.png | Bin 0 -> 321 bytes .../items/longbow/magical_wood_bow_bottom.png | Bin 0 -> 557 bytes .../longbow/magical_wood_bow_bottom_1.png | Bin 0 -> 557 bytes .../longbow/magical_wood_bow_bottom_2.png | Bin 0 -> 534 bytes .../longbow/magical_wood_bow_bottom_3.png | Bin 0 -> 515 bytes .../items/longbow/magical_wood_bow_grip.png | Bin 0 -> 521 bytes .../items/longbow/magical_wood_bow_top.png | Bin 0 -> 541 bytes .../items/longbow/magical_wood_bow_top_1.png | Bin 0 -> 541 bytes .../items/longbow/magical_wood_bow_top_2.png | Bin 0 -> 532 bytes .../items/longbow/magical_wood_bow_top_3.png | Bin 0 -> 517 bytes .../bedrockium_uie_longsword_accessory.png | Bin 0 -> 186 bytes .../bedrockium_uie_longsword_blade.png | Bin 0 -> 256 bytes .../bedrockium_uie_longsword_blade_broken.png | Bin 0 -> 259 bytes .../bedrockium_uie_longsword_handle.png | Bin 0 -> 193 bytes .../inverted_longsword_accessory.png | Bin 0 -> 312 bytes .../longsword/inverted_longsword_blade.png | Bin 0 -> 398 bytes .../inverted_longsword_blade_broken.png | Bin 0 -> 415 bytes .../longsword/inverted_longsword_handle.png | Bin 0 -> 301 bytes .../magical_wood_longsword_accessory.png | Bin 0 -> 543 bytes .../magical_wood_longsword_blade.png | Bin 0 -> 553 bytes .../magical_wood_longsword_blade_broken.png | Bin 0 -> 581 bytes .../magical_wood_longsword_handle.png | Bin 0 -> 545 bytes .../bedrockium_uie_lumberaxe_binding.png | Bin 0 -> 152 bytes .../bedrockium_uie_lumberaxe_handle.png | Bin 0 -> 251 bytes .../bedrockium_uie_lumberaxe_head.png | Bin 0 -> 246 bytes .../bedrockium_uie_lumberaxe_head_broken.png | Bin 0 -> 247 bytes .../bedrockium_uie_lumberaxe_shield.png | Bin 0 -> 160 bytes .../lumberaxe/inverted_lumberaxe_binding.png | Bin 0 -> 245 bytes .../lumberaxe/inverted_lumberaxe_handle.png | Bin 0 -> 382 bytes .../lumberaxe/inverted_lumberaxe_head.png | Bin 0 -> 305 bytes .../inverted_lumberaxe_head_broken.png | Bin 0 -> 299 bytes .../lumberaxe/inverted_lumberaxe_shield.png | Bin 0 -> 269 bytes .../magical_wood_lumberaxe_binding.png | Bin 0 -> 513 bytes .../magical_wood_lumberaxe_handle.png | Bin 0 -> 573 bytes .../lumberaxe/magical_wood_lumberaxe_head.png | Bin 0 -> 598 bytes .../magical_wood_lumberaxe_head_broken.png | Bin 0 -> 574 bytes .../magical_wood_lumberaxe_shield.png | Bin 0 -> 521 bytes .../items/materials/bucket_fiery_metal.png | Bin 0 -> 4522 bytes .../items/materials/bucket_knightmetal.png | Bin 0 -> 4512 bytes .../mattock/bedrockium_uie_mattock_back.png | Bin 0 -> 178 bytes .../mattock/bedrockium_uie_mattock_handle.png | Bin 0 -> 272 bytes .../mattock/bedrockium_uie_mattock_head.png | Bin 0 -> 234 bytes .../bedrockium_uie_mattock_head_broken.png | Bin 0 -> 217 bytes .../items/mattock/inverted_mattock_back.png | Bin 0 -> 291 bytes .../items/mattock/inverted_mattock_handle.png | Bin 0 -> 387 bytes .../items/mattock/inverted_mattock_head.png | Bin 0 -> 372 bytes .../mattock/inverted_mattock_head_broken.png | Bin 0 -> 361 bytes .../mattock/magical_wood_mattock_back.png | Bin 0 -> 540 bytes .../mattock/magical_wood_mattock_handle.png | Bin 0 -> 571 bytes .../mattock/magical_wood_mattock_head.png | Bin 0 -> 574 bytes .../magical_wood_mattock_head_broken.png | Bin 0 -> 561 bytes .../parts/bedrockium_uie_arrow_shaft.png | Bin 0 -> 252 bytes .../items/parts/bedrockium_uie_arrowhead.png | Bin 0 -> 251 bytes .../items/parts/bedrockium_uie_axe_head.png | Bin 0 -> 232 bytes .../parts/bedrockium_uie_battlesign_head.png | Bin 0 -> 377 bytes .../items/parts/bedrockium_uie_binding.png | Bin 0 -> 252 bytes .../items/parts/bedrockium_uie_bolt.png | Bin 0 -> 206 bytes .../items/parts/bedrockium_uie_bolt_2.png | Bin 0 -> 142 bytes .../items/parts/bedrockium_uie_bow_limb.png | Bin 0 -> 219 bytes .../parts/bedrockium_uie_chisel_head.png | Bin 0 -> 225 bytes .../items/parts/bedrockium_uie_chunk.png | Bin 0 -> 415 bytes .../items/parts/bedrockium_uie_crossbar.png | Bin 0 -> 176 bytes .../parts/bedrockium_uie_crossbow_body.png | Bin 0 -> 267 bytes .../parts/bedrockium_uie_crossbow_limb.png | Bin 0 -> 297 bytes .../parts/bedrockium_uie_excavator_head.png | Bin 0 -> 262 bytes .../parts/bedrockium_uie_frypan_head.png | Bin 0 -> 482 bytes .../items/parts/bedrockium_uie_full_guard.png | Bin 0 -> 301 bytes .../parts/bedrockium_uie_hammer_head.png | Bin 0 -> 341 bytes .../parts/bedrockium_uie_knife_blade.png | Bin 0 -> 225 bytes .../parts/bedrockium_uie_large_guard.png | Bin 0 -> 221 bytes .../bedrockium_uie_large_sword_blade.png | Bin 0 -> 327 bytes .../items/parts/bedrockium_uie_largeplate.png | Bin 0 -> 544 bytes .../parts/bedrockium_uie_lumberaxe_head.png | Bin 0 -> 268 bytes .../parts/bedrockium_uie_medium_guard.png | Bin 0 -> 185 bytes .../parts/bedrockium_uie_pickaxe_head.png | Bin 0 -> 258 bytes .../items/parts/bedrockium_uie_rod.png | Bin 0 -> 270 bytes .../parts/bedrockium_uie_scythe_head.png | Bin 0 -> 240 bytes .../parts/bedrockium_uie_shovel_head.png | Bin 0 -> 219 bytes .../items/parts/bedrockium_uie_shuriken.png | Bin 0 -> 202 bytes .../parts/bedrockium_uie_sword_blade.png | Bin 0 -> 274 bytes .../items/parts/bedrockium_uie_toughbind.png | Bin 0 -> 382 bytes .../items/parts/bedrockium_uie_toughrod.png | Bin 0 -> 308 bytes .../items/parts/inverted_arrow_shaft.png | Bin 0 -> 412 bytes .../items/parts/inverted_arrowhead.png | Bin 0 -> 397 bytes .../items/parts/inverted_axe_head.png | Bin 0 -> 361 bytes .../items/parts/inverted_battlesign_head.png | Bin 0 -> 546 bytes .../textures/items/parts/inverted_binding.png | Bin 0 -> 402 bytes .../textures/items/parts/inverted_bolt.png | Bin 0 -> 327 bytes .../textures/items/parts/inverted_bolt_2.png | Bin 0 -> 246 bytes .../items/parts/inverted_bow_limb.png | Bin 0 -> 340 bytes .../items/parts/inverted_chisel_head.png | Bin 0 -> 345 bytes .../textures/items/parts/inverted_chunk.png | Bin 0 -> 454 bytes .../items/parts/inverted_crossbar.png | Bin 0 -> 296 bytes .../items/parts/inverted_crossbow_body.png | Bin 0 -> 417 bytes .../items/parts/inverted_crossbow_limb.png | Bin 0 -> 434 bytes .../items/parts/inverted_excavator_head.png | Bin 0 -> 413 bytes .../items/parts/inverted_frypan_head.png | Bin 0 -> 623 bytes .../items/parts/inverted_full_guard.png | Bin 0 -> 430 bytes .../items/parts/inverted_hammer_head.png | Bin 0 -> 475 bytes .../items/parts/inverted_knife_blade.png | Bin 0 -> 341 bytes .../items/parts/inverted_large_guard.png | Bin 0 -> 334 bytes .../parts/inverted_large_sword_blade.png | Bin 0 -> 478 bytes .../items/parts/inverted_largeplate.png | Bin 0 -> 624 bytes .../items/parts/inverted_lumberaxe_head.png | Bin 0 -> 402 bytes .../items/parts/inverted_medium_guard.png | Bin 0 -> 297 bytes .../items/parts/inverted_pickaxe_head.png | Bin 0 -> 393 bytes .../textures/items/parts/inverted_rod.png | Bin 0 -> 402 bytes .../items/parts/inverted_scythe_head.png | Bin 0 -> 375 bytes .../items/parts/inverted_shovel_head.png | Bin 0 -> 349 bytes .../items/parts/inverted_shuriken.png | Bin 0 -> 345 bytes .../items/parts/inverted_sword_blade.png | Bin 0 -> 403 bytes .../items/parts/inverted_toughbind.png | Bin 0 -> 583 bytes .../items/parts/inverted_toughrod.png | Bin 0 -> 449 bytes .../items/parts/magical_wood_arrow_shaft.png | Bin 0 -> 579 bytes .../items/parts/magical_wood_arrowhead.png | Bin 0 -> 604 bytes .../items/parts/magical_wood_axe_head.png | Bin 0 -> 570 bytes .../parts/magical_wood_battlesign_head.png | Bin 0 -> 658 bytes .../items/parts/magical_wood_binding.png | Bin 0 -> 585 bytes .../items/parts/magical_wood_bolt.png | Bin 0 -> 554 bytes .../items/parts/magical_wood_bolt_2.png | Bin 0 -> 510 bytes .../items/parts/magical_wood_bow_limb.png | Bin 0 -> 548 bytes .../items/parts/magical_wood_chisel_head.png | Bin 0 -> 557 bytes .../items/parts/magical_wood_chunk.png | Bin 0 -> 619 bytes .../items/parts/magical_wood_crossbar.png | Bin 0 -> 556 bytes .../parts/magical_wood_crossbow_body.png | Bin 0 -> 619 bytes .../parts/magical_wood_crossbow_limb.png | Bin 0 -> 590 bytes .../parts/magical_wood_excavator_head.png | Bin 0 -> 583 bytes .../items/parts/magical_wood_frypan_head.png | Bin 0 -> 661 bytes .../items/parts/magical_wood_full_guard.png | Bin 0 -> 561 bytes .../items/parts/magical_wood_hammer_head.png | Bin 0 -> 633 bytes .../items/parts/magical_wood_knife_blade.png | Bin 0 -> 543 bytes .../items/parts/magical_wood_large_guard.png | Bin 0 -> 566 bytes .../parts/magical_wood_large_sword_blade.png | Bin 0 -> 578 bytes .../items/parts/magical_wood_largeplate.png | Bin 0 -> 699 bytes .../parts/magical_wood_lumberaxe_head.png | Bin 0 -> 596 bytes .../items/parts/magical_wood_medium_guard.png | Bin 0 -> 544 bytes .../items/parts/magical_wood_pickaxe_head.png | Bin 0 -> 586 bytes .../textures/items/parts/magical_wood_rod.png | Bin 0 -> 571 bytes .../items/parts/magical_wood_scythe_head.png | Bin 0 -> 576 bytes .../items/parts/magical_wood_shovel_head.png | Bin 0 -> 582 bytes .../items/parts/magical_wood_shuriken.png | Bin 0 -> 558 bytes .../items/parts/magical_wood_sword_blade.png | Bin 0 -> 564 bytes .../items/parts/magical_wood_toughbind.png | Bin 0 -> 632 bytes .../items/parts/magical_wood_toughrod.png | Bin 0 -> 586 bytes .../bedrockium_uie_pickaxe_accessory.png | Bin 0 -> 130 bytes .../pickaxe/bedrockium_uie_pickaxe_handle.png | Bin 0 -> 235 bytes .../pickaxe/bedrockium_uie_pickaxe_head.png | Bin 0 -> 270 bytes .../bedrockium_uie_pickaxe_head_broken.png | Bin 0 -> 232 bytes .../pickaxe/inverted_pickaxe_accessory.png | Bin 0 -> 233 bytes .../items/pickaxe/inverted_pickaxe_handle.png | Bin 0 -> 355 bytes .../items/pickaxe/inverted_pickaxe_head.png | Bin 0 -> 303 bytes .../pickaxe/inverted_pickaxe_head_broken.png | Bin 0 -> 275 bytes .../magical_wood_pickaxe_accessory.png | Bin 0 -> 516 bytes .../pickaxe/magical_wood_pickaxe_handle.png | Bin 0 -> 554 bytes .../pickaxe/magical_wood_pickaxe_head.png | Bin 0 -> 585 bytes .../magical_wood_pickaxe_head_broken.png | Bin 0 -> 564 bytes .../bedrockium_uie_rapier_accessory.png | Bin 0 -> 191 bytes .../rapier/bedrockium_uie_rapier_blade.png | Bin 0 -> 222 bytes .../bedrockium_uie_rapier_blade_broken.png | Bin 0 -> 170 bytes .../rapier/bedrockium_uie_rapier_handle.png | Bin 0 -> 200 bytes .../rapier/inverted_rapier_accessory.png | Bin 0 -> 291 bytes .../items/rapier/inverted_rapier_blade.png | Bin 0 -> 397 bytes .../rapier/inverted_rapier_blade_broken.png | Bin 0 -> 305 bytes .../items/rapier/inverted_rapier_handle.png | Bin 0 -> 314 bytes .../rapier/magical_wood_rapier_accessory.png | Bin 0 -> 550 bytes .../rapier/magical_wood_rapier_blade.png | Bin 0 -> 572 bytes .../magical_wood_rapier_blade_broken.png | Bin 0 -> 549 bytes .../rapier/magical_wood_rapier_handle.png | Bin 0 -> 569 bytes .../bedrockium_uie_scythe_accessory.png | Bin 0 -> 207 bytes .../scythe/bedrockium_uie_scythe_binding.png | Bin 0 -> 121 bytes .../scythe/bedrockium_uie_scythe_handle.png | Bin 0 -> 330 bytes .../scythe/bedrockium_uie_scythe_head.png | Bin 0 -> 228 bytes .../bedrockium_uie_scythe_head_broken.png | Bin 0 -> 189 bytes .../scythe/inverted_scythe_accessory.png | Bin 0 -> 357 bytes .../items/scythe/inverted_scythe_binding.png | Bin 0 -> 233 bytes .../items/scythe/inverted_scythe_handle.png | Bin 0 -> 496 bytes .../items/scythe/inverted_scythe_head.png | Bin 0 -> 269 bytes .../scythe/inverted_scythe_head_broken.png | Bin 0 -> 310 bytes .../items/scythe/invertedscythe_accessory.png | Bin 0 -> 6027 bytes .../scythe/magical_wood_scythe_accessory.png | Bin 0 -> 540 bytes .../scythe/magical_wood_scythe_binding.png | Bin 0 -> 524 bytes .../scythe/magical_wood_scythe_handle.png | Bin 0 -> 628 bytes .../items/scythe/magical_wood_scythe_head.png | Bin 0 -> 581 bytes .../magical_wood_scythe_head_broken.png | Bin 0 -> 558 bytes .../shortbow/bedrockium_uie_bow_bottom.png | Bin 0 -> 230 bytes .../shortbow/bedrockium_uie_bow_bottom_1.png | Bin 0 -> 230 bytes .../shortbow/bedrockium_uie_bow_bottom_2.png | Bin 0 -> 216 bytes .../shortbow/bedrockium_uie_bow_bottom_3.png | Bin 0 -> 224 bytes .../items/shortbow/bedrockium_uie_bow_top.png | Bin 0 -> 197 bytes .../shortbow/bedrockium_uie_bow_top_1.png | Bin 0 -> 197 bytes .../shortbow/bedrockium_uie_bow_top_2.png | Bin 0 -> 209 bytes .../shortbow/bedrockium_uie_bow_top_3.png | Bin 0 -> 185 bytes .../items/shortbow/inverted_bow_bottom.png | Bin 0 -> 344 bytes .../items/shortbow/inverted_bow_bottom_1.png | Bin 0 -> 344 bytes .../items/shortbow/inverted_bow_bottom_2.png | Bin 0 -> 323 bytes .../items/shortbow/inverted_bow_bottom_3.png | Bin 0 -> 321 bytes .../items/shortbow/inverted_bow_top.png | Bin 0 -> 337 bytes .../items/shortbow/inverted_bow_top_1.png | Bin 0 -> 325 bytes .../items/shortbow/inverted_bow_top_2.png | Bin 0 -> 327 bytes .../items/shortbow/inverted_bow_top_3.png | Bin 0 -> 313 bytes .../shortbow/magical_wood_bow_bottom.png | Bin 0 -> 552 bytes .../shortbow/magical_wood_bow_bottom_1.png | Bin 0 -> 552 bytes .../shortbow/magical_wood_bow_bottom_2.png | Bin 0 -> 555 bytes .../shortbow/magical_wood_bow_bottom_3.png | Bin 0 -> 539 bytes .../items/shortbow/magical_wood_bow_top.png | Bin 0 -> 557 bytes .../items/shortbow/magical_wood_bow_top_1.png | Bin 0 -> 556 bytes .../items/shortbow/magical_wood_bow_top_2.png | Bin 0 -> 557 bytes .../items/shortbow/magical_wood_bow_top_3.png | Bin 0 -> 545 bytes .../shovel/bedrockium_uie_shovel_handle.png | Bin 0 -> 201 bytes .../shovel/bedrockium_uie_shovel_head.png | Bin 0 -> 235 bytes .../bedrockium_uie_shovel_head_broken.png | Bin 0 -> 220 bytes .../items/shovel/inverted_shovel_handle.png | Bin 0 -> 324 bytes .../items/shovel/inverted_shovel_head.png | Bin 0 -> 249 bytes .../shovel/inverted_shovel_head_broken.png | Bin 0 -> 254 bytes .../shovel/magical_wood_shovel_handle.png | Bin 0 -> 555 bytes .../items/shovel/magical_wood_shovel_head.png | Bin 0 -> 585 bytes .../magical_wood_shovel_head_broken.png | Bin 0 -> 555 bytes .../shuriken/bedrockium_uie_shuriken.png | Bin 0 -> 219 bytes .../items/shuriken/inverted_shuriken.png | Bin 0 -> 364 bytes .../items/shuriken/magical_wood_shuriken.png | Bin 0 -> 550 bytes .../bedrockium_uie_knife_blade.png | Bin 0 -> 259 bytes .../bedrockium_uie_knife_handle.png | Bin 0 -> 173 bytes .../throwingknife/inverted_knife_blade.png | Bin 0 -> 400 bytes .../throwingknife/inverted_knife_handle.png | Bin 0 -> 281 bytes .../magical_wood_knife_blade.png | Bin 0 -> 596 bytes .../magical_wood_knife_handle.png | Bin 0 -> 534 bytes .../blockstates/trash_can_energy.json | 5 + .../blockstates/trash_can_fluid.json | 5 + .../blockstates/trash_can_item.json | 5 + .../assets/utilitiesinexcess/lang/en_US.lang | 535 +++++++ .../models/blocks/trash_can_energy.json | 6 + .../models/blocks/trash_can_fluid.json | 6 + .../models/blocks/trash_can_item.json | 101 ++ .../models/underworld_portal/frame.obj | 459 ++++++ .../models/underworld_portal/materials.mtl | 4 + .../textures/blocks/bedrockium_block.png | Bin 0 -> 429 bytes .../textures/blocks/blackout_curtains.png | Bin 0 -> 377 bytes .../textures/blocks/blessed_earth_side.png | Bin 0 -> 676 bytes .../textures/blocks/blessed_earth_top.png | Bin 0 -> 793 bytes .../textures/blocks/block_update_detector.png | Bin 0 -> 417 bytes .../blocks/compressed_cobblestone_0.png | Bin 0 -> 846 bytes .../blocks/compressed_cobblestone_1.png | Bin 0 -> 831 bytes .../blocks/compressed_cobblestone_2.png | Bin 0 -> 785 bytes .../blocks/compressed_cobblestone_3.png | Bin 0 -> 755 bytes .../blocks/compressed_cobblestone_4.png | Bin 0 -> 705 bytes .../blocks/compressed_cobblestone_5.png | Bin 0 -> 674 bytes .../blocks/compressed_cobblestone_6.png | Bin 0 -> 542 bytes .../blocks/compressed_cobblestone_7.png | Bin 0 -> 406 bytes .../textures/blocks/compressed_dirt_0.png | Bin 0 -> 621 bytes .../textures/blocks/compressed_dirt_1.png | Bin 0 -> 613 bytes .../textures/blocks/compressed_dirt_2.png | Bin 0 -> 605 bytes .../textures/blocks/compressed_dirt_3.png | Bin 0 -> 569 bytes .../textures/blocks/compressed_dirt_4.png | Bin 0 -> 601 bytes .../textures/blocks/compressed_dirt_5.png | Bin 0 -> 580 bytes .../textures/blocks/compressed_dirt_6.png | Bin 0 -> 574 bytes .../textures/blocks/compressed_dirt_7.png | Bin 0 -> 538 bytes .../textures/blocks/compressed_gravel_0.png | Bin 0 -> 741 bytes .../textures/blocks/compressed_gravel_1.png | Bin 0 -> 724 bytes .../textures/blocks/compressed_gravel_2.png | Bin 0 -> 703 bytes .../textures/blocks/compressed_gravel_3.png | Bin 0 -> 662 bytes .../textures/blocks/compressed_gravel_4.png | Bin 0 -> 641 bytes .../textures/blocks/compressed_gravel_5.png | Bin 0 -> 627 bytes .../textures/blocks/compressed_gravel_6.png | Bin 0 -> 593 bytes .../textures/blocks/compressed_gravel_7.png | Bin 0 -> 562 bytes .../textures/blocks/compressed_sand_0.png | Bin 0 -> 834 bytes .../textures/blocks/compressed_sand_1.png | Bin 0 -> 821 bytes .../textures/blocks/compressed_sand_2.png | Bin 0 -> 769 bytes .../textures/blocks/compressed_sand_3.png | Bin 0 -> 731 bytes .../textures/blocks/compressed_sand_4.png | Bin 0 -> 693 bytes .../textures/blocks/compressed_sand_5.png | Bin 0 -> 665 bytes .../textures/blocks/compressed_sand_6.png | Bin 0 -> 614 bytes .../textures/blocks/compressed_sand_7.png | Bin 0 -> 553 bytes .../textures/blocks/conveyor_belt_blank.png | Bin 0 -> 237 bytes .../textures/blocks/conveyor_belt_down.png | Bin 0 -> 265 bytes .../blocks/conveyor_belt_down.png.mcmeta | 5 + .../textures/blocks/conveyor_belt_left.png | Bin 0 -> 279 bytes .../blocks/conveyor_belt_left.png.mcmeta | 5 + .../textures/blocks/conveyor_belt_right.png | Bin 0 -> 278 bytes .../blocks/conveyor_belt_right.png.mcmeta | 5 + .../textures/blocks/conveyor_belt_up.png | Bin 0 -> 266 bytes .../blocks/conveyor_belt_up.png.mcmeta | 5 + .../blocks/crops/ender_lotus_stage_0.png | Bin 0 -> 205 bytes .../blocks/crops/ender_lotus_stage_1.png | Bin 0 -> 218 bytes .../blocks/crops/ender_lotus_stage_2.png | Bin 0 -> 257 bytes .../blocks/crops/ender_lotus_stage_3.png | Bin 0 -> 292 bytes .../blocks/crops/ender_lotus_stage_4.png | Bin 0 -> 340 bytes .../blocks/crops/ender_lotus_stage_5.png | Bin 0 -> 364 bytes .../blocks/crops/ender_lotus_stage_6.png | Bin 0 -> 385 bytes .../blocks/crops/ender_lotus_stage_7.png | Bin 0 -> 399 bytes .../textures/blocks/cursed_earth_side.png | Bin 0 -> 679 bytes .../textures/blocks/cursed_earth_top.png | Bin 0 -> 1068 bytes .../textures/blocks/decorative_block_0.png | Bin 0 -> 489 bytes .../textures/blocks/decorative_block_1.png | Bin 0 -> 761 bytes .../textures/blocks/decorative_block_10.png | Bin 0 -> 593 bytes .../textures/blocks/decorative_block_11.png | Bin 0 -> 498 bytes .../textures/blocks/decorative_block_2.png | Bin 0 -> 445 bytes .../textures/blocks/decorative_block_3.png | Bin 0 -> 973 bytes .../textures/blocks/decorative_block_4.png | Bin 0 -> 823 bytes .../textures/blocks/decorative_block_5.png | Bin 0 -> 782 bytes .../textures/blocks/decorative_block_6.png | Bin 0 -> 765 bytes .../textures/blocks/decorative_block_7.png | Bin 0 -> 829 bytes .../textures/blocks/decorative_block_8.png | Bin 0 -> 818 bytes .../textures/blocks/decorative_block_9.png | Bin 0 -> 855 bytes .../textures/blocks/drum.png | Bin 0 -> 375 bytes .../textures/blocks/ethereal_glass.png | Bin 0 -> 118 bytes .../textures/blocks/ethereal_glass_dark.png | Bin 0 -> 202 bytes .../blocks/ethereal_glass_dark_inverted.png | Bin 0 -> 180 bytes .../blocks/ethereal_glass_inverted.png | Bin 0 -> 142 bytes .../textures/blocks/floating_block.png | Bin 0 -> 257 bytes .../blocks/generators/ender_generator.png | Bin 0 -> 179 bytes .../generators/ender_generator_plus.png | Bin 0 -> 245 bytes .../generators/ender_generator_plusplus.png | Bin 0 -> 242 bytes .../blocks/generators/food_generator.png | Bin 0 -> 218 bytes .../blocks/generators/food_generator_plus.png | Bin 0 -> 283 bytes .../generators/food_generator_plusplus.png | Bin 0 -> 281 bytes .../blocks/generators/furnace_generator.png | Bin 0 -> 348 bytes .../generators/furnace_generator_plus.png | Bin 0 -> 264 bytes .../generators/furnace_generator_plusplus.png | Bin 0 -> 264 bytes .../high_temperature_furnace_generator.png | Bin 0 -> 208 bytes ...igh_temperature_furnace_generator_plus.png | Bin 0 -> 264 bytes ...temperature_furnace_generator_plusplus.png | Bin 0 -> 261 bytes .../blocks/generators/lava_generator.png | Bin 0 -> 155 bytes .../blocks/generators/lava_generator_plus.png | Bin 0 -> 269 bytes .../generators/lava_generator_plusplus.png | Bin 0 -> 269 bytes .../low_temperature_furnace_generator.png | Bin 0 -> 193 bytes ...low_temperature_furnace_generator_plus.png | Bin 0 -> 249 bytes ...temperature_furnace_generator_plusplus.png | Bin 0 -> 249 bytes .../generators/nether_star_generator.png | Bin 0 -> 242 bytes .../generators/nether_star_generator_plus.png | Bin 0 -> 307 bytes .../nether_star_generator_plusplus.png | Bin 0 -> 309 bytes .../blocks/generators/pink_generator.png | Bin 0 -> 209 bytes .../blocks/generators/pink_generator_plus.png | Bin 0 -> 288 bytes .../generators/pink_generator_plusplus.png | Bin 0 -> 287 bytes .../blocks/generators/potion_generator.png | Bin 0 -> 346 bytes .../generators/potion_generator_plus.png | Bin 0 -> 275 bytes .../generators/potion_generator_plusplus.png | Bin 0 -> 275 bytes .../blocks/generators/redstone_generator.png | Bin 0 -> 197 bytes .../generators/redstone_generator_plus.png | Bin 0 -> 273 bytes .../redstone_generator_plusplus.png | Bin 0 -> 268 bytes .../blocks/generators/solar_generator.png | Bin 0 -> 352 bytes .../generators/solar_generator_plus.png | Bin 0 -> 254 bytes .../generators/solar_generator_plusplus.png | Bin 0 -> 254 bytes .../blocks/generators/tnt_generator.png | Bin 0 -> 154 bytes .../blocks/generators/tnt_generator_plus.png | Bin 0 -> 239 bytes .../generators/tnt_generator_plusplus.png | Bin 0 -> 239 bytes .../textures/blocks/glass_0.png | Bin 0 -> 123 bytes .../textures/blocks/glass_1.png | Bin 0 -> 175 bytes .../textures/blocks/glass_10.png | Bin 0 -> 162 bytes .../textures/blocks/glass_11.png | Bin 0 -> 132 bytes .../textures/blocks/glass_2.png | Bin 0 -> 148 bytes .../textures/blocks/glass_3.png | Bin 0 -> 230 bytes .../textures/blocks/glass_4.png | Bin 0 -> 122 bytes .../textures/blocks/glass_5.png | Bin 0 -> 231 bytes .../textures/blocks/glass_6.png | Bin 0 -> 137 bytes .../textures/blocks/glass_7.png | Bin 0 -> 231 bytes .../textures/blocks/glass_8.png | Bin 0 -> 209 bytes .../textures/blocks/glass_9.png | Bin 0 -> 148 bytes .../textures/blocks/inverted_block.png | Bin 0 -> 436 bytes .../textures/blocks/lapis_aetherius_0.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_1.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_10.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_11.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_12.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_13.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_14.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_15.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_2.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_3.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_4.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_5.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_6.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_7.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_8.png | Bin 0 -> 99 bytes .../textures/blocks/lapis_aetherius_9.png | Bin 0 -> 99 bytes .../textures/blocks/magic_wood.png | Bin 0 -> 617 bytes .../textures/blocks/models/diamond_spike.png | Bin 0 -> 243 bytes .../textures/blocks/models/gold_spike.png | Bin 0 -> 242 bytes .../textures/blocks/models/iron_spike.png | Bin 0 -> 243 bytes .../blocks/models/trash_can_energy.png | Bin 0 -> 1331 bytes .../blocks/models/trash_can_fluid.png | Bin 0 -> 1286 bytes .../textures/blocks/models/trash_can_item.png | Bin 0 -> 1228 bytes .../textures/blocks/models/wood_spike.png | Bin 0 -> 759 bytes .../textures/blocks/pacifists_bench.png | Bin 0 -> 211 bytes .../textures/blocks/pure_love.png | Bin 0 -> 4889 bytes .../textures/blocks/rain_muffler.png | Bin 0 -> 4947 bytes .../textures/blocks/redstone_clock.png | Bin 0 -> 525 bytes .../blocks/retrieval_node_fluid_top.png | Bin 0 -> 175 bytes .../textures/blocks/retrieval_node_top.png | Bin 0 -> 180 bytes .../textures/blocks/scaled_chest_front.png | Bin 0 -> 982 bytes .../textures/blocks/scaled_chest_side.png | Bin 0 -> 924 bytes .../textures/blocks/scaled_chest_top.png | Bin 0 -> 975 bytes .../textures/blocks/smart_pump.png | Bin 0 -> 214 bytes .../textures/blocks/sound_muffler.png | Bin 0 -> 4774 bytes .../textures/blocks/temporal_gate.png | Bin 0 -> 238 bytes .../textures/blocks/trading_post_bottom.png | Bin 0 -> 627 bytes .../textures/blocks/trading_post_side.png | Bin 0 -> 724 bytes .../textures/blocks/trading_post_top.png | Bin 0 -> 702 bytes .../textures/blocks/transfer_node_bottom.png | Bin 0 -> 153 bytes .../blocks/transfer_node_energy_top.png | Bin 0 -> 176 bytes .../blocks/transfer_node_fluid_top.png | Bin 0 -> 176 bytes .../blocks/transfer_node_hyper_energy_top.png | Bin 0 -> 176 bytes .../textures/blocks/transfer_node_top.png | Bin 0 -> 176 bytes .../textures/blocks/transfer_pipe.png | Bin 0 -> 167 bytes .../textures/blocks/trash_can_energy.png | Bin 0 -> 330 bytes .../textures/blocks/trash_can_fluid.png | Bin 0 -> 398 bytes .../textures/blocks/trash_can_item.png | Bin 0 -> 398 bytes .../textures/gui/progress_energy.png | Bin 0 -> 187 bytes .../textures/gui/trade_highlight.png | Bin 0 -> 120 bytes .../textures/gui/vanilla_search.png | Bin 0 -> 139 bytes .../items/anti_particulate_shovel.png | Bin 0 -> 159 bytes .../textures/items/architects_wand.png | Bin 0 -> 272 bytes .../textures/items/bedrockium_ingot.png | Bin 0 -> 370 bytes .../textures/items/block_analyzer.png | Bin 0 -> 163 bytes .../textures/items/destruction_pickaxe.png | Bin 0 -> 196 bytes .../textures/items/disabled_item.png | Bin 0 -> 474 bytes .../textures/items/ender_lotus_seed.png | Bin 0 -> 241 bytes .../textures/items/etheric_sword.png | Bin 0 -> 201 bytes .../textures/items/fire_battery.png | Bin 0 -> 326 bytes .../textures/items/fire_battery_bg.png | Bin 0 -> 163 bytes .../textures/items/fire_battery_overlay_0.png | Bin 0 -> 226 bytes .../textures/items/fire_battery_overlay_1.png | Bin 0 -> 241 bytes .../textures/items/fire_battery_overlay_2.png | Bin 0 -> 251 bytes .../textures/items/fire_battery_overlay_3.png | Bin 0 -> 265 bytes .../textures/items/fire_battery_overlay_4.png | Bin 0 -> 256 bytes .../textures/items/fire_battery_overlay_5.png | Bin 0 -> 268 bytes .../textures/items/glove.png | Bin 0 -> 222 bytes .../textures/items/glove_bottom.png | Bin 0 -> 120 bytes .../textures/items/glove_model.png | Bin 0 -> 257 bytes .../textures/items/glove_top.png | Bin 0 -> 198 bytes .../textures/items/gluttons_axe.png | Bin 0 -> 281 bytes .../textures/items/golden_bag.png | Bin 0 -> 454 bytes .../textures/items/heavenly_ring.0.png | Bin 0 -> 229 bytes .../textures/items/heavenly_ring.wing.1.png | Bin 0 -> 295 bytes .../textures/items/inversion_sigil_active.png | Bin 0 -> 810 bytes .../items/inversion_sigil_active.png.mcmeta | 5 + .../items/inversion_sigil_inactive.png | Bin 0 -> 350 bytes .../textures/items/inverted_ingot.png | Bin 0 -> 364 bytes .../textures/items/inverted_ingot_stable.png | Bin 0 -> 395 bytes .../textures/items/inverted_nugget.png | Bin 0 -> 197 bytes .../textures/items/mob_jar.png | Bin 0 -> 156 bytes .../textures/items/mob_jar_full.png | Bin 0 -> 349 bytes .../textures/items/mob_jar_full.png.mcmeta | 5 + .../textures/items/precision_shears.png | Bin 0 -> 200 bytes .../items/precision_shears_cooldown.png | Bin 0 -> 176 bytes .../textures/items/pseudo_inversion_sigil.png | Bin 0 -> 1024 bytes .../items/pseudo_inversion_sigil.png.mcmeta | 5 + .../textures/items/reversing_hoe.png | Bin 0 -> 157 bytes .../textures/items/super_architects_wand.png | Bin 0 -> 266 bytes .../textures/items/watering_can_advanced.png | Bin 0 -> 346 bytes .../textures/items/watering_can_basic.png | Bin 0 -> 1832 bytes .../textures/items/watering_can_elite.png | Bin 0 -> 351 bytes .../textures/items/xray_glasses.png | Bin 0 -> 201 bytes .../textures/items/xray_glasses_model.png | Bin 0 -> 322 bytes src/main/resources/mcmod.info | 21 + .../mixins.utilitiesinexcess.early.json | 11 + .../resources/mixins.utilitiesinexcess.json | 7 + 1377 files changed, 25349 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/workflows/build-and-test.yml create mode 100644 .github/workflows/release-tags.yml create mode 100644 .gitignore create mode 100644 CODEOWNERS create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build.gradle.kts create mode 100644 dependencies.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 jitpack.yml create mode 100644 models/underworld_portal.json create mode 100644 repositories.gradle create mode 100644 settings.gradle.kts create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/ModBiomes.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/ModDimensions.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/api/QEDRecipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/api/QEDRegistry.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockBedrockium.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockBlackoutCurtains.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockCompressed.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockCursedEarth.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorative.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDrum.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderLotus.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEtherealGlass.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockFloating.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockInverted.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetherius.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockMagicWood.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockMarginallyMaximisedChest.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPacifistsBench.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalEndOfTime.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalUnderWorld.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPureLove.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRadicallyReducedChest.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRainMuffler.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRedstoneClock.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSignificantlyShrunkChest.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSmartPump.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSoundMuffler.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSpike.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTradingPost.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTrashCanEnergy.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTrashCanFluid.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTrashCanItem.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockUpdateDetector.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockBaseGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockEnderGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockFoodGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockFurnaceGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockHighTemperatureFurnaceGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockLavaGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockLowTemperatureFurnaceGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockNetherStarGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockPinkGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockPotionGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockRedstoneGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockSolarGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockTNTGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNode.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNodeFluid.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNode.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeFluid.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeHyperEnergy.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/UIETeleporter.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/UIEWorldChunkManager.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/BiomeGenEndOfTime.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/ChunkProviderEndOfTime.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/DimensionPortalData.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/EndOfTimeEvents.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/EndOfTimeSourceProperty.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/WorldProviderEndOfTime.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/BiomeDecoratorUnderWorld.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/BiomeGenUnderWorld.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/ChunkProviderUnderWorld.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/UnderWorldEvents.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/UnderWorldSourceProperty.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/WorldGenBoulders.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/WorldProviderUnderWorld.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/entities/EntitySiegeProperty.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/WateringCanEvent.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemAnalyzer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemArchitectsWand.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemBedrockiumIngot.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemDisabled.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemEnderLotusSeed.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemFireBattery.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGlove.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGoldenBag.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemHeavenlyRing.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilInactive.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInvertedIngot.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemMobJar.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPseudoInversionSigil.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemWateringCan.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemXRayGlasses.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemAntiParticulateShovel.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemEthericSword.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGluttonsAxe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemPrecisionShears.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/DisableableItemStack.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeGlove.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeInvertedIngot.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/BlackoutCurtainsRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/FireBatteryRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/GloveRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/HeavenlyRingRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/InvertedIngotRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/LapisAetheriusRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/SpikeRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/WireframeRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/XRayRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityBlockUpdateDetector.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityConveyor.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityDrum.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityMarginallyMaximisedChest.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPacifistsBench.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPortalUnderWorld.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPureLove.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRadicallyReducedChest.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRainMuffler.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRedstoneClock.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySignificantlyShrunkChest.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySmartPump.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySoundMuffler.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySpike.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTradingPost.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanEnergy.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanFluid.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanItem.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGeneratorWithItemFuel.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityEnderGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityFoodGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityFurnaceGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityHighTemperatureFurnaceGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityLavaGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityLowTemperatureFurnaceGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityNetherStarGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityPinkGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityPotionGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityRedstoneGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntitySolarGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityTNTGenerator.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeFluid.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/WorldGenEnderLotus.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/Box.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/ChunkBlockView.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/IBlockView.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/IMutableBlockView.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/MutableSubBlockView.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/SubBlockView.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/wrappers/MerchantRecipeListWrapper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/crafttweaker/QEDCraftTweakerSupport.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/findit/FindItHelper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/SearchBar.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/TradeWidget.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerColumn.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerEntityDisplay.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerSyncHandler.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerWidget.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/NEIConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/QEDRecipeHandler.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/BedrockiumActiveToolMod.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/TinkersCompat.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/TinkersEvents.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/TinkersMaterials.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/OtherConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/CursedEarthConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderLotusConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/GeneratorConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/dimensions/DimensionConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/dimensions/EndOfTimeConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/dimensions/UnderWorldConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/FireBatteryConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/WateringCanConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/AntiParticulateShovelConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/EthericSwordConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GluttonsAxeConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/PrecisionShearsConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/UnstableTools.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/TargetedMod.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/UIEMixinLoader.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinBlockEnchantmentTable_MagicWood.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinItemRenderer_Glove.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinMobSpawnerBaseLogic_CursedEarthSpawner.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelBiped_Baubles.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelRenderer_Baubles.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinNetHandlerPlayServer_Glove.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinPlayerControllerMP_Glove.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorBlock.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorBlock_Client.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorClientMinecraft.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorEntityLivingBase.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorEntityZombie.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorItemRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorItemSword.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorItemTool.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorMerchantRecipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorPotionEffect.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/network/PacketHandler.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PacketAggressiveMobSpawn.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PacketRainMuffledSync.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PacketUnderworldAttack.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/ParticlePacket.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/render/ISBRHUnderworldPortal.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/render/ScaledCubeFaceIcon.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/render/TESRUnderworldPortal.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/filter/ITransferFilter.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ITransferWalker.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsWandUtils.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColorUtils.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/FMLEventHandler.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/IntRange.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ModelPartRenderHelper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/PinkFuelHelper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/PumpChunkLoadingCallback.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/RenderUtils.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/RenderableCube.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/SoundVolumeChecks.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/VoidingInventory.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/mui/FilteredFluidSlotSyncHandler.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/mui/TooltipItemDisplayWidget.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/NoiseSampler.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/OctavesSampler.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/ScaledNoise.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/SimplexNoiseSampler.java create mode 100644 src/main/resources/META-INF/utilitiesinexcess_at.cfg create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/glass_0.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/glass_1.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/glass_10.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/glass_0.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/glass_3.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/glass_4.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/glass_5.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/glass_7.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/glass_8.properties create mode 100644 src/main/resources/assets/tinker/lang/en_US.lang create mode 100644 src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium.png create mode 100644 src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium.png.mcmeta create mode 100644 src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium_flow.png create mode 100644 src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium_flow.png.mcmeta create mode 100644 src/main/resources/assets/tinker/textures/blocks/liquid_inverted.png create mode 100644 src/main/resources/assets/tinker/textures/blocks/liquid_inverted.png.mcmeta create mode 100644 src/main/resources/assets/tinker/textures/blocks/liquid_inverted_flow.png create mode 100644 src/main/resources/assets/tinker/textures/blocks/liquid_inverted_flow.png.mcmeta create mode 100644 src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_fletching.png create mode 100644 src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_shaft.png create mode 100644 src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_fletching.png create mode 100644 src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_shaft.png create mode 100644 src/main/resources/assets/tinker/textures/items/arrow/magical_wood_arrow_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/arrow/magical_wood_arrow_shaft.png create mode 100644 src/main/resources/assets/tinker/textures/items/axe/bedrockium_uie_axe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/axe/bedrockium_uie_axe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/axe/bedrockium_uie_axe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/axe/inverted_axe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/axe/inverted_axe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/axe/inverted_axe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/axe/magical_wood_axe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/axe/magical_wood_axe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/axe/magical_wood_axe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_back.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_backhead.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_front.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_fronthead.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_fronthead_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_back.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_backhead.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_front.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_fronthead.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_fronthead_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_back.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_backhead.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_front.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_fronthead.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_fronthead_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/battlesign/inverted_battlesign_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/battlesign/inverted_battlesign_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/battlesign/inverted_battlesign_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/battlesign/magical_wood_battlesign_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/battlesign/magical_wood_battlesign_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/battlesign/magical_wood_battlesign_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/bolt/bedrockium_uie_bolt_fletching.png create mode 100644 src/main/resources/assets/tinker/textures/items/bolt/bedrockium_uie_bolt_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/bolt/bedrockium_uie_bolt_shaft.png create mode 100644 src/main/resources/assets/tinker/textures/items/bolt/inverted_bolt_fletching.png create mode 100644 src/main/resources/assets/tinker/textures/items/bolt/inverted_bolt_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/bolt/inverted_bolt_shaft.png create mode 100644 src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_shaft.png create mode 100644 src/main/resources/assets/tinker/textures/items/broadsword/bedrockium_uie_sword_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/broadsword/bedrockium_uie_sword_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/broadsword/bedrockium_uie_sword_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/broadsword/bedrockium_uie_sword_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/chisel/inverted_chisel_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/chisel/inverted_chisel_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/chisel/inverted_chisel_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/chisel/magical_wood_chisel_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/chisel/magical_wood_chisel_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/chisel/magical_wood_chisel_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_shield.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_shield.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_shield.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_body.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_body.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_body.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/cutlass/bedrockium_uie_cutlass_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/cutlass/bedrockium_uie_cutlass_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/cutlass/bedrockium_uie_cutlass_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/cutlass/bedrockium_uie_cutlass_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/dagger/inverted_dagger_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/dagger/inverted_dagger_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/dagger/inverted_dagger_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/dagger/inverted_dagger_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_grip.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_grip.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_grip.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/frypan/inverted_frypan_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/frypan/inverted_frypan_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/frypan/inverted_frypan_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/frypan/magical_wood_frypan_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/frypan/magical_wood_frypan_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/frypan/magical_wood_frypan_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_back.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_front.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_handle_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_back.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_front.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_handle_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_back.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_front.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_handle_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_grip.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_grip.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_grip.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/longsword/bedrockium_uie_longsword_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/longsword/bedrockium_uie_longsword_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/longsword/bedrockium_uie_longsword_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/longsword/bedrockium_uie_longsword_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_shield.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/inverted_lumberaxe_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/inverted_lumberaxe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/inverted_lumberaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/inverted_lumberaxe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/inverted_lumberaxe_shield.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_shield.png create mode 100644 src/main/resources/assets/tinker/textures/items/materials/bucket_fiery_metal.png create mode 100644 src/main/resources/assets/tinker/textures/items/materials/bucket_knightmetal.png create mode 100644 src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_back.png create mode 100644 src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_back.png create mode 100644 src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_back.png create mode 100644 src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_arrow_shaft.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_arrowhead.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_axe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_battlesign_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_bolt.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_bolt_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_bow_limb.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_chisel_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_chunk.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_crossbar.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_crossbow_body.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_crossbow_limb.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_excavator_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_frypan_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_full_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_hammer_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_knife_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_large_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_large_sword_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_largeplate.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_lumberaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_medium_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_pickaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_rod.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_scythe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_shovel_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_shuriken.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_sword_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_toughbind.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_toughrod.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_arrow_shaft.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_arrowhead.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_axe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_battlesign_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_bolt.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_bolt_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_bow_limb.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_chisel_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_chunk.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_crossbar.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_crossbow_body.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_crossbow_limb.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_excavator_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_frypan_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_full_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_hammer_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_knife_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_large_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_large_sword_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_largeplate.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_lumberaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_medium_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_pickaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_rod.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_scythe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_shovel_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_shuriken.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_sword_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_toughbind.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/inverted_toughrod.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_arrow_shaft.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_arrowhead.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_axe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_battlesign_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_bolt.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_bolt_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_bow_limb.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_chisel_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_chunk.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbar.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbow_body.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbow_limb.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_excavator_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_frypan_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_full_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_hammer_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_knife_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_large_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_large_sword_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_largeplate.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_lumberaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_medium_guard.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_pickaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_rod.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_scythe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_shovel_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_shuriken.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_sword_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_toughbind.png create mode 100644 src/main/resources/assets/tinker/textures/items/parts/magical_wood_toughrod.png create mode 100644 src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_blade_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/invertedscythe_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/magical_wood_scythe_accessory.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/magical_wood_scythe_binding.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/magical_wood_scythe_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/magical_wood_scythe_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/scythe/magical_wood_scythe_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_top.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_top_1.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_top_2.png create mode 100644 src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_top_3.png create mode 100644 src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/shovel/inverted_shovel_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/shovel/inverted_shovel_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/shovel/inverted_shovel_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/shovel/magical_wood_shovel_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/shovel/magical_wood_shovel_head.png create mode 100644 src/main/resources/assets/tinker/textures/items/shovel/magical_wood_shovel_head_broken.png create mode 100644 src/main/resources/assets/tinker/textures/items/shuriken/bedrockium_uie_shuriken.png create mode 100644 src/main/resources/assets/tinker/textures/items/shuriken/inverted_shuriken.png create mode 100644 src/main/resources/assets/tinker/textures/items/shuriken/magical_wood_shuriken.png create mode 100644 src/main/resources/assets/tinker/textures/items/throwingknife/bedrockium_uie_knife_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/throwingknife/bedrockium_uie_knife_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/throwingknife/inverted_knife_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/throwingknife/inverted_knife_handle.png create mode 100644 src/main/resources/assets/tinker/textures/items/throwingknife/magical_wood_knife_blade.png create mode 100644 src/main/resources/assets/tinker/textures/items/throwingknife/magical_wood_knife_handle.png create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/trash_can_energy.json create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/trash_can_fluid.json create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/trash_can_item.json create mode 100644 src/main/resources/assets/utilitiesinexcess/lang/en_US.lang create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/trash_can_energy.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/trash_can_fluid.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/trash_can_item.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/underworld_portal/frame.obj create mode 100644 src/main/resources/assets/utilitiesinexcess/models/underworld_portal/materials.mtl create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/bedrockium_block.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/blackout_curtains.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/blessed_earth_side.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/blessed_earth_top.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_6.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_7.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_6.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_7.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_6.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_7.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_6.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_7.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_down.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_down.png.mcmeta create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_left.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_left.png.mcmeta create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_right.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_right.png.mcmeta create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_up.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_up.png.mcmeta create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_6.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_7.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/cursed_earth_side.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/cursed_earth_top.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_10.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_11.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_6.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_7.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_8.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_9.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/drum.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass_dark.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass_dark_inverted.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass_inverted.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/floating_block.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/ender_generator.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/ender_generator_plus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/ender_generator_plusplus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/food_generator.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/food_generator_plus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/food_generator_plusplus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator_plus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator_plusplus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/high_temperature_furnace_generator.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/high_temperature_furnace_generator_plus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/high_temperature_furnace_generator_plusplus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/lava_generator.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/lava_generator_plus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/lava_generator_plusplus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/low_temperature_furnace_generator.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/low_temperature_furnace_generator_plus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/low_temperature_furnace_generator_plusplus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/nether_star_generator.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/nether_star_generator_plus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/nether_star_generator_plusplus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/pink_generator.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/pink_generator_plus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/pink_generator_plusplus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/potion_generator.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/potion_generator_plus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/potion_generator_plusplus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/redstone_generator.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/redstone_generator_plus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/redstone_generator_plusplus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/solar_generator.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/solar_generator_plus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/solar_generator_plusplus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/tnt_generator.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/tnt_generator_plus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/tnt_generator_plusplus.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_10.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_11.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_6.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_7.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_8.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_9.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_10.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_11.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_12.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_13.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_14.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_15.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_6.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_7.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_8.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_9.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/magic_wood.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/diamond_spike.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/gold_spike.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/iron_spike.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/trash_can_energy.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/trash_can_fluid.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/trash_can_item.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/wood_spike.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/pacifists_bench.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/pure_love.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/rain_muffler.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/retrieval_node_fluid_top.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/retrieval_node_top.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_front.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_side.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_top.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/smart_pump.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/sound_muffler.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/trading_post_bottom.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/trading_post_side.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/trading_post_top.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_node_bottom.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_node_energy_top.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_node_fluid_top.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_node_hyper_energy_top.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_node_top.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_pipe.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_energy.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_fluid.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_item.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/gui/progress_energy.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/gui/trade_highlight.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/gui/vanilla_search.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/anti_particulate_shovel.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/architects_wand.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/bedrockium_ingot.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/block_analyzer.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/destruction_pickaxe.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/disabled_item.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/ender_lotus_seed.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/etheric_sword.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_bg.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/glove.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/glove_bottom.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/glove_model.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/glove_top.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/gluttons_axe.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/golden_bag.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_active.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_active.png.mcmeta create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_inactive.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/inverted_ingot.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/inverted_ingot_stable.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/inverted_nugget.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/mob_jar.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/mob_jar_full.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/mob_jar_full.png.mcmeta create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/precision_shears.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/precision_shears_cooldown.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/pseudo_inversion_sigil.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/pseudo_inversion_sigil.png.mcmeta create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/reversing_hoe.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/super_architects_wand.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/watering_can_advanced.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/watering_can_basic.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/watering_can_elite.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/xray_glasses.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/xray_glasses_model.png create mode 100644 src/main/resources/mcmod.info create mode 100644 src/main/resources/mixins.utilitiesinexcess.early.json create mode 100644 src/main/resources/mixins.utilitiesinexcess.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..4ffbd908 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,22 @@ +# This is the universal Text Editor Configuration +# for all GTNewHorizons projects +# See: https://editorconfig.org/ + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{bat,ini}] +end_of_line = crlf + +[*.{dtd,json,info,mcmeta,md,sh,svg,xml,xsd,xsl,yaml,yml}] +indent_size = 2 + +[*.lang] +trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..fd2792b6 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,44 @@ +* text eol=lf + +*.[jJ][aA][rR] binary + +*.[pP][nN][gG] binary +*.[jJ][pP][gG] binary +*.[jJ][pP][eE][gG] binary +*.[gG][iI][fF] binary +*.[tT][iI][fF] binary +*.[tT][iI][fF][fF] binary +*.[iI][cC][oO] binary +*.[sS][vV][gG] text +*.[eE][pP][sS] binary +*.[xX][cC][fF] binary + +*.[kK][aA][rR] binary +*.[mM]4[aA] binary +*.[mM][iI][dD] binary +*.[mM][iI][dD][iI] binary +*.[mM][pP]3 binary +*.[oO][gG][gG] binary +*.[rR][aA] binary + +*.7[zZ] binary +*.[gG][zZ] binary +*.[tT][aA][rR] binary +*.[tT][gG][zZ] binary +*.[zZ][iI][pP] binary + +*.[tT][cC][nN] binary +*.[sS][oO] binary +*.[dD][lL][lL] binary +*.[dD][yY][lL][iI][bB] binary +*.[pP][sS][dD] binary +*.[tT][tT][fF] binary +*.[oO][tT][fF] binary + +*.[pP][aA][tT][cC][hH] -text + +*.[bB][aA][tT] text eol=crlf +*.[cC][mM][dD] text eol=crlf +*.[pP][sS]1 text eol=crlf + +*[aA][uU][tT][oO][gG][eE][nN][eE][rR][aA][tT][eE][dD]* binary diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml new file mode 100644 index 00000000..3ee2f686 --- /dev/null +++ b/.github/workflows/build-and-test.yml @@ -0,0 +1,13 @@ + +name: Build and test + +on: + pull_request: + branches: [ master, main ] + push: + branches: [ master, main ] + +jobs: + build-and-test: + uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/build-and-test.yml@master + secrets: inherit diff --git a/.github/workflows/release-tags.yml b/.github/workflows/release-tags.yml new file mode 100644 index 00000000..e4c0be6b --- /dev/null +++ b/.github/workflows/release-tags.yml @@ -0,0 +1,14 @@ + +name: Release tagged build + +on: + push: + tags: [ '*' ] + +permissions: + contents: write + +jobs: + release-tags: + uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/release-tags.yml@master + secrets: inherit diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..5e80e0ae --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +.gradle +.settings +/.idea/ +/.vscode/ +/run/ +/build/ +/eclipse/ +.classpath +.project +/bin/ +/config/ +/crash-reports/ +/logs/ +options.txt +/saves/ +usernamecache.json +banned-ips.json +banned-players.json +eula.txt +ops.json +server.properties +servers.dat +usercache.json +whitelist.json +/out/ +*.iml +*.ipr +*.iws +src/main/resources/mixins.*([!.]).json +*.bat +*.DS_Store +!gradlew.bat +.factorypath +addon.local.gradle +addon.local.gradle.kts +addon.late.local.gradle +addon.late.local.gradle.kts +layout.json diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000..a6b5f68c --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,3 @@ +# Any Github changes require admin approval +/.github/** @GTNewHorizons/admin + diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..0a041280 --- /dev/null +++ b/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/README.md b/README.md new file mode 100644 index 00000000..920f41c0 --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +# Utilities In Excess + +An open source, cleanroom recreation of [Extra Utilities](https://www.curseforge.com/minecraft/mc-mods/extra-utilities) for 1.7.10. + +Optionally dependent on [Angelica](https://github.com/GTNewHorizons/Angelica) for connected texture mapping. + +🚨 OFFICIAL DISCLAIMER 🚨 + +In case of an investigation 🔍 by any federal 🏛️, corporate 🏢, magical 🧙‍♂️, or interdimensional 🌌 entity, I hereby state the following: + +I have NOT ❌ +- read the source code 📜 +- glanced at the source code 👀 +- skimmed the source code 🏃‍♂️ +- reverse engineered the source code 🧠 +- thought about the source code 💭 +- dreamed about the source code 😴 +- or acknowledged the existence of the source code 🫥 + +of Extra Utilities in ANY way, shape, or form. + +My work on Utilities In Excess (aka the ✨ CLEANROOM ✨ rewrite) is based solely on: +
✔️ vibes +
✔️ documented behavior 📚 +
✔️ public knowledge 🌍 +
✔️ divine inspiration ⚡ +
✔️ and sheer willpower 💪 + +At no point did I obtain, observe, memorize, hallucinate, or spiritually channel any proprietary or original Extra Utilities implementation. + +Any similarities are PURELY COINCIDENTAL 🎲 +
Any accusations are BASELESS 🧱 +
Any lawyers are SCARY 😨 + +Thank you for your understanding 🙏 +
I do not know Extra Utilities +
Extra Utilities does not know me +
We have never met 🤝❌ + +😇😇😇 + +### Written by the official UiE lawyer, plasmachicken. Please contact in case of any legal inquiries. diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 00000000..944a269b --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,4 @@ + +plugins { + id("com.gtnewhorizons.gtnhconvention") +} diff --git a/dependencies.gradle b/dependencies.gradle new file mode 100644 index 00000000..4f9733dc --- /dev/null +++ b/dependencies.gradle @@ -0,0 +1,60 @@ +/* + * Add your dependencies here. Supported configurations: + * - api("group:name:version:classifier"): if you use the types from this dependency in the public API of this mod + * Available at runtime and compiletime for mods depending on this mod + * - implementation("g:n:v:c"): if you need this for internal implementation details of the mod, but none of it is visible via the public API + * Available at runtime but not compiletime for mods depending on this mod + * - compileOnly("g:n:v:c"): if the mod you're building doesn't need this dependency during runtime at all, e.g. for optional mods + * Not available at all for mods depending on this mod, only visible at compiletime for this mod + * - compileOnlyApi("g:n:v:c"): like compileOnly, but also visible at compiletime for mods depending on this mod + * Available at compiletime but not runtime for mods depending on this mod + * - runtimeOnlyNonPublishable("g:n:v:c"): if you want to include a mod in this mod's runClient/runServer runs, but not publish it as a dependency + * Not available at all for mods depending on this mod, only visible at runtime for this mod + * - devOnlyNonPublishable("g:n:v:c"): a combination of runtimeOnlyNonPublishable and compileOnly for dependencies present at both compiletime and runtime, + * but not published as Maven dependencies - useful for RFG-deobfuscated dependencies or local testing + * - runtimeOnly("g:n:v:c"): if you don't need this at compile time, but want it to be present at runtime + * Available at runtime for mods depending on this mod + * - annotationProcessor("g:n:v:c"): mostly for java compiler plugins, if you know you need this, use it, otherwise don't worry + * - testCONFIG("g:n:v:c") - replace CONFIG by one of the above (except api), same as above but for the test sources instead of main + * + * - shadowImplementation("g:n:v:c"): effectively the same as API, but the dependency is included in your jar under a renamed package name + * Requires you to enable usesShadowedDependencies in gradle.properties + * + * - compile("g:n:v:c"): deprecated, replace with "api" (works like the old "compile") or "implementation" (can be more efficient) + * + * You can exclude transitive dependencies (dependencies of the chosen dependency) by appending { transitive = false } if needed, + * but use this sparingly as it can break using your mod as another mod's dependency if you're not careful. + * + * To depend on obfuscated jars you can use `devOnlyNonPublishable(rfg.deobf("dep:spec:1.2.3"))` to fetch an obfuscated jar from maven, + * or `devOnlyNonPublishable(rfg.deobf(project.files("libs/my-mod-jar.jar")))` to use a file. + * + * Gradle names for some of the configuration can be misleading, compileOnlyApi and runtimeOnly both get published as dependencies in Maven, but compileOnly does not. + * The buildscript adds runtimeOnlyNonPublishable to also have a runtime dependency that's not published. + * + * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph + */ +dependencies { + implementation("com.github.GTNewHorizons:GTNHLib:0.8.32:dev") + // TODO: remove MUI1 dep when the implicit dependency + // TODO: in IItemHandlerModifiable is removed + api("com.github.GTNewHorizons:ModularUI:1.3.1:dev") + api("com.github.GTNewHorizons:ModularUI2:2.3.23-1.7.10:dev") + api("com.github.GTNewHorizons:CraftTweaker:3.4.2:dev") + api('curse.maven:cofh-lib-220333:2388748') + compileOnly('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev') + compileOnly('com.github.GTNewHorizons:Angelica:1.0.0-beta68a:dev') + compileOnly("com.github.GTNewHorizons:FindIt:1.4.0:dev") + compileOnly('com.github.GTNewHorizons:TinkersConstruct:1.14.14-GTNH:dev') + + + devOnlyNonPublishable("com.github.GTNewHorizons:Baubles-Expanded:2.2.4-GTNH:dev") + devOnlyNonPublishable("io.github.legacymoddingmc:unimixins:0.1.23:dev") + + runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.40-GTNH:dev") + + // For testing NBT data (/nbtedit) + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:ServerUtilities:2.2.6:dev") + // For testing glove + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Translocators:1.4.0:dev") + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Backhand:1.8.2:dev") +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..cf8e9f11 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,194 @@ +# ExampleMod tag to use as Blowdryer (Spotless, etc.) settings version, leave empty to disable. +# LOCAL to test local config updates. +gtnh.settings.blowdryerTag = 0.2.2 + +# Human-readable mod name, available for mcmod.info population. +modName = UtilitiesInExcess + +# Case-sensitive identifier string, available for mcmod.info population and used for automatic mixin JSON generation. +# Conventionally lowercase. +modId = utilitiesinexcess + +# Root package of the mod, used to find various classes in other properties, +# mcmod.info substitution, enabling assertions in run tasks, etc. +modGroup = com.fouristhenumber.utilitiesinexcess + +# Whether to use modGroup as the maven publishing group. +# When false, com.github.GTNewHorizons is used. +useModGroupForPublishing = true + +# Updates your build.gradle and settings.gradle automatically whenever an update is available. +autoUpdateBuildScript = false + +# Version of Minecraft to target +minecraftVersion = 1.7.10 + +# Version of Minecraft Forge to target +forgeVersion = 10.13.4.1614 + +# Specify an MCP channel for dependency deobfuscation and the deobfParams task. +channel = stable + +# Specify an MCP mappings version for dependency deobfuscation and the deobfParams task. +mappingsVersion = 12 + +# Defines other MCP mappings for dependency deobfuscation. +remoteMappings = https\://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/ + +# Select a default username for testing your mod. You can always override this per-run by running +# `./gradlew runClient --username=AnotherPlayer`, or configuring this command in your IDE. +developmentEnvironmentUserName = Developer + +# Enables using modern Java syntax (up to version 17) via Jabel, while still targeting JVM 8. +# See https://github.com/bsideup/jabel for details on how this works. +enableModernJavaSyntax = true + +# Enables injecting missing generics into the decompiled source code for a better coding experience. +# Turns most publicly visible List, Map, etc. into proper List, Map types. +enableGenericInjection = true + +# Generate a class with a String field for the mod version named as defined below. +# If generateGradleTokenClass is empty or not missing, no such class will be generated. +# If gradleTokenVersion is empty or missing, the field will not be present in the class. +generateGradleTokenClass = com.fouristhenumber.utilitiesinexcess.Tags + +# Name of the token containing the project's current version to generate/replace. +gradleTokenVersion = VERSION + +# [DEPRECATED] +# Multiple source files can be defined here by providing a comma-separated list: Class1.java,Class2.java,Class3.java +# public static final String VERSION = "GRADLETOKEN_VERSION"; +# The string's content will be replaced with your mod's version when compiled. You should use this to specify your mod's +# version in @Mod([...], version = VERSION, [...]). +# Leave these properties empty to skip individual token replacements. +replaceGradleTokenInFile = + +# In case your mod provides an API for other mods to implement you may declare its package here. Otherwise, you can +# leave this property empty. +# Example value: (apiPackage = api) + (modGroup = com.myname.mymodid) -> com.myname.mymodid.api +apiPackage = + +# Specify the configuration file for Forge's access transformers here. It must be placed into /src/main/resources/META-INF/ +# There can be multiple files in a space-separated list. +# Example value: mymodid_at.cfg nei_at.cfg +accessTransformersFile = utilitiesinexcess_at.cfg + +# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled! +usesMixins = true + +# Set to a non-empty string to configure mixins in a separate source set under src/VALUE, instead of src/main. +# This can speed up compile times thanks to not running the mixin annotation processor on all input sources. +# Mixin classes will have access to "main" classes, but not the other way around. +separateMixinSourceSet = + +# Adds some debug arguments like verbose output and class export. +usesMixinDebug = false + +# Specify the location of your implementation of IMixinConfigPlugin. Leave it empty otherwise. +mixinPlugin = + +# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail! +mixinsPackage = mixins + +# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin! +# This parameter is for legacy compatibility only +# Example value: (coreModClass = asm.FMLPlugin) + (modGroup = com.myname.mymodid) -> com.myname.mymodid.asm.FMLPlugin +coreModClass = mixins.UIEMixinLoader + +# If your project is only a consolidation of mixins or a core mod and does NOT contain a 'normal' mod ( = some class +# that is annotated with @Mod) you want this to be true. When in doubt: leave it on false! +containsMixinsAndOrCoreModOnly = false + +# Enables Mixins even if this mod doesn't use them, useful if one of the dependencies uses mixins. +forceEnableMixins = false + +# If enabled, you may use 'shadowCompile' for dependencies. They will be integrated into your jar. It is your +# responsibility to check the license and request permission for distribution if required. +usesShadowedDependencies = false + +# If disabled, won't remove unused classes from shadowed dependencies. Some libraries use reflection to access +# their own classes, making the minimization unreliable. +minimizeShadowedDependencies = true + +# If disabled, won't rename the shadowed classes. +relocateShadowedDependencies = true + +# Adds CurseMaven, Modrinth, and some more well-known 1.7.10 repositories. +includeWellKnownRepositories = true + +# A list of repositories to exclude from the includeWellKnownRepositories setting. Should be a space separated +# list of strings, with the acceptable keys being(case does not matter): +# cursemaven +# modrinth +excludeWellKnownRepositories = + +# Change these to your Maven coordinates if you want to publish to a custom Maven repository instead of the default GTNH Maven. +# Authenticate with the MAVEN_USER and MAVEN_PASSWORD environment variables. +# If you need a more complex setup disable maven publishing here and add a publishing repository to addon.gradle. +usesMavenPublishing = true + +# Maven repository to publish the mod to. +# mavenPublishUrl = https\://nexus.gtnewhorizons.com/repository/releases/ + +# Publishing to Modrinth requires you to set the MODRINTH_TOKEN environment variable to your current Modrinth API token. +# +# The project's ID on Modrinth. Can be either the slug or the ID. +# Leave this empty if you don't want to publish to Modrinth. +modrinthProjectId = + +# The project's relations on Modrinth. You can use this to refer to other projects on Modrinth. +# Syntax: scope1-type1:name1;scope2-type2:name2;... +# Where scope can be one of [required, optional, incompatible, embedded], +# type can be one of [project, version], +# and the name is the Modrinth project or version slug/id of the other mod. +# Example: required-project:fplib;optional-project:gasstation;incompatible-project:gregtech +# Note: UniMixins is automatically set as a required dependency if usesMixins = true. +modrinthRelations = + +# Publishing to CurseForge requires you to set the CURSEFORGE_TOKEN environment variable to one of your CurseForge API tokens. +# +# The project's numeric ID on CurseForge. You can find this in the About Project box. +# Leave this empty if you don't want to publish on CurseForge. +curseForgeProjectId = + +# The project's relations on CurseForge. You can use this to refer to other projects on CurseForge. +# Syntax: type1:name1;type2:name2;... +# Where type can be one of [requiredDependency, embeddedLibrary, optionalDependency, tool, incompatible], +# and the name is the CurseForge project slug of the other mod. +# Example: requiredDependency:railcraft;embeddedLibrary:cofhlib;incompatible:buildcraft +# Note: UniMixins is automatically set as a required dependency if usesMixins = true. +curseForgeRelations = + +# Optional parameter to customize the produced artifacts. Use this to preserve artifact naming when migrating older +# projects. New projects should not use this parameter. +# customArchiveBaseName = + +# Optional parameter to have the build automatically fail if an illegal version is used. +# This can be useful if you e.g. only want to allow versions in the form of '1.1.xxx'. +# The check is ONLY performed if the version is a git tag. +# Note: the specified string must be escaped, so e.g. 1\\.1\\.\\d+ instead of 1\.1\.\d+ +# versionPattern = + +# Uncomment to prevent the source code from being published. +# noPublishedSources = true + +# Uncomment this to disable Spotless checks. +# This should only be uncommented to keep it easier to sync with upstream/other forks. +# That is, if there is no other active fork/upstream, NEVER change this. +# disableSpotless = true + +# Uncomment this to disable Checkstyle checks (currently wildcard import check). +# disableCheckstyle = true + +# Override the IDEA build type. Valid values are: "" (leave blank, do not override), "idea" (force use native IDEA build), "gradle" +# (force use delegated build). +# This is meant to be set in $HOME/.gradle/gradle.properties. +# e.g. add "systemProp.org.gradle.project.ideaOverrideBuildType=idea" will override the build type to be native build. +# WARNING: If you do use this option, it will overwrite whatever you have in your existing projects. This might not be what you want! +# Usually there is no need to uncomment this here as other developers do not necessarily use the same build type as you. +# ideaOverrideBuildType = idea + +# Whether IDEA should run spotless checks when pressing the Build button. +# This is meant to be set in $HOME/.gradle/gradle.properties. +# ideaCheckSpotlessOnBuild = true + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..9bbc975c742b298b441bfb90dbc124400a3751b9 GIT binary patch literal 43705 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 DHx0+F literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..37f853b1 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 00000000..faf93008 --- /dev/null +++ b/gradlew @@ -0,0 +1,251 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..9d21a218 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/jitpack.yml b/jitpack.yml new file mode 100644 index 00000000..09bbb514 --- /dev/null +++ b/jitpack.yml @@ -0,0 +1,2 @@ +before_install: + - ./gradlew setupCIWorkspace \ No newline at end of file diff --git a/models/underworld_portal.json b/models/underworld_portal.json new file mode 100644 index 00000000..3a58be92 --- /dev/null +++ b/models/underworld_portal.json @@ -0,0 +1,149 @@ +{ + "format_version": "1.21.6", + "credit": "Made with Blockbench", + "textures": { + "0": "bedrockium_block", + "particle": "bedrockium_block" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [4, 16, 4], + "faces": { + "north": {"uv": [12, 0, 16, 16], "texture": "#0"}, + "east": {"uv": [8, 0, 12, 16], "texture": "#0"}, + "south": {"uv": [4, 0, 8, 16], "texture": "#0"}, + "west": {"uv": [0, 0, 4, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 12, 4, 16], "texture": "#0"} + } + }, + { + "from": [12, 0, 0], + "to": [16, 16, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 0, 0]}, + "faces": { + "north": {"uv": [0, 0, 4, 16], "texture": "#0"}, + "east": {"uv": [12, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [8, 0, 12, 16], "texture": "#0"}, + "west": {"uv": [4, 0, 8, 16], "texture": "#0"}, + "up": {"uv": [12, 0, 16, 4], "texture": "#0"}, + "down": {"uv": [12, 12, 16, 16], "texture": "#0"} + } + }, + { + "from": [12, 0, 12], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 0, 14]}, + "faces": { + "north": {"uv": [4, 0, 8, 16], "texture": "#0"}, + "east": {"uv": [0, 0, 4, 16], "texture": "#0"}, + "south": {"uv": [12, 0, 16, 16], "texture": "#0"}, + "west": {"uv": [8, 0, 12, 16], "texture": "#0"}, + "up": {"uv": [12, 12, 16, 16], "texture": "#0"}, + "down": {"uv": [12, 12, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 0, 12], + "to": [4, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 14]}, + "faces": { + "north": {"uv": [8, 0, 12, 16], "texture": "#0"}, + "east": {"uv": [4, 0, 8, 16], "texture": "#0"}, + "south": {"uv": [0, 0, 4, 16], "texture": "#0"}, + "west": {"uv": [12, 0, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 12, 4, 16], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + }, + { + "from": [0, 0, 4], + "to": [4, 4, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 4]}, + "faces": { + "east": {"uv": [4, 12, 12, 16], "texture": "#0"}, + "west": {"uv": [4, 12, 12, 16], "texture": "#0"}, + "up": {"uv": [7, 4, 11, 12], "texture": "#0"}, + "down": {"uv": [1, 4, 5, 12], "texture": "#0"} + } + }, + { + "from": [4, 0, 0], + "to": [12, 4, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 0, 4]}, + "faces": { + "north": {"uv": [4, 12, 12, 16], "texture": "#0"}, + "south": {"uv": [4, 12, 12, 16], "texture": "#0"}, + "up": {"uv": [4, 4, 12, 12], "texture": "#0"}, + "down": {"uv": [4, 8, 12, 16], "texture": "#0"} + } + }, + { + "from": [4, 0, 8], + "to": [12, 4, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 0, 4]}, + "faces": { + "north": {"uv": [4, 12, 12, 16], "texture": "#0"}, + "south": {"uv": [4, 12, 12, 16], "texture": "#0"}, + "up": {"uv": [4, 4, 12, 12], "rotation": 180, "texture": "#0"}, + "down": {"uv": [4, 0, 12, 8], "texture": "#0"} + } + }, + { + "from": [12, 0, 4], + "to": [16, 4, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [12, 0, 4]}, + "faces": { + "east": {"uv": [4, 12, 12, 16], "texture": "#0"}, + "west": {"uv": [4, 12, 12, 16], "texture": "#0"}, + "up": {"uv": [7, 4, 11, 12], "texture": "#0"}, + "down": {"uv": [12, 4, 16, 12], "texture": "#0"} + } + }, + { + "from": [12, 12, 4], + "to": [16, 16, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [12, 12, 4]}, + "faces": { + "east": {"uv": [4, 0, 12, 4], "texture": "#0"}, + "west": {"uv": [4, 4, 12, 8], "texture": "#0"}, + "up": {"uv": [12, 4, 16, 12], "texture": "#0"}, + "down": {"uv": [4, 6, 12, 10], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [0, 12, 4], + "to": [4, 16, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 12, 4]}, + "faces": { + "east": {"uv": [5, 4, 13, 8], "texture": "#0"}, + "west": {"uv": [4, 0, 12, 4], "texture": "#0"}, + "up": {"uv": [0, 4, 4, 12], "texture": "#0"}, + "down": {"uv": [4, 5, 12, 9], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [4, 12, 0], + "to": [12, 16, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 12, 0]}, + "faces": { + "north": {"uv": [4, 0, 12, 4], "texture": "#0"}, + "south": {"uv": [4, 4, 12, 8], "texture": "#0"}, + "up": {"uv": [4, 0, 12, 4], "texture": "#0"}, + "down": {"uv": [4, 4, 12, 8], "texture": "#0"} + } + }, + { + "from": [4, 12, 12], + "to": [12, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 12, 12]}, + "faces": { + "north": {"uv": [4, 4, 12, 8], "texture": "#0"}, + "south": {"uv": [4, 0, 12, 4], "texture": "#0"}, + "up": {"uv": [4, 12, 12, 16], "texture": "#0"}, + "down": {"uv": [4, 8, 12, 12], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/repositories.gradle b/repositories.gradle new file mode 100644 index 00000000..7e002f2b --- /dev/null +++ b/repositories.gradle @@ -0,0 +1,5 @@ +// Add any additional repositories for your dependencies here. + +repositories { + +} diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 00000000..cbf0d00d --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,21 @@ + +pluginManagement { + repositories { + maven { + // RetroFuturaGradle + name = "GTNH Maven" + url = uri("https://nexus.gtnewhorizons.com/repository/public/") + mavenContent { + includeGroup("com.gtnewhorizons") + includeGroupByRegex("com\\.gtnewhorizons\\..+") + } + } + gradlePluginPortal() + mavenCentral() + mavenLocal() + } +} + +plugins { + id("com.gtnewhorizons.gtnhsettingsconvention") version("1.0.41") +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java new file mode 100644 index 00000000..b613ece7 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java @@ -0,0 +1,104 @@ +package com.fouristhenumber.utilitiesinexcess; + +import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.MODID; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraftforge.client.MinecraftForgeClient; +import net.minecraftforge.common.MinecraftForge; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import com.fouristhenumber.utilitiesinexcess.common.renderers.FireBatteryRenderer; +import com.fouristhenumber.utilitiesinexcess.common.renderers.GloveRenderer; +import com.fouristhenumber.utilitiesinexcess.common.renderers.InvertedIngotRenderer; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; +import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.compat.findit.FindItHelper; +import com.fouristhenumber.utilitiesinexcess.render.ISBRHUnderworldPortal; +import com.fouristhenumber.utilitiesinexcess.render.TESRUnderworldPortal; +import com.gtnewhorizon.gtnhlib.client.model.loading.ModelRegistry; + +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; + +@SuppressWarnings("unused") +public class ClientProxy extends CommonProxy { + + // This is just a number that ticks up every frame. + public static int frameCount = 0; + + @Override + public void preInit(FMLPreInitializationEvent event) { + super.preInit(event); + ModelRegistry.registerModid(MODID); + } + + @Override + public void init(FMLInitializationEvent event) { + super.init(event); + if (ModItems.INVERTED_NUGGET.isEnabled()) { + MinecraftForgeClient.registerItemRenderer(ModItems.INVERTED_INGOT.get(), new InvertedIngotRenderer()); + } + if (ModBlocks.UNDERWORLD_PORTAL.isEnabled()) { + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPortalUnderWorld.class, new TESRUnderworldPortal()); + RenderingRegistry.registerBlockHandler(ISBRHUnderworldPortal.INSTANCE); + } + if (ModItems.GLOVE.isEnabled()) { + MinecraftForgeClient.registerItemRenderer(ModItems.GLOVE.get(), new GloveRenderer()); + } + if (ModItems.FIRE_BATTERY.isEnabled()) { + MinecraftForgeClient.registerItemRenderer(ModItems.FIRE_BATTERY.get(), new FireBatteryRenderer()); + } + + FMLCommonHandler.instance() + .bus() + .register(this); + + if (Mods.FindIt.isLoaded()) { + FindItHelper.init(); + FindItHelper.INSTANCE = new FindItHelper(); + MinecraftForge.EVENT_BUS.register(FindItHelper.INSTANCE); + } + } + + @SubscribeEvent + public void tickRender(TickEvent.RenderTickEvent event) { + frameCount++; + if (event.phase == TickEvent.Phase.END) { + Minecraft mc = Minecraft.getMinecraft(); + if (!(mc.currentScreen == null && mc.theWorld != null + && Minecraft.isGuiEnabled() + && !mc.gameSettings.keyBindPlayerList.getIsKeyPressed())) return; + + GL11.glPushMatrix(); + + boolean hasBlending = GL11.glGetBoolean(GL11.GL_BLEND); + boolean hasDepthTest = GL11.glGetBoolean(GL11.GL_DEPTH_TEST); + int boundTexIndex = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + GL11.glPushAttrib(GL11.GL_CURRENT_BIT); + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + GloveRenderer.renderGloveHudIcon(); + + if (hasBlending) GL11.glEnable(GL11.GL_BLEND); + else GL11.glDisable(GL11.GL_BLEND); + if (hasDepthTest) GL11.glEnable(GL11.GL_DEPTH_TEST); + else GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, boundTexIndex); + + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java new file mode 100644 index 00000000..74580fca --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java @@ -0,0 +1,48 @@ +package com.fouristhenumber.utilitiesinexcess; + +import org.lwjgl.input.Keyboard; + +import com.fouristhenumber.utilitiesinexcess.client.IMCForNEI; +import com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime.EndOfTimeEvents; +import com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld.UnderWorldEvents; +import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.network.PacketHandler; +import com.fouristhenumber.utilitiesinexcess.utils.SoundVolumeChecks; +import com.gtnewhorizon.gtnhlib.keybind.SyncedKeybind; + +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.event.FMLServerStartingEvent; + +public class CommonProxy { + + public SoundVolumeChecks soundVolumeChecks; + + public SyncedKeybind GLOVE_KEYBIND; + + public void preInit(FMLPreInitializationEvent event) { + // Config is handled in the early mixin loader (UIEMixinLoader) + // since we want the config to be available + // during mixin initialisation time. + PacketHandler.init(); + ModBlocks.init(); + ModItems.init(); + ModDimensions.init(); + ModBiomes.init(); + UnderWorldEvents.init(); + EndOfTimeEvents.init(); + if (Mods.NEI.isLoaded()) { + IMCForNEI.IMCSender(); + } + } + + public void init(FMLInitializationEvent event) { + soundVolumeChecks = new SoundVolumeChecks(); + GLOVE_KEYBIND = SyncedKeybind.createConfigurable("key.uie.glove", "key.categories.uie", Keyboard.KEY_NONE); + } + + public void postInit(FMLPostInitializationEvent event) {} + + public void serverStarting(FMLServerStartingEvent event) {} +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBiomes.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBiomes.java new file mode 100644 index 00000000..72523afb --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBiomes.java @@ -0,0 +1,50 @@ +package com.fouristhenumber.utilitiesinexcess; + +import java.util.function.Function; + +import net.minecraft.world.biome.BiomeGenBase; + +import com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime.BiomeGenEndOfTime; +import com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld.BiomeGenUnderWorld; +import com.fouristhenumber.utilitiesinexcess.config.dimensions.EndOfTimeConfig; +import com.fouristhenumber.utilitiesinexcess.config.dimensions.UnderWorldConfig; + +/// Adapted from [ModBlocks] +public enum ModBiomes { + // spotless:off + + // make sure to leave a trailing comma + UNDERWORLD(UnderWorldConfig.enableUnderWorldBiome, UnderWorldConfig.underWorldBiomeId, BiomeGenUnderWorld::new), + END_OF_TIME(EndOfTimeConfig.enableEndOfTimeBiome, EndOfTimeConfig.endOfTimeBiomeId, BiomeGenEndOfTime::new), + ; // leave trailing semicolon + // spotless:on + + public static void init() { + + } + + private final boolean isEnabled; + private final int biomeId; + private final BiomeGenBase biome; + + ModBiomes(boolean isEnabled, int id, Function ctor) { + this.isEnabled = isEnabled; + this.biomeId = id; + + this.biome = isEnabled ? ctor.apply(id) : null; + } + + public boolean isEnabled() { + return isEnabled; + } + + public BiomeGenBase getBiome() { + if (!isEnabled) throw new IllegalStateException("Biome " + name() + " is disabled"); + + return biome; + } + + public int getBiomeId() { + return biomeId; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java new file mode 100644 index 00000000..d6aaecc4 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -0,0 +1,255 @@ +package com.fouristhenumber.utilitiesinexcess; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockBedrockium; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockBlackoutCurtains; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockCompressed; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockConveyor; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockCursedEarth; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockDecorative; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockDecorativeGlass; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockDrum; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderLotus; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEtherealGlass; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockFloating; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockInverted; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockLapisAetherius; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockMagicWood; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockMarginallyMaximisedChest; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockPacifistsBench; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockPortalEndOfTime; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockPortalUnderWorld; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockPureLove; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockRadicallyReducedChest; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockRainMuffler; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockRedstoneClock; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockSignificantlyShrunkChest; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockSmartPump; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockSoundMuffler; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockSpike; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockTradingPost; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockTrashCanEnergy; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockTrashCanFluid; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockTrashCanItem; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockUpdateDetector; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockEnderGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockFoodGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockFurnaceGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockHighTemperatureFurnaceGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockLavaGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockLowTemperatureFurnaceGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockNetherStarGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockPinkGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockPotionGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockRedstoneGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockSolarGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockTNTGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockRetrievalNode; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockRetrievalNodeFluid; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNode; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeEnergy; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeFluid; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeHyperEnergy; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferPipe; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; +import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderLotusConfig; +import com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig; +import com.fouristhenumber.utilitiesinexcess.config.dimensions.EndOfTimeConfig; +import com.fouristhenumber.utilitiesinexcess.config.dimensions.UnderWorldConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig; + +import cpw.mods.fml.common.registry.GameRegistry; + +// Credit to Et Futurum (Requiem) +public enum ModBlocks { + // spotless:off + + // make sure to leave a trailing comma + FLOATING_BLOCK(BlockConfig.enableFloatingBlock, new BlockFloating(), BlockFloating.ItemBlockFloating.class, "floating_block"), + COMPRESSED_COBBLESTONE(BlockConfig.enableCompressedCobblestone, new BlockCompressed(Blocks.cobblestone, "compressed_cobblestone"), BlockCompressed.ItemCompressedBlock.class, "compressed_cobblestone"), + COMPRESSED_DIRT(BlockConfig.enableCompressedDirt, new BlockCompressed(Blocks.dirt, "compressed_dirt"), BlockCompressed.ItemCompressedBlock.class, "compressed_dirt"), + COMPRESSED_SAND(BlockConfig.enableCompressedSand, new BlockCompressed(Blocks.sand, "compressed_sand"), BlockCompressed.ItemCompressedBlock.class, "compressed_sand"), + COMPRESSED_GRAVEL(BlockConfig.enableCompressedGravel, new BlockCompressed(Blocks.gravel, "compressed_gravel"), BlockCompressed.ItemCompressedBlock.class, "compressed_gravel"), + COLORED_WOOD_PLANKS(BlockConfig.enableColoredBlocks, new BlockColored(Blocks.planks), BlockColored.ItemBlockColored.class, "colored_planks"), + COLORED_GLOWSTONE(BlockConfig.enableColoredBlocks, new BlockColored(Blocks.glowstone).setLightLevel(1f), BlockColored.ItemBlockColored.class, "colored_glowstone"), + COLORED_STONE(BlockConfig.enableColoredBlocks, new BlockColored(Blocks.stone), BlockColored.ItemBlockColored.class, "colored_stone"), + COLORED_COBBLESTONE(BlockConfig.enableColoredBlocks, new BlockColored(Blocks.cobblestone), BlockColored.ItemBlockColored.class, "colored_cobblestone"), + COLORED_QUARTZ_BLOCK(BlockConfig.enableColoredBlocks, new BlockColored(Blocks.quartz_block, 1f), BlockColored.ItemBlockColored.class, "colored_quartz_block"), + COLORED_SOUL_SAND(BlockConfig.enableColoredBlocks, new BlockColored(Blocks.soul_sand), BlockColored.ItemBlockColored.class, "colored_soul_sand"), + COLORED_REDSTONE_LAMP(BlockConfig.enableColoredBlocks, new BlockColored(Blocks.redstone_lamp).setLightLevel(1f), BlockColored.ItemBlockColored.class, "colored_redstone_lamp"), + COLORED_BRICKS(BlockConfig.enableColoredBlocks, new BlockColored(Blocks.brick_block), BlockColored.ItemBlockColored.class, "colored_bricks"), + COLORED_STONE_BRICKS(BlockConfig.enableColoredBlocks, new BlockColored(Blocks.stonebrick), BlockColored.ItemBlockColored.class, "colored_stone_bricks"), + COLORED_LAPIS_BLOCK(BlockConfig.enableColoredBlocks, new BlockColored(Blocks.lapis_block), BlockColored.ItemBlockColored.class, "colored_lapis_block"), + COLORED_OBSIDIAN(BlockConfig.enableColoredBlocks, new BlockColored(Blocks.obsidian), BlockColored.ItemBlockColored.class, "colored_obsidian"), + COLORED_REDSTONE_BLOCK(BlockConfig.enableColoredBlocks, new BlockColored(Blocks.redstone_block, 2f), BlockColored.ItemBlockColored.class, "colored_redstone_block"), + COLORED_COAL_BLOCK(BlockConfig.enableColoredBlocks, new BlockColored(Blocks.coal_block), BlockColored.ItemBlockColored.class, "colored_coal_block"), + REDSTONE_CLOCK(BlockConfig.enableRedstoneClock, new BlockRedstoneClock(), "redstone_clock"), + ETHEREAL_GLASS(BlockConfig.enableEtherealGlass, new BlockEtherealGlass(), BlockEtherealGlass.ItemBlockEtherealGlass.class, "ethereal_glass"), + TRASH_CAN_ITEM(BlockConfig.enableTrashCanItem, new BlockTrashCanItem(), "trash_can_item"), + TRASH_CAN_FLUID(BlockConfig.enableTrashCanFluid, new BlockTrashCanFluid(), "trash_can_fluid"), + TRASH_CAN_ENERGY(BlockConfig.enableTrashCanEnergy, new BlockTrashCanEnergy(), "trash_can_energy"), + DRUM(BlockConfig.enableDrum, new BlockDrum(16000), BlockDrum.ItemBlockDrum.class, "drum"), + SOUND_MUFFLER(BlockConfig.soundMuffler.enableSoundMuffler, new BlockSoundMuffler(), BlockSoundMuffler.ItemBlockSoundMuffler.class, "sound_muffler"), + RAIN_MUFFLER(BlockConfig.rainMuffler.enableRainMuffler, new BlockRainMuffler(), BlockRainMuffler.ItemBlockRainMuffler.class, "rain_muffler"), + MAGIC_WOOD(BlockConfig.enableMagicWood, new BlockMagicWood(), "magic_wood"), + PURE_LOVE(BlockConfig.pureLove.enablePureLove, new BlockPureLove(), BlockPureLove.ItemBlockPureLove.class, "pure_love"), + MARGINALLY_MAXIMISED_CHEST(BlockConfig.enableMarginallyMaximisedChest, new BlockMarginallyMaximisedChest(), "marginally_maximised_chest"), + SIGNIFICANTLY_SHRUNK_CHEST(BlockConfig.enableSignificantlyShrunkChest, new BlockSignificantlyShrunkChest(), "significantly_shrunk_chest"), + RADICALLY_REDUCED_CHEST(BlockConfig.enableRadicallyReducedChest, new BlockRadicallyReducedChest(), "radically_reduced_chest"), + CURSED_EARTH(CursedEarthConfig.enableCursedEarth, new BlockCursedEarth(false), BlockCursedEarth.ItemBlockCursedEarth.class, "cursed_earth"), + BLESSED_EARTH(CursedEarthConfig.enableBlessedEarth, new BlockCursedEarth(true), BlockCursedEarth.ItemBlockCursedEarth.class, "blessed_earth"), + LAPIS_AETHERIUS(BlockConfig.enableLapisAetherius, new BlockLapisAetherius(), BlockLapisAetherius.ItemLapisAetherius.class, "lapis_aetherius"), + BEDROCKIUM_BLOCK(ItemConfig.enableBedrockium, new BlockBedrockium(), BlockBedrockium.ItemBlockBedrockium.class, "bedrockium_block"), + INVERTED_BLOCK(InversionConfig.enableInvertedIngot, new BlockInverted(), "inverted_block"), + LOW_TEMPERATURE_FURNACE_GENERATOR(GeneratorConfig.enableLowTemperatureFurnaceGenerator, new BlockLowTemperatureFurnaceGenerator("low_temperature_furnace_generator", 1), "low_temperature_furnace_generator"), + LOW_TEMPERATURE_FURNACE_GENERATOR_PLUS(GeneratorConfig.enableLowTemperatureFurnaceGenerator, new BlockLowTemperatureFurnaceGenerator("low_temperature_furnace_generator_plus", 8), "low_temperature_furnace_generator_plus"), + LOW_TEMPERATURE_FURNACE_GENERATOR_PLUSPLUS(GeneratorConfig.enableLowTemperatureFurnaceGenerator, new BlockLowTemperatureFurnaceGenerator("low_temperature_furnace_generator_plusplus", 64), "low_temperature_furnace_generator_plusplus"), + FURNACE_GENERATOR(GeneratorConfig.enableFurnaceGenerator, new BlockFurnaceGenerator("furnace_generator", 1), "furnace_generator"), + FURNACE_GENERATOR_PLUS(GeneratorConfig.enableFurnaceGenerator, new BlockFurnaceGenerator("furnace_generator_plus", 8), "furnace_generator_plus"), + FURNACE_GENERATOR_PLUSPLUS(GeneratorConfig.enableFurnaceGenerator, new BlockFurnaceGenerator("furnace_generator_plusplus", 64), "furnace_generator_plusplus"), + HIGH_TEMPERATURE_FURNACE_GENERATOR(GeneratorConfig.enableHighTemperatureFurnaceGenerator, new BlockHighTemperatureFurnaceGenerator("high_temperature_furnace_generator", 1), "high_temperature_furnace_generator"), + HIGH_TEMPERATURE_FURNACE_GENERATOR_PLUS(GeneratorConfig.enableHighTemperatureFurnaceGenerator, new BlockHighTemperatureFurnaceGenerator("high_temperature_furnace_generator_plus", 8), "high_temperature_furnace_generator_plus"), + HIGH_TEMPERATURE_FURNACE_GENERATOR_PLUSPLUS(GeneratorConfig.enableHighTemperatureFurnaceGenerator, new BlockHighTemperatureFurnaceGenerator("high_temperature_furnace_generator_plusplus", 64), "high_temperature_furnace_generator_plusplus"), + LAVA_GENERATOR(GeneratorConfig.enableLavaGenerator, new BlockLavaGenerator("lava_generator", 1), "lava_generator"), + LAVA_GENERATOR_PLUS(GeneratorConfig.enableLavaGenerator, new BlockLavaGenerator("lava_generator_plus", 8), "lava_generator_plus"), + LAVA_GENERATOR_PLUSPLUS(GeneratorConfig.enableLavaGenerator, new BlockLavaGenerator("lava_generator_plusplus", 64), "lava_generator_plusplus"), + ENDER_GENERATOR(GeneratorConfig.enableEnderGenerator, new BlockEnderGenerator("ender_generator", 1), "ender_generator"), + ENDER_GENERATOR_PLUS(GeneratorConfig.enableEnderGenerator, new BlockEnderGenerator("ender_generator_plus", 8), "ender_generator_plus"), + ENDER_GENERATOR_PLUSPLUS(GeneratorConfig.enableEnderGenerator, new BlockEnderGenerator("ender_generator_plusplus", 64), "ender_generator_plusplus"), + REDSTONE_GENERATOR(GeneratorConfig.enableRedstoneGenerator, new BlockRedstoneGenerator("redstone_generator", 1), "redstone_generator"), + REDSTONE_GENERATOR_PLUS(GeneratorConfig.enableRedstoneGenerator, new BlockRedstoneGenerator("redstone_generator_plus", 8), "redstone_generator_plus"), + REDSTONE_GENERATOR_PLUSPLUS(GeneratorConfig.enableRedstoneGenerator, new BlockRedstoneGenerator("redstone_generator_plusplus", 64), "redstone_generator_plusplus"), + FOOD_GENERATOR(GeneratorConfig.enableFoodGenerator, new BlockFoodGenerator("food_generator", 1), "food_generator"), + FOOD_GENERATOR_PLUS(GeneratorConfig.enableFoodGenerator, new BlockFoodGenerator("food_generator_plus", 8), "food_generator_plus"), + FOOD_GENERATOR_PLUSPLUS(GeneratorConfig.enableFoodGenerator, new BlockFoodGenerator("food_generator_plusplus", 64), "food_generator_plusplus"), + POTION_GENERATOR(GeneratorConfig.enablePotionGenerator, new BlockPotionGenerator("potion_generator", 1), "potion_generator"), + POTION_GENERATOR_PLUS(GeneratorConfig.enablePotionGenerator, new BlockPotionGenerator("potion_generator_plus", 8), "potion_generator_plus"), + POTION_GENERATOR_PLUSPLUS(GeneratorConfig.enablePotionGenerator, new BlockPotionGenerator("potion_generator_plusplus", 64), "potion_generator_plusplus"), + SOLAR_GENERATOR(GeneratorConfig.enableSolarGenerator, new BlockSolarGenerator("solar_generator", 1), "solar_generator"), + SOLAR_GENERATOR_PLUS(GeneratorConfig.enableSolarGenerator, new BlockSolarGenerator("solar_generator_plus", 8), "solar_generator_plus"), + SOLAR_GENERATOR_PLUSPLUS(GeneratorConfig.enableSolarGenerator, new BlockSolarGenerator("solar_generator_plusplus", 64), "solar_generator_plusplus"), + TNT_GENERATOR(GeneratorConfig.enableTNTGenerator, new BlockTNTGenerator("tnt_generator", 1), "tnt_generator"), + TNT_GENERATOR_PLUS(GeneratorConfig.enableTNTGenerator, new BlockTNTGenerator("tnt_generator_plus", 8), "tnt_generator_plus"), + TNT_GENERATOR_PLUSPLUS(GeneratorConfig.enableTNTGenerator, new BlockTNTGenerator("tnt_generator_plusplus", 64), "tnt_generator_plusplus"), + PINK_GENERATOR(GeneratorConfig.enablePinkGenerator, new BlockPinkGenerator("pink_generator", 1), "pink_generator"), + PINK_GENERATOR_PLUS(GeneratorConfig.enablePinkGenerator, new BlockPinkGenerator("pink_generator_plus", 8), "pink_generator_plus"), + PINK_GENERATOR_PLUSPLUS(GeneratorConfig.enablePinkGenerator, new BlockPinkGenerator("pink_generator_plusplus", 64), "pink_generator_plusplus"), + NETHER_STAR_GENERATOR(GeneratorConfig.enableNetherStarGenerator, new BlockNetherStarGenerator("nether_star_generator", 1), "nether_star_generator"), + NETHER_STAR_GENERATOR_PLUS(GeneratorConfig.enableNetherStarGenerator, new BlockNetherStarGenerator("nether_star_generator_plus", 8), "nether_star_generator_plus"), + NETHER_STAR_GENERATOR_PLUSPLUS(GeneratorConfig.enableNetherStarGenerator, new BlockNetherStarGenerator("nether_star_generator_plusplus", 64), "nether_star_generator_plusplus"), + BLOCK_UPDATE_DETECTOR(BlockConfig.enableBlockUpdateDetector, new BlockUpdateDetector(), "block_update_detector"), + ENDER_LOTUS(EnderLotusConfig.enableEnderLotus, new BlockEnderLotus(), null, "ender_lotus"), + BLACKOUT_CURTAINS(BlockConfig.enableBlackoutCurtains, new BlockBlackoutCurtains(), "blackout_curtains"), + CONVEYOR(BlockConfig.enableConveyor, new BlockConveyor(), BlockConveyor.ItemBlockConveyor.class, "conveyor"), + SPIKE_WOOD(BlockConfig.spikes.enableWoodenSpike, new BlockSpike(BlockSpike.SpikeType.WOOD, "wood_spike"), BlockSpike.ItemSpike.class, "wood_spike"), + SPIKE_IRON(BlockConfig.spikes.enableIronSpike, new BlockSpike(BlockSpike.SpikeType.IRON, "iron_spike"), BlockSpike.ItemSpike.class, "iron_spike"), + SPIKE_GOLD(BlockConfig.spikes.enableGoldSpike, new BlockSpike(BlockSpike.SpikeType.GOLD, "gold_spike"), BlockSpike.ItemSpike.class, "gold_spike"), + SPIKE_DIAMOND(BlockConfig.spikes.enableDiamondSpike, new BlockSpike(BlockSpike.SpikeType.DIAMOND, "diamond_spike"), BlockSpike.ItemSpike.class, "diamond_spike"), + UNDERWORLD_PORTAL(BlockConfig.enableUnderWorldPortal && UnderWorldConfig.enableUnderWorld, new BlockPortalUnderWorld(), "underworld_portal"), + END_OF_TIME_PORTAL(BlockConfig.enableEndOfTimePortal && EndOfTimeConfig.enableEndOfTime, new BlockPortalEndOfTime(), BlockPortalEndOfTime.ItemBlockPortalEndOfTime.class, "temporal_gate"), + DECORATIVE_GLASS(BlockConfig.enableDecorativeGlass, new BlockDecorativeGlass(), BlockDecorativeGlass.ItemBlockDecorativeGlass.class, "decorative_glass"), + PACIFISTS_BENCH(BlockConfig.enablePacifistsBench, new BlockPacifistsBench(), "pacifists_bench"), + SMART_PUMP(BlockConfig.enableSmartPump, new BlockSmartPump(), "smart_pump"), + TRADING_POST(BlockConfig.enableTradingPost, new BlockTradingPost(), "trading_post"), + DECORATIVE_BLOCKS(BlockConfig.enableDecorativeBlocks, new BlockDecorative(), BlockDecorative.ItemBlockDecorative.class, "decorative_block"), + //TODO: Config + TRANSFER_PIPE(true, new BlockTransferPipe(), "transfer_pipe"), + TRANSFER_NODE(true, new BlockTransferNode(), "transfer_node"), + TRANSFER_NODE_FLUID(true, new BlockTransferNodeFluid(), "transfer_node_fluid"), + TRANSFER_NODE_ENERGY(true, new BlockTransferNodeEnergy(), "transfer_node_energy"), + TRANSFER_NODE_HYPER_ENERGY(true, new BlockTransferNodeHyperEnergy(), "transfer_node_hyper_energy"), + RETRIEVAL_NODE(true, new BlockRetrievalNode(), "retrieval_node"), + RETRIEVAL_NODE_FLUID(true, new BlockRetrievalNodeFluid(), "retrieval_node_fluid"), + ; // leave trailing semicolon + // spotless:on + + public static final ModBlocks[] VALUES = values(); + + public static void init() { + for (ModBlocks block : VALUES) { + if (block.isEnabled()) { + block.theBlock.setCreativeTab(UtilitiesInExcess.uieTab); + if (block.getItemBlock() != null || !block.getHasItemBlock()) { + GameRegistry.registerBlock(block.get(), block.getItemBlock(), block.name); + // This part is used if the getItemBlock() is not ItemBlock.class, so we register a custom ItemBlock + // class as the ItemBlock + // It is also used if the getItemBlock() == null and getHasItemBlock() is false, meaning we WANT to + // register it as null, making the block have no inventory item. + } else { + GameRegistry.registerBlock(block.get(), block.name); + // Used if getItemBlock() == null but getHasItemBlock() is true, registering it with a default + // inventory item. + } + } + } + } + + private final boolean isEnabled; + private final Block theBlock; + /** + * null == default ItemBlock + */ + private final Class itemBlock; + /** + * Determines if we should register the block with an ItemBlock. + * Set to false when the constructor that specifies the ItemBlock is specifically set to false. + */ + private boolean hasItemBlock; + private final String name; + + ModBlocks(Boolean enabled, Block block, String name) { + this(enabled, block, null, name); + hasItemBlock = true; + } + + ModBlocks(Boolean enabled, Block block, Class iblock, String name) { + isEnabled = enabled; + theBlock = block; + itemBlock = iblock; + hasItemBlock = iblock != null; + this.name = name; + } + + /** + * If this is false, the block is initialized without an inventory item, or ItemBlock. + */ + public boolean getHasItemBlock() { + return hasItemBlock; + } + + public Block get() { + return theBlock; + } + + public Class getItemBlock() { + return itemBlock; + } + + public Item getItem() { + return Item.getItemFromBlock(get()); + } + + public boolean isEnabled() { + return isEnabled; + } + + public ItemStack newItemStack() { + return newItemStack(1); + } + + public ItemStack newItemStack(int count) { + return newItemStack(count, 0); + } + + public ItemStack newItemStack(int count, int meta) { + return new ItemStack(this.get(), count, meta); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModDimensions.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModDimensions.java new file mode 100644 index 00000000..e7703923 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModDimensions.java @@ -0,0 +1,57 @@ +package com.fouristhenumber.utilitiesinexcess; + +import net.minecraft.world.WorldProvider; +import net.minecraftforge.common.DimensionManager; + +import com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime.WorldProviderEndOfTime; +import com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld.WorldProviderUnderWorld; +import com.fouristhenumber.utilitiesinexcess.config.dimensions.EndOfTimeConfig; +import com.fouristhenumber.utilitiesinexcess.config.dimensions.UnderWorldConfig; + +/// Adapted from [ModBlocks] +public enum ModDimensions { + // spotless:off + + // make sure to leave a trailing comma + UNDERWORLD(UnderWorldConfig.enableUnderWorld, UnderWorldConfig.underWorldDimensionId, WorldProviderUnderWorld.class), + END_OF_TIME(EndOfTimeConfig.enableEndOfTime, EndOfTimeConfig.endOfTimeDimensionId, WorldProviderEndOfTime.class), + ; // leave trailing semicolon + // spotless:on + + public static final ModDimensions[] VALUES = values(); + + public static void init() { + for (ModDimensions dimension : VALUES) { + if (dimension.isEnabled()) { + DimensionManager.registerProviderType(dimension.providerId, dimension.provider, dimension.keepLoaded); + DimensionManager.registerDimension(dimension.dimensionId, dimension.providerId); + } + } + } + + private final boolean isEnabled; + private final int providerId, dimensionId; + /** + * null == default ItemBlock + */ + private final Class provider; + private final boolean keepLoaded; + + ModDimensions(boolean isEnabled, int id, Class provider) { + this(isEnabled, id, id, provider, false); + } + + ModDimensions(boolean isEnabled, int providerId, int dimensionId, Class provider, + boolean keepLoaded) { + this.isEnabled = isEnabled; + this.providerId = providerId; + this.dimensionId = dimensionId; + this.provider = provider; + this.keepLoaded = keepLoaded; + } + + public boolean isEnabled() { + return isEnabled; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java new file mode 100644 index 00000000..b77327ef --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java @@ -0,0 +1,124 @@ +package com.fouristhenumber.utilitiesinexcess; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; + +import com.fouristhenumber.utilitiesinexcess.common.items.ItemAnalyzer; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemArchitectsWand; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemBedrockiumIngot; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemDisabled; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemEnderLotusSeed; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemFireBattery; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemGlove; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemGoldenBag; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemHeavenlyRing; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemInversionSigilActive; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemInversionSigilInactive; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemInvertedIngot; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemMobJar; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemPseudoInversionSigil; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemWateringCan; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemXRayGlasses; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemAntiParticulateShovel; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemDestructionPickaxe; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemEthericSword; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemGluttonsAxe; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemPrecisionShears; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemReversingHoe; +import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderLotusConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.FireBatteryConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.WateringCanConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.AntiParticulateShovelConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.EthericSwordConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GluttonsAxeConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.PrecisionShearsConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.ReversingHoeConfig; + +import cpw.mods.fml.common.registry.GameRegistry; + +// Credit to Et Futurum (Requiem) +public enum ModItems { + // spotless:off + + // make sure to leave a trailing comma + GLUTTONS_AXE(GluttonsAxeConfig.enable, new ItemGluttonsAxe(), "gluttons_axe"), + DESTRUCTION_PICKAXE(DestructionPickaxeConfig.enable, new ItemDestructionPickaxe(), "destruction_pickaxe"), + ANTI_PARTICULATE_SHOVEL(AntiParticulateShovelConfig.enable, new ItemAntiParticulateShovel(), "anti_particulate_shovel"), + PRECISION_SHEARS(PrecisionShearsConfig.enable, new ItemPrecisionShears(), "precision_shears"), + ETHERIC_SWORD(EthericSwordConfig.enable, new ItemEthericSword(), "etheric_sword"), + REVERSING_HOE(ReversingHoeConfig.enable, new ItemReversingHoe(), "reversing_hoe"), + HEAVENLY_RING(ItemConfig.enableHeavenlyRing, new ItemHeavenlyRing(), "heavenly_ring"), + MOB_JAR(ItemConfig.enableMobJar, new ItemMobJar(), "mob_jar"), + WATERING_CAN_BASIC(WateringCanConfig.wateringCan.Tier.enableWateringCanBasic, new ItemWateringCan(1,3), "watering_can_basic"), + WATERING_CAN_ADVANCED(WateringCanConfig.wateringCan.Tier.enableWateringCanAdvanced, new ItemWateringCan(2,5), "watering_can_advanced"), + WATERING_CAN_ELITE(WateringCanConfig.wateringCan.Tier.enableWateringCanElite, new ItemWateringCan(3,7), "watering_can_elite"), + INVERSION_SIGIL_INACTIVE(InversionConfig.enableInversionSigil, new ItemInversionSigilInactive(), "inversion_sigil_inactive"), + INVERSION_SIGIL_ACTIVE(InversionConfig.enableInversionSigil, new ItemInversionSigilActive(), "inversion_sigil_active"), + PSEUDO_INVERSION_SIGIL(InversionConfig.enableInversionSigil, new ItemPseudoInversionSigil(), "pseudo_inversion_sigil"), + INVERTED_INGOT(InversionConfig.enableInvertedIngot, new ItemInvertedIngot(), "inverted_ingot"), + INVERTED_NUGGET(InversionConfig.enableInvertedIngot, new ItemInvertedIngot.InvertedNugget(), "inverted_nugget"), + ARCHITECTS_WAND(ItemConfig.enableArchitectsWand, new ItemArchitectsWand(ItemConfig.architectsWandBuildLimit).setTextureName("utilitiesinexcess:architects_wand"), "architects_wand"), + SUPER_ARCHITECTS_WAND(ItemConfig.enableSuperArchitectsWand, new ItemArchitectsWand(ItemConfig.superArchitectsWandBuildLimit).setTextureName("utilitiesinexcess:super_architects_wand"), "super_architects_wand"), + BEDROCKIUM_INGOT(ItemConfig.enableBedrockium, new ItemBedrockiumIngot().setUnlocalizedName("bedrockium_ingot").setTextureName("utilitiesinexcess:bedrockium_ingot"), "bedrockium_ingot"), + FIRE_BATTERY(FireBatteryConfig.enableFireBattery, new ItemFireBattery(), "fire_battery"), + GOLDEN_BAG(ItemConfig.enableGoldenBagOfHolding, new ItemGoldenBag(), "golden_bag"), + ENDER_LOTUS_SEED(EnderLotusConfig.enableEnderLotus, new ItemEnderLotusSeed(ModBlocks.ENDER_LOTUS.get()), "ender_lotus_seed"), + XRAY_GLASSES(ItemConfig.enableXRayGlasses, new ItemXRayGlasses(ItemArmor.ArmorMaterial.IRON, 0, 0), "xray_glasses"), + BLOCK_ANALYZER(ItemConfig.enableBlockAnalyzer, new ItemAnalyzer(), "block_analyzer"), + GLOVE(ItemConfig.enableGlove, new ItemGlove(), "glove"), + // todo config + UPGRADE(true, new ItemUpgrade(), "upgrade"), + + + ; // leave trailing semicolon + // spotless:on + + public static final ModItems[] VALUES = values(); + + public static void init() { + for (ModItems item : VALUES) { + if (item.isEnabled()) { + item.theItem.setCreativeTab(UtilitiesInExcess.uieTab); + GameRegistry.registerItem(item.get(), item.name); + } else if (ItemConfig.registerDisabledItems) GameRegistry.registerItem(item.disabledVersion, item.name); + } + } + + private final boolean isEnabled; + private final Item theItem; + private final String name; + private final ItemDisabled disabledVersion; + + ModItems(boolean enabled, Item item, String name) { + this.isEnabled = enabled; + theItem = item; + this.name = name; + if (ItemConfig.registerDisabledItems) disabledVersion = new ItemDisabled(theItem); + else disabledVersion = null; + } + + public boolean isEnabled() { + return isEnabled; + } + + public Item get() { + return theItem; + } + + public ItemStack newItemStack() { + return newItemStack(1); + } + + public ItemStack newItemStack(int count) { + return newItemStack(count, 0); + } + + public ItemStack newItemStack(int count, int meta) { + return new ItemStack(this.get(), count, meta); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java new file mode 100644 index 00000000..56339537 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -0,0 +1,238 @@ +package com.fouristhenumber.utilitiesinexcess; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityRetrievalNode; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.WeightedRandomChestContent; +import net.minecraftforge.common.ChestGenHooks; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.MinecraftForge; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.fouristhenumber.utilitiesinexcess.common.recipe.RecipeLoader; +import com.fouristhenumber.utilitiesinexcess.common.renderers.BlackoutCurtainsRenderer; +import com.fouristhenumber.utilitiesinexcess.common.renderers.LapisAetheriusRenderer; +import com.fouristhenumber.utilitiesinexcess.common.renderers.SpikeRenderer; +import com.fouristhenumber.utilitiesinexcess.common.renderers.transfer.TransferNodeRenderer; +import com.fouristhenumber.utilitiesinexcess.common.renderers.transfer.TransferPipeRenderer; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityBlockUpdateDetector; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityConveyor; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityMarginallyMaximisedChest; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPacifistsBench; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPureLove; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRadicallyReducedChest; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRainMuffler; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRedstoneClock; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySignificantlyShrunkChest; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySmartPump; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySoundMuffler; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySpike; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTradingPost; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanEnergy; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanFluid; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanItem; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityEnderGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityFoodGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityFurnaceGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityHighTemperatureFurnaceGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityLavaGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityLowTemperatureFurnaceGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityNetherStarGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityPinkGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityPotionGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityRedstoneGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntitySolarGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityTNTGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeFluid; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; +import com.fouristhenumber.utilitiesinexcess.common.worldgen.WorldGenEnderLotus; +import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.compat.crafttweaker.QEDCraftTweakerSupport; +import com.fouristhenumber.utilitiesinexcess.compat.tinkers.TinkersCompat; +import com.fouristhenumber.utilitiesinexcess.config.OtherConfig; +import com.fouristhenumber.utilitiesinexcess.utils.FMLEventHandler; +import com.fouristhenumber.utilitiesinexcess.utils.ForgeEventHandler; +import com.fouristhenumber.utilitiesinexcess.utils.PinkFuelHelper; +import com.fouristhenumber.utilitiesinexcess.utils.PumpChunkLoadingCallback; + +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.SidedProxy; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.event.FMLServerStartingEvent; +import cpw.mods.fml.common.registry.GameRegistry; +import minetweaker.MineTweakerAPI; + +@Mod( + modid = UtilitiesInExcess.MODID, + version = Tags.VERSION, + name = "UtilitiesInExcess", + acceptedMinecraftVersions = "[1.7.10]", + dependencies = "required-after:gtnhlib@[0.6.31,)") +public class UtilitiesInExcess { + + public static final String MODID = "utilitiesinexcess"; + public static final Logger LOG = LogManager.getLogger(MODID); + + @Mod.Instance(MODID) + public static UtilitiesInExcess uieInstance; + + public static int lapisAetheriusRenderID; + public static int blackoutCurtainsRenderID; + public static int spikeRenderID; + public static int transferPipeRenderID; + public static int transferNodeRenderID; + + @SidedProxy( + clientSide = "com.fouristhenumber.utilitiesinexcess.ClientProxy", + serverSide = "com.fouristhenumber.utilitiesinexcess.CommonProxy") + public static CommonProxy proxy; + + @Mod.EventHandler + public void preInit(FMLPreInitializationEvent event) { + GameRegistry.registerTileEntity(TileEntitySpike.class, "utilitiesinexcess:TileEntitySpike"); + proxy.preInit(event); + } + + @Mod.EventHandler + public void init(FMLInitializationEvent event) { + proxy.init(event); + + RecipeLoader.run(); + + MinecraftForge.EVENT_BUS.register(new ForgeEventHandler()); + FMLCommonHandler.instance() + .bus() + .register(new FMLEventHandler()); + + GameRegistry.registerTileEntity(TileEntityRedstoneClock.class, "TileEntityRedstoneClockUIE"); + GameRegistry.registerTileEntity(TileEntityTrashCanItem.class, "TileEntityTrashCanItemUIE"); + GameRegistry.registerTileEntity(TileEntityTrashCanFluid.class, "TileEntityTrashCanFluidUIE"); + GameRegistry.registerTileEntity(TileEntityTrashCanEnergy.class, "TileEntityTrashCanEnergyUIE"); + GameRegistry.registerTileEntity(TileEntityDrum.class, "TileEntityDrumUIE"); + GameRegistry.registerTileEntity(TileEntityPureLove.class, "TileEntityPureLoveUIE"); + GameRegistry + .registerTileEntity(TileEntityMarginallyMaximisedChest.class, "TileEntityMarginallyMaximisedChestUIE"); + GameRegistry + .registerTileEntity(TileEntitySignificantlyShrunkChest.class, "TileEntitySignificantlyShrunkChestUIE"); + GameRegistry.registerTileEntity(TileEntityRadicallyReducedChest.class, "TileEntityRadicallyReducedChestUIE"); + GameRegistry.registerTileEntity(TileEntitySoundMuffler.class, "TileEntitySoundMufflerUIE"); + GameRegistry.registerTileEntity(TileEntityRainMuffler.class, "TileEntityRainMufflerUIE"); + GameRegistry.registerTileEntity(TileEntityBlockUpdateDetector.class, "TileEntityBlockUpdateDetector"); + GameRegistry.registerTileEntity(TileEntityConveyor.class, "TileEntityConveyor"); + GameRegistry.registerTileEntity(TileEntityPortalUnderWorld.class, "TileEntityPortalUnderWorld"); + GameRegistry.registerTileEntity(TileEntityBlockUpdateDetector.class, "TileEntityBlockUpdateDetectorUIE"); + GameRegistry.registerTileEntity(TileEntityConveyor.class, "TileEntityConveyorUIE"); + GameRegistry.registerTileEntity(TileEntityPortalUnderWorld.class, "TileEntityPortalUnderWorldUIE"); + GameRegistry.registerTileEntity(TileEntitySmartPump.class, "TileEntitySmartPumpUIE"); + GameRegistry.registerTileEntity( + TileEntityLowTemperatureFurnaceGenerator.class, + "TileEntityLowTemperatureFurnaceGeneratorUIE"); + GameRegistry.registerTileEntity(TileEntityFurnaceGenerator.class, "TileEntityFurnaceGeneratorUIE"); + GameRegistry.registerTileEntity( + TileEntityHighTemperatureFurnaceGenerator.class, + "TileEntityHighTemperatureFurnaceGeneratorUIE"); + GameRegistry.registerTileEntity(TileEntityLavaGenerator.class, "TileEntityLavaGeneratorUIE"); + GameRegistry.registerTileEntity(TileEntityEnderGenerator.class, "TileEntityEnderGeneratorUIE"); + GameRegistry.registerTileEntity(TileEntityRedstoneGenerator.class, "TileEntityRedstoneGeneratorUIE"); + GameRegistry.registerTileEntity(TileEntityFoodGenerator.class, "TileEntityFoodGeneratorUIE"); + GameRegistry.registerTileEntity(TileEntityPotionGenerator.class, "TileEntityPotionGeneratorUIE"); + GameRegistry.registerTileEntity(TileEntitySolarGenerator.class, "TileEntitySolarGeneratorUIE"); + GameRegistry.registerTileEntity(TileEntityTNTGenerator.class, "TileEntityTNTGeneratorUIE"); + GameRegistry.registerTileEntity(TileEntityPinkGenerator.class, "TileEntityPinkGeneratorUIE"); + GameRegistry.registerTileEntity(TileEntityNetherStarGenerator.class, "TileEntityNetherStarGeneratorUIE"); + GameRegistry.registerTileEntity(TileEntityPacifistsBench.class, "TileEntityPacifistsBenchUIE"); + GameRegistry.registerTileEntity(TileEntityTradingPost.class, "TileEntityTradingPostUIE"); + GameRegistry.registerTileEntity(TileEntityTransferPipe.class, "TileEntityTransferPipeUIE"); + GameRegistry.registerTileEntity(TileEntityRetrievalNode.class,"TileEntityRetrievalNodeUIE"); // not sure if i did the naming correctly + GameRegistry.registerTileEntity(TileEntityTransferNode.class, "TileEntityTransferNodeUIE"); + GameRegistry.registerTileEntity(TileEntityTransferNodeFluid.class, "TileEntityTransferNodeFluidUIE"); + + lapisAetheriusRenderID = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerBlockHandler(new LapisAetheriusRenderer()); + blackoutCurtainsRenderID = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerBlockHandler(new BlackoutCurtainsRenderer()); + spikeRenderID = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerBlockHandler(new SpikeRenderer()); + transferPipeRenderID = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerBlockHandler(new TransferPipeRenderer()); + transferNodeRenderID = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerBlockHandler(new TransferNodeRenderer()); + + GameRegistry.registerWorldGenerator(new WorldGenEnderLotus(), 10); + + if (ModItems.ENDER_LOTUS_SEED.isEnabled()) { + ChestGenHooks.addItem( + ChestGenHooks.DUNGEON_CHEST, + new WeightedRandomChestContent(ModItems.ENDER_LOTUS_SEED.get(), 0, 1, 2, 8)); + } + if (ModItems.INVERSION_SIGIL_INACTIVE.isEnabled()) { + ChestGenHooks.addItem( + ChestGenHooks.DUNGEON_CHEST, + new WeightedRandomChestContent(ModItems.INVERSION_SIGIL_INACTIVE.get(), 0, 1, 1, 2)); + ChestGenHooks.addItem( + ChestGenHooks.MINESHAFT_CORRIDOR, + new WeightedRandomChestContent(ModItems.INVERSION_SIGIL_INACTIVE.get(), 0, 1, 1, 1)); + ChestGenHooks.addItem( + ChestGenHooks.PYRAMID_DESERT_CHEST, + new WeightedRandomChestContent(ModItems.INVERSION_SIGIL_INACTIVE.get(), 0, 1, 1, 2)); + ChestGenHooks.addItem( + ChestGenHooks.STRONGHOLD_CORRIDOR, + new WeightedRandomChestContent(ModItems.INVERSION_SIGIL_INACTIVE.get(), 0, 1, 1, 2)); + ChestGenHooks.addItem( + ChestGenHooks.STRONGHOLD_CROSSING, + new WeightedRandomChestContent(ModItems.INVERSION_SIGIL_INACTIVE.get(), 0, 1, 1, 1)); + } + + if (ModBlocks.SMART_PUMP.isEnabled()) { + ForgeChunkManager.setForcedChunkLoadingCallback(uieInstance, new PumpChunkLoadingCallback()); + } + + if (ModBlocks.PINK_GENERATOR.isEnabled()) { + PinkFuelHelper.scanRecipesForPinkFuel(); + } + + if (Mods.CraftTweaker.isLoaded()) { + MineTweakerAPI.registerClass(QEDCraftTweakerSupport.class); + } + } + + @Mod.EventHandler + public void postInit(FMLPostInitializationEvent event) { + proxy.postInit(event); + + if (Mods.Tinkers.isLoaded() && OtherConfig.enableTinkersIntegration) { + TinkersCompat.init(); + } + } + + @Mod.EventHandler + public void serverStarting(FMLServerStartingEvent event) { + proxy.serverStarting(event); + } + + public static CreativeTabs uieTab = new CreativeTabs(MODID) { + + @Override + public Item getTabIconItem() { + return this.getIconItemStack() + .getItem(); + } + + public static final ItemStack ICON_ITEM = new ItemStack(ModItems.GLUTTONS_AXE.get()); + + @Override + public ItemStack getIconItemStack() { + return ICON_ITEM; + } + }; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/api/QEDRecipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/api/QEDRecipe.java new file mode 100644 index 00000000..596c64ab --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/api/QEDRecipe.java @@ -0,0 +1,83 @@ +package com.fouristhenumber.utilitiesinexcess.api; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +public class QEDRecipe { + + private final Object[] inputs; + private final ItemStack output; + + public QEDRecipe(Object[] inputs, ItemStack output) { + this.inputs = inputs; + this.output = output; + } + + public ItemStack getOutput() { + return this.output; + } + + public Object[] getInputs() { + return inputs; + } + + public boolean matches(InventoryCrafting inv) { + for (int row = 0; row < 3; row++) { + for (int col = 0; col < 3; col++) { + Object rawRecipeInput = this.inputs[row + col * 3]; + ItemStack providedInput = inv.getStackInRowAndColumn(row, col); + + if (rawRecipeInput == null && providedInput == null) continue; + if (rawRecipeInput == null || providedInput == null) return false; + + if (rawRecipeInput instanceof ItemStack recipeInput) { + if (recipeInput.getItem() != providedInput.getItem()) { + return false; + } + + if (recipeInput.getItemDamage() != providedInput.getItemDamage()) { + return recipeInput.getItemDamage() == OreDictionary.WILDCARD_VALUE; + } + } else if (rawRecipeInput instanceof ItemStack[]ores) { + boolean matched = false; + for (ItemStack ore : ores) { + if (OreDictionary.itemMatches(ore, providedInput, false)) { + matched = true; + break; + } + } + + if (!matched) { + return false; + } + } + + } + } + + return true; + } + + public boolean containsInput(ItemStack testStack) { + for (Object rawInput : this.inputs) { + if (rawInput instanceof ItemStack inputStack) { + if (ItemStack.areItemStacksEqual(inputStack, testStack)) { + return true; + } + } else if (rawInput instanceof ItemStack[]inputStacks) { + for (ItemStack inputStack : inputStacks) { + if (ItemStack.areItemStacksEqual(inputStack, testStack)) { + return true; + } + } + } + } + return false; + } + + public ItemStack getResult() { + return this.getOutput() + .copy(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/api/QEDRegistry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/api/QEDRegistry.java new file mode 100644 index 00000000..696795c1 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/api/QEDRegistry.java @@ -0,0 +1,114 @@ +package com.fouristhenumber.utilitiesinexcess.api; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.fouristhenumber.utilitiesinexcess.common.recipe.DisableableItemStack; + +import it.unimi.dsi.fastutil.chars.Char2ObjectMap; +import it.unimi.dsi.fastutil.chars.Char2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.ObjectList; +import it.unimi.dsi.fastutil.objects.ObjectLists; + +public final class QEDRegistry { + + private static final QEDRegistry REGISTRY = new QEDRegistry(); + + private final ObjectList recipes = new ObjectArrayList<>(); + + private QEDRegistry() {} + + public static QEDRegistry instance() { + return REGISTRY; + } + + public void addRecipe(ItemStack output, String[] pattern, Object... inputs) { + verifyPattern(pattern); + + // Parse the input mapping + Char2ObjectMap mapping = new Char2ObjectOpenHashMap<>(); + for (int i = 0; i < inputs.length; i += 2) { + char symbol = (char) inputs[i]; + Object rawInput = inputs[i + 1]; + + if (rawInput instanceof Item item) { + mapping.put(symbol, new ItemStack(item)); + } else if (rawInput instanceof Block block) { + mapping.put(symbol, new ItemStack(block, 1, OreDictionary.WILDCARD_VALUE)); + } else if (rawInput instanceof ItemStack stack) { + mapping.put(symbol, stack.copy()); + } else if (rawInput instanceof DisableableItemStack stack) { + mapping.put(symbol, stack.theStack); + } else if (rawInput instanceof ModItems item) { + mapping.put(symbol, item.newItemStack()); + } else if (rawInput instanceof ModBlocks block) { + mapping.put(symbol, block.newItemStack()); + } else if (rawInput instanceof String ore) { + mapping.put( + symbol, + OreDictionary.getOres(ore) + .toArray(new ItemStack[0])); + } + } + + // Build the input array, a 3x3 going left->right then top->bottom + Object[] inputArray = new Object[9]; + for (int row = 0; row < 3; row++) { + for (int col = 0; col < 3; col++) { + char symbol = pattern[row].charAt(col); + + if (mapping.containsKey(symbol)) { + inputArray[row * 3 + col] = mapping.get(symbol); + } else { + inputArray[row * 3 + col] = null; + } + } + } + + QEDRecipe qedRecipe = new QEDRecipe(inputArray, output); + this.recipes.add(qedRecipe); + } + + public void addRecipe(QEDRecipe recipe) { + this.recipes.add(recipe); + } + + private void verifyPattern(String[] pattern) { + if (pattern == null || pattern.length != 3 + || pattern[0].length() != 3 + || pattern[1].length() != 3 + || pattern[2].length() != 3) { + throw new IllegalArgumentException("QED recipe pattern must be 3 strings each with 3 characters"); + } + } + + public void removeRecipe(ItemStack output) { + this.recipes.removeIf(recipe -> ItemStack.areItemStacksEqual(recipe.getOutput(), output)); + } + + public ItemStack findRecipe(InventoryCrafting inv, boolean consume) { + for (QEDRecipe recipe : this.recipes) { + if (recipe.matches(inv)) { + if (consume) { + for (int i = 0; i < 9; i++) { + inv.decrStackSize(i, 1); + } + } + return recipe.getResult(); + } + } + return null; + } + + public List getAllRecipes() { + return ObjectLists.unmodifiable(this.recipes); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java new file mode 100644 index 00000000..40d8437a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java @@ -0,0 +1,195 @@ +package com.fouristhenumber.utilitiesinexcess.client; + +import net.minecraft.nbt.NBTTagCompound; + +import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; + +import cpw.mods.fml.common.event.FMLInterModComms; + +public class IMCForNEI { + + public static void IMCSender() { + sendInfoPage( + "utilitiesinexcess:compressed_cobblestone,utilitiesinexcess:compressed_dirt,utilitiesinexcess:compressed_gravel,utilitiesinexcess:compressed_sand", + "nei.infopage.uie.compressed.1"); + + sendInfoPage("", "nei.infopage.uie.inverted_ingot.1"); + if (InversionConfig.invertedIngotsImplode) { + sendInfoPage("", "nei.infopage.uie.inverted_ingot.2"); + sendInfoPage("", "nei.infopage.uie.inverted_ingot.3"); + } + + sendInfoPage( + ",", + "nei.infopage.uie.inverted_ingot_stable.1"); + sendInfoPage( + ",", + "nei.infopage.uie.inverted_ingot_stable.2"); + + if (Mods.Tinkers.isLoaded()) { + sendInfoPage("utilitiesinexcess:inverted_ingot", "nei.infopage.uie.ticon_inverted"); + } + + sendInfoPage("", "nei.infopage.uie.gluttons_axe.1"); + sendInfoPage("", "nei.infopage.uie.destruction_pickaxe.1"); + sendInfoPage("", "nei.infopage.uie.anti_particulate_shovel.1"); + sendInfoPage("", "nei.infopage.uie.precision_shears.1"); + sendInfoPage("", "nei.infopage.uie.etheric_sword.1"); + sendInfoPage("", "nei.infopage.uie.reversing_hoe.1"); + sendInfoPage( + ",", + "nei.infopage.uie.architects_wand.1"); + + sendInfoPage("", "nei.infopage.uie.mob_jar.1"); + + sendInfoPage("utilitiesinexcess:glove", "nei.infopage.uie.glove.1"); + if (Mods.Baubles.isLoaded()) sendInfoPage("utilitiesinexcess:glove", "nei.infopage.uie.glove.2"); + + sendInfoPage("", "nei.infopage.uie.floating_block.1"); + + sendInfoPage("", "nei.infopage.uie.redstone_clock.1"); + + sendInfoPage("", "nei.infopage.uie.wood_spike.1"); + sendInfoPage("", "nei.infopage.uie.iron_spike.1"); + sendInfoPage("", "nei.infopage.uie.gold_spike.1"); + sendInfoPage("", "nei.infopage.uie.diamond_spike.1"); + + sendInfoPage("", "nei.infopage.uie.fire_battery.1"); + + sendInfoPage("", "nei.infopage.uie.block_analyzer.1"); + + sendInfoPage("", "nei.infopage.uie.conveyor.1"); + + sendInfoPage("", "nei.infopage.uie.marginally_maximised_chest.1"); + sendInfoPage("", "nei.infopage.uie.significantly_shrunk_chest.1"); + sendInfoPage("", "nei.infopage.uie.radically_reduced_chest.1"); + + sendInfoPage("", "nei.infopage.uie.pure_love.1"); + + sendInfoPage("", "nei.infopage.uie.drum.1"); + + sendInfoPage("", "nei.infopage.uie.block_update_detector.1"); + + sendInfoPage("", "nei.infopage.uie.rain_muffler.1"); + sendInfoPage("", "nei.infopage.uie.sound_muffler.1"); + + sendInfoPage( + ",", + "nei.infopage.uie.bedrockium.1"); + if (Mods.Tinkers.isLoaded()) { + sendInfoPage("", "nei.infopage.uie.ticon_bedrockium"); + } + + sendInfoPage( + ",,", + "nei.infopage.uie.watering_can.1"); + + if (Mods.Baubles.isLoaded()) { + sendInfoPage("", "nei.infopage.uie.heavenly_ring.2"); + } else { + sendInfoPage("", "nei.infopage.uie.heavenly_ring.1"); + } + + sendInfoPage("", "nei.infopage.uie.trash_can_item.1"); + sendInfoPage("", "nei.infopage.uie.trash_can_fluid.1"); + sendInfoPage("", "nei.infopage.uie.trash_can_energy.1"); + + sendInfoPage("", "nei.infopage.uie.magic_wood.1"); + if (Mods.Tinkers.isLoaded()) { + sendInfoPage("", "nei.infopage.uie.ticon_magic_wood"); + } + + sendInfoPage("", "nei.infopage.uie.pacifists_bench.1"); + sendInfoPage("", "nei.infopage.uie.pacifists_bench.2"); + + sendInfoPage("", "nei.infopage.uie.smart_pump.1"); + sendInfoPage("", "nei.infopage.uie.smart_pump.2"); + + sendInfoPage("", "nei.infopage.uie.ender_lotus_seed.1"); + + sendInfoPage("", "nei.infopage.uie.xray_glasses.1"); + + sendInfoPage("", "nei.infopage.uie.golden_bag.1"); + + sendInfoPage( + ",,", + "nei.infopage.uie.low_temperature_furnace_generator.1"); + sendInfoPage( + ",,", + "nei.infopage.uie.furnace_generator.1"); + sendInfoPage( + ",,", + "nei.infopage.uie.high_temperature_furnace_generator.1"); + sendInfoPage( + ",,", + "nei.infopage.uie.ender_generator.1"); + sendInfoPage( + ",,", + "nei.infopage.uie.food_generator.1"); + sendInfoPage( + ",,", + "nei.infopage.uie.tnt_generator.1"); + sendInfoPage( + ",,", + "nei.infopage.uie.nether_star_generator.1"); + sendInfoPage( + ",,", + "nei.infopage.uie.pink_generator.1"); + sendInfoPage( + ",,", + "nei.infopage.uie.lava_generator.1"); + sendInfoPage( + ",,", + "nei.infopage.uie.solar_generator.1"); + sendInfoPage( + ",,", + "nei.infopage.uie.redstone_generator.1"); + sendInfoPage( + ",,", + "nei.infopage.uie.potion_generator.1"); + + sendInfoPage("", "nei.infopage.uie.temporal_gate.1"); + sendInfoPage("", "nei.infopage.uie.temporal_gate.2"); + sendInfoPage("", "nei.infopage.uie.temporal_gate.3"); + sendInfoPage("", "nei.infopage.uie.temporal_gate.4"); + sendInfoPage("", "nei.infopage.uie.temporal_gate.5"); + + sendInfoPage("", "nei.infopage.uie.ethereal_glass.0"); + sendInfoPage("", "nei.infopage.uie.ethereal_glass.2"); + sendInfoPage("", "nei.infopage.uie.ethereal_glass.3"); + sendInfoPage("", "nei.infopage.uie.ethereal_glass.5"); + + sendInfoPage( + ",", + "nei.infopage.uie.inversion_sigil.1"); + sendInfoPage( + ",", + "nei.infopage.uie.inversion_sigil.2"); + sendInfoPage( + ",", + "nei.infopage.uie.inversion_sigil.3"); + sendInfoPage( + ",", + "nei.infopage.uie.inversion_sigil.4"); + + sendInfoPage("", "nei.infopage.uie.cursed_earth.1"); + + sendInfoPage("utilitiesinexcess:lapis_aetherius", "nei.infopage.uie.lapis_aetherius.1"); + + sendInfoPage("", "nei.infopage.uie.blackout_curtains.1"); + + sendInfoPage("", "nei.infopage.uie.underworld_portal.1"); + sendInfoPage("", "nei.infopage.uie.underworld_portal.2"); + sendInfoPage("", "nei.infopage.uie.underworld_portal.3"); + + sendInfoPage("", "nei.infopage.uie.trading_post.1"); + } + + private static void sendInfoPage(String filter, String page) { + NBTTagCompound NBT = new NBTTagCompound(); + NBT.setString("filter", filter); + NBT.setString("page", page); + FMLInterModComms.sendMessage("NotEnoughItems", "addItemInfo", NBT); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockBedrockium.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockBedrockium.java new file mode 100644 index 00000000..6c84d55f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockBedrockium.java @@ -0,0 +1,42 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockBedrockium extends Block { + + public BlockBedrockium() { + super(Material.iron); + setBlockName("bedrockium_block"); + setBlockTextureName("utilitiesinexcess:bedrockium_block"); + setHardness(500F); + setResistance(10000F); + } + + @Override + public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) { + return false; + } + + public static class ItemBlockBedrockium extends ItemBlock { + + public ItemBlockBedrockium(Block block) { + super(block); + } + + @Override + public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int p_77663_4_, boolean p_77663_5_) { + if (entityIn instanceof EntityLivingBase entity) { + entity.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 0, 3, true)); + } + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockBlackoutCurtains.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockBlackoutCurtains.java new file mode 100644 index 00000000..f8080269 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockBlackoutCurtains.java @@ -0,0 +1,84 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static net.minecraftforge.common.util.ForgeDirection.*; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; + +public class BlockBlackoutCurtains extends Block { + + public BlockBlackoutCurtains() { + super(Material.cloth); + setBlockName("blackout_curtains"); + setBlockTextureName("utilitiesinexcess:blackout_curtains"); + setLightOpacity(8); + setHardness(0); + setResistance(0); + setStepSound(soundTypeCloth); + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public int getRenderType() { + return UtilitiesInExcess.blackoutCurtainsRenderID; + } + + public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, + List list, Entity collider) {} + + public void setBlockBoundsBasedOnState(IBlockAccess worldIn, int x, int y, int z) { + float bN = 7 / 16f; + float bW = 7 / 16f; + float bS = 9 / 16f; + float bE = 9 / 16f; + boolean connNorth = this.canConnectTo(worldIn, x, y, z - 1, NORTH); + boolean connSouth = this.canConnectTo(worldIn, x, y, z + 1, SOUTH); + boolean connWest = this.canConnectTo(worldIn, x - 1, y, z, WEST); + boolean connEast = this.canConnectTo(worldIn, x + 1, y, z, EAST); + + if (connWest || connEast || connNorth || connSouth) { + if (connNorth) { + bN = 0.0F; + } + if (connWest) { + bW = 0.0F; + } + if (connSouth) { + bS = 1.0F; + } + if (connEast) { + bE = 1.0F; + } + } else { + bN = 0.0F; + bW = 0.0F; + bS = 1.0F; + bE = 1.0F; + } + + this.setBlockBounds(bW, 0.0F, bN, bE, 1.0F, bS); + } + + public final boolean canConnectToBlock(Block block) { + return block.func_149730_j() || block instanceof BlockBlackoutCurtains; + } + + public boolean canConnectTo(IBlockAccess world, int x, int y, int z, ForgeDirection dir) { + return canConnectToBlock(world.getBlock(x, y, z)) || world.isSideSolid(x, y, z, dir.getOpposite(), false); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java new file mode 100644 index 00000000..09dcc73f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java @@ -0,0 +1,108 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import net.minecraft.world.IBlockAccess; + +import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorBlock; +import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorBlock_Client; +import com.fouristhenumber.utilitiesinexcess.render.BlockColoredTexture; +import com.fouristhenumber.utilitiesinexcess.utils.ColorUtils; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +// These are intentionally not ore dictionary'd to their originals +// to avoid flooding nei crafting recipes with them. +public class BlockColored extends Block { + + private final Block base; + private final float colorMultiplier; + + public BlockColored(Block base) { + this(base, 1.5F); + } + + public BlockColored(Block base, float colorMultiplier) { + super(base.getMaterial()); + this.base = base; + this.colorMultiplier = colorMultiplier; + + setHardness(base.getBlockHardness(null, 0, 0, 0)); + setStepSound(base.stepSound); + setBlockName(((AccessorBlock) base).uie$getUnlocalizedNameRaw() + "_colored"); + } + + @Override + public int damageDropped(int meta) { + return meta; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + String textureName = ((AccessorBlock_Client) base).uie$getTextureName() + "_colored_grayscale"; + blockIcon = new BlockColoredTexture(textureName, base, colorMultiplier); + + if (!(reg instanceof TextureMap tm)) return; + + tm.setTextureEntry(textureName, (TextureAtlasSprite) blockIcon); + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { + for (int i = 0; i < 16; ++i) { + list.add(new ItemStack(itemIn, 1, i)); + } + } + + @Override + public int colorMultiplier(IBlockAccess worldIn, int x, int y, int z) { + int meta = worldIn.getBlockMetadata(x, y, z); + return ColorUtils.getHexColorFromWoolMeta(meta); + } + + @SideOnly(Side.CLIENT) + public int getRenderColor(int meta) { + return ColorUtils.getHexColorFromWoolMeta(meta); + } + + public Block getBase() { + return base; + } + + public static class ItemBlockColored extends ItemBlock { + + public ItemBlockColored(Block block) { + super(block); + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + public int getMetadata(int damage) { + return damage; + } + + @Override + public String getItemStackDisplayName(ItemStack stack) { + int dmg = stack.getItemDamage(); + stack.setItemDamage(0); + String name = Item.getItemFromBlock(((BlockColored) field_150939_a).base) + .getItemStackDisplayName(stack); + stack.setItemDamage(dmg); + + name = StatCollector.translateToLocalFormatted("uie.colored_blocks.color." + stack.getItemDamage(), name); + return name; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockCompressed.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockCompressed.java new file mode 100644 index 00000000..18571008 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockCompressed.java @@ -0,0 +1,94 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockCompressed extends Block { + + String name; + Block base; + + public BlockCompressed(Block base, String name) { + super(base.getMaterial()); + // These parameters are unused by the default method + setHardness(base.getBlockHardness(null, 0, 0, 0) * 1.5F); + this.name = name; + this.base = base; + setBlockName(name); + } + + public Block getBase() { + return base; + } + + @SideOnly(Side.CLIENT) + private IIcon[] icons; + + public int damageDropped(int meta) { + return meta; + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { + for (int i = 0; i < 8; ++i) { + list.add(new ItemStack(itemIn, 1, i)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + icons = new IIcon[16]; + for (int i = 0; i < 8; i++) { + icons[i] = iconRegister.registerIcon("utilitiesinexcess:" + name + "_" + i); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (meta < 0 || meta >= icons.length) { + meta = 0; + } + return icons[meta]; + } + + public static class ItemCompressedBlock extends ItemBlock { + + public ItemCompressedBlock(Block block) { + super(block); + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + public int getMetadata(int damage) { + return damage; + } + + @Override + public String getUnlocalizedName(final ItemStack stack) { + return this.getUnlocalizedName() + "." + stack.getItemDamage(); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean bool) { + tooltip.add( + StatCollector.translateToLocalFormatted( + getUnlocalizedName() + ".desc", + (long) Math.pow(9, stack.getItemDamage() + 1))); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java new file mode 100644 index 00000000..90c0a4ce --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java @@ -0,0 +1,86 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityConveyor; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockConveyor extends BlockContainer { + + @SideOnly(Side.CLIENT) + private IIcon belt_up, belt_down, belt_left, belt_right, blank; + + public BlockConveyor() { + super(Material.piston); + + setBlockName("conveyor"); + } + + public static ForgeDirection getFacing(int meta) { + return switch (meta) { + case 0 -> ForgeDirection.SOUTH; + case 1 -> ForgeDirection.WEST; + case 2 -> ForgeDirection.NORTH; + case 3 -> ForgeDirection.EAST; + default -> ForgeDirection.UNKNOWN; + }; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + belt_up = reg.registerIcon("utilitiesinexcess:conveyor_belt_up"); + belt_down = reg.registerIcon("utilitiesinexcess:conveyor_belt_down"); + belt_left = reg.registerIcon("utilitiesinexcess:conveyor_belt_left"); + belt_right = reg.registerIcon("utilitiesinexcess:conveyor_belt_right"); + blank = reg.registerIcon("utilitiesinexcess:conveyor_belt_blank"); + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int s, int meta) { + if (s == getFacing(meta).getOpposite() + .ordinal()) return belt_up; + if (s != ForgeDirection.UP.ordinal()) return blank; + + return switch (getFacing(meta)) { + case NORTH -> belt_up; + case SOUTH -> belt_down; + case WEST -> belt_left; + case EAST -> belt_right; + default -> null; + }; + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityConveyor(); + } + + public static class ItemBlockConveyor extends ItemBlock { + + public ItemBlockConveyor(Block block) { + super(block); + } + + @Override + public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, + float hitX, float hitY, float hitZ, int metadata) { + int direction = (int) ((((player.rotationYaw % 360) + 45f) / 90f + 4f) % 4f); + + return super.placeBlockAt(stack, player, world, x, y, z, side, hitX, hitY, hitZ, direction); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockCursedEarth.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockCursedEarth.java new file mode 100644 index 00000000..ae354c74 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockCursedEarth.java @@ -0,0 +1,222 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockFire; +import net.minecraft.block.BlockMobSpawner; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemSpade; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.util.StatCollector; +import net.minecraft.world.EnumDifficulty; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockCursedEarth extends Block { + + public final boolean blessed; + + public IIcon sideTexture; + + // TODO: Handle spreading? Look into how we wanna do that + // if/when we handle the sigil etc + + // Most of the logic for cursed earth interactions with spawners is + // implemented in mixins.early.minecraft.CursedEarthSpawner + public BlockCursedEarth(boolean blessed) { + super(Material.ground); + this.blessed = blessed; + if (!blessed) { + setBlockName("cursed_earth"); + setBlockTextureName("utilitiesinexcess:cursed_earth"); + this.setStepSound(soundTypeGravel); + } else { + setBlockName("cursed_earth.blessed"); + setBlockTextureName("utilitiesinexcess:blessed_earth"); + this.setStepSound(soundTypeCloth); + } + this.setHardness(0.5F); + this.setResistance(200.0F); + this.setTickRandomly(true); + } + + @Override + public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) { + ItemStack tool = player.getCurrentEquippedItem(); + return tool != null && tool.getItem() instanceof ItemSpade; + } + + @Override + public void randomDisplayTick(World world, int x, int y, int z, Random random) { + for (int i = 0; i < (blessed ? 2 : 4); i++) { + double px = x + random.nextFloat(); + double py = y + random.nextFloat(); + double pz = z + random.nextFloat(); + double vx = (random.nextFloat() - 0.5) * 0.5; + double vy = (random.nextFloat() - 0.5) * 0.5; + double vz = (random.nextFloat() - 0.5) * 0.5; + if (blessed) { + world.spawnParticle("enchantmenttable", px, py + 0.7, pz, vx, vy, vz); + } else { + world.spawnParticle("portal", px, py, pz, vx, vy, vz); + } + } + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList drops = new ArrayList(); + // Change Items.diamond to any item you want it to drop + drops.add(new ItemStack(Item.getItemFromBlock(Blocks.dirt), 1)); + return drops; + } + + @Override + public void updateTick(World world, int x, int y, int z, Random random) { + super.updateTick(world, x, y, z, random); + if (world.isRemote) return; + tryBurn(world, x, y, z, random); + trySpawnMob(world, x, y, z, random); + } + + public void trySpawnMob(World world, int x, int y, int z, Random random) { + if (!world.isAirBlock(x, y + 1, z)) return; + int light = world.getBlockLightValue(x, y + 1, z); + if ((light >= 8 && !blessed) || light < 8 && blessed) return; + if (!world.getGameRules() + .getGameRuleBooleanValue("doMobSpawning")) return; + if (world.difficultySetting == EnumDifficulty.PEACEFUL && !blessed) return; + if (random.nextInt(100) + >= (blessed ? CursedEarthConfig.blessedEarthSpawnRate : CursedEarthConfig.cursedEarthSpawnRate)) return; + + AxisAlignedBB spawnArea = AxisAlignedBB.getBoundingBox(x, y + 1, z, x + 1, y + 2, z + 1); + List entitiesAbove = world.getEntitiesWithinAABB(EntityLiving.class, spawnArea); + if (!entitiesAbove.isEmpty()) return; + + BiomeGenBase biome = world.getBiomeGenForCoords(x, z); + List monsterList = blessed ? biome.getSpawnableList(EnumCreatureType.creature) + : biome.getSpawnableList(EnumCreatureType.monster); + + if (monsterList == null || monsterList.isEmpty()) return; + + BiomeGenBase.SpawnListEntry spawnEntry = monsterList.get(random.nextInt(monsterList.size())); + + EntityLiving mob; + try { + mob = spawnEntry.entityClass.getConstructor(World.class) + .newInstance(world); + } catch (Exception e) { + UtilitiesInExcess.LOG.error("Error while spawning mob {}", spawnEntry); + UtilitiesInExcess.LOG.error(e.getStackTrace()); + return; + } + + mob.setLocationAndAngles( + x + 0.5D, + y + 1D, + z + 0.5D, + MathHelper.wrapAngleTo180_float(random.nextFloat() * 360.0F), + 0.0F); + + if (!mob.getCanSpawnHere()) return; + + world.spawnEntityInWorld(mob); + } + + public void tryBurn(World world, int x, int y, int z, Random random) { + if (random.nextInt(4) != 0) return; + + Block aboveBlock = world.getBlock(x, y + 1, z); + if (world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN) && !(aboveBlock instanceof BlockMobSpawner)) { + world.setBlock(x, y, z, Blocks.dirt); + return; + } + + if (blessed && !CursedEarthConfig.enableBlessedEarthBurn) return; + + if (world.isAirBlock(x, y + 1, z) && shouldBurn(world, x, y, z)) { + world.setBlock(x, y + 1, z, Blocks.fire); + return; + } + + if (aboveBlock instanceof BlockFire) { + world.setBlock(x, y, z, Blocks.dirt); + } + } + + public boolean shouldBurn(World world, int x, int y, int z) { + boolean lit = world.getBlockLightValue(x, y + 1, z) >= 8; + if (blessed) { + return !lit || (world.canBlockSeeTheSky(x, y + 1, z) && !world.isDaytime()); + } + return lit; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon(this.getTextureName() + "_top"); + this.sideTexture = reg.registerIcon(this.getTextureName() + "_side"); + } + + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return side == 1 ? this.blockIcon : (side == 0 ? Blocks.dirt.getBlockTextureFromSide(side) : this.sideTexture); + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(IBlockAccess worldIn, int x, int y, int z, int side) { + return getIcon(side, 0); + } + + @Override + public boolean isFlammable(IBlockAccess world, int x, int y, int z, ForgeDirection face) { + return face == ForgeDirection.UP; + } + + /* + * @Override + * public TileEntity createNewTileEntity(World worldIn, int meta) { + * return new TileEntityCursedEarth(); + * } + */ + + public static class ItemBlockCursedEarth extends ItemBlock { + + public ItemBlockCursedEarth(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + if (((BlockCursedEarth) field_150939_a).blessed) { + tooltip.add(StatCollector.translateToLocal("tile.cursed_earth.blessed.desc")); + } else { + tooltip.add(StatCollector.translateToLocal("tile.cursed_earth.desc")); + } + super.addInformation(stack, player, tooltip, p_77624_4_); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorative.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorative.java new file mode 100644 index 00000000..084deacc --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorative.java @@ -0,0 +1,83 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockDecorative extends Block { + + private static final int META_VALUES = 12; + + public BlockDecorative() { + super(Material.rock); + setBlockName("decorative_block"); + setStepSound(soundTypeStone); + } + + @SideOnly(Side.CLIENT) + private IIcon[] icons; + + @Override + public int damageDropped(int meta) { + return meta; + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { + for (int i = 0; i < META_VALUES; ++i) { + list.add(new ItemStack(itemIn, 1, i)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + icons = new IIcon[META_VALUES]; + for (int i = 0; i < META_VALUES; i++) { + icons[i] = iconRegister.registerIcon("utilitiesinexcess:decorative_block_" + i); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (meta < 0 || meta >= icons.length) { + meta = 0; + } + return icons[meta]; + } + + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() { + return 1; + } + + public static class ItemBlockDecorative extends ItemBlock { + + public ItemBlockDecorative(Block block) { + super(block); + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + public int getMetadata(int damage) { + return damage; + } + + @Override + public String getUnlocalizedName(final ItemStack stack) { + return this.getUnlocalizedName() + "." + stack.getItemDamage(); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java new file mode 100644 index 00000000..35fec990 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java @@ -0,0 +1,98 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockGlass; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockDecorativeGlass extends BlockGlass { + + private static final int META_VALUES = 12; + + public BlockDecorativeGlass() { + super(Material.glass, false); + setBlockName("decorative_glass"); + setHardness(0.3F); + setStepSound(soundTypeGlass); + } + + // Dark Glass has the blackout curtain effect + @Override + public int getLightOpacity(IBlockAccess world, int x, int y, int z) { + return world.getBlockMetadata(x, y, z) >= 10 ? 8 : super.getLightOpacity(world, x, y, z); + } + + // Glowing Glass + @Override + public int getLightValue(IBlockAccess world, int x, int y, int z) { + return world.getBlockMetadata(x, y, z) == 7 ? 10 : super.getLightValue(); + } + + @SideOnly(Side.CLIENT) + private IIcon[] icons; + + @Override + public int damageDropped(int meta) { + return meta; + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { + for (int i = 0; i < META_VALUES; ++i) { + list.add(new ItemStack(itemIn, 1, i)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + icons = new IIcon[META_VALUES]; + for (int i = 0; i < META_VALUES; i++) { + icons[i] = iconRegister.registerIcon("utilitiesinexcess:glass_" + i); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (meta < 0 || meta >= icons.length) { + meta = 0; + } + return icons[meta]; + } + + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() { + return 1; + } + + public static class ItemBlockDecorativeGlass extends ItemBlock { + + public ItemBlockDecorativeGlass(Block block) { + super(block); + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + public int getMetadata(int damage) { + return damage; + } + + @Override + public String getUnlocalizedName(final ItemStack stack) { + return this.getUnlocalizedName() + "." + stack.getItemDamage(); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDrum.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDrum.java new file mode 100644 index 00000000..96946737 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDrum.java @@ -0,0 +1,260 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidContainerItem; + +import com.cleanroommc.modularui.utils.NumberFormat; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; + +public class BlockDrum extends BlockContainer { + + final int capacity; + + public BlockDrum(int capacity) { + super(Material.iron); + this.capacity = capacity; + setBlockName("drum"); + this.setHardness(3.0F); + this.setResistance(5.0F); + setBlockTextureName("utilitiesinexcess:drum"); + this.setHarvestLevel("pickaxe", 1); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityDrum(capacity); + } + + @Override + public boolean hasTileEntity(int metadata) { + return true; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, + float hitY, float hitZ) { + if (world.isRemote) { + return true; + } + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntityDrum drum) { + ItemStack heldItem = player.getCurrentEquippedItem(); + FluidStack heldFluid = FluidContainerRegistry.getFluidForFilledItem(heldItem); + + if (FluidContainerRegistry.isFilledContainer(heldItem)) { + + if (drum.tank.getFluid() == null) { + drum.setFluid(new FluidStack(heldFluid.getFluid(), 0)); + } + + if (drum.fill(ForgeDirection.UP, heldFluid, true) == heldFluid.amount) { + FluidContainerRegistry.drainFluidContainer(heldItem); + ItemStack emptyContainer = FluidContainerRegistry.drainFluidContainer(heldItem); + emptyContainer.stackSize = 1; + heldItem.stackSize--; + player.inventory.setInventorySlotContents(player.inventory.currentItem, heldItem); + player.inventory.addItemStackToInventory(emptyContainer); + + player.addChatMessage( + new ChatComponentTranslation( + "tile.drum.chat.filled", + drum.tank.getFluid() + .getLocalizedName(), + NumberFormat.DEFAULT.format(drum.tank.getFluid().amount))); + } + } else if (FluidContainerRegistry.isEmptyContainer(heldItem)) { + if (drum.tank.getFluid() != null) { + FluidStack drainedFluid = drum.drain(ForgeDirection.UP, 1000, true); + + if (drainedFluid.amount == 1000) { + ItemStack filledContainer = FluidContainerRegistry.fillFluidContainer(drainedFluid, heldItem); + player.inventory.setInventorySlotContents(player.inventory.currentItem, filledContainer); + } + } + } + } + + return true; + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase placer, ItemStack stack) { + super.onBlockPlacedBy(world, x, y, z, placer, stack); + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntityDrum drum) { + FluidStack fluid = ItemBlockDrum.getFluidFromStack(stack); + drum.setFluid(fluid); + } + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + // We spawn the correct stack on breakBlock(), make it not drop normally. + return new ArrayList<>(); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + + ItemStack drop = new ItemStack(this, 1, meta); + + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntityDrum drum) { + if (drum.tank.getFluid() != null) { + ItemBlockDrum.setFluid( + drop, + drum.tank.getFluid() + .copy()); + } else { + ItemBlockDrum.clearFluid(drop); + } + } + + float f = 0.7F; + double dx = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; + double dy = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; + double dz = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; + + EntityItem entityItem = new EntityItem(world, x + dx, y + dy, z + dz, drop); + world.spawnEntityInWorld(entityItem); + world.removeTileEntity(x, y, z); + super.breakBlock(world, x, y, z, block, meta); + } + + public static class ItemBlockDrum extends ItemBlock implements IFluidContainerItem { + + public final int capacity; + + public ItemBlockDrum(Block block) { + super(block); + this.setMaxStackSize(1); + this.capacity = ((BlockDrum) block).capacity; + } + + @Override + public FluidStack getFluid(ItemStack stack) { + return getFluidFromStack(stack); + } + + @Override + public int getCapacity(ItemStack stack) { + return capacity; + } + + @Override + public int fill(ItemStack stack, FluidStack resource, boolean doFill) { + if (resource == null) { + return 0; + } + + FluidStack currentFluid = getFluid(stack); + + if (currentFluid == null) { + int fillAmount = Math.min(capacity, resource.amount); + if (doFill && fillAmount > 0) { + FluidStack newFluid = resource.copy(); + newFluid.amount = fillAmount; + setFluid(stack, newFluid); + } + return fillAmount; + } else { + if (!currentFluid.isFluidEqual(resource)) { + return 0; + } + + int space = capacity - currentFluid.amount; + if (space <= 0) { + return 0; + } + + int fillAmount = Math.min(space, resource.amount); + if (doFill && fillAmount > 0) { + currentFluid.amount += fillAmount; + setFluid(stack, currentFluid); + } + return fillAmount; + } + } + + @Override + public FluidStack drain(ItemStack stack, int maxDrain, boolean doDrain) { + FluidStack currentFluid = getFluid(stack); + if (currentFluid == null) { + return null; + } + + int drained = Math.min(maxDrain, currentFluid.amount); + FluidStack drainedFluid = currentFluid.copy(); + drainedFluid.amount = drained; + + if (doDrain) { + currentFluid.amount -= drained; + if (currentFluid.amount <= 0) { + stack.setTagCompound(null); + } else { + setFluid(stack, currentFluid); + } + } + return drainedFluid; + } + + // Helper functions to abstract away the NBT layer + public static void setFluid(ItemStack stack, FluidStack fluid) { + NBTTagCompound tag = stack.getTagCompound(); + if (tag == null) { + tag = new NBTTagCompound(); + } + NBTTagCompound fluidTag = new NBTTagCompound(); + fluid.writeToNBT(fluidTag); + tag.setTag("Fluid", fluidTag); + stack.setTagCompound(tag); + } + + public static void clearFluid(ItemStack stack) { + stack.setTagCompound(null); + } + + public static FluidStack getFluidFromStack(ItemStack stack) { + if (stack.hasTagCompound() && stack.getTagCompound() + .hasKey("Fluid")) { + NBTTagCompound fluidTag = stack.getTagCompound() + .getCompoundTag("Fluid"); + return FluidStack.loadFluidStackFromNBT(fluidTag); + } + return null; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean bool) { + tooltip + .add(StatCollector.translateToLocalFormatted("tile.drum.desc", NumberFormat.DEFAULT.format(capacity))); + FluidStack fluid = getFluid(stack); + if (fluid != null) { + String formatted = StatCollector.translateToLocalFormatted( + "tile.drum.desc.fluid", + fluid.getLocalizedName(), + NumberFormat.DEFAULT.format(fluid.amount)); + tooltip.add(formatted); + } + } + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderLotus.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderLotus.java new file mode 100644 index 00000000..e40fa437 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderLotus.java @@ -0,0 +1,126 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.ArrayList; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockCrops; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderLotusConfig; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockEnderLotus extends BlockCrops { + + private static final int MAX_STAGE = 7; + + @SideOnly(Side.CLIENT) + private IIcon[] icons; + + public BlockEnderLotus() { + this.setBlockName("ender_lotus"); + this.setTickRandomly(true); + this.setHardness(0.0F); + this.setStepSound(soundTypeGrass); + this.setCreativeTab(null); + this.disableStats(); + } + + @Override + protected Item func_149866_i() { + return ModItems.ENDER_LOTUS_SEED.get(); + } + + @Override + protected Item func_149865_P() { + return Items.ender_pearl; + } + + @Override + public boolean canPlaceBlockOn(Block ground) { + return ground == Blocks.end_stone || ground == Blocks.dirt || ground == Blocks.grass; + } + + @Override + public void updateTick(World world, int x, int y, int z, Random rand) { + if (world.isRemote) return; + int meta = world.getBlockMetadata(x, y, z); + if (meta >= MAX_STAGE) return; + + boolean onEndstone = world.getBlock(x, y - 1, z) == Blocks.end_stone; + int chance = onEndstone ? EnderLotusConfig.growthTicksOnEndstone : EnderLotusConfig.growthTicksOnDirt; + + if (rand.nextInt(chance) == 0) { + world.setBlockMetadataWithNotify(x, y, z, meta + 1, 2); + } + } + + // fertilize() + @Override + public void func_149853_b(World world, Random rand, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + if (meta > 0) { + world.setBlockMetadataWithNotify(x, y, z, meta - 1, 2); + } + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + if (!EnderLotusConfig.thornyLotuses || world.isRemote || !(entity instanceof EntityLivingBase)) return; + if (world.getBlockMetadata(x, y, z) > 3) { + entity.attackEntityFrom(DamageSource.cactus, 0.1F); + } + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList drops = new ArrayList<>(); + Random rand = world.rand; + Item enderLotusSeed = ModItems.ENDER_LOTUS_SEED.get(); + + drops.add(new ItemStack(enderLotusSeed, 1)); + if (metadata >= MAX_STAGE) { + drops.add(new ItemStack(Items.ender_pearl, 1)); + + if (world.getBlock(x, y - 1, z) == Blocks.end_stone + && rand.nextDouble() < EnderLotusConfig.extraSeedChanceOnEndstone) { + drops.add(new ItemStack(enderLotusSeed, 1)); + } + } + return drops; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + icons = new IIcon[MAX_STAGE + 1]; + for (int i = 0; i <= MAX_STAGE; i++) { + icons[i] = reg.registerIcon("utilitiesinexcess:crops/ender_lotus_stage_" + i); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (meta < 0) meta = 0; + if (meta > MAX_STAGE) meta = MAX_STAGE; + return icons[meta]; + } + + @Override + public int getRenderType() { + return 1; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEtherealGlass.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEtherealGlass.java new file mode 100644 index 00000000..04dc5e0d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEtherealGlass.java @@ -0,0 +1,125 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockGlass; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockEtherealGlass extends BlockGlass { + + public enum EtherealGlassType { + + NORMAL(0, "ethereal_glass"), + DARK(2, "ethereal_glass_dark"), + INVERTED(3, "ethereal_glass_inverted"), + DARK_INVERTED(5, "ethereal_glass_dark_inverted"); + + public final int meta; + public final String textureName; + + EtherealGlassType(int meta, String textureName) { + this.meta = meta; + this.textureName = textureName; + } + } + + public BlockEtherealGlass() { + super(Material.glass, false); + setBlockName("ethereal_glass"); + setHardness(0.3F); + setStepSound(soundTypeGlass); + } + + @SideOnly(Side.CLIENT) + private IIcon[] icons; + + @Override + public int damageDropped(int meta) { + return meta; + } + + @Override + public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, + List list, Entity collider) { + int meta = worldIn.getBlockMetadata(x, y, z); + + if ((meta == EtherealGlassType.NORMAL.meta || meta == EtherealGlassType.DARK.meta) + && collider instanceof EntityPlayer) { + return; + } + + if ((meta == EtherealGlassType.INVERTED.meta || meta == EtherealGlassType.DARK_INVERTED.meta) + && !(collider instanceof EntityPlayer)) { + return; + } + + super.addCollisionBoxesToList(worldIn, x, y, z, mask, list, collider); + } + + @Override + public int getLightOpacity(IBlockAccess world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + return (meta == EtherealGlassType.NORMAL.meta || meta == EtherealGlassType.INVERTED.meta) ? 0 : 255; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { + for (EtherealGlassType value : EtherealGlassType.values()) { + list.add(new ItemStack(this, 1, value.meta)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + icons = new IIcon[16]; + + for (EtherealGlassType value : EtherealGlassType.values()) { + icons[value.meta] = iconRegister.registerIcon("utilitiesinexcess:" + value.textureName); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (meta < 0 || meta >= icons.length) { + meta = 0; + } + return icons[meta]; + } + + public static class ItemBlockEtherealGlass extends ItemBlock { + + public ItemBlockEtherealGlass(Block block) { + super(block); + setHasSubtypes(true); + } + + @Override + public int getMetadata(int damage) { + return damage; + } + + @Override + public String getUnlocalizedName(final ItemStack stack) { + return this.getUnlocalizedName() + "." + stack.getItemDamage(); + } + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockFloating.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockFloating.java new file mode 100644 index 00000000..07ddcc1c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockFloating.java @@ -0,0 +1,68 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public class BlockFloating extends Block { + + public BlockFloating() { + super(Material.rock); + setBlockName("floating_block"); + setBlockTextureName("utilitiesinexcess:floating_block"); + } + + @Override + public boolean canPlaceBlockAt(World worldIn, int x, int y, int z) { + return true; + } + + @Override + public boolean canPlaceBlockOnSide(World worldIn, int x, int y, int z, int side) { + return true; + } + + public static class ItemBlockFloating extends ItemBlock { + + public ItemBlockFloating(Block block) { + super(block); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if (!world.isRemote) { + MovingObjectPosition target = getMovingObjectPositionFromPlayer(world, player, true); + if (target == null || target.typeOfHit == MovingObjectPosition.MovingObjectType.MISS) { + Vec3 lookVec = player.getLookVec(); + Vec3 eyePos = Vec3 + .createVectorHelper(player.posX, player.posY + player.getEyeHeight(), player.posZ); + + for (int i = 1; i < 2; i++) { + Vec3 targetVec = eyePos.addVector(lookVec.xCoord * i, lookVec.yCoord * i, lookVec.zCoord * i); + int bx = (int) Math.floor(targetVec.xCoord); + int by = (int) Math.floor(targetVec.yCoord); + int bz = (int) Math.floor(targetVec.zCoord); + + if (world.isAirBlock(bx, by, bz)) { + if (world.canPlaceEntityOnSide(this.field_150939_a, bx, by, bz, false, 0, player, stack)) { + world.setBlock(bx, by, bz, this.field_150939_a, 0, 3); + + if (!player.capabilities.isCreativeMode) { + stack.stackSize--; + } + } + break; + } + } + } + } + + return stack; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockInverted.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockInverted.java new file mode 100644 index 00000000..f360908c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockInverted.java @@ -0,0 +1,15 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; + +public class BlockInverted extends Block { + + public BlockInverted() { + super(Material.iron); + setBlockName("inverted_block"); + setBlockTextureName("utilitiesinexcess:inverted_block"); + setHardness(0.5F); + setResistance(150F); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetherius.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetherius.java new file mode 100644 index 00000000..43d2b376 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetherius.java @@ -0,0 +1,100 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockLapisAetherius extends Block { + + public BlockLapisAetherius() { + super(Material.glass); + setBlockName("lapis_aetherius"); + setLightOpacity(0); + setHardness(1); + setResistance(8F); + } + + @SideOnly(Side.CLIENT) + private IIcon[] icons; + + public int damageDropped(int meta) { + return meta; + } + + @Override + public int getRenderType() { + return UtilitiesInExcess.lapisAetheriusRenderID; + } + + @Override + public boolean isNormalCube(IBlockAccess world, int x, int y, int z) { + return true; + } + + @Override + public int getLightValue(IBlockAccess world, int x, int y, int z) { + return 10; + } + + @Override + public int getLightValue() { + return 10; + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { + for (int i = 0; i < 16; ++i) { + list.add(new ItemStack(itemIn, 1, i)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + icons = new IIcon[16]; + for (int i = 0; i < 16; i++) { + icons[i] = iconRegister.registerIcon("utilitiesinexcess:lapis_aetherius_" + i); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (meta < 0 || meta >= icons.length) { + meta = 0; + } + return icons[meta]; + } + + public static class ItemLapisAetherius extends ItemBlock { + + public ItemLapisAetherius(Block block) { + super(block); + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + public int getMetadata(int damage) { + return damage; + } + + @Override + public String getUnlocalizedName(final ItemStack stack) { + return this.getUnlocalizedName() + "." + stack.getItemDamage(); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockMagicWood.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockMagicWood.java new file mode 100644 index 00000000..9e1254b1 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockMagicWood.java @@ -0,0 +1,23 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.world.World; + +public class BlockMagicWood extends Block { + + public BlockMagicWood() { + super(Material.wood); + setBlockName("magic_wood"); + setBlockTextureName("utilitiesinexcess:magic_wood"); + + setResistance(30.0f); + setHardness(0.45f); + setStepSound(soundTypeWood); + } + + @Override + public float getEnchantPowerBonus(World world, int x, int y, int z) { + return 5.0f; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockMarginallyMaximisedChest.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockMarginallyMaximisedChest.java new file mode 100644 index 00000000..7781f0b6 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockMarginallyMaximisedChest.java @@ -0,0 +1,168 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityMarginallyMaximisedChest; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockMarginallyMaximisedChest extends BlockContainer { + + private final Random random = new Random(); + + public BlockMarginallyMaximisedChest() { + super(Material.wood); + setBlockName("marginally_maximised_chest"); + setBlockTextureName("scaled_chest"); // Used as prefix for icons + setHardness(2.5F); + setStepSound(soundTypeWood); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityMarginallyMaximisedChest(); + } + + @Override + public void onBlockPlacedBy(World worldIn, int x, int y, int z, EntityLivingBase placer, ItemStack itemIn) { + byte chestFacing = 0; + int facing = MathHelper.floor_double((double) ((placer.rotationYaw * 4F) / 360F) + 0.5D) & 3; + if (facing == 0) { + chestFacing = 2; + } + if (facing == 1) { + chestFacing = 5; + } + if (facing == 2) { + chestFacing = 3; + } + if (facing == 3) { + chestFacing = 4; + } + worldIn.setBlockMetadataWithNotify(x, y, z, chestFacing, 3); + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + if (worldIn.isRemote) { + return true; + } + + TileEntity te = worldIn.getTileEntity(x, y, z); + if (te instanceof TileEntityMarginallyMaximisedChest chest) { + player.displayGUIChest(chest); + } + return true; + } + + @Override + public void breakBlock(World worldIn, int x, int y, int z, Block blockBroken, int meta) { + TileEntity te = worldIn.getTileEntity(x, y, z); + if (te instanceof IInventory inv) { + dropContent(0, inv, worldIn, te.xCoord, te.yCoord, te.zCoord); + } + super.breakBlock(worldIn, x, y, z, blockBroken, meta); + } + + public void dropContent(int newSize, IInventory chest, World world, int x, int y, int z) { + for (int l = newSize; l < chest.getSizeInventory(); l++) { + ItemStack itemstack = chest.getStackInSlot(l); + if (itemstack == null) { + continue; + } + float f = random.nextFloat() * 0.8F + 0.1F; + float f1 = random.nextFloat() * 0.8F + 0.1F; + float f2 = random.nextFloat() * 0.8F + 0.1F; + while (itemstack.stackSize > 0) { + int i1 = random.nextInt(21) + 10; + if (i1 > itemstack.stackSize) { + i1 = itemstack.stackSize; + } + itemstack.stackSize -= i1; + EntityItem entityitem = new EntityItem( + world, + (float) x + f, + (float) y + (newSize > 0 ? 1 : 0) + f1, + (float) z + f2, + new ItemStack(itemstack.getItem(), i1, itemstack.getItemDamage())); + float f3 = 0.05F; + entityitem.motionX = (float) random.nextGaussian() * f3; + entityitem.motionY = (float) random.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) random.nextGaussian() * f3; + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound( + (NBTTagCompound) itemstack.getTagCompound() + .copy()); + } + world.spawnEntityInWorld(entityitem); + } + } + } + + @Override + public boolean hasComparatorInputOverride() { + return true; + } + + @Override + public int getComparatorInputOverride(World worldIn, int x, int y, int z, int side) { + TileEntity te = worldIn.getTileEntity(x, y, z); + if (te instanceof IInventory inv) { + return Container.calcRedstoneFromInventory(inv); + } + return 0; + } + + protected static final String[] sideNames = { "top", "front", "side" }; + + @SideOnly(Side.CLIENT) + protected IIcon[] icons; + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + icons = new IIcon[3]; + int i = 0; + for (String side : sideNames) { + icons[i++] = reg.registerIcon(String.format("%s:%s_%s", UtilitiesInExcess.MODID, getTextureName(), side)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (side <= 1) { + // Top or Bottom + return icons[0]; + } else if (side == meta) { + // Front + return icons[1]; + } else if (meta == 0 && side == 3) { + // Front and rendering in an inventory (no face set) + return icons[1]; + } else { + // Side + return icons[2]; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPacifistsBench.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPacifistsBench.java new file mode 100644 index 00000000..0fc96722 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPacifistsBench.java @@ -0,0 +1,27 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPacifistsBench; + +public class BlockPacifistsBench extends BlockContainer { + + public BlockPacifistsBench() { + super(Material.wood); + setBlockTextureName("utilitiesinexcess:pacifists_bench"); + setBlockName("pacifists_bench"); + } + + @Override + public boolean hasTileEntity(int metadata) { + return true; + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityPacifistsBench(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalEndOfTime.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalEndOfTime.java new file mode 100644 index 00000000..a0ae655e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalEndOfTime.java @@ -0,0 +1,281 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityFlowerPot; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.common.dimensions.UIETeleporter; +import com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime.DimensionPortalData; +import com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime.EndOfTimeSourceProperty; +import com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime.WorldProviderEndOfTime; +import com.fouristhenumber.utilitiesinexcess.config.dimensions.EndOfTimeConfig; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +import cpw.mods.fml.common.FMLCommonHandler; + +public class BlockPortalEndOfTime extends Block { + + public BlockPortalEndOfTime() { + super(Material.rock); + + setBlockName("temporal_gate"); + setBlockTextureName("utilitiesinexcess:temporal_gate"); + setResistance(5); + } + + @Override + public int onBlockPlaced(World world, int x, int y, int z, int side, float subX, float subY, float subZ, int meta) { + if (!world.isRemote && world.provider instanceof WorldProviderEndOfTime) { + DimensionPortalData.get(world) + .setTarget(x, y, z); + } + return meta; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + if (world.isRemote) { + return true; + } + if (world.provider instanceof WorldProviderEndOfTime) { + if (player.isSneaking()) { + player.travelToDimension(0); + ChunkCoordinates spawn = player.worldObj.getSpawnPoint(); + int topY = player.worldObj.getTopSolidOrLiquidBlock(x, z); + player.setPositionAndUpdate(spawn.posX + 0.5, topY, spawn.posZ + 0.5); + return true; + } + EndOfTimeSourceProperty source = (EndOfTimeSourceProperty) player + .getExtendedProperties(EndOfTimeSourceProperty.PROP_KEY); + WorldServer dest = MinecraftServer.getServer() + .worldServerForDimension(source.entranceWorld); + BlockPos spawn = findSpawnLocation(dest, source.entranceX, source.entranceY, source.entranceZ); + if (spawn == null) { + player.addChatComponentMessage(new ChatComponentTranslation("uie.chat.portal_blocked")); + } else { + teleport((EntityPlayerMP) player, dest, spawn.x, spawn.y, spawn.z); + } + } else { + WorldServer dest = MinecraftServer.getServer() + .worldServerForDimension(EndOfTimeConfig.endOfTimeDimensionId); + if (dest.getBlock(0, 64, 0) != Blocks.bedrock) { + generateSpawnArea(dest, 0, 65, 0); + } + ChunkCoordinates spawn = DimensionPortalData.get(dest) + .getTarget(); + if (spawn.posY <= 0 || dest.getBlock(spawn.posX, spawn.posY, spawn.posZ) != this) { + spawn = new ChunkCoordinates(0, 65, 0); + } + EndOfTimeSourceProperty source = (EndOfTimeSourceProperty) player + .getExtendedProperties(EndOfTimeSourceProperty.PROP_KEY); + source.entranceWorld = world.provider.dimensionId; + source.entranceX = x; + source.entranceY = y; + source.entranceZ = z; + teleport((EntityPlayerMP) player, dest, spawn.posX, spawn.posY + 1, spawn.posZ); + } + return true; + } + + private BlockPos findSpawnLocation(World world, int x, int y, int z) { + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + if (dir == ForgeDirection.DOWN) continue; + + if (!world.isAirBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ)) continue; + if (!world.isAirBlock(x + dir.offsetX, y + dir.offsetY + 1, z + dir.offsetZ)) continue; + return new BlockPos(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); + } + + return null; + } + + private void teleport(EntityPlayerMP player, WorldServer world, int x, int y, int z) { + UIETeleporter teleporter = new UIETeleporter(world, x, y, z); + + FMLCommonHandler.instance() + .getMinecraftServerInstance() + .getConfigurationManager() + .transferPlayerToDimension(player, world.provider.dimensionId, teleporter); + } + + private void generateSpawnArea(WorldServer world, int x, int y, int z) { + int chunkX = x >> 4; + int chunkZ = z >> 4; + for (int cx = -1; cx <= 1; cx++) { + for (int cz = -1; cz <= 1; cz++) { + world.theChunkProviderServer.loadChunk(chunkX + cx, chunkZ + cz); + } + } + + buildPlatform(world, x, y, z); + buildPlatform(world, x + 12, y - 1, z); + buildBridge(world, x + 4, y - 1, z); + buildDock(world, x + 17, y - 1, z); + decorate(world, x, y, z); + DimensionPortalData.get(world) + .setTarget(x, y, z); + } + + public static void buildPlatform(World world, int x, int y, int z) { + int baseSize = 9; + int halfBase = baseSize / 2; + + // Build upside down pyramid layers + for (int layer = 0; layer < halfBase + 1; layer++) { + int size = baseSize - (layer * 2); + int yLevel = y - layer; + + for (int dx = -size / 2; dx <= size / 2; dx++) { + for (int dz = -size / 2; dz <= size / 2; dz++) { + world.setBlock(x + dx, yLevel, z + dz, Blocks.stonebrick, 0, 2); + } + } + + // Stair ring + if (layer != 0) { + int prevSize = size + 2; + int edge = prevSize / 2; + // North + for (int dx = -edge; dx <= edge - 1; dx++) { + world.setBlock(x + dx, yLevel, z - edge, Blocks.stone_brick_stairs, 6, 2); + } + // East + for (int dz = -edge + 1; dz <= edge; dz++) { + world.setBlock(x - edge, yLevel, z + dz, Blocks.stone_brick_stairs, 4, 2); + } + // West + for (int dz = -edge; dz <= edge - 1; dz++) { + world.setBlock(x + edge, yLevel, z + dz, Blocks.stone_brick_stairs, 5, 2); + } + // South + for (int dx = -edge + 1; dx <= edge; dx++) { + world.setBlock(x + dx, yLevel, z + edge, Blocks.stone_brick_stairs, 7, 2); + } + } + } + + int tipY = y - (halfBase + 1); + if (ModBlocks.LAPIS_AETHERIUS.isEnabled()) { + world.setBlock(x, tipY, z, ModBlocks.LAPIS_AETHERIUS.get(), 14, 2); + } else { + world.setBlock(x, tipY, z, Blocks.stonebrick, 0, 2); + } + + // Fence ring + // North + int topEdge = baseSize / 2; + for (int dx = -topEdge; dx <= topEdge; dx++) { + world.setBlock(x + dx, y + 1, z - topEdge, Blocks.fence, 0, 2); + } + // East + for (int dz = -topEdge; dz <= topEdge; dz++) { + world.setBlock(x - topEdge, y + 1, z + dz, Blocks.fence, 0, 2); + } + // West + for (int dz = -topEdge; dz <= topEdge; dz++) { + world.setBlock(x + topEdge, y + 1, z + dz, Blocks.fence, 0, 2); + } + // South + for (int dx = -topEdge; dx <= topEdge; dx++) { + world.setBlock(x + dx, y + 1, z + topEdge, Blocks.fence, 0, 2); + } + } + + private void buildBridge(World world, int x, int y, int z) { + for (int dx = 0; dx < 4; dx++) { + for (int dz = -1; dz <= 1; dz++) { + world.setBlock(x + dx, y, z + dz, Blocks.stonebrick, 0, 2); + } + } + + world.setBlock(x, y + 2, z, Blocks.air, 0, 2); + world.setBlock(x, y + 1, z, Blocks.stone_brick_stairs, 1, 2); + + for (int dx = 1; dx <= 3; dx++) { + for (int dz : new int[] { -1, 1 }) { + world.setBlock(x + dx, y + 1, z + dz, Blocks.fence, 0, 2); + if (dx == 1) { + world.setBlock(x + dx, y + 2, z + dz, Blocks.fence, 0, 2); + } + } + } + + world.setBlock(x + 4, y + 1, z, Blocks.air, 0, 2); + } + + private void buildDock(World world, int x, int y, int z) { + for (int dz = -1; dz <= 1; dz++) { + world.setBlock(x, y, z + dz, Blocks.stone_stairs, 5, 2); + } + for (int dz = -1; dz <= 1; dz++) { + world.setBlock(x + 1, y, z + dz, Blocks.stone_slab, 11, 2); + } + world.setBlock(x + 2, y, z - 1, Blocks.stone_stairs, 4, 2); + world.setBlock(x + 2, y, z, Blocks.stone_stairs, 1, 2); + world.setBlock(x + 2, y, z + 1, Blocks.stone_stairs, 4, 2); + for (int dx = 0; dx <= 2; dx++) { + world.setBlock(x + dx, y + 1, z - 1, Blocks.cobblestone_wall, 0, 2); + world.setBlock(x + dx, y + 1, z + 1, Blocks.cobblestone_wall, 0, 2); + } + world.setBlock(x - 1, y + 1, z, Blocks.air, 0, 2); + } + + private void decorate(World world, int x, int y, int z) { + world.setBlock(x, y, z, this, 0, 2); + world.setBlock(x, y + 1, z, Blocks.air, 0, 2); + world.setBlock(x, y + 2, z, Blocks.air, 0, 2); + for (int dx = -1; dx <= 1; dx++) { + for (int dz = -1; dz <= 1; dz++) { + world.setBlock(x + dx, y - 1, z + dz, Blocks.bedrock, 0, 2); + } + } + for (int dy = 0; dy <= 3; dy++) { + world.setBlock(x + 12, y + dy, z, Blocks.cobblestone_wall, 0, 2); + } + + world.setBlock(x + 12, y + 4, z, Blocks.glowstone, 0, 2); + world.setBlock(x + 12, y + 5, z, Blocks.stone_slab, 3, 2); + world.setBlock(x + 15, y, z - 3, Blocks.cauldron, 3, 2); + world.setBlock(x + 15, y, z - 2, Blocks.flower_pot, 0, 2); + TileEntity tileEntity = world.getTileEntity(x + 15, y, z - 2); + if (tileEntity instanceof TileEntityFlowerPot pot) { + pot.func_145964_a((Item) Item.itemRegistry.getObject("sapling"), 0); + } + world.setBlock(x + 9, y, z + 3, Blocks.flower_pot, 0, 2); + tileEntity = world.getTileEntity(x + 9, y, z + 3); + if (tileEntity instanceof TileEntityFlowerPot pot) { + pot.func_145964_a((Item) Item.itemRegistry.getObject("sapling"), 0); + } + } + + public static class ItemBlockPortalEndOfTime extends ItemBlock { + + public ItemBlockPortalEndOfTime(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { + list.add(EnumChatFormatting.GRAY + StatCollector.translateToLocal("tile.temporal_gate.desc")); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalUnderWorld.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalUnderWorld.java new file mode 100644 index 00000000..5b7f0360 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalUnderWorld.java @@ -0,0 +1,264 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.ArrayList; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.common.dimensions.UIETeleporter; +import com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld.UnderWorldSourceProperty; +import com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld.WorldProviderUnderWorld; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; +import com.fouristhenumber.utilitiesinexcess.config.dimensions.UnderWorldConfig; +import com.fouristhenumber.utilitiesinexcess.render.ISBRHUnderworldPortal; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockPortalUnderWorld extends BlockContainer { + + public BlockPortalUnderWorld() { + super(Material.rock); + + setBlockName("underworld_portal"); + setResistance(60000000); + setLightOpacity(0); + } + + @Override + public boolean isNormalCube(IBlockAccess world, int x, int y, int z) { + return false; + } + + @SideOnly(Side.CLIENT) + @Override + public boolean isBlockNormalCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @SideOnly(Side.CLIENT) + @Override + public int getRenderType() { + return ISBRHUnderworldPortal.RENDER_ID; + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + return ModBlocks.BEDROCKIUM_BLOCK.get() + .getIcon(side, meta); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityPortalUnderWorld(); + } + + @Override + public float getBlockHardness(World worldIn, int x, int y, int z) { + if (worldIn.getTileEntity(x, y, z) instanceof TileEntityPortalUnderWorld portal && portal.invulnerable) { + return -1f; + } else { + return 5f; + } + } + + @Override + public void onBlockPlacedBy(World worldIn, int x, int y, int z, EntityLivingBase placer, ItemStack itemIn) { + super.onBlockPlacedBy(worldIn, x, y, z, placer, itemIn); + + NBTTagCompound tag = itemIn.getTagCompound(); + + if (tag != null && worldIn.getTileEntity(x, y, z) instanceof TileEntityPortalUnderWorld tile) { + tile.hasDest = true; + tile.destX = tag.getInteger("destX"); + tile.destY = tag.getInteger("destY"); + tile.destZ = tag.getInteger("destZ"); + } + } + + private TileEntityPortalUnderWorld tile; + + @Override + public void onBlockHarvested(World worldIn, int x, int y, int z, int meta, EntityPlayer player) { + super.onBlockHarvested(worldIn, x, y, z, meta, player); + + tile = (TileEntityPortalUnderWorld) worldIn.getTileEntity(x, y, z); + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + NBTTagCompound tag = new NBTTagCompound(); + + tag.setInteger("destX", tile.destX); + tag.setInteger("destY", tile.destY); + tag.setInteger("destZ", tile.destZ); + + tile = null; + + ItemStack stack = new ItemStack(this, 1); + stack.setTagCompound(tag); + + ArrayList list = new ArrayList<>(); + + list.add(stack); + + return list; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + + if (!world.isRemote) { + if (world.provider instanceof WorldProviderUnderWorld) { + UnderWorldSourceProperty source = (UnderWorldSourceProperty) player + .getExtendedProperties(UnderWorldSourceProperty.PROP_KEY); + + WorldServer dest = MinecraftServer.getServer() + .worldServerForDimension(source.entranceWorld); + + BlockPos spawn = findSpawnLocation(dest, source.entranceX, source.entranceY, source.entranceZ); + + if (spawn == null) { + player.addChatComponentMessage(new ChatComponentTranslation("uie.chat.portal_blocked")); + } else { + teleport((EntityPlayerMP) player, dest, spawn.x, spawn.y, spawn.z); + } + } else { + if (world.getTileEntity(x, y, z) instanceof TileEntityPortalUnderWorld tile) { + WorldServer dest = MinecraftServer.getServer() + .worldServerForDimension(UnderWorldConfig.underWorldDimensionId); + + if (!tile.hasDest || dest.getBlock(tile.destX, tile.destY, tile.destZ) != this) { + BlockPos existing = findPortal(dest, x, z); + + if (existing != null) { + tile.hasDest = true; + tile.destX = existing.x; + tile.destY = existing.y; + tile.destZ = existing.z; + } else { + generateSpawnRoom(dest, x, 150, z); + + tile.hasDest = true; + tile.destX = x; + tile.destY = 150; + tile.destZ = z; + } + } + + BlockPos spawn = findPortal(dest, tile.destX, tile.destZ); + + if (spawn == null) { + player.addChatComponentMessage(new ChatComponentTranslation("uie.chat.portal_blocked")); + } else { + UnderWorldSourceProperty source = (UnderWorldSourceProperty) player + .getExtendedProperties(UnderWorldSourceProperty.PROP_KEY); + + source.entranceWorld = world.provider.dimensionId; + source.entranceX = x; + source.entranceY = y; + source.entranceZ = z; + + teleport((EntityPlayerMP) player, dest, spawn.x, spawn.y, spawn.z); + } + } + } + } + + return true; + } + + private BlockPos findSpawnLocation(World world, int x, int y, int z) { + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + if (dir == ForgeDirection.DOWN) continue; + + if (!world.isAirBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ)) continue; + if (!world.isAirBlock(x + dir.offsetX, y + dir.offsetY + 1, z + dir.offsetZ)) continue; + + return new BlockPos(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); + } + + return null; + } + + private void teleport(EntityPlayerMP player, WorldServer world, int x, int y, int z) { + UIETeleporter teleporter = new UIETeleporter(world, x, y, z); + + FMLCommonHandler.instance() + .getMinecraftServerInstance() + .getConfigurationManager() + .transferPlayerToDimension(player, world.provider.dimensionId, teleporter); + } + + private BlockPos findPortal(World world, int x, int z) { + for (int y = 0; y < world.getActualHeight(); y++) { + for (int dz = -16; dz <= 16; dz++) { + for (int dx = -16; dx <= 16; dx++) { + if (world.getBlock(x + dx, y, z + dz) == this) { + return new BlockPos(x + dx, y, z + dz); + } + } + } + } + + return null; + } + + private void generateSpawnRoom(World world, int x, int y, int z) { + for (int dy = -1; dy <= 4; dy++) { + for (int dz = -3; dz <= 3; dz++) { + for (int dx = -3; dx <= 3; dx++) { + boolean surface = dx == -3 || dx == 3 || dy == -1 || dy == 4 || dz == -3 || dz == 3; + + if (surface) { + world.setBlock(x + dx, y + dy, z + dz, Blocks.cobblestone); + } else { + world.setBlock(x + dx, y + dy, z + dz, Blocks.air); + } + } + } + } + + world.setBlock(x, y, z, this); + ((TileEntityPortalUnderWorld) world.getTileEntity(x, y, z)).invulnerable = true; + + world.setBlock(x - 2, y, z - 2, Blocks.torch); + world.setBlock(x + 2, y, z - 2, Blocks.torch); + world.setBlock(x + 2, y, z + 2, Blocks.torch); + world.setBlock(x - 2, y, z + 2, Blocks.torch); + + world.setBlock(x + 2, y, z, Blocks.torch); + world.setBlock(x - 2, y, z, Blocks.torch); + world.setBlock(x, y, z + 2, Blocks.torch); + world.setBlock(x, y, z - 2, Blocks.torch); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPureLove.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPureLove.java new file mode 100644 index 00000000..fa4eb63f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPureLove.java @@ -0,0 +1,49 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPureLove; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; + +public class BlockPureLove extends BlockContainer { + + public BlockPureLove() { + super(Material.iron); + setStepSound(soundTypeMetal); + setHardness(1f); + setBlockName("pure_love"); + setBlockTextureName("utilitiesinexcess:pure_love"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityPureLove(); + } + + public static class ItemBlockPureLove extends ItemBlock { + + public ItemBlockPureLove(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean bool) { + tooltip.add( + EnumChatFormatting.LIGHT_PURPLE + "" + + EnumChatFormatting.ITALIC + + StatCollector + .translateToLocalFormatted("tile.pure_love.desc", BlockConfig.pureLove.rangePureLove)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRadicallyReducedChest.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRadicallyReducedChest.java new file mode 100644 index 00000000..defa53fc --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRadicallyReducedChest.java @@ -0,0 +1,21 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRadicallyReducedChest; + +public class BlockRadicallyReducedChest extends BlockSignificantlyShrunkChest { + + public BlockRadicallyReducedChest() { + super(); + setBlockName("radically_reduced_chest"); + setBlockBounds(0.4f, 0, 0.4f, 0.6f, 0.2f, 0.6f); + setHardness(1.5F); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityRadicallyReducedChest(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRainMuffler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRainMuffler.java new file mode 100644 index 00000000..c22b9aba --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRainMuffler.java @@ -0,0 +1,84 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRainMuffler.NBT_RAIN_MUFFLED; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRainMuffler; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; + +public class BlockRainMuffler extends BlockContainer { + + public BlockRainMuffler() { + super(Material.sponge); + setStepSound(soundTypeCloth); + setBlockName("rain_muffler"); + setBlockTextureName("utilitiesinexcess:rain_muffler"); + setHardness(0.5f); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityRainMuffler(); + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof TileEntityRainMuffler muffler) { + muffler.onInputChanged(); + } + } + + @Override + public void onBlockAdded(World worldIn, int x, int y, int z) { + TileEntity te = worldIn.getTileEntity(x, y, z); + if (te instanceof TileEntityRainMuffler muffler) { + muffler.onInputChanged(); + } + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + NBTTagCompound playerNBT = player.getEntityData(); + NBTTagCompound persistentNBT = playerNBT.getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG); + boolean nowActive = !persistentNBT.getBoolean(NBT_RAIN_MUFFLED); + persistentNBT.setBoolean(NBT_RAIN_MUFFLED, nowActive); + playerNBT.setTag(EntityPlayer.PERSISTED_NBT_TAG, persistentNBT); + if (worldIn.isRemote) { + if (nowActive) { + player.addChatMessage(new ChatComponentTranslation("tile.rain_muffler.chat.global_enable")); + } else { + player.addChatMessage(new ChatComponentTranslation("tile.rain_muffler.chat.global_disable")); + } + } + return true; + } + + public static class ItemBlockRainMuffler extends ItemBlock { + + public ItemBlockRainMuffler(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean bool) { + tooltip.add( + StatCollector + .translateToLocalFormatted("tile.rain_muffler.desc.1", BlockConfig.rainMuffler.rainMufflerRange)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRedstoneClock.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRedstoneClock.java new file mode 100644 index 00000000..f04b8a77 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRedstoneClock.java @@ -0,0 +1,58 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRedstoneClock; + +public class BlockRedstoneClock extends BlockContainer { + + public BlockRedstoneClock() { + super(Material.rock); + setBlockName("redstone_clock"); + setBlockTextureName("utilitiesinexcess:redstone_clock"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityRedstoneClock(); + } + + @Override + public boolean isNormalCube(IBlockAccess world, int x, int y, int z) { + return true; + } + + @Override + public boolean canProvidePower() { + return true; + } + + @Override + public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int side) { + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof TileEntityRedstoneClock) { + return ((TileEntityRedstoneClock) te).getOutputPower(); + } + return 0; + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { + super.onNeighborBlockChange(world, x, y, z, neighbor); + + if (neighbor instanceof BlockRedstoneClock) { + // Don't let neighbouring clocks trigger updates to each other + return; + } + + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof TileEntityRedstoneClock) { + ((TileEntityRedstoneClock) te).onInputChanged(); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSignificantlyShrunkChest.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSignificantlyShrunkChest.java new file mode 100644 index 00000000..5e939d29 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSignificantlyShrunkChest.java @@ -0,0 +1,61 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import com.cleanroommc.modularui.factory.GuiFactories; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySignificantlyShrunkChest; +import com.fouristhenumber.utilitiesinexcess.render.ScaledCubeFaceIcon; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockSignificantlyShrunkChest extends BlockMarginallyMaximisedChest { + + public BlockSignificantlyShrunkChest() { + super(); + setBlockName("significantly_shrunk_chest"); + setBlockBounds(0.3f, 0, 0.3f, 0.7f, 0.4f, 0.7f); + setHardness(1.5F); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntitySignificantlyShrunkChest(); + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + if (!worldIn.isRemote) { + GuiFactories.tileEntity() + .open(player, x, y, z); + } + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + icons = new IIcon[3]; + int i = 0; + for (String side : sideNames) { + IIcon icon = reg.registerIcon(String.format("%s:%s_%s", UtilitiesInExcess.MODID, getTextureName(), side)); + icons[i++] = new ScaledCubeFaceIcon(icon, this, side.equals("top")); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSmartPump.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSmartPump.java new file mode 100644 index 00000000..263a0528 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSmartPump.java @@ -0,0 +1,22 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySmartPump; + +public class BlockSmartPump extends BlockContainer { + + public BlockSmartPump() { + super(Material.iron); + setBlockName("smart_pump"); + setBlockTextureName("utilitiesinexcess:smart_pump"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntitySmartPump(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSoundMuffler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSoundMuffler.java new file mode 100644 index 00000000..d110fcf9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSoundMuffler.java @@ -0,0 +1,66 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySoundMuffler; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; + +public class BlockSoundMuffler extends BlockContainer { + + public BlockSoundMuffler() { + super(Material.sponge); + setStepSound(soundTypeCloth); + setBlockName("sound_muffler"); + setBlockTextureName("utilitiesinexcess:sound_muffler"); + setHardness(0.5f); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntitySoundMuffler(); + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof TileEntitySoundMuffler muffler) { + muffler.onInputChanged(); + } + } + + @Override + public void onBlockAdded(World worldIn, int x, int y, int z) { + TileEntity te = worldIn.getTileEntity(x, y, z); + if (te instanceof TileEntitySoundMuffler muffler) { + muffler.onInputChanged(); + } + } + + public static class ItemBlockSoundMuffler extends ItemBlock { + + public ItemBlockSoundMuffler(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean bool) { + String formatted = StatCollector + .translateToLocalFormatted("tile.sound_muffler.desc.1", BlockConfig.soundMuffler.soundMufflerRange); + tooltip.add(formatted); + tooltip.add( + StatCollector.translateToLocalFormatted( + "tile.sound_muffler.desc.2", + BlockConfig.soundMuffler.soundMufflerReduction)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSpike.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSpike.java new file mode 100644 index 00000000..822d4fa1 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSpike.java @@ -0,0 +1,214 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.spikeRenderID; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySpike; +import com.google.common.collect.Multimap; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockSpike extends Block { + + public BlockSpike(SpikeType spikeType, String name) { + super(spikeType.material.getMaterial()); + this.spikeType = spikeType; + setBlockName(name); + setBlockTextureName("utilitiesinexcess:models/wood_spike"); + setHardness(spikeType.material.getBlockHardness(null, 0, 0, 0)); + setResistance(spikeType.material.getExplosionResistance(null)); + setHarvestLevel(spikeType.material.getHarvestTool(0), spikeType.material.getHarvestLevel(0)); + } + + private static final ThreadLocal cachedDrop = new ThreadLocal<>(); + private final SpikeType spikeType; + + @Override + public TileEntity createTileEntity(World world, int meta) { + return new TileEntitySpike(spikeType); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase placer, ItemStack stack) { + if (!world.isRemote) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntitySpike spike) { + ItemStack copy = stack.copy(); + copy.stackSize = 1; + spike.setFakeWeapon(copy); + } + } + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + if (!world.isRemote) { + if (world.getTileEntity(x, y, z) instanceof TileEntitySpike spike) { + spike.damageEntity(entity); + } + } + } + + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB mask, List list, + Entity collider) { + AxisAlignedBB fullBox = AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1); + if (fullBox.intersectsWith(mask)) { + list.add(fullBox); + } + + if (collider instanceof EntityLivingBase) { + double inset = 0.05; + AxisAlignedBB damageBox = AxisAlignedBB + .getBoundingBox(x + inset, y, z + inset, x + 1 - inset, y + 1, z + 1 - inset); + + if (damageBox.intersectsWith(mask)) { + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof TileEntitySpike spike) { + spike.damageEntity(collider); + } + } + } + } + + // Cache the itemStack held by the TE before it's removed + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntitySpike spike) { + ItemStack toDrop = spike.getFakeWeapon(); + if (toDrop != null) { + cachedDrop.set(toDrop.copy()); + } else { + cachedDrop.remove(); + } + } + + super.breakBlock(world, x, y, z, block, meta); + } + + // Drop the cached ItemStack + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList drops = new ArrayList<>(); + ItemStack drop = cachedDrop.get(); + + drops.add(drop != null ? drop : new ItemStack(this)); + + cachedDrop.remove(); + return drops; + } + + public SpikeType getSpikeType() { + return spikeType; + } + + @Override + public boolean hasTileEntity(int meta) { + return true; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public int getRenderType() { + return spikeRenderID; + } + + private final static IIcon[] icons = new IIcon[4]; + + @Override + public void registerBlockIcons(IIconRegister reg) { + icons[0] = reg.registerIcon("utilitiesinexcess:models/wood_spike"); + icons[1] = reg.registerIcon("utilitiesinexcess:models/iron_spike"); + icons[2] = reg.registerIcon("utilitiesinexcess:models/gold_spike"); + icons[3] = reg.registerIcon("utilitiesinexcess:models/diamond_spike"); + super.registerBlockIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return switch (spikeType) { + case WOOD -> icons[0]; + case IRON -> icons[1]; + case GOLD -> icons[2]; + case DIAMOND -> icons[3]; + }; + } + + public enum SpikeType { + + WOOD(Blocks.planks, 0.5F), + IRON(Blocks.iron_block, 6F), + GOLD(Blocks.gold_block, 4F), + DIAMOND(Blocks.diamond_block, 7F); + + final Block material; + final float damage; + + SpikeType(Block material, float damage) { + this.material = material; + this.damage = damage; + } + } + + public static class ItemSpike extends ItemBlock { + + private final float attackDamage; + + public ItemSpike(Block block) { + super(block); + this.setHasSubtypes(true); + this.setMaxDamage(0); + + BlockSpike spike = (BlockSpike) block; + this.attackDamage = spike.getSpikeType().damage; + } + + @Override + public int getItemEnchantability() { + return 10; + } + + @Override + public boolean isItemTool(ItemStack p_77616_1_) { + return true; + } + + @Override + public Multimap getAttributeModifiers(ItemStack stack) { + Multimap map = super.getAttributeModifiers(stack); + + map.put( + SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Spike Weapon modifier", this.attackDamage, 0)); + return map; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTradingPost.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTradingPost.java new file mode 100644 index 00000000..bd80465a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTradingPost.java @@ -0,0 +1,64 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import com.cleanroommc.modularui.factory.GuiFactories; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTradingPost; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockTradingPost extends BlockContainer { + + public IIcon sideTexture; + public IIcon bottomTexture; + + public BlockTradingPost() { + super(Material.wood); + setBlockName("trading_post"); + setBlockTextureName("utilitiesinexcess:trading_post"); + setHardness(3.0F); + setResistance(7.0F); + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer playerIn, int side, float hitX, + float hitY, float hitZ) { + if (!worldIn.isRemote) { + GuiFactories.tileEntity() + .open(playerIn, x, y, z); + } + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityTradingPost(); + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon(this.getTextureName() + "_top"); + this.sideTexture = reg.registerIcon(this.getTextureName() + "_side"); + this.bottomTexture = reg.registerIcon(this.getTextureName() + "_bottom"); + } + + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return side == 1 ? this.blockIcon : (side == 0 ? bottomTexture : this.sideTexture); + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(IBlockAccess worldIn, int x, int y, int z, int side) { + return getIcon(side, 0); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTrashCanEnergy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTrashCanEnergy.java new file mode 100644 index 00000000..d4f21d90 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTrashCanEnergy.java @@ -0,0 +1,38 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanEnergy; +import com.gtnewhorizon.gtnhlib.client.model.ModelISBRH; + +public class BlockTrashCanEnergy extends BlockContainer { + + public BlockTrashCanEnergy() { + super(Material.rock); + setBlockName("trash_can_energy"); + setBlockTextureName("utilitiesinexcess:trash_can_energy"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityTrashCanEnergy(); + } + + @Override + public int getRenderType() { + return ModelISBRH.JSON_ISBRH_ID; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTrashCanFluid.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTrashCanFluid.java new file mode 100644 index 00000000..b12219cf --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTrashCanFluid.java @@ -0,0 +1,68 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidContainerRegistry; + +import com.cleanroommc.modularui.factory.GuiFactories; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanFluid; +import com.gtnewhorizon.gtnhlib.client.model.ModelISBRH; + +public class BlockTrashCanFluid extends BlockContainer { + + public BlockTrashCanFluid() { + super(Material.rock); + setBlockName("trash_can_fluid"); + setBlockTextureName("utilitiesinexcess:trash_can_fluid"); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, + float hitY, float hitZ) { + if (world.isRemote) { + return true; + } + + ItemStack heldItem = player.getCurrentEquippedItem(); + if (heldItem == null) { + GuiFactories.tileEntity() + .open(player, x, y, z); + return true; + } + + if (FluidContainerRegistry.isFilledContainer(heldItem)) { + ItemStack emptyContainer = FluidContainerRegistry.drainFluidContainer(heldItem); + emptyContainer.stackSize = heldItem.stackSize; + player.inventory.setInventorySlotContents(player.inventory.currentItem, emptyContainer); + return true; + } else { + GuiFactories.tileEntity() + .open(player, x, y, z); + } + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityTrashCanFluid(); + } + + @Override + public int getRenderType() { + return ModelISBRH.JSON_ISBRH_ID; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTrashCanItem.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTrashCanItem.java new file mode 100644 index 00000000..22fe4df7 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockTrashCanItem.java @@ -0,0 +1,50 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.cleanroommc.modularui.factory.GuiFactories; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanItem; +import com.gtnewhorizon.gtnhlib.client.model.ModelISBRH; + +public class BlockTrashCanItem extends BlockContainer { + + public BlockTrashCanItem() { + super(Material.rock); + setBlockName("trash_can_item"); + setBlockTextureName("utilitiesinexcess:trash_can_item"); + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer playerIn, int side, float hitX, + float hitY, float hitZ) { + if (!worldIn.isRemote) { + GuiFactories.tileEntity() + .open(playerIn, x, y, z); + } + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityTrashCanItem(); + } + + @Override + public int getRenderType() { + return ModelISBRH.JSON_ISBRH_ID; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockUpdateDetector.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockUpdateDetector.java new file mode 100644 index 00000000..91eb9bfa --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockUpdateDetector.java @@ -0,0 +1,63 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityBlockUpdateDetector; + +public class BlockUpdateDetector extends BlockContainer { + + public BlockUpdateDetector() { + super(Material.rock); + setBlockName("block_update_detector"); + setBlockTextureName("utilitiesinexcess:block_update_detector"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityBlockUpdateDetector(); + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { + + if (neighbor == this) { + // Don't let detectors trigger updates off each other + return; + } + + // Prevent constant updates from redstone dust (there must be a more correct way of doing this?) + if (neighbor == Blocks.redstone_wire) { + return; + } + + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof TileEntityBlockUpdateDetector tileBUD) { + tileBUD.onNeighborUpdate(); + } + } + + @Override + public boolean canProvidePower() { + return true; + } + + @Override + public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof TileEntityBlockUpdateDetector tileBUD) { + return tileBUD.getOutputPower(); + } + return 0; + } + + @Override + public boolean isNormalCube(IBlockAccess world, int x, int y, int z) { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockBaseGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockBaseGenerator.java new file mode 100644 index 00000000..a2b9b6a5 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockBaseGenerator.java @@ -0,0 +1,40 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.generators; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; + +import com.cleanroommc.modularui.factory.GuiFactories; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityBaseGenerator; + +public abstract class BlockBaseGenerator extends BlockContainer { + + public int multiplier; + + protected BlockBaseGenerator(String id, int mult) { + super(Material.iron); + multiplier = mult; + setBlockName(id); + setBlockTextureName("utilitiesinexcess:generators/" + id); + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer playerIn, int side, float hitX, + float hitY, float hitZ) { + if (!worldIn.isRemote) { + GuiFactories.tileEntity() + .open(playerIn, x, y, z); + } + return true; + } + + @Override + public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) { + if (worldIn.getTileEntity(x, y, z) instanceof TileEntityBaseGenerator generator) { + generator.onNeighborBlockChange(); + } + super.onNeighborBlockChange(worldIn, x, y, z, neighbor); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockEnderGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockEnderGenerator.java new file mode 100644 index 00000000..48c02e45 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockEnderGenerator.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.generators; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityEnderGenerator; + +public class BlockEnderGenerator extends BlockBaseGenerator { + + public BlockEnderGenerator(String id, int mult) { + super(id, mult); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityEnderGenerator(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockFoodGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockFoodGenerator.java new file mode 100644 index 00000000..48049089 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockFoodGenerator.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.generators; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityFoodGenerator; + +public class BlockFoodGenerator extends BlockBaseGenerator { + + public BlockFoodGenerator(String id, int mult) { + super(id, mult); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityFoodGenerator(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockFurnaceGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockFurnaceGenerator.java new file mode 100644 index 00000000..ca3ff191 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockFurnaceGenerator.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.generators; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityFurnaceGenerator; + +public class BlockFurnaceGenerator extends BlockBaseGenerator { + + public BlockFurnaceGenerator(String id, int mult) { + super(id, mult); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityFurnaceGenerator(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockHighTemperatureFurnaceGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockHighTemperatureFurnaceGenerator.java new file mode 100644 index 00000000..a883288c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockHighTemperatureFurnaceGenerator.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.generators; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityHighTemperatureFurnaceGenerator; + +public class BlockHighTemperatureFurnaceGenerator extends BlockBaseGenerator { + + public BlockHighTemperatureFurnaceGenerator(String id, int mult) { + super(id, mult); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityHighTemperatureFurnaceGenerator(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockLavaGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockLavaGenerator.java new file mode 100644 index 00000000..b6f40d74 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockLavaGenerator.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.generators; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityLavaGenerator; + +public class BlockLavaGenerator extends BlockBaseGenerator { + + public BlockLavaGenerator(String id, int mult) { + super(id, mult); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityLavaGenerator(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockLowTemperatureFurnaceGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockLowTemperatureFurnaceGenerator.java new file mode 100644 index 00000000..148525bc --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockLowTemperatureFurnaceGenerator.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.generators; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityLowTemperatureFurnaceGenerator; + +public class BlockLowTemperatureFurnaceGenerator extends BlockBaseGenerator { + + public BlockLowTemperatureFurnaceGenerator(String id, int mult) { + super(id, mult); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityLowTemperatureFurnaceGenerator(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockNetherStarGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockNetherStarGenerator.java new file mode 100644 index 00000000..0c37795d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockNetherStarGenerator.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.generators; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityNetherStarGenerator; + +public class BlockNetherStarGenerator extends BlockBaseGenerator { + + public BlockNetherStarGenerator(String id, int mult) { + super(id, mult); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityNetherStarGenerator(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockPinkGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockPinkGenerator.java new file mode 100644 index 00000000..e5f0d794 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockPinkGenerator.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.generators; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityPinkGenerator; + +public class BlockPinkGenerator extends BlockBaseGenerator { + + public BlockPinkGenerator(String id, int mult) { + super(id, mult); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityPinkGenerator(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockPotionGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockPotionGenerator.java new file mode 100644 index 00000000..7f3b10c9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockPotionGenerator.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.generators; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityPotionGenerator; + +public class BlockPotionGenerator extends BlockBaseGenerator { + + public BlockPotionGenerator(String id, int mult) { + super(id, mult); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityPotionGenerator(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockRedstoneGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockRedstoneGenerator.java new file mode 100644 index 00000000..9a1e25eb --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockRedstoneGenerator.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.generators; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityRedstoneGenerator; + +public class BlockRedstoneGenerator extends BlockBaseGenerator { + + public BlockRedstoneGenerator(String id, int mult) { + super(id, mult); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityRedstoneGenerator(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockSolarGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockSolarGenerator.java new file mode 100644 index 00000000..3419a9bd --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockSolarGenerator.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.generators; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntitySolarGenerator; + +public class BlockSolarGenerator extends BlockBaseGenerator { + + public BlockSolarGenerator(String id, int mult) { + super(id, mult); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntitySolarGenerator(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockTNTGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockTNTGenerator.java new file mode 100644 index 00000000..3f6b9115 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/generators/BlockTNTGenerator.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.generators; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityTNTGenerator; + +public class BlockTNTGenerator extends BlockBaseGenerator { + + public BlockTNTGenerator(String id, int mult) { + super(id, mult); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityTNTGenerator(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNode.java new file mode 100644 index 00000000..39fa7383 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNode.java @@ -0,0 +1,27 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityRetrievalNode; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; + +public class BlockRetrievalNode extends BlockTransferNodeBase { + + public BlockRetrievalNode() { + super(); + setBlockName("retrieval_node"); + } + + @Override + public String getTopIcon() { + return "utilitiesinexcess:retrieval_node_top"; + } + + // TODO: new TE + // yes zir! + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityRetrievalNode(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNodeFluid.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNodeFluid.java new file mode 100644 index 00000000..ef1121a9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNodeFluid.java @@ -0,0 +1,25 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; + +public class BlockRetrievalNodeFluid extends BlockTransferNodeBase { + + public BlockRetrievalNodeFluid() { + super(); + setBlockName("retrieval_node_fluid"); + } + + @Override + public String getTopIcon() { + return "utilitiesinexcess:retrieval_node_fluid_top"; + } + + // TODO: new TE + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityTransferNode(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNode.java new file mode 100644 index 00000000..a41f718c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNode.java @@ -0,0 +1,19 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; + +public class BlockTransferNode extends BlockTransferNodeBase { + + public BlockTransferNode() { + super(); + setBlockName("transfer_node"); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityTransferNode(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java new file mode 100644 index 00000000..6a96b2be --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java @@ -0,0 +1,141 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; + +import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferNodeRenderID; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.cleanroommc.modularui.factory.GuiFactories; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeBase; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockTransferNodeBase extends BlockContainer { + + protected BlockTransferNodeBase() { + super(Material.iron); + setBlockTextureName(getTopIcon()); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return null; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean hasTileEntity(int metadata) { + return true; + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + if (!worldIn.isRemote) GuiFactories.tileEntity() + .open(player, x, y, z); + return true; + } + + protected void updateConnections(World world, int x, int y, int z) { + if (!world.isRemote) { + TileEntityTransferNodeBase te = (TileEntityTransferNodeBase) world.getTileEntity(x, y, z); + if (te != null) { + boolean changed = te.updateConnections(world, x, y, z); + if (changed) { + world.markBlockForUpdate(x, y, z); + } + } + } + } + + @Override + public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int meta) { + return ForgeDirection.getOrientation(side) + .getOpposite() + .ordinal(); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase placer, ItemStack stack) { + super.onBlockPlacedBy(world, x, y, z, placer, stack); + int meta = world.getBlockMetadata(x, y, z); + world.setBlockMetadataWithNotify(x, y, z, meta, 2); + updateConnections(world, x, y, z); + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { + updateConnections(world, x, y, z); + } + + @Override + public int getRenderType() { + return transferNodeRenderID; + } + + @Override + public IIcon getIcon(int side, int meta) { + if (side == meta) return icons[0]; + return icons[1]; + } + + @SideOnly(Side.CLIENT) + protected IIcon[] icons; + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + icons = new IIcon[2]; + icons[0] = reg.registerIcon("utilitiesinexcess:transfer_node_bottom"); + icons[1] = reg.registerIcon(getTopIcon()); + } + + public String getTopIcon() { + return "utilitiesinexcess:transfer_node_top"; + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + switch (meta) { + case 0: + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.625F, 1.0F); + break; + case 1: + this.setBlockBounds(0.0F, 1.0F - 0.625F, 0.0F, 1.0F, 1.0F, 1.0F); + break; + case 2: + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.625F); + break; + case 3: + this.setBlockBounds(0.0F, 0.0F, 1.0F - 0.625F, 1.0F, 1.0F, 1.0F); + break; + case 4: + this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.625F, 1.0F, 1.0F); + break; + case 5: + this.setBlockBounds(1.0F - 0.625F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + break; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java new file mode 100644 index 00000000..cda3940b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java @@ -0,0 +1,25 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; + +public class BlockTransferNodeEnergy extends BlockTransferNodeBase { + + public BlockTransferNodeEnergy() { + super(); + setBlockName("transfer_node_energy"); + } + + @Override + public String getTopIcon() { + return "utilitiesinexcess:transfer_node_energy_top"; + } + + // TODO: new TE + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityTransferNode(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeFluid.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeFluid.java new file mode 100644 index 00000000..df147a79 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeFluid.java @@ -0,0 +1,24 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeFluid; + +public class BlockTransferNodeFluid extends BlockTransferNodeBase { + + public BlockTransferNodeFluid() { + super(); + setBlockName("transfer_node_fluid"); + } + + @Override + public String getTopIcon() { + return "utilitiesinexcess:transfer_node_fluid_top"; + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityTransferNodeFluid(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeHyperEnergy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeHyperEnergy.java new file mode 100644 index 00000000..a2476fcd --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeHyperEnergy.java @@ -0,0 +1,25 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; + +public class BlockTransferNodeHyperEnergy extends BlockTransferNodeBase { + + public BlockTransferNodeHyperEnergy() { + super(); + setBlockName("transfer_node_hyper_energy"); + } + + @Override + public String getTopIcon() { + return "utilitiesinexcess:transfer_node_hyper_energy_top"; + } + + // TODO: new TE + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityTransferNode(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java new file mode 100644 index 00000000..c3c9b919 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java @@ -0,0 +1,85 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; + +import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; + +public class BlockTransferPipe extends BlockContainer { + + public BlockTransferPipe() { + super(Material.iron); + this.setBlockName("transfer_pipe"); + this.setBlockTextureName("utilitiesinexcess:transfer_pipe"); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean hasTileEntity(int metadata) { + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityTransferPipe(); + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { + updateConnections(world, x, y, z); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase placer, ItemStack itemIn) { + updateConnections(world, x, y, z); + } + + protected void updateConnections(World world, int x, int y, int z) { + if (!world.isRemote) { + TileEntityTransferPipe te = (TileEntityTransferPipe) world.getTileEntity(x, y, z); + if (te != null) { + boolean changed = te.updateConnections(world, x, y, z); + if (changed) { + world.markBlockForUpdate(x, y, z); + } + } + } + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + TileEntityTransferPipe te = (TileEntityTransferPipe) world.getTileEntity(x, y, z); + if (te == null) return; + int mask = te.getConnectionsMask(); + + float minX = (mask & 1 << 1) != 0 ? 0F : 0.375F; + float maxX = (mask & 1) != 0 ? 1F : 0.625F; + float minY = (mask & 1 << 3) != 0 ? 0F : 0.375F; + float maxY = (mask & 1 << 2) != 0 ? 1F : 0.625F; + float minZ = (mask & 1 << 5) != 0 ? 0F : 0.375F; + float maxZ = (mask & 1 << 4) != 0 ? 1F : 0.625F; + this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ); + } + + @Override + public int getRenderType() { + return transferPipeRenderID; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/UIETeleporter.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/UIETeleporter.java new file mode 100644 index 00000000..705dec5f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/UIETeleporter.java @@ -0,0 +1,40 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions; + +import net.minecraft.entity.Entity; +import net.minecraft.world.Teleporter; +import net.minecraft.world.WorldServer; + +/// Hacky Teleporter implementation that moves the player to a specific location instead of using the portal system. +public class UIETeleporter extends Teleporter { + + private final int x; + private final int y; + private final int z; + + public UIETeleporter(WorldServer world, int x, int y, int z) { + super(world); + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public void placeInPortal(Entity entity, double p_77185_2_, double p_77185_4_, double p_77185_6_, + float p_77185_8_) { + entity.setLocationAndAngles(x + 0.5, y, z + 0.5, entity.rotationYaw, 0.0F); + entity.motionX = entity.motionY = entity.motionZ = 0.0D; + } + + @Override + public boolean placeInExistingPortal(Entity entity, double p_77184_2_, double p_77184_4_, double p_77184_6_, + float p_77184_8_) { + entity.setLocationAndAngles(x + 0.5, y, z + 0.5, entity.rotationYaw, 0.0F); + entity.motionX = entity.motionY = entity.motionZ = 0.0D; + return true; + } + + @Override + public boolean makePortal(Entity p_85188_1_) { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/UIEWorldChunkManager.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/UIEWorldChunkManager.java new file mode 100644 index 00000000..52ac9fba --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/UIEWorldChunkManager.java @@ -0,0 +1,65 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions; + +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.biome.WorldChunkManager; + +public class UIEWorldChunkManager extends WorldChunkManager { + + private final BiomeGenBase biome; + + public UIEWorldChunkManager(BiomeGenBase biome) { + this.biome = biome; + } + + public BiomeGenBase getBiomeGenAt(int x, int z) { + return this.biome; + } + + public BiomeGenBase[] getBiomesForGeneration(BiomeGenBase[] array, int x, int z, int width, int depth) { + if (array == null || array.length < width * depth) { + array = new BiomeGenBase[width * depth]; + } + + Arrays.fill(array, 0, width * depth, this.biome); + return array; + } + + public float[] getRainfall(float[] array, int x, int z, int width, int depth) { + if (array == null || array.length < width * depth) { + array = new float[width * depth]; + } + + Arrays.fill(array, 0, width * depth, 0f); + return array; + } + + public BiomeGenBase[] loadBlockGeneratorData(BiomeGenBase[] array, int x, int z, int width, int depth) { + if (array == null || array.length < width * depth) { + array = new BiomeGenBase[width * depth]; + } + + Arrays.fill(array, 0, width * depth, this.biome); + return array; + } + + public BiomeGenBase[] getBiomeGenAt(BiomeGenBase[] array, int x, int z, int width, int depth, boolean cache) { + return this.loadBlockGeneratorData(array, x, z, width, depth); + } + + public ChunkPosition findBiomePosition(int x, int z, int range, List allowed, Random rng) { + if (allowed.contains(this.biome)) { + return new ChunkPosition(x - range + rng.nextInt(range * 2 + 1), 0, z - range + rng.nextInt(range * 2 + 1)); + } else { + return null; + } + } + + public boolean areBiomesViable(int x, int z, int range, List allowed) { + return allowed.contains(this.biome); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/BiomeGenEndOfTime.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/BiomeGenEndOfTime.java new file mode 100644 index 00000000..b017e4fe --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/BiomeGenEndOfTime.java @@ -0,0 +1,23 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime; + +import net.minecraft.world.biome.BiomeGenBase; + +import com.fouristhenumber.utilitiesinexcess.config.dimensions.EndOfTimeConfig; + +public class BiomeGenEndOfTime extends BiomeGenBase { + + public BiomeGenEndOfTime(int id) { + super(id); + + if (!EndOfTimeConfig.endOfTimeSpawning) { + this.spawnableMonsterList.clear(); + this.spawnableCreatureList.clear(); + this.spawnableWaterCreatureList.clear(); + this.spawnableCaveCreatureList.clear(); + } + + this.enableRain = EndOfTimeConfig.endOfTimeRain; + + this.setBiomeName("End of Time"); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/ChunkProviderEndOfTime.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/ChunkProviderEndOfTime.java new file mode 100644 index 00000000..4cc4a65a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/ChunkProviderEndOfTime.java @@ -0,0 +1,94 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime; + +import java.util.List; + +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.util.IProgressUpdate; +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.biome.BiomeGenBase.SpawnListEntry; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; + +public class ChunkProviderEndOfTime implements IChunkProvider { + + private final World world; + + public ChunkProviderEndOfTime(World world) { + this.world = world; + } + + @Override + public Chunk provideChunk(int chunkX, int chunkZ) { + return new Chunk(world, chunkX, chunkZ); + } + + /// Populates the given chunk. Note that MC populates the +X/+Z corner of it, not the chunk itself. + /// All positions should be offset by +8,+8 to account for this. + /// The 4 chunks around the corner are properly generated and may be accessed. Modifying chunks outside of these 4 + /// will cause cascading worldgen. + @Override + public void populate(IChunkProvider provider, int chunkX, int chunkZ) {} + + /// Checks what creatures can spawn on the given block + @Override + public List getPossibleCreatures(EnumCreatureType creatureType, int x, int y, int z) { + BiomeGenBase biome = this.world.getBiomeGenForCoords(x, z); + return biome.getSpawnableList(creatureType); + } + + /// Scans the chunk for existing structures + @Override + public void recreateStructures(int chunkX, int chunkZ) {} + + // + + @Override + public Chunk loadChunk(int x, int z) { + return provideChunk(x, z); + } + + @Override + public String makeString() { + return "EndOfTime"; + } + + @Override + public boolean chunkExists(int x, int z) { + return true; + } + + @Override + public boolean saveChunks(boolean p_73151_1_, IProgressUpdate p_73151_2_) { + return false; + } + + @Override + public boolean unloadQueuedChunks() { + return false; + } + + @Override + public boolean canSave() { + return false; + } + + @Override + public ChunkPosition func_147416_a(World world, String structureName, int x, int y, int z) { + // findClosestStructure(String type, int x, int y, int z) + return null; + } + + @Override + public int getLoadedChunkCount() { + return 0; + } + + @Override + public void saveExtraData() { + + } + + // +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/DimensionPortalData.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/DimensionPortalData.java new file mode 100644 index 00000000..17dc6123 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/DimensionPortalData.java @@ -0,0 +1,58 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.World; +import net.minecraft.world.WorldSavedData; +import net.minecraft.world.storage.MapStorage; + +public class DimensionPortalData extends WorldSavedData { + + public static final String DATA_NAME = "PortalTarget"; + private int x, y, z; + static DimensionPortalData INSTANCE; + + public DimensionPortalData() { + this(DATA_NAME); + } + + public DimensionPortalData(String tagName) { + super(tagName); + } + + public static DimensionPortalData get(World world) { + MapStorage storage = world.perWorldStorage; + DimensionPortalData.INSTANCE = (DimensionPortalData) storage + .loadData(DimensionPortalData.class, DimensionPortalData.DATA_NAME); + if (INSTANCE == null) { + INSTANCE = new DimensionPortalData(DATA_NAME); + storage.setData(DATA_NAME, INSTANCE); + } + return INSTANCE; + } + + public void setTarget(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + markDirty(); + } + + public ChunkCoordinates getTarget() { + return new ChunkCoordinates(x, y, z); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + x = nbt.getInteger("X"); + y = nbt.getInteger("Y"); + z = nbt.getInteger("Z"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + nbt.setInteger("X", x); + nbt.setInteger("Y", y); + nbt.setInteger("Z", z); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/EndOfTimeEvents.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/EndOfTimeEvents.java new file mode 100644 index 00000000..d009823c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/EndOfTimeEvents.java @@ -0,0 +1,26 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime; + +import net.minecraftforge.event.world.WorldEvent; + +import com.fouristhenumber.utilitiesinexcess.config.dimensions.EndOfTimeConfig; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +/// Various event hooks for the end of time +public class EndOfTimeEvents { + + public static final EndOfTimeEvents INSTANCE = new EndOfTimeEvents(); + + public static void init() { + FMLCommonHandler.instance() + .bus() + .register(INSTANCE); + } + + @SubscribeEvent + public void disableSpawning(WorldEvent.PotentialSpawns event) { + if (!EndOfTimeConfig.endOfTimeSpawning) event.setCanceled(true); + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/EndOfTimeSourceProperty.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/EndOfTimeSourceProperty.java new file mode 100644 index 00000000..ecc29338 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/EndOfTimeSourceProperty.java @@ -0,0 +1,56 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.IExtendedEntityProperties; +import net.minecraftforge.event.entity.EntityEvent.EntityConstructing; + +import com.gtnewhorizon.gtnhlib.eventbus.EventBusSubscriber; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +/// Stores the player's source portal location +@EventBusSubscriber +public class EndOfTimeSourceProperty implements IExtendedEntityProperties { + + public static final String PROP_KEY = "end-of-time-source"; + + public int entranceX, entranceY, entranceZ, entranceWorld; + + @SubscribeEvent + public static void onEntityConstructing(EntityConstructing event) { + if (event.entity instanceof EntityPlayer player) { + player.registerExtendedProperties(PROP_KEY, new EndOfTimeSourceProperty()); + } + } + + @Override + public void saveNBTData(NBTTagCompound compound) { + NBTTagCompound tag = new NBTTagCompound(); + compound.setTag(PROP_KEY, tag); + + tag.setInteger("entranceX", entranceX); + tag.setInteger("entranceY", entranceY); + tag.setInteger("entranceZ", entranceZ); + tag.setInteger("entranceWorld", entranceWorld); + } + + @Override + public void loadNBTData(NBTTagCompound compound) { + NBTTagCompound tag = compound.getCompoundTag(PROP_KEY); + + if (tag != null) { + entranceX = tag.getInteger("entranceX"); + entranceY = tag.getInteger("entranceY"); + entranceZ = tag.getInteger("entranceZ"); + entranceWorld = tag.getInteger("entranceWorld"); + } + } + + @Override + public void init(Entity entity, World world) { + + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/WorldProviderEndOfTime.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/WorldProviderEndOfTime.java new file mode 100644 index 00000000..494c4817 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/endoftime/WorldProviderEndOfTime.java @@ -0,0 +1,102 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime; + +import net.minecraft.entity.Entity; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.Vec3; +import net.minecraft.world.WorldProvider; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.chunk.IChunkProvider; + +import com.fouristhenumber.utilitiesinexcess.common.dimensions.UIEWorldChunkManager; +import com.fouristhenumber.utilitiesinexcess.config.dimensions.EndOfTimeConfig; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class WorldProviderEndOfTime extends WorldProvider { + + @Override + public void registerWorldChunkManager() { + this.worldChunkMgr = new UIEWorldChunkManager(BiomeGenBase.getBiome(EndOfTimeConfig.defaultBiomeId)); + this.dimensionId = EndOfTimeConfig.endOfTimeDimensionId; + this.hasNoSky = true; + } + + @Override + public IChunkProvider createChunkGenerator() { + return new ChunkProviderEndOfTime(this.worldObj); + } + + @Override + public float calculateCelestialAngle(long p_76563_1_, float p_76563_3_) { + return 0.0F; + } + + @Override + @SideOnly(Side.CLIENT) + public float[] calcSunriseSunsetColors(float p_76560_1_, float p_76560_2_) { + return null; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isSkyColored() { + return false; + } + + @SideOnly(Side.CLIENT) + public Vec3 getSkyColor(Entity p_72833_1_, float p_72833_2_) { + return Vec3.createVectorHelper(0, 0, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public Vec3 getFogColor(float p_76562_1_, float p_76562_2_) { + return Vec3.createVectorHelper(0, 0, 0); + } + + @Override + public boolean canRespawnHere() { + return false; + } + + @Override + public boolean isSurfaceWorld() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public float getCloudHeight() { + return 8.0F; + } + + @Override + public boolean canCoordinateBeSpawn(int x, int z) { + return this.worldObj.getTopBlock(x, z) + .getMaterial() + .blocksMovement(); + } + + @Override + public ChunkCoordinates getEntrancePortalLocation() { + return DimensionPortalData.get(this.worldObj) + .getTarget(); + } + + @Override + public int getAverageGroundLevel() { + return 64; + } + + @Override + public int getActualHeight() { + return 256; + } + + @Override + public String getDimensionName() { + return "The End of Time"; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/BiomeDecoratorUnderWorld.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/BiomeDecoratorUnderWorld.java new file mode 100644 index 00000000..af5987e1 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/BiomeDecoratorUnderWorld.java @@ -0,0 +1,60 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld; + +import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.COAL; +import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.DIAMOND; +import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.GOLD; +import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.IRON; +import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.LAPIS; +import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.REDSTONE; + +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.BiomeDecorator; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.terraingen.OreGenEvent; +import net.minecraftforge.event.terraingen.TerrainGen; + +public class BiomeDecoratorUnderWorld extends BiomeDecorator { + + @Override + protected void generateOres() { + double difficulty = getChunkProvider().getDifficulty(chunk_X, chunk_Z); + + boolean isAggressiveArea = difficulty >= 2; + + MinecraftForge.ORE_GEN_BUS.post(new OreGenEvent.Pre(currentWorld, randomGenerator, chunk_X, chunk_Z)); + + if (TerrainGen.generateOre(currentWorld, randomGenerator, coalGen, chunk_X, chunk_Z, COAL)) { + this.genStandardOre1(isAggressiveArea ? 60 : 20, this.coalGen, 0, 255); + + this.genStandardOre1(isAggressiveArea ? 60 : 20, this.coalGen, 0, 80); + } + + if (TerrainGen.generateOre(currentWorld, randomGenerator, ironGen, chunk_X, chunk_Z, IRON)) { + this.genStandardOre1(isAggressiveArea ? 60 : 20, this.ironGen, 0, 255); + + this.genStandardOre1(isAggressiveArea ? 60 : 20, this.ironGen, 0, 80); + } + + if (TerrainGen.generateOre(currentWorld, randomGenerator, goldGen, chunk_X, chunk_Z, GOLD)) { + this.genStandardOre1(isAggressiveArea ? 18 : 2, this.goldGen, 0, 32); + } + + if (TerrainGen.generateOre(currentWorld, randomGenerator, redstoneGen, chunk_X, chunk_Z, REDSTONE)) { + this.genStandardOre1(isAggressiveArea ? 32 : 8, this.redstoneGen, 0, 48); + } + + if (TerrainGen.generateOre(currentWorld, randomGenerator, diamondGen, chunk_X, chunk_Z, DIAMOND)) { + this.genStandardOre1(isAggressiveArea ? 9 : 1, this.diamondGen, 0, 32); + } + + if (TerrainGen.generateOre(currentWorld, randomGenerator, lapisGen, chunk_X, chunk_Z, LAPIS)) { + this.genStandardOre2(isAggressiveArea ? 9 : 1, this.lapisGen, 32, 64); + } + + MinecraftForge.ORE_GEN_BUS.post(new OreGenEvent.Post(currentWorld, randomGenerator, chunk_X, chunk_Z)); + } + + private ChunkProviderUnderWorld getChunkProvider() { + return (ChunkProviderUnderWorld) ((WorldServer) currentWorld).theChunkProviderServer.currentChunkProvider; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/BiomeGenUnderWorld.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/BiomeGenUnderWorld.java new file mode 100644 index 00000000..fee4f0dc --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/BiomeGenUnderWorld.java @@ -0,0 +1,21 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld; + +import net.minecraft.init.Blocks; +import net.minecraft.world.biome.BiomeGenBase; + +public class BiomeGenUnderWorld extends BiomeGenBase { + + public BiomeGenUnderWorld(int id) { + super(id); + + this.spawnableCreatureList.clear(); + this.spawnableWaterCreatureList.clear(); + + this.topBlock = Blocks.cobblestone; + this.fillerBlock = Blocks.stone; + + this.theBiomeDecorator = new BiomeDecoratorUnderWorld(); + + this.setBiomeName("Underworld"); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/ChunkProviderUnderWorld.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/ChunkProviderUnderWorld.java new file mode 100644 index 00000000..ccca9597 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/ChunkProviderUnderWorld.java @@ -0,0 +1,486 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld; + +import static net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.ANIMALS; +import static net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.LAKE; +import static net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.LAVA; + +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.init.Blocks; +import net.minecraft.util.IProgressUpdate; +import net.minecraft.util.MathHelper; +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.SpawnerAnimals; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.biome.BiomeGenBase.SpawnListEntry; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.feature.WorldGenBigMushroom; +import net.minecraft.world.gen.feature.WorldGenLakes; +import net.minecraft.world.gen.structure.MapGenMineshaft; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.terraingen.PopulateChunkEvent.Post; +import net.minecraftforge.event.terraingen.PopulateChunkEvent.Pre; +import net.minecraftforge.event.terraingen.TerrainGen; + +import com.fouristhenumber.utilitiesinexcess.common.worldgen.util.Box; +import com.fouristhenumber.utilitiesinexcess.common.worldgen.util.ChunkBlockView; +import com.fouristhenumber.utilitiesinexcess.config.dimensions.UnderWorldConfig; +import com.fouristhenumber.utilitiesinexcess.utils.IntRange; +import com.fouristhenumber.utilitiesinexcess.utils.noise.NoiseSampler; +import com.fouristhenumber.utilitiesinexcess.utils.noise.OctavesSampler; +import com.fouristhenumber.utilitiesinexcess.utils.noise.ScaledNoise; +import com.fouristhenumber.utilitiesinexcess.utils.noise.SimplexNoiseSampler; +import com.gtnewhorizon.gtnhlib.hash.Fnv1a64; +import com.gtnewhorizon.gtnhlib.util.CoordinatePacker; +import com.gtnewhorizon.gtnhlib.util.data.BlockMeta; +import com.gtnewhorizon.gtnhlib.util.data.ImmutableBlockMeta; + +import it.unimi.dsi.fastutil.longs.LongArrayFIFOQueue; + +public class ChunkProviderUnderWorld implements IChunkProvider { + + public static final IntRange FLOOR = new IntRange(50, 70), CEILING = new IntRange(110, 130); + + private static final WorldGenLakes WATER_LAKES = new WorldGenLakes(Blocks.water); + private static final WorldGenLakes LAVA_LAKES = new WorldGenLakes(Blocks.lava); + + private final World world; + private final long seed; + private final Random rng = new Random(0); + + private final NoiseSampler floor, ceiling, feature, difficulty, mushrooms, boulders; + + private final MapGenMineshaft mineshaftGenerator = new MapGenMineshaft(); + private final WorldGenBigMushroom bigMushroomGen = new WorldGenBigMushroom(); + private final WorldGenBoulders boulderGen = new WorldGenBoulders( + Arrays.asList(Blocks.air, Blocks.stone, Blocks.cobblestone), + Blocks.cobblestone); + + public ChunkProviderUnderWorld(World world, long seed) { + this.world = world; + this.seed = seed; + + Random rng = new Random(seed); + + floor = new ScaledNoise(new OctavesSampler(rng, 4), 0.0075d, 0.0075d, 0.0075d); + ceiling = new ScaledNoise(new OctavesSampler(rng, 4), 0.0075d, 0.0075d, 0.0075d); + feature = new SimplexNoiseSampler(rng); + + difficulty = new ScaledNoise(new SimplexNoiseSampler(rng), 0.02, 0.02, 0.02, 2, 2); + + mushrooms = new ScaledNoise(new OctavesSampler(rng, 2), 0.1, 0.1, 0.1, 2, -1.4); + boulders = new ScaledNoise(new OctavesSampler(rng, 2), 0.1, 0.1, 0.1, 0.1, 0.1); + } + + @Override + public Chunk provideChunk(int chunkX, int chunkZ) { + Chunk chunk = new Chunk(world, chunkX, chunkZ); + chunk.isModified = true; + + ChunkBlockView view = new ChunkBlockView(chunk); + + view.subViewMutable(Box.horizontalChunkSlice(0, 0)) + .fill(new BlockMeta(Blocks.bedrock, 0)); + view.subViewMutable(new Box(0, 1, 0, 15, 255, 15)) + .fill(new BlockMeta(Blocks.stone, 0)); + + int blockX = chunkX * 16; + int blockZ = chunkZ * 16; + + ImmutableBlockMeta stone = new BlockMeta(Blocks.stone, 0); + ImmutableBlockMeta cobble = new BlockMeta(Blocks.cobblestone, 0); + ImmutableBlockMeta air = new BlockMeta(Blocks.air, 0); + + // Each chunk is generated by column. + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + int x2 = blockX + x; + int z2 = blockZ + z; + + int floorLevel = getFloorLevel(x2, z2); + int ceilingLevel = getCeilingLevel(x2, z2); + + // Generate the basic terrain + for (int y = floorLevel - 2; y < ceilingLevel + 3; y++) { + ImmutableBlockMeta bm = air; + + if (y <= floorLevel || y >= ceilingLevel) { + bm = cobble; + } + + view.setBlock(x, y, z, bm); + } + + // Get the raw feature noise. This controls pillars and holes. + // The domain is [-1, 1] + double feature = this.feature.sample(x2 * 0.025, z2 * 0.025); + + // We only want to generate pillars at noise values 0.75 and up. + // This value controls how much of the pillar is 'full' for this column. + // In other words, 0.5 means the stone goes 25% up from the bottom and 25% down from the top. + double pillar = linearCurve(feature, 0.75, 0, 0.9, 1); + + boolean hasPillar = pillar > 0; + + // Generate pillar, if present + if (hasPillar) { + double span = 1d / (ceilingLevel - floorLevel); + + double bump = this.feature.sample(x2, z2) * 0.1 - 0.05; + + // Replace the cobble shell from the terraingen with stone + for (int y = floorLevel - 3; y <= floorLevel; y++) { + view.setBlock(x, y, z, stone); + } + + for (int y = ceilingLevel; y <= ceilingLevel + 3; y++) { + view.setBlock(x, y, z, stone); + } + + // Generate the pillar stone + for (int y = floorLevel + 1; y < ceilingLevel; y++) { + int dist = Math.min(y - floorLevel - 1, ceilingLevel - y); + + // This is magic... I don't know how it works and I didn't know how it worked when I made it + double scalar = MathHelper.sin((float) (span * (double) dist * 2 + bump)); + + if (scalar < pillar) { + view.setBlock(x, y, z, stone); + } + } + + // Set the inner-most 2 stone blocks to cobble stone (bottom half) + for (int y = floorLevel + 1; y < ceilingLevel; y++) { + if (view.getBlock(x, y, z) != Blocks.stone) { + for (int y2 = y - 1; y2 > Math.max(floorLevel, y - 3); y2--) { + view.setBlock(x, y2, z, cobble); + } + break; + } + } + + // Set the inner-most 2 stone blocks to cobble stone (top half) + for (int y = ceilingLevel - 1; y > floorLevel; y--) { + if (view.getBlock(x, y, z) != Blocks.stone) { + for (int y2 = y + 1; y2 < Math.min(ceilingLevel, y + 3); y2++) { + view.setBlock(x, y2, z, cobble); + } + break; + } + } + } + + // Generate void holes + if (feature <= -0.7) { + // Use an aggressive curve here to make the walls extremely steep, while maintaining an obvious + // slope. + double holeDepth = linearCurve(feature, -0.75, 1, -0.7, 0); + + int holeLevel = (int) (floorLevel * (1 - holeDepth)); + + for (int y = floorLevel; y >= holeLevel; y--) { + view.setBlock(x, y, z, air); + } + } + } + } + + // Populate the biomes from the world chunk manager + BiomeGenBase[] biomes = world.getWorldChunkManager() + .loadBlockGeneratorData(null, chunkX * 16, chunkZ * 16, 16, 16); + + byte[] biomeIDs = chunk.getBiomeArray(); + + for (int k = 0; k < biomeIDs.length; ++k) { + biomeIDs[k] = (byte) biomes[k].biomeID; + } + + // Fix the height maps + chunk.generateSkylightMap(); + chunk.resetRelightChecks(); + + // Scan the chunk for mineshaft starts + mineshaftGenerator.func_151539_a(this, world, chunkX, chunkZ, null); + + return chunk; + } + + /// Gets the ceiling block level for the given column (returned value is the lowest non-air terrain block) + private int getCeilingLevel(int x, int z) { + return CEILING.lerp(this.ceiling.sample(x, z)); + } + + /// Gets the floor block level for the given column (returned value is the highest non-air terrain block) + private int getFloorLevel(int x, int z) { + return FLOOR.lerp(this.floor.sample(x, z)); + } + + public static double map(double x, double in_min, double in_max, double out_min, double out_max) { + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + } + + public static double clamp(double val, double lo, double hi) { + return Math.min(hi, Math.max(val, lo)); + } + + public static double linearCurve(double x, double x1, double y1, double x2, double y2) { + x = clamp(x, Math.min(x1, x2), Math.max(x1, x2)); + + return map(x, x1, x2, y1, y2); + } + + /// Populates the given chunk. Note that MC populates the +X/+Z corner of it, not the chunk itself. + /// All positions should be offset by +8,+8 to account for this. + /// The 4 chunks around the corner are properly generated and may be accessed. Modifying chunks outside of these 4 + /// will cause cascading worldgen. + @Override + public void populate(IChunkProvider provider, int chunkX, int chunkZ) { + // Initialize the RNG with a deterministic seed + long seed = Fnv1a64.initialState(); + seed = Fnv1a64.hashStep(seed, this.seed); + seed = Fnv1a64.hashStep(seed, chunkX); + seed = Fnv1a64.hashStep(seed, chunkZ); + rng.setSeed(seed); + + int blockX = chunkX * 16; + int blockZ = chunkZ * 16; + + MinecraftForge.EVENT_BUS.post(new Pre(provider, world, rng, chunkX, chunkZ, false)); + + // Generate water lakes, if possible + if (this.rng.nextInt(32) == 0 && TerrainGen.populate(provider, world, rng, chunkX, chunkZ, false, LAKE)) { + int x = blockX + this.rng.nextInt(16) + 8; + int z = blockZ + this.rng.nextInt(16) + 8; + + if (isValidFeatureSpot(x, z)) { + WATER_LAKES.generate(this.world, this.rng, x, getFloorLevel(x, z), z); + } + } + + // Generate lava lakes, if possible. More common than water lakes. + if (this.rng.nextInt(16) == 0 && TerrainGen.populate(provider, world, rng, chunkX, chunkZ, false, LAVA)) { + int x = blockX + this.rng.nextInt(16) + 8; + int z = blockZ + this.rng.nextInt(16) + 8; + + if (isValidFeatureSpot(x, z)) { + LAVA_LAKES.generate(this.world, this.rng, x, getFloorLevel(x, z), z); + } + } + + // Do biome decoration (ore gen, mostly) + BiomeGenBase biome = this.world.getBiomeGenForCoords(blockX + 16, blockZ + 16); + biome.decorate(this.world, this.rng, blockX, blockZ); + + // Build any mineshafts + mineshaftGenerator.generateStructuresInChunk(world, rng, chunkX, chunkZ); + + // Try to place a boulder in this chunk, if needed + if (rng.nextDouble() <= getBoulder(chunkX, chunkZ)) { + for (int tries = 0; tries < 4; tries++) { + int x = blockX + this.rng.nextInt(16) + 8; + int z = blockZ + this.rng.nextInt(16) + 8; + + int y = getFloorLevel(x, z) + 1; + + if (isValidFeatureSpot(x, z)) { + if (boulderGen.generate(world, rng, x, y, z)) break; + } + } + } + + int mushrooms = getMushroom(chunkX, chunkZ); + + // Try to place mushrooms in this chunk + for (int placed = 0, tries = 0; placed <= mushrooms && tries < 10; tries++) { + int x = blockX + this.rng.nextInt(16) + 8; + int z = blockZ + this.rng.nextInt(16) + 8; + + if (!isValidFeatureSpot(x, z)) { + continue; + } + + int y = getFloorLevel(x, z) + 1; + + // If the terrain was excavated by a lake/etc, don't spawn a mushroom here + if (!validMyceliumSpawnLocation(x, y - 1, z)) { + continue; + } + + // bigMushroomGen needs something that mushrooms can spawn on to work, place some temporary mycelium + world.setBlock(x, y - 1, z, Blocks.mycelium); + + // Fallibly place the mushroom + if (!this.bigMushroomGen.generate(this.world, this.rng, x, y, z)) { + // If it failed, revert the cobble to mycelium + world.setBlock(x, y - 1, z, Blocks.cobblestone); + continue; + } + + // Generate some extra mycelium around the base to make it look like a growth on the floor + spawnMycelium(x, y - 1, z, 13); + placed++; + } + + // Spawn some monsters + if (TerrainGen.populate(provider, world, rng, chunkX, chunkZ, false, ANIMALS)) { + SpawnerAnimals.performWorldGenSpawning(this.world, biome, blockX + 8, blockZ + 8, 16, 16, this.rng); + } + + MinecraftForge.EVENT_BUS.post(new Post(provider, world, rng, chunkX, chunkZ, false)); + } + + /// Checks if the column is far enough from pillars and holes for populated features to spawn + private boolean isValidFeatureSpot(int x, int z) { + double feature = this.feature.sample(x * 0.025, z * 0.025); + return feature >= -0.5 && feature <= 0.5; + } + + /// Checks what ceatures can spawn on the given block + @Override + public List getPossibleCreatures(EnumCreatureType creatureType, int x, int y, int z) { + BiomeGenBase biome = this.world.getBiomeGenForCoords(x, z); + return biome.getSpawnableList(creatureType); + } + + /// Scans the chunk for existing structures + @Override + public void recreateStructures(int chunkX, int chunkZ) { + mineshaftGenerator.func_151539_a(this, world, chunkX, chunkZ, null); + } + + /// Gets the difficulty for this chunk. Domain: [0, 4]. Represents the multiplier for material gains and mob spawns. + /// Difficulties above 2 have aggressive mob spawning. + public double getDifficulty(int chunkX, int chunkZ) { + if (!UnderWorldConfig.enableDifficulty) return 0; + + return difficulty.sample(chunkX, chunkZ); + } + + /// Gets the chance for big mushrooms in the given chunk. Domain: [0, 2] + private int getMushroom(int chunkX, int chunkZ) { + return (int) Math.min(2, mushrooms.sample(chunkX, chunkZ)); + } + + /// Gets the chance for boulders in the given chunk. Domain: [0, 1] + private double getBoulder(int chunkX, int chunkZ) { + return boulders.sample(chunkX, chunkZ); + } + + private static final ForgeDirection[] HORIZONTAL = { ForgeDirection.NORTH, ForgeDirection.SOUTH, + ForgeDirection.WEST, ForgeDirection.EAST, }; + + /// Checks to make sure the location is a valid mycelium spot. Has a special case for the initial block (mushroom + /// block on top of mycelium) + private boolean validMyceliumSpawnLocation(int x, int y, int z) { + Block block = world.getBlock(x, y, z); + Block above = world.getBlock(x, y + 1, z); + + return (block == Blocks.cobblestone || block == Blocks.mycelium) + && (above.isAir(world, x, y + 1, z) || above == Blocks.brown_mushroom_block + || above == Blocks.red_mushroom_block); + } + + /// Spawns mycelium blocks in place of cobble stone randomly, starting from the given coordinate. + private void spawnMycelium(int x, int y, int z, int amount) { + LongArrayFIFOQueue queue = new LongArrayFIFOQueue(); + + queue.enqueue(CoordinatePacker.pack(x, y, z)); + + while (!queue.isEmpty() && amount > 0) { + long curr = queue.dequeueLong(); + + int x2 = CoordinatePacker.unpackX(curr); + int y2 = CoordinatePacker.unpackY(curr); + int z2 = CoordinatePacker.unpackZ(curr); + + boolean valid = validMyceliumSpawnLocation(x2, y2, z2); + + if (!valid && validMyceliumSpawnLocation(x2, y2 + 1, z2)) { + y2++; + valid = true; + } + + if (!valid && validMyceliumSpawnLocation(x2, y2 - 1, z2)) { + y2--; + valid = true; + } + + if (!valid) continue; + + world.setBlock(x2, y2, z2, Blocks.mycelium); + amount--; + + int i = rng.nextInt(4); + + ForgeDirection dir = HORIZONTAL[i]; + queue.enqueue(CoordinatePacker.pack(x2 + dir.offsetX, y2 + dir.offsetY, z2 + dir.offsetZ)); + + i += rng.nextInt(4); + + dir = HORIZONTAL[i % 4]; + queue.enqueue(CoordinatePacker.pack(x2 + dir.offsetX, y2 + dir.offsetY, z2 + dir.offsetZ)); + + i += rng.nextInt(4); + + dir = HORIZONTAL[i % 4]; + queue.enqueue(CoordinatePacker.pack(x2 + dir.offsetX, y2 + dir.offsetY, z2 + dir.offsetZ)); + } + } + + // + + @Override + public Chunk loadChunk(int x, int z) { + return provideChunk(x, z); + } + + @Override + public String makeString() { + return "UnderWorld"; + } + + @Override + public boolean chunkExists(int x, int z) { + return true; + } + + @Override + public boolean saveChunks(boolean p_73151_1_, IProgressUpdate p_73151_2_) { + return false; + } + + @Override + public boolean unloadQueuedChunks() { + return false; + } + + @Override + public boolean canSave() { + return false; + } + + @Override + public ChunkPosition func_147416_a(World world, String structureName, int x, int y, int z) { + // findClosestStructure(String type, int x, int y, int z) + return null; + } + + @Override + public int getLoadedChunkCount() { + return 0; + } + + @Override + public void saveExtraData() { + + } + + // +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/UnderWorldEvents.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/UnderWorldEvents.java new file mode 100644 index 00000000..8df65c65 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/UnderWorldEvents.java @@ -0,0 +1,269 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld; + +import java.util.List; +import java.util.Map; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.world.EnumDifficulty; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate; +import net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable; +import net.minecraftforge.event.world.WorldEvent; + +import com.fouristhenumber.utilitiesinexcess.config.dimensions.UnderWorldConfig; +import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorPotionEffect; +import com.fouristhenumber.utilitiesinexcess.network.PacketHandler; +import com.fouristhenumber.utilitiesinexcess.network.client.PacketAggressiveMobSpawn; +import com.fouristhenumber.utilitiesinexcess.network.client.PacketUnderworldAttack; +import com.google.common.collect.MapMaker; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.eventhandler.Event.Result; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent.Phase; +import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import cpw.mods.fml.relauncher.Side; + +/// Various event hooks for the under world +public class UnderWorldEvents { + + public static final UnderWorldEvents INSTANCE = new UnderWorldEvents(); + + public static void init() { + MinecraftForge.TERRAIN_GEN_BUS.register(INSTANCE); + MinecraftForge.ORE_GEN_BUS.register(INSTANCE); + FMLCommonHandler.instance() + .bus() + .register(INSTANCE); + } + + /// Disable all plant life decoration + @SubscribeEvent + public void preventUnderworldDecoration(Decorate event) { + if (event.world.provider instanceof WorldProviderUnderWorld) { + event.setResult(Result.DENY); + } + } + + /// Disable dirt & gravel spawns, along with ore spawns if the config is disabled + @SubscribeEvent + public void preventDirtBlobs(GenerateMinable event) { + if (event.world.provider instanceof WorldProviderUnderWorld) { + switch (event.type) { + case DIRT, GRAVEL -> { + event.setResult(Result.DENY); + } + case CUSTOM -> { + if (!UnderWorldConfig.spawnCustomOre) { + event.setResult(Result.DENY); + } + } + default -> { + if (!UnderWorldConfig.spawnVanillaOre) { + event.setResult(Result.DENY); + } + } + } + } + } + + /// Significantly reduce the duration of night vision for survival players + @SubscribeEvent + public void reduceNightVision(PlayerTickEvent event) { + if (event.phase != Phase.END) return; + if (event.player.capabilities.disableDamage) return; + + if (event.player.worldObj.provider instanceof WorldProviderUnderWorld) { + PotionEffect effect = event.player.getActivePotionEffect(Potion.nightVision); + + if (effect != null && effect.getDuration() > 21 * 20) { + int duration = effect.getDuration(); + + ((AccessorPotionEffect) effect).setDuration(duration - 19); + } + } + } + + private final Map timeInDarkness = new MapMaker().weakKeys() + .makeMap(); + + private static final DamageSource GHOST = new DamageSource("underworld-ghost"); + + /// Damages survival players that sit in darkness (<3 light) for too long + @SubscribeEvent + public void damagePlayersInDark(PlayerTickEvent event) { + if (event.phase != Phase.END) return; + if (event.side != Side.SERVER) return; + + EntityPlayerMP player = (EntityPlayerMP) event.player; + if (player.capabilities.disableDamage) return; + + if (player.worldObj.provider instanceof WorldProviderUnderWorld) { + int light = player.worldObj.getBlockLightValue( + MathHelper.floor_double(player.posX), + MathHelper.floor_double(player.posY), + MathHelper.floor_double(player.posZ)); + + if (light < 3) { + int time = timeInDarkness.getOrDefault(player, 0); + + time++; + + timeInDarkness.put(player, time); + + // After 10 seconds, the player takes 4 ghost damage every 4 seconds. + if (time > 10 * 20 && time % 80 == 0) { + event.player.attackEntityFrom(GHOST, 4); + // Creates the particles and plays the sound + PacketHandler.INSTANCE.sendTo(new PacketUnderworldAttack(), player); + } + } + } + } + + /// When difficulty is enabled, reduce mob spawn rates outside of dangerous zones + @SubscribeEvent + public void reduceSpawnRates(WorldEvent.PotentialSpawns event) { + if (!UnderWorldConfig.enableDifficulty) return; + + int chunkX = event.x >> 4; + int chunkZ = event.z >> 4; + + double difficulty = ((ChunkProviderUnderWorld) ((WorldServer) event.world).theChunkProviderServer.currentChunkProvider) + .getDifficulty(chunkX, chunkZ); + + if (event.world.rand.nextDouble() > difficulty) { + event.setCanceled(true); + } + } + + enum Zone { + Normal, + Aggressive + } + + private final Map playerZone = new MapMaker().weakKeys() + .makeMap(); + + /// Spawn extra mobs on top of the player when the player is in a difficult zone. + /// Notifies the player when this is about to happen via a spooky chat message. + @SubscribeEvent + public void doAggressiveMobSpawning(PlayerTickEvent event) { + if (event.phase != Phase.END) return; + if (event.side != Side.SERVER) return; + + EntityPlayerMP player = (EntityPlayerMP) event.player; + WorldServer world = (WorldServer) event.player.worldObj; + + if (!(world.theChunkProviderServer.currentChunkProvider instanceof ChunkProviderUnderWorld)) return; + + // Only spawn once every 30 seconds + if (world.getTotalWorldTime() % 600 != 0) return; + + if (!world.getGameRules() + .getGameRuleBooleanValue("doMobSpawning")) return; + if (MinecraftServer.getServer() + .func_147135_j() == EnumDifficulty.PEACEFUL) return; + + int x = MathHelper.floor_double(player.posX); + int y = MathHelper.floor_double(player.posY); + int z = MathHelper.floor_double(player.posZ); + + int chunkX = x >> 4; + int chunkZ = z >> 4; + + double difficulty = ((ChunkProviderUnderWorld) world.theChunkProviderServer.currentChunkProvider) + .getDifficulty(chunkX, chunkZ); + + boolean isAggressive = difficulty >= 2; + + Zone current = isAggressive ? Zone.Aggressive : Zone.Normal; + Zone prev = playerZone.put(player, current); + + if (prev != current) { + if (isAggressive) { + player.addChatComponentMessage(new ChatComponentTranslation("uie.chat.underworld_aggressive")); + } else { + if (prev != null) { + player.addChatComponentMessage(new ChatComponentTranslation("uie.chat.underworld_safe")); + } + } + + // Give the player some notice instead of spawning mobs on them immediately + return; + } + + if (!isAggressive) return; + + List mobs = world.getEntitiesWithinAABB( + EntityMob.class, + AxisAlignedBB.getBoundingBox(x - 8, y - 8, z - 8, x + 8, y + 8, z + 8)); + + // Limit the number of mobs surrounding the player depending on the difficulty + if (mobs.size() > difficulty * 2 + 4) return; + + int count = Math.min(8, (int) (world.rand.nextDouble() * difficulty * 2) + 3); + + for (int i = 0; i < 20 && count > 0; i++) { + // Pick a random block within ~8 blocks of the player + // Mobs may spawn on top of the player if they aren't in light + int dx = world.rand.nextInt(16) - 8; + int dy = world.rand.nextInt(8) - 4; + int dz = world.rand.nextInt(16) - 8; + + int x2 = dx + x; + int y2 = dy + y; + int z2 = dz + z; + + if (!world.isAirBlock(x2, y2, z2)) continue; + + if (!world.getBlock(x2, y2 - 1, z2) + .canCreatureSpawn(EnumCreatureType.monster, world, x2, y2 - 1, z2)) { + continue; + } + + if (world.getBlockLightValue(x2, y2, z2) > 7) continue; + + // Spawn a random monster + var spawnEntry = world.spawnRandomCreature(EnumCreatureType.monster, x2, y2, z2); + + EntityLiving entity; + + try { + entity = spawnEntry.entityClass.getConstructor(World.class) + .newInstance(world); + } catch (Exception exception) { + exception.printStackTrace(); + continue; + } + + entity.setLocationAndAngles(dx + x + 0.5, y2, dz + z + 0.5, world.rand.nextFloat() * 360.0F, 0.0F); + + if (!entity.getCanSpawnHere()) continue; + + entity.onSpawnWithEgg(null); + world.spawnEntityInWorld(entity); + + count--; + + // Send a packet that creates some particles and plays a sound + PacketHandler.INSTANCE.sendToAllAround( + new PacketAggressiveMobSpawn(x2, y2, z2), + new TargetPoint(world.provider.dimensionId, x2, y2, z2, 64)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/UnderWorldSourceProperty.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/UnderWorldSourceProperty.java new file mode 100644 index 00000000..c33ec464 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/UnderWorldSourceProperty.java @@ -0,0 +1,56 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.IExtendedEntityProperties; +import net.minecraftforge.event.entity.EntityEvent.EntityConstructing; + +import com.gtnewhorizon.gtnhlib.eventbus.EventBusSubscriber; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +/// Stores the player's source portal location +@EventBusSubscriber +public class UnderWorldSourceProperty implements IExtendedEntityProperties { + + public static final String PROP_KEY = "underworld-source"; + + public int entranceX, entranceY, entranceZ, entranceWorld; + + @SubscribeEvent + public static void onEntityConstructing(EntityConstructing event) { + if (event.entity instanceof EntityPlayer player) { + player.registerExtendedProperties(PROP_KEY, new UnderWorldSourceProperty()); + } + } + + @Override + public void saveNBTData(NBTTagCompound compound) { + NBTTagCompound tag = new NBTTagCompound(); + compound.setTag(PROP_KEY, tag); + + tag.setInteger("entranceX", entranceX); + tag.setInteger("entranceY", entranceY); + tag.setInteger("entranceZ", entranceZ); + tag.setInteger("entranceWorld", entranceWorld); + } + + @Override + public void loadNBTData(NBTTagCompound compound) { + NBTTagCompound tag = compound.getCompoundTag(PROP_KEY); + + if (tag != null) { + entranceX = tag.getInteger("entranceX"); + entranceY = tag.getInteger("entranceY"); + entranceZ = tag.getInteger("entranceZ"); + entranceWorld = tag.getInteger("entranceWorld"); + } + } + + @Override + public void init(Entity entity, World world) { + + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/WorldGenBoulders.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/WorldGenBoulders.java new file mode 100644 index 00000000..9881a832 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/WorldGenBoulders.java @@ -0,0 +1,64 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraft.world.gen.feature.WorldGenerator; + +import org.joml.Vector3ic; + +import com.fouristhenumber.utilitiesinexcess.common.worldgen.util.Box; + +/// Generates large boulders +public class WorldGenBoulders extends WorldGenerator { + + private final List whitelist; + private final Block block; + + public WorldGenBoulders(List whitelist, Block block) { + this.whitelist = whitelist; + this.block = block; + } + + @Override + public boolean generate(World world, Random rng, int x, int y, int z) { + float r = rng.nextFloat() * 3 + 2; + int ri = MathHelper.ceiling_float_int(r); + float invR = 1f / r; + + Box box = new Box(x - ri, y - ri, z - ri, x + ri, y + ri, z + ri); + + // Check if the boulder can spawn here without clipping into something it shouldn't be + for (Vector3ic v : box) { + float dX = (x - v.x() + 0.5f) * invR; + float dY = (y - v.y() + 0.5f) * invR; + float dZ = (z - v.z() + 0.5f) * invR; + + float r2 = dX * dX + dY * dY + dZ * dZ; + + if (r2 > 1) continue; + + if (!whitelist.contains(world.getBlock(v.x(), v.y(), v.z()))) { + return false; + } + } + + // Spawn the boulder if the location is valid + for (Vector3ic v : box) { + float dX = (x - v.x()) * invR; + float dY = (y - v.y()) * invR; + float dZ = (z - v.z()) * invR; + + float r2 = dX * dX + dY * dY + dZ * dZ; + + if (r2 + rng.nextFloat() * 0.2 > 1) continue; + + world.setBlock(v.x(), v.y(), v.z(), block); + } + + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/WorldProviderUnderWorld.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/WorldProviderUnderWorld.java new file mode 100644 index 00000000..99395dad --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/dimensions/underworld/WorldProviderUnderWorld.java @@ -0,0 +1,100 @@ +package com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld; + +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.Vec3; +import net.minecraft.world.WorldProvider; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.chunk.IChunkProvider; + +import com.fouristhenumber.utilitiesinexcess.common.dimensions.UIEWorldChunkManager; +import com.fouristhenumber.utilitiesinexcess.config.dimensions.UnderWorldConfig; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class WorldProviderUnderWorld extends WorldProvider { + + @Override + public void registerWorldChunkManager() { + this.worldChunkMgr = new UIEWorldChunkManager(BiomeGenBase.getBiome(UnderWorldConfig.defaultBiomeId)); + this.dimensionId = UnderWorldConfig.underWorldDimensionId; + this.hasNoSky = true; + } + + @Override + public IChunkProvider createChunkGenerator() { + return new ChunkProviderUnderWorld(this.worldObj, this.worldObj.getSeed()); + } + + @Override + public float calculateCelestialAngle(long p_76563_1_, float p_76563_3_) { + return 0.0F; + } + + @Override + @SideOnly(Side.CLIENT) + public float[] calcSunriseSunsetColors(float p_76560_1_, float p_76560_2_) { + return null; + } + + @Override + @SideOnly(Side.CLIENT) + public Vec3 getFogColor(float p_76562_1_, float p_76562_2_) { + return Vec3.createVectorHelper(0.2, 0.2, 0.3); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isSkyColored() { + return false; + } + + @Override + public boolean canRespawnHere() { + return false; + } + + @Override + public boolean isSurfaceWorld() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public float getCloudHeight() { + return 8.0F; + } + + @Override + public boolean canCoordinateBeSpawn(int x, int z) { + return this.worldObj.getTopBlock(x, z) + .getMaterial() + .blocksMovement(); + } + + @Override + public ChunkCoordinates getEntrancePortalLocation() { + return new ChunkCoordinates(100, 50, 0); + } + + @Override + public int getAverageGroundLevel() { + return ChunkProviderUnderWorld.FLOOR.lerp(0.5); + } + + @Override + public int getActualHeight() { + return 256; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean doesXZShowFog(int p_76568_1_, int p_76568_2_) { + return true; + } + + @Override + public String getDimensionName() { + return "The Underworld"; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/entities/EntitySiegeProperty.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/entities/EntitySiegeProperty.java new file mode 100644 index 00000000..c0524fa5 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/entities/EntitySiegeProperty.java @@ -0,0 +1,60 @@ +package com.fouristhenumber.utilitiesinexcess.common.entities; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.IExtendedEntityProperties; +import net.minecraftforge.event.entity.EntityEvent; + +import com.gtnewhorizon.gtnhlib.eventbus.EventBusSubscriber; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +@EventBusSubscriber +public class EntitySiegeProperty implements IExtendedEntityProperties { + + public static final String PROP_KEY = "entity-siege"; + + public boolean siege; + public int siegeMobsKilled, beaconSpawnX, beaconSpawnY, beaconSpawnZ, siegeTimer; + + @SubscribeEvent + public static void onEntityConstructing(EntityEvent.EntityConstructing event) { + if (event.entity instanceof EntityPlayer player) { + player.registerExtendedProperties(PROP_KEY, new EntitySiegeProperty()); + } + } + + @Override + public void saveNBTData(NBTTagCompound compound) { + NBTTagCompound tag = new NBTTagCompound(); + compound.setTag(PROP_KEY, tag); + + tag.setBoolean("siege", siege); + tag.setInteger("siegeMobsKilled", siegeMobsKilled); + tag.setInteger("beaconSpawnX", beaconSpawnX); + tag.setInteger("beaconSpawnY", beaconSpawnY); + tag.setInteger("beaconSpawnZ", beaconSpawnZ); + tag.setInteger("siegeTimer", siegeTimer); + } + + @Override + public void loadNBTData(NBTTagCompound compound) { + NBTTagCompound tag = compound.getCompoundTag(PROP_KEY); + + if (tag != null) { + siege = tag.getBoolean("siege"); + siegeMobsKilled = tag.getInteger("siegeMobsKilled"); + beaconSpawnX = tag.getInteger("beaconSpawnX"); + beaconSpawnY = tag.getInteger("beaconSpawnY"); + beaconSpawnZ = tag.getInteger("beaconSpawnZ"); + siegeTimer = tag.getInteger("siegeTimer"); + } + } + + @Override + public void init(Entity entity, World world) { + + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/WateringCanEvent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/WateringCanEvent.java new file mode 100644 index 00000000..0afaa414 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/WateringCanEvent.java @@ -0,0 +1,31 @@ +package com.fouristhenumber.utilitiesinexcess.common.events; + +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +import cpw.mods.fml.common.eventhandler.Event; + +public class WateringCanEvent extends Event { + + public final BlockPos wateredBlock; + public final BlockPos originBlock; + public final int wateringCanTier; + + /** + * {@link WateringCanEvent} is fired when a block is fertilized using a watering can. + *
+ * {@link #wateredBlock} contains the {@link BlockPos} of the block being fertilized.
+ * {@link #originBlock} contains the {@link BlockPos} of the block which was clicked.
+ * {@link #wateringCanTier} contains the tier of the watering can.
+ *
+ * This event is not {@link cpw.mods.fml.common.eventhandler.Cancelable}.
+ *
+ * This event does not have a result. {@link HasResult}
+ *
+ * This event is fired on the {@link net.minecraftforge.common.MinecraftForge#EVENT_BUS}. + **/ + public WateringCanEvent(BlockPos wateredBlock, BlockPos originBlock, int wateringCanTier) { + this.wateredBlock = wateredBlock; + this.originBlock = originBlock; + this.wateringCanTier = wateringCanTier; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemAnalyzer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemAnalyzer.java new file mode 100644 index 00000000..d6a1efaa --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemAnalyzer.java @@ -0,0 +1,53 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import java.util.stream.Stream; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.world.World; + +public class ItemAnalyzer extends Item { + + public ItemAnalyzer() { + super(); + this.setTextureName("utilitiesinexcess:block_analyzer"); + this.setUnlocalizedName("block_analyzer"); + this.setMaxStackSize(1); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, + float hitX, float hitY, float hitZ) { + if (world.isRemote) return true; + Block clicked = world.getBlock(x, y, z); + int meta = world.getBlockMetadata(x, y, z); + player.addChatMessage(new ChatComponentTranslation("chat.block_analyzer.header")); + player + .addChatMessage(new ChatComponentTranslation("chat.block_analyzer.blockid", clicked.getUnlocalizedName())); + player.addChatMessage(new ChatComponentTranslation("chat.block_analyzer.blockmeta", meta)); + + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null) { + NBTTagCompound tag = new NBTTagCompound(); + tile.writeToNBT(tag); + player.addChatMessage(new ChatComponentTranslation("chat.block_analyzer.foundTE", tag.getString("id"))); + Stream nbtKeys = tag.func_150296_c() + .stream() + .sorted(); + nbtKeys.forEach( + s -> player.addChatMessage( + new ChatComponentTranslation( + "chat.block_analyzer.nbttag", + s, + tag.getTag(s) + .toString()))); + } + player.addChatMessage(new ChatComponentTranslation("chat.block_analyzer.footer")); + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemArchitectsWand.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemArchitectsWand.java new file mode 100644 index 00000000..69c14c23 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemArchitectsWand.java @@ -0,0 +1,144 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import java.util.List; +import java.util.Set; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.common.renderers.WireframeRenderer; +import com.fouristhenumber.utilitiesinexcess.utils.ArchitectsWandUtils; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemArchitectsWand extends Item { + + public int buildLimit; + + public ItemArchitectsWand(int buildLimit) { + super(); + this.buildLimit = buildLimit; + setUnlocalizedName("architects_wand"); + setMaxDamage(0); + setMaxStackSize(1); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + tooltip.add( + EnumChatFormatting.AQUA + + StatCollector.translateToLocalFormatted("tooltip.architects_wand.1", this.buildLimit)); + super.addInformation(stack, player, tooltip, p_77624_4_); + } + + @SideOnly(Side.CLIENT) + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isSelected) { + if (!world.isRemote || !(entity instanceof EntityPlayer player)) { + return; + } + + if (!isSelected) return; + + MovingObjectPosition mop = Minecraft.getMinecraft().objectMouseOver; + + // Check if player is looking at a block. + if (mop == null || mop.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK) { + WireframeRenderer.clearCandidatePositions(); + return; + } + + int x = mop.blockX; + int y = mop.blockY; + int z = mop.blockZ; + int side = mop.sideHit; + ForgeDirection forgeSide = ForgeDirection.getOrientation(side); + if (forgeSide == ForgeDirection.UNKNOWN) { + UtilitiesInExcess.LOG + .warn("Architect wand onUpdate was called with invalid facing direction: {}", forgeSide); + return; + } + + Block blockToPlace = world.getBlock(x, y, z); + if (blockToPlace == null) return; + int metaToPlace = world.getBlockMetadata(x, y, z); + ItemStack itemStack = new ItemStack(Item.getItemFromBlock(blockToPlace), 1, metaToPlace); + + int inventoryBlockCount = ArchitectsWandUtils.countItemInInventory(player, itemStack); + if (!player.capabilities.isCreativeMode && inventoryBlockCount == 0) { + WireframeRenderer.clearCandidatePositions(); + return; + } + int placeCount = player.capabilities.isCreativeMode ? this.buildLimit + : Math.min(inventoryBlockCount, this.buildLimit); + + Set blocksToPlace = ArchitectsWandUtils + .findAdjacentBlocks(world, blockToPlace, metaToPlace, placeCount, forgeSide, new BlockPos(x, y, z)); + WireframeRenderer.clearCandidatePositions(); + for (BlockPos pos : blocksToPlace) { + WireframeRenderer.addCandidatePosition(pos.offset(forgeSide.offsetX, forgeSide.offsetY, forgeSide.offsetZ)); + } + + } + + @Override + public boolean onItemUse(ItemStack itemstack, EntityPlayer player, World world, int x, int y, int z, int side, + float hitX, float hitY, float hitZ) { + // TODO: Prevent player from placing blocks into themself / other entities? + ForgeDirection forgeSide = ForgeDirection.getOrientation(side); + if (forgeSide == ForgeDirection.UNKNOWN) { + UtilitiesInExcess.LOG + .warn("Architects wand onItemUse was called with invalid facing direction: {}", forgeSide); + return false; + } + + Block blockToPlace = world.getBlock(x, y, z); + if (blockToPlace == null) return false; + int metaToPlace = world.getBlockMetadata(x, y, z); + ItemStack itemStack = new ItemStack(Item.getItemFromBlock(blockToPlace), 1, metaToPlace); + + int inventoryBlockCount = ArchitectsWandUtils.countItemInInventory(player, itemStack); + if (!player.capabilities.isCreativeMode && inventoryBlockCount == 0) return false; + int placeCount = player.capabilities.isCreativeMode ? this.buildLimit + : Math.min(inventoryBlockCount, this.buildLimit); + + Set blocksToPlace = ArchitectsWandUtils + .findAdjacentBlocks(world, blockToPlace, metaToPlace, placeCount, forgeSide, new BlockPos(x, y, z)); + for (BlockPos pos : blocksToPlace) { + // TODO: Group these by a bigger number instead of decreasing by 1 every time. + if (player.capabilities.isCreativeMode || ArchitectsWandUtils.decreaseFromInventory(player, itemStack)) { + world.setBlock( + pos.x + forgeSide.offsetX, + pos.y + forgeSide.offsetY, + pos.z + forgeSide.offsetZ, + blockToPlace, + metaToPlace, + 3); + } + } + return true; + } + + @Override + public boolean isDamageable() { + return false; + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + return false; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemBedrockiumIngot.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemBedrockiumIngot.java new file mode 100644 index 00000000..39f2d667 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemBedrockiumIngot.java @@ -0,0 +1,19 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.World; + +public class ItemBedrockiumIngot extends Item { + + @Override + public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int p_77663_4_, boolean p_77663_5_) { + if (entityIn instanceof EntityLivingBase entity) { + entity.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 0, 3, true)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemDisabled.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemDisabled.java new file mode 100644 index 00000000..848dc6ee --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemDisabled.java @@ -0,0 +1,29 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +// TODO: maybe change the icon? +// TODO: hide this from nei! +// Handle disabled items, so they won't be just deleted +public class ItemDisabled extends Item { + + private final Item enabledVersion; + + public ItemDisabled(Item enabledVersion) { + super(); + setUnlocalizedName("disabled_item"); + setTextureName("utilitiesinexcess:disabled_item"); + this.enabledVersion = enabledVersion; + } + + @Override + public String getItemStackDisplayName(ItemStack p_77653_1_) { + String localizedEnabledItem = StatCollector + .translateToLocal(enabledVersion.getUnlocalizedNameInefficiently(p_77653_1_) + ".name"); + return StatCollector.translateToLocalFormatted( + this.getUnlocalizedNameInefficiently(p_77653_1_) + ".name", + localizedEnabledItem); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemEnderLotusSeed.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemEnderLotusSeed.java new file mode 100644 index 00000000..c54961cd --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemEnderLotusSeed.java @@ -0,0 +1,65 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.EnumPlantType; +import net.minecraftforge.common.IPlantable; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderLotus; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemEnderLotusSeed extends Item implements IPlantable { + + private final Block cropBlock; + + public ItemEnderLotusSeed(Block cropBlock) { + super(); + this.cropBlock = cropBlock; + this.setUnlocalizedName("ender_lotus_seed"); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, net.minecraft.world.World world, int x, int y, int z, + int side, float hitX, float hitY, float hitZ) { + if (side != 1) return false; + Block block = world.getBlock(x, y, z); + if (!((BlockEnderLotus) cropBlock).canPlaceBlockOn(block)) { + return false; + } + if (world.isAirBlock(x, y + 1, z)) { + world.setBlock(x, y + 1, z, cropBlock, 0, 2); + if (!player.capabilities.isCreativeMode) { + stack.stackSize--; + } + return true; + } + return false; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerIcons(IIconRegister reg) { + this.itemIcon = reg.registerIcon("utilitiesinexcess:ender_lotus_seed"); + } + + @Override + public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) { + return EnumPlantType.Cave; + } + + @Override + public Block getPlant(IBlockAccess world, int x, int y, int z) { + return cropBlock; + } + + @Override + public int getPlantMetadata(IBlockAccess world, int x, int y, int z) { + return 0; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemFireBattery.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemFireBattery.java new file mode 100644 index 00000000..6d6f8132 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemFireBattery.java @@ -0,0 +1,83 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import static com.fouristhenumber.utilitiesinexcess.utils.UIEUtils.formatNumber; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; + +import com.fouristhenumber.utilitiesinexcess.config.items.FireBatteryConfig; + +import cofh.api.energy.ItemEnergyContainer; +import cpw.mods.fml.common.IFuelHandler; +import cpw.mods.fml.common.registry.GameRegistry; + +public class ItemFireBattery extends ItemEnergyContainer implements IFuelHandler { + + public static IIcon background; + public static IIcon[] overlays; + + public ItemFireBattery() { + super( + FireBatteryConfig.fireBatteryRFStorage, + FireBatteryConfig.fireBatteryRFCharge, + FireBatteryConfig.fireBatteryRFUsage); + setUnlocalizedName("fire_battery"); + setTextureName("utilitiesinexcess:fire_battery"); + setMaxStackSize(1); + GameRegistry.registerFuelHandler(this); + } + + @Override + public void registerIcons(IIconRegister register) { + super.registerIcons(register); + background = register.registerIcon("utilitiesinexcess:fire_battery_bg"); + overlays = new IIcon[6]; + for (int i = 0; i < overlays.length; i++) { + overlays[i] = register.registerIcon("utilitiesinexcess:fire_battery_overlay_" + i); + } + } + + @Override + public ItemStack getContainerItem(ItemStack itemStack) { + ItemStack drained = itemStack.copy(); + drained.stackSize = 1; + extractEnergy(drained, FireBatteryConfig.fireBatteryRFUsage, false); + return drained; + } + + @Override + public boolean hasContainerItem(ItemStack stack) { + return true; + } + + @Override + public int getBurnTime(ItemStack fuel) { + if (fuel == null) return 0; + return extractEnergy(fuel, FireBatteryConfig.fireBatteryRFUsage, true) / FireBatteryConfig.fireBatteryBurnTime; + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) { + return 1.0 - (double) getEnergyStored(stack) / (double) getMaxEnergyStored(stack); + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + return getEnergyStored(stack) < getMaxEnergyStored(stack); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean b) { + tooltip.add( + StatCollector.translateToLocalFormatted( + "item.fire_battery.desc", + formatNumber(getEnergyStored(stack)), + formatNumber(getMaxEnergyStored(stack)))); + super.addInformation(stack, player, tooltip, b); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGlove.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGlove.java new file mode 100644 index 00000000..053a31e7 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGlove.java @@ -0,0 +1,118 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import org.lwjgl.input.Keyboard; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; + +import baubles.api.BaubleType; +import baubles.api.IBauble; +import cpw.mods.fml.common.Optional; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@Optional.Interface(iface = "baubles.api.IBauble", modid = "Baubles") +public class ItemGlove extends Item implements IBauble { + + public ItemGlove() { + super(); + this.setTextureName("utilitiesinexcess:glove"); + this.setUnlocalizedName("glove"); + this.setMaxStackSize(1); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, + float hitX, float hitY, float hitZ) { + return true; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + super.addInformation(stack, player, tooltip, p_77624_4_); + tooltip.add( + EnumChatFormatting.AQUA + StatCollector.translateToLocalFormatted( + "item.glove.desc.1", + EnumChatFormatting.WHITE + "[" + + EnumChatFormatting.GOLD + + Keyboard.getKeyName(UtilitiesInExcess.proxy.GLOVE_KEYBIND.getKeyCode()) + + EnumChatFormatting.WHITE + + "]" + + EnumChatFormatting.AQUA)); + + tooltip.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("item.glove.desc.2")); + tooltip.add(EnumChatFormatting.GRAY + StatCollector.translateToLocal("item.glove.desc.3")); + } + + public IIcon topIcon; + public IIcon bottomIcon; + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(final IIconRegister aIconRegister) { + super.registerIcons(aIconRegister); + topIcon = aIconRegister.registerIcon("utilitiesinexcess:glove_top"); + bottomIcon = aIconRegister.registerIcon("utilitiesinexcess:glove_bottom"); + } + + public static boolean isUsingGlove(EntityPlayer player) { + if (player == null) return false; + + return (player.getHeldItem() != null && player.getHeldItem() + .getItem() instanceof ItemGlove) + || (UIEUtils.hasBauble(player, ItemGlove.class) && UtilitiesInExcess.proxy.GLOVE_KEYBIND.isKeyDown(player)); + } + + @Override + public int getMaxItemUseDuration(ItemStack stack) { + return 1; + } + + @Optional.Method(modid = "Baubles") + @Override + public BaubleType getBaubleType(ItemStack itemstack) { + return BaubleType.UNIVERSAL; + } + + @Optional.Method(modid = "Baubles") + @Override + public void onWornTick(ItemStack itemstack, EntityLivingBase player) { + + } + + @Optional.Method(modid = "Baubles") + @Override + public void onEquipped(ItemStack itemstack, EntityLivingBase entity) { + + } + + @Optional.Method(modid = "Baubles") + @Override + public void onUnequipped(ItemStack itemstack, EntityLivingBase entity) { + + } + + @Optional.Method(modid = "Baubles") + @Override + public boolean canEquip(ItemStack itemstack, EntityLivingBase player) { + return true; + } + + @Optional.Method(modid = "Baubles") + @Override + public boolean canUnequip(ItemStack itemstack, EntityLivingBase player) { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGoldenBag.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGoldenBag.java new file mode 100644 index 00000000..8642c60e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGoldenBag.java @@ -0,0 +1,156 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.GuiFactories; +import com.cleanroommc.modularui.factory.PlayerInventoryGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.utils.item.ItemStackHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.layout.Column; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemGoldenBag extends Item implements IGuiHolder { + + private final int inventorySize = 54; + private ItemStackHandler inventoryHandler; + private InvWrapper playerInventory; + + public ItemGoldenBag() { + setUnlocalizedName("golden_bag"); + setTextureName("utilitiesinexcess:golden_bag"); + setMaxStackSize(1); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if (!world.isRemote) { + GuiFactories.playerInventory() + .openFromMainHand(player); + } + + return super.onItemRightClick(stack, world, player); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { + tooltip.add(StatCollector.translateToLocal("item.golden_bag.desc")); + } + + @Override + public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { + final int panelHeight = 220; + final ModularPanel panel = ModularPanel.defaultPanel("golden_bag", 176, panelHeight); + final ItemStack usedItem = data.getUsedItemStack(); + final EntityPlayer player = data.getPlayer(); + + this.inventoryHandler = new ItemStackHandler(inventorySize) { + + @Override + protected void onContentsChanged(int slot) { + ItemStack usedItem = data.getUsedItemStack(); + if (usedItem != null) usedItem.setTagCompound(this.serializeNBT()); + } + }; + + this.playerInventory = new InvWrapper(player.inventory) { + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + if (slot == player.inventory.currentItem) { + return null; + } + + return super.extractItem(slot, amount, simulate); + } + }; + + if (!player.worldObj.isRemote) { + if (usedItem.hasTagCompound()) { + inventoryHandler.deserializeNBT(usedItem.getTagCompound()); + } + } + + syncManager.registerSlotGroup("golden_bag_items", inventorySize); + + panel.child( + new Column().child( + new ParentWidget<>().widthRel(1f) + .height(138) + .child( + IKey.str(StatCollector.translateToLocal("item.golden_bag.name")) + .asWidget() + .margin(6, 0, 5, 0) + .align(Alignment.TopLeft)) + .child( + buildBagSlotGroup().align(Alignment.Center) + .marginTop(1)) + .child( + IKey.str("Inventory") + .asWidget() + .alignX(0.05f) + .alignY(0.99f))) + .child( + buildPlayerInventorySlotGroup().align(Alignment.TopLeft) + .marginLeft(7) + .marginTop(panelHeight - 83)) + .child( + buildPlayerHotbarSlotGroup().align(Alignment.TopLeft) + .marginLeft(7) + .marginTop(panelHeight - 25))); + + return panel; + } + + private SlotGroupWidget buildPlayerInventorySlotGroup() { + return SlotGroupWidget.builder() + .row("PPPPPPPPP") + .row("PPPPPPPPP") + .row("PPPPPPPPP") + .key('P', i -> new ItemSlot().slot(new ModularSlot(playerInventory, 9 + i).slotGroup("player_inventory"))) + .build(); + } + + private SlotGroupWidget buildPlayerHotbarSlotGroup() { + return SlotGroupWidget.builder() + .row("HHHHHHHHH") + .key('H', i -> new ItemSlot().slot(new ModularSlot(playerInventory, i).slotGroup("player_inventory"))) + .build(); + } + + private SlotGroupWidget buildBagSlotGroup() { + return SlotGroupWidget.builder() + .row("IIIIIIIII") + .row("IIIIIIIII") + .row("IIIIIIIII") + .row("IIIIIIIII") + .row("IIIIIIIII") + .row("IIIIIIIII") + .key( + 'I', + index -> new ItemSlot().slot( + new ModularSlot(inventoryHandler, index).slotGroup("golden_bag_items") + // Don't allow placing the bag inside itself + .filter(stack -> !(stack.getItem() instanceof ItemGoldenBag)))) + .build(); + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemHeavenlyRing.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemHeavenlyRing.java new file mode 100644 index 00000000..95e731ac --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemHeavenlyRing.java @@ -0,0 +1,184 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraftforge.client.event.RenderPlayerEvent; +import net.minecraftforge.common.util.FakePlayer; + +import com.fouristhenumber.utilitiesinexcess.ClientProxy; +import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.gtnewhorizon.gtnhlib.eventbus.EventBusSubscriber; + +import baubles.api.BaubleType; +import baubles.api.IBauble; +import cpw.mods.fml.common.Optional; +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@EventBusSubscriber() +@Optional.Interface(iface = "baubles.api.IBauble", modid = "Baubles") +public class ItemHeavenlyRing extends Item implements IBauble { + + private static final int RING_COUNT = 5; + + private static IIcon[] itemIcons = new IIcon[RING_COUNT]; + public static IIcon[] wingIcons = new IIcon[RING_COUNT]; + + public ItemHeavenlyRing() { + setTextureName("utilitiesinexcess:heavenly_ring"); + setUnlocalizedName("heavenly_ring"); + setMaxDamage(0); + setHasSubtypes(true); + setMaxStackSize(1); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List itemList) { + for (int i = 0; i < RING_COUNT; ++i) { + itemList.add(new ItemStack(item, 1, i)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister register) { + for (int i = 0; i < RING_COUNT; ++i) { + itemIcons[i] = register.registerIcon(this.getIconString() + "." + i); + wingIcons[i] = register.registerIcon(this.getIconString() + ".wing." + i); + } + this.itemIcon = itemIcons[0]; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int meta) { + return itemIcons[meta]; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + tooltip.add( + EnumChatFormatting.GRAY + + StatCollector.translateToLocal("item.heavenly_ring.type." + stack.getItemDamage())); + super.addInformation(stack, player, tooltip, p_77624_4_); + } + + @Optional.Method(modid = "Baubles") + @Override + public BaubleType getBaubleType(ItemStack itemstack) { + return BaubleType.RING; + } + + @Optional.Method(modid = "Baubles") + @Override + public void onWornTick(ItemStack itemstack, EntityLivingBase player) { + + } + + @Optional.Method(modid = "Baubles") + @Override + public void onEquipped(ItemStack itemstack, EntityLivingBase entity) { + if (!(entity instanceof EntityPlayer player)) return; + if (player instanceof FakePlayer) return; + + player.capabilities.allowFlying = true; + player.sendPlayerAbilities(); + } + + @Optional.Method(modid = "Baubles") + @Override + public void onUnequipped(ItemStack itemstack, EntityLivingBase entity) { + if (!(entity instanceof EntityPlayer player)) return; + if (player instanceof FakePlayer) return; + + if (!player.capabilities.isCreativeMode) { + player.capabilities.allowFlying = false; + player.capabilities.isFlying = false; + player.sendPlayerAbilities(); + } + } + + @Optional.Method(modid = "Baubles") + @Override + public boolean canEquip(ItemStack itemstack, EntityLivingBase player) { + return true; + } + + @Optional.Method(modid = "Baubles") + @Override + public boolean canUnequip(ItemStack itemstack, EntityLivingBase player) { + return true; + } + + @EventBusSubscriber.Condition + public static boolean shouldEventBusSubscribe() { + return !Mods.Baubles.isLoaded(); + } + + public static Map wingedPlayers = new HashMap<>(); + + @SubscribeEvent + public static void onPlayerRender(RenderPlayerEvent.Pre event) { + if (ClientProxy.frameCount % 40 > 1) return; + + EntityPlayer player = event.entityPlayer; + + boolean hasRing = false; + for (int i = 0; i < player.inventory.getSizeInventory(); i++) { + ItemStack stack = player.inventory.getStackInSlot(i); + if (stack != null && stack.getItem() != null && stack.getItem() instanceof ItemHeavenlyRing) { + hasRing = true; + wingedPlayers.putIfAbsent(player, stack); + break; + } + } + + if (!hasRing) { + wingedPlayers.remove(player); + } + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public static void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.side != Side.SERVER || event.phase != TickEvent.Phase.END) { + return; + } + EntityPlayer player = event.player; + + boolean hasRing = false; + for (int i = 0; i < player.inventory.getSizeInventory(); i++) { + ItemStack stack = player.inventory.getStackInSlot(i); + if (stack != null && stack.getItem() != null && stack.getItem() instanceof ItemHeavenlyRing) { + hasRing = true; + break; + } + } + + if (player.capabilities.allowFlying == hasRing) return; + + if (hasRing) { + player.capabilities.allowFlying = true; + } else { + if (!player.capabilities.isCreativeMode) { + player.capabilities.allowFlying = false; + player.capabilities.isFlying = false; + } + } + player.sendPlayerAbilities(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java new file mode 100644 index 00000000..cb0beb02 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java @@ -0,0 +1,588 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import static com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig.awakenedInversionDurability; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.entity.monster.EntityGiantZombie; +import net.minecraft.entity.monster.EntityIronGolem; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.entity.monster.EntitySpider; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.StatCollector; +import net.minecraft.world.EnumDifficulty; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.entity.living.LivingDeathEvent; +import net.minecraftforge.event.entity.living.LivingSpawnEvent; + +import org.jetbrains.annotations.NotNull; + +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.fouristhenumber.utilitiesinexcess.common.entities.EntitySiegeProperty; +import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.eventhandler.Event; +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.PlayerEvent; +import cpw.mods.fml.common.gameevent.TickEvent; + +public class ItemInversionSigilActive extends Item { + + private static final String DURABILITY_NBT_KEY = "RemainingUses"; + private static final int BEACON_SEARCH_RADIUS = 6; + private final int[][] LIGHTNING_POSITIONS = { { 0, 0 }, { -5, 0 }, { 5, 0 }, { 0, -5 }, { 0, 5 } }; + + private final ItemStack[] CHEST_NORTH_CONTENTS = { new ItemStack(Blocks.stone), new ItemStack(Items.brick), + new ItemStack(Blocks.glass), new ItemStack(Items.cooked_fished), new ItemStack(Blocks.hardened_clay), + new ItemStack(Items.dye, 1, 2), new ItemStack(Items.coal, 1, 1), new ItemStack(Items.cooked_beef), + new ItemStack(Items.iron_ingot), new ItemStack(Items.cooked_chicken), new ItemStack(Items.gold_ingot), + new ItemStack(Items.baked_potato), new ItemStack(Items.cooked_porkchop), new ItemStack(Items.netherbrick) }; + + private final int[] POTION_IDS = { 8193, 8194, 8195, 8196, 8197, 8198, 8200, 8201, 8202, 8204, 8205, 8206, 8225, + 8226, 8228, 8229, 8232, 8233, 8234, 8236, 8257, 8258, 8259, 8260, 8262, 8264, 8265, 8267, 8268, 8269, 8270 }; + + private final ItemStack[] CHEST_EAST_CONTENTS = new ItemStack[62]; + + private final ItemStack[] CHEST_SOUTH_CONTENTS = { new ItemStack(Blocks.grass), new ItemStack(Blocks.lapis_ore), + new ItemStack(Blocks.dirt), new ItemStack(Blocks.obsidian), new ItemStack(Blocks.sand), + new ItemStack(Blocks.diamond_ore), new ItemStack(Blocks.gravel), new ItemStack(Blocks.redstone_ore), + new ItemStack(Blocks.gold_ore), new ItemStack(Blocks.clay), new ItemStack(Blocks.iron_ore), + new ItemStack(Blocks.emerald_ore), new ItemStack(Blocks.coal_ore) }; + + private final ItemStack[] CHEST_WEST_CONTENTS = { new ItemStack(Items.record_13), + new ItemStack(Items.record_mellohi), new ItemStack(Items.record_cat), new ItemStack(Items.record_stal), + new ItemStack(Items.record_blocks), new ItemStack(Items.record_strad), new ItemStack(Items.record_chirp), + new ItemStack(Items.record_ward), new ItemStack(Items.record_far), new ItemStack(Items.record_11), + new ItemStack(Items.record_mall), new ItemStack(Items.record_wait) }; + + public ItemInversionSigilActive() { + super(); + setUnlocalizedName("inversion_sigil_active"); + setTextureName("utilitiesinexcess:inversion_sigil_active"); + setMaxStackSize(1); + setContainerItem(this); + + for (int i = 0; i < 31; i++) { + CHEST_EAST_CONTENTS[2 * i] = new ItemStack(Items.potionitem, 1, POTION_IDS[i]); + CHEST_EAST_CONTENTS[2 * i + 1] = new ItemStack(Items.potionitem, 1, POTION_IDS[i] + 8192); + } + + ItemInversionSigilActiveEvents eventHandler = new ItemInversionSigilActiveEvents(); + MinecraftForge.EVENT_BUS.register(eventHandler); + FMLCommonHandler.instance() + .bus() + .register(eventHandler); + } + + private EntitySiegeProperty getProperties(EntityPlayer player) { + return (EntitySiegeProperty) player.getExtendedProperties(EntitySiegeProperty.PROP_KEY); + } + + private List getSiegePlayers() { + List siegePlayers = new ArrayList<>(); + if (DimensionManager.getWorld(1) == null) { + return siegePlayers; + } + for (EntityPlayer player : DimensionManager.getWorld(1).playerEntities) { + EntitySiegeProperty properties = getProperties(player); + if (properties != null && properties.siege) { + siegePlayers.add(player); + } + } + return siegePlayers; + } + + private boolean checkSpiral(World world, int x, int y, int z) { + ForgeDirection[] directions = { ForgeDirection.NORTH, ForgeDirection.EAST, ForgeDirection.SOUTH, + ForgeDirection.WEST }; + boolean clockwise = true; + boolean counterClockwise = true; + Block previousBlock = null; + + for (ForgeDirection direction : directions) { + int partX = x + direction.offsetX; + int partY = y; + int partZ = z + direction.offsetZ; + Block block = world.getBlock(partX, partY, partZ); + + if (block != Blocks.redstone_wire && block != Blocks.tripwire) { + return false; + } + if (block == previousBlock) { + return false; + } + + // Every next part of a spiral should have an alternated block + previousBlock = block; + + if (clockwise && checkSpiralPart(world, partX, partY, partZ, rotateClockwise(direction), block)) { + counterClockwise = false; + continue; + } + if (counterClockwise + && checkSpiralPart(world, partX, partY, partZ, rotateCounterClockwise(direction), block)) { + clockwise = false; + continue; + } + + return false; + } + + return true; + } + + private boolean checkSpiralPart(World world, int x, int y, int z, ForgeDirection direction, Block block) { + int[] SPIRAL_SEGMENT_LENGTHS = { 3, 5, 7, 8 }; + + for (int segmentLength : SPIRAL_SEGMENT_LENGTHS) { + for (int i = 0; i < segmentLength; i++) { + if (world.getBlock(x, y, z) != block) { + return false; + } + + if (i != segmentLength - 1) { + x += direction.offsetX; + z += direction.offsetZ; + } + } + + direction = rotateClockwise(direction); + } + + return true; + } + + private ForgeDirection rotateClockwise(ForgeDirection direction) { + return switch (direction) { + case NORTH -> ForgeDirection.EAST; + case EAST -> ForgeDirection.SOUTH; + case SOUTH -> ForgeDirection.WEST; + case WEST -> ForgeDirection.NORTH; + // should not happen + default -> direction; + }; + } + + private ForgeDirection rotateCounterClockwise(ForgeDirection direction) { + return switch (direction) { + case NORTH -> ForgeDirection.WEST; + case EAST -> ForgeDirection.NORTH; + case SOUTH -> ForgeDirection.EAST; + case WEST -> ForgeDirection.SOUTH; + // should not happen + default -> direction; + }; + } + + private void startSiege(World world, int beaconX, int beaconY, int beaconZ, EntityPlayer player) { + EntitySiegeProperty source = getProperties(player); + source.beaconSpawnX = beaconX; + source.beaconSpawnY = beaconY; + source.beaconSpawnZ = beaconZ; + source.siege = true; + source.siegeMobsKilled = 0; + source.siegeTimer = 0; + for (Entity curentity : player.getEntityWorld().loadedEntityList) { + if (curentity instanceof EntityEnderman) { + curentity.setDead(); + } + } + for (int i = 0; i < LIGHTNING_POSITIONS.length; i++) { + EntityLightningBolt lightningBolt = new EntityLightningBolt( + world, + beaconX + LIGHTNING_POSITIONS[i][0] + 0.5, + beaconY + 0.5, + beaconZ + LIGHTNING_POSITIONS[i][1] + 0.5); + world.addWeatherEffect(lightningBolt); + world.setBlock( + beaconX + LIGHTNING_POSITIONS[i][0], + beaconY, + beaconZ + LIGHTNING_POSITIONS[i][1], + Blocks.air); + } + } + + private void endSiege(boolean won, EntityPlayer player) { + EntitySiegeProperty source = getProperties(player); + source.siege = false; + source.siegeMobsKilled = 0; + source.siegeTimer = 0; + for (Entity curentity : player.getEntityWorld().loadedEntityList) { + if (curentity instanceof EntityMob) { + curentity.setDead(); + } + } + if (won) { + for (int i = 0; i < player.inventory.getSizeInventory(); i++) { + ItemStack stack = player.inventory.getStackInSlot(i); + if (stack != null && stack.getItem() == this) { + player.inventory.setInventorySlotContents(i, ModItems.PSEUDO_INVERSION_SIGIL.newItemStack()); + break; + } + } + } + } + + private boolean checkChest(TileEntityChest chest, ItemStack[] itemsToCheck, int requiredAmount) { + int foundItemsAmount = 0; + boolean[] hasItem = new boolean[itemsToCheck.length]; + for (int i = 0; i < chest.getSizeInventory(); i++) { + ItemStack stack = chest.getStackInSlot(i); + for (int j = 0; j < itemsToCheck.length; j++) { + if (stack != null && ItemStack.areItemStacksEqual(stack, itemsToCheck[j])) { + hasItem[j] = true; + break; + } + } + } + for (int i = 0; i < itemsToCheck.length; i++) { + if (hasItem[i]) { + foundItemsAmount++; + } + } + return foundItemsAmount >= requiredAmount; + } + + private boolean checkChestInDirection(ForgeDirection direction, int beaconX, int beaconY, int beaconZ, + World world) { + ItemStack[] contents; + int requiredAmount; + + if (direction == ForgeDirection.NORTH) { + beaconZ -= 5; + contents = CHEST_NORTH_CONTENTS; + requiredAmount = InversionConfig.northChestRequiredItems; + } else if (direction == ForgeDirection.SOUTH) { + beaconZ += 5; + contents = CHEST_SOUTH_CONTENTS; + requiredAmount = InversionConfig.southChestRequiredItems; + } else if (direction == ForgeDirection.EAST) { + beaconX += 5; + contents = CHEST_EAST_CONTENTS; + requiredAmount = InversionConfig.eastChestRequiredItems; + } else if (direction == ForgeDirection.WEST) { + beaconX -= 5; + contents = CHEST_WEST_CONTENTS; + requiredAmount = InversionConfig.westChestRequiredItems; + } else { + throw new IllegalArgumentException("Invalid direction passed: " + direction); + } + + if (world.getTileEntity(beaconX, beaconY, beaconZ) instanceof TileEntityChest chest) { + return checkChest(chest, contents, requiredAmount); + } + return false; + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, + float hitX, float hitY, float hitZ) { + if (!player.isSneaking()) { + return false; + } + + Block clicked = world.getBlock(x, y, z); + if (clicked != Blocks.beacon) { + return false; + } + + if (world.isRemote) return true; + + boolean dimensionOk = (world.provider.dimensionId == 1); + boolean difficultyOk = world.difficultySetting != EnumDifficulty.PEACEFUL; + boolean spiralOk = checkSpiral(world, x, y, z); + boolean chestNorthContentsOk = checkChestInDirection(ForgeDirection.NORTH, x, y, z, world); + boolean chestEastContentsOk = checkChestInDirection(ForgeDirection.EAST, x, y, z, world); + boolean chestSouthContentsOk = checkChestInDirection(ForgeDirection.SOUTH, x, y, z, world); + boolean chestWestContentsOk = checkChestInDirection(ForgeDirection.WEST, x, y, z, world); + + player.addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.header")); + + if (!difficultyOk) { + player.addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.difficultyPeaceful")); + } + + if (dimensionOk) { + player.addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.correctDimension")); + } else if (world.provider.dimensionId == 0) { + player.addChatMessage( + new ChatComponentTranslation("chat.pseudo_inversion_ritual.incorrectDimensionOverworld")); + } else if (world.provider.dimensionId == -1) { + player + .addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.incorrectDimensionNether")); + } else { + player.addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.incorrectDimensionOther")); + } + + player.addChatMessage( + new ChatComponentTranslation( + "chat.pseudo_inversion_ritual.chestNorthContents", + chestNorthContentsOk ? "✓" : "✗")); + player.addChatMessage( + new ChatComponentTranslation( + "chat.pseudo_inversion_ritual.chestEastContents", + chestEastContentsOk ? "✓" : "✗")); + player.addChatMessage( + new ChatComponentTranslation( + "chat.pseudo_inversion_ritual.chestSouthContents", + chestSouthContentsOk ? "✓" : "✗")); + player.addChatMessage( + new ChatComponentTranslation( + "chat.pseudo_inversion_ritual.chestWestContents", + chestWestContentsOk ? "✓" : "✗")); + player + .addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.spiral", spiralOk ? "✓" : "✗")); + + if (dimensionOk && difficultyOk + && chestNorthContentsOk + && chestEastContentsOk + && chestSouthContentsOk + && chestWestContentsOk + && spiralOk) { + player.addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.ready")); + } + return true; + } + + private boolean isValidRitualBeacon(World world, int beaconX, int beaconY, int beaconZ) { + boolean dimensionOk = (world.provider.dimensionId == 1); + + return dimensionOk && world.getBlock(beaconX, beaconY, beaconZ) == Blocks.beacon + && checkSpiral(world, beaconX, beaconY, beaconZ) + && checkChestInDirection(ForgeDirection.NORTH, beaconX, beaconY, beaconZ, world) + && checkChestInDirection(ForgeDirection.EAST, beaconX, beaconY, beaconZ, world) + && checkChestInDirection(ForgeDirection.SOUTH, beaconX, beaconY, beaconZ, world) + && checkChestInDirection(ForgeDirection.WEST, beaconX, beaconY, beaconZ, world); + } + + public class ItemInversionSigilActiveEvents { + + @SubscribeEvent(priority = EventPriority.NORMAL) + public void whenServerTick(TickEvent.ServerTickEvent event) { + + List playerList = getSiegePlayers(); + for (EntityPlayer player : playerList) { + World world = player.getEntityWorld(); + + EntitySiegeProperty properties = getProperties(player); + if (--properties.siegeTimer > 0) { + continue; + } + properties.siegeTimer = 30 + world.rand.nextInt(21); + + int mobType = world.rand.nextInt(4); + EntityMob entityMob = switch (mobType) { + case 0 -> { + int zombieType = world.rand.nextInt(25); + if (zombieType == 0) { + yield new EntityGiantZombie(world); + } else { + yield new EntityZombie(world); + } + } + case 1 -> new EntitySkeleton(world); + case 2 -> new EntitySpider(world); + case 3 -> new EntityCreeper(world); + default -> throw new IllegalStateException("Unexpected value: " + mobType); + }; + + int offsetX = world.rand.nextInt(101) - 50; + int offsetZ = world.rand.nextInt(101) - 50; + + int mobX = (int) player.posX + offsetX; + int mobY = 0; + int mobZ = (int) player.posZ + offsetZ; + + for (int y = (int) player.posY + 10; y >= 0; y--) { + if (!World.doesBlockHaveSolidTopSurface(world, mobX, y, mobZ)) { + continue; + } + + entityMob.setPosition(mobX, y + 1, mobZ); + + if (!world.getCollidingBoundingBoxes(entityMob, entityMob.boundingBox) + .isEmpty()) { + continue; + } + if (!world.checkNoEntityCollision(entityMob.boundingBox)) { + break; + } + + mobY = y + 1; + break; + } + + if (mobY != 0) { + double damage = entityMob instanceof EntityGiantZombie ? 16D : 8D; + entityMob.getEntityAttribute(SharedMonsterAttributes.attackDamage) + .setBaseValue(damage); + world.spawnEntityInWorld(entityMob); + } + } + } + + @SubscribeEvent(priority = EventPriority.NORMAL) + public void whenPlayerLeavesEnd(PlayerEvent.PlayerChangedDimensionEvent event) { + if (getProperties(event.player).siege) { + event.player.addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.leftEnd")); + endSiege(false, event.player); + } + } + + @SubscribeEvent(priority = EventPriority.NORMAL) + public void whenPlayerLeavesEnd2(PlayerEvent.PlayerRespawnEvent event) { + if (getProperties(event.player).siege) { + event.player.addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.leftEnd")); + endSiege(false, event.player); + } + } + + @SubscribeEvent(priority = EventPriority.NORMAL) + public void whenEndermanSpawn(LivingSpawnEvent.CheckSpawn event) { + if (event.world.provider.dimensionId == 1 && event.entity instanceof EntityEnderman + && !getSiegePlayers().isEmpty()) { + event.setResult(Event.Result.DENY); + } + } + + @SubscribeEvent(priority = EventPriority.NORMAL) + public void onLivingDeath(LivingDeathEvent event) { + + World world = event.entityLiving.worldObj; + + if (event.entityLiving instanceof EntityPlayer deadplayer && getProperties(deadplayer).siege) { + deadplayer.addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.death")); + endSiege(false, deadplayer); + return; + } + if (event.source == null || !(event.source.getSourceOfDamage() instanceof EntityPlayer player)) { + return; + } + EntitySiegeProperty source = getProperties(player); + + if (world.isRemote) return; + + if (event.entityLiving instanceof EntityMob && source.siege) { + source.siegeMobsKilled++; + if (source.siegeMobsKilled >= InversionConfig.siegeRequiredMobsKill) { + player.addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.victory")); + endSiege(true, player); + } else if (source.siegeMobsKilled == (3 * InversionConfig.siegeRequiredMobsKill) / 4) { + player.addChatMessage( + new ChatComponentTranslation( + "chat.pseudo_inversion_ritual.threequarters", + source.siegeMobsKilled)); + } else if (source.siegeMobsKilled == (InversionConfig.siegeRequiredMobsKill) / 2) { + player.addChatMessage( + new ChatComponentTranslation( + "chat.pseudo_inversion_ritual.twoquarters", + source.siegeMobsKilled)); + } else if (source.siegeMobsKilled == (InversionConfig.siegeRequiredMobsKill) / 4) { + player.addChatMessage( + new ChatComponentTranslation( + "chat.pseudo_inversion_ritual.onequarter", + source.siegeMobsKilled)); + } + return; + } + + if (!(event.entityLiving instanceof EntityIronGolem)) { + return; + } + + if (source.siege) return; // Cannot start a second siege while in a siege. + if (world.difficultySetting == EnumDifficulty.PEACEFUL) return; + if (!player.inventory.hasItem(ItemInversionSigilActive.this)) return; + + int radius = BEACON_SEARCH_RADIUS; + int mobX = (int) Math.floor(event.entityLiving.posX); + int mobY = (int) Math.floor(event.entityLiving.posY); + int mobZ = (int) Math.floor(event.entityLiving.posZ); + + for (int dx = -radius; dx <= radius; dx++) { + for (int dy = -2; dy <= 2; dy++) { + for (int dz = -radius; dz <= radius; dz++) { + int beaconX = mobX + dx; + int beaconY = mobY + dy; + int beaconZ = mobZ + dz; + + if (isValidRitualBeacon(world, beaconX, beaconY, beaconZ)) { + // Ritual has now succeeded + player + .addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.complete")); + startSiege(world, beaconX, beaconY, beaconZ, player); + return; + } + } + } + } + } + } + + @Override + public void getSubItems(Item p_150895_1_, CreativeTabs p_150895_2_, List p_150895_3_) { + p_150895_3_.add(getStack()); + } + + public static @NotNull ItemStack getStack() { + ItemStack stack = new ItemStack(ModItems.INVERSION_SIGIL_ACTIVE.get(), 1); + + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger(DURABILITY_NBT_KEY, awakenedInversionDurability); + stack.setTagCompound(tag); + return stack; + } + + @Override + public boolean doesContainerItemLeaveCraftingGrid(ItemStack par1ItemStack) { + return false; + } + + @Override + public ItemStack getContainerItem(ItemStack itemStack) { + if (awakenedInversionDurability == 0) return itemStack; + + NBTTagCompound tag = itemStack.getTagCompound(); + if (tag == null) return null; + + int uses = tag.getInteger(DURABILITY_NBT_KEY); + if (uses == 1) return new ItemStack(ModItems.INVERSION_SIGIL_INACTIVE.get(), 1); + + tag.setInteger(DURABILITY_NBT_KEY, uses - 1); + + return itemStack; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tt, boolean p_77624_4_) { + NBTTagCompound tag = stack.getTagCompound(); + if (tag != null && awakenedInversionDurability != 0) { + tt.add( + StatCollector + .translateToLocalFormatted("item.inversion_sigil_active.desc", tag.getInteger(DURABILITY_NBT_KEY))); + } + super.addInformation(stack, player, tt, p_77624_4_); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilInactive.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilInactive.java new file mode 100644 index 00000000..676412a4 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilInactive.java @@ -0,0 +1,226 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import net.minecraft.block.Block; +import net.minecraft.entity.boss.EntityWither; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.living.LivingDeathEvent; +import net.minecraftforge.event.entity.living.LivingDropsEvent; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; + +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +public class ItemInversionSigilInactive extends Item { + + private static final int MIDNIGHT = 18000; + private static final int WINDOW_TICKS = 1000; + private static final int ENCHANT_TABLE_SEARCH_RADIUS = 6; + private static final int GRASS_SEARCH_RADIUS = 4; + private static final int REQUIRED_GRASS_COUNT = 6; + private static final int LIGHT_LEVEL_REQUIRED = 4; + + /** + * If cursed earth is disabled, use dirt instead + */ + public static Block cursedEarthBlock = (ModBlocks.CURSED_EARTH.isEnabled() ? ModBlocks.CURSED_EARTH.get() + : Blocks.dirt); + + public ItemInversionSigilInactive() { + setTextureName("utilitiesinexcess:inversion_sigil_inactive"); + setUnlocalizedName("inversion_sigil_inactive"); + setMaxStackSize(1); + + MinecraftForge.EVENT_BUS.register(this); + } + + private boolean isWithinMidnightWindow(long time) { + long low = (MIDNIGHT - WINDOW_TICKS); + long high = (MIDNIGHT + WINDOW_TICKS); + return time >= low && time <= high; + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, + float hitX, float hitY, float hitZ) { + if (!player.isSneaking()) { + return false; + } + + Block clicked = world.getBlock(x, y, z); + if (clicked != Blocks.enchanting_table) { + return false; + } + + if (world.isRemote) return true; + + boolean timeOk = isWithinMidnightWindow(world.getWorldTime()); + boolean darkOk = world.getBlockLightValue(x, y, z) <= LIGHT_LEVEL_REQUIRED; + boolean redstoneRingOk = hasRedstoneRing(world, x, y, z); + boolean grassOk = countNearbyGrass(world, x, y, z); + boolean moonOk = world.canBlockSeeTheSky(x, y, z); + + player.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("chat.inversion_ritual.header"))); + player.addChatMessage( + new ChatComponentText( + StatCollector.translateToLocalFormatted("chat.inversion_ritual.time", (timeOk ? "✓" : "✗")))); + player.addChatMessage( + new ChatComponentText( + StatCollector + .translateToLocalFormatted("chat.inversion_ritual.redstone", (redstoneRingOk ? "✓" : "✗")))); + player.addChatMessage( + new ChatComponentText( + StatCollector.translateToLocalFormatted("chat.inversion_ritual.grass", (grassOk ? "✓" : "✗")))); + player.addChatMessage( + new ChatComponentText( + StatCollector.translateToLocalFormatted("chat.inversion_ritual.darkness", (darkOk ? "✓" : "✗")))); + player.addChatMessage( + new ChatComponentText( + StatCollector.translateToLocalFormatted("chat.inversion_ritual.moon", (moonOk ? "✓" : "✗")))); + + return true; + } + + private boolean hasRedstoneRing(World world, int tx, int ty, int tz) { + for (int dx = -1; dx <= 1; dx++) { + for (int dz = -1; dz <= 1; dz++) { + if (dx == 0 && dz == 0) continue; + int bx = tx + dx; + int bz = tz + dz; + Block b = world.getBlock(bx, ty, bz); + if (b == null || b != Blocks.redstone_wire) { + return false; + } + } + } + return true; + } + + private boolean countNearbyGrass(World world, int cx, int cy, int cz) { + int count = 0; + for (int dx = -ItemInversionSigilInactive.GRASS_SEARCH_RADIUS; dx + <= ItemInversionSigilInactive.GRASS_SEARCH_RADIUS; dx++) { + for (int dz = -ItemInversionSigilInactive.GRASS_SEARCH_RADIUS; dz + <= ItemInversionSigilInactive.GRASS_SEARCH_RADIUS; dz++) { + for (int dy = -1; dy <= 1; dy++) { + int bx = cx + dx; + int by = cy + dy; + int bz = cz + dz; + Block b = world.getBlock(bx, by, bz); + if (b == Blocks.grass) { + count++; + if (count > REQUIRED_GRASS_COUNT) return true; + } + } + } + } + return false; + } + + @SubscribeEvent(priority = EventPriority.NORMAL) + public void onLivingDrops(LivingDropsEvent event) { + if (event.entityLiving instanceof EntityWither) { + event.drops.add( + new EntityItem( + event.entityLiving.worldObj, + event.entityLiving.posX, + event.entityLiving.posY, + event.entityLiving.posZ, + new ItemStack(this, 1))); + } + } + + @SubscribeEvent(priority = EventPriority.NORMAL) + public void onLivingDeath(LivingDeathEvent event) { + World world = event.entityLiving.worldObj; + + if (world.isRemote) return; + + if (!isWithinMidnightWindow(world.getWorldTime())) return; + + if (!(event.entityLiving instanceof EntityAnimal)) return; + + if (!(event.source != null && event.source.getSourceOfDamage() instanceof EntityPlayer player)) { + return; + } + + if (!player.inventory.hasItem(this)) return; + + int radius = ENCHANT_TABLE_SEARCH_RADIUS; + int mobX = (int) Math.floor(event.entityLiving.posX); + int mobY = (int) Math.floor(event.entityLiving.posY); + int mobZ = (int) Math.floor(event.entityLiving.posZ); + + int tableX = 0, tableY = 0, tableZ = 0; + boolean found = false; + + for (int dx = -radius; dx <= radius && !found; dx++) { + for (int dy = -2; dy <= 2 && !found; dy++) { + for (int dz = -radius; dz <= radius && !found; dz++) { + int bx = mobX + dx; + int by = mobY + dy; + int bz = mobZ + dz; + if (world.getBlock(bx, by, bz) == Blocks.enchanting_table) { + tableX = bx; + tableY = by; + tableZ = bz; + found = true; + } + } + } + } + + if (!found) return; + + boolean darkOk = world.getBlockLightValue(tableX, tableY, tableZ) <= LIGHT_LEVEL_REQUIRED; + boolean redstoneRingOk = hasRedstoneRing(world, tableX, tableY, tableZ); + boolean grassOk = countNearbyGrass(world, tableX, tableY, tableZ); + boolean moonOk = world.canBlockSeeTheSky(tableX, tableY, tableZ); + + if (!(darkOk && redstoneRingOk && grassOk && moonOk)) { + return; + } + + // Ritual has now succeeded + + EntityLightningBolt bolt = new EntityLightningBolt(world, tableX + 0.5, tableY + 1, tableZ + 0.5); + world.addWeatherEffect(bolt); + + // Transform all sigils in player's inventory to activated + for (int i = 0; i < player.inventory.getSizeInventory(); i++) { + ItemStack is = player.inventory.getStackInSlot(i); + if (is != null && is.getItem() == this) { + player.inventory.setInventorySlotContents(i, ItemInversionSigilActive.getStack()); + } + } + + // Convert grass to cursed earth + for (int dx = -GRASS_SEARCH_RADIUS; dx <= GRASS_SEARCH_RADIUS; dx++) { + for (int dz = -GRASS_SEARCH_RADIUS; dz <= GRASS_SEARCH_RADIUS; dz++) { + for (int dy = -1; dy <= 1; dy++) { + int bx = tableX + dx; + int by = tableY + dy; + int bz = tableZ + dz; + if (world.getBlock(bx, by, bz) == Blocks.grass) { + world.setBlock(bx, by, bz, cursedEarthBlock); + } + } + } + } + + if (!world.isRemote) { + player.addChatMessage(new ChatComponentTranslation("chat.inversion_ritual.complete")); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInvertedIngot.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInvertedIngot.java new file mode 100644 index 00000000..28cc5bb9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInvertedIngot.java @@ -0,0 +1,135 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import static com.fouristhenumber.utilitiesinexcess.utils.UIEUtils.formatNumber; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ContainerWorkbench; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemInvertedIngot extends Item implements ITranslucentItem { + + public ItemInvertedIngot() { + this.setTextureName("utilitiesinexcess:inverted_ingot"); + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + public static final DamageSource INVERTED_INGOT = (new DamageSource("inverted_ingot")).setDamageBypassesArmor(); + + @Override + public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int slot, boolean p_77663_5_) { + if (stack.getItemDamage() != 0 || !stack.hasTagCompound()) return; + if (!(entityIn instanceof EntityPlayer player)) return; + + if (!(player.openContainer instanceof ContainerWorkbench) || checkImplosion(stack, worldIn)) { + player.inventory.setInventorySlotContents(slot, null); + player.closeScreen(); + player.attackEntityFrom(INVERTED_INGOT, Float.MAX_VALUE); + } + + super.onUpdate(stack, worldIn, entityIn, slot, p_77663_5_); + } + + public static boolean checkImplosion(ItemStack item, World world) { + if (item.getItemDamage() == 0 && item.hasTagCompound()) { + NBTTagCompound tag = item.getTagCompound(); + int remaining = tag.getInteger("ImplosionTimer"); + if (remaining > 0) { + tag.setInteger("ImplosionTimer", remaining - 1); + } else { + return (world.isRemote); + } + } + return false; + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + if (stack.getItemDamage() == 0) return "item.inverted_ingot"; + else return "item.inverted_ingot.stable"; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + if (stack.getItemDamage() == 0) { + if (InversionConfig.invertedIngotsImplode) { + NBTTagCompound tag = stack.getTagCompound(); + if (tag == null) { + tooltip.add(StatCollector.translateToLocal("item.inverted_ingot.desc.c")); + } else { + tooltip.add(StatCollector.translateToLocal("item.inverted_ingot.desc.1")); + if (stack.hasTagCompound()) { + double time = (double) stack.getTagCompound() + .getInteger("ImplosionTimer") / 20; + tooltip.add( + StatCollector.translateToLocalFormatted( + "item.inverted_ingot.desc.2", + formatNumber(Math.max(0, time)))); + } else { + tooltip.add(StatCollector.translateToLocalFormatted("item.inverted_ingot.desc.2", 10)); + } + tooltip.add(StatCollector.translateToLocal("item.inverted_ingot.desc.3")); + tooltip.add(StatCollector.translateToLocal("item.inverted_ingot.desc.4")); + tooltip.add(StatCollector.translateToLocal("item.inverted_ingot.desc.5")); + } + } + } else { + tooltip.add(StatCollector.translateToLocalFormatted("item.inverted_ingot.stable.desc")); + } + super.addInformation(stack, player, tooltip, p_77624_4_); + } + + @Override + public int getItemStackLimit(ItemStack stack) { + return (stack.getItemDamage() == 0) ? 1 : 64; + } + + @SideOnly(Side.CLIENT) + private IIcon[] icons; + + @SideOnly(Side.CLIENT) + @Override + public void registerIcons(IIconRegister reg) { + icons = new IIcon[2]; + icons[0] = reg.registerIcon("utilitiesinexcess:inverted_ingot"); + icons[1] = reg.registerIcon("utilitiesinexcess:inverted_ingot_stable"); + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIconFromDamage(int meta) { + return icons[meta]; + } + + @SideOnly(Side.CLIENT) + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + list.add(new ItemStack(item, 1, 0)); + list.add(new ItemStack(item, 1, 1)); + } + + public static class InvertedNugget extends Item implements ITranslucentItem { + + public InvertedNugget() { + setUnlocalizedName("inverted_nugget"); + setTextureName("utilitiesinexcess:inverted_nugget"); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemMobJar.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemMobJar.java new file mode 100644 index 00000000..64dc5980 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemMobJar.java @@ -0,0 +1,120 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.IMob; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemMobJar extends Item { + + @SideOnly(Side.CLIENT) + private IIcon emptyIcon; + @SideOnly(Side.CLIENT) + private IIcon filledIcon; + + public ItemMobJar() { + setUnlocalizedName("mob_jar"); + setMaxStackSize(1); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister register) { + emptyIcon = register.registerIcon("utilitiesinexcess:mob_jar"); + filledIcon = register.registerIcon("utilitiesinexcess:mob_jar_full"); + itemIcon = emptyIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack stack, int pass) { + if (stack.hasTagCompound() && stack.getTagCompound() + .hasKey("MobData")) { + return filledIcon; + } + return emptyIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconIndex(ItemStack stack) { + return getIcon(stack, 0); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if (!world.isRemote && stack.hasTagCompound() + && stack.getTagCompound() + .hasKey("MobData")) { + NBTTagCompound mobData = stack.getTagCompound() + .getCompoundTag("MobData"); + Entity entity = EntityList.createEntityFromNBT(mobData, world); + if (entity != null) { + entity.setPosition(player.posX, player.posY, player.posZ); + world.spawnEntityInWorld(entity); + stack.getTagCompound() + .removeTag("MobData"); + } + } + return stack; + } + + @Override + public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase target) { + ItemStack currentStack = player.getHeldItem(); + if (!currentStack.hasTagCompound()) { + currentStack.setTagCompound(new NBTTagCompound()); + } + + if (!currentStack.getTagCompound() + .hasKey("MobData") && target instanceof EntityLiving && !(target instanceof IMob)) { + NBTTagCompound entityData = new NBTTagCompound(); + target.writeToNBT(entityData); + entityData.setString("id", EntityList.getEntityString(target)); + + currentStack.getTagCompound() + .setTag("MobData", entityData); + + if (!target.worldObj.isRemote) { + target.setDead(); + } + + return true; + } + return false; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + if (stack.hasTagCompound() && stack.getTagCompound() + .hasKey("MobData")) { + NBTTagCompound mobData = stack.getTagCompound() + .getCompoundTag("MobData"); + String id = mobData.getString("id"); + + // Make a dummy entity solely so that the proper localized name can be retrieved + Entity dummy = EntityList.createEntityByName(id, player.worldObj); + if (dummy instanceof EntityLivingBase) { + String mobName = dummy.getCommandSenderName(); + tooltip.add(StatCollector.translateToLocalFormatted("item.mob_jar.desc.full", mobName)); + } + } else { + tooltip.add(StatCollector.translateToLocal("item.mob_jar.desc.empty")); + } + super.addInformation(stack, player, tooltip, p_77624_4_); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPseudoInversionSigil.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPseudoInversionSigil.java new file mode 100644 index 00000000..77bc990a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPseudoInversionSigil.java @@ -0,0 +1,25 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class ItemPseudoInversionSigil extends Item { + + public ItemPseudoInversionSigil() { + super(); + setUnlocalizedName("pseudo_inversion_sigil"); + setTextureName("utilitiesinexcess:pseudo_inversion_sigil"); + setMaxStackSize(1); + setContainerItem(this); + } + + @Override + public boolean doesContainerItemLeaveCraftingGrid(ItemStack par1ItemStack) { + return false; + } + + @Override + public ItemStack getContainerItem(ItemStack itemStack) { + return itemStack; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java new file mode 100644 index 00000000..96347fae --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java @@ -0,0 +1,56 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.TransferUpgrade; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemUpgrade extends Item { + + private static final IIcon[] ICONS = new IIcon[TransferUpgrade.VALUES.length]; + + public ItemUpgrade() { + setUnlocalizedName("upgrade"); + setHasSubtypes(true); + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIconFromDamage(int meta) { + return ICONS[meta]; + } + + @Override + public int getMetadata(int meta) { + return meta; + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return super.getUnlocalizedName(stack) + "_" + TransferUpgrade.VALUES[stack.getItemDamage()].getName(); + } + + @SideOnly(Side.CLIENT) + @Override + public void registerIcons(IIconRegister register) { + for (TransferUpgrade upgrade : TransferUpgrade.VALUES) { + ICONS[upgrade.ordinal()] = register.registerIcon(UtilitiesInExcess.MODID + ":" + upgrade.getName()); + } + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List items) { + for (TransferUpgrade upgrade : TransferUpgrade.VALUES) { + items.add(new ItemStack(item, 1, upgrade.ordinal())); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemWateringCan.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemWateringCan.java new file mode 100644 index 00000000..fe383b50 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemWateringCan.java @@ -0,0 +1,390 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import static com.fouristhenumber.utilitiesinexcess.config.items.WateringCanConfig.wateringCan; +import static net.minecraft.init.Blocks.mycelium; + +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.WeakHashMap; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockFarmland; +import net.minecraft.block.BlockFlower; +import net.minecraft.block.IGrowable; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.EnumAction; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.IPlantable; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.common.events.WateringCanEvent; +import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.network.PacketHandler; +import com.fouristhenumber.utilitiesinexcess.network.client.ParticlePacket; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import thaumcraft.common.lib.FakeThaumcraftPlayer; + +// Credit to Mystical Agriculture 1.12 for the original ItemWateringCan implementation +public class ItemWateringCan extends Item { + + private int range; + private static final String TAG_ACTIVE = "WateringCanActive"; + // A map to track the last time each player used the watering can + public static final Map lastWaterTick = new WeakHashMap<>(); + private final int cooldownTicks = 4; // Watering delay + private final int tier; + + public ItemWateringCan(int tier, int effectArea) { + // Ensure effectArea is odd, since it should be centered (3, 5, 7, etc.) + this.range = (effectArea - 1) / 2;; + this.tier = tier; + setTextureName("utilitiesinexcess:" + getNameFromTier(tier)); + setUnlocalizedName(getNameFromTier(tier)); + setMaxStackSize(1); + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected) { + if (!selected || !(entity instanceof EntityPlayer player)) return; + long currentTick = world.getTotalWorldTime(); + long lastTick = lastWaterTick.getOrDefault(player, 0L); + // Check if enough time has passed since the last watering action + boolean canWater = (currentTick - lastTick) >= cooldownTicks; + + // If the player is using the item or the watering can is active, proceed with watering + if ((player.isUsingItem() || isActive(stack))) { + // If the player can water and the world is not remote (server-side), perform the watering action + if (!world.isRemote && canWater) { + lastWaterTick.put(player, currentTick); + onItemUse(stack, player, world); + } else { + // If the player is remote (client-side) apply the walking speed penalty + walkingSpeed(player, player.isUsingItem() ? false : true); + } + } + } + + @Override + public boolean hasEffect(ItemStack stack, int pass) { + return isActive(stack); + } + + @Override + public EnumAction getItemUseAction(ItemStack stack) { + return EnumAction.none; + } + + @Override + public int getMaxItemUseDuration(ItemStack stack) { + return 72000; + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if (isFakePlayer(player) && !world.isRemote) { + this.onItemUse(stack, player, world); + // prevent CoFH Fake player from deleting the item + return stack; + } + + player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); + return stack; + } + + @Override + public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, + float hitX, float hitY, float hitZ) { + // Check if the watering can is enabled and if the player is sneaking to toggle it + if (wateringCan.allowWateringCanToggle && player.isSneaking() && !world.isRemote) { + setActive(stack, !isActive(stack)); + player.addChatMessage( + new ChatComponentTranslation("item.watering_can." + (isActive(stack) ? "activated" : "deactivated"))); + return true; + } + if (isFakePlayer(player) && !world.isRemote) { + this.onItemUse(stack, player, world, x, y, z, side); + } + + return false; + } + + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, + float hitX, float hitY, float hitZ) { + + if (isFakePlayer(player) && !world.isRemote) { + this.onItemUse(stack, player, world, x, y, z, side); + } + return false; + } + + /** + * Called when the item is used by the player. + * This method is called when the player right-clicks with the item. + * It performs a ray trace to find the block the player is looking at and calls onItemUse with the hit position. + */ + public void onItemUse(ItemStack stack, Entity entity, World world) { + if (entity instanceof EntityPlayer player) { + MovingObjectPosition hit = getMovingObjectPositionFromPlayer(world, player, true); + if (hit != null) { + onItemUse(stack, player, world, hit.blockX, hit.blockY, hit.blockZ, hit.sideHit); + } + } + } + + /** + * This method is called when the player right-clicks on a block with the item. + * It checks if the block is a farmland block and if the player has permission to edit it. + * If so, it performs the watering action on the farmland blocks in the specified range. + * executed server-side to ensure the watering can works correctly in multiplayer. + */ + private boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side) { + if (world.isRemote) return false; // Ensure this is executed server-side + ForgeDirection dir = ForgeDirection.getOrientation(side); + int x2 = x + dir.offsetX; + int y2 = y + dir.offsetY; + int z2 = z + dir.offsetZ; + + if (!player.canPlayerEdit(x2, y2, z2, side, stack)) return false; + + if (!wateringCan.allowAutomatedWatering && isFakePlayer(player)) return false; + + this.hydrateFarmland(world, x, y, z); + + this.spawnFlowers(world, x, y, z); + + this.spawnParticle(world, x, y, z); + + this.accelerateGrowth(world, x, y, z); + + return false; + } + + public void accelerateGrowth(World world, int x, int y, int z) { + int chance = world.rand.nextInt(100) + 1; + int bonus = 4; + if (chance <= (40 + bonus)) { + for (int dx = -range; dx <= range; dx++) { + for (int dy = -range; dy <= range; dy++) { + for (int dz = -range; dz <= range; dz++) { + int bx = x + dx; + int by = y + dy; + int bz = z + dz; + Block plant = world.getBlock(bx, by, bz); + MinecraftForge.EVENT_BUS + .post(new WateringCanEvent(new BlockPos(bx, by, bz), new BlockPos(x, y, z), tier)); + if (plant instanceof IGrowable || plant instanceof IPlantable || plant == mycelium) { + world.scheduleBlockUpdateWithPriority(bx, by, bz, plant, 0, 1000); + } + } + } + } + } + } + + /** + * Hydrates farmland blocks in a cubic range around the specified coordinates. + * This method checks each block in the range and sets its metadata to 7 (hydrated) if it is farmland. + * It is called when the watering can is used to water crops. + */ + public void hydrateFarmland(World world, int x, int y, int z) { + for (int dx = -range; dx <= range; dx++) { + for (int dy = -range; dy <= range; dy++) { + for (int dz = -range; dz <= range; dz++) { + int bx = x + dx; + int by = y + dy; + int bz = z + dz; + if (world.getBlock(bx, by, bz) instanceof BlockFarmland) { + int meta = world.getBlockMetadata(bx, by, bz); + if (meta < 7) { + world.setBlockMetadataWithNotify(bx, by, bz, 7, 2); + } + } + } + } + } + } + + /** + * Spawns flowers in a cubic range around the specified coordinates. + * If used directly on a flower, it will attempt to multiply that flower nearby. + * Otherwise, has a chance to spawn a random flower. + */ + public void spawnFlowers(World world, int x, int y, int z) { + Block targetBlock = world.getBlock(x, y, z); + int targetMeta = world.getBlockMetadata(x, y, z); + + // randomly spawn a flower (3% chance) + if (world.rand.nextInt(100) < 3) { + int bx = x + world.rand.nextInt(range * 2 + 1) - range; + int bz = z + world.rand.nextInt(range * 2 + 1) - range; + int by = y; + Block targetBlockAt = world.getBlock(bx, by, bz); + + // Multiply flower if used on an existing flower block + if (wateringCan.Flowering.allowFlowerDuplication && targetBlock instanceof BlockFlower) { + multiplyFlower(world, bx, by, bz, (BlockFlower) targetBlock, targetMeta); + return; + } + if (!wateringCan.Flowering.allowFlowerSpawning) return; + + // Ensure flowers only spawn on grass blocks: + // If the target block isn't grass, check the block below its top surface (accounting for block height). + // Abort spawning if that block is not grass. + if (targetBlockAt != Blocks.grass) { + if (world.getBlock(bx, (int) (by - targetBlockAt.getBlockBoundsMaxY()), bz) != Blocks.grass) { + return; + } + } + + // If the target block height is less than 0.85F try and place a new flower next to it + if (wateringCan.Flowering.adjustFlowerSpawnHeightForShortBlocks + && targetBlock.getBlockBoundsMaxY() < 0.85F) { + by -= targetBlock.getBlockBoundsMaxY(); // Adjust the height to place the flower correctly + } + + by += 1; // Place the flower one block above the target coordinates + Block below = world.getBlock(bx, by - 1, bz); + + if (world.isAirBlock(bx, by, bz) + && below.canSustainPlant(world, bx, by - 1, bz, ForgeDirection.UP, Blocks.red_flower)) { + + int totalVariants = BlockFlower.field_149859_a.length + BlockFlower.field_149858_b.length; + int variantIndex = world.rand.nextInt(totalVariants); + + Block flowerBlock; + int meta; + + if (variantIndex < BlockFlower.field_149859_a.length) { + flowerBlock = Blocks.red_flower; + meta = variantIndex; + } else { + flowerBlock = Blocks.yellow_flower; + meta = variantIndex - BlockFlower.field_149859_a.length; + } + + world.setBlock(bx, by, bz, flowerBlock, meta, 2); + } + } + } + + /** + * Attempts to multiply a flower near the given coordinates. + */ + private void multiplyFlower(World world, int x, int y, int z, BlockFlower flowerBlock, int flowerMeta) { + Block below = world.getBlock(x, y - 1, z); + + if (world.isAirBlock(x, y, z) && below.canSustainPlant(world, x, y - 1, z, ForgeDirection.UP, flowerBlock)) { + world.setBlock(x, y, z, flowerBlock, flowerMeta, 2); + } + } + + /** + * Spawns particles around the watering can to indicate its use. + * This method is called when the watering can is used to water crops. + * It sends a particle packet to all players around the watering can. + */ + public void spawnParticle(World world, int x, int y, int z) { + Random rand = world.rand; + for (int dx = -range; dx <= range; dx++) { + for (int dz = -range; dz <= range; dz++) { + double d0 = x + dx + rand.nextFloat(); + double d1 = y + world.getBlock(x, y, z) + .getBlockBoundsMaxY(); + double d2 = z + dz + rand.nextFloat(); + + if (world.getBlock(x, y, z) + .isOpaqueCube() || world.getBlock(x, y, z) instanceof BlockFarmland) { + d1 += 0.3D; + } + + // Send particle packet to all players around the watering can + PacketHandler.INSTANCE.sendToAllAround( + new ParticlePacket("splash", d0, d1, d2, 5), + new NetworkRegistry.TargetPoint(world.provider.dimensionId, d0, d1, d2, 32.0 // range in blocks + )); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { + int range = (this.range * 2 + 1); + tooltip.add( + EnumChatFormatting.AQUA + + StatCollector.translateToLocalFormatted("item.watering_can.desc.1", range, range)); + } + + public boolean isActive(ItemStack stack) { + return stack.hasTagCompound() && stack.getTagCompound() + .getBoolean(TAG_ACTIVE); + } + + public void setActive(ItemStack stack, boolean active) { + NBTTagCompound tag = stack.getTagCompound(); + if (tag == null) { + tag = new NBTTagCompound(); + stack.setTagCompound(tag); + } + tag.setBoolean(TAG_ACTIVE, active); + } + + /** + * Adjusts the player's walking speed based on whether the watering can is active or not. + * This method is called to apply a speed penalty when the player is using the watering can. + * It modifies the player's movement input to slow them down while using the watering can. + */ + public void walkingSpeed(EntityPlayer player, boolean slowness) { + if (player.worldObj.isRemote && player instanceof EntityPlayerSP playerSP) { + // this is a workaround to prevent the player from slowing when using the watering can (right click) + if (!slowness && !wateringCan.walkingSpeedPenalty) { + playerSP.movementInput.moveStrafe /= 0.2F; + playerSP.movementInput.moveForward /= 0.2F; + } else if (slowness && wateringCan.walkingSpeedPenalty) { + playerSP.movementInput.moveStrafe *= 0.2F; + playerSP.movementInput.moveForward *= 0.2F; + } + playerSP.setSprinting(false); // Disable sprinting + } + } + + public String getNameFromTier(int tier) { + switch (tier) { + case 1: + return "watering_can_basic"; + case 2: + return "watering_can_advanced"; + case 3: + return "watering_can_elite"; + default: + return "watering_can"; // Fallback for any other tier + } + } + + public boolean isFakePlayer(EntityPlayer player) { + if (player == null) return false; + // Check for Forge FakePlayer + if (player instanceof FakePlayer) return true; + // Check for Thaumcraft FakeThaumcraftPlayer + if (Mods.Thaumcraft.isLoaded() && player instanceof FakeThaumcraftPlayer) return true; + + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemXRayGlasses.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemXRayGlasses.java new file mode 100644 index 00000000..ff4e19e6 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemXRayGlasses.java @@ -0,0 +1,106 @@ +package com.fouristhenumber.utilitiesinexcess.common.items; + +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Queue; +import java.util.Set; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.renderers.XRayRenderer; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +public class ItemXRayGlasses extends ItemArmor { + + static final int reach = 5; + + public ItemXRayGlasses(ArmorMaterial armorMaterial, int renderIndex, int armorType) { + super(armorMaterial, renderIndex, armorType); + setUnlocalizedName("xray_glasses"); + setTextureName("utilitiesinexcess:xray_glasses"); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) { + return "utilitiesinexcess:textures/items/xray_glasses_model.png"; + } + + @Override + public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { + if (!world.isRemote || player.ticksExisted % 3 != 0) return; + + XRayRenderer.clearCandidatePositions(); + + double eyeX = player.posX; + double eyeY = player.posY + player.getEyeHeight(); + double eyeZ = player.posZ; + + Vec3 look = player.getLookVec(); + + Vec3 end = Vec3 + .createVectorHelper(eyeX + look.xCoord * reach, eyeY + look.yCoord * reach, eyeZ + look.zCoord * reach); + + MovingObjectPosition mop = world.rayTraceBlocks(Vec3.createVectorHelper(eyeX, eyeY, eyeZ), end); + + if (mop != null && mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int x = mop.blockX; + int y = mop.blockY; + int z = mop.blockZ; + Block targetBlock = world.getBlock(x, y, z); + int targetMeta = world.getBlockMetadata(x, y, z); + + XRayRenderer.addCandidatePosition(new BlockPos(x, y, z)); + + Set visited = new HashSet<>(); + Queue toVisit = new LinkedList<>(); + + BlockPos origin = new BlockPos(x, y, z); + toVisit.add(origin); + visited.add(origin); + + int maxDistance = 5; + + while (!toVisit.isEmpty()) { + BlockPos current = toVisit.poll(); + + for (int dx = -1; dx <= 1; dx++) { + for (int dy = -1; dy <= 1; dy++) { + for (int dz = -1; dz <= 1; dz++) { + if (dx == 0 && dy == 0 && dz == 0) continue; + + int nx = current.x + dx; + int ny = current.y + dy; + int nz = current.z + dz; + BlockPos neighbor = new BlockPos(nx, ny, nz); + + if (distanceSq(origin, neighbor) > maxDistance * maxDistance || visited.contains(neighbor)) + continue; + + Block b = world.getBlock(nx, ny, nz); + int m = world.getBlockMetadata(nx, ny, nz); + if (b == targetBlock && m == targetMeta) { + visited.add(neighbor); + toVisit.add(neighbor); + XRayRenderer.addCandidatePosition(neighbor); + } + } + } + } + } + } + } + + private double distanceSq(BlockPos a, BlockPos b) { + double dx = a.x - b.x; + double dy = a.y - b.y; + double dz = a.z - b.z; + return dx * dx + dy * dy + dz * dz; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemAntiParticulateShovel.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemAntiParticulateShovel.java new file mode 100644 index 00000000..1a0db32d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemAntiParticulateShovel.java @@ -0,0 +1,67 @@ +package com.fouristhenumber.utilitiesinexcess.common.items.tools; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockFalling; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemSpade; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.AntiParticulateShovelConfig; + +public class ItemAntiParticulateShovel extends ItemSpade { + + public ItemAntiParticulateShovel() { + super(ToolMaterial.EMERALD); + setTextureName("utilitiesinexcess:anti_particulate_shovel"); + setUnlocalizedName("anti_particulate_shovel"); + if (AntiParticulateShovelConfig.unbreakable) setMaxDamage(0); + } + + @Override + public boolean onBlockDestroyed(ItemStack stack, World worldIn, Block blockIn, int x, int y, int z, + EntityLivingBase harvester) { + int worldHeight = worldIn.getHeight(); + if (AntiParticulateShovelConfig.breakFallingAbove) for (int curY = y + 1; curY < worldHeight; curY++) { + Block block = worldIn.getBlock(x, curY, z); + if (block instanceof BlockFalling f && this.func_150893_a(stack, block) >= 1) { + EntityPlayer hPlayer = (EntityPlayer) harvester; + int meta = worldIn.getBlockMetadata(x, y, z); + if (block.removedByPlayer(worldIn, hPlayer, x, curY, z, true)) + block.harvestBlock(worldIn, hPlayer, x, curY, z, meta); + } else break; + } + return super.onBlockDestroyed(stack, worldIn, blockIn, x, y, z, harvester); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + if (AntiParticulateShovelConfig.unbreakable) + tooltip.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted("item.unbreakable.desc")); + } + + // Unbreakable + @Override + public boolean isDamageable() { + if (AntiParticulateShovelConfig.unbreakable) return false; + return super.isDamageable(); + } + + @Override + public boolean getIsRepairable(ItemStack stack, ItemStack repairMaterial) { + if (AntiParticulateShovelConfig.unbreakable) return false; + return super.getIsRepairable(stack, repairMaterial); + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + if (AntiParticulateShovelConfig.unbreakable) return false; + return super.showDurabilityBar(stack); + } + // +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java new file mode 100644 index 00000000..53c56d61 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java @@ -0,0 +1,85 @@ +package com.fouristhenumber.utilitiesinexcess.common.items.tools; + +import java.util.HashMap; +import java.util.List; +import java.util.regex.Pattern; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemPickaxe; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; + +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig; + +import akka.japi.Pair; + +public class ItemDestructionPickaxe extends ItemPickaxe { + + public ItemDestructionPickaxe() { + super(ToolMaterial.EMERALD); + setTextureName("utilitiesinexcess:destruction_pickaxe"); + setUnlocalizedName("destruction_pickaxe"); + if (DestructionPickaxeConfig.unbreakable) setMaxDamage(0); + } + + private final static HashMap compiledPatterns = new HashMap<>(); + private final static HashMap, Boolean> resultLookup = new HashMap<>(); + + public static boolean blockMatches(String name, String pattern) { + // Prob can be made cleaner + if (!compiledPatterns.containsKey(name)) { + String replaceWildcard = pattern.replace(".", "\\.") + .replace("*", ".*?") + .replace("(", "\\(") + .replace(")", "\\)"); + compiledPatterns.put(pattern, Pattern.compile(replaceWildcard)); + } + Pattern p = compiledPatterns.get(pattern); + if (!resultLookup.containsKey(new Pair<>(pattern, name))) { + boolean res = p.matcher(name) + .matches(); + resultLookup.put(new Pair<>(pattern, name), res); + } + return resultLookup.get(new Pair<>(pattern, name)); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + var i = DestructionPickaxeConfig.includeEffective; + var w = DestructionPickaxeConfig.excludeEffective; + var name = block.delegate.name(); + for (String s : w) if (blockMatches(name, s)) + return efficiencyOnProperMaterial * DestructionPickaxeConfig.ineffectiveSpeedModifier; + for (String s : i) if (blockMatches(name, s)) + return efficiencyOnProperMaterial * DestructionPickaxeConfig.effectiveSpeedModifier; + return efficiencyOnProperMaterial * DestructionPickaxeConfig.ineffectiveSpeedModifier; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + if (DestructionPickaxeConfig.unbreakable) + tooltip.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted("item.unbreakable.desc")); + } + + // Unbreakable + @Override + public boolean isDamageable() { + if (DestructionPickaxeConfig.unbreakable) return false; + return super.isDamageable(); + } + + @Override + public boolean getIsRepairable(ItemStack stack, ItemStack repairMaterial) { + if (DestructionPickaxeConfig.unbreakable) return false; + return super.getIsRepairable(stack, repairMaterial); + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + if (DestructionPickaxeConfig.unbreakable) return false; + return super.showDurabilityBar(stack); + } + // +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemEthericSword.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemEthericSword.java new file mode 100644 index 00000000..b19c833c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemEthericSword.java @@ -0,0 +1,81 @@ +package com.fouristhenumber.utilitiesinexcess.common.items.tools; + +import java.util.List; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemSword; +import net.minecraft.potion.Potion; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; + +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.EthericSwordConfig; +import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorEntityLivingBase; +import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorItemSword; + +public class ItemEthericSword extends ItemSword { + + public ItemEthericSword() { + super(ToolMaterial.EMERALD); + setTextureName("utilitiesinexcess:etheric_sword"); + setUnlocalizedName("etheric_sword"); + if (EthericSwordConfig.unbreakable) setMaxDamage(0); + ((AccessorItemSword) this).setDamageVsEntity(EthericSwordConfig.normalDamage); + } + + @Override + public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase p) { + // Shouldn't ever fail? + EntityPlayer player = (EntityPlayer) p; + boolean succeed = super.hitEntity(stack, target, player); + // Apparently this code doesn't exist standalone, so i just stole it:P + boolean isCrit = player.fallDistance > 0.0F && !player.onGround + && !player.isOnLadder() + && !player.isInWater() + && !player.isPotionActive(Potion.blindness) + && player.ridingEntity == null + && target instanceof EntityLivingBase; + float magicDamage = EthericSwordConfig.magicDamage; + if (isCrit) magicDamage *= 1.5f; + AccessorEntityLivingBase acTarget = (AccessorEntityLivingBase) target; + float cd = acTarget.getLastDamage(); + // Set the last damage to 0 because we don't want our normal dmg to our interrupt magic dmg + acTarget.setLastDamage(0); + target.attackEntityFrom( + DamageSource.causePlayerDamage(player) + .setDamageBypassesArmor() + .setMagicDamage(), + magicDamage); + // Should magic damage impair next hit? Probably yeah + acTarget.setLastDamage(cd + magicDamage); + return succeed; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + if (EthericSwordConfig.unbreakable) + tooltip.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted("item.unbreakable.desc")); + } + + // Unbreakable + @Override + public boolean isDamageable() { + if (EthericSwordConfig.unbreakable) return false; + return super.isDamageable(); + } + + @Override + public boolean getIsRepairable(ItemStack stack, ItemStack repairMaterial) { + if (EthericSwordConfig.unbreakable) return false; + return super.getIsRepairable(stack, repairMaterial); + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + if (EthericSwordConfig.unbreakable) return false; + return super.showDurabilityBar(stack); + } + // +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGluttonsAxe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGluttonsAxe.java new file mode 100644 index 00000000..4398aba9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGluttonsAxe.java @@ -0,0 +1,125 @@ +package com.fouristhenumber.utilitiesinexcess.common.items.tools; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemAxe; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.FoodStats; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GluttonsAxeConfig; +import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorEntityZombie; +import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorItemTool; + +public class ItemGluttonsAxe extends ItemAxe { + + public ItemGluttonsAxe() { + super(ToolMaterial.EMERALD); + setTextureName("utilitiesinexcess:gluttons_axe"); + setUnlocalizedName("gluttons_axe"); + if (GluttonsAxeConfig.unbreakable) setMaxDamage(0); + ((AccessorItemTool) this).setDamageVsEntity(GluttonsAxeConfig.damageAgainstUndead); + } + + private static final Random particleRandom = new Random();; + + public static void spawnParticles(Entity e) { + if (!GluttonsAxeConfig.spawnParticles) return; + int ci = Potion.potionTypes[Potion.heal.getId()].getLiquidColor(); + double d0 = (double) (ci >> 16 & 255) / 255.0D; + double d1 = (double) (ci >> 8 & 255) / 255.0D; + double d2 = (double) (ci >> 0 & 255) / 255.0D; + for (int i = 0; i < 5; i++) { + + e.worldObj.spawnParticle( + "mobSpell", + e.posX + (particleRandom.nextDouble() - 0.5D) * (double) e.width, + e.posY + particleRandom.nextDouble() * (double) e.height - (double) e.yOffset, + e.posZ + (particleRandom.nextDouble() - 0.5D) * (double) e.width, + d0, + d1, + d2); + } + } + + // Restore hunger every 2 seconds + @Override + public void onUpdate(ItemStack s, World w, Entity e, int slot, boolean selected) { + super.onUpdate(s, w, e, slot, selected); + if (e instanceof EntityPlayer p && selected) { + if (w.getTotalWorldTime() % (2 * 20) == 0) { + FoodStats fs = p.getFoodStats(); + fs.addStats(GluttonsAxeConfig.foodGain, GluttonsAxeConfig.saturationGain); + } + } + } + + @Override + public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, + EntityLivingBase entity) { + return true; + } + + @Override + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer attacker, Entity e) { + if (!(e instanceof EntityLivingBase target)) return false; + if (target instanceof EntityZombie z && z.isVillager()) { + attacker.addExhaustion(3 * 4); + spawnParticles(target); + if (!attacker.worldObj.isRemote) ((AccessorEntityZombie) z).uie$convertToVillager(); + return true; + } + if (!target.isEntityUndead()) { + + float amountToHeal = Math.min(GluttonsAxeConfig.maxHeal, target.getMaxHealth() - target.getHealth()); + if (amountToHeal == 0) if (GluttonsAxeConfig.useHungerAlways) attacker.addExhaustion(3 * 4); + else { + if (GluttonsAxeConfig.drainHp) if (attacker.getHealth() >= amountToHeal + 1) + attacker.setHealth(attacker.getHealth() - amountToHeal); + else return true; + target.setHealth(target.getHealth() + (amountToHeal + 1)); + attacker.addExhaustion(amountToHeal * 4); + } + spawnParticles(target); + return true; + } + attacker.addExhaustion(3 * 4); + spawnParticles(target); + return false; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + if (GluttonsAxeConfig.unbreakable) + tooltip.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted("item.unbreakable.desc")); + } + + // Unbreakable + @Override + public boolean isDamageable() { + if (GluttonsAxeConfig.unbreakable) return false; + return super.isDamageable(); + } + + @Override + public boolean getIsRepairable(ItemStack stack, ItemStack repairMaterial) { + if (GluttonsAxeConfig.unbreakable) return false; + return super.getIsRepairable(stack, repairMaterial); + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + if (GluttonsAxeConfig.unbreakable) return false; + return super.showDurabilityBar(stack); + } + // +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemPrecisionShears.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemPrecisionShears.java new file mode 100644 index 00000000..80013203 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemPrecisionShears.java @@ -0,0 +1,119 @@ +package com.fouristhenumber.utilitiesinexcess.common.items.tools; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemShears; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeHooks; + +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.PrecisionShearsConfig; + +public class ItemPrecisionShears extends ItemShears { + + public static final String COOLDOWN_NBT_TAG = "uie:cooldown"; + private IIcon cooldownIcon; + + public ItemPrecisionShears() { + setTextureName("utilitiesinexcess:precision_shears"); + setUnlocalizedName("precision_shears"); + if (PrecisionShearsConfig.unbreakable) setMaxDamage(0); + int harvestLevel = PrecisionShearsConfig.toolLevel; + setHarvestLevel("pickaxe", harvestLevel); + setHarvestLevel("axe", harvestLevel); + setHarvestLevel("shovel", harvestLevel); + } + + @Override + public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int p_77663_4_, boolean p_77663_5_) { + if (stack.hasTagCompound()) { + NBTTagCompound nbt = stack.getTagCompound(); + int cooldown = nbt.getInteger(COOLDOWN_NBT_TAG); + if (cooldown > 0) { + nbt.setInteger(COOLDOWN_NBT_TAG, cooldown - 1); + stack.setTagCompound(nbt); + } + } + super.onUpdate(stack, worldIn, entityIn, p_77663_4_, p_77663_5_); + } + + @Override + public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, + float clickX, float clickY, float clickZ) { + NBTTagCompound nbt = itemStack.hasTagCompound() ? itemStack.getTagCompound() : new NBTTagCompound(); + Block block = world.getBlock(x, y, z); + int meta = world.getBlockMetadata(x, y, z); + float hardness = block.getPlayerRelativeBlockHardness(player, world, x, y, z); + if (!player.isSneaking() || nbt.getInteger(COOLDOWN_NBT_TAG) != 0 || hardness <= 0) + return super.onItemUse(itemStack, player, world, x, y, z, side, clickX, clickY, clickZ); + if (!world.isRemote && block.removedByPlayer(world, player, x, y, z, true)) { + block.harvestBlock(world, player, x, y, z, meta); + nbt.setInteger(COOLDOWN_NBT_TAG, PrecisionShearsConfig.cooldown); + itemStack.setTagCompound(nbt); + if (!PrecisionShearsConfig.unbreakable) itemStack.damageItem(1, player); + } else if (PrecisionShearsConfig.spawnParticles) { + world.spawnParticle("smoke", x + 0.5d, y + 0.5d, z + 0.5d, 0.0D, 0.0D, 0.0D); + } + return super.onItemUse(itemStack, player, world, x, y, z, side, clickX, clickY, clickZ); + } + + @Override + public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { + if (ForgeHooks.isToolEffective(itemstack, block, metadata)) { + return PrecisionShearsConfig.efficiency; + } else { + return super.getDigSpeed(itemstack, block, metadata); + } + } + + @Override + public void registerIcons(IIconRegister register) { + super.registerIcons(register); + cooldownIcon = register.registerIcon("utilitiesinexcess:precision_shears_cooldown"); + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (stack.hasTagCompound()) { + if (stack.getTagCompound() + .getInteger(COOLDOWN_NBT_TAG) > 0) { + return cooldownIcon; + } + } + return super.getIcon(stack, pass); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + if (PrecisionShearsConfig.unbreakable) + tooltip.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted("item.unbreakable.desc")); + } + + // Unbreakable + @Override + public boolean isDamageable() { + if (PrecisionShearsConfig.unbreakable) return false; + return super.isDamageable(); + } + + @Override + public boolean getIsRepairable(ItemStack stack, ItemStack repairMaterial) { + if (PrecisionShearsConfig.unbreakable) return false; + return super.getIsRepairable(stack, repairMaterial); + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + if (PrecisionShearsConfig.unbreakable) return false; + return super.showDurabilityBar(stack); + } + // +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java new file mode 100644 index 00000000..0756783b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java @@ -0,0 +1,82 @@ +package com.fouristhenumber.utilitiesinexcess.common.items.tools; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemHoe; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.ReversingHoeConfig; + +// TODO: Add new features to the reversing hoe +public class ItemReversingHoe extends ItemHoe { + + public ItemReversingHoe() { + super(ToolMaterial.EMERALD); + setTextureName("utilitiesinexcess:reversing_hoe"); + setUnlocalizedName("reversing_hoe"); + if (ReversingHoeConfig.unbreakable) setMaxDamage(0); + } + + @Override + public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, + float clickX, float clickY, float clickZ) { + Block block = world.getBlock(x, y, z); + // TODO: config for this + if (block == Blocks.dirt) { + world.setBlock(x, y, z, Blocks.grass); + return true; + } else if (block == Blocks.cobblestone) { + world.setBlock(x, y, z, Blocks.stone); + return true; + } else if (block == ModBlocks.CURSED_EARTH.get() && CursedEarthConfig.enableBlessedEarth) { + world.setBlock(x, y, z, ModBlocks.BLESSED_EARTH.get()); + return true; + } else if (block == ModBlocks.BLESSED_EARTH.get() && CursedEarthConfig.enableCursedEarth) { + world.setBlock(x, y, z, ModBlocks.CURSED_EARTH.get()); + return true; + } else if (block == Blocks.wheat) { + int meta = world.getBlockMetadata(x, y, z); + if (meta > 0) { + world.setBlockMetadataWithNotify(x, y, z, meta - 1, 3); + return true; + } + return false; + } + + return super.onItemUse(itemStack, player, world, x, y, z, side, clickX, clickY, clickZ); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + if (ReversingHoeConfig.unbreakable) + tooltip.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted("item.unbreakable.desc")); + } + + // Unbreakable + @Override + public boolean isDamageable() { + if (ReversingHoeConfig.unbreakable) return false; + return super.isDamageable(); + } + + @Override + public boolean getIsRepairable(ItemStack stack, ItemStack repairMaterial) { + if (ReversingHoeConfig.unbreakable) return false; + return super.getIsRepairable(stack, repairMaterial); + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + if (ReversingHoeConfig.unbreakable) return false; + return super.showDurabilityBar(stack); + } + // +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/DisableableItemStack.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/DisableableItemStack.java new file mode 100644 index 00000000..b67d5e7f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/DisableableItemStack.java @@ -0,0 +1,111 @@ +package com.fouristhenumber.utilitiesinexcess.common.recipe; + +import java.util.ArrayList; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.FurnaceRecipes; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig; + +import cpw.mods.fml.common.registry.GameRegistry; + +public class DisableableItemStack { + + public static boolean addFurnaceRecipe(Object inputObject, Object outputObject, float exp) { + if (!isEnabled(inputObject) || !isEnabled(outputObject)) return false; + ItemStack input = getItem(inputObject); + ItemStack output = getItem(outputObject); + + FurnaceRecipes.smelting() + .func_151394_a(input, output, exp); + return true; + } + + public static boolean addShapedRecipe(Object outputObject, Object... params) { + if (!isEnabled(outputObject)) return false; + ItemStack output = getItem(outputObject); + for (Object o : params) if (!isEnabled(o)) return false; + GameRegistry.addShapedRecipe(output, parseParams(params)); + return true; + } + + public static boolean addShapelessRecipe(Object outputObject, Object... params) { + if (!isEnabled(outputObject)) return false; + ItemStack output = getItem(outputObject); + for (Object o : params) if (!isEnabled(o)) return false; + GameRegistry.addShapelessRecipe(output, parseParams(params)); + return true; + } + + public static boolean isEnabled(Object disableable) { + if (disableable instanceof ModItems mi) return mi.isEnabled() || ItemConfig.registerDisabledItems; + if (disableable instanceof ModBlocks mb) return mb.isEnabled(); + if (disableable instanceof DisableableItemStack dstack) return isEnabled(dstack.disableable); + return true; + } + + public static ItemStack getItem(Object disableable) { + if (disableable instanceof ModItems mi) return new ItemStack(mi.get()); + if (disableable instanceof ModBlocks mb) return new ItemStack(mb.getItem()); + if (disableable instanceof Item i) return new ItemStack(i); + if (disableable instanceof ItemStack stack) return stack; + if (disableable instanceof DisableableItemStack dstack) return dstack.theStack; + return null; + } + + public static Object[] parseParams(Object... params) { + ArrayList parsedParams = new ArrayList<>(); + for (Object o : params) { + ItemStack parsedItem = getItem(o); + if (parsedItem != null) parsedParams.add(parsedItem); + else parsedParams.add(o); + } + return parsedParams.toArray(); + } + + public final ItemStack theStack; + public final Object disableable; + + public DisableableItemStack(ItemStack theStack, Object disableable) { + this.theStack = theStack; + this.disableable = disableable; + } + + public DisableableItemStack(ModItems mi) { + this.theStack = new ItemStack(mi.get()); + this.disableable = mi; + } + + public DisableableItemStack(ModItems mi, int amount) { + this.theStack = new ItemStack(mi.get(), amount); + this.disableable = mi; + + } + + public DisableableItemStack(ModItems mi, int amount, int meta) { + this.theStack = new ItemStack(mi.get(), amount, meta); + this.disableable = mi; + + } + + public DisableableItemStack(ModBlocks mi) { + this.theStack = new ItemStack(mi.get()); + this.disableable = mi; + + } + + public DisableableItemStack(ModBlocks mi, int amount) { + this.theStack = new ItemStack(mi.get(), amount); + this.disableable = mi; + + } + + public DisableableItemStack(ModBlocks mi, int amount, int meta) { + this.theStack = new ItemStack(mi.get(), amount, meta); + this.disableable = mi; + + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeGlove.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeGlove.java new file mode 100644 index 00000000..af0493d5 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeGlove.java @@ -0,0 +1,35 @@ +package com.fouristhenumber.utilitiesinexcess.common.recipe; + +import net.minecraft.init.Blocks; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ShapedRecipes; + +public class RecipeGlove extends ShapedRecipes { + + public RecipeGlove(int p_i1917_1_, int p_i1917_2_, ItemStack[] p_i1917_3_, ItemStack p_i1917_4_) { + super(p_i1917_1_, p_i1917_2_, p_i1917_3_, p_i1917_4_); + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting crafting) { + boolean foundFirst = false; + int meta = 0; + for (int i = 0; i < crafting.getSizeInventory(); i++) { + ItemStack stack = crafting.getStackInSlot(i); + if (stack != null && stack.getItem() == Item.getItemFromBlock(Blocks.wool)) { + if (foundFirst) { + meta += stack.getItemDamage(); + break; + } else { + meta += stack.getItemDamage() * 16; + foundFirst = true; + } + } + } + ItemStack out = super.getCraftingResult(crafting); + out.setItemDamage(meta); + return out; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeInvertedIngot.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeInvertedIngot.java new file mode 100644 index 00000000..4784dde8 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeInvertedIngot.java @@ -0,0 +1,38 @@ +package com.fouristhenumber.utilitiesinexcess.common.recipe; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; + +public class RecipeInvertedIngot extends ShapedRecipes { + + public RecipeInvertedIngot(int width, int height, ItemStack[] input, ItemStack output) { + super(width, height, input, output); + } + + @Override + public boolean matches(InventoryCrafting inv, World world) { + // Reject if not a vanilla workbench + if (inv.eventHandler == null + || inv.eventHandler.getClass() != net.minecraft.inventory.ContainerWorkbench.class) { + return false; + } + + return super.matches(inv, world); + } + + @Override + public ItemStack getRecipeOutput() { + ItemStack output = super.getRecipeOutput().copy(); + if (InversionConfig.invertedIngotsImplode) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setInteger("ImplosionTimer", InversionConfig.invertedIngotImplosionTimer); + output.setTagCompound(nbt); + } + return output; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java new file mode 100644 index 00000000..c35fe793 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java @@ -0,0 +1,1313 @@ +package com.fouristhenumber.utilitiesinexcess.common.recipe; + +import static net.minecraft.item.Item.getItemFromBlock; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.fouristhenumber.utilitiesinexcess.api.QEDRegistry; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockCompressed; +import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.TransferUpgrade; + +import cpw.mods.fml.common.registry.GameRegistry; + +public class RecipeLoader { + + public static void run() { + if (Mods.Dreamcraft.isLoaded()) return; + loadCompressedBlockRecipes(); + loadInversionRecipes(); + loadBedrockiumRecipes(); + loadEtherealGlassRecipes(); + loadWateringCanRecipes(); + loadLapisAetheriusRecipes(); + loadSpikeRecipes(); + loadGeneratorRecipes(); + loadQEDRecipes(); + loadGlassRecipes(); + loadDecorativeBlocksRecipes(); + loadColoredBlockRecipes(); + loadTransferNodeRecipes(); + + // Pacifist's Bench + addShapedRecipe( + ModBlocks.PACIFISTS_BENCH, + "ewe", + "wpw", + "ewe", + 'e', + Items.emerald, + 'p', + Items.ender_pearl, + 'w', + new ItemStack(Blocks.planks, 1, OreDictionary.WILDCARD_VALUE)); + + // Smart Pump + // TODO: Replace obsidian with "ender-infused obsidian" equivalent + addShapedRecipe( + ModBlocks.SMART_PUMP, + "odo", + "lew", + "opo", + 'o', + Blocks.obsidian, + 'd', + Items.diamond, + 'l', + Items.lava_bucket, + 'e', + Items.ender_eye, + 'w', + Items.water_bucket, + 'p', + Items.iron_pickaxe); + + addShapedRecipe( + ModBlocks.SMART_PUMP, + "odo", + "wel", + "opo", + 'o', + Blocks.obsidian, + 'd', + Items.diamond, + 'l', + Items.lava_bucket, + 'e', + Items.ender_eye, + 'w', + Items.water_bucket, + 'p', + Items.iron_pickaxe); + + // Block Analyzer + addShapedRecipe( + ModItems.BLOCK_ANALYZER, + "iii", + "eri", + "iii", + 'i', + Items.iron_ingot, + 'r', + Items.redstone, + 'e', + Items.ender_eye); + + // X-Ray Glasses + addShapedRecipe( + ModItems.XRAY_GLASSES, + "iii", + "eie", + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE), + 'e', + Items.ender_eye); + + // Floating Block + addShapedRecipe( + ModBlocks.FLOATING_BLOCK, + " g ", + "fof", + 'g', + Items.gold_ingot, + 'f', + Items.feather, + 'o', + Blocks.obsidian); + + // Heavenly Ring + addShapedRecipe( + ModItems.HEAVENLY_RING, + "#g#", + "g*g", + "igi", + '#', + Blocks.glass, + 'g', + Items.gold_ingot, + '*', + Items.nether_star, + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE)); + + // Redstone Clock + addShapedRecipe( + ModBlocks.REDSTONE_CLOCK, + "rsr", + "sts", + "rsr", + 'r', + Items.redstone, + 's', + Blocks.stone, + 't', + Blocks.redstone_torch); + + // Block Update Detector + addShapedRecipe( + ModBlocks.BLOCK_UPDATE_DETECTOR, + "srs", + "sps", + "sts", + 'r', + Items.redstone, + 's', + Blocks.stone, + 't', + Blocks.redstone_torch, + 'p', + Blocks.sticky_piston); + + // Trash Can (Items) + addShapedRecipe( + ModBlocks.TRASH_CAN_ITEM, + "sss", + "c#c", + "ccc", + 's', + Blocks.stone, + 'c', + Blocks.cobblestone, + '#', + Blocks.chest); + + // Trash Can (Fluids) + addShapelessRecipe(ModBlocks.TRASH_CAN_FLUID, ModBlocks.TRASH_CAN_ITEM, Items.bucket); + + // Trash Can (Energy) + addShapelessRecipe( + ModBlocks.TRASH_CAN_ENERGY, + ModBlocks.TRASH_CAN_ITEM, + Items.redstone, + Items.redstone, + Items.gold_ingot, + Items.gold_ingot); + + // Drum + addShapedRecipe( + ModBlocks.DRUM, + "ipi", + "ici", + "ipi", + 'i', + Items.iron_ingot, + 'p', + Blocks.heavy_weighted_pressure_plate, + 'c', + Items.cauldron); + + // Sound Muffler + addShapedRecipe( + ModBlocks.SOUND_MUFFLER, + "www", + "wjw", + "www", + 'w', + new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE), + 'j', + Blocks.noteblock); + + // Rain Muffler + addShapedRecipe( + ModBlocks.RAIN_MUFFLER, + "www", + "wbw", + "www", + 'w', + new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE), + 'b', + Items.water_bucket); + + // Fire Battery + addShapedRecipe( + ModItems.FIRE_BATTERY, + "ppp", + "p p", + "prp", + 'p', + Blocks.heavy_weighted_pressure_plate, + 'r', + Items.redstone); + + // Underworld Portal + addShapedRecipe( + ModBlocks.UNDERWORLD_PORTAL, + "qiq", + "iui", + "qiq", + 'q', + ModBlocks.COMPRESSED_COBBLESTONE.newItemStack(1, 3), + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE), + 'u', + ModBlocks.COMPRESSED_COBBLESTONE.newItemStack(1, 4)); + + // Blackout Curtains + addShapedRecipe( + ModBlocks.BLACKOUT_CURTAINS.newItemStack(12), + "ww", + "ww", + "ww", + 'w', + new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE)); + + // Conveyor + addShapedRecipe( + ModBlocks.CONVEYOR.newItemStack(8), + "rrr", + "isi", + "rrr", + 'r', + Blocks.rail, + 'i', + Items.iron_ingot, + 's', + Items.redstone); + + // Magic Wood + addShapedRecipe( + ModBlocks.MAGIC_WOOD, + "gbg", + "bsb", + "gbg", + 'g', + Items.gold_ingot, + 'b', + Items.enchanted_book, + 's', + Blocks.bookshelf); + + // Pure Love + addShapedRecipe( + ModBlocks.PURE_LOVE, + "rcr", + "rir", + "wrs", + 'r', + new ItemStack(Blocks.wool, 1, 14), + 'c', + Items.carrot, + 'w', + Items.wheat, + 's', + Items.wheat_seeds, + 'i', + ModBlocks.INVERTED_BLOCK); + + // Marginally Maximized Chest + addShapedRecipe(ModBlocks.MARGINALLY_MAXIMISED_CHEST, "sss", "scs", "sss", 's', Items.stick, 'c', Blocks.chest); + + // Significantly Shrunk Chest + addShapelessRecipe(new DisableableItemStack(ModBlocks.SIGNIFICANTLY_SHRUNK_CHEST, 9), Blocks.chest); + addShapelessRecipe( + new DisableableItemStack(ModBlocks.SIGNIFICANTLY_SHRUNK_CHEST, 9), + ModBlocks.MARGINALLY_MAXIMISED_CHEST); + + // Radically Reduced Chest + addShapelessRecipe( + new DisableableItemStack(ModBlocks.RADICALLY_REDUCED_CHEST, 9), + ModBlocks.SIGNIFICANTLY_SHRUNK_CHEST); + + // Mob Jar + addShapedRecipe( + ModItems.MOB_JAR, + "geg", + "gbg", + "ggg", + 'g', + Items.gold_nugget, + 'e', + Items.ender_eye, + 'b', + Items.glass_bottle); + + // Golden Bag of Holding + addShapedRecipe( + ModItems.GOLDEN_BAG, + "wdw", + "gcg", + "wbw", + 'g', + Items.gold_ingot, + 'c', + Blocks.chest, + 'w', + new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE), + 'd', + Items.diamond, + 'b', + Blocks.gold_block); + + // Temporal Gate + addShapedRecipe( + ModBlocks.END_OF_TIME_PORTAL, + "qgq", + "geg", + "qcq", + 'q', + Blocks.quartz_block, // TODO use burnt quartz replacement instead? + 'e', + Items.ender_pearl, + 'c', + Items.clock, + 'g', + Blocks.glass_pane); + + // Trading Post + addShapedRecipe( + ModBlocks.TRADING_POST, + "pep", + "pjp", + "ppp", + 'p', + Blocks.planks, + 'e', + Blocks.emerald_block, + 'j', + Blocks.jukebox); + } + + private static void loadGeneratorRecipes() { + // Low-Temp Furnace Generator + addShapedRecipe( + ModBlocks.LOW_TEMPERATURE_FURNACE_GENERATOR, + "ccc", + "ipi", + "rfr", + 'c', + Blocks.cobblestone, + 'i', + Items.iron_ingot, + 'p', + Blocks.piston, + 'r', + Items.redstone, + 'f', + Blocks.furnace); + + // Furnace Generator + addShapedRecipe( + ModBlocks.FURNACE_GENERATOR, + "iii", + "ipi", + "rfr", + 'i', + Items.iron_ingot, + 'p', + Blocks.iron_block, + 'r', + Items.redstone, + 'f', + Blocks.furnace); + + // High-Temp Furnace Generator + addShapedRecipe( + ModBlocks.HIGH_TEMPERATURE_FURNACE_GENERATOR, + "iii", + "ipi", + "rfr", + 'i', + Items.iron_ingot, + 'p', + ModBlocks.FURNACE_GENERATOR, + 'r', + Items.redstone, + 'f', + Blocks.furnace); + + // Lava Generator + addShapedRecipe( + ModBlocks.LAVA_GENERATOR, + "iii", + "ipi", + "rfr", + 'i', + Items.gold_ingot, + 'p', + Blocks.iron_block, + 'r', + Items.redstone, + 'f', + Blocks.furnace); + + // Ender Generator + addShapedRecipe( + ModBlocks.ENDER_GENERATOR, + "iii", + "epe", + "rfr", + 'i', + Items.ender_pearl, + 'e', + Items.ender_eye, + 'p', + Blocks.iron_block, + 'r', + Items.redstone, + 'f', + Blocks.furnace); + + // Redstone Generator + addShapedRecipe( + ModBlocks.REDSTONE_GENERATOR, + "iii", + "ipi", + "rfr", + 'i', + Blocks.redstone_block, + 'p', + ModBlocks.LAVA_GENERATOR, + 'r', + Items.redstone, + 'f', + Blocks.furnace); + + // Food Generator + addShapedRecipe( + ModBlocks.FOOD_GENERATOR, + "iii", + "ipi", + "rfr", + 'i', + Items.iron_ingot, + 'p', + ModBlocks.LOW_TEMPERATURE_FURNACE_GENERATOR, + 'r', + Items.redstone, + 'f', + Blocks.furnace); + + // Potion Generator + addShapedRecipe( + ModBlocks.POTION_GENERATOR, + "iii", + "ipi", + "rfr", + 'i', + Blocks.obsidian, + 'p', + Blocks.enchanting_table, + 'r', + Items.redstone, + 'f', + Blocks.furnace); + + // Solar Generator + addShapedRecipe( + ModBlocks.SOLAR_GENERATOR, + "iqi", + "qpq", + "rfr", + 'i', + new ItemStack(Items.dye, 1, 4), + 'q', + Items.quartz, + 'p', + Blocks.diamond_block, + 'r', + Items.redstone, + 'f', + Blocks.furnace); + + // TNT Generator + addShapedRecipe( + ModBlocks.TNT_GENERATOR, + "iii", + "ipi", + "rfr", + 'i', + Blocks.tnt, + 'p', + Blocks.iron_block, + 'r', + Items.redstone, + 'f', + Blocks.furnace); + + // Pink Generator + addShapedRecipe( + ModBlocks.PINK_GENERATOR, + "iii", + "ipi", + "rfr", + 'i', + new ItemStack(Blocks.wool, 1, 6), + 'p', + ModBlocks.LOW_TEMPERATURE_FURNACE_GENERATOR, + 'r', + Items.redstone, + 'f', + Blocks.furnace); + + // Nether Star Generator + addShapedRecipe( + ModBlocks.NETHER_STAR_GENERATOR, + "sis", + "sps", + "rfr", + 'i', + Items.nether_star, + 's', + new ItemStack(Items.skull, 1, 1), + 'p', + ModBlocks.INVERTED_BLOCK, + 'r', + Items.redstone, + 'f', + Blocks.furnace); + } + + private static void loadSpikeRecipes() { + addShapedRecipe( + ModBlocks.SPIKE_WOOD, + " a ", + "aba", + "bcb", + 'a', + Items.wooden_sword, + 'b', + Blocks.planks, + 'c', + Blocks.log); + + addShapedRecipe( + ModBlocks.SPIKE_IRON, + " a ", + "aba", + "bcb", + 'a', + Items.iron_sword, + 'b', + Items.iron_ingot, + 'c', + Blocks.iron_block); + + addShapedRecipe( + ModBlocks.SPIKE_GOLD, + " a ", + "aba", + "bcb", + 'a', + Items.golden_sword, + 'b', + ModBlocks.MAGIC_WOOD, + 'c', + Blocks.gold_block); + + addShapedRecipe( + ModBlocks.SPIKE_DIAMOND, + " a ", + "aba", + "bcb", + 'a', + Items.diamond_sword, + 'b', + ModBlocks.SPIKE_GOLD, + 'c', + Blocks.diamond_block); + } + + private static void loadLapisAetheriusRecipes() { + for (int i = 0; i < 16; i++) { + addShapedRecipe( + new DisableableItemStack(ModBlocks.LAPIS_AETHERIUS, 4, i), + "sds", + "did", + "sds", + 's', + Blocks.stonebrick, + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE), + 'd', + new ItemStack(Items.dye, 1, 15 - i)); + } + } + + private static void loadWateringCanRecipes() { + // Basic Watering Can + addShapedRecipe( + ModItems.WATERING_CAN_BASIC, + "im ", + "ibi", + " i ", + 'i', + Items.iron_ingot, + 'b', + Items.bowl, + 'm', + new ItemStack(Items.dye, 1, 15)); + + // Advanced Watering Can + addShapedRecipe( + ModItems.WATERING_CAN_ADVANCED, + "im ", + "ibi", + " i ", + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE), + 'b', + Items.bowl, + 'm', + new ItemStack(Items.dye, 1, 15)); + + // Elite Watering Can + addShapedRecipe( + ModItems.WATERING_CAN_ELITE, + "im ", + "ibi", + " i ", + 'i', + ModItems.BEDROCKIUM_INGOT, + 'b', + Items.bowl, + 'm', + new ItemStack(Items.dye, 1, 15)); + } + + private static void loadDecorativeBlocksRecipes() { + // Ender-Infused Obsidian + addShapedRecipe( + new DisableableItemStack(ModBlocks.DECORATIVE_BLOCKS, 1, 5), + " o ", + "oeo", + " o ", + 'o', + Blocks.obsidian, + 'e', + Items.ender_pearl); + // Burnt Quartz + addFurnaceRecipe(getItemFromBlock(Blocks.quartz_block), ModBlocks.DECORATIVE_BLOCKS.newItemStack(1, 2), 0.7F); + // Diamond-Etched Computational Matrix + addShapedRecipe( + new DisableableItemStack(ModBlocks.DECORATIVE_BLOCKS, 1, 0), + "bdb", + "ded", + "bdb", + 'b', + ModBlocks.DECORATIVE_BLOCKS.newItemStack(1, 2), + 'd', + Items.diamond, + 'e', + ModBlocks.DECORATIVE_BLOCKS.newItemStack(1, 5)); + // Sand-Infused Endstone + addShapedRecipe( + new DisableableItemStack(ModBlocks.DECORATIVE_BLOCKS, 4, 1), + "es", + "se", + 'e', + Blocks.end_stone, + 's', + Blocks.sandstone); + // Sandy Glass + addShapedRecipe( + new DisableableItemStack(ModBlocks.DECORATIVE_BLOCKS, 4, 3), + "sg", + "gs", + 's', + Blocks.sand, + 'g', + Blocks.glass); + // Frosted Stone + addShapedRecipe( + new DisableableItemStack(ModBlocks.DECORATIVE_BLOCKS, 5, 4), + " i ", + "isi", + " i ", + 'i', + Blocks.ice, + 's', + Blocks.stone); + // Gravel Bricks + addShapedRecipe(new DisableableItemStack(ModBlocks.DECORATIVE_BLOCKS, 1, 6), "gg", "gg", 'g', Blocks.gravel); + // Edged Stone Bricks + addShapedRecipe( + new DisableableItemStack(ModBlocks.DECORATIVE_BLOCKS, 9, 7), + "sbs", + "bbb", + "sbs", + 's', + Blocks.stone, + 'b', + new ItemStack(Blocks.stonebrick)); + // Border Stone + addShapedRecipe( + new DisableableItemStack(ModBlocks.DECORATIVE_BLOCKS, 4, 8), + "bb", + "bb", + 'b', + ModBlocks.DECORATIVE_BLOCKS.newItemStack(1, 7)); + // Border Stone (Alternate) + addShapedRecipe( + new DisableableItemStack(ModBlocks.DECORATIVE_BLOCKS, 4, 9), + "bb", + "bb", + 'b', + ModBlocks.DECORATIVE_BLOCKS.newItemStack(1, 8)); + // Gravel Road + addShapedRecipe( + new DisableableItemStack(ModBlocks.DECORATIVE_BLOCKS, 8, 10), + "sgs", + "ggg", + "sgs", + 's', + new ItemStack(Blocks.stone_slab, 1, 5), + 'g', + ModBlocks.DECORATIVE_BLOCKS.newItemStack(1, 6)); + // Carved 'Eminence' Stone + addShapedRecipe( + new DisableableItemStack(ModBlocks.DECORATIVE_BLOCKS, 4, 11), + "mpe", + "ss ", + "ss ", + 'm', + new ItemStack(Items.dye, 1, 13), + 'p', + new ItemStack(Items.dye, 1, 5), + 'e', + Items.ender_pearl, + 's', + Blocks.stone); + } + + private static void loadEtherealGlassRecipes() { + // Ethereal Glass + addShapedRecipe( + new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 0), + "ggg", + "gig", + "ggg", + 'g', + Blocks.glass, + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE)); + + // Dark Ethereal Glass + addShapedRecipe( + new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 2), + "ggg", + "gig", + "ggg", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 10), + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE)); + + // Ethereal Glass (Inverted) + addShapelessRecipe( + new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 3), + new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 0), + Blocks.redstone_torch); + + // Dark Ethereal Glass (Inverted) + addShapelessRecipe( + new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 5), + new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 2), + Blocks.redstone_torch); + } + + private static void loadBedrockiumRecipes() { + // Bedrockium Ingot + addShapedRecipe( + ModItems.BEDROCKIUM_INGOT, + "tqt", + "qdq", + "tqt", + 't', + new DisableableItemStack(ModBlocks.COMPRESSED_COBBLESTONE, 1, 2), + 'q', + new DisableableItemStack(ModBlocks.COMPRESSED_COBBLESTONE, 1, 3), + 'd', + Blocks.diamond_block); + // Bedrockium Ingot -> Block + addShapedRecipe(ModBlocks.BEDROCKIUM_BLOCK, "iii", "iii", "iii", 'i', ModItems.BEDROCKIUM_INGOT); + // Bedrockium Block -> Ingot + addShapedRecipe(new DisableableItemStack(ModItems.BEDROCKIUM_INGOT, 9), "b", 'b', ModBlocks.BEDROCKIUM_BLOCK); + // Direct Block Recipe + addFurnaceRecipe( + new DisableableItemStack(ModBlocks.COMPRESSED_COBBLESTONE, 1, 7), + ModBlocks.BEDROCKIUM_BLOCK, + 1F); + } + + private static void loadGlassRecipes() { + // TODO: Smooth Glass reliant on "sandy glass" + + // Rimmed Glass + addShapedRecipe( + ModBlocks.DECORATIVE_GLASS.newItemStack(8, 1), + "ggg", + "g g", + "ggg", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0)); + + // Bricked Glass + addShapedRecipe( + ModBlocks.DECORATIVE_GLASS.newItemStack(4, 2), + "gg", + "gg", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0)); + + // Creepy Glass + addShapelessRecipe( + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 3), + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0), + Items.gunpowder); + + // Gilded Glass + addShapedRecipe( + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 4), + "nnn", + "ngn", + "nnn", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0), + 'n', + Items.gold_nugget); + + // Obsidian Glass + addShapedRecipe( + ModBlocks.DECORATIVE_GLASS.newItemStack(4, 5), + "gog", + "o o", + "gog", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0), + 'o', + Blocks.obsidian); + + // Latticed Glass + addShapedRecipe( + ModBlocks.DECORATIVE_GLASS.newItemStack(5, 6), + " g ", + "ggg", + " g ", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0)); + + // Glowing Glass + addShapedRecipe( + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 7), + " d ", + "dgd", + " d ", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0), + 'd', + Items.glowstone_dust); + + // Beloved Glass + addShapedRecipe( + ModBlocks.DECORATIVE_GLASS.newItemStack(6, 8), + "gpg", + "ggg", + " g ", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0), + 'p', + new ItemStack(Items.dye, 1, 9)); + + // Tiled Glass + addShapelessRecipe( + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 9), + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0)); + + // Dark Glass + addShapedRecipe( + ModBlocks.DECORATIVE_GLASS.newItemStack(5, 10), + "gcg", + "cgc", + "gcg", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0), + 'c', + ModBlocks.BLACKOUT_CURTAINS); + + // Reinforced Glass + addShapedRecipe( + ModBlocks.DECORATIVE_GLASS.newItemStack(4, 11), + "gog", + "o o", + "gog", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 10), + 'o', + Blocks.obsidian); + } + + private static void loadColoredBlockRecipes() { + if (!BlockConfig.enableColoredBlocks) return; + + ItemStack[] dyes = new ItemStack[16]; + for (int i = 0; i < 16; ++i) { + dyes[i] = new ItemStack(Items.dye, 1, i); + } + loadColoredBlockRecipe(ModBlocks.COLORED_WOOD_PLANKS, dyes); + loadColoredBlockRecipe(ModBlocks.COLORED_GLOWSTONE, dyes); + loadColoredBlockRecipe(ModBlocks.COLORED_STONE, dyes); + loadColoredBlockRecipe(ModBlocks.COLORED_COBBLESTONE, dyes); + loadColoredBlockRecipe(ModBlocks.COLORED_QUARTZ_BLOCK, dyes); + loadColoredBlockRecipe(ModBlocks.COLORED_SOUL_SAND, dyes); + loadColoredBlockRecipe(ModBlocks.COLORED_REDSTONE_LAMP, dyes); + loadColoredBlockRecipe(ModBlocks.COLORED_BRICKS, dyes); + loadColoredBlockRecipe(ModBlocks.COLORED_STONE_BRICKS, dyes); + loadColoredBlockRecipe(ModBlocks.COLORED_LAPIS_BLOCK, dyes); + loadColoredBlockRecipe(ModBlocks.COLORED_OBSIDIAN, dyes); + loadColoredBlockRecipe(ModBlocks.COLORED_REDSTONE_BLOCK, dyes); + loadColoredBlockRecipe(ModBlocks.COLORED_COAL_BLOCK, dyes); + } + + private static void loadColoredBlockRecipe(ModBlocks block, ItemStack[] dyes) { + ItemStack water = new ItemStack(Items.water_bucket); + for (int i = 0; i < 16; ++i) { + addShapedRecipe( + block.newItemStack(8, i), + "bbb", + "bdb", + "bbb", + 'b', + ((BlockColored) block.get()).getBase(), + 'd', + dyes[15 - i]); + + addShapedRecipe( + new ItemStack(((BlockColored) block.get()).getBase(), 8), + "bbb", + "bdb", + "bbb", + 'b', + block.newItemStack(1, i), + 'd', + water); + } + } + + private static void loadInversionRecipes() { + // Inverted Ingot (unstable) + // Has to use a special recipe adder to check for vanilla crafting table + if (ModItems.INVERSION_SIGIL_ACTIVE.isEnabled() && ModItems.INVERTED_INGOT.isEnabled()) { + GameRegistry.addRecipe( + new RecipeInvertedIngot( + 1, + 3, + new ItemStack[] { new ItemStack(Items.iron_ingot), ModItems.INVERSION_SIGIL_ACTIVE.newItemStack(), + new ItemStack(Items.diamond), }, + ModItems.INVERTED_INGOT.newItemStack())); + } + + addShapedRecipe( + ModItems.INVERTED_INGOT.newItemStack(1, 1), + "i", + "s", + "d", + 'i', + Items.iron_ingot, + 's', + ModItems.PSEUDO_INVERSION_SIGIL, + 'd', + Items.diamond); + + // Inverted Nugget + addShapedRecipe( + ModItems.INVERTED_NUGGET, + "g", + "s", + "d", + 'g', + Items.gold_nugget, + 's', + ModItems.INVERSION_SIGIL_ACTIVE, + 'd', + Items.diamond); + + // Inverted Ingot (stable) + addShapedRecipe(ModItems.INVERTED_INGOT.newItemStack(1, 1), "nnn", "nnn", "nnn", 'n', ModItems.INVERTED_NUGGET); + + // Glutton's Axe + addShapedRecipe( + ModItems.GLUTTONS_AXE, + "ii", + "is", + " s", + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE), + 's', + Blocks.obsidian); + + // Destruction Pickaxe + addShapedRecipe( + ModItems.DESTRUCTION_PICKAXE, + "iii", + " s ", + " s ", + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE), + 's', + Blocks.obsidian); + + // Reversing Hoe + addShapedRecipe( + ModItems.REVERSING_HOE, + "ii", + " s", + " s", + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE), + 's', + Blocks.obsidian); + + // Anti-Particulate Shovel + addShapedRecipe( + ModItems.ANTI_PARTICULATE_SHOVEL, + "i", + "s", + "s", + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE), + 's', + Blocks.obsidian); + + // Etheric Sword + addShapedRecipe( + ModItems.ETHERIC_SWORD, + "i", + "i", + "s", + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE), + 's', + Blocks.obsidian); + + // Precision Shears + addShapedRecipe( + ModItems.PRECISION_SHEARS, + "fi", + "if", + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE), + 'f', + ModBlocks.FLOATING_BLOCK); + + // Architect's Wand + addShapedRecipe( + ModItems.ARCHITECTS_WAND, + " i", + "s ", + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE), + 's', + Blocks.obsidian); + + // Super Architect's Wand + addShapedRecipe( + ModItems.SUPER_ARCHITECTS_WAND, + " i", + "s ", + 'i', + ModItems.BEDROCKIUM_INGOT, + 's', + ModItems.ARCHITECTS_WAND); + + // Inverted Ingot -> Block + addShapedRecipe( + ModBlocks.INVERTED_BLOCK, + "iii", + "iii", + "iii", + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE)); + + // Glove + if (ModItems.GLOVE.isEnabled()) { + GameRegistry.addRecipe( + new RecipeGlove( + 2, + 2, + new ItemStack[] { new ItemStack(Items.string), + new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE), + new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(Items.string) }, + ModItems.GLOVE.newItemStack())); + } + } + + private static void loadQEDRecipes() { + // todo test recipe, remove later + QEDRegistry.instance() + .addRecipe( + new ItemStack(Items.gold_ingot), + new String[] { "NNN", "NGN", "NNN" }, + 'N', + new ItemStack(Items.gold_nugget), + 'G', + "blockGlass"); + } + + private static void loadTransferNodeRecipes() { + loadTransferUpgradeRecipes(); + loadTransferPipeRecipes(); + } + + private static void loadTransferUpgradeRecipes() { + // Speed Upgrade + addShapedRecipe( + TransferUpgrade.SPEED.getStack(4), + "RNR", + "NIN", + "RIR", + 'R', + new ItemStack(Blocks.redstone_block), + 'N', + new ItemStack(Items.gold_nugget), + 'I', + new ItemStack(Items.gold_ingot)); + + // Filter + addShapedRecipe( + TransferUpgrade.FILTER.getStack(), + "RWR", + "WSW", + "RWR", + 'R', + new ItemStack(Items.redstone), + 'W', + new ItemStack(Items.stick), + 'S', + new ItemStack(Items.string)); + // todo filter setting stuff? + + // World Interaction Upgrade + addShapedRecipe( + TransferUpgrade.WORLD_INTERACTION.getStack(), + "LIL", + "IPI", + "LIL", + 'L', + new ItemStack(Items.dye, 1, 4), // Lapis + 'I', + new ItemStack(Items.iron_ingot), + 'P', + new ItemStack(Items.iron_pickaxe)); + + // Stack Upgrade + addShapedRecipe( + TransferUpgrade.STACK.getStack(), + "INI", + "DUD", + "IDI", + 'I', + new ItemStack(Items.gold_ingot), + 'N', + new ItemStack(Items.gold_nugget), + 'D', + new ItemStack(Items.diamond), + 'U', + TransferUpgrade.SPEED.getStack()); + + // Creative Upgrade has no recipe + + // TODO Ender Transmitter/Receiver default recipes are in QED + + // Depth-First Search Upgrade + addShapedRecipe( + TransferUpgrade.SEARCH_DEPTH.getStack(3), + "UBB", + "UGU", + "GBB", + 'U', + TransferUpgrade.SPEED.getStack(), + 'B', + new ItemStack(Blocks.redstone_block), + 'G', + new ItemStack(Items.gold_ingot)); + + // Breadth-First Search Upgrade + addShapedRecipe( + TransferUpgrade.SEARCH_BREADTH.getStack(3), + "BBB", + "SUS", + "BBB", + 'B', + new ItemStack(Blocks.redstone_block), + 'S', + TransferUpgrade.SPEED.getStack(), + 'U', + TransferUpgrade.SEARCH_DEPTH.getStack()); + + // Round Robin Search Upgrade + addShapedRecipe( + TransferUpgrade.SEARCH_ROUND_ROBIN.getStack(3), + "BNB", + "BIN", + "BNB", + 'B', + new ItemStack(Blocks.redstone_block), + 'N', + new ItemStack(Items.gold_nugget), + 'I', + new ItemStack(Items.gold_ingot)); + + // Advanced Filter + addShapedRecipe( + TransferUpgrade.ADV_FILTER.getStack(), + "L L", + " F ", + "L L", + 'L', + new ItemStack(Items.dye, 1, 4), // Lapis + 'F', + TransferUpgrade.FILTER.getStack()); + } + + private static void loadTransferPipeRecipes() { + + } + + private static boolean addShapedRecipe(Object outputObject, Object... params) { + return DisableableItemStack.addShapedRecipe(outputObject, params); + } + + private static boolean addShapelessRecipe(Object outputObject, Object... params) { + return DisableableItemStack.addShapelessRecipe(outputObject, params); + } + + private static boolean addFurnaceRecipe(Object inputObject, Object outputObject, float exp) { + return DisableableItemStack.addFurnaceRecipe(inputObject, outputObject, exp); + } + + private static void loadCompressedBlockRecipes() { + ModBlocks[] blocks = { ModBlocks.COMPRESSED_COBBLESTONE, ModBlocks.COMPRESSED_DIRT, ModBlocks.COMPRESSED_GRAVEL, + ModBlocks.COMPRESSED_SAND, }; + + for (ModBlocks modBlock : blocks) { + if (!(modBlock.get() instanceof BlockCompressed block) || !modBlock.isEnabled()) continue; + addShapedRecipe( + new DisableableItemStack(modBlock), + "###", + "###", + "###", + '#', + new ItemStack(block.getBase(), 9)); + addShapelessRecipe(new DisableableItemStack(modBlock, 9), new DisableableItemStack(modBlock, 1)); + for (int i = 0; i < 7; i++) { + addShapedRecipe( + new DisableableItemStack(modBlock, 1, i + 1), + "###", + "###", + "###", + '#', + new DisableableItemStack(modBlock, 1, i)); + addShapelessRecipe( + new DisableableItemStack(modBlock, 9, i), + new DisableableItemStack(modBlock, 1, i + 1)); + } + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/BlackoutCurtainsRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/BlackoutCurtainsRenderer.java new file mode 100644 index 00000000..b0d6e3ec --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/BlackoutCurtainsRenderer.java @@ -0,0 +1,249 @@ +package com.fouristhenumber.utilitiesinexcess.common.renderers; + +import static net.minecraftforge.common.util.ForgeDirection.*; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +import org.joml.Vector2d; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockBlackoutCurtains; +import com.gtnewhorizons.angelica.api.ThreadSafeISBRH; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; + +@ThreadSafeISBRH(perThread = false) +public class BlackoutCurtainsRenderer implements ISimpleBlockRenderingHandler { + + private void chain4(Tessellator tess, IIcon tex, double y, Vector2d c0, Vector2d c1, Vector2d c2, Vector2d c3) { + makeVerticalQuad(tess, tex, y, c0, c1); + makeVerticalQuad(tess, tex, y, c1, c2); + makeVerticalQuad(tess, tex, y, c2, c3); + // makeVerticalQuad(tess, tex, y, c3, c0); save on vertices that should never be visible anyway + } + + private void makeVerticalQuad(Tessellator tess, IIcon tex, double y1, Vector2d c1, Vector2d c2) { + double x1 = c1.x; + double z1 = c1.y; + double x2 = c2.x; + double z2 = c2.y; + double y2 = y1 + 1; + + double d1, d2; + if (x1 != x2) { + d1 = x1; + d2 = x2; + } else { + d1 = z1; + d2 = z2; + } + + double b1, b2; + if (d1 > d2) { + b1 = Math.ceil(d1) - d1; + b2 = 1 - d2 + Math.floor(d2); + } else { + b1 = d1 - Math.floor(d1); + b2 = 1 + d2 - Math.ceil(d2); + } + + double u1 = tex.getInterpolatedU(16d * b1); + double u2 = tex.getInterpolatedU(16d * b2); + + tess.addVertexWithUV(x1, y2, z1, u1, tex.getMinV()); + tess.addVertexWithUV(x1, y1, z1, u1, tex.getMaxV()); + tess.addVertexWithUV(x2, y1, z2, u2, tex.getMaxV()); + tess.addVertexWithUV(x2, y2, z2, u2, tex.getMinV()); + } + + private void drawFloorCeil(Tessellator tess, IIcon tex, double y, Vector2d c1, Vector2d c2, boolean floor, + boolean ceil) { + if (floor) { + makeHorizontalQuad(tess, tex, y, c1.x, c2.x, c1.y, c2.y); + } + if (ceil) { + makeHorizontalQuad(tess, tex, y + 1, c1.x, c2.x, c2.y, c1.y); // winding order swap + } + } + + private void makeHorizontalQuad(Tessellator tess, IIcon tex, double y, double x1, double x2, double z1, double z2) { + double u1 = tex.getInterpolatedU(16d * (x1 - Math.floor(x1))); + double u2 = tex.getInterpolatedU(16d * (1 + x2 - Math.ceil(x2))); + double v1 = tex.getInterpolatedV(16d * (z1 - Math.floor(z1))); + double v2 = tex.getInterpolatedV(16d * (1 + z2 - Math.ceil(z2))); + + tess.addVertexWithUV(x1, y, z1, u1, v1); + tess.addVertexWithUV(x1, y, z2, u1, v2); + tess.addVertexWithUV(x2, y, z2, u2, v2); + tess.addVertexWithUV(x2, y, z1, u2, v1); + } + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {} + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + Tessellator tess = Tessellator.instance; + BlockBlackoutCurtains b = (BlockBlackoutCurtains) block; + IIcon tex = b.getIcon(0, 0); + + tess.setBrightness((int) (1.25f * block.getMixedBrightnessForBlock(world, x, y, z))); + tess.setColorOpaque_F(1, 1, 1); + + boolean connNorth = b.canConnectTo(world, x, y, z - 1, NORTH); + boolean connSouth = b.canConnectTo(world, x, y, z + 1, SOUTH); + boolean connWest = b.canConnectTo(world, x - 1, y, z, WEST); + boolean connEast = b.canConnectTo(world, x + 1, y, z, EAST); + boolean connDown = b.shouldSideBeRendered(world, x, y - 1, z, DOWN.ordinal()); + boolean connUp = b.shouldSideBeRendered(world, x, y + 1, z, UP.ordinal()); + + double halfThickness = 1 / 16d; + + // spotless:off + + /* + * north (-z) + * 0###1 + * # # + * A###B 2###3 + * west (-x) # # east (+x) + * 9###8 5###4 + * # # + * 7###6 + * south (+z) + */ + + Vector2d floorCenter = new Vector2d(x + 0.5, z + 0.5); + Vector2d z1 = new Vector2d(0, -halfThickness); + Vector2d z2 = new Vector2d(0, -0.5); + Vector2d x1 = new Vector2d(-halfThickness, 0); + Vector2d x2 = new Vector2d(-0.5, 0); + + Vector2d c0 = new Vector2d(floorCenter).add(z2).add(x1); + Vector2d c1 = new Vector2d(floorCenter).add(z2).sub(x1); + Vector2d c2 = new Vector2d(floorCenter).add(z1).sub(x1); + Vector2d c3 = new Vector2d(floorCenter).add(z1).sub(x2); + Vector2d c4 = new Vector2d(floorCenter).sub(z1).sub(x2); + Vector2d c5 = new Vector2d(floorCenter).sub(z1).sub(x1); + Vector2d c6 = new Vector2d(floorCenter).sub(z2).sub(x1); + Vector2d c7 = new Vector2d(floorCenter).sub(z2).add(x1); + Vector2d c8 = new Vector2d(floorCenter).sub(z1).add(x1); + Vector2d c9 = new Vector2d(floorCenter).sub(z1).add(x2); + Vector2d cA = new Vector2d(floorCenter).add(z1).add(x2); + Vector2d cB = new Vector2d(floorCenter).add(z1).add(x1); + + // spotless:on + + int totalConnections = (connNorth ? 1 : 0) + (connSouth ? 1 : 0) + (connWest ? 1 : 0) + (connEast ? 1 : 0); + + switch (totalConnections) { + case 0: + makeVerticalQuad(tess, tex, y, c7, c6); + makeVerticalQuad(tess, tex, y, c1, c0); + makeVerticalQuad(tess, tex, y, c4, c3); + makeVerticalQuad(tess, tex, y, cA, c9); + drawFloorCeil(tess, tex, y, c7, c1, connDown, connUp); + drawFloorCeil(tess, tex, y, c9, cB, connDown, connUp); + drawFloorCeil(tess, tex, y, c5, c3, connDown, connUp); + case 4: + makeVerticalQuad(tess, tex, y, c0, c7); + makeVerticalQuad(tess, tex, y, c6, c1); + makeVerticalQuad(tess, tex, y, c9, c4); + makeVerticalQuad(tess, tex, y, c3, cA); + break; + case 1: + if (connNorth) { + chain4(tess, tex, y, c0, c8, c5, c1); + } else if (connWest) { + chain4(tess, tex, y, c9, c5, c2, cA); + } else if (connSouth) { + chain4(tess, tex, y, c6, c2, cB, c7); + } else { + chain4(tess, tex, y, c3, cB, c8, c4); + } + break; + case 2: + if (connNorth && connSouth) { + makeVerticalQuad(tess, tex, y, c0, c7); + makeVerticalQuad(tess, tex, y, c6, c1); + } else if (connWest && connEast) { + makeVerticalQuad(tess, tex, y, c9, c4); + makeVerticalQuad(tess, tex, y, c3, cA); + } else if (connNorth && connWest) { + makeVerticalQuad(tess, tex, y, c0, cB); + makeVerticalQuad(tess, tex, y, cB, cA); + makeVerticalQuad(tess, tex, y, c9, c5); + makeVerticalQuad(tess, tex, y, c5, c1); + } else if (connWest && connSouth) { + makeVerticalQuad(tess, tex, y, c9, c8); + makeVerticalQuad(tess, tex, y, c8, c7); + makeVerticalQuad(tess, tex, y, c6, c2); + makeVerticalQuad(tess, tex, y, c2, cA); + } else if (connSouth && connEast) { + makeVerticalQuad(tess, tex, y, c6, c5); + makeVerticalQuad(tess, tex, y, c5, c4); + makeVerticalQuad(tess, tex, y, c3, cB); + makeVerticalQuad(tess, tex, y, cB, c7); + } else if (connEast && connNorth) { + makeVerticalQuad(tess, tex, y, c3, c2); + makeVerticalQuad(tess, tex, y, c2, c1); + makeVerticalQuad(tess, tex, y, c0, c8); + makeVerticalQuad(tess, tex, y, c8, c4); + } + break; + case 3: + if (!connNorth) { + makeVerticalQuad(tess, tex, y, c9, c4); + makeVerticalQuad(tess, tex, y, c3, cA); + makeVerticalQuad(tess, tex, y, c8, c7); + makeVerticalQuad(tess, tex, y, c6, c5); + } else if (!connWest) { + makeVerticalQuad(tess, tex, y, c0, c7); + makeVerticalQuad(tess, tex, y, c6, c1); + makeVerticalQuad(tess, tex, y, c5, c4); + makeVerticalQuad(tess, tex, y, c3, c2); + } else if (!connSouth) { + makeVerticalQuad(tess, tex, y, c9, c4); + makeVerticalQuad(tess, tex, y, c3, cA); + makeVerticalQuad(tess, tex, y, c2, c1); + makeVerticalQuad(tess, tex, y, c0, cB); + } else { + makeVerticalQuad(tess, tex, y, c0, c7); + makeVerticalQuad(tess, tex, y, c6, c1); + makeVerticalQuad(tess, tex, y, cB, cA); + makeVerticalQuad(tess, tex, y, c9, c8); + } + } + + if (connNorth) { + drawFloorCeil(tess, tex, y, cB, c1, connDown, connUp); + } + if (connWest) { + drawFloorCeil(tess, tex, y, c9, cB, connDown, connUp); + } + if (connSouth) { + drawFloorCeil(tess, tex, y, c7, c5, connDown, connUp); + } + if (connEast) { + drawFloorCeil(tess, tex, y, c5, c3, connDown, connUp); + } + drawFloorCeil(tess, tex, y, c8, c2, connDown, connUp); + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return false; + } + + @Override + public int getRenderId() { + return UtilitiesInExcess.blackoutCurtainsRenderID; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/FireBatteryRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/FireBatteryRenderer.java new file mode 100644 index 00000000..f7bc23ef --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/FireBatteryRenderer.java @@ -0,0 +1,59 @@ +package com.fouristhenumber.utilitiesinexcess.common.renderers; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; +import net.minecraftforge.client.IItemRenderer; + +import org.lwjgl.opengl.GL11; + +import com.fouristhenumber.utilitiesinexcess.common.items.ItemFireBattery; +import com.fouristhenumber.utilitiesinexcess.config.items.FireBatteryConfig; +import com.gtnewhorizon.gtnhlib.util.ItemRenderUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class FireBatteryRenderer implements IItemRenderer { + + @Override + public boolean handleRenderType(final ItemStack item, final ItemRenderType type) { + return true; + } + + @Override + public boolean shouldUseRenderHelper(final ItemRenderType type, final ItemStack item, + final ItemRendererHelper helper) { + return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING + || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack stack, Object... data) { + if (stack == null) return; + + GL11.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_ENABLE_BIT); + + NBTTagCompound tag = stack.getTagCompound(); + + int energy = 0; + if (tag != null) { + energy = tag.getInteger("Energy"); + } + float progress = energy / (float) FireBatteryConfig.fireBatteryRFStorage; + + ItemRenderUtil.applyStandardItemTransform(type); + + GL11.glColor3f(progress, 0F, .2F); + ItemRenderUtil.renderItem(type, ItemFireBattery.background); + GL11.glColor3f(1f, 1f, 1f); + + int overlayCount = ItemFireBattery.overlays.length; + int index = MathHelper.clamp_int((int) (progress * overlayCount), 0, overlayCount - 1); + ItemRenderUtil.renderItem(type, ItemFireBattery.overlays[index]); + + GL11.glPopAttrib(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/GloveRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/GloveRenderer.java new file mode 100644 index 00000000..514991b2 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/GloveRenderer.java @@ -0,0 +1,171 @@ +package com.fouristhenumber.utilitiesinexcess.common.renderers; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; + +import org.lwjgl.opengl.GL11; + +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemGlove; +import com.fouristhenumber.utilitiesinexcess.utils.RenderableCube; +import com.gtnewhorizon.gtnhlib.util.ItemRenderUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GloveRenderer implements IItemRenderer { + + @Override + public boolean handleRenderType(final ItemStack item, final ItemRenderType type) { + return type == ItemRenderType.EQUIPPED_FIRST_PERSON || type == ItemRenderType.EQUIPPED + || type == ItemRenderType.INVENTORY; + } + + @Override + public boolean shouldUseRenderHelper(final ItemRenderType type, final ItemStack item, + final ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack stack, Object... data) { + if (type != ItemRenderType.INVENTORY) return; + if (!(stack.getItem() instanceof ItemGlove glove)) return; + int meta = stack.getItemDamage(); + + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glEnable(GL11.GL_BLEND); + + ItemRenderUtil.applyStandardItemTransform(type); + + float[] rgb = woolMetaToRGB(meta / 16); + GL11.glColor3f(rgb[0], rgb[1], rgb[2]); + ItemRenderUtil.renderItem(type, glove.topIcon); + rgb = woolMetaToRGB(meta % 16); + GL11.glColor3f(rgb[0], rgb[1], rgb[2]); + ItemRenderUtil.renderItem(type, glove.bottomIcon); + + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + } + + public static float[] woolMetaToRGB(int dyeMeta) { + + return switch (dyeMeta) { + case 0 -> new float[] { 0.917F, 0.929F, 0.929F }; + case 1 -> new float[] { 0.945F, 0.466F, 0.086F }; + case 2 -> new float[] { 0.745F, 0.274F, 0.709F }; + case 3 -> new float[] { 0.274F, 0.690F, 0.854F }; + case 4 -> new float[] { 0.976F, 0.776F, 0.160F }; + case 5 -> new float[] { 0.443F, 0.729F, 0.101F }; + case 6 -> new float[] { 0.933F, 0.564F, 0.678F }; + case 7 -> new float[] { 0.247F, 0.270F, 0.282F }; + case 8 -> new float[] { 0.556F, 0.560F, 0.529F }; + case 9 -> new float[] { 0.082F, 0.541F, 0.568F }; + case 10 -> new float[] { 0.482F, 0.168F, 0.678F }; + case 11 -> new float[] { 0.207F, 0.227F, 0.619F }; + case 12 -> new float[] { 0.450F, 0.282F, 0.160F }; + case 13 -> new float[] { 0.333F, 0.431F, 0.109F }; + case 14 -> new float[] { 0.631F, 0.156F, 0.137F }; + case 15 -> new float[] { 0.086F, 0.086F, 0.105F }; + default -> new float[] { 0, 0, 0 }; + }; + } + + public static final RenderableCube topCube = new RenderableCube( + 0, + 0, + 0, + 1, + 1, + 1, + new float[][] { { 8, 8, 16, 16 }, { 16, 8, 24, 16 }, { 0, 8, 8, 16 }, { 8, 0, 16, 8 }, { 0, 0, 8, 8 }, + { 16, 0, 24, 8 } }); + + public static final RenderableCube bottomCube = new RenderableCube( + 0, + 0, + 0, + 1, + 0.25, + 1, + new float[][] { { 8, 8, 16, 16 }, { 8, 8, 16, 16 }, { 0, 16, 8, 18 }, { 0, 16, 8, 18 }, { 0, 16, 8, 18 }, + { 0, 16, 8, 18 } }); + + public static final ResourceLocation gloveTexture = new ResourceLocation( + "utilitiesinexcess", + "textures/items/glove_model.png"); + + public static void renderGloveAsBauble(int meta) { + int previousTex = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + + // 0.27 -0.73 1.43 -0.5 0 0 0 1 + Minecraft mc = Minecraft.getMinecraft(); + GL11.glScalef(0.27F, 0.27F, 0.27F); + GL11.glTranslatef(-0.73F, 1.43F, -0.5F); + + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glEnable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + + mc.renderEngine.bindTexture(gloveTexture); + Tessellator t = Tessellator.instance; + float[] rgb = woolMetaToRGB(meta / 16); + t.startDrawingQuads(); + t.setColorOpaque_F(rgb[0], rgb[1], rgb[2]); + topCube.draw(t, 0, 0, 0, 24, false); + t.draw(); + + GL11.glTranslatef(0, -0.25F, 0F); + rgb = woolMetaToRGB(meta % 16); + t.startDrawingQuads(); + t.setColorOpaque_F(rgb[0], rgb[1], rgb[2]); + bottomCube.draw(t, 0, 0, 0, 24, false); + t.draw(); + + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, previousTex); + } + + private static IIcon gloveIcon; + + public static void renderGloveHudIcon() { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer player = mc.thePlayer; + if (!ItemGlove.isUsingGlove(player)) return; + + if (gloveIcon == null) { + gloveIcon = new ItemStack(ModItems.GLOVE.get()).getIconIndex(); + } + + Tessellator t = Tessellator.instance; + ScaledResolution scaledResolution = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); + mc.getTextureManager() + .bindTexture(TextureMap.locationItemsTexture); + + GL11.glPushMatrix(); + + float x = (scaledResolution.getScaledWidth() / 2F) + 2, y = (scaledResolution.getScaledHeight() / 2F) + 2, + z = 0; + float width = 12; + float height = 12; + t.startDrawingQuads(); + t.addVertexWithUV(x, y + height, z, gloveIcon.getMinU(), gloveIcon.getMaxV()); + t.addVertexWithUV(x + width, y + height, z, gloveIcon.getMaxU(), gloveIcon.getMaxV()); + t.addVertexWithUV(x + width, y, z, gloveIcon.getMaxU(), gloveIcon.getMinV()); + t.addVertexWithUV(x, y, z, gloveIcon.getMinU(), gloveIcon.getMinV()); + t.draw(); + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/HeavenlyRingRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/HeavenlyRingRenderer.java new file mode 100644 index 00000000..6808739a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/HeavenlyRingRenderer.java @@ -0,0 +1,102 @@ +package com.fouristhenumber.utilitiesinexcess.common.renderers; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.util.IIcon; + +import org.lwjgl.opengl.GL11; + +import com.fouristhenumber.utilitiesinexcess.common.items.ItemHeavenlyRing; +import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class HeavenlyRingRenderer { + + private static final float WING_MIN = 10F; + private static final float WING_MAX = 25F; + + public static float getNextAngle(float curAngle, boolean isFlying) { + float speed; + float max; + if (isFlying) { + speed = 3F; + max = WING_MAX; + } else { + speed = 1.5F; + max = WING_MAX / 2; + } + long time = Minecraft.getSystemTime(); + return UIEUtils.lerp(curAngle, (float) ((Math.sin(time * 0.001 * speed) + 1) * max), 0.1F); + } + + public static void render(int meta, float angle) { + Tessellator t = Tessellator.instance; + int boundTexIndex = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + Minecraft.getMinecraft() + .getTextureManager() + .bindTexture(TextureMap.locationItemsTexture); + GL11.glEnable(GL11.GL_BLEND); + IIcon icon = ItemHeavenlyRing.wingIcons[meta]; + + // 1.5 3 0.1 20 25 0.001 + // Left wing + GL11.glPushMatrix(); + GL11.glTranslatef(0.0625F, -0.3125F, 0.125F); + GL11.glRotatef(-(WING_MIN + angle), 0, 1, 0); + if (Minecraft.getMinecraft().gameSettings.fancyGraphics) { + GL11.glTranslatef(0, 1, 0); + GL11.glRotatef(180, 1, 0, 0); + ItemRenderer.renderItemIn2D( + t, + icon.getMinU(), + icon.getMinV(), + icon.getMaxU(), + icon.getMaxV(), + icon.getIconWidth(), + icon.getIconHeight(), + -0.03125F); + } else { + t.startDrawingQuads(); + t.addVertexWithUV(0, 1, 0, icon.getMinU(), icon.getMaxV()); + t.addVertexWithUV(1, 1, 0, icon.getMaxU(), icon.getMaxV()); + t.addVertexWithUV(1, 0, 0, icon.getMaxU(), icon.getMinV()); + t.addVertexWithUV(0, 0, 0, icon.getMinU(), icon.getMinV()); + t.draw(); + } + GL11.glPopMatrix(); + + // Right wing + GL11.glPushMatrix(); + GL11.glTranslatef(-0.0625F, -0.3125F, 0.125F); + GL11.glRotatef((-180 + WING_MIN) + angle, 0, 1, 0); + if (Minecraft.getMinecraft().gameSettings.fancyGraphics) { + GL11.glTranslatef(0, 1, 0); + GL11.glRotatef(180, 1, 0, 0); + ItemRenderer.renderItemIn2D( + t, + icon.getMinU(), + icon.getMinV(), + icon.getMaxU(), + icon.getMaxV(), + icon.getIconWidth(), + icon.getIconHeight(), + 0.03125F); + } else { + t.startDrawingQuads(); + t.addVertexWithUV(0, 1, 0, icon.getMinU(), icon.getMaxV()); + t.addVertexWithUV(1, 1, 0, icon.getMaxU(), icon.getMaxV()); + t.addVertexWithUV(1, 0, 0, icon.getMaxU(), icon.getMinV()); + t.addVertexWithUV(0, 0, 0, icon.getMinU(), icon.getMinV()); + t.draw(); + } + GL11.glPopMatrix(); + + GL11.glDisable(GL11.GL_BLEND); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, boundTexIndex); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/InvertedIngotRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/InvertedIngotRenderer.java new file mode 100644 index 00000000..4fdd6d57 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/InvertedIngotRenderer.java @@ -0,0 +1,78 @@ +package com.fouristhenumber.utilitiesinexcess.common.renderers; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer; + +import org.lwjgl.opengl.GL11; + +import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; +import com.gtnewhorizon.gtnhlib.util.ItemRenderUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class InvertedIngotRenderer implements IItemRenderer { + + @Override + public boolean handleRenderType(final ItemStack item, final ItemRenderType type) { + return item.getItemDamage() == 0; + } + + @Override + public boolean shouldUseRenderHelper(final ItemRenderType type, final ItemStack item, + final ItemRendererHelper helper) { + return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING + || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack stack, Object... data) { + if (stack == null) return; + + GL11.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_ENABLE_BIT); + + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GL11.glEnable(GL11.GL_BLEND); + + IIcon icon = stack.getItem() + .getIconFromDamageForRenderPass(stack.getItemDamage(), 0); + + NBTTagCompound tag = stack.getTagCompound(); + if (tag != null && tag.hasKey("ImplosionTimer")) { + + World world = Minecraft.getMinecraft().theWorld; + if (world == null) return; + + int remaining = tag.getInteger("ImplosionTimer"); + + float progress = MathHelper + .clamp_float((float) remaining / InversionConfig.invertedIngotImplosionTimer, 0f, 1f); + + float r = 1F; + float g = MathHelper.clamp_float(progress, 0f, 1f); + float b = MathHelper.clamp_float(progress, 0f, 1f); + + if (remaining < 60) { + int blink = remaining / 10; + if (blink == 1 || blink == 3 || blink == 5) { + g = 0.9f; + b = 0f; + } + } + + GL11.glColor3f(r, g, b); + } + + ItemRenderUtil.applyStandardItemTransform(type); + ItemRenderUtil.renderItem(type, icon); + + GL11.glPopAttrib(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/LapisAetheriusRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/LapisAetheriusRenderer.java new file mode 100644 index 00000000..149520b6 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/LapisAetheriusRenderer.java @@ -0,0 +1,75 @@ +package com.fouristhenumber.utilitiesinexcess.common.renderers; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.world.IBlockAccess; + +import org.lwjgl.opengl.GL11; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; + +public class LapisAetheriusRenderer implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + Tessellator tess = Tessellator.instance; + + renderer.setRenderBoundsFromBlock(block); + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + tess.startDrawingQuads(); + tess.setNormal(0, 1, 0); + renderer.renderFaceYNeg(block, 0, 0, 0, block.getIcon(0, metadata)); + renderer.renderFaceYPos(block, 0, 0, 0, block.getIcon(1, metadata)); + renderer.renderFaceZNeg(block, 0, 0, 0, block.getIcon(2, metadata)); + renderer.renderFaceZPos(block, 0, 0, 0, block.getIcon(3, metadata)); + renderer.renderFaceXNeg(block, 0, 0, 0, block.getIcon(4, metadata)); + renderer.renderFaceXPos(block, 0, 0, 0, block.getIcon(5, metadata)); + tess.draw(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + Tessellator tess = Tessellator.instance; + + tess.setBrightness(240); + tess.setColorOpaque_F(1F, 1F, 1F); + + int meta = world.getBlockMetadata(x, y, z); + if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y - 1, z, 0)) { + renderer.renderFaceYNeg(block, x, y, z, block.getIcon(0, meta)); + } + if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y + 1, z, 1)) { + renderer.renderFaceYPos(block, x, y, z, block.getIcon(1, meta)); + } + if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y, z - 1, 2)) { + renderer.renderFaceZNeg(block, x, y, z, block.getIcon(2, meta)); + } + if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y, z + 1, 3)) { + renderer.renderFaceZPos(block, x, y, z, block.getIcon(3, meta)); + } + if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x - 1, y, z, 4)) { + renderer.renderFaceXNeg(block, x, y, z, block.getIcon(4, meta)); + } + if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x + 1, y, z, 5)) { + renderer.renderFaceXPos(block, x, y, z, block.getIcon(5, meta)); + } + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return UtilitiesInExcess.lapisAetheriusRenderID; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/SpikeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/SpikeRenderer.java new file mode 100644 index 00000000..c40de898 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/SpikeRenderer.java @@ -0,0 +1,111 @@ +package com.fouristhenumber.utilitiesinexcess.common.renderers; + +import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.spikeRenderID; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +import com.fouristhenumber.utilitiesinexcess.utils.RenderableCube; +import com.gtnewhorizons.angelica.api.ThreadSafeISBRH; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; + +@ThreadSafeISBRH(perThread = false) +public class SpikeRenderer implements ISimpleBlockRenderingHandler { + + final static List cubes = new ArrayList(); + + static final int TEXTURE_SIZE = 64; + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + Tessellator t = Tessellator.instance; + IIcon icon = renderer.getBlockIcon(block); + for (RenderableCube c : cubes) { + c.draw(t, x, y, z, icon, TEXTURE_SIZE, true); + } + return true; + } + + @Override + public void renderInventoryBlock(Block block, int meta, int modelId, RenderBlocks renderer) { + Tessellator t = Tessellator.instance; + IIcon icon = renderer.getBlockIcon(block); + t.startDrawingQuads(); + for (RenderableCube c : cubes) { + c.draw(t, 0, 0, 0, icon, TEXTURE_SIZE, true); + } + t.draw(); + } + + static { + // base + cubes.add( + new RenderableCube( + 0, + 0, + 0, + 1F, + 0.0625F, + 1F, + new float[][] { { 16, 0, 31, 15 }, { 32, 0, 47, 15 }, { 0, 16, 15, 16 }, { 0, 16, 15, 16 }, + { 0, 16, 15, 16 }, { 0, 16, 15, 16 } })); + + // layer 2 plates + + float[][] layer2uv = new float[][] { { 6, 17, 11, 22 }, { 12, 17, 17, 22 }, { 0, 23, 5, 23 }, { 6, 23, 11, 23 }, + { 12, 23, 17, 23 }, { 18, 23, 23, 23 } }; + + cubes.add(new RenderableCube(0.0625F, 0.0625F, 0.0625F, 0.4375F, 0.125F, 0.4375F, layer2uv)); + + cubes.add(new RenderableCube(0.5625F, 0.0625F, 0.0625F, 0.9375F, 0.125F, 0.4375F, layer2uv)); + + cubes.add(new RenderableCube(0.0625F, 0.0625F, 0.5625F, 0.4375F, 0.125F, 0.9375F, layer2uv)); + + cubes.add(new RenderableCube(0.5625F, 0.0625F, 0.5625F, 0.9375F, 0.125F, 0.9375F, layer2uv)); + + // layer 3 plates + + float[][] layer3uv = new float[][] { { 28, 18, 31, 21 }, { 32, 18, 35, 21 }, { 24, 22, 27, 23 }, + { 28, 22, 31, 23 }, { 32, 22, 35, 23 }, { 36, 22, 39, 23 } }; + + cubes.add(new RenderableCube(0.125F, 0.125F, 0.125F, 0.375F, 0.25F, 0.375F, layer3uv)); + + cubes.add(new RenderableCube(0.625F, 0.125F, 0.125F, 0.875F, 0.25F, 0.375F, layer3uv)); + + cubes.add(new RenderableCube(0.125F, 0.125F, 0.625F, 0.375F, 0.25F, 0.875F, layer3uv)); + + cubes.add(new RenderableCube(0.625F, 0.125F, 0.625F, 0.875F, 0.25F, 0.875F, layer3uv)); + + // layer 4 plates + + float[][] layer4uv = new float[][] { { 2, 0, 3, 1 }, { 4, 0, 5, 1 }, { 0, 2, 1, 4 }, { 2, 2, 3, 4 }, + { 4, 2, 5, 4 }, { 6, 2, 7, 4 } }; + + cubes.add(new RenderableCube(0.1875F, 0.25F, 0.1875F, 0.3125F, 0.4375F, 0.3125F, layer4uv)); + + cubes.add(new RenderableCube(0.6875F, 0.25F, 0.1875F, 0.8125F, 0.4375F, 0.3125F, layer4uv)); + + cubes.add(new RenderableCube(0.1875F, 0.25F, 0.6875F, 0.3125F, 0.4375F, 0.8125F, layer4uv)); + + cubes.add(new RenderableCube(0.6875F, 0.25F, 0.6875F, 0.8125F, 0.4375F, 0.8125F, layer4uv)); + + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return spikeRenderID; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/WireframeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/WireframeRenderer.java new file mode 100644 index 00000000..74ab244d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/WireframeRenderer.java @@ -0,0 +1,85 @@ +package com.fouristhenumber.utilitiesinexcess.common.renderers; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.client.renderer.RenderGlobal; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.client.event.RenderWorldLastEvent; + +import org.lwjgl.opengl.GL11; + +import com.fouristhenumber.utilitiesinexcess.common.items.ItemArchitectsWand; +import com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; +import com.gtnewhorizon.gtnhlib.eventbus.EventBusSubscriber; +import com.gtnewhorizon.gtnhlib.eventbus.Phase; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; + +@SuppressWarnings("unused") +@SideOnly(Side.CLIENT) +@EventBusSubscriber(phase = Phase.INIT, side = Side.CLIENT) +public class WireframeRenderer { + + private final static ObjectOpenHashSet candidatePositions = new ObjectOpenHashSet<>(); + + // Setter so your item can update the candidate positions + public static void addCandidatePosition(BlockPos pos) { + candidatePositions.add(pos); + } + + public static void clearCandidatePositions() { + if (!candidatePositions.isEmpty()) candidatePositions.clear(); + } + + @EventBusSubscriber.Condition + public static boolean shouldSubscribe() { + return ItemConfig.enableArchitectsWand; + } + + @SubscribeEvent + public static void onRenderWorldLast(RenderWorldLastEvent event) { + EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; + if (player == null) return; + ItemStack held = player.getHeldItem(); + if (held == null || !(held.getItem() instanceof ItemArchitectsWand)) { + clearCandidatePositions(); + return; + } + + if (candidatePositions.isEmpty()) { + return; + } + + GL11.glPushAttrib(GL11.GL_ENABLE_BIT | GL11.GL_LINE_BIT); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glLineWidth(2.0F); + + GL11.glColor3f(1.0F, 1.0F, 1.0F); + + double posX = RenderManager.renderPosX; + double posY = RenderManager.renderPosY; + double posZ = RenderManager.renderPosZ; + + for (BlockPos pos : candidatePositions) { + int x = pos.x; + int y = pos.y; + int z = pos.z; + + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1); + + aabb.offset(-posX, -posY, -posZ); + + RenderGlobal.drawOutlinedBoundingBox(aabb, -1); + } + + GL11.glPopAttrib(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/XRayRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/XRayRenderer.java new file mode 100644 index 00000000..35552945 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/XRayRenderer.java @@ -0,0 +1,129 @@ +package com.fouristhenumber.utilitiesinexcess.common.renderers; + +import static org.lwjgl.opengl.GL11.GL_BLEND; + +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraftforge.client.event.RenderWorldLastEvent; + +import org.lwjgl.opengl.GL11; + +import com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; +import com.gtnewhorizon.gtnhlib.eventbus.EventBusSubscriber; +import com.gtnewhorizon.gtnhlib.eventbus.Phase; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; + +@SuppressWarnings("unused") +@SideOnly(Side.CLIENT) +@EventBusSubscriber(phase = Phase.INIT, side = Side.CLIENT) +public class XRayRenderer { + + private final static ObjectOpenHashSet candidatePositions = new ObjectOpenHashSet<>(); + + public static void addCandidatePosition(BlockPos pos) { + candidatePositions.add(pos); + } + + public static void clearCandidatePositions() { + if (!candidatePositions.isEmpty()) candidatePositions.clear(); + } + + @EventBusSubscriber.Condition + public static boolean shouldSubscribe() { + return ItemConfig.enableXRayGlasses; + } + + @SubscribeEvent + public static void onRenderWorldLast(RenderWorldLastEvent event) { + if (candidatePositions.isEmpty()) return; + + GL11.glPushAttrib(GL11.GL_ENABLE_BIT | GL11.GL_LINE_BIT); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL_BLEND); + GL11.glLineWidth(2.0F); + GL11.glColor4f(1.0F, 0.3F, 0.3F, 0.5F); + + double posX = RenderManager.renderPosX; + double posY = RenderManager.renderPosY; + double posZ = RenderManager.renderPosZ; + + Tessellator tess = Tessellator.instance; + tess.startDrawing(GL11.GL_LINES); + + for (BlockPos pos : candidatePositions) { + int x = pos.x; + int y = pos.y; + int z = pos.z; + + boolean enclosedPosX = (candidatePositions.contains(new BlockPos(x + 1, y, z))); + boolean enclosedNegX = (candidatePositions.contains(new BlockPos(x - 1, y, z))); + boolean enclosedPosY = (candidatePositions.contains(new BlockPos(x, y + 1, z))); + boolean enclosedNegY = (candidatePositions.contains(new BlockPos(x, y - 1, z))); + boolean enclosedPosZ = (candidatePositions.contains(new BlockPos(x, y, z + 1))); + boolean enclosedNegZ = (candidatePositions.contains(new BlockPos(x, y, z - 1))); + + // Top + if (!enclosedPosY && !enclosedNegX) { + tess.addVertex(x - posX, y - posY + 1, z - posZ); + tess.addVertex(x - posX, y - posY + 1, z - posZ + 1); + } + if (!enclosedPosY && !enclosedPosX) { + tess.addVertex(x - posX + 1, y - posY + 1, z - posZ); + tess.addVertex(x - posX + 1, y - posY + 1, z - posZ + 1); + } + if (!enclosedPosY && !enclosedNegZ) { + tess.addVertex(x - posX, y - posY + 1, z - posZ); + tess.addVertex(x - posX + 1, y - posY + 1, z - posZ); + } + if (!enclosedPosY && !enclosedPosZ) { + tess.addVertex(x - posX, y - posY + 1, z - posZ + 1); + tess.addVertex(x - posX + 1, y - posY + 1, z - posZ + 1); + } + + // Side edges + if (!enclosedNegZ && !enclosedNegX) { + tess.addVertex(x - posX, y - posY, z - posZ); + tess.addVertex(x - posX, y - posY + 1, z - posZ); + } + if (!enclosedPosZ && !enclosedPosX) { + tess.addVertex(x - posX + 1, y - posY, z - posZ + 1); + tess.addVertex(x - posX + 1, y - posY + 1, z - posZ + 1); + } + if (!enclosedNegZ && !enclosedPosX) { + tess.addVertex(x - posX + 1, y - posY, z - posZ); + tess.addVertex(x - posX + 1, y - posY + 1, z - posZ); + } + if (!enclosedPosZ && !enclosedNegX) { + tess.addVertex(x - posX, y - posY, z - posZ + 1); + tess.addVertex(x - posX, y - posY + 1, z - posZ + 1); + } + + // Bottom + if (!enclosedNegY && !enclosedNegX) { + tess.addVertex(x - posX, y - posY, z - posZ); + tess.addVertex(x - posX, y - posY, z - posZ + 1); + } + if (!enclosedNegY && !enclosedPosX) { + tess.addVertex(x - posX + 1, y - posY, z - posZ); + tess.addVertex(x - posX + 1, y - posY, z - posZ + 1); + } + if (!enclosedNegY && !enclosedNegZ) { + tess.addVertex(x - posX, y - posY, z - posZ); + tess.addVertex(x - posX + 1, y - posY, z - posZ); + } + if (!enclosedNegY && !enclosedPosZ) { + tess.addVertex(x - posX, y - posY, z - posZ + 1); + tess.addVertex(x - posX + 1, y - posY, z - posZ + 1); + } + } + tess.draw(); + GL11.glPopAttrib(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java new file mode 100644 index 00000000..166c50ec --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java @@ -0,0 +1,145 @@ +package com.fouristhenumber.utilitiesinexcess.common.renderers.transfer; + +import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferNodeRenderID; +import static com.fouristhenumber.utilitiesinexcess.common.renderers.transfer.TransferPipeRenderer.RenderPipes; +import static com.fouristhenumber.utilitiesinexcess.utils.RenderUtils.renderInventoryCube; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeBase; +import com.gtnewhorizons.angelica.api.ThreadSafeISBRH; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; + +@ThreadSafeISBRH(perThread = false) +public class TransferNodeRenderer implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + IIcon icon = block.getIcon(0, metadata); + + float t = 2f / 16f; + float s12 = 12f / 16f; + float s8 = 8f / 16f; + float s12Half = (1f - s12) / 2f; + float s8Half = (1f - s8) / 2f; + + Tessellator tess = Tessellator.instance; + + tess.startDrawingQuads(); + tess.setNormal(0, 1, 0); + + renderer.setRenderBounds(0, 0, 0, 1, t, 1); + renderInventoryCube(renderer, block, metadata); + renderer.setRenderBounds(s12Half, t, s12Half, s12Half + s12, 2f * t, s12Half + s12); + renderInventoryCube(renderer, block, metadata); + renderer.setRenderBounds(s8Half, 2f * t, s8Half, s8Half + s8, 3f * t, s8Half + s8); + renderInventoryCube(renderer, block, metadata); + + tess.draw(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + if (modelId != getRenderId()) return false; + + int meta = world.getBlockMetadata(x, y, z); + + float t = 2f / 16f; + float s12 = 12f / 16f; + float s8 = 8f / 16f; + float s12Half = (1f - s12) / 2f; + float s8Half = (1f - s8) / 2f; + + switch (meta) { + case 0: + renderer.setRenderBounds(0.0F, 0.0F, 0.0F, 1.0F, t, 1.0F); + break; + case 1: + renderer.setRenderBounds(0.0F, 1.0F - t, 0.0F, 1.0F, 1.0F, 1.0F); + break; + case 2: + renderer.setRenderBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, t); + break; + case 3: + renderer.setRenderBounds(0.0F, 0.0F, 1.0F - t, 1.0F, 1.0F, 1.0F); + break; + case 4: + renderer.setRenderBounds(0.0F, 0.0F, 0.0F, t, 1.0F, 1.0F); + break; + case 5: + renderer.setRenderBounds(1.0F - t, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + break; + } + + renderer.renderStandardBlock(block, x, y, z); + + switch (meta) { + case 0: + renderer.setRenderBounds(s12Half, t, s12Half, s12Half + s12, 2f * t, s12Half + s12); + break; + case 1: + renderer.setRenderBounds(s12Half, 1f - 2f * t, s12Half, s12Half + s12, 1f - t, s12Half + s12); + break; + case 2: + renderer.setRenderBounds(s12Half, s12Half, t, s12Half + s12, s12Half + s12, 2f * t); + break; + case 3: + renderer.setRenderBounds(s12Half, s12Half, 1f - 2f * t, s12Half + s12, s12Half + s12, 1f - t); + break; + case 4: + renderer.setRenderBounds(t, s12Half, s12Half, 2f * t, s12Half + s12, s12Half + s12); + break; + case 5: + renderer.setRenderBounds(1f - 2f * t, s12Half, s12Half, 1f - t, s12Half + s12, s12Half + s12); + break; + } + renderer.renderStandardBlock(block, x, y, z); + + switch (meta) { + case 0: + renderer.setRenderBounds(s8Half, 2f * t, s8Half, s8Half + s8, 3f * t, s8Half + s8); + break; + case 1: + renderer.setRenderBounds(s8Half, 1f - 3f * t, s8Half, s8Half + s8, 1f - 2f * t, s8Half + s8); + break; + case 2: + renderer.setRenderBounds(s8Half, s8Half, 2f * t, s8Half + s8, s8Half + s8, 3f * t); + break; + case 3: + renderer.setRenderBounds(s8Half, s8Half, 1f - 3f * t, s8Half + s8, s8Half + s8, 1f - 2f * t); + break; + case 4: + renderer.setRenderBounds(2f * t, s8Half, s8Half, 3f * t, s8Half + s8, s8Half + s8); + break; + case 5: + renderer.setRenderBounds(1f - 3f * t, s8Half, s8Half, 1f - 2f * t, s8Half + s8, s8Half + s8); + break; + } + renderer.renderStandardBlock(block, x, y, z); + + TileEntityTransferNodeBase te = (TileEntityTransferNodeBase) world.getTileEntity(x, y, z); + if (te == null) return false; + + int mask = te.getConnectionsMask(); + + RenderPipes(mask, x, y, z, renderer, mask != 0); + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return transferNodeRenderID; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java new file mode 100644 index 00000000..8ee5a40d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java @@ -0,0 +1,106 @@ +package com.fouristhenumber.utilitiesinexcess.common.renderers.transfer; + +import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; +import static com.fouristhenumber.utilitiesinexcess.utils.RenderUtils.renderInventoryCube; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.world.IBlockAccess; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; +import com.gtnewhorizons.angelica.api.ThreadSafeISBRH; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; + +@ThreadSafeISBRH(perThread = false) +public class TransferPipeRenderer implements ISimpleBlockRenderingHandler { + + public static void RenderPipes(int mask, int x, int y, int z, RenderBlocks renderer, boolean renderCenter) { + + Block block = ModBlocks.TRANSFER_PIPE.get(); + + if (renderCenter) { + renderer.setRenderBounds(0.375, 0.375, 0.375, 0.625, 0.625, 0.625); + renderer.renderStandardBlock(block, x, y, z); + } + + // +X + if ((mask & (1)) != 0) { + renderer.setRenderBounds(0.625, 0.375, 0.375, 1.0, 0.625, 0.625); + renderer.renderStandardBlock(block, x, y, z); + } + // -X + if ((mask & (1 << 1)) != 0) { + renderer.setRenderBounds(0.0, 0.375, 0.375, 0.375, 0.625, 0.625); + renderer.renderStandardBlock(block, x, y, z); + } + // +Y + if ((mask & (1 << 2)) != 0) { + renderer.setRenderBounds(0.375, 0.625, 0.375, 0.625, 1.0, 0.625); + renderer.renderStandardBlock(block, x, y, z); + } + // -Y + if ((mask & (1 << 3)) != 0) { + renderer.setRenderBounds(0.375, 0.0, 0.375, 0.625, 0.375, 0.625); + renderer.renderStandardBlock(block, x, y, z); + } + // +Z + if ((mask & (1 << 4)) != 0) { + renderer.setRenderBounds(0.375, 0.375, 0.625, 0.625, 0.625, 1.0); + renderer.renderStandardBlock(block, x, y, z); + } + // -Z + if ((mask & (1 << 5)) != 0) { + renderer.setRenderBounds(0.375, 0.375, 0.0, 0.625, 0.625, 0.375); + renderer.renderStandardBlock(block, x, y, z); + } + } + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + Tessellator tess = Tessellator.instance; + + tess.startDrawingQuads(); + tess.setNormal(0, 1, 0); + + renderer.setRenderBounds(0.375, 0.375, 0.375, 0.625, 0.625, 0.625); + renderInventoryCube(renderer, block, metadata); + renderer.setRenderBounds(0.625, 0.375, 0.375, 1.0, 0.625, 0.625); + renderInventoryCube(renderer, block, metadata); + renderer.setRenderBounds(0.0, 0.375, 0.375, 0.375, 0.625, 0.625); + renderInventoryCube(renderer, block, metadata); + renderer.setRenderBounds(0.375, 0.625, 0.375, 0.625, 1.0, 0.625); + renderInventoryCube(renderer, block, metadata); + renderer.setRenderBounds(0.375, 0.0, 0.375, 0.625, 0.375, 0.625); + renderInventoryCube(renderer, block, metadata); + renderer.setRenderBounds(0.375, 0.375, 0.625, 0.625, 0.625, 1.0); + renderInventoryCube(renderer, block, metadata); + renderer.setRenderBounds(0.375, 0.375, 0.0, 0.625, 0.625, 0.375); + renderInventoryCube(renderer, block, metadata); + + tess.draw(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess worldAccess, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + TileEntityTransferPipe te = (TileEntityTransferPipe) worldAccess.getTileEntity(x, y, z); + if (te == null) return false; + + RenderPipes(te.getConnectionsMask(), x, y, z, renderer, true); + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return transferPipeRenderID; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityBlockUpdateDetector.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityBlockUpdateDetector.java new file mode 100644 index 00000000..03ecb843 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityBlockUpdateDetector.java @@ -0,0 +1,37 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.tileentity.TileEntity; + +public class TileEntityBlockUpdateDetector extends TileEntity { + + private boolean isProvidingPower = false; + private int pulseTimer = 0; + + @Override + public void updateEntity() { + if (worldObj.isRemote) { + return; + } + + if (isProvidingPower && pulseTimer > 0) { + pulseTimer--; + if (pulseTimer <= 0) { + isProvidingPower = false; + worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); + } + } + } + + public void onNeighborUpdate() { + if (!isProvidingPower) { + isProvidingPower = true; + pulseTimer++; + worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); + worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, getBlockType(), 1); + } + } + + public int getOutputPower() { + return isProvidingPower ? 15 : 0; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityConveyor.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityConveyor.java new file mode 100644 index 00000000..b277cc24 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityConveyor.java @@ -0,0 +1,72 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockConveyor; + +public class TileEntityConveyor extends TileEntity { + + /// The speed of the conveyor, measured in blocks per tick + private static final float SPEED = 1f / 20f; + + @Override + public void updateEntity() { + super.updateEntity(); + + ForgeDirection facing = BlockConveyor.getFacing(getBlockMetadata()); + + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); + aabb.offset(xCoord, yCoord + 1, zCoord); + + List entities = worldObj.getEntitiesWithinAABB(Entity.class, aabb); + + for (Entity entity : entities) { + boolean valid = entity instanceof EntityLivingBase || entity instanceof EntityItem; + + if (!valid) continue; + + if (!entity.onGround) continue; + if (entity.isSneaking()) continue; + + // Center the entity on the conveyor + if (facing.offsetX != 0) { + AxisAlignedBB entityAABB = entity.boundingBox; + + double centerZ = (entityAABB.minZ + entityAABB.maxZ) / 2; + + double targetZ = zCoord + 0.5; + + double deltaZ = targetZ - centerZ; + + entity.moveEntity(0, 0, Math.min(Math.abs(deltaZ), SPEED) * Math.signum(deltaZ)); + } else { + AxisAlignedBB entityAABB = entity.boundingBox; + + double centerX = (entityAABB.minX + entityAABB.maxX) / 2; + + double targetX = xCoord + 0.5; + + double deltaX = targetX - centerX; + + entity.moveEntity(Math.min(Math.abs(deltaX), SPEED) * Math.signum(deltaX), 0, 0); + } + + entity.moveEntity(facing.offsetX * SPEED, 0, facing.offsetZ * SPEED); + + // Move items up to next belt if there is one + if (worldObj + .getBlock(xCoord + facing.offsetX, yCoord + 1, zCoord + facing.offsetZ) instanceof BlockConveyor) { + if (entity instanceof EntityItem && entity.isCollidedHorizontally) { + entity.moveEntity(facing.offsetX * SPEED, 1, facing.offsetY * SPEED); + } + } + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityDrum.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityDrum.java new file mode 100644 index 00000000..c4c99249 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityDrum.java @@ -0,0 +1,86 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; + +public class TileEntityDrum extends TileEntity implements IFluidHandler { + + public final FluidTank tank; + + public TileEntityDrum(int capacity) { + super(); + this.tank = new FluidTank(capacity); + } + + public void setTank(FluidTank tank) { + setFluid(tank.getFluid()); + } + + public void setFluid(FluidStack stack) { + this.tank.setFluid(stack); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + if (nbt.hasKey("tank")) { + NBTTagCompound tankNbt = nbt.getCompoundTag("tank"); + tank.readFromNBT(tankNbt); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + NBTTagCompound tankNbt = new NBTTagCompound(); + tank.writeToNBT(tankNbt); + nbt.setTag("tank", tankNbt); + } + + // IFluidHandler implementation + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + if (resource == null) return 0; + int filled = tank.fill(resource, doFill); + if (doFill && filled > 0) markDirty(); + return filled; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + if (resource == null || !resource.isFluidEqual(tank.getFluid())) return null; + FluidStack drained = tank.drain(resource.amount, doDrain); + if (doDrain && drained != null && drained.amount > 0) markDirty(); + return drained; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + FluidStack drained = tank.drain(maxDrain, doDrain); + if (doDrain && drained != null && drained.amount > 0) markDirty(); + return drained; + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) { + return true; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) { + FluidStack fluidInTank = tank.getFluid(); + return fluidInTank != null && fluidInTank.getFluid() == fluid; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) { + return new FluidTankInfo[] { tank.getInfo() }; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityMarginallyMaximisedChest.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityMarginallyMaximisedChest.java new file mode 100644 index 00000000..b3e42cb2 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityMarginallyMaximisedChest.java @@ -0,0 +1,138 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.Constants; + +public class TileEntityMarginallyMaximisedChest extends TileEntity implements IInventory { + + protected final ItemStack[] chestContents = new ItemStack[getSizeInventory()]; + + @Override + public int getSizeInventory() { + return 27; + } + + @Override + public String getInventoryName() { + return "tile.marginally_maximised_chest.name"; + } + + @Override + public boolean canUpdate() { + return false; + } + + @Override + public ItemStack getStackInSlot(int slotIn) { + return this.chestContents[slotIn]; + } + + @Override + public ItemStack decrStackSize(int index, int count) { + if (this.chestContents[index] != null) { + ItemStack itemstack; + + if (this.chestContents[index].stackSize <= count) { + itemstack = this.chestContents[index]; + this.chestContents[index] = null; + this.markDirty(); + return itemstack; + } else { + itemstack = this.chestContents[index].splitStack(count); + + if (this.chestContents[index].stackSize == 0) { + this.chestContents[index] = null; + } + + this.markDirty(); + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) { + if (this.chestContents[index] != null) { + ItemStack itemstack = this.chestContents[index]; + this.chestContents[index] = null; + return itemstack; + } else { + return null; + } + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) { + this.chestContents[index] = stack; + + if (stack != null && stack.stackSize > this.getInventoryStackLimit()) { + stack.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) == this && player + .getDistanceSq((double) this.xCoord + 0.5D, (double) this.yCoord + 0.5D, (double) this.zCoord + 0.5D) + <= 64.0D; + } + + @Override + public void openInventory() {} + + @Override + public void closeInventory() {} + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + return true; + } + + @Override + public void readFromNBT(NBTTagCompound nbttagcompound) { + super.readFromNBT(nbttagcompound); + NBTTagList nbttaglist = nbttagcompound.getTagList("Items", Constants.NBT.TAG_COMPOUND); + for (int index = 0; index < nbttaglist.tagCount(); index++) { + NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(index); + int slot = nbttagcompound1.getByte("Slot") & 255; + if (slot >= 0 && slot < getSizeInventory()) { + setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(nbttagcompound1)); + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbttagcompound) { + super.writeToNBT(nbttagcompound); + NBTTagList nbttaglist = new NBTTagList(); + for (int index = 0; index < getSizeInventory(); index++) { + ItemStack curStack = getStackInSlot(index); + if (curStack != null) { + NBTTagCompound nbttagcompound1 = new NBTTagCompound(); + nbttagcompound1.setByte("Slot", (byte) index); + curStack.writeToNBT(nbttagcompound1); + nbttaglist.appendTag(nbttagcompound1); + } + } + nbttagcompound.setTag("Items", nbttaglist); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPacifistsBench.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPacifistsBench.java new file mode 100644 index 00000000..bf6baebd --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPacifistsBench.java @@ -0,0 +1,129 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import java.util.UUID; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemSword; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.EnumDifficulty; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.FakePlayerFactory; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.google.common.collect.Multimap; +import com.gtnewhorizon.gtnhlib.capability.item.ItemSink; +import com.gtnewhorizon.gtnhlib.item.InsertionItemStack; +import com.gtnewhorizon.gtnhlib.util.ItemUtil; +import com.mojang.authlib.GameProfile; + +public class TileEntityPacifistsBench extends TileEntity { + + int weaponLocation = -1; + IInventory currentInventory; + + @Override + public void updateEntity() { + if (worldObj.isRemote || worldObj.getTotalWorldTime() % BlockConfig.pacifistsBenchCooldownInTicks != 0) return; + if (!(worldObj.difficultySetting == EnumDifficulty.PEACEFUL) && !BlockConfig.pacifistsBenchInNonPeaceful) + return; + + ItemStack weapon = findWeapon(); + if (weapon == null) return; + + BiomeGenBase.SpawnListEntry entry = ((WorldServer) worldObj) + .spawnRandomCreature(EnumCreatureType.monster, xCoord, yCoord, zCoord); + + EntityLiving entity; + try { + entity = entry.entityClass.getConstructor(World.class) + .newInstance(worldObj); + } catch (Exception exception) { + UtilitiesInExcess.LOG.error("Failed to construct EntityLiving from constructor"); + return; + } + + // Basically just makes wither skeletons spawn properly + entity.onSpawnWithEgg(null); + entity.setLocationAndAngles(xCoord + 0.5, yCoord + 1, zCoord + 0.5, worldObj.rand.nextFloat() * 360F, 0); + + worldObj.spawnEntityInWorld(entity); + + FakePlayer fakePlayer = makeFakePlayer(weapon); + + int hits = 0; + // Hit repeatedly to correctly simulate damage and durability + while (entity.getHealth() > 0.0) { + // Just give up at this point, so it doesn't lock out if there's some insane modded interaction + if (hits > 500) break; + entity.hurtResistantTime = 0; + fakePlayer.attackTargetEntityWithCurrentItem(entity); + entity.motionX = entity.motionY = entity.motionZ = 0; + hits++; + } + + currentInventory.setInventorySlotContents(weaponLocation, fakePlayer.getCurrentEquippedItem()); + } + + public void receiveItemStack(ItemStack stack) { + if (currentInventory != null) { + ItemSink sink = ItemUtil.getItemSink(currentInventory, ForgeDirection.UP); + if (sink != null) sink.store(new InsertionItemStack(stack)); + } + } + + private ItemStack findWeapon() { + if (currentInventory != null) { + ItemStack weaponStack = currentInventory.getStackInSlot(weaponLocation); + if (weaponStack != null && weaponStack.getItem() instanceof ItemSword) return weaponStack; + } + + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + if (worldObj.getTileEntity( + xCoord + dir.offsetX, + yCoord + dir.offsetY, + zCoord + dir.offsetZ) instanceof IInventory inv) { + for (int i = 0; i < inv.getSizeInventory(); i++) { + ItemStack stack = inv.getStackInSlot(i); + if (stack != null && stack.getItem() instanceof ItemSword) { + weaponLocation = i; + currentInventory = inv; + return stack; + } + } + } + } + return null; + } + + private FakePlayer makeFakePlayer(ItemStack weapon) { + FakePlayer fakePlayer = FakePlayerFactory.get( + (WorldServer) worldObj, + new GameProfile(UUID.nameUUIDFromBytes("UIE_Pacifist".getBytes()), "[UIE Pacifist's Bench]")); + + fakePlayer.setCurrentItemOrArmor(0, weapon); + + Multimap modifiers = weapon.getAttributeModifiers(); + fakePlayer.getAttributeMap() + .applyAttributeModifiers(modifiers); + + NBTTagCompound tag = fakePlayer.getEntityData(); + + tag.setBoolean("isPacifistsBench", true); + + tag.setInteger("x", xCoord); + tag.setInteger("y", yCoord); + tag.setInteger("z", zCoord); + + return fakePlayer; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPortalUnderWorld.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPortalUnderWorld.java new file mode 100644 index 00000000..ff5f1d6b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPortalUnderWorld.java @@ -0,0 +1,54 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; + +public class TileEntityPortalUnderWorld extends TileEntity { + + /// Only set for outside->underworld portals + /// Underworld->outside uses [UnderWorldSourceProperty] instead of looking for a specific block. + public int destX, destY, destZ; + public boolean hasDest, invulnerable; + + @Override + public void readFromNBT(NBTTagCompound compound) { + super.readFromNBT(compound); + + this.destX = compound.getInteger("destX"); + this.destY = compound.getInteger("destY"); + this.destZ = compound.getInteger("destZ"); + this.hasDest = compound.getBoolean("hasDest"); + this.invulnerable = compound.getBoolean("invulnerable"); + } + + @Override + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + + compound.setInteger("destX", destX); + compound.setInteger("destY", destY); + compound.setInteger("destZ", destZ); + compound.setBoolean("hasDest", hasDest); + compound.setBoolean("invulnerable", invulnerable); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound data = new NBTTagCompound(); + + data.setBoolean("invulnerable", invulnerable); + + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, data); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + super.onDataPacket(net, pkt); + + invulnerable = pkt.func_148857_g() + .getBoolean("invulnerable"); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPureLove.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPureLove.java new file mode 100644 index 00000000..14d03da7 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityPureLove.java @@ -0,0 +1,47 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import static net.minecraft.util.AxisAlignedBB.getBoundingBox; + +import java.util.List; + +import net.minecraft.command.IEntitySelector; +import net.minecraft.entity.Entity; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; + +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; + +public class TileEntityPureLove extends TileEntity { + + private static final long UPDATE_INTERVAL_IN_TICKS = 100; // 5 seconds + private static final SelectNotInLove selector = new SelectNotInLove(); + + @Override + public void updateEntity() { + if (this.worldObj != null && !this.worldObj.isRemote + && this.worldObj.getTotalWorldTime() % UPDATE_INTERVAL_IN_TICKS == 0L) { + int range = BlockConfig.pureLove.rangePureLove; + AxisAlignedBB boundingBox = getBoundingBox( + xCoord - range, + yCoord - range, + zCoord - range, + xCoord + range, + yCoord + range, + zCoord + range); + List entityAnimals = worldObj + .selectEntitiesWithinAABB(EntityAnimal.class, boundingBox, selector); + for (EntityAnimal animal : entityAnimals) { + animal.func_146082_f(null); // Put in love mode with no player responsible + } + } + } + + private static class SelectNotInLove implements IEntitySelector { + + @Override + public boolean isEntityApplicable(Entity entity) { + return entity instanceof EntityAnimal animal && !animal.isInLove() && animal.getGrowingAge() == 0; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRadicallyReducedChest.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRadicallyReducedChest.java new file mode 100644 index 00000000..600f5f90 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRadicallyReducedChest.java @@ -0,0 +1,80 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.LimitingItemStackHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; + +public class TileEntityRadicallyReducedChest extends TileEntitySignificantlyShrunkChest + implements IGuiHolder, ISidedInventory { + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + + SlotGroup slotGroup = new SlotGroup("radically_reduced_chest_inv", 1); + + ModularPanel panel = new ModularPanel("panel"); + panel.bindPlayerInventory(); + + // Add title + panel.child( + new ParentWidget<>().coverChildren() + .topRelAnchor(0, 1) + .child( + IKey.str(StatCollector.translateToLocal(getInventoryName())) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15))); + + IItemHandler itemHandler = new LimitingItemStackHandler(chestContents, 1); + ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); + + // Add item slot + panel.child( + new Grid().coverChildren() + .pos(79, 34) + .mapTo(1, 1, index -> new ItemSlot().slot(slot))); + + return panel; + } + + @Override + public String getInventoryName() { + return "tile.radically_reduced_chest.name"; + } + + @Override + public int[] getAccessibleSlotsFromSide(int p_94128_1_) { + return new int[] { 0 }; + } + + @Override + public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { + return chestContents[0] == null; + } + + @Override + public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { + return true; + } + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + return chestContents[0] == null; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRainMuffler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRainMuffler.java new file mode 100644 index 00000000..ce6d245a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRainMuffler.java @@ -0,0 +1,73 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.ISound; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraftforge.client.event.sound.PlaySoundEvent17; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.fouristhenumber.utilitiesinexcess.network.PacketHandler; +import com.fouristhenumber.utilitiesinexcess.network.client.PacketRainMuffledSync; +import com.gtnewhorizon.gtnhlib.eventbus.EventBusSubscriber; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.PlayerEvent; +import cpw.mods.fml.relauncher.Side; + +@EventBusSubscriber(side = Side.CLIENT) +public class TileEntityRainMuffler extends TileEntitySoundMuffler { + + public static final String NBT_RAIN_MUFFLED = "RainMuffledUIX"; + + @Override + public void enableMuffler() { + UtilitiesInExcess.proxy.soundVolumeChecks.putRainMuffler(worldObj.provider.dimensionId, xCoord, yCoord, zCoord); + } + + @Override + public void disableMuffler() { + UtilitiesInExcess.proxy.soundVolumeChecks + .removeRainMuffler(worldObj.provider.dimensionId, xCoord, yCoord, zCoord); + } + + @EventBusSubscriber.Condition + public static boolean shouldEventBusSubscribe() { + return BlockConfig.rainMuffler.enableRainMuffler; + } + + @SubscribeEvent + public static void muffleRain(PlaySoundEvent17 event) { + + ISound sound = event.sound; + if (!sound.getPositionedSoundLocation() + .getResourcePath() + .equals("ambient.weather.rain")) return; + + EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; + if (player == null) return; + + double x = Math.floor(sound.getXPosF()); + double y = Math.floor(sound.getYPosF()); + double z = Math.floor(sound.getZPosF()); + + if (player.getEntityData() + .getCompoundTag(EntityClientPlayerMP.PERSISTED_NBT_TAG) + .getBoolean(NBT_RAIN_MUFFLED) + || UtilitiesInExcess.proxy.soundVolumeChecks.isInRainMufflerRange(player.dimension, x, y, z)) { + event.result = null; + } + } + + @SubscribeEvent + public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { + if (event.player instanceof EntityPlayerMP playerMP) { + boolean rainMuffled = event.player.getEntityData() + .getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG) + .getBoolean(NBT_RAIN_MUFFLED); + PacketHandler.INSTANCE.sendTo(new PacketRainMuffledSync(rainMuffled), playerMP); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRedstoneClock.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRedstoneClock.java new file mode 100644 index 00000000..301216d6 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRedstoneClock.java @@ -0,0 +1,70 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +public class TileEntityRedstoneClock extends TileEntity { + + private boolean powered = false; + private boolean outputOn = false; + private int timer = 0; + private final int TIMER_FREQUENCY_IN_TICKS = 20; + + @Override + public void updateEntity() { + if (worldObj.isRemote) return; + + if (!powered) { + timer = (timer + 1) % TIMER_FREQUENCY_IN_TICKS; + boolean newState = (timer < 2); + if (newState != outputOn) { + outputOn = newState; + notifyNeighbors(); + } + } else { + if (outputOn) { + outputOn = false; + notifyNeighbors(); + } + timer = 0; + } + } + + public void onInputChanged() { + boolean nowPowered = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); + if (nowPowered != powered) { + powered = nowPowered; + if (powered) { + outputOn = false; + notifyNeighbors(); + } + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord), 1); + } + } + + // Return 0 or 15 for our block’s power output + public int getOutputPower() { + return outputOn ? 15 : 0; + } + + private void notifyNeighbors() { + worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord)); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + powered = nbt.getBoolean("powered"); + outputOn = nbt.getBoolean("outputOn"); + timer = nbt.getInteger("timer"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setBoolean("powered", powered); + nbt.setBoolean("outputOn", outputOn); + nbt.setInteger("timer", timer); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySignificantlyShrunkChest.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySignificantlyShrunkChest.java new file mode 100644 index 00000000..25f1aea9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySignificantlyShrunkChest.java @@ -0,0 +1,63 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.util.StatCollector; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; + +public class TileEntitySignificantlyShrunkChest extends TileEntityMarginallyMaximisedChest + implements IGuiHolder { + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + + SlotGroup slotGroup = new SlotGroup("significantly_shrunk_chest_inv", 1); + + ModularPanel panel = new ModularPanel("panel"); + panel.bindPlayerInventory(); + + // Add title + panel.child( + new ParentWidget<>().coverChildren() + .topRelAnchor(0, 1) + .child( + IKey.str(StatCollector.translateToLocal(getInventoryName())) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15))); + + IItemHandler itemHandler = new InvWrapper(this); + ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); + + // Add item slot + panel.child( + new Grid().coverChildren() + .pos(79, 34) + .mapTo(1, 1, index -> new ItemSlot().slot(slot))); + + return panel; + } + + @Override + public int getSizeInventory() { + return 1; + } + + @Override + public String getInventoryName() { + return "tile.significantly_shrunk_chest.name"; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySmartPump.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySmartPump.java new file mode 100644 index 00000000..1e04def2 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySmartPump.java @@ -0,0 +1,300 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.uieInstance; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidBlock; +import net.minecraftforge.fluids.IFluidHandler; + +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; + +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyReceiver; + +public class TileEntitySmartPump extends TileEntity implements IEnergyReceiver, IFluidHandler { + + private ForgeChunkManager.Ticket ticket; + + protected EnergyStorage energyStorage = new EnergyStorage(BlockConfig.smartPumpEnergyStorage); + + boolean stalled = false; + boolean finished = false; + + private int chunkX; + private int chunkZ; + + private byte xInChunk = 0; + private byte zInChunk = 0; + + private int currentY = Integer.MIN_VALUE; + + private byte currentChunk = 0; + + FluidTank tank = new FluidTank(1000); + + private static final int[][] CHUNK_OFFSETS = { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 }, { 0, 2 }, + { 1, 1 }, { 2, 0 }, { 1, -1 }, { 0, -2 }, { -1, -1 }, { -2, 0 }, { -1, 1 }, { 0, 3 }, { 1, 2 }, { 2, 1 }, + { 3, 0 }, { 2, -1 }, { 1, -2 }, { 0, -3 }, { -1, -2 }, { -2, -1 }, { -3, 0 }, { -2, 1 }, { -1, 2 }, { 0, 4 }, + { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 }, { 3, -1 }, { 2, -2 }, { 1, -3 }, { 0, -4 }, { -1, -3 }, { -2, -2 }, + { -3, -1 }, { -4, 0 }, { -3, 1 }, { -2, 2 }, { -1, 3 }, { 0, 5 }, { 1, 4 }, { 2, 3 }, { 3, 2 }, { 4, 1 }, + { 5, 0 }, { 4, -1 }, { 3, -2 }, { 2, -3 }, { 1, -4 }, { 0, -5 }, { -1, -4 }, { -2, -3 }, { -3, -2 }, { -4, -1 }, + { -5, 0 }, { -4, 1 }, { -3, 2 }, { -2, 3 }, { -1, 4 } }; + + @Override + public void updateEntity() { + if (worldObj.isRemote || finished) return; + + if (ticket == null) { + requestTicket(); + ForgeChunkManager.forceChunk(ticket, new ChunkCoordIntPair(chunkX, chunkZ)); + } + + if (currentY == Integer.MIN_VALUE) { + currentY = yCoord - 1; + chunkX = xCoord >> 4; + chunkZ = zCoord >> 4; + } + if (!stalled || worldObj.getTotalWorldTime() % BlockConfig.smartPumpStallCooldownInTicks == 0) { + stalled = false; + + if (tank.getFluidAmount() > 0) { + if (worldObj.getTileEntity(xCoord, yCoord + 1, zCoord) instanceof IFluidHandler fluidHandler) { + int canDrain = fluidHandler.fill(ForgeDirection.DOWN, tank.getFluid(), false); + fluidHandler.fill( + ForgeDirection.DOWN, + drain( + ForgeDirection.UP, + new FluidStack( + tank.getFluid() + .getFluid(), + canDrain), + true), + true); + } + } + + scanStep(); + } + } + + private void scanStep() { + int worldX = ((chunkX + CHUNK_OFFSETS[currentChunk][0]) * 16) + xInChunk; + int worldZ = ((chunkZ + CHUNK_OFFSETS[currentChunk][1]) * 16) + zInChunk; + + Block block = worldObj.getBlock(worldX, currentY, worldZ); + FluidStack fluid; + + if (getEnergyStored(ForgeDirection.UNKNOWN) < BlockConfig.smartPumpEnergyUsePerBlock) { + stalled = true; + return; + } + + // Gotta hardcode the vanilla ones ugh + if (block == Blocks.water) { + fluid = new FluidStack(FluidRegistry.WATER, 1000); + } else if (block == Blocks.lava) { + fluid = new FluidStack(FluidRegistry.LAVA, 1000); + } else if (block instanceof IFluidBlock fluidBlock) { + fluid = fluidBlock.drain(worldObj, worldX, currentY, worldZ, false); + } else { + advanceColumn(); + return; + } + + energyStorage.extractEnergy(BlockConfig.smartPumpEnergyUsePerBlock, true); + + if (tank.fill(fluid, false) >= fluid.amount) { + tank.fill(fluid, true); + + worldObj.setBlock(worldX, currentY, worldZ, Blocks.stone, 1, 2); + currentY--; + + if (currentY < 0) { + advanceColumn(); + } + } else { + stalled = true; + } + } + + private void advanceColumn() { + currentY = yCoord - 1; + + xInChunk++; + + if (xInChunk >= 16) { + xInChunk = 0; + zInChunk++; + + if (zInChunk >= 16) { + + // Release old chunk + ForgeChunkManager.unforceChunk( + ticket, + new ChunkCoordIntPair( + chunkX + CHUNK_OFFSETS[currentChunk][0], + chunkZ + CHUNK_OFFSETS[currentChunk][1])); + + if (currentChunk < CHUNK_OFFSETS.length - 1) { + zInChunk = 0; + currentChunk++; + + // Load new chunk + ForgeChunkManager.forceChunk( + ticket, + new ChunkCoordIntPair( + chunkX + CHUNK_OFFSETS[currentChunk][0], + chunkZ + CHUNK_OFFSETS[currentChunk][1])); + + } else { + finished = true; + + // Release own chunk + ForgeChunkManager.unforceChunk(ticket, new ChunkCoordIntPair(chunkX, chunkZ)); + } + } + } + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + + tag.setBoolean("finished", finished); + tag.setByte("xInChunk", xInChunk); + tag.setByte("zInChunk", zInChunk); + tag.setInteger("chunkX", chunkX); + tag.setInteger("chunkZ", chunkZ); + tag.setInteger("currentY", currentY); + tag.setByte("currentChunk", currentChunk); + + energyStorage.writeToNBT(tag); + tank.writeToNBT(tag); + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + + finished = tag.getBoolean("finished"); + xInChunk = tag.getByte("xInChunk"); + zInChunk = tag.getByte("zInChunk"); + chunkX = tag.getInteger("chunkX"); + chunkZ = tag.getInteger("chunkZ"); + currentY = tag.getInteger("currentY"); + currentChunk = tag.getByte("currentChunk"); + + energyStorage.readFromNBT(tag); + tank.readFromNBT(tag); + } + + // Chunkloading stuff + private void requestTicket() { + ticket = ForgeChunkManager.requestTicket(uieInstance, worldObj, ForgeChunkManager.Type.NORMAL); + + if (ticket != null) { + NBTTagCompound tag = ticket.getModData(); + tag.setInteger("teX", xCoord); + tag.setInteger("teY", yCoord); + tag.setInteger("teZ", zCoord); + } + } + + // Called when world reloads + public void receiveTicketOnLoad(ForgeChunkManager.Ticket t) { + this.ticket = t; + if (!finished) { + ForgeChunkManager.forceChunk(ticket, new ChunkCoordIntPair(chunkX, chunkZ)); + ForgeChunkManager.forceChunk( + ticket, + new ChunkCoordIntPair( + chunkX + CHUNK_OFFSETS[currentChunk][0], + chunkZ + CHUNK_OFFSETS[currentChunk][1])); + } + } + + @Override + public void invalidate() { + super.invalidate(); + unload(); + } + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + unload(); + } + + private void unload() { + if (ticket != null) { + ForgeChunkManager.releaseTicket(ticket); + ticket = null; + } + } + + // IEnergyReceiver + @Override + public int receiveEnergy(ForgeDirection forgeDirection, int i, boolean b) { + return energyStorage.receiveEnergy(i, b); + } + + @Override + public int getEnergyStored(ForgeDirection forgeDirection) { + return energyStorage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection forgeDirection) { + return energyStorage.getMaxEnergyStored(); + } + + @Override + public boolean canConnectEnergy(ForgeDirection forgeDirection) { + return true; + } + + // IFluidHandler + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + return 0; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + if (resource == null || !resource.isFluidEqual(tank.getFluid())) { + return null; + } + return tank.drain(resource.amount, doDrain); + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + return tank.drain(maxDrain, doDrain); + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) { + return false; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) { + return true; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) { + return new FluidTankInfo[] { tank.getInfo() }; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySoundMuffler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySoundMuffler.java new file mode 100644 index 00000000..34a29a37 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySoundMuffler.java @@ -0,0 +1,169 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.ISound; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.sound.PlaySoundEvent17; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.gtnewhorizon.gtnhlib.eventbus.EventBusSubscriber; + +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; + +@EventBusSubscriber(side = Side.CLIENT) +public class TileEntitySoundMuffler extends TileEntity { + + boolean active; + + public void enableMuffler() { + UtilitiesInExcess.proxy.soundVolumeChecks + .putSoundMuffler(worldObj.provider.dimensionId, xCoord, yCoord, zCoord); + } + + public void disableMuffler() { + UtilitiesInExcess.proxy.soundVolumeChecks + .removeSoundMuffler(worldObj.provider.dimensionId, xCoord, yCoord, zCoord); + } + + @Override + public boolean canUpdate() { + return false; + } + + public void onInputChanged() { + if (worldObj.isRemote) return; + + boolean redstonePowered = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); + // Check our redstone state has changed + if (redstonePowered == active) { + active = !redstonePowered; + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + markDirty(); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + active = nbt.getBoolean("active"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setBoolean("active", active); + } + + @Override + public void invalidate() { + if (worldObj.isRemote) { + disableMuffler(); + } + super.invalidate(); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound tag = new NBTTagCompound(); + this.writeToNBT(tag); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, tag); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); + if (worldObj.isRemote) { + if (active) enableMuffler(); + else disableMuffler(); + } + } + + @EventBusSubscriber.Condition + public static boolean shouldEventBusSubscribe() { + return BlockConfig.soundMuffler.enableSoundMuffler; + } + + @SubscribeEvent(priority = EventPriority.HIGH) + public static void muffleSound(PlaySoundEvent17 event) { + + ISound sound = event.sound; + + EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; + if (player == null) return; + + double x = Math.floor(sound.getXPosF()); + double y = Math.floor(sound.getYPosF()); + double z = Math.floor(sound.getZPosF()); + + if (UtilitiesInExcess.proxy.soundVolumeChecks.isInSoundMufflerRange(player.dimension, x, y, z)) { + float reduction = BlockConfig.soundMuffler.soundMufflerReduction / 100f; + event.result = new MuffledSound(event.sound, reduction); + player.worldObj.spawnParticle("smoke", sound.getXPosF(), sound.getYPosF(), sound.getZPosF(), 0, 0.03, 0); + } + } + + private static class MuffledSound implements ISound { + + ISound base; + float reduction; + + MuffledSound(ISound base, float reduction) { + this.base = base; + this.reduction = reduction; + } + + @Override + public float getVolume() { + return base.getVolume() * reduction; + } + + @Override + public ResourceLocation getPositionedSoundLocation() { + return base.getPositionedSoundLocation(); + } + + @Override + public boolean canRepeat() { + return base.canRepeat(); + } + + @Override + public int getRepeatDelay() { + return base.getRepeatDelay(); + } + + @Override + public float getPitch() { + return base.getPitch(); + } + + @Override + public float getXPosF() { + return base.getXPosF(); + } + + @Override + public float getYPosF() { + return base.getYPosF(); + } + + @Override + public float getZPosF() { + return base.getZPosF(); + } + + @Override + public AttenuationType getAttenuationType() { + return base.getAttenuationType(); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySpike.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySpike.java new file mode 100644 index 00000000..d13ec1c6 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntitySpike.java @@ -0,0 +1,94 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import java.util.UUID; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.FakePlayerFactory; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockSpike; +import com.google.common.collect.Multimap; +import com.mojang.authlib.GameProfile; + +public class TileEntitySpike extends TileEntity { + + private ItemStack fakeWeapon = null; + private BlockSpike.SpikeType spikeType; + + public TileEntitySpike() {} + + public TileEntitySpike(BlockSpike.SpikeType spikeType) { + this.spikeType = spikeType; + } + + public void setFakeWeapon(ItemStack stack) { + this.fakeWeapon = stack; + markDirty(); + } + + public ItemStack getFakeWeapon() { + return fakeWeapon; + } + + public void damageEntity(Entity entity) { + if (worldObj.isRemote || entity == null || fakeWeapon == null) return; + + FakePlayer fakePlayer = FakePlayerFactory.get( + (WorldServer) worldObj, + new GameProfile(UUID.nameUUIDFromBytes("UIE_Spike".getBytes()), "[UIE Spike]")); + + fakePlayer.setCurrentItemOrArmor(0, fakeWeapon.copy()); + + Multimap modifiers = fakeWeapon.getAttributeModifiers(); + fakePlayer.getAttributeMap() + .applyAttributeModifiers(modifiers); + + double prevMotionX = entity.motionX; + double prevMotionY = entity.motionY; + double prevMotionZ = entity.motionZ; + + fakePlayer.attackTargetEntityWithCurrentItem(entity); + + entity.motionX = prevMotionX; + entity.motionY = prevMotionY; + entity.motionZ = prevMotionZ; + + fakePlayer.setCurrentItemOrArmor(0, null); + } + + public BlockSpike.SpikeType getSpikeType() { + return spikeType; + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + if (tag.hasKey("FakeWeapon")) { + fakeWeapon = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("FakeWeapon")); + } + + if (tag.hasKey("SpikeType")) { + try { + spikeType = BlockSpike.SpikeType.valueOf(tag.getString("SpikeType")); + } catch (IllegalArgumentException e) { + spikeType = BlockSpike.SpikeType.WOOD; + } + } + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + if (fakeWeapon != null) { + NBTTagCompound weaponTag = new NBTTagCompound(); + fakeWeapon.writeToNBT(weaponTag); + tag.setTag("FakeWeapon", weaponTag); + } + tag.setString("SpikeType", spikeType.name()); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTradingPost.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTradingPost.java new file mode 100644 index 00000000..a9536a8d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTradingPost.java @@ -0,0 +1,270 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.EntityAgeable; +import net.minecraft.entity.IMerchant; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.StatCollector; + +import org.jetbrains.annotations.NotNull; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.GuiDraw; +import com.cleanroommc.modularui.drawable.GuiTextures; +import com.cleanroommc.modularui.drawable.text.StringKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.ModularScreen; +import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; +import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widget.scroll.ScrollArea; +import com.cleanroommc.modularui.widget.scroll.ScrollData; +import com.cleanroommc.modularui.widget.scroll.VerticalScrollData; +import com.cleanroommc.modularui.widgets.ListWidget; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.layout.Column; +import com.cleanroommc.modularui.widgets.layout.Row; +import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.compat.mui.tradingpost.SearchBar; +import com.fouristhenumber.utilitiesinexcess.compat.mui.tradingpost.VillagerColumn; +import com.fouristhenumber.utilitiesinexcess.compat.mui.tradingpost.VillagerEntityDisplay; +import com.fouristhenumber.utilitiesinexcess.compat.mui.tradingpost.VillagerWidget; +import com.gtnewhorizon.gtnhlib.client.VillagerNames; + +public class TileEntityTradingPost extends TileEntity implements IGuiHolder { + + public static ArrayList villagerColumns; + + // Trading post UI heirarchy: + // panel > mainColumn > (topRow > villagercount) - (TradeList > tradeListRow > + // 3x(VillagerColumn > VillagerWidget > TradeWidget)) + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + villagerColumns = new ArrayList<>(); + + TradingPostPanel panel = new TradingPostPanel("uie:trading_post"); + panel.height(226) + .width(259); + Column mainColumn = new Column(); + mainColumn.height(229) + .width(265) + .pos(0, 0) + .paddingRight(2) + .childPadding(0); + + TradeList tradeList = new TradeList().coverChildrenWidth() + .height(125) + .pos(6, 15); + Row tradeListRow = new Row(); + tradeListRow.coverChildren() + .childPadding(3) + .left(0); + for (int i = 0; i < 3; i++) { + VillagerColumn columnOfVillagers = new VillagerColumn(); + columnOfVillagers.alignY(0) + .coverChildren() + .childPadding(3); + + villagerColumns.add(columnOfVillagers); + + tradeListRow.child(columnOfVillagers); + } + + List merchants = getMerchants(); + int i = 0; + for (IMerchant merchant : merchants) { + VillagerWidget villagerTrades = new VillagerWidget( + guiData, + guiSyncManager, + merchant, + ((VillagerColumn) tradeListRow.getChildren() + .get(i))); + + villagerTrades.tradingPostPanel(panel) + .setColumnNumber(i) + .coverChildren() + .childPadding(3); + + ((VillagerColumn) tradeListRow.getChildren() + .get(i)).child(villagerTrades); + + i = i < 2 ? i + 1 : 0; + } + tradeList.child(tradeListRow); + + Row topRow = new Row(); + topRow.alignX(0) + .coverChildrenWidth() + .height(10); + topRow.child( + new HelpWidget().top(2) + .left(1) + .size(12) + .paddingRight(2) + .tooltipBuilder(TileEntityTradingPost::buildHelpToolTip)); + topRow.child( + IKey.str(StatCollector.translateToLocalFormatted("tile.trading_post.villager_count", merchants.size())) + .asWidget() + .left(14) + .top(4)); + panel.child( + new SearchBar().villagerParent(tradeListRow) + .alignX(1) + .alignY(0) + .top(4) + .right(1) + .height(10) + .width(70)); + + mainColumn.child(topRow); + mainColumn.child( + tradeList.margin(5, 5) + .marginRight(10)); + Row bottomRow = new Row(); + bottomRow.coverChildrenHeight() + .width(259) + .pos(0, 229 - 85); + + var inventory = SlotGroupWidget.playerInventory(0, false); + bottomRow.child( + inventory.marginBottom(6) + .paddingRight(6) + .alignX(1)); + bottomRow.child( + new VillagerEntityDisplay(() -> VillagerWidget.lastVillager).left(26) + .bottom(20)); + bottomRow.child( + new Row().child( + new MerchantNameKey().asWidget() + .center()) + .width(86) + .height(26) + .alignY(1)); + mainColumn.child(bottomRow); + panel.child(mainColumn); + return panel; + } + + public List getMerchants() { + // Baby villagers shouldn't trade :P + AxisAlignedBB boundingBox = getBlockType().getCollisionBoundingBoxFromPool(worldObj, xCoord, yCoord, zCoord) + .expand(32, this.worldObj.getHeight(), 32); + return this.worldObj.selectEntitiesWithinAABB(IMerchant.class, boundingBox, entity -> { + if (entity instanceof EntityAgeable ageable) return ageable.getGrowingAge() >= 0; + return true; + }); + } + + public static class TradeList extends ListWidget { + + @Override + public void onInit() { + if (getScrollData() == null) { + scrollDirection(new TradeListScrollData()); + } + } + } + + public static class TradeListScrollData extends VerticalScrollData { + + // For some reason for the first couple of frames the scroll bar is in the wrong position + // I've seen this phenomenon in other people's PRs, but I don't know if this is an MUI2 bug or not + // So for now, I'm just going to hard-code it's x position. + @Override + public void drawScrollbar(ScrollArea area, ModularGuiContext context, WidgetTheme widgetTheme, + IDrawable texture) { + boolean isOtherActive = isOtherScrollBarActive(area, true); + int l = this.getScrollBarLength(area); + int y = 0; + int w = getThickness(); + int h = area.height; + GuiDraw.drawRect(243, y, w, h, area.getScrollBarBackgroundColor()); + + y = getScrollBarStart(area, l, isOtherActive); + ScrollData data2 = getOtherScrollData(area); + if (data2 != null && isOtherActive && data2.isOnAxisStart()) { + y += data2.getThickness(); + } + h = l; + drawScrollBar(context, 243, y, w, h, widgetTheme, texture); + } + } + + public static class HelpWidget extends Widget { + + @Override + public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { + super.draw(context, widgetTheme); + Color.setGlColorOpaque(Color.BLUE.main); + GuiTextures.HELP.draw(0, 0, 12, 12); + } + } + + public static void buildHelpToolTip(RichTooltip tooltip) { + tooltip.addLine(StatCollector.translateToLocal("tile.trading_post.help_tooltip.0")); + tooltip.addLine(StatCollector.translateToLocal("tile.trading_post.help_tooltip.1")); + tooltip.addLine(StatCollector.translateToLocal("tile.trading_post.help_tooltip.2")); + tooltip.addLine(StatCollector.translateToLocal("tile.trading_post.help_tooltip.3")); + if (Mods.FindIt.isLoaded()) tooltip.addLine(StatCollector.translateToLocal("tile.trading_post.help_tooltip.4")); + tooltip.addLine("§7"); // If the line is empty it gets skipped + tooltip.addLine(StatCollector.translateToLocal("tile.trading_post.help_tooltip.5")); + tooltip.addLine(StatCollector.translateToLocal("tile.trading_post.help_tooltip.6")); + tooltip.addLine(StatCollector.translateToLocal("tile.trading_post.help_tooltip.7")); + tooltip.addLine(StatCollector.translateToLocal("tile.trading_post.help_tooltip.8")); + } + + public class TradingPostPanel extends ModularPanel { + + // I love boiler-plate code + public TradingPostPanel(@NotNull String name) { + super(name); + } + + public int[] columnCounts = new int[3]; + + @Override + public void onOpen(ModularScreen screen) { + super.onOpen(screen); + + // These are used to keep track of how many villagers are in each column while initializing + // the villager widgets + columnCounts = new int[3]; + } + } + + public class MerchantNameKey extends StringKey { + + public MerchantNameKey() { + super(""); + } + + @Override + public String get() { + if (VillagerWidget.lastVillager instanceof EntityVillager villager) { + return getVillagerDisplayName(villager); + } + + return ""; + } + } + + public static String getVillagerDisplayName(EntityVillager villager) { + String key = "description.villager.profession." + VillagerNames.getVillagerName(villager.getProfession()); + if (StatCollector.canTranslate(key)) { + return StatCollector.translateToLocal(key); + } + return ""; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanEnergy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanEnergy.java new file mode 100644 index 00000000..8b21a56a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanEnergy.java @@ -0,0 +1,29 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +import cofh.api.energy.IEnergyReceiver; + +public class TileEntityTrashCanEnergy extends TileEntity implements IEnergyReceiver { + + @Override + public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) { + return maxReceive; + } + + @Override + public int getEnergyStored(ForgeDirection from) { + return 0; + } + + @Override + public int getMaxEnergyStored(ForgeDirection from) { + return Integer.MAX_VALUE; + } + + @Override + public boolean canConnectEnergy(ForgeDirection from) { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanFluid.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanFluid.java new file mode 100644 index 00000000..e712ef73 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanFluid.java @@ -0,0 +1,267 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.ItemStackHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; + +public class TileEntityTrashCanFluid extends TileEntity + implements IGuiHolder, ISidedInventory, IFluidHandler { + + public final ItemStack[] mInventory; + private final ItemStackHandler inventoryHandler; + + public final int INPUT_SLOT = 0; + public final int OUTPUT_SLOT = 1; + + public TileEntityTrashCanFluid() { + mInventory = new ItemStack[] { null, null }; + inventoryHandler = new ItemStackHandler(mInventory) { + + @Override + protected void onContentsChanged(int slot) { + ItemStack inputStack = this.getStackInSlot(INPUT_SLOT); + if (inputStack == null || !isValidItemInput(inputStack)) return; + + ItemStack drainedStack = FluidContainerRegistry.drainFluidContainer(inputStack); + if (drainedStack == null) return; + + ItemStack outputStack = this.getStackInSlot(OUTPUT_SLOT); + if (outputStack != null && !outputStack.getItem() + .equals(drainedStack.getItem())) return; + // We interface directly with the inventory here, since interfacing with the inventoryHandler + // would call onContentsChanged again. + int inserted; + if (outputStack == null) { + inserted = inputStack.stackSize; + drainedStack.stackSize = inserted; + mInventory[OUTPUT_SLOT] = drainedStack; + } else { + // Make sure we don't insert more than stackLimit + // aka, outputStack.stackSize += stackLimit - outputStack.stackSize <= stackLimit + int stackLimit = drainedStack.getMaxStackSize(); + inserted = Math.min(stackLimit - outputStack.stackSize, inputStack.stackSize); + outputStack.stackSize += inserted; + } + inputStack.stackSize -= inserted; + if (inputStack.stackSize <= 0) { + mInventory[INPUT_SLOT] = null; + } + } + }; + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + + syncManager.registerSlotGroup("item_inv", 0); + + ModularPanel panel = new ModularPanel("panel"); + panel.bindPlayerInventory(); + + // Add title + panel.child( + new ParentWidget<>().coverChildren() + .topRelAnchor(0, 1) + .child( + IKey.str(StatCollector.translateToLocal("tile.trash_can_fluid.name")) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15))); + + IWidget slots = Flow.column() + .childPadding(10) + .coverChildren() + .child( + new ItemSlot().slot( + new ModularSlot(inventoryHandler, INPUT_SLOT).slotGroup("item_inv") + .filter(TileEntityTrashCanFluid::isValidItemInput))) + .pos(79, 25) + .child( + new ItemSlot().slot( + new ModularSlot(inventoryHandler, OUTPUT_SLOT).slotGroup("item_inv") + .accessibility(false, true))); + + return panel.child(slots); + } + + @Override + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + ItemStack stackIn = mInventory[INPUT_SLOT]; + if (stackIn != null) { + NBTTagCompound slotIn = new NBTTagCompound(); + stackIn.writeToNBT(slotIn); + compound.setTag("slotIn", slotIn); + } + + ItemStack stackOut = mInventory[OUTPUT_SLOT]; + if (stackOut != null) { + NBTTagCompound slotOut = new NBTTagCompound(); + stackOut.writeToNBT(slotOut); + compound.setTag("slotOut", slotOut); + } + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + UtilitiesInExcess.LOG.info(compound); + super.readFromNBT(compound); + if (compound.hasKey("slotIn")) { + ItemStack slotIn = new ItemStack(Items.feather, 1); + slotIn.readFromNBT(compound.getCompoundTag("slotIn")); + mInventory[INPUT_SLOT] = slotIn; + } + if (compound.hasKey("slotOut")) { + ItemStack slotOut = new ItemStack(Items.feather, 1); + slotOut.readFromNBT(compound.getCompoundTag("slotOut")); + mInventory[OUTPUT_SLOT] = slotOut; + } + } + + // Item Handler Methods + @Override + public int getSizeInventory() { + return inventoryHandler.getSlots(); + } + + @Override + public ItemStack getStackInSlot(int slot) { + return inventoryHandler.getStackInSlot(slot); + } + + @Override + public ItemStack decrStackSize(int index, int count) { + return inventoryHandler.extractItem(index, count, false); + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) { + return null; + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) { + inventoryHandler.setStackInSlot(index, stack); + } + + @Override + public String getInventoryName() { + return StatCollector.translateToLocal("tile.trash_can_fluid.name"); + } + + @Override + public boolean hasCustomInventoryName() { + return true; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return false; + } + + @Override + public void openInventory() { + + } + + @Override + public void closeInventory() { + + } + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + if (index == INPUT_SLOT) return isValidItemInput(stack); + return false; + } + + @Override + public int[] getAccessibleSlotsFromSide(int p_94128_1_) { + return new int[] { INPUT_SLOT, OUTPUT_SLOT }; + } + + @Override + public boolean canInsertItem(int slot, ItemStack item, int side) { + return slot == INPUT_SLOT && isValidItemInput(item) + && !(item.equals(inventoryHandler.insertItem(slot, item, true))); + } + + @Override + public boolean canExtractItem(int slot, ItemStack item, int side) { + if (slot != OUTPUT_SLOT) return false; + if (item == null) return false; + if (inventoryHandler.getStackInSlot(slot) + .getItem() != item.getItem()) return false; + ItemStack extractedStack = inventoryHandler.extractItem(slot, item.stackSize, true); + return extractedStack != null && extractedStack.stackSize > 0; + } + + // Fluid Handler Methods + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + int amount = resource.amount; + if (doFill) resource.amount = 0; + return amount; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + return null; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + return null; + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) { + return true; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) { + return false; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) { + return new FluidTankInfo[] { new FluidTankInfo(null, Integer.MAX_VALUE) }; + } + + public static boolean isValidItemInput(ItemStack itemStack) { + return FluidContainerRegistry.isFilledContainer(itemStack); + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanItem.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanItem.java new file mode 100644 index 00000000..0c8bd21e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanItem.java @@ -0,0 +1,144 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; +import com.fouristhenumber.utilitiesinexcess.utils.VoidingInventory; + +public class TileEntityTrashCanItem extends TileEntity implements IGuiHolder, ISidedInventory { + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + + SlotGroup slotGroup = new SlotGroup("trash_can_inv", 1); + + ModularPanel panel = new ModularPanel("panel"); + panel.bindPlayerInventory(); + + // Add title + panel.child( + new ParentWidget<>().coverChildren() + .topRelAnchor(0, 1) + .child( + IKey.str(StatCollector.translateToLocal("tile.trash_can_item.name")) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15))); + + // Create voiding inventory + IInventory inv = new VoidingInventory(1, "Trash Can"); + IItemHandler itemHandler = new InvWrapper(inv); + ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); + + // Add item slot + panel.child( + new Grid().coverChildren() + .pos(79, 34) + .mapTo(1, 1, index -> new ItemSlot().slot(slot))); + + return panel; + } + + @Override + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + super.readFromNBT(compound); + } + + @Override + public int getSizeInventory() { + return 999; + } + + @Override + public ItemStack getStackInSlot(int slotIn) { + return null; + } + + @Override + public ItemStack decrStackSize(int index, int count) { + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) { + return null; + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) {} + + @Override + public String getInventoryName() { + return StatCollector.translateToLocal("tile.trash_can_item.name"); + } + + @Override + public boolean hasCustomInventoryName() { + return true; + } + + @Override + public int getInventoryStackLimit() { + return 999; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return false; + } + + @Override + public void openInventory() { + + } + + @Override + public void closeInventory() { + + } + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + return true; + } + + @Override + public int[] getAccessibleSlotsFromSide(int p_94128_1_) { + return new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + } + + @Override + public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { + return true; + } + + @Override + public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGenerator.java new file mode 100644 index 00000000..63398a9c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGenerator.java @@ -0,0 +1,255 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import static com.fouristhenumber.utilitiesinexcess.utils.UIEUtils.formatNumber; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.UITexture; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.ProgressWidget; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockBaseGenerator; + +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyProvider; +import cofh.api.energy.IEnergyReceiver; + +public abstract class TileEntityBaseGenerator extends TileEntity implements IEnergyProvider, IGuiHolder { + + protected EnergyStorage energyStorage; + protected int burnTime; + protected int currentFuelBurnTime; + protected int currentRFPerTick; + protected boolean isBurning; + public int multiplier = -1; + + protected IEnergyReceiver[] connectedReceivers = new IEnergyReceiver[6]; + protected boolean receiversDirty = false; + + public static final UITexture ENERGY_PROGRESS = UITexture.builder() + .location(UtilitiesInExcess.MODID, "gui/progress_energy") + .adaptable(1) + .imageSize(16, 128) + .build(); + + public TileEntityBaseGenerator(int capacity) { + this.energyStorage = new EnergyStorage(capacity); + } + + /** + * Override to set fuel consumption behavior. Return true if fuel consumption succeeds. + * A proper implementation of consumeFuel should usually set currentFuelBurnTime and currentRFPerTick! + */ + protected abstract boolean consumeFuel(); + + /** + * Called every burn tick. + */ + protected void onBurnTick() {} + + protected boolean canExtract() { + return true; + } + + @Override + public void updateEntity() { + if (multiplier == -1) { + if (worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockBaseGenerator generator) { + multiplier = generator.multiplier; + } + } + if (worldObj.isRemote) return; + boolean dirty = false; + + if (receiversDirty) refreshEnergyReceivers(); + + if (burnTime > 0) { + burnTime--; + energyStorage.receiveEnergy(currentRFPerTick * multiplier, false); + isBurning = true; + dirty = true; + onBurnTick(); + } else { + isBurning = false; + currentRFPerTick = 0; + if (consumeFuel()) { + burnTime = currentFuelBurnTime / multiplier; + dirty = true; + } + } + + if (canExtract()) pushEnergyToReceivers(); + + if (dirty) { + markDirty(); + } + } + + protected void pushEnergyToReceivers() { + if (energyStorage.getEnergyStored() <= 0) return; + + int canSend = energyStorage.getMaxExtract(); + + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + IEnergyReceiver receiver = connectedReceivers[dir.ordinal()]; + if (receiver != null) { + int toSend = Math.min(canSend, energyStorage.getEnergyStored()); + int received = receiver.receiveEnergy(dir.getOpposite(), toSend, false); + if (received > 0) { + canSend -= received; + energyStorage.extractEnergy(received, false); + if (energyStorage.getEnergyStored() <= 0 || canSend <= 0) { + break; + } + } + } + } + } + + public void onNeighborBlockChange() { + receiversDirty = true; + } + + @Override + public void validate() { + super.validate(); + receiversDirty = true; + } + + protected void refreshEnergyReceivers() { + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); + if (te instanceof IEnergyReceiver rec) { + if (rec.canConnectEnergy(dir.getOpposite())) { + connectedReceivers[dir.ordinal()] = rec; + } else { + connectedReceivers[dir.ordinal()] = null; + } + } else { + connectedReceivers[dir.ordinal()] = null; + } + } + receiversDirty = false; + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + burnTime = tag.getInteger("BurnTime"); + currentFuelBurnTime = tag.getInteger("currentFuelBurnTime"); + currentRFPerTick = tag.getInteger("CurrentRFPerTick"); + energyStorage.readFromNBT(tag); + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + tag.setInteger("BurnTime", burnTime); + tag.setInteger("currentFuelBurnTime", currentFuelBurnTime); + tag.setInteger("CurrentRFPerTick", currentRFPerTick); + energyStorage.writeToNBT(tag); + } + + @Override + public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { + return canExtract() ? energyStorage.extractEnergy(maxExtract, simulate) : 0; + } + + @Override + public boolean canConnectEnergy(ForgeDirection from) { + return true; + } + + @Override + public int getEnergyStored(ForgeDirection from) { + return energyStorage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection from) { + return energyStorage.getMaxEnergyStored(); + } + + protected abstract String getGUIName(); + + protected boolean showGenerationRate() { + return true; + } + + protected boolean showBurnTime() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + + IntSyncValue energySyncer = new IntSyncValue(() -> energyStorage.getEnergyStored()); + IntSyncValue maxEnergySyncer = new IntSyncValue(() -> energyStorage.getMaxEnergyStored()); + IntSyncValue burnSyncer = new IntSyncValue(() -> burnTime); + IntSyncValue rftSyncer = new IntSyncValue(() -> currentRFPerTick); + IntSyncValue multSyncer = new IntSyncValue(() -> multiplier); + syncManager.syncValue("energySyncer", energySyncer); + syncManager.syncValue("maxEnergySyncer", maxEnergySyncer); + syncManager.syncValue("burnSyncer", burnSyncer); + syncManager.syncValue("rftSyncer", rftSyncer); + syncManager.syncValue("multSyncer", multSyncer); + + ModularPanel panel = new ModularPanel("panel"); + panel.bindPlayerInventory(); + + panel.child( + new ParentWidget<>().coverChildren() + .topRelAnchor(0, 1) + .child( + IKey.str(StatCollector.translateToLocal(getGUIName())) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15))); + panel.child( + new ProgressWidget() + .value( + new DoubleSyncValue( + () -> (double) energyStorage.getEnergyStored() / energyStorage.getMaxEnergyStored())) + .texture(ENERGY_PROGRESS, 16) + .direction(ProgressWidget.Direction.UP) + .size(16, 64) + .pos(100, 14) + .tooltipDynamic( + tt -> tt.add( + StatCollector.translateToLocalFormatted( + "gui.energy.tooltip", + formatNumber(energySyncer.getIntValue()), + formatNumber(maxEnergySyncer.getIntValue()))))); + + panel.childIf( + showBurnTime(), + IKey.dynamic( + () -> (burnSyncer.getIntValue() / 1200) + StatCollector.translateToLocal("time.minutes_abbreviation") + + " " + + (burnSyncer.getIntValue() % 1200) / 20 + + StatCollector.translateToLocal("time.seconds_abbreviation")) + .asWidget() + .pos(10, 50)); + + panel.childIf( + showGenerationRate(), + IKey.dynamic(() -> (multSyncer.getIntValue() * rftSyncer.getIntValue() + " RF/t")) + .asWidget() + .pos(10, 62)); + + return panel; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGeneratorWithItemFuel.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGeneratorWithItemFuel.java new file mode 100644 index 00000000..0adcd6e4 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGeneratorWithItemFuel.java @@ -0,0 +1,148 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; + +public abstract class TileEntityBaseGeneratorWithItemFuel extends TileEntityBaseGenerator implements IInventory { + + protected ItemStack fuelStack = null; + + public TileEntityBaseGeneratorWithItemFuel(int capacity) { + super(capacity); + } + + /** Override to define how much RF per tick a given fuel stack provides. */ + protected abstract int getRFPerTick(ItemStack stack); + + /** Override to define burn time for a given fuel stack. */ + protected abstract int getFuelBurnTime(ItemStack stack); + + @Override + protected String getGUIName() { + return getInventoryName(); + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return null; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) { + fuelStack = stack; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(net.minecraft.entity.player.EntityPlayer player) { + return true; + } + + @Override + public void openInventory() {} + + @Override + public void closeInventory() {} + + @Override + public int getSizeInventory() { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return fuelStack; + } + + @Override + public ItemStack decrStackSize(int slot, int count) { + if (fuelStack != null) { + ItemStack stack; + if (fuelStack.stackSize <= count) { + stack = fuelStack; + fuelStack = null; + } else { + stack = fuelStack.splitStack(count); + if (fuelStack.stackSize <= 0) { + fuelStack = null; + } + } + return stack; + } + return null; + } + + @Override + protected boolean consumeFuel() { + if (fuelStack != null && fuelStack.getItem() != null + && energyStorage.getEnergyStored() < energyStorage.getMaxEnergyStored()) { + currentFuelBurnTime = getFuelBurnTime(fuelStack); + currentRFPerTick = getRFPerTick(fuelStack); + fuelStack.stackSize--; + if (fuelStack.stackSize <= 0) { + fuelStack = fuelStack.getItem() + .getContainerItem(fuelStack); + } + return true; + } + return false; + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + if (tag.hasKey("FuelStack")) { + fuelStack = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("FuelStack")); + } else { + fuelStack = null; + } + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + if (fuelStack != null) { + NBTTagCompound fuelStackTag = new NBTTagCompound(); + fuelStack.writeToNBT(fuelStackTag); + tag.setTag("FuelStack", fuelStackTag); + } + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + ModularPanel panel = super.buildUI(data, syncManager, settings); + + SlotGroup slotGroup = new SlotGroup("fuel_slot", 1); + + IItemHandler itemHandler = new InvWrapper(this); + ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); + + panel.child( + new Grid().coverChildren() + .pos(79, 34) + .mapTo(1, 1, index -> new ItemSlot().slot(slot))); + + return panel; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityEnderGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityEnderGenerator.java new file mode 100644 index 00000000..67ccde30 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityEnderGenerator.java @@ -0,0 +1,49 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.enderGeneratorEnderEyeBurnTime; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.enderGeneratorEnderLotusSeedBurnTime; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.enderGeneratorEnderPearlBurnTime; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.enderGeneratorRFCapacity; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.enderGeneratorRFPerTick; + +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import com.fouristhenumber.utilitiesinexcess.ModItems; + +public class TileEntityEnderGenerator extends TileEntityBaseGeneratorWithItemFuel { + + public TileEntityEnderGenerator() { + super(enderGeneratorRFCapacity); + } + + @Override + protected int getRFPerTick(ItemStack currentBurningItem) { + return enderGeneratorRFPerTick; + } + + @Override + protected int getFuelBurnTime(ItemStack stack) { + if (stack == null) return 0; + Item item = stack.getItem(); + if (item == Items.ender_pearl) return enderGeneratorEnderPearlBurnTime; + if (item == Items.ender_eye) return enderGeneratorEnderEyeBurnTime; + if (ModItems.ENDER_LOTUS_SEED.isEnabled() && item == ModItems.ENDER_LOTUS_SEED.get()) + return enderGeneratorEnderLotusSeedBurnTime; + + return 0; + } + + @Override + public String getInventoryName() { + return "tile.ender_generator.name"; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + if (stack == null) return false; + Item item = stack.getItem(); + return item == Items.ender_eye || item == Items.ender_pearl; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityFoodGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityFoodGenerator.java new file mode 100644 index 00000000..fb2de926 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityFoodGenerator.java @@ -0,0 +1,42 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.foodGeneratorBurnTimeMultiplier; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.foodGeneratorRFCapacity; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.foodGeneratorRFMultiplier; + +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; + +public class TileEntityFoodGenerator extends TileEntityBaseGeneratorWithItemFuel { + + public TileEntityFoodGenerator() { + super(foodGeneratorRFCapacity); + } + + @Override + protected int getRFPerTick(ItemStack stack) { + if (stack == null) return 0; + if (!(stack.getItem() instanceof ItemFood foodItem)) return 0; + // Obfuscated method is getHungerValue + return foodItem.func_150905_g(stack) * foodGeneratorRFMultiplier; + } + + @Override + protected int getFuelBurnTime(ItemStack stack) { + if (stack == null) return 0; + if (!(stack.getItem() instanceof ItemFood foodItem)) return 0; + // Obfuscated method is getSaturation + return (int) (foodItem.func_150906_h(stack) * foodGeneratorBurnTimeMultiplier); + } + + @Override + public String getInventoryName() { + return "tile.food_generator.name"; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + if (stack == null) return false; + return stack.getItem() instanceof ItemFood; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityFurnaceGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityFurnaceGenerator.java new file mode 100644 index 00000000..9caaf96b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityFurnaceGenerator.java @@ -0,0 +1,35 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.furnaceGeneratorFuelUsageRatio; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.furnaceGeneratorRFCapacity; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.furnaceGeneratorRFPerTick; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityFurnace; + +public class TileEntityFurnaceGenerator extends TileEntityBaseGeneratorWithItemFuel { + + public TileEntityFurnaceGenerator() { + super(furnaceGeneratorRFCapacity); + } + + @Override + protected int getRFPerTick(ItemStack currentBurningItem) { + return furnaceGeneratorRFPerTick; + } + + @Override + protected int getFuelBurnTime(ItemStack stack) { + return (int) (TileEntityFurnace.getItemBurnTime(stack) * furnaceGeneratorFuelUsageRatio); + } + + @Override + public String getInventoryName() { + return "tile.furnace_generator.name"; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + return TileEntityFurnace.isItemFuel(stack); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityHighTemperatureFurnaceGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityHighTemperatureFurnaceGenerator.java new file mode 100644 index 00000000..6547a889 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityHighTemperatureFurnaceGenerator.java @@ -0,0 +1,35 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.highTemperatureFurnaceGeneratorFuelUsageRatio; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.highTemperatureFurnaceGeneratorRFCapacity; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.highTemperatureFurnaceGeneratorRFPerTick; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityFurnace; + +public class TileEntityHighTemperatureFurnaceGenerator extends TileEntityBaseGeneratorWithItemFuel { + + public TileEntityHighTemperatureFurnaceGenerator() { + super(highTemperatureFurnaceGeneratorRFCapacity); + } + + @Override + protected int getRFPerTick(ItemStack currentBurningItem) { + return highTemperatureFurnaceGeneratorRFPerTick; + } + + @Override + protected int getFuelBurnTime(ItemStack stack) { + return (int) (TileEntityFurnace.getItemBurnTime(stack) * highTemperatureFurnaceGeneratorFuelUsageRatio); + } + + @Override + public String getInventoryName() { + return "tile.high_temperature_furnace_generator.name"; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + return TileEntityFurnace.isItemFuel(stack); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityLavaGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityLavaGenerator.java new file mode 100644 index 00000000..0f21125d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityLavaGenerator.java @@ -0,0 +1,118 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.lavaGeneratorFuelBurnTime; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.lavaGeneratorRFCapacity; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.lavaGeneratorRFPerTick; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; + +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.fluid.FluidStackTank; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.slot.FluidSlot; +import com.fouristhenumber.utilitiesinexcess.utils.mui.FilteredFluidSlotSyncHandler; + +public class TileEntityLavaGenerator extends TileEntityBaseGenerator implements IFluidHandler { + + protected FluidStack fluid; + protected FluidStackTank fluidTank = new FluidStackTank(() -> fluid, fluidStack -> fluid = fluidStack, 4000); + + public TileEntityLavaGenerator() { + super(lavaGeneratorRFCapacity); + } + + public TileEntityLavaGenerator(int capacity) { + super(capacity); + } + + @Override + protected boolean consumeFuel() { + if (fluid != null && energyStorage.getEnergyStored() < energyStorage.getMaxEnergyStored() + && fluid.amount >= 50) { + currentFuelBurnTime = lavaGeneratorFuelBurnTime; + currentRFPerTick = lavaGeneratorRFPerTick; + fluidTank.drain(50, true); + return true; + } + return false; + } + + @Override + protected String getGUIName() { + return "tile.lava_generator.name"; + } + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + if (resource == null || resource.getFluid() != FluidRegistry.LAVA) return 0; + return fluidTank.fill(resource, doFill); + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + return null; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + return null; + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) { + return fluid == FluidRegistry.LAVA; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) { + return false; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) { + return new FluidTankInfo[] { fluidTank.getInfo() }; + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + if (tag.hasKey("Fluid")) { + fluid = FluidStack.loadFluidStackFromNBT(tag.getCompoundTag("Fluid")); + } else { + fluid = null; + } + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + if (fluid != null) { + NBTTagCompound fluidTag = new NBTTagCompound(); + fluid.writeToNBT(fluidTag); + tag.setTag("Fluid", fluidTag); + } + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + ModularPanel panel = super.buildUI(data, syncManager, settings); + + FilteredFluidSlotSyncHandler fluidSync = new FilteredFluidSlotSyncHandler( + fluidTank, + input -> input == FluidRegistry.LAVA); + + panel.child( + new FluidSlot().syncHandler(fluidSync) + .pos(79, 34)); + + return panel; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityLowTemperatureFurnaceGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityLowTemperatureFurnaceGenerator.java new file mode 100644 index 00000000..5ad85a22 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityLowTemperatureFurnaceGenerator.java @@ -0,0 +1,35 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.lowTemperatureFurnaceGeneratorFuelUsageRatio; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.lowTemperatureFurnaceGeneratorRFCapacity; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.lowTemperatureFurnaceGeneratorRFPerTick; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityFurnace; + +public class TileEntityLowTemperatureFurnaceGenerator extends TileEntityBaseGeneratorWithItemFuel { + + public TileEntityLowTemperatureFurnaceGenerator() { + super(lowTemperatureFurnaceGeneratorRFCapacity); + } + + @Override + protected int getRFPerTick(ItemStack currentBurningItem) { + return lowTemperatureFurnaceGeneratorRFPerTick; + } + + @Override + protected int getFuelBurnTime(ItemStack stack) { + return (int) (TileEntityFurnace.getItemBurnTime(stack) * lowTemperatureFurnaceGeneratorFuelUsageRatio); + } + + @Override + public String getInventoryName() { + return "tile.low_temperature_furnace_generator.name"; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + return TileEntityFurnace.isItemFuel(stack); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityNetherStarGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityNetherStarGenerator.java new file mode 100644 index 00000000..fd76d269 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityNetherStarGenerator.java @@ -0,0 +1,40 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.netherStarGeneratorFuelBurnTime; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.netherStarGeneratorRFCapacity; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.netherStarGeneratorRFPerTick; + +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class TileEntityNetherStarGenerator extends TileEntityBaseGeneratorWithItemFuel { + + public TileEntityNetherStarGenerator() { + super(netherStarGeneratorRFCapacity); + } + + @Override + protected int getRFPerTick(ItemStack currentBurningItem) { + return netherStarGeneratorRFPerTick; + } + + @Override + protected int getFuelBurnTime(ItemStack stack) { + if (stack == null) return 0; + Item item = stack.getItem(); + if (item == Items.nether_star) return netherStarGeneratorFuelBurnTime; + return 0; + } + + @Override + public String getInventoryName() { + return "tile.nether_star_generator.name"; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + if (stack == null) return false; + return stack.getItem() == Items.nether_star; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityPinkGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityPinkGenerator.java new file mode 100644 index 00000000..94cffc52 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityPinkGenerator.java @@ -0,0 +1,42 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.pinkGeneratorFuelBurnTime; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.pinkGeneratorRFCapacity; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.pinkGeneratorRFPerTick; + +import net.minecraft.item.ItemStack; + +import com.fouristhenumber.utilitiesinexcess.utils.PinkFuelHelper; + +public class TileEntityPinkGenerator extends TileEntityBaseGeneratorWithItemFuel { + + public TileEntityPinkGenerator() { + super(pinkGeneratorRFCapacity); + } + + @Override + protected int getRFPerTick(ItemStack currentBurningItem) { + return pinkGeneratorRFPerTick; + } + + @Override + protected int getFuelBurnTime(ItemStack stack) { + if (stack == null) return 0; + if (PinkFuelHelper.pinkFuelItems + .contains(new PinkFuelHelper.ItemMetaPair(stack.getItem(), stack.getItemDamage()))) { + return pinkGeneratorFuelBurnTime; + } + return 0; + } + + @Override + public String getInventoryName() { + return "tile.pink_generator.name"; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + return stack != null && PinkFuelHelper.pinkFuelItems + .contains(new PinkFuelHelper.ItemMetaPair(stack.getItem(), stack.getItemDamage())); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityPotionGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityPotionGenerator.java new file mode 100644 index 00000000..c47ce06d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityPotionGenerator.java @@ -0,0 +1,76 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.potionGeneratorBurnTime; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.potionGeneratorRFCapacity; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.potionGeneratorRFMultiplier; + +import java.util.List; + +import net.minecraft.init.Items; +import net.minecraft.item.ItemPotion; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; + +public class TileEntityPotionGenerator extends TileEntityBaseGeneratorWithItemFuel { + + public TileEntityPotionGenerator() { + super(potionGeneratorRFCapacity); + } + + @Override + protected int getRFPerTick(ItemStack stack) { + if (stack == null) return 0; + return (int) (Math.pow(2, getPotionComplexity(stack)) * potionGeneratorRFMultiplier); + } + + @Override + protected int getFuelBurnTime(ItemStack stack) { + return potionGeneratorBurnTime; + } + + // Each effect is 1 complexity. This is not relevant in vanilla but will make it compatible with custom modded + // potions. + // Similarly, each level above 1 gives an additional point due to requiring glowstone. Again, modded potions could + // be even stronger. + // If the duration is longer than 3600 ticks, 1 point because redstone has been applied. + // If the potion is splash, 1 point because gunpowder has been applied. + protected int getPotionComplexity(ItemStack potion) { + if (!(potion.getItem() instanceof ItemPotion)) return 0; + List effects = Items.potionitem.getEffects(potion); + // Awkward and mundane potions are still 1 step! + if (effects == null || effects.isEmpty()) return 1; + + int complexity = 1; + + for (PotionEffect e : effects) { + complexity += 1; + complexity += e.getAmplifier(); + + if (e.getDuration() > 3600) complexity += 1; + + // These effects grant an additional point because they are brewed using the additional fermented spider eye + // step. + if (e.getPotionID() == Potion.harm.id || e.getPotionID() == Potion.invisibility.id) { + complexity += 1; + } + } + + if (ItemPotion.isSplash(potion.getItemDamage())) { + complexity += 1; + } + + return complexity; + } + + @Override + public String getInventoryName() { + return "tile.potion_generator.name"; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + if (stack == null) return false; + return stack.getItem() instanceof ItemPotion; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityRedstoneGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityRedstoneGenerator.java new file mode 100644 index 00000000..365da638 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityRedstoneGenerator.java @@ -0,0 +1,158 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.redstoneGeneratorFuelBurnTime; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.redstoneGeneratorRFCapacity; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.redstoneGeneratorRFPerTick; + +import net.minecraft.init.Items; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; + +public class TileEntityRedstoneGenerator extends TileEntityLavaGenerator implements IInventory { + + public TileEntityRedstoneGenerator() { + super(redstoneGeneratorRFCapacity); + } + + protected ItemStack redstoneStack = null; + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + if (stack == null) return false; + return stack.getItem() == Items.redstone; + } + + @Override + protected boolean consumeFuel() { + if (fluid != null && energyStorage.getEnergyStored() < energyStorage.getMaxEnergyStored() + && fluid.amount >= 125 + && redstoneStack != null + && redstoneStack.getItem() != null) { + currentFuelBurnTime = redstoneGeneratorFuelBurnTime; + currentRFPerTick = redstoneGeneratorRFPerTick; + fluidTank.drain(125, true); + redstoneStack.stackSize--; + if (redstoneStack.stackSize <= 0) redstoneStack = null; + return true; + } + return false; + } + + @Override + protected String getGUIName() { + return getInventoryName(); + } + + @Override + public String getInventoryName() { + return "tile.redstone_generator.name"; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return null; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) { + redstoneStack = stack; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(net.minecraft.entity.player.EntityPlayer player) { + return true; + } + + @Override + public void openInventory() {} + + @Override + public void closeInventory() {} + + @Override + public int getSizeInventory() { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return redstoneStack; + } + + @Override + public ItemStack decrStackSize(int slot, int count) { + if (redstoneStack != null) { + ItemStack stack; + if (redstoneStack.stackSize <= count) { + stack = redstoneStack; + redstoneStack = null; + } else { + stack = redstoneStack.splitStack(count); + if (redstoneStack.stackSize <= 0) { + redstoneStack = null; + } + } + return stack; + } + return null; + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + if (tag.hasKey("RedstoneStack")) { + redstoneStack = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("RedstoneStack")); + } else { + redstoneStack = null; + } + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + if (redstoneStack != null) { + NBTTagCompound fuelStackTag = new NBTTagCompound(); + redstoneStack.writeToNBT(fuelStackTag); + tag.setTag("RedstoneStack", fuelStackTag); + } + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + ModularPanel panel = super.buildUI(data, syncManager, settings); + + SlotGroup slotGroup = new SlotGroup("fuel_slot", 1); + + IItemHandler itemHandler = new InvWrapper(this); + ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); + + panel.child( + new Grid().coverChildren() + .pos(79, 52) + .mapTo(1, 1, index -> new ItemSlot().slot(slot))); + + return panel; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntitySolarGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntitySolarGenerator.java new file mode 100644 index 00000000..9f53e231 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntitySolarGenerator.java @@ -0,0 +1,86 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.solarGeneratorNoSkyGeneration; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.solarGeneratorRFCapacity; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.solarGeneratorTopGeneration; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockBaseGenerator; + +public class TileEntitySolarGenerator extends TileEntityBaseGenerator { + + public TileEntitySolarGenerator() { + super(solarGeneratorRFCapacity); + } + + @Override + protected boolean consumeFuel() { + if (!worldObj.canBlockSeeTheSky(xCoord, yCoord + 1, zCoord) || canExtract()) return false; + currentRFPerTick = getRFPerTick(); + return true; + } + + @Override + protected boolean canExtract() { + return (worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)); + } + + @Override + public void updateEntity() { + if (multiplier == -1) { + if (worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockBaseGenerator generator) { + multiplier = generator.multiplier; + } + } + + if (worldObj.isRemote) return; + boolean dirty = false; + + if (receiversDirty) refreshEnergyReceivers(); + + if (consumeFuel()) { + energyStorage.receiveEnergy(currentRFPerTick * multiplier, false); + dirty = true; + } + + onBurnTick(); + + if (canExtract()) pushEnergyToReceivers(); + + if (dirty) markDirty(); + } + + protected int getRFPerTick() { + // For dimensions like the end with no time, but where the sky can be seen, output constant rate + if (worldObj.provider.hasNoSky) return solarGeneratorNoSkyGeneration; + + return (int) interpolate((int) (((worldObj.getWorldTime() % 24000) + 24000) % 24000)); + } + + public static double interpolate(int time) { + if (time >= 14095 && time <= 21905) { + return 0.0; + } else if (time >= 4925 && time <= 7075) { + return solarGeneratorTopGeneration; + } else if (time > 7075 && time < 14095) { + double t = (double) (time - 7075) / (14095 - 7075); + return solarGeneratorTopGeneration * (1 - t); + } else { + double start = 21905; + double end = 24000 + 4925; + double xWrapped = (time < 4925) ? time + 24000 : time; + + double t = (xWrapped - start) / (end - start); + return solarGeneratorTopGeneration * t; + } + } + + @Override + protected String getGUIName() { + return "tile.solar_generator.name"; + } + + @Override + protected boolean showBurnTime() { + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityTNTGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityTNTGenerator.java new file mode 100644 index 00000000..3788152a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityTNTGenerator.java @@ -0,0 +1,59 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.generators; + +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.TNTGeneratorExplosions; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.TNTGeneratorGunpowderFuelValue; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.TNTGeneratorRFCapacity; +import static com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig.TNTGeneratorTNTFuelValue; +import static com.fouristhenumber.utilitiesinexcess.utils.UIEUtils.uieRandom; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class TileEntityTNTGenerator extends TileEntityBaseGeneratorWithItemFuel { + + public TileEntityTNTGenerator() { + super(TNTGeneratorRFCapacity); + } + + @Override + protected int getRFPerTick(ItemStack stack) { + if (stack == null) return 0; + Item item = stack.getItem(); + if (item == Item.getItemFromBlock(Blocks.tnt)) return TNTGeneratorTNTFuelValue; + if (item == Items.gunpowder) return TNTGeneratorGunpowderFuelValue; + return 0; + } + + @Override + protected int getFuelBurnTime(ItemStack stack) { + return 1; + } + + @Override + public String getInventoryName() { + return "tile.tnt_generator.name"; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + if (stack == null) return false; + Item item = stack.getItem(); + return item == Item.getItemFromBlock(Blocks.tnt) || item == Items.gunpowder; + } + + @Override + protected void onBurnTick() { + if (TNTGeneratorExplosions) { + worldObj.newExplosion( + null, + xCoord + (10 - uieRandom.nextInt(20)) + 0.5, + yCoord + 0.5, + zCoord + (10 - uieRandom.nextInt(20)) + 0.5, + 4.0F, + false, + false); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java new file mode 100644 index 00000000..87c468c4 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java @@ -0,0 +1,11 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; + +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public interface ITransferNetworkComponent { + + boolean canConnectFrom(ForgeDirection side); + + boolean canConnectTo(World world, int x, int y, int z, int side); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java new file mode 100644 index 00000000..f67fbf95 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java @@ -0,0 +1,163 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.ArrayList; + +public class TileEntityRetrievalNode extends TileEntityTransferNode + implements ISidedInventory, IGuiHolder { + + ItemStack buffer; + IInventory connectedInventory; + + public TileEntityRetrievalNode() + { + System.out.println("CALLED"); + Walker.setOriginal(this); + } + + boolean foundEntity=false; + @Override + public void updateEntity() { + //tick+=2+(2*0); //0 is speedupgrade + //if (tick<=20) {return;} + //tick=0; + if (this.worldObj.isRemote || this.worldObj.getTotalWorldTime() % 20 != 0) return; + if (buffer != null && buffer.stackSize >= 64) return; + if (connectedInventory == null) { + ForgeDirection facing = ForgeDirection.getOrientation(getBlockMetadata()); + TileEntity neighbor = worldObj + .getTileEntity(xCoord + facing.offsetX, yCoord + facing.offsetY, zCoord + facing.offsetZ); + if (neighbor instanceof IInventory inventory) { + connectedInventory = inventory; + } + } + + if (connectedInventory != null) exportItems(); + + if (!foundEntity) + { + Walker.step(); + } + TileEntity pipe=Walker.getCurrentTileEntity(); + ArrayList ents=Walker.getItemEntities(); + foundEntity=false; + for (TileEntity entity : ents) + { + boolean side=true; + if (pipe instanceof TileEntityTransferNodeBase ) + { + side=((TileEntityTransferNodeBase)pipe).canConnectFrom(Walker.getDirectionFromCurrent(entity)); + } + if (side) + { + IInventory iEntity=(IInventory)entity; + ArrayList validSlots=new ArrayList<>(0); + for (int i = 0; i < iEntity.getSizeInventory(); i++) { + ItemStack slot = iEntity.getStackInSlot(i); + if (slot==null || (buffer!=null && !buffer.isItemEqual(slot))) {continue;} + if (buffer==null) { buffer=new ItemStack(slot.getItem(),0);} + foundEntity=true; + slot.stackSize-=1; + buffer.stackSize+=1; + this.setInventorySlotContents(0,buffer); + if (slot.stackSize==0) + { + slot=null; + iEntity.setInventorySlotContents(i,null); + } + break; + } + + if (true) //TODO: LINK WITH Round Robin + { + if (!foundEntity) + { + Walker.reset(); + } + } else + { + break; + } + + + } + } + + + } + // TODO: Swap to ExportItems 🤤 - Should be done now + public void exportItems() { + ArrayList validSlots=new ArrayList<>(0); + for (int i = 0; i < connectedInventory.getSizeInventory(); i++) { + ItemStack slot = connectedInventory.getStackInSlot(i); + if (buffer==null || slot==null || (slot.isItemEqual(buffer) && slot.getMaxStackSize()-slot.stackSize==0)) {continue;} + validSlots.add(i); + } + for (int i = 0; i < connectedInventory.getSizeInventory(); i++) { // could compress into another array and do .addall + ItemStack slot = connectedInventory.getStackInSlot(i); + if (slot!=null) {continue;} + validSlots.add(i); + } + + for (int slot: validSlots) { + ItemStack stackInSlot = connectedInventory.getStackInSlot(slot); + if (buffer!=null) { + if (stackInSlot == null) { + stackInSlot = buffer.splitStack(1); + if (buffer.stackSize <= 0) { + buffer=null; + } + connectedInventory.setInventorySlotContents(slot,stackInSlot); + break; + } else if (buffer.isItemEqual(stackInSlot)) { + //if (stackInSlot.stackSize==stackInSlot.getMaxStackSize()) {continue;} + buffer.splitStack(1); + stackInSlot.stackSize += 1; + if (buffer.stackSize <= 0) { + buffer=null; + this.setInventorySlotContents(0,null); + } + connectedInventory.setInventorySlotContents(slot,stackInSlot); + break; + } + } + } + } + + @Override + public String getInventoryName() { + return "gui.title.transfer_node.name"; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side) { + return false; + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side) { + return side != blockMetadata; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java new file mode 100644 index 00000000..678dcc1d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java @@ -0,0 +1,296 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; + +import java.util.ArrayList; + +public class TileEntityTransferNode extends TileEntityTransferNodeBase + implements ISidedInventory, IGuiHolder { + + ItemStack[] buffer=new ItemStack[getSizeInventory()]; + IInventory connectedInventory; + + @Override + public boolean canConnectTo(World world, int x, int y, int z, int side) { + if (side == blockMetadata) return false; + + TileEntity te = world.getTileEntity(x, y, z); + + if (te instanceof ITransferNetworkComponent transfer) { + return transfer.canConnectFrom(ForgeDirection.getOrientation(side)); + } + + if (te instanceof ISidedInventory sided) { + int[] slots = sided.getAccessibleSlotsFromSide(side); + return slots != null && slots.length > 0; + } else return te instanceof IInventory; + } + + public TileEntityTransferNode() + { + System.out.println("CALLED"); + Walker.setOriginal(this); + } + + //int tick=0; + @Override + public void updateEntity() { + //tick+=2+(2*0); + //if (tick<=20) {return;} + //tick=0; + if (this.worldObj.isRemote || this.worldObj.getTotalWorldTime() % 20 != 0) return; + if (buffer[0] != null && buffer[0].stackSize >= 64) return; + if (connectedInventory == null) { + ForgeDirection facing = ForgeDirection.getOrientation(getBlockMetadata()); + TileEntity neighbor = worldObj + .getTileEntity(xCoord + facing.offsetX, yCoord + facing.offsetY, zCoord + facing.offsetZ); + if (neighbor instanceof IInventory inventory) { + connectedInventory = inventory; + } + } + if (connectedInventory != null) importItems(); + + + Walker.step(); + + TileEntity pipe=Walker.getCurrentTileEntity(); + + ArrayList ents=Walker.getItemEntities(); + + for (TileEntity entity : ents) + { + boolean side=true; + if (pipe instanceof TileEntityTransferNodeBase ) + { + side=((TileEntityTransferNodeBase)pipe).canConnectFrom(Walker.getDirectionFromCurrent(entity)); + } + if (side) + { + IInventory iEntity=(IInventory)entity; + ArrayList validSlots=new ArrayList<>(0); + for (int i = 0; i < iEntity.getSizeInventory(); i++) { + ItemStack slot = iEntity.getStackInSlot(i); + if (buffer[0]==null || slot==null || (slot.isItemEqual(buffer[0]) && slot.getMaxStackSize()-slot.stackSize==0)) {continue;} + validSlots.add(i); + + + } + for (int i : validSlots) + { + ItemStack slot = iEntity.getStackInSlot(i); + int remaining=slot.getMaxStackSize()-slot.stackSize; + if (buffer[0].stackSize <= remaining) + { + slot.stackSize+=buffer[0].stackSize; + buffer[0]=null; + iEntity.setInventorySlotContents(i,slot); + break; + } + slot.stackSize+=remaining; + buffer[0].stackSize-=remaining; + iEntity.setInventorySlotContents(i,slot); + } + for (int i = 0; i < iEntity.getSizeInventory(); i++) { + ItemStack slot = iEntity.getStackInSlot(i); + if (buffer[0]==null || (slot!=null && !buffer[0].isItemEqual(buffer[0]))) {continue;} + if (slot==null) { slot=new ItemStack(buffer[0].getItem(),0);} + slot.stackSize+=buffer[0].stackSize; + buffer[0]=null; + iEntity.setInventorySlotContents(i,slot); + } + + + if (true) //TODO: LINK WITH Round Robin + { + Walker.reset(); + break; + } + + } + } + + + + + + + + } + + public void importItems() { + for (int slot = 0; slot < connectedInventory.getSizeInventory(); slot++) { + ItemStack stackInSlot = connectedInventory.getStackInSlot(slot); + if (stackInSlot != null) { + if (buffer[0] == null) { + buffer[0] = stackInSlot.splitStack(1); + if (stackInSlot.stackSize <= 0) { + connectedInventory.setInventorySlotContents(slot, null); + } + break; + } else if (buffer[0].isItemEqual(stackInSlot)) { + stackInSlot.splitStack(1); + buffer[0].stackSize += 1; + if (stackInSlot.stackSize <= 0) { + connectedInventory.setInventorySlotContents(slot, null); + } + break; + } + } + } + } + //TODO: SWITCH ALL CODE TO BASENODE SO EVERY FILE HAS THIS SAVING AND UPGRADES + @Override + public void writeToNBT(NBTTagCompound shrug) + { + super.writeToNBT(shrug); + for (int i = 0; i < getSizeInventory(); i++) { + if (buffer[i]==null) {continue;} + shrug.setTag(String.valueOf(i),buffer[i].writeToNBT(new NBTTagCompound())); + } + } + + @Override + public void readFromNBT(NBTTagCompound shrug) + { + super.readFromNBT(shrug); + for (int i = 0; i < getSizeInventory(); i++) { + if (!shrug.hasKey(String.valueOf(i))) {continue;} + buffer[i]= ItemStack.loadItemStackFromNBT(shrug.getCompoundTag(String.valueOf(i))); + this.setInventorySlotContents(i,buffer[i]); + } + } + + @Override + public int getSizeInventory() { // 1(buffer[0])+6(upgrade slots) + return 7; + } + + @Override + public ItemStack getStackInSlot(int slotIn) { + return buffer[slotIn]; + } + + @Override + public ItemStack decrStackSize(int index, int count) { + if (buffer[index] == null) return null; + return buffer[index].splitStack(count); + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) { + return buffer[index]; + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) { + buffer[index] = stack; + this.markDirty(); + } + + @Override + public String getInventoryName() { + return "gui.title.transfer_node.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return true; + } + + @Override + public void openInventory() {} + + @Override + public void closeInventory() {} + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + + SlotGroup slotGroup = new SlotGroup("transfer_node_buffer[0]", 1); + SlotGroup slotGroup1 = new SlotGroup("transfer_node_upgrades", 1); + + ModularPanel panel = new ModularPanel("panel"); + panel.bindPlayerInventory(); + + panel.child( + new ParentWidget<>().coverChildren() + .topRelAnchor(0, 1) + .child( + IKey.str(StatCollector.translateToLocal(getInventoryName())) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15))); + + IItemHandler itemHandler = new InvWrapper(this); + + for (int i = 0; i < 6; i++) { + panel.child(new ItemSlot().slot(new ModularSlot(itemHandler,i+1).slotGroup(slotGroup1)).pos(34+i*18,60)); + } + ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); + + panel.child( + new Grid().coverChildren() + .pos(79, 34) + .mapTo(1, 1, index -> new ItemSlot().slot(slot))); + + return panel; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + if (ForgeDirection.getOrientation(side) + .getOpposite() + .ordinal() == blockMetadata) return null; + return new int[] { 0 }; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side) { + return side != blockMetadata; + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side) { + return false; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java new file mode 100644 index 00000000..02b45af2 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java @@ -0,0 +1,77 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; +import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.TransferUpgrade; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.ITransferWalker; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityTransferNodeBase extends TileEntity implements ITransferNetworkComponent { + + private int connectionsMask = 0; + + public int getConnectionsMask() { + return connectionsMask; + } + + public boolean updateConnections(World world, int x, int y, int z) { + int old = connectionsMask; + int mask = 0; + if (canConnectTo(world, x + 1, y, z, 5)) mask |= 1; + if (canConnectTo(world, x - 1, y, z, 4)) mask |= 1 << 1; + if (canConnectTo(world, x, y + 1, z, 1)) mask |= 1 << 2; + if (canConnectTo(world, x, y - 1, z, 0)) mask |= 1 << 3; + if (canConnectTo(world, x, y, z + 1, 3)) mask |= 1 << 4; + if (canConnectTo(world, x, y, z - 1, 2)) mask |= 1 << 5; + + connectionsMask = mask; + if (old != mask) { + markDirty(); + return true; + } + return false; + } + + @Override + public boolean canConnectTo(World world, int x, int y, int z, int side) { + return false; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("connectionsMask", connectionsMask); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + connectionsMask = nbt.getInteger("connectionsMask"); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + writeToNBT(nbt); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + readFromNBT(pkt.func_148857_g()); + if (worldObj != null) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + @Override + public boolean canConnectFrom(ForgeDirection side) { + return side.getOpposite() + .ordinal() != blockMetadata; + } + + public ITransferWalker Walker=TransferUpgrade.SEARCH_BREADTH.getWalker(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeFluid.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeFluid.java new file mode 100644 index 00000000..37c5ff43 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeFluid.java @@ -0,0 +1,91 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.IFluidHandler; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.value.sync.FluidSlotSyncHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.FluidSlot; + +public class TileEntityTransferNodeFluid extends TileEntityTransferNodeBase implements IGuiHolder { + + FluidTank buffer = new FluidTank(8000); + IFluidHandler connectedInventory; + + @Override + public boolean canConnectTo(World world, int x, int y, int z, int side) { + if (side == blockMetadata) return false; + + TileEntity te = world.getTileEntity(x, y, z); + + if (te instanceof ITransferNetworkComponent transfer) { + return transfer.canConnectFrom(ForgeDirection.getOrientation(side)); + } + + return te instanceof IFluidHandler; + } + + @Override + public void updateEntity() { + if (this.worldObj.isRemote || this.worldObj.getTotalWorldTime() % 20 != 0) return; + if (buffer != null && buffer.getFluidAmount() >= buffer.getCapacity()) return; + if (connectedInventory == null) { + ForgeDirection facing = ForgeDirection.getOrientation(getBlockMetadata()); + TileEntity neighbor = worldObj + .getTileEntity(xCoord + facing.offsetX, yCoord + facing.offsetY, zCoord + facing.offsetZ); + if (neighbor instanceof IFluidHandler inventory) { + connectedInventory = inventory; + } + } + if (connectedInventory != null) importFluids(); + } + + public void importFluids() { + FluidStack canDrain = connectedInventory.drain(ForgeDirection.UP, 200, false); + if (canDrain != null && canDrain.amount > 0) { + int filled = buffer.fill(canDrain, true); + if (filled > 0) { + connectedInventory.drain(ForgeDirection.UP, filled, true); + } + } + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + + ModularPanel panel = new ModularPanel("panel"); + panel.bindPlayerInventory(); + + panel.child( + new ParentWidget<>().coverChildren() + .topRelAnchor(0, 1) + .child( + IKey.str(StatCollector.translateToLocal("gui.title.transfer_node_fluid.name")) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15))); + + FluidSlotSyncHandler fluidSync = new FluidSlotSyncHandler(buffer); + + panel.child( + new Grid().coverChildren() + .pos(79, 34) + .mapTo(1, 1, index -> new FluidSlot().syncHandler(fluidSync))); + + return panel; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java new file mode 100644 index 00000000..6e72ffca --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java @@ -0,0 +1,93 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.IFluidHandler; + +import cofh.api.energy.IEnergyReceiver; + +public class TileEntityTransferPipe extends TileEntity implements ITransferNetworkComponent { + + private int connectionsMask = 0; + + public int getConnectionsMask() { + return connectionsMask; + } + + public boolean updateConnections(World world, int x, int y, int z) { + int old = connectionsMask; + int mask = 0; + if (canConnectTo(world, x + 1, y, z, 5)) mask |= 1; + if (canConnectTo(world, x - 1, y, z, 4)) mask |= 1 << 1; + if (canConnectTo(world, x, y + 1, z, 1)) mask |= 1 << 2; + if (canConnectTo(world, x, y - 1, z, 0)) mask |= 1 << 3; + if (canConnectTo(world, x, y, z + 1, 3)) mask |= 1 << 4; + if (canConnectTo(world, x, y, z - 1, 2)) mask |= 1 << 5; + + connectionsMask = mask; + if (old != mask) { + markDirty(); + return true; + } + return false; + } + + @Override + public boolean canConnectTo(World world, int x, int y, int z, int side) { + TileEntity te = world.getTileEntity(x, y, z); + + if (te instanceof ITransferNetworkComponent transfer) { + return transfer.canConnectFrom(ForgeDirection.getOrientation(side)); + } + + if (te instanceof ISidedInventory sided) { + int[] slots = sided.getAccessibleSlotsFromSide(side); + if (slots != null && slots.length > 0) return true; + } else if (te instanceof IInventory) return true; + + if (te instanceof IEnergyReceiver energy && energy.canConnectEnergy(ForgeDirection.getOrientation(side))) { + return true; + } + + return te instanceof IFluidHandler; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("connectionsMask", connectionsMask); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + connectionsMask = nbt.getInteger("connectionsMask"); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + writeToNBT(nbt); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + readFromNBT(pkt.func_148857_g()); + if (worldObj != null) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + @Override + public boolean canConnectFrom(ForgeDirection side) { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/WorldGenEnderLotus.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/WorldGenEnderLotus.java new file mode 100644 index 00000000..9af07f41 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/WorldGenEnderLotus.java @@ -0,0 +1,40 @@ +package com.fouristhenumber.utilitiesinexcess.common.worldgen; + +import java.util.Random; + +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import net.minecraft.world.chunk.IChunkProvider; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderLotusConfig; + +import cpw.mods.fml.common.IWorldGenerator; + +public class WorldGenEnderLotus implements IWorldGenerator { + + private static final int ATTEMPTS_PER_CHUNK = 4; + + @Override + public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, + IChunkProvider chunkProvider) { + if (!EnderLotusConfig.spawnEnderLotusesInEnd) return; + if (world.provider.dimensionId == 1) { + for (int i = 0; i < ATTEMPTS_PER_CHUNK; i++) { + + if (random.nextDouble() < 0.5) continue; + + int x = (chunkX * 16) + random.nextInt(16); + int z = (chunkZ * 16) + random.nextInt(16); + int y = 10 + random.nextInt(60); + + for (int dy = y; dy > 1; dy--) { + if (world.getBlock(x, dy, z) == Blocks.end_stone && world.isAirBlock(x, dy + 1, z)) { + world.setBlock(x, dy + 1, z, ModBlocks.ENDER_LOTUS.get(), 7, 2); + break; + } + } + } + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/Box.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/Box.java new file mode 100644 index 00000000..fb2ed202 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/Box.java @@ -0,0 +1,231 @@ +package com.fouristhenumber.utilitiesinexcess.common.worldgen.util; + +import java.util.Iterator; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.joml.Vector3i; +import org.joml.Vector3ic; + +import com.google.common.collect.AbstractIterator; + +/// Ported from Cubic Chunks. Represents an arbitrary box of integer coordinates. +@ParametersAreNonnullByDefault +public class Box implements Iterable { + + public static final Box CUBE = new Box(0, 0, 0, 15, 15, 15); + + protected int x1, y1, z1; + protected int x2, y2, z2; + + /// Creates a new box around the coordinates. The second location is inclusive. + public Box(int x1, int y1, int z1, int x2, int y2, int z2) { + this.x1 = Math.min(x1, x2); + this.y1 = Math.min(y1, y2); + this.z1 = Math.min(z1, z2); + this.x2 = Math.max(x1, x2); + this.y2 = Math.max(y1, y2); + this.z2 = Math.max(z1, z2); + } + + public int getX1() { + return x1; + } + + public int getY1() { + return y1; + } + + public int getZ1() { + return z1; + } + + public int getX2() { + return x2; + } + + public int getY2() { + return y2; + } + + public int getZ2() { + return z2; + } + + public boolean contains(Box other) { + return x1 <= other.x1 && x2 >= other.x2 && y1 <= other.y1 && y2 >= other.y2 && z1 <= other.z1 && z2 >= other.z2; + } + + public boolean contains(int xmin, int ymin, int zmin, int xmax, int ymax, int zmax) { + return x1 <= xmin && x2 >= xmax && y1 <= ymin && y2 >= ymax && z1 <= zmin && z2 >= zmax; + } + + public boolean contains(int x, int y, int z) { + return x1 <= x && x <= x2 && y1 <= y && y <= y2 && z1 <= z && z <= z2; + } + + public void forEachPoint(XYZFunction function) { + for (int x = x1; x <= x2; x++) { + for (int y = y1; y <= y2; y++) { + for (int z = z1; z <= z2; z++) { + function.apply(x, y, z); + } + } + } + } + + public boolean allMatch(XYZPredicate predicate) { + for (int x = x1; x <= x2; x++) { + for (int y = y1; y <= y2; y++) { + for (int z = z1; z <= z2; z++) { + if (!predicate.test(x, y, z)) { + return false; + } + } + } + } + return true; + } + + /// Iterates over each block in the box + @Override + public @Nonnull Iterator iterator() { + return new AbstractIterator<>() { + + private final Vector3i v = new Vector3i(); + + private int x = x1; + private int y = y1; + private int z = z1; + + @Override + protected Vector3ic computeNext() { + if (x > x2) { + x = x1; + y++; + } + if (y > y2) { + y = y1; + z++; + } + if (z > z2) { + this.endOfData(); + return null; + } + v.set(x, y, z); + x++; + return v; + } + }; + } + + public Box add(Box o) { + return new Box(x1 + o.x1, y1 + o.y1, z1 + o.z1, x2 + o.x2, y2 + o.y2, z2 + o.z2); + } + + public Mutable asMutable() { + return new Mutable(x1, y1, z1, x2, y2, z2); + } + + @FunctionalInterface + public interface XYZFunction { + + void apply(int x, int y, int z); + } + + @FunctionalInterface + public interface XYZPredicate { + + boolean test(int x, int y, int z); + } + + public static class Mutable extends Box { + + public Mutable(int x1, int y1, int z1, int x2, int y2, int z2) { + super(x1, y1, z1, x2, y2, z2); + } + + public int getX1() { + return x1; + } + + public void setX1(int x1) { + this.x1 = x1; + } + + public int getY1() { + return y1; + } + + public void setY1(int y1) { + this.y1 = y1; + } + + public int getZ1() { + return z1; + } + + public void setZ1(int z1) { + this.z1 = z1; + } + + public int getX2() { + return x2; + } + + public void setX2(int x2) { + this.x2 = x2; + } + + public int getY2() { + return y2; + } + + public void setY2(int y2) { + this.y2 = y2; + } + + public int getZ2() { + return z2; + } + + public void setZ2(int z2) { + this.z2 = z2; + } + + public Mutable expand(Box box) { + this.x1 = Math.min(box.x1, x1); + this.y1 = Math.min(box.y1, y1); + this.z1 = Math.min(box.z1, z1); + this.x2 = Math.max(box.x2, x2); + this.y2 = Math.max(box.y2, y2); + this.z2 = Math.max(box.z2, z2); + return this; + } + + public Mutable expand(int x, int y, int z) { + this.x1 = Math.min(x, x1); + this.y1 = Math.min(y, y1); + this.z1 = Math.min(z, z1); + this.x2 = Math.max(x, x2); + this.y2 = Math.max(y, y2); + this.z2 = Math.max(z, z2); + return this; + } + + public Mutable add(int dx, int dy, int dz) { + this.x1 += dx; + this.x2 += dx; + this.y1 += dy; + this.y2 += dy; + this.z1 += dz; + this.z2 += dz; + return this; + } + } + + public static Box horizontalChunkSlice(int startY, int heightY) { + return new Box(0, startY, 0, 15, startY + heightY, 15); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/ChunkBlockView.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/ChunkBlockView.java new file mode 100644 index 00000000..8d332986 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/ChunkBlockView.java @@ -0,0 +1,53 @@ +package com.fouristhenumber.utilitiesinexcess.common.worldgen.util; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.Chunk; + +/// Ported from Cubic Chunks. Wraps a Chunk into a consistent API. +public class ChunkBlockView implements IMutableBlockView { + + private final Chunk chunk; + + private Box bounds; + + public ChunkBlockView(Chunk chunk) { + this.chunk = chunk; + } + + @Override + public void setBlock(int x, int y, int z, @Nonnull Block block) { + setBlock(x, y, z, block, getBlockMetadata(x, y, z)); + } + + @Override + public void setBlockMetadata(int x, int y, int z, int meta) { + chunk.setBlockMetadata(x, y, z, meta); + } + + @Override + public void setBlock(int x, int y, int z, @Nonnull Block block, int meta) { + chunk.func_150807_a(x, y, z, block, meta); + } + + @Nonnull + @Override + public Block getBlock(int x, int y, int z) { + return chunk.getBlock(x, y, z); + } + + @Override + public int getBlockMetadata(int x, int y, int z) { + return chunk.getBlockMetadata(x, y, z); + } + + @Override + public Box getBounds() { + if (bounds == null) { + bounds = Box.horizontalChunkSlice(0, chunk.worldObj.getActualHeight()); + } + + return bounds; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/IBlockView.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/IBlockView.java new file mode 100644 index 00000000..6e8c127f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/IBlockView.java @@ -0,0 +1,32 @@ +package com.fouristhenumber.utilitiesinexcess.common.worldgen.util; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; + +/// A view into a world-like structure. This may be a World, a Chunk, an EBS, or anything else. The coordinate space is +/// implementation and context dependent. +public interface IBlockView { + + @Nonnull + Block getBlock(int x, int y, int z); + + int getBlockMetadata(int x, int y, int z); + + /// Creates a sub view within this view. The coordinates are offset by the given box. `view.getBlock(0, 0, 0)` is + /// equivalent to `this.getBlock(min x, min y, min z)`. + default IBlockView subView(Box box) { + Box thisBox = getBounds(); + + if (thisBox != null && !thisBox.contains(box)) { + throw new IllegalArgumentException("sub view box must be completely contained within parent view's bounds"); + } + + return new SubBlockView(this, box); + } + + /// Gets the bounds of this view, if possible. Returns null when the view is unbounded. + default Box getBounds() { + return null; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/IMutableBlockView.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/IMutableBlockView.java new file mode 100644 index 00000000..97c8b700 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/IMutableBlockView.java @@ -0,0 +1,40 @@ +package com.fouristhenumber.utilitiesinexcess.common.worldgen.util; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; + +import org.joml.Vector3ic; + +import com.gtnewhorizon.gtnhlib.util.data.ImmutableBlockMeta; + +/// A view into a world-like structure. This may be a World, a Chunk, an EBS, or anything else. The coordinate space is +/// implementation and context dependent. +public interface IMutableBlockView extends IBlockView { + + /// Same as [#subView(Box)], except this view is mutable. + default IMutableBlockView subViewMutable(Box box) { + Box thisBox = getBounds(); + + if (thisBox != null && !thisBox.contains(box)) + throw new IllegalArgumentException("sub view box must be completely contained within parent view's bounds"); + + return new MutableSubBlockView(this, box); + } + + void setBlock(int x, int y, int z, @Nonnull Block block); + + void setBlockMetadata(int x, int y, int z, int meta); + + void setBlock(int x, int y, int z, @Nonnull Block block, int meta); + + default void setBlock(int x, int y, int z, @Nonnull ImmutableBlockMeta bm) { + setBlock(x, y, z, bm.getBlock(), bm.getBlockMeta()); + } + + default void fill(@Nonnull ImmutableBlockMeta bm) { + for (Vector3ic v : getBounds()) { + setBlock(v.x(), v.y(), v.z(), bm); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/MutableSubBlockView.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/MutableSubBlockView.java new file mode 100644 index 00000000..8b6aefe0 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/MutableSubBlockView.java @@ -0,0 +1,48 @@ +package com.fouristhenumber.utilitiesinexcess.common.worldgen.util; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; + +public class MutableSubBlockView extends SubBlockView implements IMutableBlockView { + + private final IMutableBlockView blockView; + + public MutableSubBlockView(IMutableBlockView blockView, Box box) { + super(blockView, box); + this.blockView = blockView; + } + + @Override + public void setBlock(int x, int y, int z, @Nonnull Block block) { + validateCoords(x, y, z); + + x += box.getX1(); + y += box.getY1(); + z += box.getZ1(); + + blockView.setBlock(x, y, z, block); + } + + @Override + public void setBlockMetadata(int x, int y, int z, int meta) { + validateCoords(x, y, z); + + x += box.getX1(); + y += box.getY1(); + z += box.getZ1(); + + blockView.setBlockMetadata(x, y, z, meta); + } + + @Override + public void setBlock(int x, int y, int z, @Nonnull Block block, int meta) { + validateCoords(x, y, z); + + x += box.getX1(); + y += box.getY1(); + z += box.getZ1(); + + blockView.setBlock(x, y, z, block, meta); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/SubBlockView.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/SubBlockView.java new file mode 100644 index 00000000..4ced8728 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/worldgen/util/SubBlockView.java @@ -0,0 +1,65 @@ +package com.fouristhenumber.utilitiesinexcess.common.worldgen.util; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; + +public class SubBlockView implements IBlockView { + + private final IBlockView blockView; + protected final Box box; + + private Box effectiveBox; + + public SubBlockView(IBlockView blockView, Box box) { + this.blockView = blockView; + this.box = box; + } + + @Nonnull + @Override + public Block getBlock(int x, int y, int z) { + validateCoords(x, y, z); + + x += box.getX1(); + y += box.getY1(); + z += box.getZ1(); + + return blockView.getBlock(x, y, z); + } + + @Override + public int getBlockMetadata(int x, int y, int z) { + validateCoords(x, y, z); + + x += box.getX1(); + y += box.getY1(); + z += box.getZ1(); + + return blockView.getBlockMetadata(x, y, z); + } + + @Override + public Box getBounds() { + if (effectiveBox == null) { + effectiveBox = new Box( + 0, + 0, + 0, + box.getX2() - box.getX1(), + box.getY2() - box.getY1(), + box.getZ2() - box.getZ1()); + } + + return effectiveBox; + } + + protected final void validateCoords(int x, int y, int z) { + if (x < 0 || x > box.getX2() - box.getX1()) throw new IllegalArgumentException( + String.format("illegal argument: x (x=%s, x1=%s, x2=%s)", x, box.getX1(), box.getX2())); + if (y < 0 || y > box.getY2() - box.getY1()) throw new IllegalArgumentException( + String.format("illegal argument: y (y=%s, y1=%s, y2=%s)", y, box.getY1(), box.getY2())); + if (z < 0 || z > box.getZ2() - box.getZ1()) throw new IllegalArgumentException( + String.format("illegal argument: z (z=%s, z1=%s, z2=%s)", z, box.getZ1(), box.getZ2())); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/wrappers/MerchantRecipeListWrapper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/wrappers/MerchantRecipeListWrapper.java new file mode 100644 index 00000000..4254fde7 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/wrappers/MerchantRecipeListWrapper.java @@ -0,0 +1,99 @@ +package com.fouristhenumber.utilitiesinexcess.common.wrappers; + +import java.io.IOException; +import java.util.ArrayList; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; +import net.minecraft.entity.IMerchant; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.village.MerchantRecipe; +import net.minecraft.village.MerchantRecipeList; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorMerchantRecipe; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class MerchantRecipeListWrapper { + + private MerchantRecipeList recipeList; + private int recipeListHash; + private final IMerchant merchant; + private int[] favorites; + + public MerchantRecipeListWrapper(IMerchant merchant, EntityPlayer player) { + this.recipeList = merchant.getRecipes(player); + updateRecipeListHash(); + this.merchant = merchant; + } + + @SideOnly(Side.CLIENT) + public MerchantRecipeListWrapper(NBTTagCompound tagCompound) throws IOException { + recipeList = new MerchantRecipeList(tagCompound); + World world = Minecraft.getMinecraft().theWorld; + merchant = (IMerchant) world.getEntityByID(tagCompound.getInteger("merchant")); + favorites = tagCompound.getIntArray("favorites"); + } + + public NBTTagCompound writeToTags() { + NBTTagCompound compound = recipeList.getRecipiesAsTags(); + if (this.getMerchant() != null) compound.setInteger("merchant", ((Entity) this.getMerchant()).getEntityId()); + if (this.getFavorites() != null) compound.setIntArray("favorites", this.getFavorites()); + return compound; + } + + public MerchantRecipeList getRecipeList() { + return recipeList; + } + + public void setRecipeList(MerchantRecipeList recipeList) { + this.recipeList = recipeList; + } + + public int getRecipeListHash() { + return recipeListHash; + } + + public void updateRecipeListHash() { + this.recipeListHash = getCustomHashFromList(this.recipeList); + } + + public static int getCustomHashFromList(MerchantRecipeList recipeList) { + ArrayList useCounts = new ArrayList<>(); + for (Object recipe : recipeList) { + if (recipe instanceof MerchantRecipe) { + useCounts.add(((AccessorMerchantRecipe) recipe).getCurrentUses()); + useCounts.add(((AccessorMerchantRecipe) recipe).getMaxUses()); + } + } + return recipeList.hashCode() + useCounts.hashCode(); + } + + public IMerchant getMerchant() { + return merchant; + } + + public int[] getFavorites() { + return favorites; + } + + public void setFavorites(int[] favorites) { + this.favorites = favorites; + } + + public boolean isFavorite(int index) { + int[] favorites = getFavorites(); + if (favorites == null) { + return false; + } + + for (int x : favorites) { + if (x == index) return true; + } + + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java new file mode 100644 index 00000000..6d9235cc --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java @@ -0,0 +1,44 @@ +package com.fouristhenumber.utilitiesinexcess.compat; + +import java.util.function.Supplier; + +import cpw.mods.fml.common.Loader; + +public enum Mods { + + // spotless:off + Baubles("Baubles"), + Dreamcraft("dreamcraft"), + Thaumcraft("Thaumcraft"), + NEI("NotEnoughItems"), + CraftTweaker("MineTweaker3"), + FindIt("findit"), + Tinkers("TConstruct") + ; + // spotless:on + + public final String modid; + private final Supplier supplier; + private Boolean loaded; + + Mods(String modid) { + this.modid = modid; + this.supplier = null; + } + + Mods(Supplier supplier) { + this.supplier = supplier; + this.modid = null; + } + + public boolean isLoaded() { + if (loaded == null) { + if (supplier != null) { + loaded = supplier.get(); + } else if (modid != null) { + loaded = Loader.isModLoaded(modid); + } else loaded = false; + } + return loaded; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/crafttweaker/QEDCraftTweakerSupport.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/crafttweaker/QEDCraftTweakerSupport.java new file mode 100644 index 00000000..15d70d92 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/crafttweaker/QEDCraftTweakerSupport.java @@ -0,0 +1,107 @@ +package com.fouristhenumber.utilitiesinexcess.compat.crafttweaker; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import net.minecraftforge.oredict.OreDictionary; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.api.QEDRecipe; +import com.fouristhenumber.utilitiesinexcess.api.QEDRegistry; + +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.OneWayAction; +import minetweaker.annotations.ModOnly; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +@ZenClass("mods.utilitiesinexcess.QED") +@ModOnly(UtilitiesInExcess.MODID) +public class QEDCraftTweakerSupport { + + @ZenMethod + public static void addRecipe(IItemStack output, IIngredient[][] inputs) { + MineTweakerAPI.apply(new IUndoableAction() { + + private boolean successful = false; + + @Override + public void apply() { + Object[] inputArray = new Object[9]; + + for (int row = 0; row < 3; row++) { + for (int col = 0; col < 3; col++) { + IIngredient input = inputs[row][col]; + if (input == null) { + inputArray[row * 3 + col] = null; + continue; + } + + Object rawInput = input.getInternal(); + if (rawInput instanceof ItemStack stack) { + inputArray[row * 3 + col] = stack; + } else if (rawInput instanceof String ore) { + inputArray[row * 3 + col] = OreDictionary.getOres(ore) + .toArray(new ItemStack[0]); + } + } + } + + QEDRegistry.instance() + .addRecipe(new QEDRecipe(inputArray, MineTweakerMC.getItemStack(output))); + successful = true; + } + + @Override + public boolean canUndo() { + return successful; + } + + @Override + public void undo() { + QEDRegistry.instance() + .removeRecipe(MineTweakerMC.getItemStack(output)); + } + + @Override + public String describe() { + return "Adding QED recipe for " + StatCollector.translateToLocal(output.getName()); + } + + @Override + public String describeUndo() { + return "Undoing QED recipe addition for " + StatCollector.translateToLocal(output.getName()); + } + + @Override + public Object getOverrideKey() { + return null; + } + }); + } + + @ZenMethod + public static void removeRecipe(IItemStack output) { + MineTweakerAPI.apply(new OneWayAction() { + + @Override + public void apply() { + QEDRegistry.instance() + .removeRecipe(MineTweakerMC.getItemStack(output)); + } + + @Override + public String describe() { + return "Removing QED recipe for " + StatCollector.translateToLocal(output.getName()); + } + + @Override + public Object getOverrideKey() { + return null; + } + }); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/findit/FindItHelper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/findit/FindItHelper.java new file mode 100644 index 00000000..9ed1666f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/findit/FindItHelper.java @@ -0,0 +1,35 @@ +package com.fouristhenumber.utilitiesinexcess.compat.findit; + +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.world.ChunkPosition; +import net.minecraftforge.client.event.RenderWorldLastEvent; + +import com.gtnh.findit.fx.EntityHighlighter; +import com.gtnh.findit.util.ClientFinderHelperUtils; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +public class FindItHelper { + + public static EntityHighlighter entityHighlighter; + + public static FindItHelper INSTANCE; + + public static void init() { + entityHighlighter = new EntityHighlighter(); + } + + public static void rotateViewHelper(List targets) { + EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; + player.closeScreen(); + ClientFinderHelperUtils.rotateViewHelper(player, targets); + } + + @SubscribeEvent + public void onRenderWorldLast(RenderWorldLastEvent event) { + FindItHelper.entityHighlighter.renderHighlightedEntities(event); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/SearchBar.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/SearchBar.java new file mode 100644 index 00000000..61f3f8ba --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/SearchBar.java @@ -0,0 +1,85 @@ +package com.fouristhenumber.utilitiesinexcess.compat.mui.tradingpost; + +import net.minecraft.util.StatCollector; + +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.drawable.UITexture; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; +import com.cleanroommc.modularui.value.StringValue; +import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTradingPost; + +public class SearchBar extends TextFieldWidget { + + Row villagerParent; + + static protected String prevText = ""; + + public static final UITexture VANILLA_SEARCH_BACKGROUND = UITexture.builder() + .location(UtilitiesInExcess.MODID, "gui/vanilla_search") + .imageSize(18, 18) + .adaptable(1) + .name("vanilla_search") + .canApplyTheme() + .build(); + + public SearchBar() { + super(); + background(VANILLA_SEARCH_BACKGROUND); + hintText(StatCollector.translateToLocal("tile.trading_post.search_hint")); + value(new StringValue(prevText)); + } + + @Override + public void drawBackground(ModularGuiContext context, WidgetThemeEntry widgetTheme) { + IDrawable bg = getCurrentBackground(context.getTheme(), widgetTheme); + if (bg != null) { + bg.draw(context, 2, -1, getArea().width - 4, getArea().height + 1, widgetTheme.getTheme()); + } + } + + public SearchBar villagerParent(Row parent) { + villagerParent = parent; + return this; + } + + @Override + public void onUpdate() { + super.onUpdate(); + String txt = getText(); + + if (!txt.equals(prevText)) { + doSearch(txt); + prevText = txt; + } + } + + public void doSearch(String search) { + for (IWidget villagerColumn : villagerParent.getChildren()) { + int foundCount = 0; + for (int i = 0; i < villagerColumn.getChildren() + .size(); i++) { + VillagerWidget villagerWidget = (VillagerWidget) villagerColumn.getChildren() + .get(i); + + villagerWidget.setEnabled(villagerWidget.matches(search)); + if (villagerWidget.isEnabled()) { + if (villagerWidget.isFavorite()) { + ((VillagerColumn) villagerColumn).moveChild(i, 0); + } else { + ((VillagerColumn) villagerColumn).moveChild(i, foundCount); + foundCount++; + } + } + villagerWidget.scheduleResize(); + } + villagerColumn.scheduleResize(); + } + ((TileEntityTradingPost.TradeList) villagerParent.getParent()).getScrollData() + .scrollTo(((TileEntityTradingPost.TradeList) villagerParent.getParent()).getScrollArea(), 0); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/TradeWidget.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/TradeWidget.java new file mode 100644 index 00000000..7d21d240 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/TradeWidget.java @@ -0,0 +1,185 @@ +package com.fouristhenumber.utilitiesinexcess.compat.mui.tradingpost; + +import net.minecraft.client.gui.Gui; +import net.minecraft.item.ItemStack; +import net.minecraft.village.MerchantRecipe; + +import org.jetbrains.annotations.NotNull; +import org.lwjgl.input.Keyboard; + +import com.cleanroommc.modularui.api.widget.Interactable; +import com.cleanroommc.modularui.drawable.GuiTextures; +import com.cleanroommc.modularui.drawable.UITexture; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; +import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.value.ObjectValue; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.ProgressWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.layout.Row; +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorMerchantRecipe; +import com.fouristhenumber.utilitiesinexcess.utils.mui.TooltipItemDisplayWidget; + +public class TradeWidget extends ParentWidget implements Interactable { + + public static final UITexture HIGHLIGHT_BACKGROUND = UITexture.builder() + .location(UtilitiesInExcess.MODID, "gui/trade_highlight") + .imageSize(18, 18) + .name("trade_highlight") + .canApplyTheme() + .build(); + + public MerchantRecipe recipe; + private int index; + private VillagerSyncHandler columnSyncHandler; + private boolean isFavorite = false; + + private final TooltipItemDisplayWidget itemToBuy; + private final TooltipItemDisplayWidget itemToBuy2; + private final TooltipItemDisplayWidget itemToSell; + + public static class TradeProgressWidget extends ProgressWidget { + + @Override + public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { + super.draw(context, widgetTheme); + float progress = getCurrentProgress(); + if (progress <= 0) { + Color.setGlColorOpaque(Color.RED.main); + GuiTextures.CLOSE.draw(0, 0, getArea().width, getArea().height); + } + } + } + + public TradeWidget(MerchantRecipe _recipe) { + super(); + this.recipe = _recipe; + + this.coverChildren(); + + ItemStack item; + if (_recipe != null) { + item = new ItemStack(ModItems.INVERSION_SIGIL_ACTIVE.get()); + } else { + item = new ItemStack(ModItems.INVERSION_SIGIL_INACTIVE.get()); + } + + itemToBuy = new TooltipItemDisplayWidget(); + itemToBuy.paddingRight(0) + .displayAmount(true) + .item(new ObjectValue.Dynamic<>(() -> this.recipe != null ? this.recipe.getItemToBuy() : item, i -> {})); + + itemToBuy2 = new TooltipItemDisplayWidget(); + itemToBuy2.paddingLeft(0) + .displayAmount(true) + .item( + new ObjectValue.Dynamic<>( + () -> this.recipe != null ? this.recipe.getSecondItemToBuy() : item, + i -> {})); + + itemToSell = new TooltipItemDisplayWidget(); + itemToSell.displayAmount(true) + .item(new ObjectValue.Dynamic<>(() -> this.recipe != null ? this.recipe.getItemToSell() : item, i -> {})); + + Flow inputItems = new Row().childPadding(1) + .coverChildren() + .child(itemToBuy) + .child(itemToBuy2); + ProgressWidget progress = new TradeProgressWidget().direction(ProgressWidget.Direction.RIGHT) + .texture(GuiTextures.PROGRESS_ARROW, 20) + .progress(() -> { + AccessorMerchantRecipe trade = (AccessorMerchantRecipe) getRecipe(); + if (trade == null) return 0.69; + if (trade.getMaxUses() > 7) // After the initial 7 uses every recipe gets 2 to 12 additional uses + return ((double) trade.getMaxUses() - trade.getCurrentUses()) / 12; + return 1 - (trade.getCurrentUses() / (double) (trade.getMaxUses())); + }); + Flow wholeRow = new Row().coverChildren() + .padding(1) + .childPadding(2) + .child(inputItems) + .child(progress) + .child(itemToSell); + this.child(wholeRow); + + hoverBackground(HIGHLIGHT_BACKGROUND); + } + + @Override + public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { + super.draw(context, widgetTheme); + + if (index > 0) { + Gui.drawRect(10, -2, getArea().width - 10, -1, 0x1FFFFFFF); + } + + // Yes. Both this *and* hoverBackground(HIGHLIGHT_BACKGROUND) *and* the drawBackground override are needed. + if (isBelowMouse() || isHovering()) Gui.drawRect(1, 1, getArea().width - 1, getArea().height - 1, 0xFFA1A1A1); + + if (isFavorite) { + Color.setGlColorOpaque(Color.YELLOW.main); + GuiTextures.FAVORITE.draw(0, 0, 6, 6); + } + } + + @Override + public void drawBackground(ModularGuiContext context, WidgetThemeEntry widgetTheme) { + + } + + @Override + public @NotNull Result onMousePressed(int mouseButton) { + boolean shift = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); + boolean alt = Keyboard.isKeyDown(Keyboard.KEY_LMENU); + columnSyncHandler.tradeClick(mouseButton, index, shift, alt); + if (!alt && mouseButton == 0) { + columnSyncHandler.executeTrade(index, shift); + } else if (alt && mouseButton == 0) { + isFavorite = !isFavorite; + } else if (mouseButton == 1 && Mods.FindIt.isLoaded()) { + columnSyncHandler.highLightVillager(); + } + + return Interactable.super.onMousePressed(mouseButton); + } + + public MerchantRecipe getRecipe() { + return recipe; + } + + public TradeWidget setRecipe(MerchantRecipe r) { + recipe = r; + return this; + } + + public TradeWidget columnSyncHandler(VillagerSyncHandler columnSyncHandler) { + this.columnSyncHandler = columnSyncHandler; + return this; + } + + public int getIndex() { + return index; + } + + public TradeWidget index(int index) { + this.index = index; + return this; + } + + public TradeWidget favorite(boolean favorite) { + this.isFavorite = favorite; + return this; + } + + public boolean isFavorite() { + return this.isFavorite; + } + + public boolean matches(String search) { + return itemToBuy.matches(search) || itemToBuy2.matches(search) || itemToSell.matches(search); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerColumn.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerColumn.java new file mode 100644 index 00000000..808f5a92 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerColumn.java @@ -0,0 +1,28 @@ +package com.fouristhenumber.utilitiesinexcess.compat.mui.tradingpost; + +import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.widgets.layout.Column; + +public class VillagerColumn extends Column { + + public void moveChild(int prevIndex, int nextIndex) { + IWidget child = this.getChildren() + .get(prevIndex); + this.getChildren() + .remove(prevIndex); + this.getChildren() + .add(nextIndex, child); + } + + public void moveChild(IWidget widget, int nextIndex) { + int index = -1; + for (int i = 0; i < getChildren().size(); i++) { + if (getChildren().get(i) == widget) { + index = i; + break; + } + } + + if (index != -1) moveChild(index, nextIndex); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerEntityDisplay.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerEntityDisplay.java new file mode 100644 index 00000000..e501db4e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerEntityDisplay.java @@ -0,0 +1,93 @@ +package com.fouristhenumber.utilitiesinexcess.compat.mui.tradingpost; + +import java.util.function.Supplier; + +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.EntityLivingBase; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; +import com.cleanroommc.modularui.utils.GlStateManager; +import com.cleanroommc.modularui.utils.Platform; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widget.sizer.Area; + +public class VillagerEntityDisplay extends Widget { + + private final Supplier entitySupplier; + + public VillagerEntityDisplay(Supplier e) { + this.entitySupplier = e; + this.size(30, 60); + } + + @Override + public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { + EntityLivingBase e = entitySupplier.get(); + if (e == null) return; + if (e.isDead) return; + + Area area = this.getArea(); + drawEntity(area.width / 2, area.height, area.width, e); + } + + public static void drawEntity(int x, int y, int scale, EntityLivingBase e) { + GL11.glColor4f(1, 1, 1, 1); + + Platform.setupDrawTex(); + GlStateManager.enableRescaleNormal(); + // RenderHelper.enableGUIStandardItemLighting but with lighting from the opposite direction + GL11.glPushMatrix(); + GL11.glRotatef(30.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(165.0F, 1.0F, 0.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + GL11.glPopMatrix(); + + GlStateManager.enableDepth(); + + func_147046_a(x, y, scale, -45, 0, e); + Platform.endDrawItem(); + } + + public static void func_147046_a(int p_147046_0_, int p_147046_1_, int p_147046_2_, float p_147046_3_, + float p_147046_4_, EntityLivingBase p_147046_5_) { + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glPushMatrix(); + GL11.glTranslatef((float) p_147046_0_, (float) p_147046_1_, 50.0F); + GL11.glScalef((float) (-p_147046_2_), (float) p_147046_2_, (float) p_147046_2_); + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + float f2 = p_147046_5_.renderYawOffset; + float f3 = p_147046_5_.rotationYaw; + // float f4 = p_147046_5_.rotationPitch; + float f5 = p_147046_5_.prevRotationYawHead; + float f6 = p_147046_5_.rotationYawHead; + // GL11.glRotatef(135.0F, 0.0F, 1.0F, 0.0F); + // RenderHelper.enableStandardItemLighting(); + // GL11.glRotatef(-135.0F, 0.0F, 1.0F, 0.0F); + // GL11.glRotatef(-((float)Math.atan((double)(p_147046_4_ / 40.0F))) * 20.0F, 1.0F, 0.0F, 0.0F); + p_147046_5_.renderYawOffset = (float) Math.atan((double) (p_147046_3_ / 40.0F)) * 20.0F; + p_147046_5_.rotationYaw = (float) Math.atan((double) (p_147046_3_ / 40.0F)) * 40.0F; + // p_147046_5_.rotationPitch = -((float)Math.atan((double)(p_147046_4_ / 40.0F))) * 20.0F; + p_147046_5_.rotationYawHead = p_147046_5_.rotationYaw; + p_147046_5_.prevRotationYawHead = p_147046_5_.rotationYaw; + GL11.glTranslatef(0.0F, p_147046_5_.yOffset, 0.0F); + RenderManager.instance.playerViewY = 180.0F; + RenderManager.instance.renderEntityWithPosYaw(p_147046_5_, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F); + p_147046_5_.renderYawOffset = f2; + p_147046_5_.rotationYaw = f3; + // p_147046_5_.rotationPitch = f4; + p_147046_5_.prevRotationYawHead = f5; + p_147046_5_.rotationYawHead = f6; + GL11.glPopMatrix(); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GL11.glDisable(GL11.GL_TEXTURE_2D); + OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerSyncHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerSyncHandler.java new file mode 100644 index 00000000..3a113661 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerSyncHandler.java @@ -0,0 +1,309 @@ +package com.fouristhenumber.utilitiesinexcess.compat.mui.tradingpost; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.IMerchant; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; +import net.minecraft.village.MerchantRecipe; +import net.minecraft.village.MerchantRecipeList; +import net.minecraft.world.ChunkPosition; + +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import com.fouristhenumber.utilitiesinexcess.common.wrappers.MerchantRecipeListWrapper; +import com.fouristhenumber.utilitiesinexcess.compat.findit.FindItHelper; +import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorMerchantRecipe; +import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; + +public class VillagerSyncHandler extends SyncHandler { + + public static final String FAVORITE_TRADES_SUBTAG = "Favorite_Trades"; + + private final VillagerWidget column; + private final PosGuiData data; + private MerchantRecipeListWrapper recipeList; + + public VillagerSyncHandler(VillagerWidget column, PosGuiData data, MerchantRecipeListWrapper recipeList) { + super(); + this.column = column; + this.data = data; + this.recipeList = recipeList; + + this.recipeList.setFavorites(getFavorites()); + } + + @Override + public void detectAndSendChanges(boolean init) { + if (data.isClient()) return; + + if (!init) { + MerchantRecipeList actualList = recipeList.getMerchant() + .getRecipes(data.getPlayer()); + if (recipeList.getRecipeListHash() == MerchantRecipeListWrapper.getCustomHashFromList(actualList)) return; + + recipeList.updateRecipeListHash(); + } + + syncToClient(0, buffer -> { buffer.writeNBTTagCompoundToBuffer(recipeList.writeToTags()); }); + column.syncRecipes(recipeList); + } + + public void tradeClick(int mouseButton, int index, boolean shift, boolean alt) { + syncToServer(1, buffer -> { + buffer.writeInt(mouseButton); + buffer.writeInt(index); + buffer.writeBoolean(shift); + buffer.writeBoolean(alt); + }); + } + + // public static long lastRecieved = 0; + + @Override + public void readOnClient(int id, PacketBuffer buf) throws IOException { + // lastRecieved = System.currentTimeMillis(); + + if (id == 0) { + NBTTagCompound recipeTag = buf.readNBTTagCompoundFromBuffer(); + try { + MerchantRecipeListWrapper newRecipeList = new MerchantRecipeListWrapper(recipeTag); + column.syncRecipes(newRecipeList); + this.recipeList = newRecipeList; + } catch (IOException e) { + e.printStackTrace(); + } + return; + } + } + + @Override + public void readOnServer(int id, PacketBuffer buf) throws IOException { + int mouseButton = buf.readInt(); + int index = buf.readInt(); + boolean shift = buf.readBoolean(); + boolean alt = buf.readBoolean(); + + if (!alt && mouseButton == 0) executeTrade(index, shift); + else if (alt && mouseButton == 0) toggleFavorite(index); + + } + + private NBTTagCompound getFavoritesTag() { + EntityPlayer player = data.getPlayer(); + NBTTagCompound uieTag = UIEUtils.getUIETag(player); + NBTTagCompound allFavoritesTag; + + if (uieTag.hasKey(FAVORITE_TRADES_SUBTAG)) { + allFavoritesTag = uieTag.getCompoundTag(FAVORITE_TRADES_SUBTAG); + } else { + allFavoritesTag = new NBTTagCompound(); + uieTag.setTag(FAVORITE_TRADES_SUBTAG, allFavoritesTag); + } + return allFavoritesTag; + } + + private int[] getFavorites() { + String merchantID; + if (recipeList.getMerchant() instanceof Entity) { + merchantID = ((Entity) recipeList.getMerchant()).getUniqueID() + .toString(); + } else { + return null; + } + + NBTTagCompound allFavoritesTag = getFavoritesTag(); + + int[] favoritesTag; + if (allFavoritesTag.hasKey(merchantID)) { + favoritesTag = allFavoritesTag.getIntArray(merchantID); + } else { + favoritesTag = null; + } + return favoritesTag; + } + + private void setFavorites(int[] favorites) { + String merchantID; + if (recipeList.getMerchant() instanceof Entity) { + merchantID = ((Entity) recipeList.getMerchant()).getUniqueID() + .toString(); + } else { + return; + } + + NBTTagCompound allFavoritesTag = getFavoritesTag(); + + allFavoritesTag.setIntArray(merchantID, favorites); + } + + public void addFavorite(int index) { + int[] favorites = getFavorites(); + if (favorites == null) { + favorites = new int[0]; + } + favorites = Arrays.copyOf(favorites, favorites.length + 1); + favorites[favorites.length - 1] = index; + + setFavorites(favorites); + } + + private void clearFavorites() { + String merchantID; + if (recipeList.getMerchant() instanceof Entity) { + merchantID = ((Entity) recipeList.getMerchant()).getUniqueID() + .toString(); + } else { + return; + } + + NBTTagCompound allFavoritesTag = getFavoritesTag(); + + allFavoritesTag.removeTag(merchantID); + } + + public void removeFavorite(int index) { + int[] favorites = getFavorites(); + if (favorites == null) { + return; + } + + favorites = Arrays.stream(favorites) + .filter(x -> x != index) + .toArray(); + + if (favorites.length == 0) clearFavorites(); + else setFavorites(favorites); + } + + public boolean isFavorite(int index) { + int[] favorites = getFavorites(); + if (favorites == null) { + return false; + } + + for (int x : favorites) { + if (x == index) return true; + } + + return false; + } + + public void toggleFavorite(int index) { + if (isFavorite(index)) removeFavorite(index); + else addFavorite(index); + } + + public boolean executeTrade(int index, boolean shift) { + IMerchant merchant = recipeList.getMerchant(); + if (merchant == null || (merchant instanceof EntityLiving && !((EntityLiving) merchant).isEntityAlive())) + return false; + + EntityPlayer player = data.getPlayer(); + MerchantRecipe recipe = (MerchantRecipe) recipeList.getRecipeList() + .get(index); + ItemStack price1 = recipe.getItemToBuy(); + ItemStack price2 = recipe.getSecondItemToBuy(); + ItemStack result = recipe.getItemToSell(); + + // Count how many of each price item we have + int count1 = 0; + ArrayList price1slots = new ArrayList<>(); + int count2 = 0; + ArrayList price2slots = new ArrayList<>(); + for (int i = 0; i < player.inventory.mainInventory.length; i++) { + ItemStack itemStack = player.inventory.mainInventory[i]; + if (itemStack == null) continue; + if (ItemStack.areItemStackTagsEqual(itemStack, price1) && itemStack.isItemEqual(price1)) { + count1 += itemStack.stackSize; + price1slots.add(i); + } else if (ItemStack.areItemStackTagsEqual(itemStack, price2) && price2 != null + && itemStack.isItemEqual(price2)) { + count2 += itemStack.stackSize; + price2slots.add(i); + } + } + + // How many times can we pay the first item + int a = count1 / price1.stackSize; + // How many times can we pay the second item + int b = price2 != null ? count2 / price2.stackSize : Integer.MAX_VALUE; + // How many can we buy while still taking up one inventory slot + int c = result.getItem() + .getItemStackLimit(result) / result.stackSize; + // How many uses does the recipe have left + int d = ((AccessorMerchantRecipe) recipe).getMaxUses() - (((AccessorMerchantRecipe) recipe).getCurrentUses()); + int count = Math.min(Math.min(Math.min(a, b), shift ? c : 1), d); + + if (count < 1) return false; + + try { + merchant.setCustomer(player); + for (int i = 0; i < count; i++) { + merchant.useRecipe(recipe); + } + merchant.setCustomer(null); + } catch (Throwable e) { + return false; + } + + ItemStack resultStack = result.copy(); + resultStack.stackSize = result.stackSize * count; + if (!player.inventory.addItemStackToInventory(resultStack)) return false; + + // Remove cost from player inventory + count1 = price1.stackSize * count; + for (int i : price1slots) { + ItemStack itemStack = player.inventory.mainInventory[i]; + if (itemStack.stackSize <= count1) { + player.inventory.mainInventory[i] = null; + } else { + itemStack.stackSize -= count1; + } + count1 -= itemStack.stackSize; + + if (count1 <= 0) break; + } + if (price2 != null) { + count2 = price2.stackSize * count; + for (int i : price2slots) { + ItemStack itemStack = player.inventory.mainInventory[i]; + if (itemStack.stackSize <= count2) { + player.inventory.mainInventory[i] = null; + } else { + itemStack.stackSize -= count2; + } + count2 -= itemStack.stackSize; + + if (count2 <= 0) break; + } + } + + return true; + } + + public MerchantRecipeListWrapper getRecipeList() { + return recipeList; + } + + public void highLightVillager() { + IMerchant merchant = recipeList.getMerchant(); + if (merchant == null || (merchant instanceof EntityLiving && !((EntityLiving) merchant).isEntityAlive())) + return; + Entity villager = (Entity) merchant; + + ArrayList ids = new ArrayList<>(); + ids.add(villager.getEntityId()); + FindItHelper.entityHighlighter.highlightEntities(ids, System.currentTimeMillis() + 10000); + ArrayList positions = new ArrayList<>(); + positions.add(new ChunkPosition((int) villager.posX, (int) villager.posY, (int) villager.posZ)); + FindItHelper.rotateViewHelper(positions); + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerWidget.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerWidget.java new file mode 100644 index 00000000..da6c373e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/VillagerWidget.java @@ -0,0 +1,147 @@ +package com.fouristhenumber.utilitiesinexcess.compat.mui.tradingpost; + +import java.util.List; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IMerchant; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.village.MerchantRecipe; +import net.minecraft.village.MerchantRecipeList; + +import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.drawable.GuiTextures; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import com.cleanroommc.modularui.widgets.layout.Column; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTradingPost; +import com.fouristhenumber.utilitiesinexcess.common.wrappers.MerchantRecipeListWrapper; + +public class VillagerWidget extends Column { + + private final PosGuiData data; + private final PanelSyncManager manager; + private final VillagerSyncHandler villagerSyncHandler; + private final VillagerColumn villagerColumn; + private boolean initializedRecipes; + private TileEntityTradingPost.TradingPostPanel tradingPostPanel; + private int columnNumber; + + public static EntityLivingBase lastVillager; + + public VillagerWidget(PosGuiData data, PanelSyncManager manager, IMerchant merchant, + VillagerColumn villagerColumn) { + super(); + this.data = data; + this.manager = manager; + background(GuiTextures.BUTTON_CLEAN); + + if (merchant != null) { + villagerSyncHandler = new VillagerSyncHandler( + this, + data, + new MerchantRecipeListWrapper(merchant, data.getPlayer())); + setSyncHandler(villagerSyncHandler); + } else { + villagerSyncHandler = null; + } + + this.villagerColumn = villagerColumn; + initializedRecipes = false; + } + + @Override + public boolean isValidSyncHandler(SyncHandler syncHandler) { + return syncHandler instanceof VillagerSyncHandler; + } + + public void syncRecipes(MerchantRecipeListWrapper recipeList) { + MerchantRecipeList merchantRecipeList = recipeList.getRecipeList(); + List children = getChildren(); + + for (int i = 0; i < merchantRecipeList.size(); i++) { + MerchantRecipe recipe = (MerchantRecipe) merchantRecipeList.get(i); + + if (i < children.size()) { + ((TradeWidget) children.get(i)).setRecipe(recipe) + .index(i) + .favorite(recipeList.isFavorite(i)) + .columnSyncHandler((VillagerSyncHandler) this.getSyncHandler()); + } else { + child( + new TradeWidget(recipe).index(i) + .favorite(recipeList.isFavorite(i)) + .columnSyncHandler((VillagerSyncHandler) this.getSyncHandler())); + } + } + + if (!initializedRecipes && data.getWorld().isRemote) { + setEnabled(matches(SearchBar.prevText.toLowerCase())); + + if (isEnabled()) { + if (isFavorite()) { + villagerColumn.moveChild(this, 0); + } else { + villagerColumn.moveChild(this, tradingPostPanel.columnCounts[columnNumber]); + tradingPostPanel.columnCounts[columnNumber]++; + } + } + + initializedRecipes = true; + } + + scheduleResize(); + } + + public boolean matches(String search) { + for (IWidget widget : getChildren()) { + if (widget instanceof TradeWidget && ((TradeWidget) widget).matches(search)) return true; + } + if (villagerSyncHandler != null && villagerSyncHandler.getRecipeList() != null + && villagerSyncHandler.getRecipeList() + .getMerchant() != null + && villagerSyncHandler.getRecipeList() + .getMerchant() instanceof EntityLiving living + && (living.getCustomNameTag() + .toLowerCase() + .contains(search) + || (living instanceof EntityVillager villager && TileEntityTradingPost.getVillagerDisplayName(villager) + .toLowerCase() + .contains(search)))) + return true; + + return false; + } + + @Override + public void onUpdate() { + super.onUpdate(); + if (!data.getWorld().isRemote) return; + + if (isHovering() || isBelowMouse()) { + if (villagerSyncHandler.getRecipeList() + .getMerchant() instanceof EntityLivingBase entityMerchant) { + lastVillager = entityMerchant; + } + } + } + + public boolean isFavorite() { + for (IWidget widget : getChildren()) { + TradeWidget tradeWidget = (TradeWidget) widget; + if (tradeWidget.isFavorite()) return true; + } + return false; + } + + public VillagerWidget tradingPostPanel(TileEntityTradingPost.TradingPostPanel tradingPostPanel) { + this.tradingPostPanel = tradingPostPanel; + return this; + } + + public VillagerWidget setColumnNumber(int columnNumber) { + this.columnNumber = columnNumber; + return this; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/NEIConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/NEIConfig.java new file mode 100644 index 00000000..2cf8bb95 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/NEIConfig.java @@ -0,0 +1,38 @@ +package com.fouristhenumber.utilitiesinexcess.compat.nei; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; + +import codechicken.nei.api.IConfigureNEI; +import codechicken.nei.recipe.GuiCraftingRecipe; +import codechicken.nei.recipe.GuiUsageRecipe; +import codechicken.nei.recipe.TemplateRecipeHandler; +import cpw.mods.fml.common.event.FMLInterModComms; + +@SuppressWarnings("unused") // automatically found by NEI +public class NEIConfig implements IConfigureNEI { + + @Override + public String getName() { + return "UtilitiesInExcess NEI Plugin"; + } + + @Override + public String getVersion() { + return "1.0"; // ?? + } + + @Override + public void loadConfig() { + addHandler(new QEDRecipeHandler()); + } + + private void addHandler(TemplateRecipeHandler handler) { + FMLInterModComms.sendRuntimeMessage( + UtilitiesInExcess.MODID, + "NEIPlugins", + "register-crafting-handler", + "utilitiesinexcess@" + handler.getRecipeName() + "@" + handler.getOverlayIdentifier()); + GuiCraftingRecipe.craftinghandlers.add(handler); + GuiUsageRecipe.usagehandlers.add(handler); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/QEDRecipeHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/QEDRecipeHandler.java new file mode 100644 index 00000000..179b5138 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/QEDRecipeHandler.java @@ -0,0 +1,80 @@ +package com.fouristhenumber.utilitiesinexcess.compat.nei; + +import net.minecraft.item.ItemStack; + +import com.fouristhenumber.utilitiesinexcess.api.QEDRecipe; +import com.fouristhenumber.utilitiesinexcess.api.QEDRegistry; + +import codechicken.nei.NEIClientConfig; +import codechicken.nei.NEIServerUtils; +import codechicken.nei.recipe.ShapedRecipeHandler; + +public class QEDRecipeHandler extends ShapedRecipeHandler { + + @Override + public String getOverlayIdentifier() { + return "qed_recipes"; + } + + @Override + public String getRecipeName() { + return "QED Recipes"; + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + for (QEDRecipe qedRecipe : QEDRegistry.instance() + .getAllRecipes()) { + if (!qedRecipe.containsInput(ingredient)) continue; + CachedShapedRecipe neiRecipe = makeNeiRecipe(qedRecipe); + if (neiRecipe == null) continue; + neiRecipe.computeVisuals(); + neiRecipe.setIngredientPermutation(neiRecipe.ingredients, ingredient); + this.arecipes.add(neiRecipe); + } + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals(getOverlayIdentifier())) { + for (QEDRecipe qedRecipe : QEDRegistry.instance() + .getAllRecipes()) { + CachedShapedRecipe neiRecipe = makeNeiRecipe(qedRecipe); + if (neiRecipe == null) continue; + neiRecipe.computeVisuals(); + this.arecipes.add(neiRecipe); + } + } else if (outputId.equals("item")) { + loadCraftingRecipes((ItemStack) results[0]); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for (QEDRecipe qedRecipe : QEDRegistry.instance() + .getAllRecipes()) { + if (NEIServerUtils.areStacksSameTypeCrafting(qedRecipe.getOutput(), result)) { + CachedShapedRecipe neiRecipe = makeNeiRecipe(qedRecipe); + if (neiRecipe == null) continue; + neiRecipe.computeVisuals(); + this.arecipes.add(neiRecipe); + } + } + } + + private CachedShapedRecipe makeNeiRecipe(QEDRecipe recipe) { + try { + Object[] inputs = recipe.getInputs(); + for (Object rawInput : inputs) { + if (rawInput instanceof ItemStack[]inputOptions && inputOptions.length == 0) { + return null; + } + } + + return new CachedShapedRecipe(3, 3, inputs, recipe.getOutput()); + } catch (Exception e) { + NEIClientConfig.logger.error("Error loading QED recipe: ", e); + return null; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/BedrockiumActiveToolMod.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/BedrockiumActiveToolMod.java new file mode 100644 index 00000000..a553f169 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/BedrockiumActiveToolMod.java @@ -0,0 +1,28 @@ +package com.fouristhenumber.utilitiesinexcess.compat.tinkers; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.World; + +import tconstruct.library.ActiveToolMod; +import tconstruct.library.tools.ToolCore; + +public class BedrockiumActiveToolMod extends ActiveToolMod { + + @Override + public void updateTool(ToolCore tool, ItemStack stack, World world, Entity entity) { + if (world.isRemote || !(entity instanceof EntityPlayer player) || !stack.hasTagCompound()) return; + if (player.getHeldItem() != stack) return; + + NBTTagCompound toolTag = stack.getTagCompound() + .getCompoundTag("InfiTool"); + + if (toolTag.getBoolean("Heavy")) { + player.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 0, 1, true)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/TinkersCompat.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/TinkersCompat.java new file mode 100644 index 00000000..bc2826e5 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/TinkersCompat.java @@ -0,0 +1,20 @@ +package com.fouristhenumber.utilitiesinexcess.compat.tinkers; + +import net.minecraftforge.common.MinecraftForge; + +import cpw.mods.fml.common.FMLCommonHandler; +import tconstruct.library.TConstructRegistry; + +public class TinkersCompat { + + public static void init() { + TinkersEvents tinkersEvents = new TinkersEvents(); + MinecraftForge.EVENT_BUS.register(tinkersEvents); + FMLCommonHandler.instance() + .bus() + .register(tinkersEvents); + + TConstructRegistry.registerActiveToolMod(new BedrockiumActiveToolMod()); + TinkersMaterials.registerMaterials(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/TinkersEvents.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/TinkersEvents.java new file mode 100644 index 00000000..5e04983f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/TinkersEvents.java @@ -0,0 +1,46 @@ +package com.fouristhenumber.utilitiesinexcess.compat.tinkers; + +import net.minecraft.nbt.NBTTagCompound; + +import com.fouristhenumber.utilitiesinexcess.config.OtherConfig; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import tconstruct.library.event.ToolCraftEvent; + +public class TinkersEvents { + + private static final String[] components = new String[] { "Head", "Handle", "Accessory", "Extra" }; + + @SubscribeEvent + public void craftTool(ToolCraftEvent.NormalTool event) { + NBTTagCompound toolTag = event.toolTag.getCompoundTag("InfiTool"); + + for (String component : components) { + if (toolTag.getInteger(component) == OtherConfig.bedrockiumTinkersID) { + toolTag.setBoolean("Heavy", true); + break; + } + } + + boolean allInverted = true; + for (String component : components) { + if (toolTag.hasKey(component) && toolTag.getInteger(component) != OtherConfig.invertedTinkersID) { + allInverted = false; + break; + } + } + if (allInverted) toolTag.setInteger("Unbreaking", 10); + + boolean allMagicWood = true; + for (String component : components) { + if (toolTag.hasKey(component) && toolTag.getInteger(component) != OtherConfig.magicalWoodTinkersID) { + allMagicWood = false; + break; + } + } + if (allMagicWood) { + toolTag.setInteger("Modifiers", toolTag.getInteger("Modifiers") + 8); + toolTag.setBoolean("MagicallyModifiable", true); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/TinkersMaterials.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/TinkersMaterials.java new file mode 100644 index 00000000..a5f4ea52 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/tinkers/TinkersMaterials.java @@ -0,0 +1,204 @@ +package com.fouristhenumber.utilitiesinexcess.compat.tinkers; + +import static net.minecraft.util.EnumChatFormatting.DARK_GRAY; +import static net.minecraft.util.EnumChatFormatting.DARK_GREEN; +import static net.minecraft.util.EnumChatFormatting.GOLD; +import static tconstruct.TConstruct.basinCasting; +import static tconstruct.TConstruct.tableCasting; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.StatCollector; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.oredict.OreDictionary; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.fouristhenumber.utilitiesinexcess.config.OtherConfig; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig; + +import cpw.mods.fml.common.event.FMLInterModComms; +import cpw.mods.fml.common.registry.GameRegistry; +import tconstruct.TConstruct; +import tconstruct.library.TConstructRegistry; +import tconstruct.library.client.TConstructClientRegistry; +import tconstruct.library.crafting.FluidType; +import tconstruct.library.crafting.PatternBuilder; +import tconstruct.library.crafting.Smeltery; +import tconstruct.smeltery.TinkerSmeltery; +import tconstruct.tools.TinkerTools; + +public class TinkersMaterials { + + public static Fluid invertedFluid = TinkerSmeltery.registerFluid("inverted"); + public static Fluid bedrockiumFluid = TinkerSmeltery.registerFluid("bedrockium"); + + public static void registerMaterials() { + + int invertedID = OtherConfig.invertedTinkersID; + int bedrockiumID = OtherConfig.bedrockiumTinkersID; + int magicalWoodID = OtherConfig.magicalWoodTinkersID; + + if (InversionConfig.enableInvertedIngot) { + TConstructRegistry + .addToolMaterial(invertedID, "inverted", 4, 100, 700, 2, 0.6F, 4, 0, DARK_GREEN.toString(), 0x53763B); + + TConstructRegistry.addBowMaterial(invertedID, 109, 1f); + TConstructRegistry.addArrowMaterial(invertedID, 2.4F, 0F); + + doGenericRegistration( + invertedID, + "inverted", + new ItemStack(ModItems.INVERTED_INGOT.get(), 1, OreDictionary.WILDCARD_VALUE)); + + FluidRegistry.registerFluid(invertedFluid); + FluidType.registerFluidType( + invertedFluid.getName(), + ModBlocks.INVERTED_BLOCK.get(), + 0, + 850, + invertedFluid, + true); + Smeltery.addMelting( + ModBlocks.INVERTED_BLOCK.newItemStack(), + ModBlocks.INVERTED_BLOCK.get(), + 0, + 850, + new FluidStack(invertedFluid, TConstruct.blockLiquidValue)); + Smeltery.addMelting( + ModItems.INVERTED_INGOT.newItemStack(), + ModBlocks.INVERTED_BLOCK.get(), + 0, + 850, + new FluidStack(invertedFluid, TConstruct.ingotLiquidValue)); + Smeltery.addMelting( + ModItems.INVERTED_INGOT.newItemStack(1, 1), + ModBlocks.INVERTED_BLOCK.get(), + 0, + 850, + new FluidStack(invertedFluid, TConstruct.ingotLiquidValue)); + Smeltery.addMelting( + ModItems.INVERTED_NUGGET.newItemStack(), + ModBlocks.INVERTED_BLOCK.get(), + 0, + 850, + new FluidStack(invertedFluid, TConstruct.nuggetLiquidValue)); + + basinCasting.addCastingRecipe( + ModBlocks.INVERTED_BLOCK.newItemStack(), + new FluidStack(invertedFluid, TConstruct.blockLiquidValue), + 100); + + NBTTagCompound smelteryTag = new NBTTagCompound(); + smelteryTag.setInteger("MaterialId", invertedID); + smelteryTag.setString("FluidName", invertedFluid.getName()); + FMLInterModComms.sendMessage("TConstruct", "addPartCastingMaterial", smelteryTag); + } + if (ItemConfig.enableBedrockium) { + TConstructRegistry.addToolMaterial( + bedrockiumID, + "bedrockium_uie", + 7, + 7500, + 800, + 4, + 1.75F, + 0, + 0, + DARK_GRAY.toString(), + 0xFFFFFF); + + TConstructRegistry.addBowMaterial(bedrockiumID, 200, 3f); + TConstructRegistry.addArrowMaterial(bedrockiumID, 40F, 0.4F); + + doGenericRegistration(bedrockiumID, "bedrockium_uie", new ItemStack(ModItems.BEDROCKIUM_INGOT.get())); + + FluidRegistry.registerFluid(bedrockiumFluid); + FluidType.registerFluidType( + bedrockiumFluid.getName(), + ModBlocks.BEDROCKIUM_BLOCK.get(), + 0, + 850, + bedrockiumFluid, + true); + Smeltery.addMelting( + ModBlocks.BEDROCKIUM_BLOCK.newItemStack(), + ModBlocks.BEDROCKIUM_BLOCK.get(), + 0, + 850, + new FluidStack(bedrockiumFluid, TConstruct.blockLiquidValue)); + Smeltery.addMelting( + ModItems.BEDROCKIUM_INGOT.newItemStack(), + ModBlocks.BEDROCKIUM_BLOCK.get(), + 0, + 850, + new FluidStack(bedrockiumFluid, TConstruct.ingotLiquidValue)); + + tableCasting.addCastingRecipe( + ModItems.BEDROCKIUM_INGOT.newItemStack(), + new FluidStack(bedrockiumFluid, TConstruct.ingotLiquidValue), + new ItemStack(TinkerSmeltery.metalPattern, 1, 0), + false, + 50); + if (GameRegistry.findItem("TConstruct", "clayPattern") != null) { + tableCasting.addCastingRecipe( + ModItems.BEDROCKIUM_INGOT.newItemStack(), + new FluidStack(bedrockiumFluid, TConstruct.ingotLiquidValue), + new ItemStack(TinkerSmeltery.clayPattern, 1, 0), + true, + 50); + } + basinCasting.addCastingRecipe( + ModBlocks.BEDROCKIUM_BLOCK.newItemStack(), + new FluidStack(bedrockiumFluid, TConstruct.blockLiquidValue), + 100); + + NBTTagCompound smelteryTag = new NBTTagCompound(); + smelteryTag.setInteger("MaterialId", bedrockiumID); + smelteryTag.setString("FluidName", bedrockiumFluid.getName()); + FMLInterModComms.sendMessage("TConstruct", "addPartCastingMaterial", smelteryTag); + } + if (BlockConfig.enableMagicWood) { + TConstructRegistry + .addToolMaterial(magicalWoodID, "magical_wood", 2, 97, 150, 0, 1F, 0, 0, GOLD.toString(), 0x734829); + + TConstructRegistry.addBowMaterial(magicalWoodID, 18, 3f); + TConstructRegistry.addArrowMaterial(magicalWoodID, 0.69F, 0.5F); + + NBTTagCompound woodTag = new NBTTagCompound(); + ModBlocks.MAGIC_WOOD.newItemStack() + .writeToNBT(woodTag); + + NBTTagCompound partTag = new NBTTagCompound(); + partTag.setTag("Item", woodTag); + partTag.setInteger("MaterialId", magicalWoodID); + partTag.setInteger("Value", 2); + FMLInterModComms.sendMessage("TConstruct", "addPartBuilderMaterial", partTag); + + doGenericRegistration(magicalWoodID, "magical_wood", new ItemStack(ModBlocks.MAGIC_WOOD.getItem())); + + } + } + + private static void doGenericRegistration(int id, String name, ItemStack item) { + TConstructClientRegistry.addMaterialRenderMapping(id, "tinker", name, true); + + TConstructRegistry.toolMaterialStrings + .put(StatCollector.translateToLocal("material." + name), TConstructRegistry.toolMaterials.get(id)); + + PatternBuilder.instance.registerFullMaterial( + item, + 2, + name, + new ItemStack(TinkerTools.toolShard, 1, id), + new ItemStack(TinkerTools.toolRod, 1, id), + id); + + TConstructRegistry.addDefaultToolPartMaterial(id); + TConstructRegistry.addDefaultShardMaterial(id); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/OtherConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/OtherConfig.java new file mode 100644 index 00000000..6878f6c1 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/OtherConfig.java @@ -0,0 +1,35 @@ +package com.fouristhenumber.utilitiesinexcess.config; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; +import com.gtnewhorizon.gtnhlib.config.ConfigException; +import com.gtnewhorizon.gtnhlib.config.ConfigurationManager; + +@Config(modid = UtilitiesInExcess.MODID, category = "other") +public class OtherConfig { + + public static void registerConfig() throws ConfigException { + ConfigurationManager.registerConfig(OtherConfig.class); + } + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + @Config.Comment("Enable rendering some UIE baubles on players who have them equipped") + public static boolean enableBaubleRenders; + + @Config.DefaultBoolean(true) + @Config.Comment("Enables Tinkers' integration for bedrockium, inverted ingots, and magical wood") + public static boolean enableTinkersIntegration; + + @Config.DefaultInt(314) + @Config.Comment("314 is the tinkers material ID Extra Utilities uses for unstable and will therefore migrate tools automatically. Must change if both mods are installed!") + public static int invertedTinkersID; + + @Config.DefaultInt(315) + @Config.Comment("315 is the tinkers material ID Extra Utilities uses for bedrockium and will therefore migrate tools automatically. Must change if both mods are installed!") + public static int bedrockiumTinkersID; + + @Config.DefaultInt(316) + @Config.Comment("316 is the tinkers material ID Extra Utilities uses for magical wood and will therefore migrate tools automatically. Must change if both mods are installed!") + public static int magicalWoodTinkersID; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java new file mode 100644 index 00000000..d06c02c4 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java @@ -0,0 +1,183 @@ +package com.fouristhenumber.utilitiesinexcess.config.blocks; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; +import com.gtnewhorizon.gtnhlib.config.ConfigException; +import com.gtnewhorizon.gtnhlib.config.ConfigurationManager; + +@Config(modid = UtilitiesInExcess.MODID, category = "blocks") +public class BlockConfig { + + public static void registerConfig() throws ConfigException { + ConfigurationManager.registerConfig(BlockConfig.class); + ConfigurationManager.registerConfig(CursedEarthConfig.class); + ConfigurationManager.registerConfig(EnderLotusConfig.class); + ConfigurationManager.registerConfig(GeneratorConfig.class); + } + + @Config.DefaultBoolean(true) + public static boolean enableFloatingBlock; + + @Config.DefaultBoolean(true) + public static boolean enableColoredBlocks; + + @Config.DefaultBoolean(true) + public static boolean enableCompressedCobblestone; + + @Config.DefaultBoolean(true) + public static boolean enableCompressedDirt; + + @Config.DefaultBoolean(true) + public static boolean enableCompressedSand; + + @Config.DefaultBoolean(true) + public static boolean enableCompressedGravel; + + @Config.DefaultBoolean(true) + public static boolean enableRedstoneClock; + + @Config.DefaultBoolean(true) + public static boolean enableEtherealGlass; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableTrashCanItem; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableTrashCanFluid; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableTrashCanEnergy; + + @Config.DefaultBoolean(true) + public static boolean enableDrum; + + @Config.DefaultBoolean(true) + public static boolean enableMagicWood; + + @Config.DefaultBoolean(true) + public static boolean enableMarginallyMaximisedChest; + + @Config.DefaultBoolean(true) + public static boolean enableSignificantlyShrunkChest; + + @Config.DefaultBoolean(true) + public static boolean enableRadicallyReducedChest; + + @Config.DefaultBoolean(true) + public static boolean enablePacifistsBench; + + @Config.DefaultInt(600) + public static int pacifistsBenchCooldownInTicks; + + @Config.DefaultBoolean(false) + public static boolean pacifistsBenchInNonPeaceful; + + @Config.DefaultBoolean(true) + public static boolean enableBlockUpdateDetector; + + @Config.DefaultBoolean(true) + public static boolean enableBlackoutCurtains; + + @Config.RequiresMcRestart + @Config.DefaultBoolean(true) + public static boolean enableLapisAetherius; + + @Config.DefaultBoolean(true) + public static boolean enableConveyor; + + @Config.DefaultBoolean(true) + public static boolean enableUnderWorldPortal; + + @Config.DefaultBoolean(true) + public static boolean enableEndOfTimePortal; + + @Config.DefaultBoolean(true) + public static boolean enableSmartPump; + + @Config.DefaultBoolean(true) + public static boolean enableTradingPost; + + @Config.DefaultInt(10000) + public static int smartPumpEnergyStorage; + + @Config.DefaultInt(100) + public static int smartPumpEnergyUsePerBlock; + + @Config.DefaultInt(200) + public static int smartPumpStallCooldownInTicks; + + @Config.DefaultBoolean(true) + public static boolean enableDecorativeGlass; + + @Config.DefaultBoolean(true) + public static boolean enableDecorativeBlocks; + + @Config.Comment("Pure Love Configuration") + public static final PureLove pureLove = new PureLove(); + + @Config.LangKey("utilitiesinexcess.config.block.pure_love") + public static class PureLove { + + @Config.DefaultBoolean(true) + public boolean enablePureLove; + + @Config.Comment("Radius within which animals fall in love") + @Config.DefaultInt(8) + @Config.RangeInt(min = 1, max = 16) + public int rangePureLove; + } + + @Config.Comment("Sound Muffler Configuration") + public static final SoundMuffler soundMuffler = new SoundMuffler(); + + @Config.LangKey("utilitiesinexcess.config.block.sound_muffler") + public static class SoundMuffler { + + @Config.DefaultBoolean(true) + public boolean enableSoundMuffler; + + @Config.Comment("The volume reduction of sounds by the sound muffler. 0 = silent, 100 = normal level") + @Config.DefaultInt(5) + @Config.RangeInt(min = 0, max = 100) + public int soundMufflerReduction; + + @Config.Comment("The radius a sound muffler operates in (as a square box)") + @Config.DefaultInt(8) + @Config.RangeInt(min = 1, max = 64) + public int soundMufflerRange; + } + + @Config.Comment("Rain Muffler Configuration") + public static final RainMuffler rainMuffler = new RainMuffler(); + + @Config.LangKey("utilitiesinexcess.config.block.rain_muffler") + public static class RainMuffler { + + @Config.DefaultBoolean(true) + public boolean enableRainMuffler; + + @Config.Comment("The radius a rain muffler operates in (as a square box)") + @Config.DefaultInt(64) + @Config.RangeInt(min = 1, max = 256) + public int rainMufflerRange; + } + + @Config.Comment("Cursed Earth Configuration") + public static final Spikes spikes = new Spikes(); + + @Config.LangKey("utilitiesinexcess.config.block.spikes") + public static class Spikes { + + @Config.DefaultBoolean(true) + public boolean enableWoodenSpike; + @Config.DefaultBoolean(true) + public boolean enableIronSpike; + @Config.DefaultBoolean(true) + public boolean enableGoldSpike; + @Config.DefaultBoolean(true) + public boolean enableDiamondSpike; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/CursedEarthConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/CursedEarthConfig.java new file mode 100644 index 00000000..b103d42a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/CursedEarthConfig.java @@ -0,0 +1,32 @@ +package com.fouristhenumber.utilitiesinexcess.config.blocks; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "blocks.cursed_earth") +@Config.Comment("Cursed Earth Configuration") +@Config.LangKey("utilitiesinexcess.config.block.cursed_earth") +public class CursedEarthConfig { + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableCursedEarth; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableBlessedEarth; + + @Config.Comment("Should blessed earth burn in darkness like cursed earth burns in the light") + @Config.DefaultBoolean(false) + public static boolean enableBlessedEarthBurn; + + @Config.Comment("Chance that a mob is spawned on a Cursed Earth block on a random tick.") + @Config.DefaultInt(40) + @Config.RangeInt(min = 0, max = 100) + public static int cursedEarthSpawnRate; + + @Config.Comment("Chance that a mob is spawned on a Blessed Earth block on a random tick.") + @Config.DefaultInt(40) + @Config.RangeInt(min = 0, max = 100) + public static int blessedEarthSpawnRate; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderLotusConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderLotusConfig.java new file mode 100644 index 00000000..e5c43eba --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderLotusConfig.java @@ -0,0 +1,33 @@ +package com.fouristhenumber.utilitiesinexcess.config.blocks; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "blocks.ender_lotus") +@Config.Comment("Ender Lotus Configuration") +@Config.LangKey("utilitiesinexcess.config.block.ender_lotus") +public class EnderLotusConfig { + + @Config.DefaultBoolean(true) + public static boolean enableEnderLotus; + + @Config.Comment("Spawn Ender Lotuses in the End") + @Config.DefaultBoolean(true) + public static boolean spawnEnderLotusesInEnd; + + @Config.Comment("Average growth ticks to increase growth stage while planted on endstone") + @Config.DefaultInt(25) + public static int growthTicksOnEndstone; + + @Config.Comment("Average growth ticks to increase growth stage while planted on dirt/grass") + @Config.DefaultInt(100) + public static int growthTicksOnDirt; + + @Config.Comment("Chance to drop an extra seed when harvested from a fully grown plant on endstone") + @Config.DefaultDouble(0.02) + public static double extraSeedChanceOnEndstone; + + @Config.Comment("Ender Lotuses hurt players and mobs when they walk on them") + @Config.DefaultBoolean(true) + public static boolean thornyLotuses; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/GeneratorConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/GeneratorConfig.java new file mode 100644 index 00000000..423c77bd --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/GeneratorConfig.java @@ -0,0 +1,226 @@ +package com.fouristhenumber.utilitiesinexcess.config.blocks; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config.Comment("RF Generators Configuration") +@Config.LangKey("utilitiesinexcess.config.item.generator") +@Config(modid = UtilitiesInExcess.MODID, category = "blocks.generator") +public class GeneratorConfig { + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableLowTemperatureFurnaceGenerator; + + @Config.DefaultInt(100_000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int lowTemperatureFurnaceGeneratorRFCapacity; + + @Config.DefaultFloat(0.5F) + @Config.RangeFloat(min = 0.0001F, max = 10000F) + public static float lowTemperatureFurnaceGeneratorFuelUsageRatio; + + @Config.DefaultInt(5) + @Config.RangeInt(min = 1) + public static int lowTemperatureFurnaceGeneratorRFPerTick; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableFurnaceGenerator; + + @Config.DefaultInt(100_000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int furnaceGeneratorRFCapacity; + + @Config.DefaultFloat(0.3125F) + @Config.RangeFloat(min = 0.0001F, max = 10000F) + public static float furnaceGeneratorFuelUsageRatio; + + @Config.DefaultInt(40) + @Config.RangeInt(min = 1) + public static int furnaceGeneratorRFPerTick; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableHighTemperatureFurnaceGenerator; + + @Config.DefaultInt(100_000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int highTemperatureFurnaceGeneratorRFCapacity; + + @Config.DefaultFloat(0.0075F) + @Config.RangeFloat(min = 0.0001F, max = 10000F) + public static float highTemperatureFurnaceGeneratorFuelUsageRatio; + + @Config.DefaultInt(400) + @Config.RangeInt(min = 1) + public static int highTemperatureFurnaceGeneratorRFPerTick; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableLavaGenerator; + + @Config.DefaultInt(100_000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int lavaGeneratorRFCapacity; + + @Config.DefaultInt(40) + @Config.RangeInt(min = 1) + public static int lavaGeneratorRFPerTick; + + @Config.DefaultInt(50) + @Config.RangeInt(min = 1) + public static int lavaGeneratorFuelBurnTime; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableEnderGenerator; + + @Config.DefaultInt(100_000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int enderGeneratorRFCapacity; + + @Config.DefaultInt(40) + @Config.RangeInt(min = 1) + public static int enderGeneratorRFPerTick; + + @Config.DefaultInt(800) + @Config.RangeInt(min = 0) + public static int enderGeneratorEnderPearlBurnTime; + + @Config.DefaultInt(3000) + @Config.RangeInt(min = 0) + public static int enderGeneratorEnderEyeBurnTime; + + @Config.DefaultInt(12000) + @Config.RangeInt(min = 0) + public static int enderGeneratorEnderLotusSeedBurnTime; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableRedstoneGenerator; + + @Config.DefaultInt(100_000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int redstoneGeneratorRFCapacity; + + @Config.DefaultInt(80) + @Config.RangeInt(min = 1) + public static int redstoneGeneratorRFPerTick; + + @Config.DefaultInt(320) + @Config.RangeInt(min = 1) + public static int redstoneGeneratorFuelBurnTime; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableFoodGenerator; + + @Config.DefaultInt(100_000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int foodGeneratorRFCapacity; + + @Config.DefaultInt(4) + @Config.RangeInt(min = 1) + public static int foodGeneratorRFMultiplier; + + @Config.DefaultInt(900) + @Config.RangeInt(min = 1) + public static int foodGeneratorBurnTimeMultiplier; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enablePotionGenerator; + + @Config.DefaultInt(100_000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int potionGeneratorRFCapacity; + + @Config.DefaultInt(20) + @Config.RangeInt(min = 1) + public static int potionGeneratorRFMultiplier; + + @Config.DefaultInt(800) + @Config.RangeInt(min = 0) + public static int potionGeneratorBurnTime; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableSolarGenerator; + + @Config.DefaultInt(100_000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int solarGeneratorRFCapacity; + + @Config.DefaultInt(40) + @Config.RangeInt(min = 0) + public static int solarGeneratorTopGeneration; + + @Config.DefaultInt(40) + @Config.RangeInt(min = 0) + public static int solarGeneratorNoSkyGeneration; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableTNTGenerator; + + @Config.DefaultInt(1_000_000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int TNTGeneratorRFCapacity; + + @Config.DefaultInt(480_000) + @Config.RangeInt(min = 0) + public static int TNTGeneratorTNTFuelValue; + + @Config.DefaultInt(32_000) + @Config.RangeInt(min = 0) + public static int TNTGeneratorGunpowderFuelValue; + + @Config.DefaultBoolean(true) + public static boolean TNTGeneratorExplosions; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enablePinkGenerator; + + @Config.DefaultInt(100_000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int pinkGeneratorRFCapacity; + + @Config.DefaultInt(40) + @Config.RangeInt(min = 1) + public static int pinkGeneratorRFPerTick; + + @Config.DefaultInt(400) + @Config.RangeInt(min = 1) + public static int pinkGeneratorFuelBurnTime; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableNetherStarGenerator; + + @Config.DefaultInt(100_000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int netherStarGeneratorRFCapacity; + + @Config.DefaultInt(40_000) + @Config.RangeInt(min = 1) + public static int netherStarGeneratorRFPerTick; + + @Config.DefaultInt(2400) + @Config.RangeInt(min = 1) + public static int netherStarGeneratorFuelBurnTime; + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/dimensions/DimensionConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/dimensions/DimensionConfig.java new file mode 100644 index 00000000..affe4da9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/dimensions/DimensionConfig.java @@ -0,0 +1,17 @@ +package com.fouristhenumber.utilitiesinexcess.config.dimensions; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; +import com.gtnewhorizon.gtnhlib.config.ConfigException; +import com.gtnewhorizon.gtnhlib.config.ConfigurationManager; + +@Config(modid = UtilitiesInExcess.MODID, category = "dimensions") +public class DimensionConfig { + + public static void registerConfig() throws ConfigException { + ConfigurationManager.registerConfig(DimensionConfig.class); + ConfigurationManager.registerConfig(UnderWorldConfig.class); + ConfigurationManager.registerConfig(EndOfTimeConfig.class); + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/dimensions/EndOfTimeConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/dimensions/EndOfTimeConfig.java new file mode 100644 index 00000000..ff4500c2 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/dimensions/EndOfTimeConfig.java @@ -0,0 +1,42 @@ +package com.fouristhenumber.utilitiesinexcess.config.dimensions; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "dimensions.end_of_time") +public class EndOfTimeConfig { + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableEndOfTime; + + @Config.DefaultInt(11) + @Config.RequiresMcRestart + public static int endOfTimeDimensionId; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + @Config.Comment("Enables the End of Time biome") + public static boolean enableEndOfTimeBiome; + + @Config.DefaultInt(51) + @Config.RequiresMcRestart + @Config.Comment("The biome ID for the End of Time biome") + public static int endOfTimeBiomeId; + + @Config.DefaultInt(51) + @Config.RequiresMcRestart + @Config.Comment("The biome to populate the End of Time with") + public static int defaultBiomeId; + + @Config.DefaultBoolean(false) + @Config.RequiresMcRestart + @Config.Comment("Enables rain in the End of Time") + public static boolean endOfTimeRain; + + @Config.DefaultBoolean(false) + @Config.RequiresMcRestart + @Config.Comment("Enables natural mob spawning in the End of Time") + public static boolean endOfTimeSpawning; + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/dimensions/UnderWorldConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/dimensions/UnderWorldConfig.java new file mode 100644 index 00000000..7b6f9fbe --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/dimensions/UnderWorldConfig.java @@ -0,0 +1,47 @@ +package com.fouristhenumber.utilitiesinexcess.config.dimensions; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "dimensions.under_world") +public class UnderWorldConfig { + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableUnderWorld; + + @Config.DefaultInt(10) + @Config.RequiresMcRestart + public static int underWorldDimensionId; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + @Config.Comment("Enables the underworld biome") + public static boolean enableUnderWorldBiome; + + @Config.DefaultInt(50) + @Config.RequiresMcRestart + @Config.Comment("The biome ID for the underworld biome") + public static int underWorldBiomeId; + + @Config.DefaultInt(50) + @Config.RequiresMcRestart + @Config.Comment("The biome to populate the underworld with") + public static int defaultBiomeId; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + @Config.Comment("Enables vanilla ore spawning") + public static boolean spawnVanillaOre; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + @Config.Comment("Enables custom ore spawning (typically used by mods to generate their ore)") + public static boolean spawnCustomOre; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + @Config.Comment("Enables increased ore rates and aggressive mob spawning in certain regions") + public static boolean enableDifficulty; + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/FireBatteryConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/FireBatteryConfig.java new file mode 100644 index 00000000..26e48220 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/FireBatteryConfig.java @@ -0,0 +1,34 @@ +package com.fouristhenumber.utilitiesinexcess.config.items; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "items.fire_battery") +public class FireBatteryConfig { + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableFireBattery; + + @Config.Comment("Maximum RF storage value.") + @Config.DefaultInt(1500000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int fireBatteryRFStorage; + + @Config.Comment("Maximum charge rate.") + @Config.DefaultInt(1500000) + @Config.RangeInt(min = 1) + @Config.RequiresMcRestart + public static int fireBatteryRFCharge; + + @Config.Comment("Maximum RF consumption.") + @Config.DefaultInt(15000) + @Config.RangeInt(min = 0) + public static int fireBatteryRFUsage; + + @Config.Comment("RF consumed per burn tick.") + @Config.DefaultInt(50) + @Config.RangeInt(min = 1) + public static int fireBatteryBurnTime; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java new file mode 100644 index 00000000..8ce594cf --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java @@ -0,0 +1,57 @@ +package com.fouristhenumber.utilitiesinexcess.config.items; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config.Comment("Inversion Ritual Configuration") +@Config.LangKey("utilitiesinexcess.config.item.inversion") +@Config(modid = UtilitiesInExcess.MODID, category = "items.inversion") +public class InversionConfig { + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableInversionSigil; + + @Config.Comment("Set to 0 for unlimited uses") + @Config.DefaultInt(256) + @Config.RangeInt(min = 0) + @Config.RequiresMcRestart + public static int awakenedInversionDurability; + + @Config.Comment("Amount of unique items in the list the north chest has to contain for the pseudo-inversion ritual") + @Config.DefaultInt(12) + @Config.RangeInt(min = 1, max = 14) + public static int northChestRequiredItems; + + @Config.Comment("Amount of unique items in the list the east chest has to contain for the pseudo-inversion ritual") + @Config.DefaultInt(12) + @Config.RangeInt(min = 1, max = 27) + public static int eastChestRequiredItems; + + @Config.Comment("Amount of unique items in the list the south chest has to contain for the pseudo-inversion ritual") + @Config.DefaultInt(12) + @Config.RangeInt(min = 1, max = 13) + public static int southChestRequiredItems; + + @Config.Comment("Amount of unique items in the list the west chest has to contain for the pseudo-inversion ritual") + @Config.DefaultInt(12) + @Config.RangeInt(min = 1, max = 12) + public static int westChestRequiredItems; + + @Config.Comment("Amount of mobs needed to kill to pass the siege of the ritual") + @Config.DefaultInt(100) + @Config.RangeInt(min = 4) + public static int siegeRequiredMobsKill; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enableInvertedIngot; + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean invertedIngotsImplode; + + @Config.DefaultInt(300) + @Config.RequiresMcRestart + public static int invertedIngotImplosionTimer; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java new file mode 100644 index 00000000..b2f50e45 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java @@ -0,0 +1,55 @@ +package com.fouristhenumber.utilitiesinexcess.config.items; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.UnstableTools; +import com.gtnewhorizon.gtnhlib.config.Config; +import com.gtnewhorizon.gtnhlib.config.ConfigException; +import com.gtnewhorizon.gtnhlib.config.ConfigurationManager; + +@Config(modid = UtilitiesInExcess.MODID, category = "items") +public class ItemConfig { + + @Config.DefaultBoolean(false) + public static boolean registerDisabledItems; + + public static void registerConfig() throws ConfigException { + ConfigurationManager.registerConfig(ItemConfig.class); + UnstableTools.registerConfig(); + ConfigurationManager.registerConfig(WateringCanConfig.class); + ConfigurationManager.registerConfig(InversionConfig.class); + ConfigurationManager.registerConfig(FireBatteryConfig.class); + } + + @Config.DefaultBoolean(true) + public static boolean enableHeavenlyRing; + + @Config.DefaultBoolean(true) + public static boolean enableMobJar; + + @Config.DefaultBoolean(true) + public static boolean enableArchitectsWand; + + @Config.DefaultInt(9) + public static int architectsWandBuildLimit; + + @Config.DefaultBoolean(true) + public static boolean enableSuperArchitectsWand; + + @Config.DefaultInt(49) + public static int superArchitectsWandBuildLimit; + + @Config.DefaultBoolean(true) + public static boolean enableBedrockium; + + @Config.DefaultBoolean(true) + public static boolean enableGoldenBagOfHolding; + + @Config.DefaultBoolean(true) + public static boolean enableXRayGlasses; + + @Config.DefaultBoolean(true) + public static boolean enableBlockAnalyzer; + + @Config.DefaultBoolean(true) + public static boolean enableGlove; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/WateringCanConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/WateringCanConfig.java new file mode 100644 index 00000000..70ad9cb4 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/WateringCanConfig.java @@ -0,0 +1,78 @@ +package com.fouristhenumber.utilitiesinexcess.config.items; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "items.wateringcan") +public class WateringCanConfig { + + @Config.Comment("Watering Can Configuration") + public static final WateringCan wateringCan = new WateringCan(); + + @Config.LangKey("utilitiesinexcess.config.item.watering_can") + public static class WateringCan { + + @Config.Comment("Watering Can Tier Configuration") + public final WateringCanTier Tier = new WateringCanTier(); + + @Config.Comment("Watering Can Flowering Configuration") + public final WateringCanFlowering Flowering = new WateringCanFlowering(); + + @Config.DefaultBoolean(false) + @Config.Name("Allow Automated Watering") + @Config.Comment("If true, the watering can can be used by FakePlayers.") + @Config.RequiresMcRestart + public boolean allowAutomatedWatering; + + @Config.DefaultBoolean(true) + @Config.Name("Allow Watering Can Toggle") + @Config.Comment("If true, the watering can can be toggled on and off by Crouch + right-clicking.") + public boolean allowWateringCanToggle; + + @Config.DefaultBoolean(true) + @Config.Sync + @Config.Name("Walking Speed Penalty") + @Config.Comment("If true, the player will be slowed down while using the watering can.") + public boolean walkingSpeedPenalty; + + @Config.LangKey("utilitiesinexcess.config.item.watering_can_flowering") + public static class WateringCanFlowering { + + @Config.DefaultBoolean(true) + @Config.Name("Allow Flower Duplication") + @Config.Comment("If true, using the watering can on a flower will duplicate that flower.") + public boolean allowFlowerDuplication; + + @Config.DefaultBoolean(true) + @Config.Name("Allow Flower Spawning") + @Config.Comment("If true, using the watering can on a grass block will spawn random flowers on that block.") + public boolean allowFlowerSpawning; + + @Config.DefaultBoolean(true) + @Config.Name("Spawn Flowers Beside Short Blocks") + @Config.Comment("If true, when targeting short blocks (height < 0.85), the flower’s spawn height is lowered by the block’s height to attempt spawning beside the block instead of directly on top.") + public boolean adjustFlowerSpawnHeightForShortBlocks; + + } + + @Config.LangKey("utilitiesinexcess.config.item.watering_can_tier") + public static class WateringCanTier { + + @Config.DefaultBoolean(true) + @Config.Name("Enable Basic Watering Can") + @Config.Comment("Enable or disable the Basic Watering Can item.") + public boolean enableWateringCanBasic; + + @Config.DefaultBoolean(true) + @Config.Name("Enable Advanced Watering Can") + @Config.Comment("Enable or disable the Advanced Watering Can item.") + public boolean enableWateringCanAdvanced; + + @Config.DefaultBoolean(true) + @Config.Name("Enable Elite Watering Can") + @Config.Comment("Enable or disable the Elite Watering Can item.") + public boolean enableWateringCanElite; + + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/AntiParticulateShovelConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/AntiParticulateShovelConfig.java new file mode 100644 index 00000000..cc3bd073 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/AntiParticulateShovelConfig.java @@ -0,0 +1,20 @@ +package com.fouristhenumber.utilitiesinexcess.config.items.unstabletools; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "items.unstable_tools.anti_particulate_shovel") +public class AntiParticulateShovelConfig { + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enable; + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean unbreakable; + @Config.DefaultBoolean(true) + public static boolean breakFallingAbove; + @Config.DefaultBoolean(true) + public static boolean voidMinedBlocks; + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java new file mode 100644 index 00000000..e645443c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/DestructionPickaxeConfig.java @@ -0,0 +1,27 @@ +package com.fouristhenumber.utilitiesinexcess.config.items.unstabletools; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "items.unstable_tools.destruction_pickaxe") +public class DestructionPickaxeConfig { + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enable; + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean unbreakable; + @Config.DefaultBoolean(false) + public static boolean voidMinedBlock; + @Config.DefaultStringList({ "minecraft:*stone", "minecraft:netherrack", "minecraft:*hardened_clay" }) + public static String[] includeEffective; + @Config.DefaultStringList({}) + public static String[] excludeEffective; + @Config.DefaultFloat(5) + @Config.RangeFloat(min = 0, max = 100) + public static float effectiveSpeedModifier; + @Config.DefaultFloat(0.0625f) + @Config.RangeFloat(min = 0, max = 100) + public static float ineffectiveSpeedModifier; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/EthericSwordConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/EthericSwordConfig.java new file mode 100644 index 00000000..c8e6fbf7 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/EthericSwordConfig.java @@ -0,0 +1,22 @@ +package com.fouristhenumber.utilitiesinexcess.config.items.unstabletools; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "items.unstable_tools.etheric_sword") +public class EthericSwordConfig { + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enable; + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean unbreakable; + + @Config.DefaultFloat(4) + @Config.RangeFloat(min = 0, max = 20) + public static float normalDamage; + @Config.DefaultFloat(3) + @Config.RangeFloat(min = 0, max = 20) + public static float magicDamage; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GluttonsAxeConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GluttonsAxeConfig.java new file mode 100644 index 00000000..e46b15a0 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GluttonsAxeConfig.java @@ -0,0 +1,35 @@ +package com.fouristhenumber.utilitiesinexcess.config.items.unstabletools; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "items.unstable_tools.gluttons_axe") +public class GluttonsAxeConfig { + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enable; + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean unbreakable; + @Config.DefaultBoolean(true) + public static boolean drainHp; + @Config.DefaultFloat(15) + @Config.RangeFloat(min = 0f, max = 100f) + public static float damageAgainstUndead; + @Config.DefaultBoolean(true) + public static boolean spawnParticles; + @Config.DefaultInt(3) + @Config.RangeInt(min = 0, max = 100) + public static int maxHeal; + @Config.DefaultInt(1) + @Config.RangeInt(min = 0, max = 20) + public static int foodGain; + @Config.DefaultFloat(0.25f) + @Config.RangeFloat(min = 0, max = 1) + public static float saturationGain; + @Config.DefaultBoolean(true) + public static boolean useHungerAlways; + @Config.DefaultBoolean(false) + public static boolean voidMinedBlock; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/PrecisionShearsConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/PrecisionShearsConfig.java new file mode 100644 index 00000000..d97971e5 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/PrecisionShearsConfig.java @@ -0,0 +1,25 @@ +package com.fouristhenumber.utilitiesinexcess.config.items.unstabletools; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "items.unstable_tools.precision_shears") +public class PrecisionShearsConfig { + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enable; + @Config.DefaultBoolean(true) + public static boolean unbreakable; + @Config.DefaultBoolean(true) + public static boolean spawnParticles; + @Config.DefaultInt(1) + @Config.RangeInt(min = 0) + public static int toolLevel; + @Config.DefaultFloat(4) + @Config.RangeFloat(min = 0, max = 100) + public static float efficiency; + @Config.DefaultInt(20) + @Config.RangeInt(min = 0) + public static int cooldown; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java new file mode 100644 index 00000000..b976ce00 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/ReversingHoeConfig.java @@ -0,0 +1,16 @@ +package com.fouristhenumber.utilitiesinexcess.config.items.unstabletools; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "items.unstable_tools.reversing_hoe") +public class ReversingHoeConfig { + + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean enable; + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean unbreakable; + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/UnstableTools.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/UnstableTools.java new file mode 100644 index 00000000..cf046428 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/UnstableTools.java @@ -0,0 +1,24 @@ +package com.fouristhenumber.utilitiesinexcess.config.items.unstabletools; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; +import com.gtnewhorizon.gtnhlib.config.ConfigException; +import com.gtnewhorizon.gtnhlib.config.ConfigurationManager; + +@Config.Comment("Unstable Tools Configuration") +@Config.LangKey("utilitiesinexcess.config.item.unstable_tools") +@Config(modid = UtilitiesInExcess.MODID, category = "items.unstable_tools") +public class UnstableTools { + + // Not sure abt nested categories, lets disccuss that later + public static void registerConfig() throws ConfigException { + ConfigurationManager.registerConfig(UnstableTools.class); + ConfigurationManager.registerConfig(GluttonsAxeConfig.class); + ConfigurationManager.registerConfig(EthericSwordConfig.class); + ConfigurationManager.registerConfig(AntiParticulateShovelConfig.class); + ConfigurationManager.registerConfig(DestructionPickaxeConfig.class); + ConfigurationManager.registerConfig(ReversingHoeConfig.class); + ConfigurationManager.registerConfig(PrecisionShearsConfig.class); + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java new file mode 100644 index 00000000..c31ff8af --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java @@ -0,0 +1,69 @@ +package com.fouristhenumber.utilitiesinexcess.mixins; + +import static com.fouristhenumber.utilitiesinexcess.mixins.TargetedMod.ANGELICA; + +import javax.annotation.Nonnull; + +import com.fouristhenumber.utilitiesinexcess.config.OtherConfig; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig; +import com.gtnewhorizon.gtnhmixins.builders.IMixins; +import com.gtnewhorizon.gtnhmixins.builders.MixinBuilder; + +public enum Mixins implements IMixins { + // spotless:off + + // make sure to leave a trailing comma + CURSED_EARTH_SPAWNER(new MixinBuilder("Boost spawners when placed on Cursed / Blessed Earth") + .addCommonMixins("minecraft.MixinMobSpawnerBaseLogic_CursedEarthSpawner") + .setPhase(Phase.EARLY) + .setApplyIf(() -> CursedEarthConfig.enableCursedEarth || CursedEarthConfig.enableBlessedEarth) + /*.addRequiredMod(TargetedMod.VANILLA)*/), + MAGIC_WOOD_PARTICLES(new MixinBuilder("Adds particles for Magic Wood when connected to an Enchantment Table") + .addClientMixins("minecraft.MixinBlockEnchantmentTable_MagicWood") + .setPhase(Phase.EARLY) + .setApplyIf(() -> BlockConfig.enableMagicWood) + .addExcludedMod(ANGELICA) + /*.addRequiredMod(TargetedMod.VANILLA)*/ + ), + GLOVE(new MixinBuilder("Implements the Glove's special right click") + .addCommonMixins("minecraft.MixinNetHandlerPlayServer_Glove", "minecraft.MixinItemRenderer_Glove", "minecraft.MixinPlayerControllerMP_Glove") + .setPhase(Phase.EARLY) + .setApplyIf(() -> ItemConfig.enableGlove) + /*.addRequiredMod(TargetedMod.VANILLA)*/), + BUABLE_RENDERS(new MixinBuilder("Renders equipped baubles on the player") + .addCommonMixins("minecraft.MixinModelBiped_Baubles", "minecraft.MixinModelRenderer_Baubles") + .setPhase(Phase.EARLY) + .setApplyIf(() -> OtherConfig.enableBaubleRenders) + /*.addRequiredMod(TargetedMod.VANILLA)*/), + ACCESSORS(new MixinBuilder("Accessors for the mod to use") + .setPhase(Phase.EARLY) + .addCommonMixins( + "minecraft.accessors.AccessorBlock", + "minecraft.accessors.AccessorEntityZombie", + "minecraft.accessors.AccessorItemTool", + "minecraft.accessors.AccessorItemSword", + "minecraft.accessors.AccessorEntityLivingBase", + "minecraft.accessors.AccessorPotionEffect", + "minecraft.accessors.AccessorItemRenderer", + "minecraft.accessors.AccessorClientMinecraft", + "minecraft.accessors.AccessorMerchantRecipe") + .addClientMixins( + "minecraft.accessors.AccessorBlock_Client") + ) + ; // leave trailing semicolon + // spotless:on + + private final MixinBuilder builder; + + Mixins(MixinBuilder builder) { + this.builder = builder; + } + + @Nonnull + @Override + public MixinBuilder getBuilder() { + return this.builder; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/TargetedMod.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/TargetedMod.java new file mode 100644 index 00000000..44af31db --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/TargetedMod.java @@ -0,0 +1,24 @@ +package com.fouristhenumber.utilitiesinexcess.mixins; + +import org.jetbrains.annotations.NotNull; + +import com.gtnewhorizon.gtnhmixins.builders.ITargetMod; +import com.gtnewhorizon.gtnhmixins.builders.TargetModBuilder; + +public enum TargetedMod implements ITargetMod { + + ANGELICA("com.gtnewhorizons.angelica.loading.AngelicaTweaker", "angelica"),; + + private final TargetModBuilder builder; + + TargetedMod(String coreModClass, String modId) { + this.builder = new TargetModBuilder().setCoreModClass(coreModClass) + .setModId(modId); + } + + @NotNull + @Override + public TargetModBuilder getBuilder() { + return builder; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/UIEMixinLoader.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/UIEMixinLoader.java new file mode 100644 index 00000000..71aa3010 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/UIEMixinLoader.java @@ -0,0 +1,64 @@ +package com.fouristhenumber.utilitiesinexcess.mixins; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.fouristhenumber.utilitiesinexcess.config.OtherConfig; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.fouristhenumber.utilitiesinexcess.config.dimensions.DimensionConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig; +import com.gtnewhorizon.gtnhlib.config.ConfigException; +import com.gtnewhorizon.gtnhmixins.IEarlyMixinLoader; +import com.gtnewhorizon.gtnhmixins.builders.IMixins; + +import cpw.mods.fml.relauncher.IFMLLoadingPlugin; + +@IFMLLoadingPlugin.MCVersion("1.7.10") +public class UIEMixinLoader implements IFMLLoadingPlugin, IEarlyMixinLoader { + + static { + // Register config here because then it's available during mixins. + try { + ItemConfig.registerConfig(); + BlockConfig.registerConfig(); + DimensionConfig.registerConfig(); + OtherConfig.registerConfig(); + } catch (ConfigException e) { + throw new RuntimeException(e); + } + } + + @Override + public String[] getASMTransformerClass() { + return null; + } + + @Override + public String getModContainerClass() { + return null; + } + + @Override + public String getSetupClass() { + return null; + } + + @Override + public void injectData(Map data) {} + + @Override + public String getAccessTransformerClass() { + return null; + } + + @Override + public String getMixinConfig() { + return "mixins.utilitiesinexcess.early.json"; + } + + @Override + public List getMixins(Set loadedCoreMods) { + return IMixins.getEarlyMixins(Mixins.class, loadedCoreMods); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinBlockEnchantmentTable_MagicWood.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinBlockEnchantmentTable_MagicWood.java new file mode 100644 index 00000000..3cf5b1e8 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinBlockEnchantmentTable_MagicWood.java @@ -0,0 +1,27 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockEnchantmentTable; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + +@Mixin(BlockEnchantmentTable.class) +public class MixinBlockEnchantmentTable_MagicWood { + + // Wraps World.getBlock() to avoid a mixin into an if-statement + @WrapOperation( + method = "Lnet/minecraft/block/BlockEnchantmentTable;randomDisplayTick(Lnet/minecraft/world/World;IIILjava/util/Random;)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getBlock(III)Lnet/minecraft/block/Block;")) + private Block uie$addMagicWoodParticles(World world, int x, int y, int z, Operation original) { + Block block = original.call(world, x, y, z); + if (block == ModBlocks.MAGIC_WOOD.get()) return Blocks.bookshelf; + return block; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinItemRenderer_Glove.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinItemRenderer_Glove.java new file mode 100644 index 00000000..1abb07a8 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinItemRenderer_Glove.java @@ -0,0 +1,35 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.entity.player.EntityPlayer; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.fouristhenumber.utilitiesinexcess.common.items.ItemGlove; +import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorItemRenderer; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + +@Mixin(ItemRenderer.class) +public class MixinItemRenderer_Glove { + + @Expression("? != null") + @WrapOperation(method = "renderItemInFirstPerson", at = @At(value = "MIXINEXTRAS:EXPRESSION", ordinal = 5)) + private boolean uie$renderFirstPersonArm(Object left, Object right, Operation original) { + ItemRenderer thisObject = (ItemRenderer) (Object) this; + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer player = mc.thePlayer; + AccessorItemRenderer air = (AccessorItemRenderer) thisObject; + + if (player == null) original.call(left, right); + + if ((player.getHeldItem() != null && player.getHeldItem() + .getItem() instanceof ItemGlove)) { + return false; + } + return original.call(left, right); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinMobSpawnerBaseLogic_CursedEarthSpawner.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinMobSpawnerBaseLogic_CursedEarthSpawner.java new file mode 100644 index 00000000..a474a8c5 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinMobSpawnerBaseLogic_CursedEarthSpawner.java @@ -0,0 +1,91 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.monster.IMob; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.MobSpawnerBaseLogic; +import net.minecraft.world.World; + +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockCursedEarth; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; + +@Mixin(MobSpawnerBaseLogic.class) +public abstract class MixinMobSpawnerBaseLogic_CursedEarthSpawner { + + @Shadow + public abstract World getSpawnerWorld(); + + @Shadow + public abstract int getSpawnerX(); + + @Shadow + public abstract int getSpawnerY(); + + @Shadow + public abstract int getSpawnerZ(); + + @Shadow + public int spawnDelay; + + @Unique + private boolean uie$isCursedEarth; + + // If the block below is cursed earth, run the + // spawner instead of depending on player location. + @ModifyReturnValue(method = "isActivated", at = @At("RETURN")) + private boolean uie$onIsActivated(boolean original) { + Block blockBelow = this.getSpawnerWorld() + .getBlock(this.getSpawnerX(), this.getSpawnerY() - 1, this.getSpawnerZ()); + uie$isCursedEarth = blockBelow instanceof BlockCursedEarth; + return uie$isCursedEarth || original; + } + + // Dividing the spawn time by 4 if + // the block is cursed earth. + @Inject( + method = "resetTimer", + at = @At( + value = "FIELD", + target = "Lnet/minecraft/tileentity/MobSpawnerBaseLogic;spawnDelay:I", + opcode = Opcodes.PUTFIELD, + shift = At.Shift.AFTER)) + private void uie$ChangeTime(CallbackInfo ci) { + if (uie$isCursedEarth) { + this.spawnDelay = this.spawnDelay / 4; + } + } + + // If the block is cursed earth, make the + // creatures persistent and add potion effects. + @ModifyArg( + method = "func_98265_a", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/World;spawnEntityInWorld(Lnet/minecraft/entity/Entity;)Z")) + private Entity uie$onEntitySpawned(Entity original) { + if (!uie$isCursedEarth) return original; + if (original instanceof EntityLiving living) { + // Make persistent + living.func_110163_bv(); + if (living instanceof IMob) { + living.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 72000, 0)); + living.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 72000, 0)); + } else { + living.addPotionEffect(new PotionEffect(Potion.regeneration.id, 72000, 0)); + } + } + return original; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelBiped_Baubles.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelBiped_Baubles.java new file mode 100644 index 00000000..b0e252bc --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelBiped_Baubles.java @@ -0,0 +1,87 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft; + +import net.minecraft.client.model.ModelBiped; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.fouristhenumber.utilitiesinexcess.common.items.ItemGlove; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemHeavenlyRing; +import com.fouristhenumber.utilitiesinexcess.common.renderers.GloveRenderer; +import com.fouristhenumber.utilitiesinexcess.common.renderers.HeavenlyRingRenderer; +import com.fouristhenumber.utilitiesinexcess.utils.ModelPartRenderHelper; +import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; + +@Mixin(ModelBiped.class) +public class MixinModelBiped_Baubles { + // This mixin should allow to render anything attached to any player body part + // Simply use ModelPartRenderHelper.renderBipedPart with the correct bodypart (instead of thisObject.bipedRightArm) + // inside uie$doExtraRender and do your rendering inside the runnable. + + @Inject( + method = "render", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/model/ModelRenderer;render(F)V", + shift = At.Shift.AFTER, + ordinal = 6), + remap = false) + private void uie$render1(Entity p_78088_1_, float p_78088_2_, float p_78088_3_, float p_78088_4_, float p_78088_5_, + float p_78088_6_, float p_78088_7_, CallbackInfo ci) { + uie$doExtraRender(p_78088_1_, p_78088_7_); + } + + @Inject( + method = "render", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/model/ModelRenderer;render(F)V", + shift = At.Shift.AFTER, + ordinal = 13), + remap = false) + private void uie$render2(Entity p_78088_1_, float p_78088_2_, float p_78088_3_, float p_78088_4_, float p_78088_5_, + float p_78088_6_, float p_78088_7_, CallbackInfo ci) { + uie$doExtraRender(p_78088_1_, p_78088_7_); + } + + private float uie$heavenlyRingWing = 1; + + private void uie$doExtraRender(Entity p_78088_1_, float p_78088_7_) { + ModelBiped thisObject = (ModelBiped) (Object) this; + + if (p_78088_1_ == null) return; + if (!(p_78088_1_ instanceof EntityPlayer)) return; + EntityPlayer player = (EntityPlayer) p_78088_1_; + + ItemStack stack = player.getHeldItem(); + if (stack == null || !(stack.getItem() instanceof ItemGlove)) + stack = UIEUtils.getBauble(player, ItemGlove.class); + + if (stack != null) { + ItemStack finalStack = stack; + ModelPartRenderHelper.renderBipedPart( + 0.0625F, + thisObject.bipedRightArm, + () -> GloveRenderer.renderGloveAsBauble(finalStack.getItemDamage())); + } + + ItemStack ring = ItemHeavenlyRing.wingedPlayers.getOrDefault(player, null); + if (ring == null) { + ring = UIEUtils.getBauble(player, ItemHeavenlyRing.class); + } + if (ring != null && ring.getItemDamage() != 0) { + final ItemStack finalRing = ring; + uie$heavenlyRingWing = HeavenlyRingRenderer + .getNextAngle(uie$heavenlyRingWing, player.capabilities.isFlying); + ModelPartRenderHelper.renderBipedPart( + p_78088_7_, + thisObject.bipedBody, + () -> { HeavenlyRingRenderer.render(finalRing.getItemDamage(), uie$heavenlyRingWing); }); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelRenderer_Baubles.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelRenderer_Baubles.java new file mode 100644 index 00000000..af34eabf --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelRenderer_Baubles.java @@ -0,0 +1,44 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft; + +import net.minecraft.client.renderer.entity.RenderPlayer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.fouristhenumber.utilitiesinexcess.common.items.ItemGlove; +import com.fouristhenumber.utilitiesinexcess.common.renderers.GloveRenderer; +import com.fouristhenumber.utilitiesinexcess.utils.ModelPartRenderHelper; +import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; + +@Mixin(RenderPlayer.class) +public class MixinModelRenderer_Baubles { + + @Inject( + method = "renderFirstPersonArm", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/model/ModelRenderer;render(F)V", + shift = At.Shift.AFTER), + remap = false) + private void uie$renderFirstPersonArm(EntityPlayer player, CallbackInfo ci) { + RenderPlayer thisObject = (RenderPlayer) (Object) this; + + if (player == null) return; + + ItemStack stack = player.getHeldItem(); + if (stack == null || !(stack.getItem() instanceof ItemGlove)) + stack = UIEUtils.getBauble(player, ItemGlove.class); + + if (stack != null) { + ItemStack finalStack = stack; + ModelPartRenderHelper.renderBipedPart( + 0.0625F, + thisObject.modelBipedMain.bipedRightArm, + () -> GloveRenderer.renderGloveAsBauble(finalStack.getItemDamage())); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinNetHandlerPlayServer_Glove.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinNetHandlerPlayServer_Glove.java new file mode 100644 index 00000000..6a40f217 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinNetHandlerPlayServer_Glove.java @@ -0,0 +1,122 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft; + +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.ContainerPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.network.Packet; +import net.minecraft.network.play.client.C08PacketPlayerBlockPlacement; +import net.minecraft.network.play.server.S2FPacketSetSlot; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.fouristhenumber.utilitiesinexcess.common.items.ItemGlove; +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +@Mixin(NetHandlerPlayServer.class) +public class MixinNetHandlerPlayServer_Glove { + + @Unique + boolean uie$isUsingGlove = false; + @Unique + ItemStack uie$theGlove; + + @Inject(method = "processPlayerBlockPlacement", at = @At("HEAD")) + private void uie$UseItemEarly(C08PacketPlayerBlockPlacement packetIn, CallbackInfo ci) { + NetHandlerPlayServer thisObject = (NetHandlerPlayServer) (Object) this; + EntityPlayer player = thisObject.playerEntity; + InventoryPlayer inventory = player.inventory; + ItemStack itemstack = inventory.getCurrentItem(); + ContainerPlayer inventoryContainer = (ContainerPlayer) player.inventoryContainer; + + if (ItemGlove.isUsingGlove(player)) { + uie$isUsingGlove = true; + if (uie$theGlove != null) { + EntityItem entityitem = new EntityItem( + player.worldObj, + player.posX, + player.posY + 0.5, + player.posZ, + uie$theGlove); + entityitem.delayBeforeCanPickup = 5; + player.worldObj.spawnEntityInWorld(entityitem); + } + + uie$theGlove = itemstack; + inventory.mainInventory[inventory.currentItem] = null; + if (inventoryContainer.inventoryItemStacks.size() > 36 + inventory.currentItem) + inventoryContainer.inventoryItemStacks.set(36 + inventory.currentItem, null); + } + } + + @Inject(method = "processPlayerBlockPlacement", at = @At("RETURN")) + private void uie$UseItemLate(C08PacketPlayerBlockPlacement packetIn, CallbackInfo ci) { + NetHandlerPlayServer thisObject = (NetHandlerPlayServer) (Object) this; + InventoryPlayer inventory = thisObject.playerEntity.inventory; + EntityPlayer player = thisObject.playerEntity; + ContainerPlayer inventoryContainer = (ContainerPlayer) player.inventoryContainer; + + if (uie$isUsingGlove) { + uie$isUsingGlove = false; + if (inventory.mainInventory[inventory.currentItem] != null) { + EntityItem entityitem = new EntityItem( + player.worldObj, + player.posX, + player.posY + 0.5, + player.posZ, + inventory.mainInventory[inventory.currentItem]); + entityitem.delayBeforeCanPickup = 5; + player.worldObj.spawnEntityInWorld(entityitem); + } + + inventory.mainInventory[inventory.currentItem] = uie$theGlove; + if (inventoryContainer.inventoryItemStacks.size() > 36 + inventory.currentItem) + inventoryContainer.inventoryItemStacks.set(36 + inventory.currentItem, uie$theGlove); + uie$theGlove = null; + } + } + + @Inject(method = "sendPacket", at = @At("HEAD"), cancellable = true) + private void uie$cancelItemChange(Packet packetIn, CallbackInfo ci) { + if (packetIn instanceof S2FPacketSetSlot && uie$isUsingGlove) { + ci.cancel(); + } + } + + @Definition(id = "itemstack", local = @Local(type = ItemStack.class)) + @Expression("itemstack == null") + @WrapOperation( + method = "processPlayerBlockPlacement", + at = @At(value = "MIXINEXTRAS:EXPRESSION", ordinal = 1), + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/entity/player/InventoryPlayer;getCurrentItem()Lnet/minecraft/item/ItemStack;", + ordinal = 1), + to = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;getMaxItemUseDuration()I"))) + private boolean uie$isStackNull(Object left, Object right, Operation original) { + if (uie$isUsingGlove) return false; + + return original.call(left, right); + } + + @WrapOperation( + method = "processPlayerBlockPlacement", + at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;getMaxItemUseDuration()I")) + private int uie$getMaxItemUseDuration(ItemStack instance, Operation original) { + if (uie$isUsingGlove) return 1; + + return original.call(instance); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinPlayerControllerMP_Glove.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinPlayerControllerMP_Glove.java new file mode 100644 index 00000000..a8cfe852 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinPlayerControllerMP_Glove.java @@ -0,0 +1,30 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft; + +import net.minecraft.client.multiplayer.PlayerControllerMP; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.WorldSettings; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemGlove; +import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +@Mixin(PlayerControllerMP.class) +public class MixinPlayerControllerMP_Glove { + + @WrapOperation( + method = "onPlayerRightClick", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/WorldSettings$GameType;isCreative()Z")) + private boolean uie$correctGloveRightClick(WorldSettings.GameType instance, Operation original, + @Local(argsOnly = true) EntityPlayer player) { + if (UIEUtils.hasBauble(player, ItemGlove.class) && UtilitiesInExcess.proxy.GLOVE_KEYBIND.isKeyDown(player)) { + return true; + } + return original.call(instance); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorBlock.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorBlock.java new file mode 100644 index 00000000..09f746c8 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorBlock.java @@ -0,0 +1,13 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors; + +import net.minecraft.block.Block; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(Block.class) +public interface AccessorBlock { + + @Accessor("unlocalizedName") + String uie$getUnlocalizedNameRaw(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorBlock_Client.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorBlock_Client.java new file mode 100644 index 00000000..97545204 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorBlock_Client.java @@ -0,0 +1,13 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors; + +import net.minecraft.block.Block; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(Block.class) +public interface AccessorBlock_Client { + + @Invoker("getTextureName") + String uie$getTextureName(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorClientMinecraft.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorClientMinecraft.java new file mode 100644 index 00000000..2c8d728f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorClientMinecraft.java @@ -0,0 +1,14 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.Timer; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(Minecraft.class) +public interface AccessorClientMinecraft { + + @Accessor("timer") + Timer timer(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorEntityLivingBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorEntityLivingBase.java new file mode 100644 index 00000000..374afe2c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorEntityLivingBase.java @@ -0,0 +1,21 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(EntityLivingBase.class) +public interface AccessorEntityLivingBase { + + @Accessor(value = "lastDamage") + float getLastDamage(); + + @Accessor(value = "lastDamage") + void setLastDamage(float value); + + @Invoker("getExperiencePoints") + int accessGetExperiencePoints(EntityPlayer player); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorEntityZombie.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorEntityZombie.java new file mode 100644 index 00000000..7542c838 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorEntityZombie.java @@ -0,0 +1,13 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors; + +import net.minecraft.entity.monster.EntityZombie; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(EntityZombie.class) +public interface AccessorEntityZombie { + + @Invoker(value = "convertToVillager") + void uie$convertToVillager(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorItemRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorItemRenderer.java new file mode 100644 index 00000000..fdfee4e4 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorItemRenderer.java @@ -0,0 +1,16 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors; + +import net.minecraft.client.renderer.ItemRenderer; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ItemRenderer.class) +public interface AccessorItemRenderer { + + @Accessor("equippedProgress") + void uie$setEquippedProgress(float equippedProgress); + + @Accessor("prevEquippedProgress") + void uie$setPrevEquippedProgress(float prevEquippedProgress); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorItemSword.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorItemSword.java new file mode 100644 index 00000000..8acf6f06 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorItemSword.java @@ -0,0 +1,16 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors; + +import net.minecraft.item.ItemSword; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ItemSword.class) +public interface AccessorItemSword { + + @Accessor(value = "field_150934_a") + float getDamageVsEntity(); + + @Accessor(value = "field_150934_a") + void setDamageVsEntity(float value); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorItemTool.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorItemTool.java new file mode 100644 index 00000000..255bcd35 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorItemTool.java @@ -0,0 +1,16 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors; + +import net.minecraft.item.ItemTool; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ItemTool.class) +public interface AccessorItemTool { + + @Accessor(value = "damageVsEntity") + float getDamageVsEntity(); + + @Accessor(value = "damageVsEntity") + void setDamageVsEntity(float value); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorMerchantRecipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorMerchantRecipe.java new file mode 100644 index 00000000..90c75278 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorMerchantRecipe.java @@ -0,0 +1,19 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors; + +import net.minecraft.village.MerchantRecipe; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(MerchantRecipe.class) +public interface AccessorMerchantRecipe { + + @Accessor(value = "toolUses") + int getCurrentUses(); + + @Accessor(value = "toolUses") + void setCurrentUses(int uses); + + @Accessor(value = "maxTradeUses") + int getMaxUses(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorPotionEffect.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorPotionEffect.java new file mode 100644 index 00000000..46bd0192 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/accessors/AccessorPotionEffect.java @@ -0,0 +1,13 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors; + +import net.minecraft.potion.PotionEffect; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(PotionEffect.class) +public interface AccessorPotionEffect { + + @Accessor(value = "duration") + void setDuration(int value); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/network/PacketHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/PacketHandler.java new file mode 100644 index 00000000..cf273fb3 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/PacketHandler.java @@ -0,0 +1,32 @@ +package com.fouristhenumber.utilitiesinexcess.network; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.network.client.PacketAggressiveMobSpawn; +import com.fouristhenumber.utilitiesinexcess.network.client.PacketRainMuffledSync; +import com.fouristhenumber.utilitiesinexcess.network.client.PacketUnderworldAttack; +import com.fouristhenumber.utilitiesinexcess.network.client.ParticlePacket; + +import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; +import cpw.mods.fml.relauncher.Side; + +public class PacketHandler { + + public static final SimpleNetworkWrapper INSTANCE = new SimpleNetworkWrapper(UtilitiesInExcess.MODID); + + public static void init() { + int packetId = 0; + INSTANCE.registerMessage(ParticlePacket.Handler.class, ParticlePacket.class, packetId++, Side.CLIENT); + INSTANCE + .registerMessage(PacketRainMuffledSync.Handler.class, PacketRainMuffledSync.class, packetId++, Side.CLIENT); + INSTANCE.registerMessage( + PacketAggressiveMobSpawn.Handler.class, + PacketAggressiveMobSpawn.class, + packetId++, + Side.CLIENT); + INSTANCE.registerMessage( + PacketUnderworldAttack.Handler.class, + PacketUnderworldAttack.class, + packetId++, + Side.CLIENT); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PacketAggressiveMobSpawn.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PacketAggressiveMobSpawn.java new file mode 100644 index 00000000..9ccd72c4 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PacketAggressiveMobSpawn.java @@ -0,0 +1,83 @@ +package com.fouristhenumber.utilitiesinexcess.network.client; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +import net.minecraft.client.Minecraft; +import net.minecraft.world.World; + +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; + +/// Spawns some smoke and plays a sound when a mob is aggressively spawn in a difficult region. +public class PacketAggressiveMobSpawn implements IMessage { + + private int x, y, z; + + public PacketAggressiveMobSpawn() {} + + public PacketAggressiveMobSpawn(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public void fromBytes(ByteBuf buf) { + x = buf.readInt(); + y = buf.readInt(); + z = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(x); + buf.writeInt(y); + buf.writeInt(z); + } + + public static class Handler implements IMessageHandler { + + @Override + @SideOnly(Side.CLIENT) + public IMessage onMessage(PacketAggressiveMobSpawn message, MessageContext ctx) { + World world = Minecraft.getMinecraft().theWorld; + + Random rng = ThreadLocalRandom.current(); + + int x = message.x; + int y = message.y; + int z = message.z; + + for (int i = 0; i < 20; i++) { + world.spawnParticle( + "flame", + x + rng.nextDouble(), + y + rng.nextDouble(), + z + rng.nextDouble(), + rng.nextDouble() * 0.1 - 0.05, + rng.nextDouble() * 0.1 - 0.025, + rng.nextDouble() * 0.1 - 0.05); + } + + for (int i = 0; i < 20; i++) { + world.spawnParticle( + "smoke", + x + rng.nextDouble(), + y + rng.nextDouble(), + z + rng.nextDouble(), + rng.nextDouble() * 0.1 - 0.05, + rng.nextDouble() * 0.1 - 0.025, + rng.nextDouble() * 0.1 - 0.05); + } + + world.playSound(x + 0.5, y + 0.5, z + 0.5, "mob.bat.takeoff", 1, 1, false); + + return null; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PacketRainMuffledSync.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PacketRainMuffledSync.java new file mode 100644 index 00000000..400fa35a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PacketRainMuffledSync.java @@ -0,0 +1,50 @@ +package com.fouristhenumber.utilitiesinexcess.network.client; + +import static com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRainMuffler.NBT_RAIN_MUFFLED; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; + +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; + +public class PacketRainMuffledSync implements IMessage { + + boolean muffled; + + public PacketRainMuffledSync() {} + + public PacketRainMuffledSync(boolean muffled) { + this.muffled = muffled; + } + + @Override + public void fromBytes(ByteBuf buf) { + muffled = buf.readBoolean(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeBoolean(muffled); + } + + public static class Handler implements IMessageHandler { + + @Override + @SideOnly(Side.CLIENT) + public IMessage onMessage(PacketRainMuffledSync message, MessageContext ctx) { + + NBTTagCompound playerNBT = Minecraft.getMinecraft().thePlayer.getEntityData(); + NBTTagCompound persistentNBT = playerNBT.getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG); + persistentNBT.setBoolean(NBT_RAIN_MUFFLED, message.muffled); + playerNBT.setTag(EntityPlayer.PERSISTED_NBT_TAG, persistentNBT); + + return null; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PacketUnderworldAttack.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PacketUnderworldAttack.java new file mode 100644 index 00000000..f9e3920a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PacketUnderworldAttack.java @@ -0,0 +1,80 @@ +package com.fouristhenumber.utilitiesinexcess.network.client; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.world.World; + +import org.joml.Vector3d; + +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; + +/// Spawns some particles and plays a sound when the player is attacked by the invisible monster +public class PacketUnderworldAttack implements IMessage { + + public PacketUnderworldAttack() {} + + @Override + public void fromBytes(ByteBuf buf) { + + } + + @Override + public void toBytes(ByteBuf buf) { + + } + + public static class Handler implements IMessageHandler { + + @Override + @SideOnly(Side.CLIENT) + public IMessage onMessage(PacketUnderworldAttack message, MessageContext ctx) { + World world = Minecraft.getMinecraft().theWorld; + + Random rng = ThreadLocalRandom.current(); + + double theta1 = rng.nextDouble() * Math.PI * 2; + double theta2 = theta1 + Math.PI + (rng.nextDouble() * 0.25 - 0.125); + + EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; + Vector3d a = new Vector3d( + player.posX + Math.cos(theta1) * 2, + player.posY, + player.posZ + Math.sin(theta1) * 2); + Vector3d b = new Vector3d( + player.posX + Math.cos(theta2) * 2, + player.posY, + player.posZ + Math.sin(theta2) * 2); + + for (float k = 0; k <= 1f; k += 0.05f) { + Vector3d v = new Vector3d(b).sub(a) + .mul(k) + .add(a); + + world.spawnParticle( + "crit", + v.x, + v.y, + v.z, + rng.nextDouble() * 0.02 - 0.01, + rng.nextDouble() * 0.02 - 0.01, + rng.nextDouble() * 0.02 - 0.01); + } + + Vector3d v = new Vector3d(b).sub(a) + .mul(rng.nextDouble()) + .add(a); + + world.playSound(v.x, v.y, v.z, "mob.bat.takeoff", 1, 1, false); + + return null; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/ParticlePacket.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/ParticlePacket.java new file mode 100644 index 00000000..235ba03f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/ParticlePacket.java @@ -0,0 +1,60 @@ +package com.fouristhenumber.utilitiesinexcess.network.client; + +import net.minecraft.client.Minecraft; +import net.minecraft.world.World; + +import cpw.mods.fml.common.network.ByteBufUtils; +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; + +public class ParticlePacket implements IMessage { + + private String particleName; + private double x, y, z; + private int frequency; + + public ParticlePacket() {} // Required + + public ParticlePacket(String particleName, double x, double y, double z, int frequency) { + this.particleName = particleName; + this.x = x; + this.y = y; + this.z = z; + this.frequency = frequency; + } + + @Override + public void fromBytes(ByteBuf buf) { + this.particleName = ByteBufUtils.readUTF8String(buf); + this.x = buf.readDouble(); + this.y = buf.readDouble(); + this.z = buf.readDouble(); + this.frequency = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + ByteBufUtils.writeUTF8String(buf, particleName); + buf.writeDouble(x); + buf.writeDouble(y); + buf.writeDouble(z); + buf.writeInt(frequency); + } + + public static class Handler implements IMessageHandler { + + @Override + @SideOnly(Side.CLIENT) + public IMessage onMessage(ParticlePacket message, MessageContext ctx) { + World world = Minecraft.getMinecraft().theWorld; + for (int i = 0; i < message.frequency; i++) { // Send the particle multiple times based on frequency + world.spawnParticle(message.particleName, message.x, message.y, message.z, 0.0D, 0.0D, 0.0D); + } + return null; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java new file mode 100644 index 00000000..44e8663c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java @@ -0,0 +1,78 @@ +package com.fouristhenumber.utilitiesinexcess.render; + +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.io.IOException; + +import javax.imageio.ImageIO; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.util.ResourceLocation; + +import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorBlock_Client; + +public class BlockColoredTexture extends TextureAtlasSprite { + + private final Block base; + private final float colorMultiplier; + + public BlockColoredTexture(String name, Block base, float colorMultiplier) { + super(name); + this.base = base; + this.colorMultiplier = colorMultiplier; + } + + @Override + public boolean hasCustomLoader(IResourceManager manager, ResourceLocation location) { + return true; + } + + @Override + public boolean load(IResourceManager manager, ResourceLocation location) { + try { + String textureName = ((AccessorBlock_Client) base).uie$getTextureName(); + textureName = textureName.equals("planks") ? textureName + "_oak" : textureName; + textureName = textureName.equals("quartz_block") ? textureName + "_top" : textureName; + textureName = textureName.equals("redstone_lamp_off") ? "redstone_lamp_on" : textureName; + + BufferedImage img = ImageIO.read( + Minecraft.getMinecraft() + .getResourceManager() + .getResource(new ResourceLocation("textures/blocks/" + textureName + ".png")) + .getInputStream()); + for (int x = 0; x < img.getWidth(); x++) { + for (int y = 0; y < img.getHeight(); y++) { + int rgba = img.getRGB(x, y); + Color c = new Color(rgba, true); + + // Apparently a simple average is wrong + // Something about the receptor concentration in our eyes ¯\_(ツ)_/¯ + // int grey = (int) ((c.getGreen() + c.getRed() + c.getBlue()) * 0.333f); + int grey = (int) (c.getGreen() * 0.587 + c.getRed() * 0.299 + c.getBlue() * 0.114); + grey = (int) Math.min(grey * colorMultiplier, 255); + + Color newColor = new Color(grey, grey, grey, c.getAlpha()); + img.setRGB(x, y, newColor.getRGB()); + } + } + + this.height = img.getHeight(); + this.width = img.getWidth(); + + int mipmapLevels = Minecraft.getMinecraft().gameSettings.mipmapLevels; + int[][] imageData = new int[1 + mipmapLevels][]; + + int[] rgbaData = new int[this.height * this.width]; + img.getRGB(0, 0, width, height, rgbaData, 0, width); + imageData[0] = rgbaData; + + framesTextureData.add(imageData); + return false; + } catch (IOException e) { + return true; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/ISBRHUnderworldPortal.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/ISBRHUnderworldPortal.java new file mode 100644 index 00000000..9ffd53a3 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/ISBRHUnderworldPortal.java @@ -0,0 +1,54 @@ +package com.fouristhenumber.utilitiesinexcess.render; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; + +import org.lwjgl.opengl.GL11; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.client.registry.RenderingRegistry; + +/// This is just used to render the portal frame when in item form. +public class ISBRHUnderworldPortal implements ISimpleBlockRenderingHandler { + + public static final ISBRHUnderworldPortal INSTANCE = new ISBRHUnderworldPortal(); + + public static final int RENDER_ID = RenderingRegistry.getNextAvailableRenderId(); + + private static void bindTexture(ResourceLocation resource) { + Minecraft.getMinecraft().renderEngine.bindTexture(resource); + } + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + bindTexture(new ResourceLocation(UtilitiesInExcess.MODID, "textures/blocks/bedrockium_block.png")); + + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(0, -0.5F, 0); + TESRUnderworldPortal.FRAME.renderAll(); + + bindTexture(TextureMap.locationItemsTexture); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return RENDER_ID; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/ScaledCubeFaceIcon.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/ScaledCubeFaceIcon.java new file mode 100644 index 00000000..62bea1a8 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/ScaledCubeFaceIcon.java @@ -0,0 +1,82 @@ +package com.fouristhenumber.utilitiesinexcess.render; + +import net.minecraft.block.Block; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; + +public class ScaledCubeFaceIcon implements IIcon { + + IIcon baseIcon; + + // These represent the bounds of the face when viewed from straight on + double verticalMin; + double verticalMax; + double horizontalMin; + double horizontalMax; + + public ScaledCubeFaceIcon(IIcon icon, Block block, boolean baseFace) { + baseIcon = icon; + + if (baseFace) { + // Top and bottom faces of the cube + verticalMin = block.getBlockBoundsMinX(); + verticalMax = block.getBlockBoundsMaxX(); + horizontalMin = block.getBlockBoundsMinZ(); + horizontalMax = block.getBlockBoundsMaxZ(); + } else { + // Lateral faces of the cube + verticalMax = 1 - block.getBlockBoundsMinY(); + verticalMin = 1 - block.getBlockBoundsMaxY(); + horizontalMin = block.getBlockBoundsMinX(); + horizontalMax = block.getBlockBoundsMaxX(); + } + } + + @Override + public int getIconWidth() { + return baseIcon.getIconWidth(); + } + + @Override + public int getIconHeight() { + return baseIcon.getIconHeight(); + } + + @Override + public float getMinU() { + return baseIcon.getMinU(); + } + + @Override + public float getMaxU() { + return baseIcon.getMaxU(); + } + + @Override + public float getInterpolatedU(double coordinate) { + double clamped = MathHelper.clamp_double(coordinate / 16, horizontalMin, horizontalMax); + return (float) (((clamped - horizontalMin) / (horizontalMax - horizontalMin)) * (getMaxU() - getMinU())) + + getMinU(); + } + + @Override + public float getMinV() { + return baseIcon.getMinV(); + } + + @Override + public float getMaxV() { + return baseIcon.getMaxV(); + } + + @Override + public float getInterpolatedV(double coordinate) { + double clamped = MathHelper.clamp_double(coordinate / 16, verticalMin, verticalMax); + return (float) (((clamped - verticalMin) / (verticalMax - verticalMin)) * (getMaxV() - getMinV())) + getMinV(); + } + + @Override + public String getIconName() { + return baseIcon.getIconName(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/TESRUnderworldPortal.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/TESRUnderworldPortal.java new file mode 100644 index 00000000..5cbadc7a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/TESRUnderworldPortal.java @@ -0,0 +1,105 @@ +package com.fouristhenumber.utilitiesinexcess.render; + +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.AdvancedModelLoader; +import net.minecraftforge.client.model.IModelCustom; + +import org.lwjgl.opengl.GL11; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager; +import com.gtnewhorizon.gtnhlib.client.renderer.postprocessing.shaders.UniversiumShader; +import com.gtnewhorizon.gtnhlib.client.renderer.shader.ShaderProgram; +import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VertexBuffer; +import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; + +public class TESRUnderworldPortal extends TileEntitySpecialRenderer { + + public static final IModelCustom FRAME = AdvancedModelLoader + .loadModel(new ResourceLocation(UtilitiesInExcess.MODID, "models/underworld_portal/frame.obj")); + + private VertexBuffer core; + + private void initCoreVBO() { + Tessellator tessellator = TessellatorManager.startCapturingAndGet(); + + tessellator.startDrawingQuads(); + + tessellator.addVertex(-0.5, 0.5, -0.5); + tessellator.addVertex(-0.5, 0.5, 0.5); + tessellator.addVertex(0.5, 0.5, 0.5); + tessellator.addVertex(0.5, 0.5, -0.5); + + tessellator.addVertex(-0.5, -0.5, -0.5); + tessellator.addVertex(0.5, -0.5, -0.5); + tessellator.addVertex(0.5, -0.5, 0.5); + tessellator.addVertex(-0.5, -0.5, 0.5); + + tessellator.addVertex(0.5, -0.5, -0.5); + tessellator.addVertex(-0.5, -0.5, -0.5); + tessellator.addVertex(-0.5, 0.5, -0.5); + tessellator.addVertex(0.5, 0.5, -0.5); + + tessellator.addVertex(0.5, -0.5, 0.5); + tessellator.addVertex(0.5, 0.5, 0.5); + tessellator.addVertex(-0.5, 0.5, 0.5); + tessellator.addVertex(-0.5, -0.5, 0.5); + + tessellator.addVertex(-0.5, -0.5, 0.5); + tessellator.addVertex(-0.5, 0.5, 0.5); + tessellator.addVertex(-0.5, 0.5, -0.5); + tessellator.addVertex(-0.5, -0.5, -0.5); + + tessellator.addVertex(0.5, -0.5, 0.5); + tessellator.addVertex(0.5, -0.5, -0.5); + tessellator.addVertex(0.5, 0.5, -0.5); + tessellator.addVertex(0.5, 0.5, 0.5); + + tessellator.draw(); + + core = TessellatorManager.stopCapturingToVBO(DefaultVertexFormat.POSITION); + } + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + if (core == null) { + initCoreVBO(); + } + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glTranslated(x + 0.5, y, z + 0.5); + + bindTexture(new ResourceLocation(UtilitiesInExcess.MODID, "textures/blocks/bedrockium_block.png")); + FRAME.renderAll(); + + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + + int counter = (int) (System.currentTimeMillis() % 1_000_000); + + GL11.glTranslated(x + 0.5, y + 0.6 + Math.sin(counter / 4000d * Math.PI * 2) * 0.05, z + 0.5); + GL11.glScaled(0.3, 0.3, 0.3); + + GL11.glRotated(counter / 500d * Math.PI * 2, 1, 0, 0); + GL11.glRotated(counter / 100d * Math.PI * 2, 0, 1, 0); + GL11.glRotated(counter / 400d * Math.PI * 2, 0, 0, 1); + GL11.glRotated(counter / 200d * Math.PI * 2, 0, 1, 1); + + UniversiumShader.getInstance() + .setLightFromLocation(tile.getWorldObj(), tile.xCoord, tile.yCoord, tile.zCoord) + .use(); + + GL11.glDisable(GL11.GL_ALPHA_TEST); + core.render(); + GL11.glEnable(GL11.GL_ALPHA_TEST); + + ShaderProgram.clear(); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/filter/ITransferFilter.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/filter/ITransferFilter.java new file mode 100644 index 00000000..b455d1f8 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/filter/ITransferFilter.java @@ -0,0 +1,4 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.filter; + +public interface ITransferFilter { +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java new file mode 100644 index 00000000..d49cefc4 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java @@ -0,0 +1,82 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.upgrade; + +import com.fouristhenumber.utilitiesinexcess.transfer.walk.StandardWalker; +import net.minecraft.item.ItemStack; + +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade; +import com.fouristhenumber.utilitiesinexcess.common.recipe.DisableableItemStack; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.BreadthWalker; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.DepthWalker; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.ITransferWalker; + +public enum TransferUpgrade { + + // Order preserved from XU for migration purposes + SPEED(null), + FILTER(UpgradeType.FILTER), + WORLD_INTERACTION(null), + STACK(null), + CREATIVE(null), + ENDER_TRANSMITTER(null), + ENDER_RECEIVER(null), + SEARCH_DEPTH(UpgradeType.WALKER), + SEARCH_BREADTH(UpgradeType.WALKER), + SEARCH_ROUND_ROBIN(null), + ADV_FILTER(UpgradeType.FILTER), + + ; + + public static final TransferUpgrade[] VALUES = values(); + + private final UpgradeType type; + + TransferUpgrade(UpgradeType type) { + this.type = type; + } + + public String getName() { + return name().toLowerCase(); + } + + public DisableableItemStack getStack() { + return getStack(1); + } + + public DisableableItemStack getStack(int amount) { + return new DisableableItemStack(ModItems.UPGRADE, amount, ordinal()); + } + + public boolean isWalkerUpgrade() { + return this.type == UpgradeType.WALKER; + } + + public ITransferWalker getWalker() { + return switch (this) { + case SEARCH_DEPTH -> new DepthWalker(); + case SEARCH_BREADTH -> new BreadthWalker(); + default -> new StandardWalker(); + }; + } + + public boolean isFilterUpgrade() { + return this.type == UpgradeType.FILTER; + } + + public static boolean isUpgrade(ItemStack stack) { + return stack != null && stack.getItem() instanceof ItemUpgrade; + } + + public static TransferUpgrade getUpgrade(ItemStack stack) { + if (!isUpgrade(stack)) return null; + + int meta = stack.getItemDamage(); + if (meta < 0 || meta >= VALUES.length) return null; + return VALUES[meta]; + } + + private enum UpgradeType { + WALKER, + FILTER, + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java new file mode 100644 index 00000000..0d7ade98 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java @@ -0,0 +1,178 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.upgrade; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +import org.jetbrains.annotations.Nullable; + +import com.fouristhenumber.utilitiesinexcess.transfer.filter.ITransferFilter; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.ITransferWalker; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.StandardWalker; + +public class UpgradeInventory implements IInventory { + + private final List inv; + + public UpgradeInventory(int slots) { + this.inv = Stream.generate(UpgradeData::new) + .limit(slots) + .collect(Collectors.toList()); + } + + public ITransferWalker getWalker() { + TransferUpgrade upgrade = getWalkerUpgrade(); + return upgrade == null ? new StandardWalker() : upgrade.getWalker(); + } + + private TransferUpgrade getWalkerUpgrade() { + return inv.stream() + .map(UpgradeData::getUpgrade) + .filter(TransferUpgrade::isWalkerUpgrade) + .findAny() + .orElse(null); + } + + @Nullable + public ITransferFilter getFilter() { + return null; // todo + } + + // IInventory + + @Override + public int getSizeInventory() { + return this.inv.size(); + } + + @Override + public ItemStack getStackInSlot(int index) { + if (index < 0) return null; + if (index > this.inv.size()) return null; + + return this.inv.get(index) + .getStack(); + } + + @Override + public ItemStack decrStackSize(int index, int count) { + if (index < 0) return null; + if (index > this.inv.size()) return null; + + UpgradeData data = this.inv.get(index); + if (data == null) return null; + + ItemStack stack = data.getStack(); + int toMove = Math.min(stack.stackSize, count); + ItemStack newStack = stack.copy(); + newStack.stackSize = toMove; + stack.stackSize -= toMove; + if (stack.stackSize == 0) { + data.clear(); + } + markDirty(); + return newStack; + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) { + if (index < 0) return; + if (index > this.inv.size()) return; + + UpgradeData data = this.inv.get(index); + data.set(stack); + markDirty(); + } + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + if (stack == null) return true; // allow stuff to be removed + TransferUpgrade upgrade = TransferUpgrade.getUpgrade(stack); + if (upgrade == null) return false; + + // Handle special cases + int walkerIndex = -1; + int filterIndex = -1; + for (int i = 0; i < this.inv.size(); i++) { + UpgradeData data = this.inv.get(i); + if (data.isEmpty()) continue; + + if (data.upgrade.isWalkerUpgrade()) walkerIndex = i; + if (data.upgrade.isFilterUpgrade()) filterIndex = i; + } + + if (upgrade.isWalkerUpgrade()) return walkerIndex == -1 || walkerIndex == index; + if (upgrade.isFilterUpgrade()) return walkerIndex == -1 || filterIndex == index; + return true; + } + + @Override + public void markDirty() { + // todo + } + + @Override + public String getInventoryName() { + return ""; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return true; + } + + // IInventory - Unused for this inventory + + @Override + public ItemStack getStackInSlotOnClosing(int index) { + return null; + } + + @Override + public void openInventory() {} + + @Override + public void closeInventory() {} + + private static class UpgradeData { + + private ItemStack stack; + private TransferUpgrade upgrade; + + public void set(ItemStack stack) { + this.stack = stack; + this.upgrade = TransferUpgrade.getUpgrade(stack); + } + + public ItemStack getStack() { + return this.stack; + } + + public TransferUpgrade getUpgrade() { + return this.upgrade; + } + + public boolean isEmpty() { + return this.stack == null; + } + + public void clear() { + this.stack = null; + this.upgrade = null; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java new file mode 100644 index 00000000..5d51401b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java @@ -0,0 +1,61 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk; + +import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.IFluidHandler; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; + +public class BreadthWalker extends ITransferWalker { + + @Override + public void step() { + for (TileEntity tile : ignore) { + if (tile == null || tile.isInvalid()) { + reset(); + break; + } + } + + tanks.clear(); + chests.clear(); + + + current = lastChoice.get(0); + lastChoice.remove(0); + ignore.add(current); + ArrayList extend=new ArrayList(0); + + + action="Searching for inventories at\n"+ Arrays.toString(getRelative(original,current)); + + ArrayList tiles = getAdjacentEntities(current); + + for (TileEntity tile : tiles) { + if (tile == null || ignore.contains(tile)) { + continue; + } + + Package apple=tile.getClass().getPackage(); + if (apple!=null&&apple.getName().equals("com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer")) //somehow gonna need to kill the chest from the node(s) itself.. + { + extend.add(tile); + continue; + } + + if (tile instanceof IInventory) { + chests.add(tile); + } + + if (tile instanceof IFluidHandler) { + tanks.add(tile); + } + } + + Collections.shuffle(extend); + lastChoice.addAll(extend); + if (lastChoice.isEmpty()) {reset();} + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java new file mode 100644 index 00000000..02bc5e19 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java @@ -0,0 +1,65 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk; + +import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.IFluidHandler; +import org.lwjgl.Sys; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; + +public class DepthWalker extends ITransferWalker { + + @Override + public void step() + { + for (TileEntity tile : ignore) + { + if (tile == null || tile.isInvalid()) //not sure why it would be null + { + reset(); + break; + // optional return here (Not sure if it returns WHEN dead) + } + } + + chests.clear(); + tanks.clear(); + + current = lastChoice.get(0); + lastChoice.remove(0); + ignore.add(current); + + action="Searching for inventories at\n"+ Arrays.toString(getRelative(original,current)); + ArrayList tiles=getAdjacentEntities(current); + ArrayList extend=new ArrayList(0); + + for (TileEntity tile: tiles) + { + if (tile==null || ignore.contains(tile)) {continue;} + + Package apple=tile.getClass().getPackage(); + if (apple!=null&&apple.getName().equals("com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer")) //somehow gonna need to kill the chest from the node(s) itself.. + { + extend.add(tile); // they i think used a bias random.. + continue; + } + if (tile instanceof IInventory) + { + chests.add(tile); + } + + if (tile instanceof IFluidHandler) { + tanks.add(tile); + } + } + + Collections.shuffle(extend); + lastChoice.addAll(0,extend); + System.out.println(lastChoice); + if (lastChoice.isEmpty()) {reset();} + } + + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ITransferWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ITransferWalker.java new file mode 100644 index 00000000..5968c3ce --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ITransferWalker.java @@ -0,0 +1,105 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import org.lwjgl.Sys; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; + +//TODO: implent into code +//MAYBE: Make the tile entity search in beginning of search ONLY reset if it is currently a path it is using + +// Template class I guess.. + +public class ITransferWalker { + TileEntity original; + TileEntity current; + String action; + + ArrayList chests=new ArrayList(); + ArrayList tanks=new ArrayList(); + ArrayList ignore=new ArrayList(); // may want to use Map + ArrayList lastChoice=new ArrayList(); + + public ArrayList getAdjacentEntities(TileEntity scan) + { + ArrayList tiles=new ArrayList(); + World world=scan.getWorldObj(); + tiles.add(world.getTileEntity(scan.xCoord,scan.yCoord-1, scan.zCoord)); + tiles.add(world.getTileEntity(scan.xCoord,scan.yCoord+1, scan.zCoord)); + tiles.add(world.getTileEntity(scan.xCoord,scan.yCoord, scan.zCoord-1)); + tiles.add(world.getTileEntity(scan.xCoord,scan.yCoord, scan.zCoord+1)); + tiles.add(world.getTileEntity(scan.xCoord-1,scan.yCoord, scan.zCoord)); + tiles.add(world.getTileEntity(scan.xCoord+1,scan.yCoord, scan.zCoord)); + + return tiles; + } + public int[] getRelative(TileEntity main, TileEntity sub) + { + return new int[] {main.xCoord-sub.xCoord,main.yCoord-sub.yCoord,main.zCoord-sub.zCoord}; + } + + /** + * SHOULD BE CALLED FIRST (basically the constructor of the code) + * The TileEntity of the placed Transfer/Recv + * @param main TileEntity + */ + public void setOriginal(TileEntity main) { + original=main; + current=original; + lastChoice.add(main); + } + + public void step() + { + } + + public ArrayList getItemEntities() + { + Collections.shuffle(chests); + return chests; + } + + public ArrayList getFluidEntities() + { + Collections.shuffle(tanks); + return tanks; + } + public TileEntity getCurrentTileEntity() + { + return current; + } + + public ForgeDirection getDirectionFromCurrent(TileEntity chest) + { + int relX=current.xCoord-chest.xCoord; + int relY=current.yCoord-chest.yCoord; + int relZ=current.zCoord-chest.zCoord; + if (relX>0) {return ForgeDirection.EAST;} + if (relX<0) {return ForgeDirection.WEST;} + if (relY>0) {return ForgeDirection.UP;} + if (relY<0) {return ForgeDirection.DOWN;} + if (relZ>0) {return ForgeDirection.SOUTH;} + if (relZ<0) {return ForgeDirection.NORTH;} + return ForgeDirection.UNKNOWN; + } + + public String getAction() + { + return action; + } + + public void reset() + { + //tanks.clear(); + //chests.clear(); + lastChoice.clear(); + ignore.clear(); + lastChoice.add(original); + //current=original; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java new file mode 100644 index 00000000..16a7362d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java @@ -0,0 +1,62 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk; + +import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.IFluidHandler; +import org.antlr.v4.runtime.LexerNoViableAltException; +import org.lwjgl.Sys; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; + +public class StandardWalker extends ITransferWalker { + + @Override + public void step() + { + for (TileEntity tile : ignore) + { + if (tile == null || tile.isInvalid()) //not sure why it would be null + { + reset(); + break; + // optional return here (Not sure if it returns WHEN dead) + } + } + + chests.clear(); + tanks.clear(); + + current = lastChoice.get(0); + lastChoice.remove(0); + ignore.add(current); + + action="Searching for inventories at\n"+ Arrays.toString(getRelative(original,current)); + ArrayList tiles=getAdjacentEntities(current); + ArrayList extend=new ArrayList(0); + + for (TileEntity tile: tiles) + { + if (tile==null || ignore.contains(tile)) {continue;} + + Package apple=tile.getClass().getPackage(); + if (apple!=null&&apple.getName().equals("com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer")) //somehow gonna need to kill the chest from the node(s) itself.. + { + extend.add(tile); // they i think used a bias random.. + continue; + } + if (tile instanceof IInventory) + { + chests.add(tile); + } + + if (tile instanceof IFluidHandler) { + tanks.add(tile); + } + } + + if (extend.isEmpty()) {reset();} else {Collections.shuffle(extend); lastChoice.add(0,extend.get(0));} + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsWandUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsWandUtils.java new file mode 100644 index 00000000..6c7306f2 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsWandUtils.java @@ -0,0 +1,150 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Queue; +import java.util.Set; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +public class ArchitectsWandUtils { + + public ArchitectsWandUtils() {}; + + /** + * Counts the items of a certain type in a player's inventory + * + * @param player The player whose inventory to coutnt + * @param itemStack The itemstack incl metadata to count + * @return The item count + */ + public static int countItemInInventory(EntityPlayer player, ItemStack itemStack) { + int count = 0; + + for (ItemStack stack : player.inventory.mainInventory) { + if (stack != null && stack.getItem() == itemStack.getItem() + && stack.getItemDamage() == itemStack.getItemDamage()) { + count += stack.stackSize; + } + } + + return count; + } + + /** + * Decreases an ItemStack containing the item in the player's inventory by 1 + * + * @param player The player in question + * @param itemStack The itemstack with metadata to compare + * @return True if the ItemStack has been decremented, otherwise false + */ + public static boolean decreaseFromInventory(EntityPlayer player, ItemStack itemStack) { + for (int slotIndex = 0; slotIndex < player.inventory.mainInventory.length; slotIndex++) { + ItemStack stack = player.inventory.mainInventory[slotIndex]; + if (stack != null && stack.getItem() == itemStack.getItem() + && stack.getItemDamage() == itemStack.getItemDamage()) { + stack.stackSize -= 1; + if (stack.stackSize <= 0) { + player.inventory.setInventorySlotContents(slotIndex, null); + } + return true; + } + } + return false; + } + + /** + * Finds the blocks adjacent to the start position that are connected cardinally + * and have air infront of them relative to the side clicked on. + * + * @param world The world in which to place + * @param blockToFind The block that is being found + * @param metaToFind The metadata of the block that is being found + * @param findCount The maximum amount of blocks it should search + * @param clickedSide The side of the block that was clicked + * @param startPos The position to start + * @return The set of 1<=x<=findCount adjacent blocks with air on their face + */ + public static Set findAdjacentBlocks(World world, Block blockToFind, int metaToFind, int findCount, + ForgeDirection clickedSide, BlockPos startPos) { + Set region = new HashSet<>(); + if (findCount <= 0) { + return region; + } + Set visited = new HashSet<>(); + Queue queue = new LinkedList<>(); + + // Determine allowed offsets depending on the face that was clicked. + int[][] allowedOffsets = switch (clickedSide) { + case UP, DOWN -> + // Plane: x/z plane (y remains constant) + new int[][] { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 0, 1 }, { 0, 0, -1 } }; + case NORTH, SOUTH -> + // Plane: x/y plane (z remains constant) + new int[][] { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 1, 0 }, { 0, -1, 0 } }; + case EAST, WEST -> + // Plane: y/z plane (x remains constant) + new int[][] { { 0, 1, 0 }, { 0, -1, 0 }, { 0, 0, 1 }, { 0, 0, -1 } }; + default -> throw new RuntimeException("UE's BuilderWand's findAdjacentBlocks called with invalid side"); + }; + + int sx = startPos.x; + int sy = startPos.y; + int sz = startPos.z; + + // Base case + if (world.getBlock(sx, sy, sz) == blockToFind && world.getBlockMetadata(sx, sy, sz) == metaToFind + && world.isAirBlock(sx + clickedSide.offsetX, sy + clickedSide.offsetY, sz + clickedSide.offsetZ)) { + + BlockPos neighbor = new BlockPos(sx, sy, sz); + region.add(neighbor); + queue.add(neighbor); + visited.add(startPos); + } else { + return region; + } + + // Flood-fill the contiguous region in the allowed plane. + while (!queue.isEmpty() && region.size() < findCount) { + BlockPos current = queue.poll(); + int cx = current.x; + int cy = current.y; + int cz = current.z; + + for (int[] off : allowedOffsets) { + // Check if already visited + int nx = cx + off[0]; + int ny = cy + off[1]; + int nz = cz + off[2]; + + BlockPos key = new BlockPos(nx, ny, nz); + if (visited.contains(key)) { + continue; + } + visited.add(key); + + // Check and add to region+queue + int airx = nx + clickedSide.offsetX; + int airy = ny + clickedSide.offsetY; + int airz = nz + clickedSide.offsetZ; + + if (world.getBlock(nx, ny, nz) == blockToFind && world.getBlockMetadata(nx, ny, nz) == metaToFind + && world.isAirBlock(airx, airy, airz)) { + + BlockPos neighbor = new BlockPos(nx, ny, nz); + region.add(neighbor); + queue.add(neighbor); + } + } + } + + return region; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColorUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColorUtils.java new file mode 100644 index 00000000..4cf4ee2a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColorUtils.java @@ -0,0 +1,26 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +public class ColorUtils { + + public static int getHexColorFromWoolMeta(int meta) { + return switch (meta) { + case 0 -> 0xebebeb; // White + case 1 -> 0xf17716; // Orange + case 2 -> 0xbe46b5; // Magenta + case 3 -> 0x3cb0da; // Light Blue + case 4 -> 0xf9c629; // Yellow + case 5 -> 0x71ba1a; // Lime + case 6 -> 0xee90ad; // Pink + case 7 -> 0x3f4548; // Gray + case 8 -> 0x8e8f87; // Light Gray + case 9 -> 0x158a91; // Cyan + case 10 -> 0x7b2bad; // Purple + case 11 -> 0x353a9e; // Blue + case 12 -> 0x734829; // Brown + case 13 -> 0x556e1c; // Green + case 14 -> 0xa12823; // Red + case 15 -> 0x16161b; // Black + default -> 0xebebeb; + }; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/FMLEventHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/FMLEventHandler.java new file mode 100644 index 00000000..c40f4fd2 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/FMLEventHandler.java @@ -0,0 +1,39 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import static com.fouristhenumber.utilitiesinexcess.common.items.ItemInvertedIngot.INVERTED_INGOT; +import static com.fouristhenumber.utilitiesinexcess.common.items.ItemInvertedIngot.checkImplosion; + +import net.minecraft.inventory.ContainerWorkbench; +import net.minecraft.item.ItemStack; + +import com.fouristhenumber.utilitiesinexcess.common.items.ItemInvertedIngot; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; + +public class FMLEventHandler { + + @SubscribeEvent + public void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.player.openContainer instanceof ContainerWorkbench bench) { + ItemStack cursorItem = event.player.inventory.getItemStack(); + if (cursorItem != null && cursorItem.getItem() instanceof ItemInvertedIngot) { + if (checkImplosion(cursorItem, event.player.worldObj)) { + event.player.inventory.setItemStack(null); + event.player.closeScreen(); + event.player.attackEntityFrom(INVERTED_INGOT, Float.MAX_VALUE); + } + } + for (int i = 0; i < bench.craftMatrix.getSizeInventory(); i++) { + ItemStack stack = bench.craftMatrix.getStackInSlot(i); + if (stack != null && stack.getItem() instanceof ItemInvertedIngot) { + if (checkImplosion(stack, event.player.worldObj)) { + bench.craftMatrix.setInventorySlotContents(i, null); + event.player.closeScreen(); + event.player.attackEntityFrom(INVERTED_INGOT, Float.MAX_VALUE); + } + } + } + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java new file mode 100644 index 00000000..0cbe9cc8 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java @@ -0,0 +1,174 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import static com.fouristhenumber.utilitiesinexcess.common.blocks.BlockSpike.SpikeType.DIAMOND; +import static com.fouristhenumber.utilitiesinexcess.common.blocks.BlockSpike.SpikeType.GOLD; +import static com.fouristhenumber.utilitiesinexcess.common.blocks.BlockSpike.SpikeType.WOOD; +import static com.fouristhenumber.utilitiesinexcess.common.items.ItemInvertedIngot.INVERTED_INGOT; + +import java.util.List; +import java.util.stream.Collectors; + +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.item.EntityXPOrb; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.event.entity.item.ItemTossEvent; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.event.entity.living.LivingDeathEvent; +import net.minecraftforge.event.entity.living.LivingDropsEvent; +import net.minecraftforge.event.world.BlockEvent; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockSpike; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemInvertedIngot; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemXRayGlasses; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemAntiParticulateShovel; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemDestructionPickaxe; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemGluttonsAxe; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemPrecisionShears; +import com.fouristhenumber.utilitiesinexcess.common.renderers.XRayRenderer; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPacifistsBench; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.AntiParticulateShovelConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GluttonsAxeConfig; +import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorEntityLivingBase; +import com.gtnewhorizon.gtnhlib.client.event.LivingEquipmentChangeEvent; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +public class ForgeEventHandler { + + @SubscribeEvent + public void onLivingDrops(LivingDropsEvent event) { + if (event.source.getEntity() == null) return; + NBTTagCompound tag = event.source.getEntity() + .getEntityData(); + if (!tag.getBoolean("isPacifistsBench")) return; + TileEntity te = event.entityLiving.worldObj + .getTileEntity(tag.getInteger("x"), tag.getInteger("y"), tag.getInteger("z")); + if (te instanceof TileEntityPacifistsBench table) { + if (event.entityLiving instanceof EntityLiving living) living.experienceValue = 0; + for (EntityItem drop : event.drops) { + table.receiveItemStack(drop.getEntityItem()); + } + event.setCanceled(true); + } + } + + @SubscribeEvent + public void onLivingEquipmentChange(LivingEquipmentChangeEvent event) { + int slot = event.getSlot(); + if (slot != 4 || !(event.entity instanceof EntityPlayer)) return; + + ItemStack from = event.getFrom(); + + if (from != null && from.getItem() instanceof ItemXRayGlasses) { + XRayRenderer.clearCandidatePositions(); + } + } + + @SubscribeEvent + public void onItemToss(ItemTossEvent event) { + ItemStack stack = event.entityItem.getEntityItem(); + if (stack != null && stack.getItem() instanceof ItemInvertedIngot) { + if (stack.getItemDamage() != 0 || !stack.hasTagCompound()) return; + event.player.attackEntityFrom(INVERTED_INGOT, Float.MAX_VALUE); + event.setCanceled(true); + } + } + + @SubscribeEvent + public void onLivingDeath(LivingDeathEvent event) { + if (!(event.source.getEntity() instanceof EntityPlayer player)) return; + if (!(event.entityLiving instanceof EntityLiving entity)) return; + + ItemStack weapon = player.getHeldItem(); + if (weapon == null || !(weapon.getItem() instanceof BlockSpike.ItemSpike spike)) return; + + BlockSpike.SpikeType type = ((BlockSpike) spike.field_150939_a).getSpikeType(); + + if (type != DIAMOND) { + entity.recentlyHit = 0; + } + if (type == GOLD) { + int xp = ((AccessorEntityLivingBase) entity).accessGetExperiencePoints(player); + + while (xp > 0) { + int j = EntityXPOrb.getXPSplit(xp); + xp -= j; + entity.worldObj + .spawnEntityInWorld(new EntityXPOrb(entity.worldObj, entity.posX, entity.posY, entity.posZ, j)); + } + } + } + + @SubscribeEvent + public void onLivingAttack(LivingAttackEvent event) { + if (!(event.source.getEntity() instanceof EntityPlayer player)) return; + + ItemStack weapon = player.getHeldItem(); + if (weapon == null || !(weapon.getItem() instanceof BlockSpike.ItemSpike spike)) return; + + if (((BlockSpike) spike.field_150939_a).getSpikeType() != WOOD) return; + + EntityLivingBase target = event.entityLiving; + float base = (float) player.getEntityAttribute(SharedMonsterAttributes.attackDamage) + .getAttributeValue(); + float ench = EnchantmentHelper.getEnchantmentModifierLiving(player, target); + float total = base + ench; + + // If attack would kill, cancel + if (target.getHealth() - total <= 0.01F) { + event.setCanceled(true); + } + } + + @SubscribeEvent + public void onBlockBroken(BlockEvent.HarvestDropsEvent event) { + if (event.harvester == null) return; + EntityPlayer player = event.harvester; + ItemStack heldItem = event.harvester.getHeldItem(); + if (heldItem == null) return; + Item heldItemType = heldItem.getItem(); + if ((heldItemType instanceof ItemDestructionPickaxe && DestructionPickaxeConfig.voidMinedBlock) + || (heldItemType instanceof ItemAntiParticulateShovel && AntiParticulateShovelConfig.voidMinedBlocks) + || (heldItemType instanceof ItemGluttonsAxe && GluttonsAxeConfig.voidMinedBlock)) { + event.drops.clear(); + } + if (heldItemType instanceof ItemPrecisionShears) { + AxisAlignedBB dropSearchArea = AxisAlignedBB + .getBoundingBox(event.x - 1, event.y - 1, event.z - 1, event.x + 1, event.y + 1, event.z + 1); + List foundItems = event.world.getEntitiesWithinAABBExcludingEntity(player, dropSearchArea) + .stream() + .filter(EntityItem.class::isInstance) + .map(EntityItem.class::cast) + .filter(entityItem -> entityItem.age == 0) + .collect(Collectors.toList()); + for (EntityItem item : foundItems) { + if (!event.world.isRemote) item.setPosition(player.posX, player.posY, player.posZ); + } + + for (ItemStack drop : event.drops) { + if (!player.inventory.addItemStackToInventory(drop)) { + // Not player.entityDropItem(drop, 0.0f); cause i don't want the pickup delay:P + EntityItem entityitem = new EntityItem( + player.worldObj, + player.posX, + player.posY, + player.posZ, + drop); + player.worldObj.spawnEntityInWorld(entityitem); + } + } + player.inventoryContainer.detectAndSendChanges(); + event.drops.clear(); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/IntRange.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/IntRange.java new file mode 100644 index 00000000..c276979e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/IntRange.java @@ -0,0 +1,15 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +public class IntRange { + + public final int lower, upper; + + public IntRange(int lower, int upper) { + this.lower = lower; + this.upper = upper; + } + + public int lerp(double k) { + return lower + (int) ((upper - lower) * k); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ModelPartRenderHelper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ModelPartRenderHelper.java new file mode 100644 index 00000000..868cc51b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ModelPartRenderHelper.java @@ -0,0 +1,60 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.client.model.ModelRenderer; + +import org.lwjgl.opengl.GL11; + +public class ModelPartRenderHelper { + + // from ModelBiped.render + public static void renderBipedPart(float p_78785_1_, ModelRenderer model, Runnable renderer) { + + if (model.isHidden) return; + if (!model.showModel) return; + + GL11.glTranslatef(model.offsetX, model.offsetY, model.offsetZ); + + if (model.rotateAngleX == 0.0F && model.rotateAngleY == 0.0F && model.rotateAngleZ == 0.0F) { + if (model.rotationPointX == 0.0F && model.rotationPointY == 0.0F && model.rotationPointZ == 0.0F) { + // GL11.glCallList(model.displayList); + renderer.run(); + } else { + GL11.glTranslatef( + model.rotationPointX * p_78785_1_, + model.rotationPointY * p_78785_1_, + model.rotationPointZ * p_78785_1_); + // GL11.glCallList(model.displayList); + renderer.run(); + GL11.glTranslatef( + -model.rotationPointX * p_78785_1_, + -model.rotationPointY * p_78785_1_, + -model.rotationPointZ * p_78785_1_); + } + } else { + GL11.glPushMatrix(); + GL11.glTranslatef( + model.rotationPointX * p_78785_1_, + model.rotationPointY * p_78785_1_, + model.rotationPointZ * p_78785_1_); + + if (model.rotateAngleZ != 0.0F) { + GL11.glRotatef(model.rotateAngleZ * (180F / (float) Math.PI), 0.0F, 0.0F, 1.0F); + } + + if (model.rotateAngleY != 0.0F) { + GL11.glRotatef(model.rotateAngleY * (180F / (float) Math.PI), 0.0F, 1.0F, 0.0F); + } + + if (model.rotateAngleX != 0.0F) { + GL11.glRotatef(model.rotateAngleX * (180F / (float) Math.PI), 1.0F, 0.0F, 0.0F); + } + + // GL11.glCallList(model.displayList); + renderer.run(); + + GL11.glPopMatrix(); + } + + GL11.glTranslatef(-model.offsetX, -model.offsetY, -model.offsetZ); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/PinkFuelHelper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/PinkFuelHelper.java new file mode 100644 index 00000000..4611dd97 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/PinkFuelHelper.java @@ -0,0 +1,95 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; + +import com.github.bsideup.jabel.Desugar; + +public class PinkFuelHelper { + + public static final Set pinkFuelItems = new HashSet<>(); + + public static void scanRecipesForPinkFuel() { + ItemStack pinkDye = new ItemStack(Items.dye, 1, 9); + ItemStack pinkWool = new ItemStack(Blocks.wool, 1, 6); + + List recipes = CraftingManager.getInstance() + .getRecipeList(); + for (Object obj : recipes) { + if (obj instanceof IRecipe recipe) { + for (ItemStack input : getAllRecipeInputs(recipe)) { + if (stackMatches(input, pinkDye) || stackMatches(input, pinkWool)) { + ItemStack output = recipe.getRecipeOutput(); + if (output != null) { + pinkFuelItems.add(new ItemMetaPair(output.getItem(), output.getItemDamage())); + } + break; + } + } + } + } + + pinkFuelItems.add(new ItemMetaPair(pinkDye.getItem(), pinkDye.getItemDamage())); + pinkFuelItems.add(new ItemMetaPair(pinkWool.getItem(), pinkWool.getItemDamage())); + } + + private static boolean stackMatches(ItemStack stack, ItemStack target) { + return stack != null && stack.isItemEqual(target); + } + + private static List getAllRecipeInputs(IRecipe recipe) { + List stacks = new ArrayList<>(); + if (recipe instanceof ShapedRecipes) { + Collections.addAll(stacks, ((ShapedRecipes) recipe).recipeItems); + } else if (recipe instanceof ShapelessRecipes) { + stacks.addAll(((ShapelessRecipes) recipe).recipeItems); + } else if (recipe instanceof ShapedOreRecipe) { + Object[] inputs = ((ShapedOreRecipe) recipe).getInput(); + for (Object o : inputs) stacks.addAll(oreDictExpand(o)); + } else if (recipe instanceof ShapelessOreRecipe) { + List inputs = ((ShapelessOreRecipe) recipe).getInput(); + for (Object o : inputs) stacks.addAll(oreDictExpand(o)); + } + return stacks; + } + + // This will allow recipes with oredict dye to work + private static List oreDictExpand(Object o) { + List stacks = new ArrayList<>(); + if (o instanceof ItemStack) stacks.add((ItemStack) o); + else if (o instanceof List) stacks.addAll((List) o); + return stacks; + } + + @Desugar + public record ItemMetaPair(Item item, int meta) { + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof ItemMetaPair other)) return false; + return item == other.item && meta == other.meta; + } + + @Override + public int hashCode() { + return Objects.hash(item, meta); + } + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/PumpChunkLoadingCallback.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/PumpChunkLoadingCallback.java new file mode 100644 index 00000000..a7e8b577 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/PumpChunkLoadingCallback.java @@ -0,0 +1,27 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import java.util.List; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeChunkManager; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySmartPump; + +public class PumpChunkLoadingCallback implements ForgeChunkManager.LoadingCallback { + + @Override + public void ticketsLoaded(List tickets, World world) { + + for (ForgeChunkManager.Ticket ticket : tickets) { + NBTTagCompound tag = ticket.getModData(); + int x = tag.getInteger("teX"); + int y = tag.getInteger("teY"); + int z = tag.getInteger("teZ"); + + if (world.getTileEntity(x, y, z) instanceof TileEntitySmartPump pump) { + pump.receiveTicketOnLoad(ticket); + } + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/RenderUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/RenderUtils.java new file mode 100644 index 00000000..2f2feb41 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/RenderUtils.java @@ -0,0 +1,16 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; + +public class RenderUtils { + + public static void renderInventoryCube(RenderBlocks renderer, Block block, int metadata) { + renderer.renderFaceYNeg(block, 0, 0, 0, block.getIcon(0, metadata)); + renderer.renderFaceYPos(block, 0, 0, 0, block.getIcon(1, metadata)); + renderer.renderFaceZNeg(block, 0, 0, 0, block.getIcon(2, metadata)); + renderer.renderFaceZPos(block, 0, 0, 0, block.getIcon(3, metadata)); + renderer.renderFaceXNeg(block, 0, 0, 0, block.getIcon(4, metadata)); + renderer.renderFaceXPos(block, 0, 0, 0, block.getIcon(5, metadata)); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/RenderableCube.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/RenderableCube.java new file mode 100644 index 00000000..e1093674 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/RenderableCube.java @@ -0,0 +1,115 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; + +public class RenderableCube { + + public double minX, minY, minZ, maxX, maxY, maxZ; + public float[][] uv; + + public RenderableCube(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, float[][] uv) { + this.minX = minX; + this.minY = minY; + this.minZ = minZ; + this.maxX = maxX; + this.maxY = maxY; + this.maxZ = maxZ; + this.uv = uv; + } + + public void draw(Tessellator t, double x, double y, double z, float textureSize, boolean applyBlockShading) { + draw(t, x, y, z, 0, 1, 0, 1, textureSize, applyBlockShading); + } + + public void draw(Tessellator t, double x, double y, double z, IIcon icon, float textureSize, + boolean applyBlockShading) { + draw( + t, + x, + y, + z, + icon.getMinU(), + icon.getMaxU(), + icon.getMinV(), + icon.getMaxV(), + textureSize, + applyBlockShading); + } + + public void draw(Tessellator t, double x, double y, double z, float minU, float maxU, float minV, float maxV, + float textureSize, boolean applyBlockShading) { + double X1 = x + minX, Y1 = y + minY, Z1 = z + minZ; + double X2 = x + maxX, Y2 = y + maxY, Z2 = z + maxZ; + + float iconWidth = maxU - minU; + float iconHeight = maxV - minV; + + float[][] uv = new float[6][4]; + + // Convert pixel-based UVs to their actual position on the atlas + for (int f = 0; f < 6; f++) { + float u0 = minU + (this.uv[f][0] / textureSize) * iconWidth; + float v0 = minV + (this.uv[f][1] / textureSize) * iconHeight; + float u1 = minU + (this.uv[f][2] / textureSize) * iconWidth; + float v1 = minV + (this.uv[f][3] / textureSize) * iconHeight; + uv[f] = new float[] { u0, v0, u1, v1 }; + } + + float[] topUV = uv[0]; + float[] bottomUV = uv[1]; + float[] northUV = uv[2]; + float[] southUV = uv[3]; + float[] westUV = uv[4]; + float[] eastUV = uv[5]; + + // +Y + // These calls are to manually recreate the side brightness that minecraft applies to each face + if (applyBlockShading) t.setColorOpaque_F(1.0F, 1.0F, 1.0F); + t.setNormal(0, 1, 0); + t.addVertexWithUV(X1, Y2, Z2, topUV[0], topUV[1]); + t.addVertexWithUV(X2, Y2, Z2, topUV[2], topUV[1]); + t.addVertexWithUV(X2, Y2, Z1, topUV[2], topUV[3]); + t.addVertexWithUV(X1, Y2, Z1, topUV[0], topUV[3]); + + // -Y + if (applyBlockShading) t.setColorOpaque_F(0.5F, 0.5F, 0.5F); + t.setNormal(0, -1, 0); + t.addVertexWithUV(X1, Y1, Z1, bottomUV[0], bottomUV[3]); + t.addVertexWithUV(X2, Y1, Z1, bottomUV[2], bottomUV[3]); + t.addVertexWithUV(X2, Y1, Z2, bottomUV[2], bottomUV[1]); + t.addVertexWithUV(X1, Y1, Z2, bottomUV[0], bottomUV[1]); + + // +Z + if (applyBlockShading) t.setColorOpaque_F(0.8F, 0.8F, 0.8F); + t.setNormal(0, 0, 1); + t.addVertexWithUV(X2, Y2, Z2, northUV[0], northUV[1]); + t.addVertexWithUV(X1, Y2, Z2, northUV[2], northUV[1]); + t.addVertexWithUV(X1, Y1, Z2, northUV[2], northUV[3]); + t.addVertexWithUV(X2, Y1, Z2, northUV[0], northUV[3]); + + // -Z + if (applyBlockShading) t.setColorOpaque_F(0.8F, 0.8F, 0.8F); + t.setNormal(0, 0, -1); + t.addVertexWithUV(X2, Y1, Z1, southUV[0], southUV[3]); + t.addVertexWithUV(X1, Y1, Z1, southUV[2], southUV[3]); + t.addVertexWithUV(X1, Y2, Z1, southUV[2], southUV[1]); + t.addVertexWithUV(X2, Y2, Z1, southUV[0], southUV[1]); + + // +X + if (applyBlockShading) t.setColorOpaque_F(0.6F, 0.6F, 0.6F); + t.setNormal(1, 0, 0); + t.addVertexWithUV(X2, Y1, Z2, westUV[2], westUV[3]); + t.addVertexWithUV(X2, Y1, Z1, westUV[0], westUV[3]); + t.addVertexWithUV(X2, Y2, Z1, westUV[0], westUV[1]); + t.addVertexWithUV(X2, Y2, Z2, westUV[2], westUV[1]); + + // -X + if (applyBlockShading) t.setColorOpaque_F(0.6F, 0.6F, 0.6F); + t.setNormal(-1, 0, 0); + t.addVertexWithUV(X1, Y1, Z1, eastUV[0], eastUV[3]); + t.addVertexWithUV(X1, Y1, Z2, eastUV[2], eastUV[3]); + t.addVertexWithUV(X1, Y2, Z2, eastUV[2], eastUV[1]); + t.addVertexWithUV(X1, Y2, Z1, eastUV[0], eastUV[1]); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/SoundVolumeChecks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/SoundVolumeChecks.java new file mode 100644 index 00000000..b781aa60 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/SoundVolumeChecks.java @@ -0,0 +1,35 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.gtnewhorizon.gtnhlib.datastructs.space.ArrayProximityCheck4D; +import com.gtnewhorizon.gtnhlib.datastructs.space.VolumeShape; + +public class SoundVolumeChecks { + + ArrayProximityCheck4D volumeCheckRain = new ArrayProximityCheck4D(VolumeShape.CUBE); + ArrayProximityCheck4D volumeCheckSound = new ArrayProximityCheck4D(VolumeShape.CUBE); + + public void putSoundMuffler(int dim, int x, int y, int z) { + volumeCheckSound.put(dim, x, y, z, BlockConfig.soundMuffler.soundMufflerRange); + } + + public void removeSoundMuffler(int dim, int x, int y, int z) { + volumeCheckSound.remove(dim, x, y, z); + } + + public void putRainMuffler(int dim, int x, int y, int z) { + volumeCheckRain.put(dim, x, y, z, BlockConfig.rainMuffler.rainMufflerRange); + } + + public void removeRainMuffler(int dim, int x, int y, int z) { + volumeCheckRain.remove(dim, x, y, z); + } + + public boolean isInRainMufflerRange(int dim, double x, double y, double z) { + return volumeCheckRain.isInRange(dim, x, y, z); + } + + public boolean isInSoundMufflerRange(int dim, double x, double y, double z) { + return volumeCheckSound.isInRange(dim, x, y, z); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java new file mode 100644 index 00000000..09920424 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java @@ -0,0 +1,83 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import java.text.DecimalFormat; +import java.util.Random; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import com.fouristhenumber.utilitiesinexcess.compat.Mods; + +import baubles.common.container.InventoryBaubles; +import baubles.common.lib.PlayerHandler; + +public class UIEUtils { + + public static final Random uieRandom = new Random(); + + private static final DecimalFormat COMMA_FORMAT = new DecimalFormat("#,###.#"); + + public static final String UIE_NBT_TAG = "Utilities_In_Excess"; + + public static String formatNumber(int number) { + return COMMA_FORMAT.format(number); + } + + public static String formatNumber(long number) { + return COMMA_FORMAT.format(number); + } + + public static String formatNumber(double number) { + return COMMA_FORMAT.format(number); + } + + public static String formatNumber(float number) { + return COMMA_FORMAT.format(number); + } + + public static ItemStack getBauble(EntityPlayer player, Class clazz) { + if (!Mods.Baubles.isLoaded()) return null; + + InventoryBaubles baubles = PlayerHandler.getPlayerBaubles(player); + for (int i = 0; i < baubles.getSizeInventory(); i++) { + ItemStack stack = baubles.getStackInSlot(i); + if (stack != null && stack.getItem() != null && clazz.isInstance(stack.getItem())) { + return stack; + } + } + + return null; + } + + public static boolean hasBauble(EntityPlayer player, Class clazz) { + if (!Mods.Baubles.isLoaded()) return false; + + InventoryBaubles baubles = PlayerHandler.getPlayerBaubles(player); + for (int i = 0; i < baubles.getSizeInventory(); i++) { + ItemStack stack = baubles.getStackInSlot(i); + if (stack != null && stack.getItem() != null && clazz.isInstance(stack.getItem())) { + return true; + } + } + + return false; + } + + public static float lerp(float cur, float target, float speed) { + return cur + (target - cur) * speed; + } + + public static NBTTagCompound getUIETag(EntityPlayer player) { + NBTTagCompound playerNBT = player.getEntityData(); + NBTTagCompound uieTag; + + if (playerNBT.hasKey(UIE_NBT_TAG)) { + uieTag = playerNBT.getCompoundTag(UIE_NBT_TAG); + } else { + uieTag = new NBTTagCompound(); + playerNBT.setTag(UIE_NBT_TAG, uieTag); + } + return uieTag; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/VoidingInventory.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/VoidingInventory.java new file mode 100644 index 00000000..7012ac44 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/VoidingInventory.java @@ -0,0 +1,75 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class VoidingInventory implements IInventory { + + private int size; + private String name; + + public VoidingInventory(int size, String name) { + this.size = size; + this.name = name; + } + + @Override + public int getSizeInventory() { + return size; + } + + @Override + public ItemStack getStackInSlot(int slotIn) { + return null; + } + + @Override + public ItemStack decrStackSize(int index, int count) { + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) { + return null; + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) { + if (stack != null) stack.stackSize = 0; + } + + @Override + public String getInventoryName() { + return name; + } + + @Override + public boolean hasCustomInventoryName() { + return true; + } + + @Override + public int getInventoryStackLimit() { + return Integer.MAX_VALUE; + } + + @Override + public void markDirty() {} + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return true; + } + + @Override + public void openInventory() {} + + @Override + public void closeInventory() {} + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/mui/FilteredFluidSlotSyncHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/mui/FilteredFluidSlotSyncHandler.java new file mode 100644 index 00000000..09a5f47b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/mui/FilteredFluidSlotSyncHandler.java @@ -0,0 +1,27 @@ +package com.fouristhenumber.utilitiesinexcess.utils.mui; + +import java.util.function.Predicate; + +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import com.cleanroommc.modularui.utils.fluid.FluidStackTank; +import com.cleanroommc.modularui.value.sync.FluidSlotSyncHandler; + +public class FilteredFluidSlotSyncHandler extends FluidSlotSyncHandler { + + private final Predicate filter; + + public FilteredFluidSlotSyncHandler(FluidStackTank tank, Predicate filter) { + super(tank); + this.filter = filter; + } + + @Override + protected void fillFluid(@NotNull FluidStack heldFluid, boolean processFullStack) { + if (!filter.test(heldFluid.getFluid())) return; + super.fillFluid(heldFluid, processFullStack); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/mui/TooltipItemDisplayWidget.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/mui/TooltipItemDisplayWidget.java new file mode 100644 index 00000000..3735afd5 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/mui/TooltipItemDisplayWidget.java @@ -0,0 +1,99 @@ +package com.fouristhenumber.utilitiesinexcess.utils.mui; + +import net.minecraft.item.ItemStack; + +import org.jetbrains.annotations.Nullable; + +import com.cleanroommc.modularui.api.MCHelper; +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.drawable.GuiDraw; +import com.cleanroommc.modularui.drawable.text.RichText; +import com.cleanroommc.modularui.integration.recipeviewer.RecipeViewerIngredientProvider; +import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; +import com.cleanroommc.modularui.utils.Platform; +import com.cleanroommc.modularui.widgets.ItemDisplayWidget; + +public class TooltipItemDisplayWidget extends ItemDisplayWidget implements RecipeViewerIngredientProvider { + + public TooltipItemDisplayWidget() { + super(); + tooltip().setAutoUpdate(true) + .titleMargin(1); + tooltipBuilder(tooltip -> { + ItemStack stack = getItemStack(); + buildTooltip(stack, tooltip); + }); + background(IDrawable.EMPTY); + } + + public ItemStack getItemStack() { + return (ItemStack) getValue().getValue(); + } + + public boolean doDisplayAmount = false; + + @Override + public ItemDisplayWidget displayAmount(boolean displayAmount) { + this.doDisplayAmount = displayAmount; + return super.displayAmount(displayAmount); + } + + @Override + // For latest use + public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { + ItemStack item = getItemStack(); + if (!Platform.isStackEmpty(item)) { + GuiDraw.drawItem(item, 1, 1, 16, 16, context.getCurrentDrawingZ()); + if (this.doDisplayAmount) { + GuiDraw.drawStandardSlotAmountText(item.stackSize, null, getArea()); + } + Platform.endDrawItem(); + } + } + + @Override + public void drawForeground(ModularGuiContext context) { + RichTooltip tooltip = getTooltip(); + if (tooltip != null && isHoveringFor(tooltip.getShowUpTimer())) { + tooltip.draw(context, getItemStack()); + } + } + + public void buildTooltip(ItemStack stack, RichTooltip tooltip) { + if (stack == null) return; + tooltip.addFromItem(stack); + } + + @Override + // For latest use + public @Nullable ItemStack getStackForRecipeViewer() { + return getItemStack(); + } + + public boolean matches(String search) { + ItemStack itemStack = getItemStack(); + if (itemStack == null) return false; + + return itemStack.getDisplayName() + .toLowerCase() + .contains(search) + || itemStack.getItem() + .getItemStackDisplayName(itemStack) + .toLowerCase() + .contains(search) + || tooltipMatches(search); + } + + private boolean tooltipMatches(String search) { + if (!(tooltip().getRichText() instanceof RichText)) return false; + + for (String s : MCHelper.getItemToolTip(getItemStack())) { + if (s.toLowerCase() + .contains(search)) return true; + } + + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/NoiseSampler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/NoiseSampler.java new file mode 100644 index 00000000..cf541148 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/NoiseSampler.java @@ -0,0 +1,9 @@ +package com.fouristhenumber.utilitiesinexcess.utils.noise; + +/// Something that samples noise for worldgen. +public interface NoiseSampler { + + double sample(double x, double y); + + double sample(double x, double y, double z); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/OctavesSampler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/OctavesSampler.java new file mode 100644 index 00000000..1ef5f02e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/OctavesSampler.java @@ -0,0 +1,55 @@ +package com.fouristhenumber.utilitiesinexcess.utils.noise; + +import java.util.Random; +import java.util.function.Supplier; + +/// An octave noise sampler. The resulting domain is [0, 1]. +public class OctavesSampler implements NoiseSampler { + + private final NoiseSampler[] octaves; + private final double[] amplitudes, scales; + + public OctavesSampler(Supplier samplers, int octaves) { + this.octaves = new NoiseSampler[octaves]; + this.amplitudes = new double[octaves]; + this.scales = new double[octaves]; + + for (int i = 0; i < octaves; i++) { + this.octaves[i] = samplers.get(); + this.amplitudes[i] = 1d / Math.pow(2d, i + 1); + this.scales[i] = Math.pow(2d, i); + } + } + + public OctavesSampler(Random rng, int octaves) { + this(() -> new SimplexNoiseSampler(rng), octaves); + } + + @Override + public double sample(double x, double y) { + double value = 0; + + for (int i = 0, octavesLength = octaves.length; i < octavesLength; i++) { + NoiseSampler sampler = octaves[i]; + double scale = scales[i]; + + value += sampler.sample(x * scale, y * scale) * amplitudes[i]; + } + + return value; + } + + @Override + public double sample(double x, double y, double z) { + double value = 0; + + for (int i = 0, octavesLength = octaves.length; i < octavesLength; i++) { + NoiseSampler sampler = octaves[i]; + double scale = scales[i]; + + value += sampler.sample(x * scale, y * scale, z * scale) * amplitudes[i]; + } + + return value * 0.5 + 0.5; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/ScaledNoise.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/ScaledNoise.java new file mode 100644 index 00000000..d0b0d7d9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/ScaledNoise.java @@ -0,0 +1,45 @@ +package com.fouristhenumber.utilitiesinexcess.utils.noise; + +/// A [NoiseSampler] wrapper that scales the coordinates and result of another [NoiseSampler]. +public class ScaledNoise implements NoiseSampler { + + private final NoiseSampler base; + private final double scaleX; + private final double scaleY; + private final double scaleZ; + private final double amplitude; + private final double offset; + + public ScaledNoise(NoiseSampler base, double scaleX, double scaleY, double scaleZ, double amplitude, + double offset) { + this.base = base; + this.scaleX = scaleX; + this.scaleY = scaleY; + this.scaleZ = scaleZ; + this.amplitude = amplitude; + this.offset = offset; + } + + public ScaledNoise(NoiseSampler base, double scaleX, double scaleY, double scaleZ) { + this.base = base; + this.scaleX = scaleX; + this.scaleY = scaleY; + this.scaleZ = scaleZ; + this.amplitude = 1d; + this.offset = 0d; + } + + public ScaledNoise(NoiseSampler base, double scale) { + this(base, scale, scale, scale); + } + + @Override + public double sample(double x, double y) { + return base.sample(x * scaleX, y * scaleY) * amplitude + offset; + } + + @Override + public double sample(double x, double y, double z) { + return base.sample(x * scaleX, y * scaleY, z * scaleZ) * amplitude + offset; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/SimplexNoiseSampler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/SimplexNoiseSampler.java new file mode 100644 index 00000000..532e6e82 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/noise/SimplexNoiseSampler.java @@ -0,0 +1,186 @@ +package com.fouristhenumber.utilitiesinexcess.utils.noise; + +import java.util.Random; + +import net.minecraft.util.MathHelper; + +/// Copied from EFR, with some modifications. The domain is [-1, 1] +public class SimplexNoiseSampler implements NoiseSampler { + + protected static final int[][] GRADIENTS = new int[][] { { 1, 1, 0 }, { -1, 1, 0 }, { 1, -1, 0 }, { -1, -1, 0 }, + { 1, 0, 1 }, { -1, 0, 1 }, { 1, 0, -1 }, { -1, 0, -1 }, { 0, 1, 1 }, { 0, -1, 1 }, { 0, 1, -1 }, { 0, -1, -1 }, + { 1, 1, 0 }, { 0, -1, 1 }, { -1, 1, 0 }, { 0, -1, -1 } }; + private static final double SQRT_3 = Math.sqrt(3.0D); + private static final double SKEW_FACTOR_2D; + private static final double UNSKEW_FACTOR_2D; + private final int[] permutations = new int[512]; + public final double originX; + public final double originY; + public final double originZ; + + public SimplexNoiseSampler(Random random) { + this.originX = random.nextDouble() * 256.0D; + this.originY = random.nextDouble() * 256.0D; + this.originZ = random.nextDouble() * 256.0D; + + for (int i = 0; i < 256; i++) { + this.permutations[i] = i; + } + + for (int i = 0; i < 256; ++i) { + int k = random.nextInt(256 - i); + int l = this.permutations[i]; + this.permutations[i] = this.permutations[k + i]; + this.permutations[k + i] = l; + } + } + + private int getGradient(int hash) { + return this.permutations[hash & 255]; + } + + protected static double dot(int[] gArr, double x, double y, double z) { + return (double) gArr[0] * x + (double) gArr[1] * y + (double) gArr[2] * z; + } + + private double grad(int hash, double x, double y, double z, double distance) { + double d = distance - x * x - y * y - z * z; + double f; + if (d < 0.0D) { + f = 0.0D; + } else { + d *= d; + f = d * d * dot(GRADIENTS[hash], x, y, z); + } + + return f; + } + + @Override + public double sample(double x, double y) { + double d = (x + y) * SKEW_FACTOR_2D; + int i = MathHelper.floor_double(x + d); + int j = MathHelper.floor_double(y + d); + double e = (double) (i + j) * UNSKEW_FACTOR_2D; + double f = (double) i - e; + double g = (double) j - e; + double h = x - f; + double k = y - g; + byte n; + byte o; + if (h > k) { + n = 1; + o = 0; + } else { + n = 0; + o = 1; + } + + double p = h - (double) n + UNSKEW_FACTOR_2D; + double q = k - (double) o + UNSKEW_FACTOR_2D; + double r = h - 1.0D + 2.0D * UNSKEW_FACTOR_2D; + double s = k - 1.0D + 2.0D * UNSKEW_FACTOR_2D; + int t = i & 255; + int u = j & 255; + int v = this.getGradient(t + this.getGradient(u)) % 12; + int w = this.getGradient(t + n + this.getGradient(u + o)) % 12; + int z = this.getGradient(t + 1 + this.getGradient(u + 1)) % 12; + double aa = this.grad(v, h, k, 0.0D, 0.5D); + double ab = this.grad(w, p, q, 0.0D, 0.5D); + double ac = this.grad(z, r, s, 0.0D, 0.5D); + return 70.0D * (aa + ab + ac); + } + + @Override + public double sample(double x, double y, double z) { + double e = (x + y + z) * 0.3333333333333333D; + int i = MathHelper.floor_double(x + e); + int j = MathHelper.floor_double(y + e); + int k = MathHelper.floor_double(z + e); + double g = (double) (i + j + k) * 0.16666666666666666D; + double h = (double) i - g; + double l = (double) j - g; + double m = (double) k - g; + double n = x - h; + double o = y - l; + double p = z - m; + byte w; + byte aa; + byte ab; + byte ac; + byte ad; + byte bc; + if (n >= o) { + if (o >= p) { + w = 1; + aa = 0; + ab = 0; + ac = 1; + ad = 1; + bc = 0; + } else if (n >= p) { + w = 1; + aa = 0; + ab = 0; + ac = 1; + ad = 0; + bc = 1; + } else { + w = 0; + aa = 0; + ab = 1; + ac = 1; + ad = 0; + bc = 1; + } + } else if (o < p) { + w = 0; + aa = 0; + ab = 1; + ac = 0; + ad = 1; + bc = 1; + } else if (n < p) { + w = 0; + aa = 1; + ab = 0; + ac = 0; + ad = 1; + bc = 1; + } else { + w = 0; + aa = 1; + ab = 0; + ac = 1; + ad = 1; + bc = 0; + } + + double bd = n - (double) w + 0.16666666666666666D; + double be = o - (double) aa + 0.16666666666666666D; + double bf = p - (double) ab + 0.16666666666666666D; + double bg = n - (double) ac + 0.3333333333333333D; + double bh = o - (double) ad + 0.3333333333333333D; + double bi = p - (double) bc + 0.3333333333333333D; + double bj = n - 1.0D + 0.5D; + double bk = o - 1.0D + 0.5D; + double bl = p - 1.0D + 0.5D; + int bm = i & 255; + int bn = j & 255; + int bo = k & 255; + int bp = this.getGradient(bm + this.getGradient(bn + this.getGradient(bo))) % 12; + int bq = this.getGradient(bm + w + this.getGradient(bn + aa + this.getGradient(bo + ab))) % 12; + int br = this.getGradient(bm + ac + this.getGradient(bn + ad + this.getGradient(bo + bc))) % 12; + int bs = this.getGradient(bm + 1 + this.getGradient(bn + 1 + this.getGradient(bo + 1))) % 12; + double bt = this.grad(bp, n, o, p, 0.6D); + double bu = this.grad(bq, bd, be, bf, 0.6D); + double bv = this.grad(br, bg, bh, bi, 0.6D); + double bw = this.grad(bs, bj, bk, bl, 0.6D); + return 32.0D * (bt + bu + bv + bw); + } + + static { + SKEW_FACTOR_2D = 0.5D * (SQRT_3 - 1.0D); + UNSKEW_FACTOR_2D = (3.0D - SQRT_3) / 6.0D; + } +} diff --git a/src/main/resources/META-INF/utilitiesinexcess_at.cfg b/src/main/resources/META-INF/utilitiesinexcess_at.cfg new file mode 100644 index 00000000..c025496b --- /dev/null +++ b/src/main/resources/META-INF/utilitiesinexcess_at.cfg @@ -0,0 +1,6 @@ +#recentlyHit +public net.minecraft.entity.EntityLivingBase field_70718_bc +#eventHandler +public net.minecraft.inventory.InventoryCrafting field_70465_c +#experienceValue +public net.minecraft.entity.EntityLiving field_70728_aV diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/0.png new file mode 100644 index 0000000000000000000000000000000000000000..312ba9ae49cc654555c90ac0dcbd1ae02e9dea67 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rk*a2Ar*6y|9pRczn;zL;KKJj zJUmk*HvGKx_P@`QthUBLW;b35QwAmp{+hqv|9?KbJ4Kp-VVOI0;**2boFyt=akR{0CSobg#Z8m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/11.png new file mode 100644 index 0000000000000000000000000000000000000000..fb46a162943d5dad8e5f73e09da6bbe7a190a936 GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`GM+AuAr*6y6C_v{Cy4Nf7d&{q i|NoO$cWd5$t7rJMlwGXg()E)-bqt=aelF{r5}E*qWg7GV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/12.png new file mode 100644 index 0000000000000000000000000000000000000000..fe0637ea27e03eead3213dadf1378f5c804f8f1c GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``kpS1Ar*6y|9pRczn;zL;KKJj zJUmk*HvGKx_P@`QthUBLW;b35Q--Vq3*S$XWMF7h9%HZkh=d#Wzp$P!^ Cb|85G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/13.png new file mode 100644 index 0000000000000000000000000000000000000000..1a7f8d0b05ac0d6f10fe3b72bd3eb9abe30a3d9d GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`x}GkMAr*6y|9pRczn;zL;KKJj xJUmk*4uF75=d(a&H(m)-hLa7>_ce_f7>XOXo6J|YPX%gZ@O1TaS?83{1OSk~AA0}* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/14.png new file mode 100644 index 0000000000000000000000000000000000000000..e981823e308261c8103cccc3e58532167895344d GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`GM+AuAr*6y|9pRczn;zL;KKJ$ iUdga7P7vX7VqnAr*6y|9pRczn;zL;KKJ$ tUbQrxy`J|!ebEJ;wm@b#UJ26%FOZH2oW}9%h0TC022WQ%mvv4FO#n(_9x?y` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/16.png new file mode 100644 index 0000000000000000000000000000000000000000..770bd85bfe04ad7358203bff4f861554e7b1fb0c GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#-1*YAr*6ye|&#`zn;zLVB`A# z|BM5Y7?^=TSap^=uY_sB6$X|Bn-5>_|3AYgr+Ar*6ye|&#`zn;zLVB`8H uuVq;mCx`?{8_50m_5T0!_VSZv3=9YU@(D!zzgPp*!r{JV3x89LQ(lpYzHKXas|&tDnm{ Hr-UW|8lxj( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/2.png new file mode 100644 index 0000000000000000000000000000000000000000..6988f5ad8f8d7543a72e62a8e19ccc0c0d006af4 GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>Ygr+Ar*6y|9pRczn;zL;KKJ$ uUdga7P7n!@H<0`B>;3=d?d2!U7#QplcqB@+n7;wFFnGH9xvXcxAr*6y6BaPY{P^|WUiFvz nK@ADk5Y{OvC(mBb`_In6@5gmw()%TGK*bE6u6{1-oD!M<>FpY} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/21.png new file mode 100644 index 0000000000000000000000000000000000000000..26fa3f3c093556f55ab3bc974dd6fb7623f4c330 GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr*6ye|&#`zn;zLVB`8H nuVq;mCy4N9ZTNZX?SBSmTWf-^bWAJqKb6Mw<&;$Twa~Asm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/23.png new file mode 100644 index 0000000000000000000000000000000000000000..202ef89f261ce454a792ed020aead2f40880727b GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ql2i3Ar*6ye|&#`zrHQdfXnS* g0R#KKplNd%SsmHeJpVCU9H@%H)78&qol`;+06uXSyZ`_I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/24.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/24.png new file mode 100644 index 0000000000000000000000000000000000000000..ce05da71ee789752dd4aad10a35f0332f364e773 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#-1*YAr*6ye|&#`zn;zLVB`A# z|BNTDp4r&g`0(@L-8>?a2M!!C$U3lsaWUHg9*Zw?jhGqg6L?Jiu2tRv)Xw1P>gTe~ HDWM4f7NsT* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/25.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d2c612e48a3d42c0281ef4c38f38a807bc1c41 GIT binary patch literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`N}eu`Ar*6ye|&#`zn+bYL0EN` nJFkRk!WD)rse%{QsX(PCZn9pCl+`;6RL$V&>gTe~DWM4f$l@4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/26.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/26.png new file mode 100644 index 0000000000000000000000000000000000000000..55b8c22f96342710343c2b20d87e4ada218240c6 GIT binary patch literal 75 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`LY^*;Ar*6y6C_v{Cy4YgaWF8j X2rw{)nnzs#$})Jm`njxgN@xNA_kj-( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/27.png new file mode 100644 index 0000000000000000000000000000000000000000..7997b3d745757d38ba63581241d7921c9437aea9 GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>Ygr+Ar*6y6BaPY{P^|WURaf_ trmkXoqY|@(goGQfglWPRhAc@2hVK<@O?nZs%Yj-LJYD@<);T3K0RRtx7&!m{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/28.png new file mode 100644 index 0000000000000000000000000000000000000000..e1358bae5c0a8319c476fd561db50cef4badce8d GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`x}GkMAr*6ye|&#`zn;zLVB`A# y|BM5Y7?^=TSap^=uY_sB6$TY%zS`wy7#P0E@>ZEN9!LdhWbkzLb6Mw<&;$T2ARNg6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/29.png new file mode 100644 index 0000000000000000000000000000000000000000..098c1cd8d74f9861a99b6aadcdaa8db8677b0af7 GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr*6y|9pRczn;zL;KKJ$ nUdga7P7vWS+VJz%+y4v)CUT1BPvHv$s%7wW^>bP0l+XkKG9(;$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/3.png new file mode 100644 index 0000000000000000000000000000000000000000..14c52ee3fd3b593e234f50bee82bd717cfc0d28d GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#-1*YAr*6y|9pRczn;zL;KKJ$ zUbQrxy`J|!ebEJ;wm@b#UI|kMCJFwUzu*6VKD;|cnt`G9BLCF(bgq*#H0l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/31.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e267a31f3d55932ce25b24ef1c8f7de5857a77 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`s-7;6Ar*6y|9pRczn;zL;KKJ$ rUdga7P7t}kAoIhkt}HDfA%THmzCLH#+)ZXSKn)C@u6{1-oD!MkI{TyztthQZU-&t;ucLK6Vw#}=^w literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/34.png new file mode 100644 index 0000000000000000000000000000000000000000..8dfa45d0c343f47f18615583fb33f8b4b1c8988f GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ql2i3Ar*6ye|&#`zrHQdfXnTm g2m9>xcmMG-s4ZrXHI%ho3{=J7>FVdQ&MBb@06^3iRR910 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/35.png new file mode 100644 index 0000000000000000000000000000000000000000..8204a4542ecf470442e08a1fe99db4205786569d GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`GM+AuAr*6y6BaPY{P^|WUiFvz hK@ADk5Y{Pao($~X?5RmC)h0l744$rjF6*2UngAf#6+8d{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/36.png new file mode 100644 index 0000000000000000000000000000000000000000..1e8f54d0080d529d4b152af6845dd5304eee9fc9 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*7pp4lkMpulnD!i#^- z8#!2we`N4Ws~?#5<)??%tjJYmS6G7^>bP0l+XkK!QdVX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/38.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee8e7803d703c2889070e8a6fc35748980f6944 GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`GM+AuAr*6y6C_v{Cy4L}AE_fKBm^Yhl*{|wd5d`}NNkc$RtX7F_Nb6Mw<&;$UE Ci6zPa literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/40.png new file mode 100644 index 0000000000000000000000000000000000000000..98bfd8adb82c0c31ef3fef4bb66aa1c5706b1ffc GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ik>cxAr*6ye|&#`zrHQdfXnTm n0YeY_zJI^}|9lv`iI;(4NitVlyXb*tpkfA3S3j3^P6bP0l+XkK5N#Hp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/45.png new file mode 100644 index 0000000000000000000000000000000000000000..62bbeff4751cf45a2a99e5036155cf61ef2bf57a GIT binary patch literal 80 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`;+`&!Ar*6ye|&#`zrHQdfXnTm dMnVDugWLk_{LS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/7.png new file mode 100644 index 0000000000000000000000000000000000000000..2005131f90627ddb953514b49d5bce79b97e1c3c GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`s-7;6Ar*6y|9pRczn;zL;KKJ$ sUdga7P7t}kAoIhkuIygT+i&#@%Z+$WzVqt31JuCa>FVdQ&MBb@0O>R!CjbBd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/8.png new file mode 100644 index 0000000000000000000000000000000000000000..417aceaf8be6d1b2bfd633611da376ec6989da84 GIT binary patch literal 88 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%_o-U3d6?2k*e1CtxzAeyz%k5wR k1N**7^XHn!@BS;#!0W=zFLYPF4XBjC)78&qol`;+0KQ8Y>i_@% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/9.png new file mode 100644 index 0000000000000000000000000000000000000000..fccbb2c9c6593a0d941ecf53e57cd4691900a2c2 GIT binary patch literal 87 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`a-J@ZAr*6ye|&#`zn;zLVB`8H kuVq;mCx`^d2Fy}rRJ_d{_hPx-UZ6?_Pgg&ebxsLQ0KzUB00000 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/glass_0.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/glass_0.properties new file mode 100644 index 00000000..6fb0a35e --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/glass_0.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_glass +metadata=0 +method=ctm +faces=all +tiles=0-46 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/0.png new file mode 100644 index 0000000000000000000000000000000000000000..ae4a034c78222ab466d8103de1fc03175291b102 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`nVv3=Ar*7pPTt6SK!Jzl{5@6Q zvXfhM1Pobt7bUQXTy&f@VTsC;r>dvVzW#GG+Dmh)<4qo}1*FVdQ&MBb@0LBqLy8r+H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/1.png new file mode 100644 index 0000000000000000000000000000000000000000..d499e46842e458e1aef49a71dd47517e011a02dc GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar*6y|9pRczn;zL;KKJj zJU%=?;N#=dV=zmCC;0czhp}vKMKJ|0teFo#Z!cGrnZfv^s^xBq+C_x=0rKkaM)1Hd*{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/10.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa24b9b8c93db332f8926dbeef5f0fd0fc149f9 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`0iG_7Ar*6yQxus0{Qmylo|&2X z@WS^zJU&k(4uHUsBS(Jxd>G5-R%9ao*8tH$;2S8Bxco{oWKV(o59o7&t;ucLK6UbEFFeIc&{XX4uJB@3VLNl zWbnXnHqSX_2?!#A_be)ZsT^FwVZYU!(l_i!EKu{4*BYJ2S0X wAMrGU+3bO+LT2S3h7mdKI;Vst0B5^0od5s; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/14.png new file mode 100644 index 0000000000000000000000000000000000000000..c09d99ac005493acd00938bf3c3fa740a3cd848e GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Hl8kyAr*6y|9pRczn;zL;KKJj zJU%=?;N#=dV=zmCC;0czhp}vKMKJ|0teFo#Z!bSt`a?s4buoi914B~2pu82+l6OFJ O7(8A5T-G@yGywo-<0It& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/15.png new file mode 100644 index 0000000000000000000000000000000000000000..4a76cfd1e1edf713c4dbb97e30d805fb94abf136 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`p`I>|Ar*6y|9pRczn;zL;KKJj zJU%=?;N#=dV=zmCC;0czhp}vKMKJ|0teFo#Z!bStYQcQ?S@!n-hcnbZ^)@yHGQ06E oIKdE+rE;4gUN_Wj)eZ)R%o_Owqg>0mKnoZ=UHx3vIVCg!05R?`JOBUy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/16.png new file mode 100644 index 0000000000000000000000000000000000000000..3e221bd38b398fa963c2eab9cd00d4e1d70cf718 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar*6y|9pRczn)DaAt@;- zMSyc{U zlbC4CW>YzdDS<6#U)k&zOL&5J|Gf3~e~*S_GYFVdQ&MBb@ E0EDeOvj6}9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/17.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9dd614d7c9f7c79fbdf9b454aacc119529a064 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`1)eUBAr*7pPTt6SK!Jzl{ykOS zvXfhM1Pobt7bUQXT%0L#kSn%f%bX|Y{%>1q-s$1kI+Ig&#j&&o_ZHnVKALP7&agdK zRXw^uN^R}Emzr!czug>cAM&40kYuP>ob!3|hQuoeEaLZ7iM};GC!Qsr+$L?|YHl^N Spwt{_H-o3EpUXO@geCwrXFQky literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/18.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2b3f7eca93255d56cdaffb38a7ea9e49f76b09 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar*6y|9pRczn)DaAt@;- zMSqg@e->Tw+HR1)`#$HXG5-R%9ao|Ar*6y|9pRczn)DaAt@;- zMS^ylH6j22 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/22.png new file mode 100644 index 0000000000000000000000000000000000000000..d644831ce29f69178df030bb05775109e4fd9750 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`_MR?|Ar*6y|9pRczn)DaAt@;- zMSgTe~DWM4f4`3^C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/23.png new file mode 100644 index 0000000000000000000000000000000000000000..77620a8678a76344e3c332d2135040e868ca12b3 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Zk{fVAr*6y|9pRczn)DaAt@;- zMM2PD;%dR83@PC~O@Rh32lv(-={ob6qwR-Q`w#3k4wsxVg`bxi^ItihanRp#%I<5MA22Ly&^J7Ft?L5NP6kg` KKbLh*2~7ajAw04G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/25.png new file mode 100644 index 0000000000000000000000000000000000000000..d9ef72b5df7235ce52d189c6e80975f910a14e20 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9-c0aAr*6y|9pRczn)DaAt@;- zMM2PD;%dR83@PC}J=_|Mi`jal7|b8s-(UZqzjpZn1~oOcW9RwbPf9mdKI;Vst08sNO*8l(j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/26.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/26.png new file mode 100644 index 0000000000000000000000000000000000000000..55b8c22f96342710343c2b20d87e4ada218240c6 GIT binary patch literal 75 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`LY^*;Ar*6y6C_v{Cy4YgaWF8j X2rw{)nnzs#$})Jm`njxgN@xNA_kj-( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/27.png new file mode 100644 index 0000000000000000000000000000000000000000..196393ddb3bc5660055001ded2c182820b3c1512 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`5uPrNAr*6yQxus0{Qmylo|&2X z@WS^zJU&k(4uHUsBS(Jxd>G5-R%9ao-?NR ylh8+!x(9{!aH(7ksN?u$7}FHc@YW*Mo}q!wCtoM?yMPDCDh5wiKbLh*2~7b1(=&Ad literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/29.png new file mode 100644 index 0000000000000000000000000000000000000000..af7baaab9727eadad0032973407f9d1d960621d7 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`0iG_7Ar*6y|9pRczn;zL;KKJj zJU%=?;N#=dV=zmCC;0czhp}vKMKJ|0teFo#Z!bSt`a?s4)r6tvNye?3w`Mj!jVESr jUO!Ds*_G`;3?oC6h(vq&_s8piW;1xY`njxgN@xNAEQc>P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/3.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1eacbbdff980006771a55fbe7f95089e7dc4d1 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`@t!V@Ar*7pPTt6Qz<`Iv|5p8M z9RVAcSq}~w&v@YHCFl|)we)LqfO4O{Us9T%QECIzid9GE&D`;Jtzopr08w-| ABme*a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/30.png new file mode 100644 index 0000000000000000000000000000000000000000..ab428f20b705ee031de29d9c81823d5702474c34 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`VV*9IAr*6y|9pRczn)DaAt@;- zMM2PD;%dR83@PC}J=_|Mi`jal4uHU+0}P(0+V=^s&-}dgb_dT15O==(J=K$G@w%aI kY(TKg`F^0U%2iQ@3SC(tuMevx0&QUMboFyt=akR{07y76V*mgE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/31.png new file mode 100644 index 0000000000000000000000000000000000000000..97efe86b6920690662d7bffd3ee66a841eb80caa GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`;hrvzAr*7pPB!E^V8Fwi`v1TA zUx$y%yQc6|I&0i};`1_w9^fCyWao6oqUASAJOzopr0A}GFhX4Qo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/33.png new file mode 100644 index 0000000000000000000000000000000000000000..7346038fdaf743d0ed0eff259aa6b4f820503112 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`_MR?|Ar*6y6C_v{Cx`^F|M~s> z{r~;-|NqJV`1Ri2^4ClWAeb>@hJ?NS9`9+)Gx%!L6K>SJHH+M4Y+zu(z#ueTxc1K5 S*j+%Q7(8A5T-G@yGywpJrzrmb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/34.png new file mode 100644 index 0000000000000000000000000000000000000000..0789b989b8f442c1172d01bee44a21326d809634 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`7M?DSAr*6y|9pRczn)DaAt@;- zMM2PD;%dR83@PC~O@Rg`jFFWIpSRxb;PF^@c3;%09uY}~VpfLUE&O>hv90@oW-xfV L`njxgN@xNA*s~)A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/35.png new file mode 100644 index 0000000000000000000000000000000000000000..23e0bbb80c8d0592f3de1e51dc1558108d5f92df GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`VV*9IAr*7pUS7z1z(BzHV*U32 zX0ZyV1XM#E(mECy#5+0``fHtjylrAHizj1%c*Qb?19x-3w51+O)pE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/37.png new file mode 100644 index 0000000000000000000000000000000000000000..d19437832f91881525406d165128832af402c756 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`L7py-Ar*6y|9pRczn)DaAt@;- zMM2PD;%dR83@PC}J=_|Mi`jal4uAlM_p$bU#s)QY71K+E6WDV0mCb(fhaq_P&s%T* k_ptB#_uGHk*#HKHGoMwt({J6n4m6#?)78&qol`;+0MHaOi~s-t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/38.png new file mode 100644 index 0000000000000000000000000000000000000000..5560ab9b729212d1b2a2440ae946ee9aa85986a2 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ww^AIAr*6y6C_v{Cx`^F8vOhH z{k=UiGxOnv?|FFU%imMI%QAy;_WHa3{MX3MxOMh=-v4x)4`1)sZ^~(7Vo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/4.png new file mode 100644 index 0000000000000000000000000000000000000000..3192d32e46c48f187bb85714c7b40a4c8df9c8d3 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`X`U{QAr*6y|9pRczn;zL;KKJj zJU%=?;N#=dV=zmCC;0czhp}vKMKJ|0teFo#Z!cGrnZfv^s#>?Pj@$qhemm*O@^g{=X?LROxsGU^(xkZ+_a&}?l->d?@$KLD0=iOfGD)px9iLU6^mdkQLI~hD( L{an^LB{Ts53%)$% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/42.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/42.png new file mode 100644 index 0000000000000000000000000000000000000000..4931fb3ab5f60ebfb8432c5e1533063ed5cfb88a GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`p`I>|Ar*6yQxus0{Qmylo|&2X z@WS^zJU&k(4uHUsBS(Jxd>G5-R%9ao3;3=38X<$0*bscYZabw9ahKKu7PzDpsz^A`e5 OVeoYIb6Mw<&;$U4Stic_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/45.png new file mode 100644 index 0000000000000000000000000000000000000000..ed15dfd7de12ceb1b384a4b9644b51c5f5a10ed9 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`YMw5RAr*6y|9pRczn)DaAt@;- sMM2PD;%dR83@PC~O@RhnY#a;>dHft~n|FKe1?ph%boFyt=akR{06bY4TL1t6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/46.png new file mode 100644 index 0000000000000000000000000000000000000000..a6194eff9400ac9afbf75769056aa5e2c4522eb5 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`DV{ElAr*6y|9pRczn)DaAt@;- zMSU1J zto*$7cE^+R2O3UDEMbV(4RvD!f@RM41ASG*4t!x?Xc5y9J()Xy2GBkRPgg&ebxsLQ E02J3dPyhe` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/5.png new file mode 100644 index 0000000000000000000000000000000000000000..4810344867dc58037b3af14cd435845fc5f8c540 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`nVv3=Ar*7pPTt7dU?9M(zn`0T zw}CGA0v^Zapp-U_rNtTn3tHDFzkK?vv?!6?lXrO%E3?7o3x7|4y+29#;ADj`4a>^r z!@K0y?*3`Goh^ZZ!6#_)m2IEnmsU&9H~jndo00$b6-l+3^H{{oYK?BZTdCjzw3NZq L)z4*}Q$iB}Q|CLC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/6.png new file mode 100644 index 0000000000000000000000000000000000000000..410dd54e5b0d875884cc55e2f0d0cf8484e7e274 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`S)MMAAr*7pPB!FgP!M4GZdP~n z*!~|;_6Zd&y$c`k9=RYZmc^jGAnn&ppF;IjQXidy0uDZ(!LY&gjH2efNDu#mb(vqz zO|$$N5bW7+!glPye9nq>7h0+^tSvQua~a>_Fpl_jDyc0c~aQ MboFyt=akR{0H)48+iOy*H@$|ndbh^TIpnTb>aIJYC_xzRSfxsYSC{tu$BSsV(@hJb6Mw<&;$TKnlzFC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/8.png new file mode 100644 index 0000000000000000000000000000000000000000..f44a165981f45d5207ded1c33ffe7ba7b6104b74 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`L7py-Ar*6y|9pRczn)DaAt@;- zMM2PD;%dR83@PC~O@Rg`jLJHa^1sdm!G$ndv3ZJ?mcy4 kBM`j2P#z-O$!cKBP%S9yB;u_30cbjdr>mdKI;Vst0Am9#Pyhe` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/9.png new file mode 100644 index 0000000000000000000000000000000000000000..430e6f0f0872d8da90873860fb06c76151a1ca5e GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr*7pUf#`nKtX^xVE*^} zYTOEK9>ReJ%uXeCv;LfFn9_GWdf%b+Niyn_+W6P`p00i_>zopr0GT;8-2eap literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/glass_1.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/glass_1.properties new file mode 100644 index 00000000..effad927 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/glass_1.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_glass +metadata=1 +method=ctm +faces=all +tiles=0-46 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/0.png new file mode 100644 index 0000000000000000000000000000000000000000..21072b647eb323bac690cda2471f88c58a7aae9a GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar*6yP0Y;p9d%Hv`238Q znVXrJ`S9lS^HnDdA3Q%lzt$&%>8(pv%j#q&v6S@m^(t=0o2+&)9?3Yi=$*W<-&B{T zKxVc^MjvN;Rih1iDnGY91ZlFk^56OK;&w@4hSj%?14Y&@e+aaV!PC{xWt~$(69B~q BH{k#P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/1.png new file mode 100644 index 0000000000000000000000000000000000000000..aede6bfc0c6562f0396da9e3be3ab1db2b96eb15 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ah@)YAr*6yP0Y;p9d%Hv`238Q znVXrJ`S9lS^HnEITR3Na{`~xWS(1t3>SQOel=SrVDsIM`tadOS$vC#Gk8`?H(!mvs z&F2~x&J>Egx2N*(2cT*@nOFZ8e!O_Nhm)aETJOeW4*w-Un;1M@{an^LB{Ts5VU;-N literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/10.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7e86d52dfcd748a468820767e3393334886fbf GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`o}Mm_Ar*6yr%ajRldK@TVdKWB z1`}7$Y;0_Nczu1mtp?klKR-9mmFPY3YQ_ZCn>TN2cV6sS(>HOFfkWZJ6^w_EH3-fS es{i-Ll954mu6jvVbGj|iPzFy|KbLh*2~7a_FEHK! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/11.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d442720a61c4d5b3c2a724e7db75ddf2549d72 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`j-D=#Ar*6yr%ajRle~bzAaIf7 z;fDG4_1lCOb4JPvZ&I+fu2waiHSww;-#P;c(*y$v1D9YWY3XRrowMry{jp?ZcyL1b V*R%yM@_~jic)I$ztaD0e0sy19B{cv5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/12.png new file mode 100644 index 0000000000000000000000000000000000000000..a7884191b1549ec50aeab33616e2ea6e52705e38 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar*6yP0Y;p9d%Hv`238Q znVXrJ`S9lS^HnDdA3Q%lzt$&%>8(pv%j#q&v6S@m^(t=0o2+&)9?3Yi=$*W<-&B{T tKxVc^MjvN;RU?DFm7m)rYIiUQGwfTeca6R8Q!daF22WQ%mvv4FO#pQBFoggB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/13.png new file mode 100644 index 0000000000000000000000000000000000000000..7208cf13d163861384da1b450213439ca38408a4 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`!JaOTAr*6yP0Y;p9d%Hv`238Q znVXrJ`S9lS^HnEITR3Na{`~xWS(1t3>SQOel=SrVDsIM`tadOS$vC#Gk8`?H(!mvs o&F2~vX9?ZkQ|a7eH-~{?@!n#SPi>gTe~DWM4faEd6C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/15.png new file mode 100644 index 0000000000000000000000000000000000000000..dad419d1323cdd275be8ec53d635f94d76ca22fc GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`zMd|QAr*6yP0Y;p9d%Hv`238Q zdGV4ZDN;Mx{`~p5xu4T_!Ca5tf>NIoO>f@3nR+C{EsWi~LE>!0mA}b{R!;IT$U2~4 i(2)6Jxyz};3=Hx6HJjK>%@zR-X7F_Nb6Mw<&;$TgcrfAs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/16.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd0fe193b7907d4d83b54169c0a854b47804f5e GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr*6yP0Y;peSLFtvmBcd zgS2!sr?90|;)Cn!<83wA{`~p5d9Fn7iB~fwu-?3RQ@itG&l1EE06#2%nM44$rjF6*2UngGqCH8ubM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/17.png new file mode 100644 index 0000000000000000000000000000000000000000..63d7861b1e32a3fb2b566e2733ff5b6513e8e08d GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`sh%#5Ar*6yP0Y;peSLFtvmBcd zgS2!sr|`~Mk`fXUcJ=>sj<)E0`275QS(1s;>SQOel=SrVDsIM`tadOS$vC#?oxHH$ zRF|eeX0}E~A7^`2BZE_?Pv8Ib=jUb-zOVl;{CJUgjD_L)LBq`*PRCM!7BYCc`njxg HN@xNABGNf* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/18.png new file mode 100644 index 0000000000000000000000000000000000000000..15ab6d09fbc7cfead98efb0c22f6f873cd193379 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`p`I>|Ar*6yP0Y;peSLFtvmBcd zgS2!s=i((xQlus8#0H(9-^O1#pLn0VlVPiN1k qPoK8i)&J9Jb^a$WC2xCX2E#N3t*AGTPc8sjz~JfX=d#Wzp$Pz0iZkK> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/19.png new file mode 100644 index 0000000000000000000000000000000000000000..8e8d7ac8f4ad06cf27841e234576d6eecd1f6926 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`v7RoDAr*6yP0Y;peSLFtvmBcd zgS2!sr|`~Mk`fXUcJ=>sj<)E0`275QS(1s;>SQOel=SrVDsIM`tadOS$vC#?oxHH$ xRF|eeX0}E~A7^`2BZG|_H%=8;EXba~#Bi@!SKy*SwhYiB22WQ%mvv4FO#r-nFC72? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/2.png new file mode 100644 index 0000000000000000000000000000000000000000..77a7a1ee1e643553281617efbfcbbdee91edcd61 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr*6yP0Y;p9d%Hv`238Q zdGV4ZDN;Mx3_w7!xbEMdn|?iNDWyIqn%=y5GxbP@TbO&Sevg!a4v)kv&540=asRG8 mKRTN2cV6sS(>HOFfkWZJ6^w_EH7L#! lx_RS<*NLltK0iOt$>6$P{a4Z{W;dYG44$rjF6*2UngEiYHr)UK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/21.png new file mode 100644 index 0000000000000000000000000000000000000000..7813b18f05c8198caaadd9a32d54c09f95f23559 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9-c0aAr*6yP0Y;peSLFtvmBcd zgS2!s=i((xQlus8#0H(9-^O1#pLn0SE0r_;Xv c-y8;pHhGOzA8w>60L^6ZboFyt=akR{0C0UO`2YX_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/22.png new file mode 100644 index 0000000000000000000000000000000000000000..41334019dfaa4b4b8b713bebd893845e3b7261ac GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr*6yP0Y;peSLFtvmBcd zgS2!s=i((xQlus8#0H(9-^O1#pLn0SE0x09jf XoT~oy?R*wM;}|?${an^LB{Ts5iB~8} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/23.png new file mode 100644 index 0000000000000000000000000000000000000000..3a99bb43ee6b8dcd7f4363d9fa9541521767bdcd GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9-c0aAr*6yP0Y;peSLFtvmBcd zTr>mdKI;Vst03PxwR{#J2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/24.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/24.png new file mode 100644 index 0000000000000000000000000000000000000000..24a3ddeeb439041ab91ae9b6ddb78b8ee6f023a1 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar*6yP0Y;peSLFtvmBcd zgS2!sr?90|;)Bo6&j)F+{rU5A^IVDE6R&1WV7+;M1& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/26.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/26.png new file mode 100644 index 0000000000000000000000000000000000000000..999a3bd4a7989f63a9063faa3b1f4a80fa643203 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`W}YsNAr*6yr%ajRle~bzAaIf7 z;fDG4_1lCOb4JPvZ&I+fu2waiHSww;-#P;c(*y$v1E*jmhV7~HKZS)|dVnS{c)I$z JtaD0e0s#1j9$)|f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/27.png new file mode 100644 index 0000000000000000000000000000000000000000..b45688e3749c4ce78cfee2abb5b293eef871a806 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{+=$5Ar*6yr%ajRldK@TVdKWB z1`}7$Y;0_N`1$$yAPu%Ze|~PBE75!6)r<+OH*en5?!4HuhA)r7aMs2Zzuf~R7VJp4 l($Hw!kojV{%c;W*3{K{%K5O!tNIoO>f@3nR+C{EsWi~LE>!0mA}b{R!;IT$U2~4 y(2)6JxeJ?HW#!N4`S$hG4lVpAFC}k#W(GqgzuxNJDB~2MMGT&AF)&>FqAl=E;LUTOsSKX3elF{r5}E)OO)WkE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/31.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c54e34a3e3ed6dbe44c8b7181bf9eff40b2e89 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9-c0aAr*6yP0Y;p9d%Hv`238Q zdGV4ZDN;Mx3_w7!xbEMdn|?iNDWyIqn%=y5GxbP@TbO&Sevg!a4v)kl&56CeYg>ev Z8N@|YwuUT?~sDD40M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/32.png new file mode 100644 index 0000000000000000000000000000000000000000..388572ddfff211368784d48c5e16ee5acc4c6c41 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)}AhoAr*6yr%ajRle~bzAaIf7 z;fDG4_1lCOb4JPvZ&I+fu2waiHSww;-#P;c(*y$v1E%0d=jYq2GcX+3rd;B7M_3YQ O41=eupUXO@geCy93?S+N literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/33.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb077dec9e23fabc02171819a5351d088ab0c6a GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ww^AIAr*6yr%ajRle~bzAaIf7 z;fDG4_1lCOb4JPvZ&I+fu2waiHSww;-#P;c(*y$v1D9YWY3XQARiG)?%N6PuXWl;x PG>E~|)z4*}Q$iB}&U+xK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/34.png new file mode 100644 index 0000000000000000000000000000000000000000..2139200c6704704accd8d7c5196ca1dbcd5798e3 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Zk{fVAr*6yP0Y;peSLFtvmBcd zp3vx$LHtg aIT_miYN%}6)^pUXO@geCy$!zr}@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/35.png new file mode 100644 index 0000000000000000000000000000000000000000..405a2761fc3b61a6a9775d2dec6fb6e823395a0b GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-kvUwAr*6yr%ajRldK@TVdKWB z1`}7$Y;0_Nczu1mtp?klKR-9mmFPY3YQ_ZCn>TN2cV6sS(>HOFfkWZJ6^w_EH7L#! gx_RSzopr09;QobN~PV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/36.png new file mode 100644 index 0000000000000000000000000000000000000000..81796a4c9b653ecffa2b02217bd644a0684401c3 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar*6yP0Y;peSLFtvmBcd zgS2!sr?90|;)Bo6&j)F+{rU5A^IVDE6R&1WV7+FVdQ&MBb@03jqZ$^ZZW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/38.png new file mode 100644 index 0000000000000000000000000000000000000000..22ebc5351d69ba256dbf981cc98cc48cf214c8c3 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9-c0aAr*6yr%ajRle~bzAaIf7 z;fDG4_1lCOb4JPvZ&I+fu2waiHSww;-#P;c(*y$v1CwB-#e4SrS$lrIz4yZj|J#qb c^Bb!%T-dIv;$0?p1!yLNr>mdKI;Vst0Q>nUaE&L}hC2xCX219haR_QUZpOb-BF?hQAxvX|Ar*6yP0Y;p9d%Hv`238Q znVXrJ`S9lS^HnEITR3Na{`~xWS(1t3>SQOel=SrVDsIM`tadOS$vC#Gk8`?H(!mvs q&F2~vX9?ZkQ|a7e7qf0A1H)V+-D{igp120IfWgz%&t;ucLK6T4a560b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/40.png new file mode 100644 index 0000000000000000000000000000000000000000..6117cd76d0f8f1cbd7f12a8fbed9ebc78a3295f3 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr*6yP0Y;peSLFtvmBcd zbv#lt=lcHk1GW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/42.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/42.png new file mode 100644 index 0000000000000000000000000000000000000000..363c0212d912ca7628597664d1a9298cd1f3b779 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`;hrvzAr*6yr%ajRldK@TVdKWB z1`}7$Y;0_Nczu1mtp?klKR-9mmFPY3YQ_ZCn>TN2cV6sS(>HOFfkWZJ6^w_EH7uMd uB>D8|)BM_heN%qT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/43.png new file mode 100644 index 0000000000000000000000000000000000000000..835bee1fb80ff51cb59a7df1b47c9d1a6b4f4b56 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr*6yP0Y;peSLFtvmBcd zgS2!sr|`~Mk`fXUcJ=>sj<)E0`275QS(1s;>SQOel=SrVDsIM`tadOS$vC#?oxHH$ oRF|eeX0}E~A7^{jAUQUMeT6z*yY5Fk1e(v_>FVdQ&MBb@02T`@TN2cV6sS(>HOFfkWZJ6^w_EH3-fU ZVwCYw{yCGk?>o>u22WQ%mvv4FO#t$?F3JD^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/45.png new file mode 100644 index 0000000000000000000000000000000000000000..d9157ff53b16e196392d17da486e57b095597983 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`PM$7~Ar*6yP0Y;peSLFtvmBcd z$xz6gQ0ef W%1VjHTf%{+F?hQAxvXs8#0H(9-^O1#pLn0P?Iw=*Xv iNA*e8zn`C|Ar*6yP0Y;p9d%Hv`238Q zdGV4ZDN;Mx{`~p5xu4T_!Ca5tf>NIoO>f@3nR+C{EsWi~LE>!0mA}b{R!;IT$U2~4 q(2)6JxeJ?`nb|g>B$G!BJ`D92wK&2QelY?qVDNPHb6Mw<&;$V05;B+o literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/6.png new file mode 100644 index 0000000000000000000000000000000000000000..a268bde20397c25447b6cee1784378814b412af0 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`!JaOTAr*6yP0Y;peSLFtvmBcd zgS2!sr?90|;)Cn!<83wA{`~p5d9Fn7iB~fwu-?3RQ@itG&ls8#0H(9-^O1#pLn0P?Iw=*Xv eM|Fw>1H+sLs#}BHb1Q+SGI+ZBxvXgTe~DWM4fcYGzY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/1.png new file mode 100644 index 0000000000000000000000000000000000000000..ad20bb5b4a44f122d57cf25cd2398298cbb06689 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Hl8kyAr*6yO-xK`PCBqve19j) z3MPA6vH2{kKbPwc$9T9TaT211&@NY{-3|U&AYVp7#OM!a3rUNxLyPr!rHnl_Y)iYfyOW} Nc)I$ztaD0e0sslfBd-7e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/13.png new file mode 100644 index 0000000000000000000000000000000000000000..6a9006544fb6885337b7c7075f2d5679bac20958 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*6yO-xK`PCBqve19j) z3gTe~ HDWM4f>iZsz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/14.png new file mode 100644 index 0000000000000000000000000000000000000000..88aa3cfff9d5325271690d01de9bc5abfa355579 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`2A(dCAr*6yO-xK`PCBqve19j) z33}$9#=4?Qq7G#phtn(!6&)3)2^;YdjxY7{F%+}7R^Zwr6^LdD}ew2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/17.png new file mode 100644 index 0000000000000000000000000000000000000000..86db2d5c1db73f57e8f55baf36179eea12fd221f GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`PM$7~Ar*6yO-xK`P98XL;KQS% z-LX6>3}$9#=4?Qq7G#phth3}65A*%~_2LV=xZQXqOcM$u4ltb#-LS>CT%3VHtCC-B U(eH`fK+_mJUHx3vIVCg!0HX>cc>n+a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/18.png new file mode 100644 index 0000000000000000000000000000000000000000..a99df87ff1170031e5c11daebe623398d93eb842 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`PM$7~Ar*6yO-xK`P98XL;KQS% z-LX6>3}$9#=4?Qq7G#ph+%sv?q;5^ah9vPGDTAy74-6Vur>)*s|6k8YL63pKPla&@={5S3j3^P63}$9#=4?Qq7G#phth3}65A*%~_2LV=xZQXqOcN$Z95{CD8QbYd=0{8n?{4!n Ud+1$v2Aam;>FVdQ&MBb@0MVc&5&!@I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/2.png new file mode 100644 index 0000000000000000000000000000000000000000..0dcadb8d0a3dec3994ab62595db436f682f2d7c4 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`_MR?|Ar*6yO-xK`PCBqve19j) z3MPA6vH2{kKbPwc$9T9TaT211y4fbQ>}{x3}$9#=4?Qq7G#ph+%sv?q;5^ah9vPGDTAy74-6VwV|wfV|La}U#m%rrm2=sL S5Mx=OVGN$GelF{r5}E+e;3bU! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/22.png new file mode 100644 index 0000000000000000000000000000000000000000..bf1c0203252ca63fa0d8e556570088d752c66731 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`7M?DSAr*6yO-xK`P98XL;KQS% z-LX6>3}$9#=4?Qq7G#ph+%sv?q;5^ah9vPGDTAy7D;R;s?D@wQyu?iB8PE&{Pgg&e IbxsLQ07$?e>Hq)$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/23.png new file mode 100644 index 0000000000000000000000000000000000000000..2ec3fd37aecae455113fecd1dc285aa2dd92934a GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`W}YsNAr*6yO-xK`P98XL;KQS% z-LX6=3~EItip*j~xyxp8yYWhxCQOhxaO~K#V?b<{pvS3}$9#=4?Qq7G#phtn(!6&%eLBIYMI$vJR|ZY(C5|t^EBx-Zk6|$Io%=2Atd# Q4>XCv)78&qol`;+0G4ni;{X5v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/25.png new file mode 100644 index 0000000000000000000000000000000000000000..6a779e5a64af05489081e52467fdf58729c70922 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`+MX_sAr*6yO-xK`P98XL;KQS% y-LX6=3~EIty;25Q2Ual7Xn1;ecRBNGCWfwB_FG$4+PDCgTe~DWM4fI93(v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/27.png new file mode 100644 index 0000000000000000000000000000000000000000..446f3934e323c1956f81cca664a131a59b4922f7 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``kpS1Ar*6yr%ag=bH;%!Avw7? zIROZi+>MPA6vH2Xe}CU~#iOP`W;b35QwAmmw`i8ccy5JdK&=d(u6{1-oD!M3}$9#=4?Qq7G#phtn(!6&)3)2^;YdjxY7{F%+}7R^Zwpm=?HP4!P4A!KDcdl Q1scWR>FVdQ&MBb@0H|Oj>i_@% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/29.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1d4bd169effd4eee529076321e7afff5a281a7 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`R-P`7Ar*6yO-xK`PCBqve19j) z3+YpWol}MM7g37%CQUYjd?9x)0RN;OXk;vd$@? F2>?$5BRl{A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/31.png new file mode 100644 index 0000000000000000000000000000000000000000..916c1875aafb642ba67678f615a7d0ca7bf19dee GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`R-P`7Ar*6yO-xK`PCBqve19j) z3Ygr+Ar*6yr%ag=bH;%&VUf${ s6^x77dZZds7^J0VO9S!khMf!yag!MLZLn3-0BT|IboFyt=akR{08f1yB>(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/34.png new file mode 100644 index 0000000000000000000000000000000000000000..7ae2161691c4b0bd1ffb000c0e0fa5b31af158f9 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rk*a2Ar*6yO-xK`P98XL;KQS% z-LX6=3~EItip*j~xyxp8yYWhxCKN~Az@w}TL9X0a?@wJO2Q+}e)78&q Iol`;+081Dl$p8QV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/35.png new file mode 100644 index 0000000000000000000000000000000000000000..f2cc0827a73378f05b90814595938e2c746ddbf7 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`7M?DSAr*6yr%ag=bH;%!Avw7? zIROZi+>MPA6vH2{kKbPwc$9T9TaT212M3}$9#=4?Qq7G#phtn(!6&%eLBIYMI$vJR|ZY(C5|t^EBxLjxfA^Y^!TmO~5! ZL#P2?UBsW*xj-`+JYD@<);T3K0RT7WDXRbg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/37.png new file mode 100644 index 0000000000000000000000000000000000000000..39fe0e6005b0f3d01062702d6a78abae6b4f271f GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rk*a2Ar*6yO-xK`P98XL;KQS% z-LX6=3~EIty;25Q2Ual7Xn1;ecR3FT)c^n2DMPA6vH2Xe}CU~#iOP`W;b358MX}vibQpCFW+TlxL(A*rS1#27|;j?Pgg&e IbxsLQ0Eq`8LI3~& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/4.png new file mode 100644 index 0000000000000000000000000000000000000000..723d0a0b4a18f7f03f084bc2f176253f3dece7a1 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ww^AIAr*6yO-xK`PCBqve19j) z3MPA6vH2Xe}CU~#iOP`W;b356}AlMPA6vH2{kKbPwc$9T9TaT211y4fb(^c>9@9*a6;AW87&yg%3JC_}32!p4q KpUXO@geCy5Eg{eV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/43.png new file mode 100644 index 0000000000000000000000000000000000000000..b876f986ef2ca395edc33a15064048534de28996 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`R-P`7Ar*6yO-xK`P98XL;KQS% z-LX6>3}$9#=4?Qq7G#phth3}65A*%~_2LV=xZQXqOcSm!a4;~;4CcNpCHX)JXbOX; LtDnm{r-UW|YX~0_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/44.png new file mode 100644 index 0000000000000000000000000000000000000000..36ab101d0b0df8e47db47541ad9781e1378d0fbc GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`2A(dCAr*6yr%ag=bH;%!Avw7? zIROZi+>MPA6vH2{kKbPwc$9T9TaT1M76S_dL-$Npfo;Bzc!7EuJYD@<);T3K0RT(! B9Nqu` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/45.png new file mode 100644 index 0000000000000000000000000000000000000000..235afd36252003ff716afcba992cdb3c93db4715 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`I-V|$Ar*6yO-xK`P98XL;KQS% x-LX6=3~EItip*j~xyxp8yYWhxCR}0QU|>j=<7o1V=LBhI@O1TaS?83{1OUz%8WaEk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/46.png new file mode 100644 index 0000000000000000000000000000000000000000..00619793b3747d0a79e6cc8b540549ca5276926c GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9-c0aAr*6yO-xK`P98XL;KQS% z-LX6>3}$9#=4?Qq7G#ph+%sv?q;5^ah9vPGDTAy74-6Vur>(C0`^z;b@6Ye=`68h) a3=F-@yvvr}+OiL5CWEJ|pUXO@geCwE@G0m3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/5.png new file mode 100644 index 0000000000000000000000000000000000000000..4e541b128262250c14c2b7faf633ee63c0c87026 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`cAhSdAr*6yO-xK`PCBqve19j) z3j N@O1TaS?83{1OSxsCwl+@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/6.png new file mode 100644 index 0000000000000000000000000000000000000000..877b1fefc2bc890ef8e8ddec7822daed6e12df6a GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`uAVNAAr*6yO-xK`P98XL;KQS% z-LX6>3}$9#=4?Qq7G#phtn(!6&)3)2^;YdjxY7{F%+}7R^ZwpmW$(xL_t!68@ra4x Yw?4nFj_$SjKm!>(UHx3vIVCg!0O)Ti`2YX_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/7.png new file mode 100644 index 0000000000000000000000000000000000000000..9f28555b4a960f34bf396f4ef09e0c5bdddfc9ea GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`uAVNAAr*6yO-xK`PCBqve19j) z3zopr0JRDu(f|Me literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/8.png new file mode 100644 index 0000000000000000000000000000000000000000..56987a30bb46842d9d03d870838a9b2f6bef5c66 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`j-D=#Ar*6yO-xK`P98XL;KQS% z-LX6=3~EItip*j~xyxp8yYWhxCKN~pO1)z4*}Q$iB}x5p~7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/9.png new file mode 100644 index 0000000000000000000000000000000000000000..0b1fa2817258dc978a0d4d70066b47708502dad6 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4xTQKAr*6yO-xK`P98XL;KQS% z-LX6>3}$9#=4?Qq7G#ph+%sv?q;5^ah9vPGDTAy73Wg26y=Qr+ZDu>d${;kAoms8( RtQ62J22WQ%mvv4FO#os5B3=Lh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/glass_0.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/glass_0.properties new file mode 100644 index 00000000..aacbec0c --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/glass_0.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_glass +metadata=11 +method=ctm +faces=all +tiles=0-46 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/0.png new file mode 100644 index 0000000000000000000000000000000000000000..60bf98cb778921b10b9128b25c40c8d835322b2e GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`i#=T&Ln`JR4L0OzFyP5)n*IL8 zrSKn(`@-%Vb?*p}scG(rexx9{)mKoKN5o5i?~`?!0)n%rUtD`^hCWNFyu|&uX%-wE z9jRNr?@Vorw{mcCaG9~(Fjlv*epbUIaUchz4O(_X@bN1X-49K5f)m_>Q?c{h&3sWwA2T+1#m5zVByv>$Il#-Q*h#+y57w UH{4Sn2Xrojr>mdKI;Vst0Je!&5dZ)H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/1.png new file mode 100644 index 0000000000000000000000000000000000000000..b58dd056d39d5916aa2dcbc545553f312801e994 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FprVLn`JR4L0O!P~fqV+V|*D ze9c;U1)D=hEq<^i-{=Y!7VzreF;mpsviBRG!5Nv47i$;{m>3vLg61$96i<2ju1HIF zp09&TTgRDFxvzOse;BZ8_wgUt^>)>QteD-cQ;NBFcsg2aFM9LaVYbJzh-aG2It)vS z*RJqpzPbG5qw5S@ye3;i73=?VAG<5Fb@}aN{!69}X?H8{z5+Uq!PC{xWt~$(69BxB BO$Gn} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/10.png new file mode 100644 index 0000000000000000000000000000000000000000..1599e3396647788e3531771ef755e75e54d1fa3b GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr*6y6BaPY{P^|WUiH^X zo_~LTf0u9DXvsU>MtGBwnwpv$5Fb0w|2}Ce%WNCru&F8xViJ!pl(V&+y`J}&C)DYa z1jEhqKTIBdWjb^I$CV8Wxc~faw=Fyn^KkXjuImmW%x3Ysdmq&-I>eC1VAgws=Ku$D l%tGHF9v;~ZKX1ML&miMhq$d($a~$X#22WQ%mvv4FO#qumNdf=> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/11.png new file mode 100644 index 0000000000000000000000000000000000000000..a17ae21cd57103620fc424b5805cd32981e82153 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr*6y6C~^&+}~gSKk>(b z>-GOTr=~lF9RY$9K>Xw9!`L;`5+r&;1m3ue~Kky#gAj%%R*hw;F11IOhTiNd!6c(+pYvcA>Db-Z>NpQbdaSV%# zNM&!e)zlVyH3t_5mmAkq@9Q>)duLQUK9t!tMdP8k<8`GwjlbXWe4g|`#+7r;&MBAo z@GmJp_&9p8d<*x=@T@=l9GQMAg>|N1)u+zS{Mu;-}dInOEw PI+elG)z4*}Q$iB}>jzU) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/13.png new file mode 100644 index 0000000000000000000000000000000000000000..f4866160fb6d86fbd8ad62f9f21e9bc75dfd381d GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`CmSVdmsFPgg}o z{%m3tv{Wj3zVY?tDK*?INs bQ49=g^b5|Mo_LG{=oki1S3j3^P6mHd%EwM>3kBYZe%@X z@kLfhV~5D2N$t`P4xByGq0=a{H#+~$(FyI0d*T{?O3s%OD`AY`o56vXtstAeUkytA0>nqecSx{3;L5FOo4~tbw)hEF2HC!(>b>{1I)M&l@O1Ta JS?83{1OQW}Sd{<( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/16.png new file mode 100644 index 0000000000000000000000000000000000000000..8ece7aaf86016e8cef2bd89c6266f29161e9ecf9 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FprVLn`JR4L0O!P~fqV+V|*D ze9c;U1-nB>Eq<^$--%kTrZ7c9GRG+>qx!8ZLz-C47J?F)zPg@KL@FX{w$s0V;xQdM*Dlv4n} BO(g&T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/17.png new file mode 100644 index 0000000000000000000000000000000000000000..a2ae984508fe1e035a8d22d5d3220d7fdc0aa6b3 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`D?D8sLn`Jh4RYjSR^%~B%&%=1 zkH5(OBkE=BFAmL)_S(ZrdsS^yS6=lfWM?TnqcZu3fZ%M`BVIin9IKg*$MLLVCd@79+7i9j?HKK9&O$G{-a&o(#Nd9+>a{1 zrT?zIAm)AQ`#H0wxeY0Dti4qWqBt}+my7M$Y>=I&zM!;PZBx$#qxd+Lj;RsRck4ee Yo_n9Avsc?c2Iyu6Pgg&ebxsLQ0BB@a5dZ)H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/18.png new file mode 100644 index 0000000000000000000000000000000000000000..65e251c96d90f6cd7a0a74d0325521e2b1dcc7af GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar*6ye|&#`zn;zLVB`8H zua`1{c@oE-nZ$hZIngy^#tey>Kx}Wnr~9f<&L^LU&`Ast2|dpDB_+(_clR2HaGp$N zNU?u>x#K#wf&Js)!%cb(+KC5a9N`vK@E22WQ%mvv4FO#t>&O;rE@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/19.png new file mode 100644 index 0000000000000000000000000000000000000000..00fc966031ffa19f8bb210c16ce365efa4a6c1d0 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`%RF5iLn`Jh4R+*WR^+*om|xp2 z9)FSlN7T#Om&!{Nx~!^7;n^S|ILv7x2e_D?EH2^!_=+HQuSPS@=MM4-TqxMwN0Eyx8wQ6 zxlg}4Nb7joSA=t#F$wMbz9O9Ys*}&m=5n)&boZmVEL*brU6u(3KYLxj(ER)V2h0Zk W=`{yApNjxp%;4$j=d#Wzp$PzEKU9AJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/2.png new file mode 100644 index 0000000000000000000000000000000000000000..6e5de6d32bd66c0323e1672aec66472682828fc9 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr*6y|9pRczn;zL;KKJ$ zUM=DL0pdy6eGt7Iz2nKu38IETU?INl lv=eMTe7#>E<2hY|fx(Ee+#rEZ)e`6|22WQ%mvv4FO#s^MN=X0! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/20.png new file mode 100644 index 0000000000000000000000000000000000000000..e9b33c040e169b212c2e190f0a38422c365ae926 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr*6y6BaPY{P^|WUiH^X zo_~LTf0u9DXvsU>MtGBwnwpv$5Fb0w|2}Ce%WNCru&F8xViJ!pl(V&+y`J}&C)DYa z1jEhqKTIBdWjb^I$CV8Wxc~faw=Fyn^KkXjuImmW%x3Ysdmq&-I>eC1VAgws=Ku$D p%tGHFo(tjulT^*)cmI`VV0vHrVADIEi$E7Kc)I$ztaD0e0sw_kOBMhC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/21.png new file mode 100644 index 0000000000000000000000000000000000000000..aeb098658c415f22c8699aafa3d437ae0e8e6e45 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr*6ye|&#`zn;zLVB`8H zua`1{c@oE-nZ$hZIngy^#tey>Kx}Wnr~9f<&L^LU&`Ast2|dpDB_+(_clR2HaGp$N zNU?u>x#K#wf&Js)!%cb(+KC5a9gTe~DWM4fC!I?q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/22.png new file mode 100644 index 0000000000000000000000000000000000000000..741970de7bd6605145c5b31bc28e65575872cc41 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar*6ye|&#`zn;zLVB`8H zua`1{c@oE-nZ$hZIngy^#tey>Kx}Wnr~9f<&L^LU&`Ast2|dpDB_+(_clR2HaGp$N zNU?u>x#K#wf&Js)!%cb(+KC5a9|U34V*x@;fNDGZ*jelF{r5}E+Vl1Fg> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/23.png new file mode 100644 index 0000000000000000000000000000000000000000..af8aa76551fe829619617be46659e7e6c0edbb78 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar*6ye|&#`zrO7usQ+3W8flT>bbV#u&* z{>RKCuUTiz|F|;IQT)Kv4GHT$Tn##!tFLm##<$znNx5R>{Mn*IemA7swL`FUUO zT;L~d{GoCEjC+Sv`yVl>sj0aE@v-y#?~}IkcH10{OK3FYt4&Y1QS;X9oWw!R zer>6Ve|yd+?1^jmDLG$Ctb{Q}uW9F@aBtD04m`{WX33XbLL?6SIMJ1ulf#zK!np3j kG06$c^JntaEzopr0Jtkg(b z>-GOTr=~lF9RY$9K>Xw9!`L;`5+S3j3^P6S+ z|Cg*m3y1n`)31-c4Pm6U2j({%!;dSjVb2eq3vk$J?qV9r(_kKX_ZflmCjS4=Du0|I&*o+A);F>f?0^nq@O1TaS?83{1OO;lPuc(g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/29.png new file mode 100644 index 0000000000000000000000000000000000000000..1c50fe0919e55f80060ad5c97388d8557f6ddeb8 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar*6y|9pRczn;zL;KKJ$ zUM=DL0pdy6eGt7Iz2nKu38IETU?INs fRtcZC-u}0(c){c%; z)9!rl$N8cPN(xG6E=!yfdte`ZBK7jR>fkL7z4ol9m>zn?%-{abyWjrafOXO8!*1}h8W!D-uvn8GV%CaTzxXYxEr{f#a6tB5`=QUe&KI5)T TPTCKkYZ*LU{an^LB{Ts5Th3QB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/30.png new file mode 100644 index 0000000000000000000000000000000000000000..62d3096bdb1bbf8633711f837fc4f404d8e1571a GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr*6ye|&#`zn+bYL0EOx z%IpLC>;L~d{GoCEjC+Sv`yVl>sj0aE@v-y#?~}IkcH10{OK3FYt4&Y1QS;X9oWw!R zer>6Ve|yd+?1^jmDLG$Ctb{Q}uW9F@aBtD04m`{WX33XbLL?6SIMJ1ulf#zK!np3j qG06$c^Jntas>gqRmc9KyGlTew%6x}C#qK~iF?hQAxvX?INl g^bbsX=gG)0=|V}J!ly&OfevEuboFyt=akR{06D))9{>OV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/32.png new file mode 100644 index 0000000000000000000000000000000000000000..0c4a1f40aa752188e2db59d84f5cd8e1efed4c4c GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar*6y6C~^&+}~gSKk>(b z>-GOTr=~lF9RY$9K>Xw9!`L;`5+(b z>-GOTr=~lF9RY$9K>Xw9!`L;`5+sQ+3W8flT>bbV#u&* z{>RKCuUTiz|F|;IQT)Kv4GHT$Tn##!tMtGBwnwpv$5Fb0w|2}Ce%WNCru&F8xViJ!pl(V&+y`J}&C)DYa z1jEhqKTIBdWjb^I$CV8Wxc~faw=Fyn^KkXjuImmW%x3Ysdmq&-I>eC1VAgws=Ku$D j%tGHFo(tjuvs4*>-7TsWW0af*bPR*1tDnm{r-UW|_1Q;u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/36.png new file mode 100644 index 0000000000000000000000000000000000000000..bd0f23691de5151d63e6b6b865300bad9abc2739 GIT binary patch literal 229 zcmV^P)#^&Dn%v|d6xs@g1hYW~F5s})~)Q{G|rzI@)@_Yj>M6n|h{w28INbP}rdmpdV z;MIl_s^-z3<^Mq%teU;L~d{GoCEjC+Sv`yVl>sj0aE@v-y#?~}IkcH10{OK3FYt4&Y1QS;X9oWw!R zer>6Ve|yd+?1^jmDLG$Ctb{Q}uW9F@aBtD04m`{WX33XbLL?6SIMJ1ulf#zK!np3j qG06$c^JYr$*Zlo1AAU&{=pyyGRa+0ZO`ZpI6oaR$pUXO@geCxtbxKYE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/38.png new file mode 100644 index 0000000000000000000000000000000000000000..a88cc5b4c3d3425a66fb221dff58489341182c5e GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr*6y6C~^&+}~gSKk>(b z>-GOTr=~lF9RY$9K>Xw9!`L;`5+y{aQR9|Yx;W4kyI6t6)bLWwnX$-fe5`jirH_Y5z zqgQB`|K?{qUk67g$9B_gt4;sBmdKI;Vst0EstT%m4rY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/4.png new file mode 100644 index 0000000000000000000000000000000000000000..bd9d653f4ee662ece15296a849ac3846a933640f GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn`JR4L0O!P~fqV+W+WL ze2uQWfz6?#7C+dMZ*&CmdKI;Vst0O5E} Am;e9( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/40.png new file mode 100644 index 0000000000000000000000000000000000000000..d9cab30da910ad36d599fa4ef652186ab89c8103 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar*6ye|&#`zrO7usQ+3W8flT>bbV#u&* z{>RKCuUTiz|F|;IQT)Kv4GHT$Tn##!t8Lp`&aWEvX8x&8< zzh^PmeA^#qc9$g`9&5eVgs=W_SWqp}=6=KHg&BWO{bzb-9<=k|p64}tk{)*N5>zS9 zKVR~1V)!}Lx6zCF4=^cA&2G;!&TuQRQ_0@4$!+z$0&a)wTec_e7uogLsxd6MwfDcP Z{BQB(n&_*0_W<3@;OXk;vd$@?2>{G?TM7UG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/42.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/42.png new file mode 100644 index 0000000000000000000000000000000000000000..f19008d00c0d387840c483b6ad926079d93732f1 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar*6y6BaPY{P^|WUiH^X zo_~LTf0u9DXvsU>MtGBwnwpv$5Fb0w|2}Ce%WNCru&F8xViJ!pl(V&+y`J}&C)DYa z1jEhqKTIBdWjb^I$CV8Wxc~faw=Fyn^KkXjuImmW%x3Ysdmq&-I>eC1VAgws=Ku$D p%tGHFo(rM|av(d`E%D}IV3@^MsxSG7;Uv&e44$rjF6*2UngC(9O9ub| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/43.png new file mode 100644 index 0000000000000000000000000000000000000000..499f82a890fda4488f48c649f18aa7bc04fa1d48 GIT binary patch literal 221 zcmV<303!d1P)3!)Vq#z#l4a?G7(o>dNjR&^_f;eW9Nz@P#n@Ow(F#yfQVSudbGAQzN!F#1z`8B^s{yN%N7>dJm1E|l+}r7{3&q1)zkPM@8eY( zUNE#Eo=10<-vjMoN%_IMO0W@-%)Ovq4^#^=We(oi;GG>cw-L~~JrbElOqu`p7iRGR XNv>nc=#}Rn00000NkvXXu0mjfdGuTh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/44.png new file mode 100644 index 0000000000000000000000000000000000000000..799aa7bdf57f92cbd6f9b19f33fdf2ebfb9491c7 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar*6y6BaPY{P^|WUiH^X zo_~LTf0u9DXvsU>MtGBwnwpv$5Fb0w|2}Ce%WNCru&F8xViJ!pl(V&+y`J}&C)DYa z1jEhqKTIBdWjb^I$CV8Wxc~faw=Fyn^KkXjuImmW%x3Ysdmq&-I>eC1VAgws=Ku$D h%tGHF9v)o=1`+SP(*=4j<^Y|-;OXk;vd$@?2>?gkMdSbg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/45.png new file mode 100644 index 0000000000000000000000000000000000000000..ad9c4132dae448913159d3da9ceb7714a36f2808 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr*6ye|&#`zrO7usQ+3W8flT>bbV#u&* z{>RKCuUTiz|F|;IQT)Kv4GHT$Tn##!tKx}Wnr~9f<&L^LU&`Ast2|dpDB_+(_clR2HaGp$N zNU?u>x#K#wf&Js)!%cb(+KC5a90(cP+Kx6NhN#4N#L&U3SzeV~5ZgwM-jzc0&Zl&a^N!g^@x4!iuj{fy^3q7u$;objh} z0k7Ef_iJ`?vN6qx+@VQWBXbNRJ~&1^|$d0DpP9e0`Z@qGM*Xa9K3SoG6$O%4Zn Q0G-O<>FVdQ&MBb@08I!~8vp%8-8@?Ep@&huq678$c3yWF9IAp)OOyP%aPXiB1W&^2nPeh1&?C317`xaajRy_rG`f+iuIryS!zopr0E~f9 A3IG5A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/7.png new file mode 100644 index 0000000000000000000000000000000000000000..379b2aae8b6185b86157d944dc41b5c64e102087 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr*6y|9pRczn;zL;KKJ$ zUM=DL0pdy6eGt7Iz2nKu38IETU?INl l^bbsX*U372{oQ~346`nmKb#xHx((sQ+3W8flT>bbV#u&* z{>RKCuUTiz|F|;IQT)Kv4GHT$Tn##!tFVdQ&MBb@0IEn!7ytkO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/9.png new file mode 100644 index 0000000000000000000000000000000000000000..3778346164ddef149bd2e4b1f06e13060725f3ae GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar*6ye|&#`zn;zLVB`8H zua`1{c@oE-nZ$hZIngy^#tey>Kx}Wnr~9f<&L^LU&`Ast2|dpDB_+(_clR2HaGp$N zNU?u>x#K#wf&Js)!%cb(+KC5a9zopr0AmkGKmY&$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/glass_3.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/glass_3.properties new file mode 100644 index 00000000..ce76c4e4 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/glass_3.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_glass +metadata=3 +method=ctm +faces=all +tiles=0-46 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/0.png new file mode 100644 index 0000000000000000000000000000000000000000..0c1ae62e95223129e9c921ac493b0ba49713429d GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`CY~;iAr*6y|NP(n)1GPMpUXO@ GgeCxw%p*ns literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/1.png new file mode 100644 index 0000000000000000000000000000000000000000..8e6b7f6c856697e822a23aa215f8e6074bbb4c2f GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hMq2tAr*6y|NP(n)1G&y69y_6<-ogQu&X%Q~loCIBCw BA#DHv literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/10.png new file mode 100644 index 0000000000000000000000000000000000000000..c196168ab8627ce367881c42efb7577feca85289 GIT binary patch literal 87 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`a-J@ZAr*6y6BaQ1`LFwRzR=&r k2_ijBj?8{>2|xH5P8?-j)6Au10947~>FVdQ&MBb@0GAaQlK=n! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/11.png new file mode 100644 index 0000000000000000000000000000000000000000..33424530f8cf29841cb4583a27083d386361cbe3 GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`GM+AuAr*6y6C_v{Cy4NffB3)s iN`2ASd3z3gkY_k;&bmfw`}`X~bqt=aelF{r5}E*JQW;PdltC5)i^0GDx?lfaxtg9L&A@QtDz8amg0~0I6b4UM KKbLh*2~7a3tR?6G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/17.png new file mode 100644 index 0000000000000000000000000000000000000000..e0171c2061c0c4d38053ceb1e6c83a511695e480 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`mYyz-Ar*6yfBfJ6)1G)ChfAp*WD_5UCVaC9)MUL<8{@YUy0S#gB MboFyt=akR{0Gs+J$^ZZW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/18.png new file mode 100644 index 0000000000000000000000000000000000000000..7be1ecbe5910162874e5bcdd6008cbb616f9420f GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8lEnWAr*6yfBfJ6)1GbP0l+XkK DBY`26 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/2.png new file mode 100644 index 0000000000000000000000000000000000000000..72a38b1c0ba13eb4f5e007c505c73923ba60e39f GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>Ygr+Ar*6y|NP(n)1GGAr*6y6BaQ1`LFwRzR=&r m2_ijAtC+ktJvqtE^PjOZgJXXeL+W;*S_V&7KbLh*2~7attr}wh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/21.png new file mode 100644 index 0000000000000000000000000000000000000000..7e80b63bb8c2d8dc30f070852b278dc3dfc6aaa2 GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ik>cxAr*6yfBfJ6)1Gycp8} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/23.png new file mode 100644 index 0000000000000000000000000000000000000000..288ade27c0370ca14a962e4f5b85de4e6a23be69 GIT binary patch literal 84 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(w;7kAr*6yfBfJ6)BdoA1nc4i ii-!OEmuj3k$MEI`+oT8c@AmX|T5J%gvKpUXO@geCw#lpBEn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/26.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/26.png new file mode 100644 index 0000000000000000000000000000000000000000..55b8c22f96342710343c2b20d87e4ada218240c6 GIT binary patch literal 75 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`LY^*;Ar*6y6C_v{Cy4YgaWF8j X2rw{)nnzs#$})Jm`njxgN@xNA_kj-( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/27.png new file mode 100644 index 0000000000000000000000000000000000000000..a432db0b348457755e8020eda868851ac4f526c2 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8lEnWAr*6y6BaQ1`LFwRzR+JD tb$x?B>5ERVu(7oTGQ06gm^OF;HJJTnJ@GNY@e)uEgQu&X%Q~loCIEcQ8yNrq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/28.png new file mode 100644 index 0000000000000000000000000000000000000000..7b93930abbb738b4bd23cd7925664127589fc17e GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`7M?DSAr*7pUf#&dpuod?kYC6< zCAKWJlVfHZr_b#7wR0~<9`czg^-eGAr*6y|NP(n)1GHXW|sr1VeoYIb6Mw<&;$U>`4tHO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/34.png new file mode 100644 index 0000000000000000000000000000000000000000..e33a6cd05b15bb07ea94bc5b01ac9a5752c76fea GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ql2i3Ar*6yfBfJ6)BdoA1nc62 gCC!t?CH^rp7+q%*Km2p@eV{4^Pgg&ebxsLQ07b_bQUCw| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/35.png new file mode 100644 index 0000000000000000000000000000000000000000..25d6fca618eedada180c3e6b44c823a2728f97e7 GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`GM+AuAr*6y6BaQ1`LFwRzR=&r i2_ijAtC+ktt1vWOWm7lHTCp3bj=|H_&t;ucLK6U88yD#S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/36.png new file mode 100644 index 0000000000000000000000000000000000000000..414123fc971c17f0df75ac87549ca32d7b79c414 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`mYyz-Ar*6yfBfJ6)1G}$WAJqKb6Mw<&;$TE{TA&2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/39.png new file mode 100644 index 0000000000000000000000000000000000000000..28378c94cbfd96ff82fb60133d887fb956df5460 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MxHK?Ar*6y6BaQ1`LFwRzR+JD zb$x?B>5ERVu(7oTGQ06gm@+U){Qp1gSN*G3#+!H<7`k6^$Co6(SOe6};OXk;vd$@? F2>|SqAtnF- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/4.png new file mode 100644 index 0000000000000000000000000000000000000000..ead6349bf674e2be524eb1403b59df9b52337e69 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`2A(dCAr*6y|NP(n)1GGAr*6yfBfJ6)BdoA1nc4i n35H|;_b>f7f7h>`9A<{b&72ZbP0l+XkK95ERVu(7oTGQ06gm@;HBER7Um_&$;2b{OZfV?bRDp00i_>zopr0I{bVmjD0& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/42.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/42.png new file mode 100644 index 0000000000000000000000000000000000000000..4d35de4e85b4e151aa10198b39077f0fafbe44c4 GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`DxNNmAr*6y6BaQ1`LFwRzR=&r r2_ijASxm?N?_c_F{;pp=Im`^=8#vZV%RGw)s%P+Y^>bP0l+XkKgrgmD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/43.png new file mode 100644 index 0000000000000000000000000000000000000000..122fed8242af464157aed7bb7df91d3283f11a23 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``kpS1Ar*6yfBfJ6)1GbP0l+XkK5ug^p literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/45.png new file mode 100644 index 0000000000000000000000000000000000000000..18a3828a9fbdf288177406d3817e26a780376a41 GIT binary patch literal 80 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`;+`&!Ar*6yfBfJ6)BdoA1nc4i c5d#AT1|1jX`o#fR%s?d!p00i_>zopr0KHHX*8l(j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/46.png new file mode 100644 index 0000000000000000000000000000000000000000..65e2cb1f4dc32febe54847549cb2d9f901340a78 GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`DxNNmAr*6yfBfJ6)1GdltC7Q$e;hZu4QF*m5mSW8LZ~;x^a9nWds_+;OXk; Jvd$@?2>@Q>BlZ9Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/7.png new file mode 100644 index 0000000000000000000000000000000000000000..405a4872cece2c61afb37ab2db122b03e6429a10 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`YMw5RAr*6y|NP(n)1GGcdJt9dOOr(*e}M;OXk;vd$@?2>|*-A6)GAr*6yfBfJ6)BdoA1nc4i ni-!OEm!3FxPF>&N4?Dx>Y)-8iay{FCY8gCT{an^LB{Ts55vLog literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/9.png new file mode 100644 index 0000000000000000000000000000000000000000..abc40e192eacfa322b6b8256d907a53b3377558c GIT binary patch literal 88 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%_o-U3d6?2k*{NMi5o_Xej|M{Am kzVObcVKpb`(z_iBNzopr0P*V@sQ>@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/glass_4.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/glass_4.properties new file mode 100644 index 00000000..c61da1be --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/glass_4.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_glass +metadata=4 +method=ctm +faces=all +tiles=0-46 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/0.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd810138004f3034b085aa4c4de491e452292a7 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3q4&NLn`JZZ!zTf{r~A{akioZ zulv7CNbrR0`Dbk4kRc&0?+~W0pzv|N;IW4fA0}E9C5kE=nt69;{rUgvH!~Or`%H*9 z%L4@d@%J58s2;nyqoJYUNWI#jQy-cGnb~?7pDbZzWbFK}p*KP7s=_S+Kfk&iQEF^# zY;D}-+YIae{$1=2?QeRf)*Tyd&XJBLi1WM^VK?l#zzc0y<(P{o~OZFoNpi>zIcBj0yExD4ddxrlfmL1l*>w*RW`;5Em_PZLGQ*92-=NM8b(?RS zmkRB@JM|R*j%6}V*{c{2l&f8J=$XEQl_AzV;+(#`xR037S5xN$K-(BRUHx3vIVCg! E0EB8almGw# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/11.png new file mode 100644 index 0000000000000000000000000000000000000000..ec388cd88d59590863ee280e5ac57a590c74656e GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`@t!V@Ar*7pp4-UTU?Adpakk0B z@P9_k77fJ~8;T>MJggi&CW|N?R9Yu+&}jMoJ?yd9{~q#r9K)EzCsSywJMl!oTww;C z1H1H}RRw)sRqW)ooNFVdQ&MBb@0BfyK2LJ#7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/13.png new file mode 100644 index 0000000000000000000000000000000000000000..b3a29669e0d0087f44366e358597b80caaaefa91 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr*6yw-|E#{{Qr}I9t(y z*ZtomBzQvh{4+Li$dHhhcL-BgQ201s@YutL4-+kl5=E5_&Ahv_{`~*-n;8taeI`Vl zK!62+U%biyuge_o_*aN)@VpkPT3#hTNv9)oRZ!liw9P8o) ckp~P6dFv!@M!&V53N(|!)78&qol`;+0J~=^+5i9m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/15.png new file mode 100644 index 0000000000000000000000000000000000000000..500208c6f80dbf1ecc1a2cdf6d858821950602f8 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar*6yw-|E#{{Qr}I9t(y z*ZtomBzQvh{4+Li$dHhhcL-BgQ201s@YutL4-+kl5=E5_&Ahv_{`~*-n;8rOr8Y1! zGIBPpQ#~c1=EW;%n&2VL;O&tjdEn$pe*ab=eeT@J4-XG>yKUl4NNA{d`275P9tNc^ WDqEE<)LjBPg2B_(&t;ucLK6U-3qHO8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/16.png new file mode 100644 index 0000000000000000000000000000000000000000..55d71201cf52b6cdbd7b88297c2da9f6a190c519 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`D?MEtLn`JZZ!zTf{r~A{aW)`m z<1XK3Xe7YM6SC)@v4MfXo_`hnjW176*LTTwVH1Csll+ zKY#9A;fG8S#~POA*EoO-u(nn|+|I8rAt?a_OI=O>)&Kq5D0AKT&!3-j85w?rSZzzL SQ#S`Xn!(f6&t;ucLK6VPnpQ>t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/17.png new file mode 100644 index 0000000000000000000000000000000000000000..d367925522f7c574066986af56d7d6a821166d27 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vpiiKLn`LHoxG9jkb#J+e^USx z<7N)VaQ5SM4e<}yf2{o5*T=VXwnB>MLs3oHM%CO&#FX8bg K=d#Wzp$P#0)KWbF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/18.png new file mode 100644 index 0000000000000000000000000000000000000000..54608ca23498fa95a7b8883941465cb8e4c31734 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr*7pPB!Ffb`WsAe?y1c zX&Wa;X7G|P43>@TCjxETQ@J*Bvuuk@ROvXngrn)H+Jtl0|Jw)uQNR8xZ55Zp_3ch< zUw0ZdSn!Fgnk9SZ($}><-isonPj5QIcf3%c<1%-|gpqp8s!0UxfNL5qTpg(|GyUw(G3W%>0bs~C8a^H(ge zjump4p}uBS7`u1dM)ULKN79mSZ@c=?z`x@M%Z8nnlUa8Qd_4JX>K|5n-4o7MQ;zRw zkG^U&*San&<6(7A)U0EIj}J54_#_c6@G&zoZjIS&^Tj$xl=^{=WAJqKb6Mw<&;$U@ C+fNt( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/2.png new file mode 100644 index 0000000000000000000000000000000000000000..0eec0d5a2e0afebed1d010665bd1108c7b41f5c5 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar*6yw-|E#{{Qr}I9t(y z*ZtomBzQvh{4+Li$dHhhcL-BgQ201s@YutL4-+kl5=E5_&Ahv_{`~*-n>liw9P8o+ zGlqFn;_LSu|M2B2@1jXY>gxaN%gX%NKtK(M+qlcO8P@&%+vw=v(3FrSBrxH}`E%z^ qet3A8+YKnq=H_K|?EL)uk_;IqjgDF+gw6oEi^0>?&t;ucLK6TBe@OoT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/20.png new file mode 100644 index 0000000000000000000000000000000000000000..379a83775df827639f8477d7fadc5c9b581dec11 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar*6yQxupbR#f~=Pe@3p z`1?_gS=f@z00?4sZ0`N|`aM5S&y$R4Vpo6s|N5Q1=&c;<;s&+`LCa*D+S=w7OU|A= z`G5Z0xsw|k8yP3fOpt7jIB@RV$qx??bGxwt!LsY}?+rOPJpQO(e9FVbB=o=j-=A{~ Z3^OOIx&01$qziNegQu&X%Q~loCIEg5MDPFr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/21.png new file mode 100644 index 0000000000000000000000000000000000000000..95698994e881f1777da37eec9733cdd5d34a8fc7 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr*7pUf#%g*g&M^VSHYT zL&8+K1I!f+{u3CDRz3f~aBQn%FN;3Q<3~$5*ro?5%-#R*-74e9A3_8f6XMjI8yD7V zIGoY$?GRyK|18yLz4FC5z4v}UDmbI9SQ2GjwfnFCS9XRu*;k|3Km2vl&6d^7efFHG eLBQ(ncXRoUMCG&1c6=ZQGI+ZBxvX$_yTu!+CRN&fTeH#4*F85cP@xkaY?fwGPc m4v*|tPU~w5G~oKc!0@k9dZI%8nsq?)89ZJ6T-G@yGywp9R4dI$lB$lfwG3eaRd2ytx!>fj!A<5&c zf@pAUk(#3{A3mH6J{an^L HB{Ts5o@zO7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/24.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/24.png new file mode 100644 index 0000000000000000000000000000000000000000..4b73d1579b38f6dd866949a1ea6989f8f35c1174 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`i#=T&Ln`LHoovW;$UvlRe~M;f zLu5gHtr2b?wy?Ozyd8`)312-wBxG)+Wlsl^e;EbgXbetdPG|J&Vb{@$It)8EjI zAtsj7NaOl$mIt@lB$Lm`&3W|7D<+@OQex}1n}_%18XQx5pvYjc%lVsFdcD-W$<+Mb6Mw<&;$UpKvf+8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/25.png new file mode 100644 index 0000000000000000000000000000000000000000..c1c3831f7f454964c7861584ae71f8225d75dbf3 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`*`6+rAr*6yw-|E#{{Qr}I2#bO zahGp1G@8IMV_(frr)h3G7X(~hRnSr5Mad|-P_VM+EcmJNBvGnp8AE+-s%Xy~<5 z@3sgZ{{lt^*Fe>+znz}Q-}%|-&-{IY%7LAKA{Vkmy#7#UXvA=x)9~FK$5oP>DzuI2 QfHpIDy85}Sb4q9e0LRlk9smFU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/28.png new file mode 100644 index 0000000000000000000000000000000000000000..eb280c73e0ef331aa11e89f3d97a081a26d75e2c GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar*6yw-|E#{{Qr}I2#bO zahGp1G!kIs3EA_{*ucPG&%cWP#+Rq3>$_yTu!+CRN&fTeH#4*F85cP@xkaY?fwGPc z4v*}afq>iR!->{Vm)(zEzLw_LYVdyo_Y94THdzN27&T1V!cgA0Wd&Pgn}MN$f)QIJ fn?gEI5d*{gHF^;$LBG0zj$!b0^>bP0l+XkKt}8$W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/29.png new file mode 100644 index 0000000000000000000000000000000000000000..85c028c258401923175713e52f0572a28cf0818f GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``JOJ0Ar*6yw-|E#{{Qr}I9t(y z*ZtomBzQvh{4+Li$dHhhcL-BgQ201s@YutL4-+kl5=E5_&Ahv_{`~*-n>liw9P8o+ zvxXH*y7??DfBxURx!A}61STdkSX-+fZs*sRIBC|<$T&&3{@U+Y?`3 zub@@Q#o_TMJ^gvgj}H%7l|g1H7ada&{qyJNTt9srrI+DTD)z4*}Q$iB} D$<|Ew literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/30.png new file mode 100644 index 0000000000000000000000000000000000000000..0941d68901f481665263cc555e40f6da5bd3d5e6 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr*6yw-|E#{{Qr}I2#bO zahGp1G@8IMV_(frr)h3G7liw9P8o+ zGlqFn;_LSu|M2B2@1jXYMhQs?2?;w2(xsJmX3l>3^>{T86O#~2v7#OW!)H59AtT{$ R^+2l`JYD@<);T3K0RT!CJLv!b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/32.png new file mode 100644 index 0000000000000000000000000000000000000000..7d3e9221fa2c039932412317edd737f22538f420 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`7M?DSAr*7po>3HHP~c!Vc=*r+ zlVAU@OJ?$M{y!jbvyOf3R{bSHGtY*YGPtEK$l4*V$(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/33.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d213c656be8e7d3af834ddbce6906d366d6eae GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr*6y6C_v{Cx`^F8c40E z_?w=PkWlgWquk-k*Ucq7O&dBJ8yg=Unw#4bUth0qn$>5${k>!XfeAnSr{%G+u`zTk W5U~0XS^pDg9D}E;pUXO@geCxsStzam literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/34.png new file mode 100644 index 0000000000000000000000000000000000000000..63f2a97ce0cbf1b5b706a407da1da4f59468ed43 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`iJmTwAr*6yw-|E#{{Qr}I2#bO zahGp1G@8IMV_(frr)h3G75+PYi_hCbPO$l>T~`$(yau?ATO zCYU!&+H!y?*`qt_PyMf7Y=J8$PM-YV-r8FI5UcpRoa8^hels^WG_W{M=iu=8lb-%O z<;RDItjf$luz1UgWB=Fhx1aF1s%^ggeq#m(r8unyk#{Vcf$n4QboFyt=akR{02HuK A(EtDd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/38.png new file mode 100644 index 0000000000000000000000000000000000000000..b531b2f598c3703abae4e24a5663371558a4afd1 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`iJmTwAr*7po>Sy%FpzL~_&xgA zB<({7vJ9&D_}^Ieux;dQN@bh4@k2F>YtQdr&FqoW{yObi7T)kTBI3K}J(p|KvU*q- zFi1RiJSS3c?sf2+IpN7ViaAUQrB`3gJhc3;gnr&X8OgV5B{n8N%NRUe{an^LB{Ts5 Di6c4% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/39.png new file mode 100644 index 0000000000000000000000000000000000000000..4b893739a02eb4cf672e1ccfd7572afa1bf93ff9 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr*7pPF~1$*g(YfymqV5 z))|foWs5f5-^hQj+{dqH*C7Qp;l!4%kfpCnFM~GwiTk zC-l4_bP0l+XkKyW2^X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/4.png new file mode 100644 index 0000000000000000000000000000000000000000..4a679fc617424f9befd4af022df11e4d4ff610de GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^F3W0Ln`JZZ!zTf{r~A{akioZ zulv7CNbrR0`Dbk4kRc&0?+~W0pzv|N;IW4fA0}E9C5kE=nt69;{rUgvH!~P;`%H*9 z%L4@d@%J58s2;odgF#qzmOHOR2wT7;u?L!gQ6Z1*y|@lDTUh@5zj<@9QcS_ab7pQ4 zx764+Y%Vsc`SGD?Vj~c|{Cd2ahlxo@rP|TK;nDx|^Y2SCRLwPOy5Dm<73fq3Pgg&e IbxsLQ0Nm+N+5i9m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/40.png new file mode 100644 index 0000000000000000000000000000000000000000..3edbe93162c15eef83d8387d1920e7753a94769c GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar*7pPB!E^6X-LKc3UMag(a$u~TzC pKlvlTU@7Nkc5dg3e%K+jVsVW44$rjF6*2Ung9s0O;G>< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/41.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/41.png new file mode 100644 index 0000000000000000000000000000000000000000..da9eb97bb83abe1d18a5acf4f401d53e865004a9 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar*7pPTt7XY#`$5-y~o( zbE&|KR}Ws4|2SCZew^>9ufV1wjxI8nG_%YrqYv)BZya+jl;cuJE)z#^|1<`MxcPo( zqg^~top+!6Oqb~d1H-wWDsTTe9FcxN@|mXdZg6$eio00IxsV?Ta=wq|B%uU9{G T^nu$2p#2P$_yTu!+CRN&fTeH#4*F85cP@xkaY?fwGPc z4v*}af#9UsVTLmdT@4KlN9xtQcqL5}Jfs=CJyIkOoIJ_z-wLG9ojdvA;bCsKO}q&S h4HXZcpMTH8uxY<~?gl-VVxW5%JYD@<);T3K0RU#fL%;w4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/44.png new file mode 100644 index 0000000000000000000000000000000000000000..5960b796a4ebf98eb5d91b6191a3e0077a0efdfc GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Hl8kyAr*6yQxupbR#f~=Pe@3p z`1?_gS=f@z00?4sZ0`N|`aM5S&y$R4Vpo6s|N5Q1=&c;<;slWdW`^Dr-fJ4KizWcg OVeoYIb6Mw<&;$T~oF;<+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/45.png new file mode 100644 index 0000000000000000000000000000000000000000..59d89614d99b1d34692adfad65b04c6c9d26ddb7 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`R-P`7Ar*6yw-|E#{{Qr}I2#bO zahGp1G@8IMV_(frr)h3G7@O1TaS?83{1OW4IO#J`= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/5.png new file mode 100644 index 0000000000000000000000000000000000000000..13733e04cf7bfebb05c200b6e623f0534ac1a599 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Gd*1#Ln`JZZ!zTf{r~A{akioZ zulv7CNbrR0`Dbk4kRc&0?+~W0pzv|N;IW4fA0}E9C5kE=nt69;{rUgvH!~OnN^M|d zWaMmGr+P|2&5KvkG{Hlf!P`S;!;(M09^1ApU!N~9)yUHF=fjl~IvX1sA0C>U+p}Sd zFHb`H^OPSS9+ zKY#9A;fG8S#}vdiY%Vsc`SGD?Vj~c6S|(3mVqsDF_y5n&xr_{4<(5{G*&*gYw=#IT L`njxgN@xNA*Y{EW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/7.png new file mode 100644 index 0000000000000000000000000000000000000000..ab6211e3f99207abe8880c84d2fe68f4c70ec3e5 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr*6yw-|E#{{Qr}I9t(y z*ZtomBzQvh{4+Li$dHhhcL-BgQ201s@YutL4-+kl5=E5_&Ahv_{`~*-n>liw9P8o+ zGlqFn;_LSu|M2B2@1jXY>gxaN%gX%NKtK(M+qlcO8BUtC?dDBONxPbggC`CE!Ixi; sZP^$ZIh%G0$Z~La{Q3X$vo$kA)m=kR@vT$Efi7e4boFyt=akR{0Lw>8Z2$lO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/8.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b2f4ce934a0988239f47a1d94ae71ea0bfcb58 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr*7pPPXN0b`Ws8e?y0x z`{pI)iUwN;zXyy(A?FikI=yK*V5aTEF)8ViN7mL&AHLrA|NLa0+_F^+U!2w7ED5^m ze6XI;AuEboQReNA9Ttp}W?f_WWMlO7xtjW({WFW@B4S^(``x?0sq(6&zotIpicdB| k$+_0^g_Cnne|pGX{7$_yTu!+CRN&fTeH#4*F85cP@xkaY?fwGPc z4v*|tPU~w5bg(|qF~@M;zI~2G^AeI098!3S7=)KfGBY$wXrDUHTaX8|lfl!~&t;uc GLK6V9$TqbA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/glass_5.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/glass_5.properties new file mode 100644 index 00000000..4f1e543b --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/glass_5.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_glass +metadata=5 +method=ctm +faces=all +tiles=0-46 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/0.png new file mode 100644 index 0000000000000000000000000000000000000000..001f6c9036d0dc4374525467cc12d1d644111622 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3q4&NLn`JZ|M?FD@!`*nCNSTK zlSxYWQJH$Ko{f!zH~BI1iC27IcK=OpDZH^|vZREhq-5vDpa19W_|LAtKLHGyIE7Zv zYy^Ufse(?rhUbp4f;A|u;jx!6O}HT8;1^|a;r%!HqpbhG9}&#$*x$+!qbtk|1iSsX z9v?id|6rNWrkw_NdJZlu5LX6?D;FJ85dE^=<|qRL&lyjHB!-WvK*ut8y85}Sb4q9e E0K!^S0{{R3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/1.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe0ffe0a3f12af37c0bd3109d0ffbdd7bf6f1f1 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vproLLn`JZ|M?FD@!`*nCNSTK zlSxYWQJH$Ko{f!zH~BI1iC27IcK=OpDZH^|vZREhq-5vDpa19W_|LAtKLHGyIE7Zv zYy^Ufse(?rhUbp4&*0FOG)?#*&EVhp#!AygU4@O!!^o}h;D6gf7j=z#ZpIx^YBSyf z4QQC{b>i8f0%NxJL$N(PK+tnSvN`0!{!b#z48=9>#%^t1r-9C7@O1TaS?83{1OTu1 BPT&9l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/10.png new file mode 100644 index 0000000000000000000000000000000000000000..45db0daefe9d45f80dc370148861ce18b5e3f58f GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`sh%#5Ar*6yQxpXM>@j+7-*fic zBLQaNm23wXcKdNXK6qMRLgM7bKlT21{x?sLHvobO&zan&yQW0iaJA_xSUbwRDF1!_ zfJ2(sm+b;S{3Ar=W+!fw2a5TZ<=I?#|80N$Q%yF8h^_Jl=O*{H11)6mboFyt=akR{ E04C5o761SM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/11.png new file mode 100644 index 0000000000000000000000000000000000000000..2377a5d04a373f36ac3b51915c23ff5e88fb6a29 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ah@)YAr*6y6C_v{Cx{q;z`s34 z&+VCkV7DKavZfUOm)(EU6M&$J^Ur|&n?J6O(R}KJv#k%)c=%d( tOGrvcNX)nqC!^%0Y}WiMd|na*L-Y-~Q`3UCZvfiF;OXk;vd$@?2>_9eFpK~I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/12.png new file mode 100644 index 0000000000000000000000000000000000000000..565d812d7378d37958caa62ca033b1eeb14d2684 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFUg1Ln`JZ|M?FD@!`*nCNSTK zlSxYWQJH$Ko{f!zH~BI1iC27IcK=OpDZH^|vZREhq-5vDpa19W_|LAtKLHGyIE7Zv zYy^Ufse(?rhUbp4f;A|u;jx!6O}HT8;1^|a;r%!HqpbhG9}&#$*x$+!qbtk|1iSsX z9v?id|6rNWrkw_NdJZlu5LX6?3*YW`cF8=F7V!U6Fb~7YU0$V`Z2Hwe_cD08`njxg HN@xNAjXK-jsnkIBeICw@i?0)cnp2a4f#3Yc~>z;`=6+c-IH`bX?;!RAd fF6_|hHDF*6Jz=HnW}{FDbPbP0l+XkKEIc)8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/15.png new file mode 100644 index 0000000000000000000000000000000000000000..fcecd41f985cdfeb9c680e482c5465642077bfa7 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr*6y|NIAn`0(dO6PRzr z$s{HGs7yUq&&I~VoBWvh#4ElpyZ@%Q6yDe}SyDn$QnGX7&;Rpw{AbtSp8y6;oI&TSbPI#0tDnm{r-UW|wr)x7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/16.png new file mode 100644 index 0000000000000000000000000000000000000000..ceae2f494912ba755dd35a8531f68365cb8caac0 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3q4&NLn`JZ|M?FD@!`*n4lwNY z<5Fgp`|$bHoc{)9x4WHreD<$9r@DeuI^nu!qD{q5R%YchE@p32*xcOQ7V-Srum0}; z!PEK@ATT4L=}1;u0uYo$wghy)Q7>W;PE=jY##6`qKy%`iCp8Q1zqRk;{`bC9*~;-} zG{=FfMhA23fkxg5aWWHcn{8+z@-8U_q~GP7#FD0eQmdK II;Vst03~Qtg#Z8m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/17.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c8912817fb5f048156f466a50198998be5eb82 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`D?D8sLn`JZ|M?FD@!`*n4lwNY z<5Fgp`|$bHoc{)9x4WHreD<$9r@DeuI^nu!qD{q5R%YchE@p32*xcOQ7V-Srum0}; z!PEK@ATT4L=}1;u0uYo$x@_v+*u?xd@Bd5=?Zfa8fA$zXw=epoCMNTu{CEGO zrvKHCI?RsTcVbvKt+SDFqG7@^p-npt?(`g7SRk&<3a8fA$zXw=epoCMNTu{CEGO zrvKHCI?RsTcVbvKt+SDFqG7@^p-npt?(`g7SRk&<3s>OBqy_vx70kmh@t(uy UM1urxptBh~UHx3vIVCg!01*RPF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/2.png new file mode 100644 index 0000000000000000000000000000000000000000..f2da235e8ded21b6b1d11694dc64154bc90aede3 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>z@qLn`JZ|M?FD@!`*nCNSTK zlSxYWQJH$Ko{f!zH~BI1iC27IcK=OpDZH^|vZREhq-5vDpa19W_|LAtKLHGyIE7Zv zYy^Ufse%`?+z*~$_%P+fy2(yKk1Q^{|2DsoQB(EbePMS4`2!96TNz?>h0lCzo*sX| yS2d+Laff8H^Fuv1HXv|&(&MQ0BEGVVk>T$T=e-jb_;dnY$l&Sf=d#Wzp$PyOCR7Cg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/20.png new file mode 100644 index 0000000000000000000000000000000000000000..9a081b58c42f6efccb2a32f76f77e5e30c2f5cae GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr*6yQxpXM>@j+7-*fic zBLQaNm23wXcKdNXK6qMRLgM7bKlT21{x?sLHvobO&zan&yQW0iaJA_tv@Fdnn=3L& z=y+q@_WwLQ9-1Hj&)e~T$JE74_1ug*qSR)*W!K-|Fx%_IvqJ^OZ0(0)dw77rCr6)8 jaH-&I$G_VCh71fPdvq(D-yS{&bPj{3tDnm{r-UW|&(cMU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/21.png new file mode 100644 index 0000000000000000000000000000000000000000..3d322cd8841c371eee8dfb54b6a275ce4c2f0090 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`(zH9@r;_R^+tZtXpvZ kt$n0kL*~2q$}UERpxwF_h96k6fKFoYboFyt=akR{0O^rQy8r+H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/22.png new file mode 100644 index 0000000000000000000000000000000000000000..39de62bc63b6bb06e6da364c1d69d12bc2779b8e GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`$(}BbAr*6y|NIAn`0(dO2N-ty zaVay)efWH8&VK{5+uhDQKKs|5Q(eI+op9YV(Wc@jE3@($7qho1Y;JCDi+FzRSAX~a z;Awpc5SWqBbR;V+0SHPWT{d;QAJmX|$G{-=OJ@7Ili#;{an^LB{Ts59hW%^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/23.png new file mode 100644 index 0000000000000000000000000000000000000000..4a0804d50a3ea8a768dcc07cba44dc3649fbcc7b GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr*6y|NIAn`0(dO2N-ty zaVax%HoUxkb*D@j+7uVXri z`GMxg|MM(1@gycCG(0)bJU!k(=0&;kO#!uS;_W9caWFIN30HhMRYCX+&`t(VS3j3^ HP6RQzN;+*oHmi8nE+y0Am1*MNcHScT%xhYv%OfmSnk My85}Sb4q9e0J{7`Q~&?~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/26.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/26.png new file mode 100644 index 0000000000000000000000000000000000000000..55b8c22f96342710343c2b20d87e4ada218240c6 GIT binary patch literal 75 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`LY^*;Ar*6y6C_v{Cy4YgaWF8j X2rw{)nnzs#$})Jm`njxgN@xNA_kj-( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/27.png new file mode 100644 index 0000000000000000000000000000000000000000..498b3110791cb6ee6e304185b0d4ef3b4d586d77 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar*6yQxpXM>@j+7-*fic zBLQaNm23wXcKdNXK6qMRLgM7bKlT21{x?sLHvobO&zan&yQW0;F!Fub{a4+ZCn4cV zgJSN1#=7nQQ=}i{D}I>2LCePMaL#fKRk;`Czwht=B*M(FK~3?p@RqV{pp^`su6{1- HoD!M9~;Dy3bl#+$Y-%7Vb9Rl?8MXgQu&X%Q~loCIGCjLuUX0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/29.png new file mode 100644 index 0000000000000000000000000000000000000000..499f2537d5624acf412716a9e4f26cfbfed13e74 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr*6y|NIAn`0(dO6PRzr z$s{HGs7yUq&&I~VoBWvh#4ElpyZ@%Q6yDe}SyDn$QnGX7&;Rpw{AbtSp8y6;oI|iWFT?qdF3W?gnG!&7 zqcli@Kdz3^eCmX=tq;?9_*!>MNP;9L8ndljQ2$hujX_b_)8K-v_B^0l89ZJ6T-G@y GGywo*R8kxO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/30.png new file mode 100644 index 0000000000000000000000000000000000000000..5f00fff608e6db1c4bdabfe58e851cad9538797d GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr*6y|NIAn`0(dO2N-ty zaVax%HoUxkb*D6k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/31.png new file mode 100644 index 0000000000000000000000000000000000000000..32cd3238cee9f972b91b70aaf0618af6ee776e39 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar*6y|NIAn`0(dO6PRzr z$s{HGs7yUq&&I~VoBWvh#4ElpyZ@%Q6yDe}SyDn$QnGX7&;Rpw{AbtSp8y6;oIx$;c`wQb_zopr08NZ0Jpcdz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/33.png new file mode 100644 index 0000000000000000000000000000000000000000..04f77e19db02c51063233775f0223aabde9d1604 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr*6y6C_v{Cx{q;z@I%v z&;Os-F8()p^?c4_KlZEl={V1j0D>E(K@$9Nbq5O;-0w|so^c~iM#)>5hk;>Dweao# T3`~cB#xZ!h`njxgN@xNAbEzk8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/34.png new file mode 100644 index 0000000000000000000000000000000000000000..599730e3c8f69c09653117cdbeb923c6fda6d77c GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr*6y|NIAn`0(dO2N-ty zaVax%HoUxkb*D2|4$Y%`V{{^70konzgBL7WxJXd&`t(VS3j3^ HP6@j+7-*fic zBLQaNm23wXcKdNXK6qMRLgM7bKlT21{x?sLHvobO&zan&yQW0iaJ3o!s7yUq|Ky9W zR>Sfm|EnLJFly;+WSnTo_ht9Q91h{z-OeeQEsP9DbP0l+XkK D--kJP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/36.png new file mode 100644 index 0000000000000000000000000000000000000000..78b7373b916833e090b4350e56e2e884aa22ed7c GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFUg1Ln`JZ|M?FD@!`*n4lwNY z<5Fgp`|$bHoc{)9x4WHreD<$9r@DeuI^nu!qD{q5R%YchE@p32*xcOQ7V-Srum0}; z!PEK@ATT4L=}1;u0uYo$wghy)Q4c!UShxMZPs`MY?2FlWq?k{5a_%l84@#o+1c=d#Wzp$Pz8xKiQ( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/38.png new file mode 100644 index 0000000000000000000000000000000000000000..98fd7b610bbc1cf738a6a59f2bb84055d09eb8bb GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar*6y6C_v{Cx{q;z`s34 z&+VCkV7DKavZfUOm)(EU6M&$J^Ur|&n?J6O(R}KJv#k%)c=%d( wOGrup!T@j+7-*fic zBLQaNm23wXcKdNXK6qMRLgM7bKlT21{x?sLHvobO&zan&yQW0;F!Fub{a4+ZCn4cV zgJa@>^V-G#l$Ylx9c--I{$E4y$A0y`4Cg<(EDy3~N=OJuGN)-N&gMRRRzilW+|USQ jkWxBNkmLVT!8{DNZW}J+xwL32&^-*Eu6{1-oD!M<{GCMk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/4.png new file mode 100644 index 0000000000000000000000000000000000000000..e013452ac9f8543cda0368fe2410001c65c2e0f7 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^F3W0Ln`JZ|M?FD@!`*nCNSTK zlSxYWQJH$Ko{f!zH~BI1iC27IcK=OpDZH^|vZREhq-5vDpa19W_|LAtKLHGyIE7Zv zYy^Ufse(?rhUbp4&*0FOG)?#*&EVhp#!AygU4@O!!^o}h;D6gf7j=z#ZpIx^YBSyf z4QQC{b>i8f0%NxJL$N(PK;V<3&nLK4aJJ)LZGS@s27^kEikB}|-v&CB!PC{xWt~$( F69CPoPrd*E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/40.png new file mode 100644 index 0000000000000000000000000000000000000000..982c5fd1f34449bccc26412b6b7be1883fdab432 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar*6y|NIAn`0(dO2N-ty zaVax%HoUxkb*D@j+7-*fic zBLQaNm23wXcKdNXK6qMRLgM7bKlT21{x?sLHvobO&zan&yQW0;F!Fub{a4+ZCn4cV zgJa@>^V-G#l$Ylx9c--I{$E4y$A0y`4Cg<(EDy3~N=OJuGN)-N&gMRRRzilW+|USQ o(8j$ME>qlc*uJi}Im*B={f5!&PpR3}KsPaXy85}Sb4q9e06Er2kN^Mx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/42.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/42.png new file mode 100644 index 0000000000000000000000000000000000000000..aa5d4fecd85a604f676026228fb4c6974b8baf4c GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar*6yQxpXM>@j+7-*fic zBLQaNm23wXcKdNXK6qMRLgM7bKlT21{x?sLHvobO&zan&yQW0iaJA_tv@Fdnn=3L& z=y+q@_WwLQ9-1Hj&)e~T$JE74_1ug*qSR)*W!K-|Fx%_IvqJ^OZ0(0)dw77L=Y(W) f$c6o%M3@=2@7FO7wp#rN=oAJ|S3j3^P6KQ p<1=MlL5~{iw*UXD?Qh7yuu4b&wp$F-X`r(hJYD@<);T3K0RSYMOUVEL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/44.png new file mode 100644 index 0000000000000000000000000000000000000000..ae33a33c58af606d2566f1cd73a2940c4b9283cb GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4xTQKAr*6yQxpXM>@j+7-*fic zBLQaNm23wXcKdNXK6qMRLgM7bKlT21{x?sLHvobO&zan&yQW0iaJd~UU}KQ^!ngjN SZRmWUSqz@8elF{r5}E*CjwloW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/45.png new file mode 100644 index 0000000000000000000000000000000000000000..d879350b4edabcb11497de8c16e71ed311b4e103 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`j-D=#Ar*6y|NIAn`0(dO2N-ty zaVax%HoUxkb*D=i8%-i%gP?SJXe%WMjxXWZfXWD{ei|u?(KB KelF{r5}E)fby(&A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/5.png new file mode 100644 index 0000000000000000000000000000000000000000..80ecda15d276cea8db9f7170c3499fe0e6915507 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFUg1Ln`JZ|M?FD@!`*nCNSTK zlSxYWQJH$Ko{f!zH~BI1iC27IcK=OpDZH^|vZREhq-5vDpa19W_|LAtKLHGyIE7Zv zYy^Ufse%`?J~lD`&HF!-L;Enl8?S^2o51Xriw7I)w*S}A`>|iWFT?qdF3W?gnG!&7 zqcli@Kdz3^eCmX=tq;?9_*!>MNCL%Y0NtSErEJ#xD|}uO1H(N*uhOslM;`;-%i!ti K=d#Wzp$P!!LRHKF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/6.png new file mode 100644 index 0000000000000000000000000000000000000000..2a27e7fa1ceb4203d3a7b97df0f47a915c533cdd GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFdm2Ln`JZ|M?FD@!`*n4lwNY z<5Fgp`|$bHoc{)9x4WHreD<$9r@DeuI^nu!qD{q5R%YchE@p32*xcOQ7V-Srum0}; z!PEK@ATT4L=}1;u0uYo$wghy)Q7>W;PE=jY##6`qKy%`iCp8Q1zqRk;{`bC9*~;-} zG{=FfMhA23fkxg5aWWHcn{8+z@-8U_q(7;;utTHw2G6Vb$}UERC+2qFa*uCV0CX^e Mr>mdKI;Vst0Gf+ek^lez literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/7.png new file mode 100644 index 0000000000000000000000000000000000000000..7b87bc911d72e60d839d95b38cb48f5adbafc955 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Gd*1#Ln`JZ|M?FD@!`*nCNSTK zlSxYWQJH$Ko{f!zH~BI1iC27IcK=OpDZH^|vZREhq-5vDpa19W_|LAtKLHGyIE7Zv zYy^Ufse%`?+z*~$_%P+fy2(yKk1Q^{|2DsoQB(EbePMS4`2!96TNz?>h0lCzo*sX| zS2d+Laff8H^Fuv1HXu;jCf?q0spIT|e^ZxBFzov3%H(o-<#M1S89ZJ6T-G@yGywoG CpjHt8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/8.png new file mode 100644 index 0000000000000000000000000000000000000000..04b907535666d2e86905b0178d1ab0d251941249 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr*6y|NIAn`0(dO2N-ty zaVax%HoUxkb*DOV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/9.png new file mode 100644 index 0000000000000000000000000000000000000000..eb0664b15214bf23b7b7acde2ee6cddaeefc7d05 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar*7pPTnZ!;2_}oKdzu_ zA*BR+Z^1n}l3;K4_}cS-H8?_KZ>J z_Jzhx8q@O%1Wa!kG!h|0GcsoZeaYkj%G!3VgJy%tf;u#8zUmfykxMh0ECYa5k z!-F~OjE(%lTBeN`CNDp5cEjdf(Mi7;6{7FWb-l&3{r5hW^NN`>nfjWR%SrE+n3~eH wKIhWHQ0-S2v`z;e2rWE)!2QIIn5Qekj{YoCeD89j4d^ZgPgg&ebxsLQ0IS%+%*~SGig>N2{PVpiSD{bOMJt9HA%+>Li^VSOns7Ck(USN05nug| zPVWb2wf4*{FMHLx=2zo^y-l;$+Xb}FGOpb4b(L61qPGI0@HZCLl85S!{(|jCZmdsq YWXtc*&D!C95ac!nPgg&ebxsLQ09GqOQ~&?~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/10.png new file mode 100644 index 0000000000000000000000000000000000000000..cd9498b1bcc6a6e1a9bc51083487462aeacca8db GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`X`U{QAr*6y6BaQ1iU0oDUiFux z1PB=V*tQ!?z1T5VaJod9`dsJIOaF`Q|0j1mEHc~WRP&(zv-yrFwItJrOotCJh&cE- zD6uP)u~r0$JD&X^BD7X=HrpgqmdKI;Vst E08qC!K>z>% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/11.png new file mode 100644 index 0000000000000000000000000000000000000000..11cdc8b0b35b01245e80d39e83ea5b2dc1a77c82 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`v7RoDAr*6y6C^SYbm)Eff9L%F z0#D^Kx0s{|#!XHV^3FN3TJp=&Y97>oHs2AYmSp;n>F@yt5eFX!C3b}})*XvFCC>g3 x5n3xbn{AS*a<)pe@yBfsI8B3M_tDnm{r-UW|9dk4e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/15.png new file mode 100644 index 0000000000000000000000000000000000000000..43b182a989aa23eebff987f9466bc7d723e506c5 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`d7dtgAr*6y|J1*GUe8u^ka<(7 z(}Dlb^8ZH~uuP0Ol5yl*hd0me&Ww9MK?-;_mU8?9$p(r{epDiH)@6-aOoD_&15*d5 z$CC-}ovb?^Slww`kbNMFL60-(Xh*r0B69-Q2Ti3621SRdQ#cq_%uY2+nI>Whw3)%v L)z4*}Q$iB}vpGJe literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/16.png new file mode 100644 index 0000000000000000000000000000000000000000..d8bfa9295a568a3abff080353ed449278bc7a2af GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr*7(PITmJP~c$^PkvPY zXVL$Mns@$mdGe>(CUR^M{g~E&_S}Ua15U$;9;X^Xh68sZxDz9$CwvWAFt5$?#+M}1 zLcTqbt+xx)m&cu0CC_n3d&SR3%%LkRC$mSd&vF#q#$uXqXr4l|-XE10D-UQKspI3; Z`?tM7&-|j)2A~TVJYD@<);T3K0RVMxLK*-7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/17.png new file mode 100644 index 0000000000000000000000000000000000000000..ded5c59b700d928f775231a0e30bc1d37118a4e9 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr*7(PTb9VK!L}Fw`)r6 zCZ*pMB35CJMU8r*oc9v~pIP;NzMRMr=P;Xzd(BS2&D;wnym+y~buo{8ly_H)M_9IIt#y<~6jn&moe_WHVqhLwDo>}?GgTe~DWM4fhowRa literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/18.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf51e6396dae8acea7523bb45472642e30b3179 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`nVv3=Ar*6yf7HKwUe9K9@PFx( z*R9NMJi!xVj$|A;*Wt~xd-8=npa0)E|6d|$#~fd;h(G!N*uqb{tWk?ekdSC#>frQv z!f<3Aga0d~6_WFv7MUhrcG#4b(wma4CT8$2{`+V9!&mpGNHZ{~&iAvE>b$rRXeooI LtDnm{r-UW|fJZ*| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/19.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f55c9d2c3a567ccad48d6f330891f570de5d1a GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar*7(PTb9VK!L}Fw`)r6 zCZ*p7T(MyrT?AvbIOLhdQrA7+Fu$)^Kq({mgW$E8Lq)F*DR&e&sN8uSSIg$i&fBI*M+KIE3_S?X7K7VY9BOw dv&N)1PHkeA`318J(m+=*c)I$ztaD0e0svQqKs^8e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/2.png new file mode 100644 index 0000000000000000000000000000000000000000..de42e784da843b9d67032f878a8620861e2e737a GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr*6y|J1*GUe8u^ka<(7 z5`*$ChE3fPy*DHaI}=%7-1`ZVt$fB$TM`0D-?X$FRA8QxXmTG|hRb~1Rn`njxg HN@xNA#GpC# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/20.png new file mode 100644 index 0000000000000000000000000000000000000000..e9818d174cfeb567693d5a7deae2ce13eb2bf809 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`S)MMAAr*6y6BaQ1iU0oDUiFux z1PB=V*tQ!?z1T5VaJod9`dsJIOaF`Q|0j1mEHc~WRP&(zv-yrFwItJrOotCJh&cE- zD6uP)u~r0$JD&X^BD7X=HrpgqfrQv z!f<3Aga0d~6_WFv7MUhrcG#4b(wmaKjQhv^KX2_B?l1AN{TaSb31}OGr>mdKI;Vst E0Od$Mt^fc4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/22.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8b7528f91f3e619da3b86d6e2a0ca6005d5ba4 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ah@)YAr*6yf7HKwUe9K9@PFx( z*R9NMJi!xVj$|A;*Wt~xd-8=npa0)E|6d|$#~fd;h(G!N*uqb{tWk?ekdSC#>frQv z!f<3Aga0d~6_WFv7MUhrcG#4b(wmaKOqzk=x{1fJH#a6U0BvIMboFyt=akR{0K#uN AYybcN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/23.png new file mode 100644 index 0000000000000000000000000000000000000000..762b28722991d2679bc438fc23827377acf68b40 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`v7RoDAr*6yf7HKwUftrD+wH_sL1u`NS4wJzs6AF$L%_22WQ%mvv4FO#lsxOxpke literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/25.png new file mode 100644 index 0000000000000000000000000000000000000000..faa3731355047b4e1cf5323cb786155e0960d9f1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`1)eUBAr*6yf7HKwUeCtGAgnq| zQbIx^;sWc0*drN7&UJY6tY#~D|HuCOXZyArRwnv~MJ5P|{hz)6;ME`*w!;S)_H1kj zwGCoOy4oV>`@`h%CehhWYi1QnHmqY@o>s$lz~s?YpA!s848n(*y|x$|FfeR9lVZTI S>un3rZU#?RKbLh*2~7Y|1U%>f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/26.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/26.png new file mode 100644 index 0000000000000000000000000000000000000000..bd5e2b0bf596ad02df7bbd8e6aafa82a4aa5d35b GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr*6y6C^SYbm)Eff9L%F z0#D^Kx0s{|#!XHV^3FN3TJp=&Y97>oHs2AYmSp;n>F@yt5eFX!C3b}})*XvFCC>g3 o5n3xbn{AS*a<)pe@m&UnC4r7H-kY}T0?lXeboFyt=akR{0AZOd$^ZZW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/27.png new file mode 100644 index 0000000000000000000000000000000000000000..44db10cef43f34a3b5f9637debd3ccbff02d839f GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr*6y6BaQ1iU0oDURagQ zAm;Ds15JsqcFzBwnB%5g<`$E5V{Xe5fn&!7qT3(*&;R#L-qmoUUVG-B`+s^586+em zNU*UjU`S#TvV0Pl#HhD}Z@c0PsSQ#M-c1pPkLG%vV3@&F)5Rg>z!9LT%ETb`DrwTy T!)d31mNR&|`njxgN@xNAV>UhA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/28.png new file mode 100644 index 0000000000000000000000000000000000000000..3965b9a53a0436ed3bbc210be0c6c2c330acaab9 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr*7(PCU)qpdjGFo|I(2 zEyI3_6K`1Jp-h`Zj^Bb$pUIhjmfNi}gZtyg8C-_S3=OUk(up^&C43E8Fu!eQz?UHN zLf$=*t-mYNA8VvsyG1L4CynZhKBQtw%EsHgZ4z Wn?1vu;p;@8{S2P2elF{r5}E)y13B>Ar*6yf7HKwUeCtGAgnq| zQbIx^;sWc0*drN7&UJY6tY#~D|HuCOXZyArRwnv~MJ5P|{hz)6;ME`*w!;S)_H1kj zwGCoOy4oV>`@`h%CehhWYi1QnHmqY@o>s$lz~s?YpA!s848n(*Kbii||MyLvVV6z% V@)qwe7C_q>JYD@<);T3K0RReVKlA_q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/31.png new file mode 100644 index 0000000000000000000000000000000000000000..af130126402082c9479429d357794bd8de54b3e4 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar*6y|J1*GUe8u^ka<(7 z5`*$ChE3fPy*DHaI}=%7-1`ZVzopr06{4> A*#H0l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/32.png new file mode 100644 index 0000000000000000000000000000000000000000..a7be25c5f81aeef62e693f1b0cc53e629c88ccb0 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`5uPrNAr*6y6C^SYbm)Eff9L%F z0#D^Kx0s{|#!XHV^3FN3TJp=&Y97>oHs2AYmSp;n>F@yt5eFX!C3b}})*XvFCC>g3 s5n3xbn{AS*a<)peaqNNr&+`8>t~uy(d2OUn1<(!#Pgg&ebxsLQ0A3z30{{R3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/33.png new file mode 100644 index 0000000000000000000000000000000000000000..2fd2075dad1b7625d535ebeddfebfc706fc3f169 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar*6y6C^SYbm)Eff9L%F z0#D^Kx0s{|#!XHV^3FN3TJp=&Y97>oHs2AYmSp;n>F@yt5eFX!C3b}})*XvFCC>g3 t5n3xbn{AS*a<)pe@yBfsI8Blm7&@3;8Q!>k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/34.png new file mode 100644 index 0000000000000000000000000000000000000000..792b5b8df02c4800478069bece0375990434e42e GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr*6yf7HKwUfOXJ)&+w(dV}_#X!EB&C44$rjF6*2UngGjnIEerN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/35.png new file mode 100644 index 0000000000000000000000000000000000000000..3c34c3719586721d10e3bb51bf83a31a48ccf1fd GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`sh%#5Ar*6y6BaQ1iU0oDUiFux z1PB=V*tQ!?z1T5VaJod9`dsJIOaF`Q|0j1mEHc~WRP&(zv-yrFwItJrOotCJh&cE- zD6uP)u~r0$JD&X^BD7X=Hrpgq;h&-{QYsc-^P-t^on2Xq*Nr>mdKI;Vst0JZQ+!T`@`h%CehhWYi1QnHmqY@o>s$lz~s?YpA!s843Gbp+W$9>`Rl!nk>NyJ W#<8XsZ~B1NGkCiCxvXoHs2AYmSp;n>F@yt5eFX!C3b}})*XvFCC>g3 z5n3xbn{AS*a<)pe@y3Ra|98#*FS+iY>TL#wPix(-w6XEn0j*;2boFyt=akR{0OJKT AQUCw| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/39.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e3f7475cb5230b6909e16facc0199d5bbb8be8 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar*7(PITmJP~c$^PkvPY zN9q5|;5{Ejh4@lz7b+<9-g(ohcl+crR<$mn9cLIGC|&ESVp+ERrupT|w*e~oD7(o5k3u9@pJK2RWw^2AqWGnalb^0^n9~;g^q}?8 zBf1~bMEjneYl}Q_iJ$9^_KKhHm_suxCbLJc&vF#q#-);QD9({N_Q%QuH^xfYXAwV` Y5?yn=-L$%w0v*8M>FVdQ&MBb@0Dcrfo&W#< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/40.png new file mode 100644 index 0000000000000000000000000000000000000000..815c80e2dcd0a7882b776920481c65f7b741b23c GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`$(}BbAr*6yf7HKwUf!0`vDcRpwQ0zqbm Yf4ynuYv*iq13H1h)78&qol`;+0435w2mk;8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/42.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/42.png new file mode 100644 index 0000000000000000000000000000000000000000..94ecb8623ec24602e516032068d8bf511e8fa641 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr*6y6BaQ1iU0oDUiFux z1PB=V*tQ!?z1T5VaJod9`dsJIOaF`Q|0j1mEHc~WRP&(zv-yrFwItJrOotCJh&cE- zD6uP)u~r0$JD&X^BD7X=HrpgqarUvk|))!PgVcOQCHo`@2O09wr8 M>FVdQ&MBb@02U!S@Bjb+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/43.png new file mode 100644 index 0000000000000000000000000000000000000000..b72c0b1849a0c03764f6057f45eadd04581c31d5 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr*6yf7HKwUe9K9@PDcO ze`7-^!rdHwJHMKdC%A2#`y z|L@!U&IsQf2Mi1tSOtV9oKWl+;x0H?x`Ws8dc#$Q7@;Fwg6~6|*baz12zI%^;MAa{ bDahb-KW&m%%8ywoC~`~lj*;OXk;vd$@?2>`KBGfrQv z!f<3Aga0d~6_WFv7MUhrcG#4b(wma4c2A6J)06+t^8Yg)4)cHXaL!LhpoI*cu6{1- HoD!M?U{EtkKyC|(FVGTYYdzikxPGAA9eWW{|P3<=U}dN0WCzFehr!T)fG#g`=W zLf$=*t%~;}?YT3*GB;MT8s4v2z`>ioDdBCXrpBRJ3)n+$2!&i|na^VUv~b;Fo|)nw Xa`X8&t=6jrI)K5`)z4*}Q$iB}b8|l& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/7.png new file mode 100644 index 0000000000000000000000000000000000000000..281317d200e53876f6af1ab2f0065569d57265c9 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`sh%#5Ar*6y|J1*GUe8u^ka<(7 z5`*$ChE3fPy*DHaI}=%7-1`ZVUHx3vIVCg! E00hK1p8x;= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/8.png new file mode 100644 index 0000000000000000000000000000000000000000..057408225fac40ff38fbf72295e313a48b92a415 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`iJmTwAr*6yf7HKwUf^>bP0l+XkK D>yfrQv z!f<3Aga0d~6_WFv7MUhrcG#4b(wma4c2A6JvkJqmXFl0+*R~%7TE^h%>gTe~DWM4f DdAK{j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/glass_8.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/glass_8.properties new file mode 100644 index 00000000..ead7ca6d --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/glass_8.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_glass +metadata=8 +method=ctm +faces=all +tiles=0-46 +connect=block diff --git a/src/main/resources/assets/tinker/lang/en_US.lang b/src/main/resources/assets/tinker/lang/en_US.lang new file mode 100644 index 00000000..c22f216f --- /dev/null +++ b/src/main/resources/assets/tinker/lang/en_US.lang @@ -0,0 +1,5 @@ +fluid.inverted.molten=Molten Inverted Iron +fluid.bedrockium.molten=Molten Bedrockium + +tile.fluid.molten.inverted.name=Molten Inverted Iron +tile.fluid.molten.bedrockium.name=Molten Bedrockium diff --git a/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium.png b/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe8db0cd13e5d27045a1ee45e9a1f1b116f4cc2 GIT binary patch literal 9137 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 z zzj*O5(816{_ybvQ@Y)+$JqY&x3N(#M%0Ih%zzNFj&LeVZN&@Q;804rKMXAy)jlCY3 zpj#L49C6tvZAqu={xlMLRB$)6Wj_+RR)6HkkkMFNYhsK4$oE`EFS_JC}qol~Bn8|=*!Usb=o z@yGhRTmkj4FCx~myJqX%^h&f6CZ-zFgwT^Kq~Obz8^9S5BVb&h#;MMav$K_ZBm5kV zjd*|>*`HtjFmHi|fZbym!=?s9w)!1Yn28lhx4N!PhKfrI9%<0f9j*qptM_dht!dS( zdicF#s-5;pRQq$uuhz$&wU$YDF6Q3-}0>Axf5U{z^?`GY~J4>fhJE9Qa-88_1vtK9Z;11 zN4JI*#K9k-=Ty?xC8uM3_wQXJ9z4^4c)d>ZE0JKUMV+!ZFe88D4GJ&&*A^8L&i=id zt!1ma&%Htty9&=}Dq8m5XSCM+et`7FC+%eg5+r_uvcF`_bz)|VRe5jIu?juI8jgUh zY|woj*kvDw`s#VpJ-tsWWxW0qJy#yc&tUwxD<6~Yz>Ges_;1B7ebC#)>8Hr)uS87w zi6GZnOL*14diA!^`MZ0q`Onv3`+Gz*M;&`R;sk&GyAx>spx`G9!0D;W5S4A97o=AE zYXP$LRiEhH$GB0;h7CrE)g!;BAWaHk1+#A@Ni7NkCjieGfIeMJ8^Ow*E3XW_cLf5P znO8C^IVKV-fd{Jk6m*rR!^CNKZNPvf%B<3#kSw}1Hiq7?{i7-=b>1F+Mf3-)-fJm^uV3A6*I;J7|mDsnmLBlb4cC{HO?>>MW zVsv+NGI-+_J_jX?$^2N5bl(^QV)<9PvGiX-l(;G|!}b?t2vBfr5eZTIQOI&i!QA(v zOoNpwKXlEAXYkhAU9}1d9-f-HiSJ!U_ucAL8`M0q-}ow@m%@ZnH=4O(vKDkdKr}2=cESxdKMdjr`Ft92! z3s!K+f&dtk-CMXvcjBTH4{LC!eHLiAs{N9*`Z_p)0Nc z1LpI!>Nz{wa3)THkmu{=B{hiT>B^DU?Q2}}Z>n!-7@kn69(E#D=c1bbY8Pdm>RFv` zBhD+6-*9NGNGGXp*<~TW^o@bM{Fv(g{84!CO~L9wn>o5?Z9}wWENb2dQt|BH`QB|E z9gI90cS=eiYt^h6nw~#py3^L$N|){RbSlqK{7n@WqB_X7f|ZiMsX30;b2A99b1wvo zd|ixMr}n~wg-IO0R^zN$=|gnC$IB59#*|sTp86rm)Rm^ zVE(*g&zF3w;fJPBu9c*tOgat)Yn(@8c!G|&T;NuK&$;w8#bI9=4MxPhHlsOY!Yge1 zDl`Ek-o?|Px~ZhGt`}psPu^NwUiMBwQl2=J4z|Hm-?(uDGCmY;Qr9UT_@5T?OXsL{`33ytv zco_{?(G`0sJNpQ}l`(bjT>x%KrXN3k46g51isgW;*kF)@xHh>Eyvi-5>~;w2dz|I| zZTZM*i$+I@-TpW3TQk54G(5#}ZB&rxJ4IGE8i# zqyiZ#X^}Al(soD&e9xVL9ag23b2TSG*r|GWEqFR?n(l&JoLN7Y*d5To@C5^Np}xaB z;QMHw-7s$N-mj?DJP3q{Ao-(<;+u;xGvYM_>WoDQ;d_!Xd2VjbiUiwnS?m(>Vv6XU z7cDK>$(aU6|7Em@z)WBU=6bVfa+j!ZKtqBH ziG&BlLEX$*lR2^%R!Bu}@f;dA^W!T&Ma)bx($7p84PD{s_@a#2NYsA-5{nC-r}U&r k?R04c_fc*X)$N3Zp*%wv-j~V4S8)*98v5$xs&?W31K}t@2><{9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium.png.mcmeta b/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium_flow.png b/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..56df662cb39e4937b359acc8f1ab00dea6fcfc7f GIT binary patch literal 13201 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 XOU4(%+BE!A8-$^rnQo1?OU(ZP>h;hU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium_flow.png.mcmeta b/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/src/main/resources/assets/tinker/textures/blocks/liquid_inverted.png b/src/main/resources/assets/tinker/textures/blocks/liquid_inverted.png new file mode 100644 index 0000000000000000000000000000000000000000..8d5c090d0017718b9cf138f4000cb4e4b1776bb3 GIT binary patch literal 6915 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%0DASKe&G;wzs%P1tq@5@$KLX@Us4k`mUX4UuF4I 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/blocks/liquid_inverted_flow.png.mcmeta b/src/main/resources/assets/tinker/textures/blocks/liquid_inverted_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/src/main/resources/assets/tinker/textures/blocks/liquid_inverted_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_fletching.png b/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_fletching.png new file mode 100644 index 0000000000000000000000000000000000000000..e5a51edfd4314b64ec7e280491e36ee0411fd8a7 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr*{o19o#VDDw2S?`WMW zouT|lZruYnzo#Ne$;vk(o^>4mdMmcDaRUGQ*6Hl^fB0%nHwrL$X@<|!*lqEA#nxk% z>K4xzOgWTs&-T#Ttp>*$qO_mPnQ6!toxS@HyLht8s~|6pmWZy5d!FB#_I&s7s(Syr jx4b@NYLLggITP|Cf($e_p4&Ma=oSV~S3j3^P6RIGpmEmVjCu?Q^^J1`$JP(#ZC6u7f5dXYf3i0xEqV(I*Ie)qn!>CZ-< z=bWY~o6mll2j9N$dmhJ;+P3w{KHo)A#9h~MRaF)p>IWuYG)==G_{cZjQ{eV6B_)W=C00000NkvXX Hu0mjfejaO; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_fletching.png b/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_fletching.png new file mode 100644 index 0000000000000000000000000000000000000000..854c0c0c5c89949507899e605e398b16874528b5 GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwm8XkiNX4AwKmY&RGpjbVD&1Yo)+5!B=iul1wVqAQjg760uTAr- zX^)Hagy8!uKBxan>fPBJ{Qdd)`OAb~UpIPYvi0Bmpm5(QiaPW6)uvZ`dgFPwf4=?f zb2+yTWXQ?*RbG0JmgevM`7e{)E;l^*Z?k7lsl!LLMZ64xr>k~J9Omx+ zUtCmhEmK>|%r|q5vK>!C&(yzrd;ZO|{4ZJeSMAnM1qOymTddtWc>V!>%D~|1>gTe~ HDWM4ft?+c3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_head.png b/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_head.png new file mode 100644 index 0000000000000000000000000000000000000000..ee70896e04d21210e89299db717a46ea5e0ea2f8 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=cb)zif>q+(9;pa1{unJpFe?t1utljUZK2#>2T!tq=^~KY1_<=nqDma{rzwK_iw(k z+{VTcb5itUEDKvUW`8{OKXv27o)k$2raeqd1!j?KDZh3Z2c<9=Nth;F0r~i9xz_51 TEstgc9mL@2>gTe~DWM4fz_DX% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_shaft.png b/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_shaft.png new file mode 100644 index 0000000000000000000000000000000000000000..d7b1ec28ee1db617b899641fff33786612f71383 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGzNd?0NX4AwKmY&RGpjbVD%~wHU$CM6QoWy_U)#2x5VuLZ8Z%Aa z{@>>-{kleZ@obMW$G>w}|MTbE3=x-+zaBDO;CzRU`-O&ImY@IU$8FrBr=_=UrHWpg zV65DF#@^3j|L*T9N{tQhF$p_c!J9E__k;gegVkR@#X)so5l%eRSS2_?Y-L2ca-~oylw5S zbJs3y(d_m(tHBmyRX6M4y*oQJZS@*6fP9_VX00l{5^NK=85TVZH7Ps2+!g3m22WQ% Jmvv4FO#s{*jp6_R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/arrow/magical_wood_arrow_head.png b/src/main/resources/assets/tinker/textures/items/arrow/magical_wood_arrow_head.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc6e56e18a763dc224b9bf2575e65b21b095113 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|5FVdQ I&MBb@09`CRQ2+n{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/arrow/magical_wood_arrow_shaft.png b/src/main/resources/assets/tinker/textures/items/arrow/magical_wood_arrow_shaft.png new file mode 100644 index 0000000000000000000000000000000000000000..e2a1eed01451d20fa656c3e82e1a05c4e78615e1 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Nt;@5T-N{4-sStDUl0CYf45iZQjuE)7}3r z`pi7HIW6RqE-b8+3OL)t!MTVhAthnQzIgFPl5%`5QU^{ja2m91?%XQL6=0(LQuP`m jj|Ahfj*e@A4V(=Bn&p$0|M*Y|GOu%%$yxNxOhu6LIjRHdHz@BnSK0B2Bjd));-_9+$iQ~T(kAboY`Id zv95bgXsTYWHeYLc<7t<~S+;!&fJBqOTf%KR7LX e^`jrz-&q2#sMQ5HFL?!Y27{-opUXO@geCyQ>_=k& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/axe/bedrockium_uie_axe_head.png b/src/main/resources/assets/tinker/textures/items/axe/bedrockium_uie_axe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..876d165c6410ccba5115ca12cf1ff1b1222cf432 GIT binary patch literal 233 zcmV!<6wG|zMTs1cF3ZA*RMr(qbLirii)6JcFfFvbpu)*9AY7-I@f@i~y^Mcv!BMT`+4 z1T4z}=Nyz$*!Mm2a&q#DheVpDfe-@YIHIa5NGajH&raS7Jk)3$%ImtuG)>@~7cQuF jDaaAUCGa2gQyaJgLE}Ca$jte^00000NkvXXu0mjf6!2i+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/axe/bedrockium_uie_axe_head_broken.png b/src/main/resources/assets/tinker/textures/items/axe/bedrockium_uie_axe_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..0130f6f2bd73bd4787f72f485be351b54969a208 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vproLLn;{GPT0tGSV5ref7vOS zO-JuuWf!R7RG)uwyWkxb_WKT34k|un;+m#eVt$MjAeX_ zfV}E=W#fZe!_Iu}xo0hroImOI#D<2zB~cm5)}xSg-bh!P(wK++uQ2A<&r& Mp00i_>zopr06A(@dH?_b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/axe/inverted_axe_handle.png b/src/main/resources/assets/tinker/textures/items/axe/inverted_axe_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..0233336a3460d00617876be51b1832cbff31e154 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGl&6bhNX4AwKmY&RGpjbVD&1YoCXj#NP3Y?X_p5)+aSZqERXlaO zd7=t)+M1ZJ|IfDbm$J=z<@-?XUC)b86}&SxrQG~qeSZG+nXg_XTRgUUt?3sHWuS|LFdC*CewuO^*JmdVHnlY6EBYv_JJQu+N|>v%u?j4eJj&q5$H(Sw pe0iCQQtmMW1!J2jD!o9zW}k4qb#3wfM?haOc)I$ztaD0e0s#J9jIjU! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/axe/inverted_axe_head.png b/src/main/resources/assets/tinker/textures/items/axe/inverted_axe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..cd9dd3a80f21afe319a10b1fd5d063913d80fdbc GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|wt2cZhFJ6_ zCoC|Xv9I>}|IFLvf7QJ|&xx)6zxwu#>rp@1ule2IC%szHXNSr8`{fV*w`{v+<><)B z=EmmMcGP&;)wB1@1r7_$VJj#qGBPkWHvaSDV{>DppwhOie}8sGT7O$4aj4@ww}JF? zpIITt4gTe~DWM4f$?s_# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/axe/inverted_axe_head_broken.png b/src/main/resources/assets/tinker/textures/items/axe/inverted_axe_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..21c6f6650990410bd50efe7c3fec2fe480f7a1cf GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|W_h|ehFJ6_ zCoEu}v90!ceV0k}Pxfnm_xDM!R`h8x(Vu0uwQpkM#Kez1nWdk<%N{XcSd=xGXMV0f|J VYK}!qc`4A944$rjF6*2UngFMSS!)0Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/axe/magical_wood_axe_handle.png b/src/main/resources/assets/tinker/textures/items/axe/magical_wood_axe_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..30d912c228f15f590bcc8a8ab1cf69865765fc7e GIT binary patch literal 537 zcmV+!0_OdRP)EX>4Tx04R}tkv&L4Q5c4wdo2n{95RS#xI;BWE)`LmSR_G0sDWBT_a{y8Ugch; zr7>s?8v0rK8(NxcZD>O5yH>5mxX^)qBFqtG0R@dRIr5YUlEXs5Ax4C73x8kLzd#v{JUMg} zW+-5yR{e-S_?@kj85^xl>Iy^qi|c+2LdOnNwq5u8*mWx>;CY5CtKlyk!Q>}+wj0{O zA^11p;<}+}yKuP$y-!8eR;!W+kTV&0KLcM1x^Ka|RLiY?&*=jsHemh+_77kv3;yL6 zdv`YH_HR!;zaIx@a^l%%u%7?`09HvvK~y-6V_+BsLj)vx8T>yqPvd{0m%)FkYi1;* zSxZTb;o7}d4D+{Lz^axBpJoR$WxSekx&Ws6z^S`Zp{kr67h8aM% bW=a46Xm`;P{UK2x*>ss<#oaakf*@zCg<90s|WxTifL4Pb8Kc{jou+={m!Vw>&`b$3`ZCH}PQl zfj_z85|R=;|Gc~ZHgtbP0l+XkKCrm`i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_back.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_back.png new file mode 100644 index 0000000000000000000000000000000000000000..c4466571e12ab2f4652aa0d24dc05fa40cd2cbac GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar*{o12*y=FyL71wZ3D< zj)wI+I-7qq@K2~{&I{bN`d!5soR`I=3Z@w1g v%Cf_H#!bU3+6^=FFNSZKy<5B@_5o8_r0|(P)Bd~yTEgJz>gTe~DWM4fGv+yC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_backhead.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_backhead.png new file mode 100644 index 0000000000000000000000000000000000000000..33aae2f2788cfbf943cfa07693b24cbed9f1a24f GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^E_P~Ln;{GPB7#;q9EY<|B(|% zX7IA@8#jEAYpPgq*SbPeU*X1$N(SqLhwf@#QfbTG-tj^9+4gA#*3q*2;PDiY?#cmj76iy(IT`l^17Jw#D-Umh4a6zZIHjEYFutR%mJX zF1I!8$sECCn~&j3-q3;Mc2$1WBC PUCQ9;>gTe~DWM4ffpb?> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_binding.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_binding.png new file mode 100644 index 0000000000000000000000000000000000000000..c4466571e12ab2f4652aa0d24dc05fa40cd2cbac GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar*{o12*y=FyL71wZ3D< zj)wI+I-7qq@K2~{&I{bN`d!5soR`I=3Z@w1g v%Cf_H#!bU3+6^=FFNSZKy<5B@_5o8_r0|(P)Bd~yTEgJz>gTe~DWM4fGv+yC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_front.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_front.png new file mode 100644 index 0000000000000000000000000000000000000000..5a02c0d734f006bc76d7fbadfe0d66cc0fc4e5a7 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>z@qLn;{GPO#-Vq9D*3Z+3eL z$IGCloE%CT9qu1^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_fronthead.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_fronthead.png new file mode 100644 index 0000000000000000000000000000000000000000..5a02c0d734f006bc76d7fbadfe0d66cc0fc4e5a7 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>z@qLn;{GPO#-Vq9D*3Z+3eL z$IGCloE%CT9qu1^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_fronthead_broken.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_fronthead_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..3e3f72621521b74d9d7d125faf821e36bfd4335b GIT binary patch literal 219 zcmV<103`p3P)n4O~y)5gQyGP(K40u;aDKU=YBgXjL`&4gq^|Y?*XQD9%)>>@ahMY6J_Xppfi@Ln;{G1{m@kR^TZ)Eu`r! zH=$8fO-=5g@`N86`40r&bci-;q;<5oTv`^rR4J#i_W5Ss|DU;~Cj^Bp4f(q&+$&Sm zDa7eSX5;h7)R1R$zL#h|y(lki?z`aAwp`hFb7m)1ZL++Sv%|yen8P{AHCv~rsPHl5 zSTAiUtXO`>@vJOsKxJ%rhhfwAe;wv$p1$?I5*0pYreRrk&s5HBdv&;51ng!>dN#lP f9e1(qLGO9)%f6;cXU}f{`GCRG)z4*}Q$iB}^8H<3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_head.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..33aae2f2788cfbf943cfa07693b24cbed9f1a24f GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^E_P~Ln;{GPB7#;q9EY<|B(|% zX7IA@8#jEAYpPgq*SbPeU*X1$N(SqLhwf@#QfbTG-tj^9+4gA#*3q*2;PDiY?#cmj76iy(IT`l^17Jw#D-Umh4a6zZIHjEYFutR%mJX zF1I!8$sECCn~&j3-q3;Mc2$1WBC PUCQ9;>gTe~DWM4ffpb?> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..3e3f72621521b74d9d7d125faf821e36bfd4335b GIT binary patch literal 219 zcmV<103`p3P)n4O~y)5gQyGP(K40u;aDKU=YBgXjL`&4gq^|Y?*XQD9%)>>@ahMY6J_Xp757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=a_)zif>q+(9;pa1{unN=HFmF||9FGzkm>%UP=4UgfxydD+l3)|EF z{^x$KfA#OhtC>nSSyz91^S}P(t+Q6f!HbtIdcfe8V!4Qiqqs07B`N8b{G*if9eVCt m#5ZKBon(kfxYCda^n~qXsdE-H#Pop{GI+ZBxvX757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwy{C&~NX4AwKmY&RGuvITEPwYuzFr|K>vFKf#ix-UGT$*|#ciue zy?fujUh?0ce`gPTc>n+ZturAa&IM8ztg7GrpQ;^xjkCMU*ucopsHW5`t$pD|G}FF7rwkRRh#Fv zy8nR-J(n3K*w2iZ@$did-}2c91Wg!NRs|c*^`69dq$!ZujTaaOw(D$om)Wx<0iDj^ M>FVdQ&MBb@0I9lp&j0`b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_binding.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_binding.png new file mode 100644 index 0000000000000000000000000000000000000000..13e119f909c6277e67d677f327a72c3fb6f2be8d GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=a_+0(@_q+(9;pa1{unN=HFmF||9FIcek_5L+;bes!wRFqG$iEJzX zyT9;tnykT*SsrDM*AFfIpMQT}@baZAZ(a!xJk+7%K7}#$H-5#>6FA(V=e|XJ kL#EnEhM0sa4T(T6+&7jpZt*c_0$Ru5>FVdQ&MBb@02s(pz5oCK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_front.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_front.png new file mode 100644 index 0000000000000000000000000000000000000000..668c6c5601d756a0e2c1e96df8c10be0b717d00a GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwiKmNWNX4AwKmY&RGpjbVD&2Ly-VnL^dK0sruE~svDa=9HQvdJo zuHOFcdA~f*|9{4R)K512c;q$VZ0Q}FJv{OIYZ4PuR4#J6u~qTh{`M|8AuTEC$Jg)r z%-X`7Y(6o2{`|jp*!{J`o8{-{8K$TlF;``sEWxH9w=dzxzqi)TUNJtwX)YYf9z7Y% zpOTd&|2t3C?cfzwKgr5k7})b7$=O6T=qdxl!b*#mzhdQefbM1RboFyt=akR{01bm| A{Qv*} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_fronthead.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_fronthead.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa203be2f47ea6767f0234d65439432feb13f27 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwwx^3@NX4AwKmY&RGpjbVD&2Ly-r(6i?N542O2UcW-b9s~4NrC* z`~Usj-POPU{k87+Jzs^{VOC>dn7W$Uu@8@)db63i3GGc-v+PX4k4K_xYH4X~X$om9 zPK$VF>`6KKpLzNDtAzyx276d;$-R7bYl@VxYmG$1oqrDxv$F*pYR+Wq6wY;!GdSY- rYy-3BjI>ES4n{1jJQt^UgfcVq{x&f?bFjDv=u8GrS3j3^P6757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwtEY=&NX4AwKmY&RGusJ7NB#USFWj{$1YLI&)^? z=QolPvkIjQHm{pyxOwMWdu3ta!&_bzt&#dD#lUnqd-aDbl?;ZB30E2dnH_*Wwm1Ia Tn91%8^Z757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGu&0Y-NX4AwKmY&RGpjbVD&1YoCXntBcYn$MaQ(QH8@mhiluxof z`Rf0#zU2QttA2+4YLj9Ej7p#Vm!7VFwUYgpsi~@J;#S$^jG>#K|Fz$gA3t~YcI&va z5xfkU`-=WK&9x3FR%Sda!S>{v55uiJ+x0Xo7Ob4caaMyZrTqK<{k3ni=FaZV56&$z z3Y_&2r07rmp976n>H6!Jom*qF$h4Vv#T?7;|2q$}zrOSL&#YUQJGV>bG1#B3XREh= gzf4MKPA?C`TN~dEXEJnpf!<;8boFyt=akR{0B~r6LjV8( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_head.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..238e89e1cfc443047e830e76d3861bb935581b8d GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwtEY=&NX4AwKmY&RGus(tzWnrme*M3c1eQ&!CkaVhd>Z*7^IhbY zC;#u={r&3Szn>>R@Mj3BbASGSXh(#IbAi+aoBV_SnRl06Ume3-`C4oWbaRfk7a{!}HMUi3=EyGzBud@d86aB+hQl UQMM%$fF5A*boFyt=akR{0ITVMX#fBK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..ac073c4b939868fedde1182bca852f6a9a6c2c39 GIT binary patch literal 325 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 JPDHLkV1lN)^Be#G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_handle.png b/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..b47f63c76bf97a7f0312bc04060a9823af8493df GIT binary patch literal 563 zcmV-30?hr1P)EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoaY;l$R5*=eU>F5M03>=D{692L<3BEWCPJDMLw+#K zU&BGZ&52$HIBjQOU|?XxrP;wunc={xyA1QUUBIdarvZsx2LH8`#2BvKdqq$)19}+1 zY$jGSiVH|_HiiMDIvWKL8`?O*_5Hf!Yi3|z007TPJ&hf>0yh8v002ovPDHLkV1g_? B@pS+I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_head.png b/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..e8eb69fdb4e5bd1088094ea2d1f7765207cd71cc GIT binary patch literal 580 zcmV-K0=xZ*P)EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`Pof=NU{R5*=eWFP<%y$t@t*z>ntU__T^BBZ$>=MRIl z7$1X{k{F6%1Pw^^GWeeu@`HhmlaV1b>>Y!c2rpK3%(yf=m?<-yzR1WR$^V(*&>=CcrUzq^O-?aL6l+s8V&{q1_p+f1&1&+;{}Oc2LG}7c@&I-!3h8d10_V% SFcPQ$0000u4^P)EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`Poc}YY;R5*=eWFP<%y$t@t*z>ntU__T^BBZ$>=MRIl z7$1X{k{F6%1Py>GX5(aJ2n~D3ASS|#RUL+tV45Awlo@V6c+K$i)h7mNF+K(c1_p+f z1&4_D!mBr*8B`TS85kHC82EWOuxiE&61@!mWApPU7zKk9008GMAkiuPKF0t6002ov JPDHLkV1lN)^Be#G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_handle.png b/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..65533928673a4599d0fd8d89f407fc87178c2187 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr*{oCu|fvpuodC)qtr) z=O9ncF*}|^Ja+;wRkCTziuz4eVqI4=>CbcFb931K-F47x)l{{5{^Q%r)R~s)Rqq{z zwuTv(M>kliACs82w?tSVxnB|Ap| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_head.png b/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_head.png new file mode 100644 index 0000000000000000000000000000000000000000..bcb31540be28417c53e1fd35d33afd24b80ca4a9 GIT binary patch literal 417 zcmV;S0bc%zP)a{vhn&Rlw`@`fi#g6h%Qg zoyO&If#-RML?X!N^O((M>|(WAVX;`?a5&(e{~=tCAWJ$PkFaf9Fxqmtj9RS*!DW64 zXqtvrtA$FXA})m^$Q69wXEM%uS$oX=-+-y~N~sH!Ta((J_ve~SJ zD2+ygHdJzz`wr-`N+y#D=sl=ZD#eA#I1;+uZel252Xvn5pEvLcCi;>Vey>lA00000 LNkvXXu0mjfBCNO+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_head_broken.png b/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..806cee72cade4a3e9fa4ea983d7e9216be55749f GIT binary patch literal 399 zcmV;A0dW3_P)-4@$yVD7#1I5THX@Y}EPQ-kaETC4c|e#h~6R4&fvGe)BkG))t%94b4T&1%Ci zq=2!aC@`5!pzAuu<1vyXL9^LJyWPg)@eu4A3u)W!wyvrQtJO*X-EJ4B(+Re1qt$A` zG)-8R1=n@)d_D;glP-Lb_U(29rxFl`A$q+YQ(}k1LGCQeWPoBI4M=@B916uwrz6u? zo#(kU;q>)-EqUMfk)|m;&l9YyK#?5B0Ralg-S_)FUD==cIF7N~?XXxZB+f&+aQ`TZ zz=Bum^n)Py61FVMZw%hqWw~5}4K9}pHk*xzG@VYFLcia~d_I@G$%;Y#l}`=$M1$vG tFsOOI8bxHW0+NlYQ5q=!|Nct_J^;oyqj8emF2(==002ovPDHLkV1kXnw$1757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=a_&(p;*q+(9;pa1{unN=HFmF_NP>ydIe!63cA;s1QQ`m_yOwxrCs zdF_zLCdNB9dwABz?_ZbvgX4??dARb`=3Y}Y~Cuk|Mo%#hQ80ztSo!qPXgM^;OXk;vd$@?2>`f9S$F^d literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/inverted_battlesign_head.png b/src/main/resources/assets/tinker/textures/items/battlesign/inverted_battlesign_head.png new file mode 100644 index 0000000000000000000000000000000000000000..7531a6d9f8f923efc72f3d429570f1409aa2736a GIT binary patch literal 449 zcmV;y0Y3hTP)Px$dr3q=R5*?8l0i#UQ5462=e|1*BjctS2?}S@_rg)IZ4vIopq71!R&82G3-S91 zib7N(47hIF9Rr5DDJj-_T(`byj)+SC<@FBfaUxFy~Q5ObN3OEN_#?Oppm`)AqgY% zo}Gg}Wh?>MegA=)_td=SC=8gHX_DOtaMdLQ1oAuws+un>U;t(mML|@h)9v7#qw%MK z@nZEU3WN|?n!85{hzPy;E)F;v40tr(rT_U9{XJl+ma*4AB&y;>*xo;&EK8hogb=`t z%sI9`exluKS7tW@M1(u77M2pKiY6t-hyi8^ONMt25h1GHG7x~_$Px$c1c7*R5*?8k}*phVGxF&ncY)P&L*dg!Mo_LcnYzNgmhxSq)U@B{(&@tohIN< zNaN24L=?m%2nW`w_Y66&N-2@xdAsvXiu1xLc4;i~HZ#1#ygUp8|0uc3e7&*hA@qAy zun@qVv9U5&mp!&N-txFs6M%Sl@#UNK?QXZr&-RaZ18;40h3tEqvre1IbdKK_=P2w9 z<~nFT?Cx$qUw#4(uU1z`(-e0HU@>__W4^)S^g~4C2KHZqgXReVCyHbCj+^8~4#585 z5v4e$6vv!qEyl+yL_+}zu)g))5lE5*=+|U+76))AO;ZXpYV{hbO8GW{ne*b=Qw+$m zjD_hbazI3A%+yifwAEs1rcU$QId(f>q!e+`JfSc{Mfmjfm^{x>RkADtcOq3je*VHl zb)ru;93Ub*s8;b1Ff%L|MN!~@d%%Met0E#4W;X}~pmWx71g?Nfz<^%{Zbq-yqf#jo m0i)MP8wKXC|KPvwgZ=>P42ifvJ3m?g0000X5>%lEnKk!!&f%(gAtKL|u+Bql3H2DLPBaXJd{WF#+= z2p8d&w$IsU{8_$U;zy9wfeqJf>yx+^wVW(j$tV%I(Z1tGmHM;pwo4i^o@*o1Os;*7 z;yZC>TdEf0XIJJ%mb`{bwV$U-9@uuq$?0+7ipT31I}VGS&%a!F{YawM*1QdKwsKuy zdQhnG|M&Uer`jCun{LZn%nN#Y`z=3*yPbbP_B6p0+t&p!uml#__VTrO9mom}{PyqH aQoR7D;Pe94i(i3$WAJqKb6Mw<&;$U2zih(* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/magical_wood_battlesign_head_broken.png b/src/main/resources/assets/tinker/textures/items/battlesign/magical_wood_battlesign_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..0672db9b7db63290b96f7df1557f82b834f79173 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|E_=E-hFJ6_ zCoB*!ND^Mtx9M-c|K-j6^Ch3=zi01!0k6lTmj_W$y8(Sj@!)0zVct4^G{aP=&Y zc(XLaWgVq6y_Xw+auPn0as~zl3Oor;(~c~k+1S|V=rUtAPA31;59uJub9Wtq P7BhId`njxgN@xNA6P7;u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/bolt/bedrockium_uie_bolt_head.png b/src/main/resources/assets/tinker/textures/items/bolt/bedrockium_uie_bolt_head.png new file mode 100644 index 0000000000000000000000000000000000000000..f28f9a0701c21ced4816cea6687b98c98b138647 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`p`I>|Ar*{oC+y~AaO7~=yY`ra z_eNIkje^{p6K5S^e~*?ItL4`A<6yr^gJ5MnD9+Nt4nD{+%lDZ&ms7#{C44Bhji4{*+>wRZ06 z_>Met#+WIDpq%rW{%%)FO|A80jBVSIa(MxorIeIXqTc%h;vLwIL^Jr-8if!p&Ct9A z!0eo(F$Q_>-757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwvZsqE6&&#tw4{|`Uz{@8>k@4!;^^%B>7UpQX8voD1; z?yLq|iRw`UCc_w~K=0@EZneT6;~dzyX5ISF{ri{XC)>Lo{4N3?y1Ww-Qq(dm^O%=~ hP7@Mkw%}C&I_kQRK|o@ylLXLt44$rjF6*2Ung9#yW8eS) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/bolt/inverted_bolt_head.png b/src/main/resources/assets/tinker/textures/items/bolt/inverted_bolt_head.png new file mode 100644 index 0000000000000000000000000000000000000000..22c699bd0aa3ac72714549fda38d79f3b79ae8b2 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=a_-qXb~q+(8T$^wB67w$Hkn6u~q`FXZU7CZ8ol~1y@EKC3Q|I5eZ zxhpzSgiq?t*qZkD|NZ^-S7mKVR%BlNva&}-dV-kHi5zopr07kn}`Tzg` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/bolt/inverted_bolt_shaft.png b/src/main/resources/assets/tinker/textures/items/bolt/inverted_bolt_shaft.png new file mode 100644 index 0000000000000000000000000000000000000000..6552e25ed9ebf09b46dfab73d7f5a2330c00a27e GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwnWu|mNX4Awlm!ACdZZlYFve@MSUp>t(eKqTq@63PyB(^;^P0$PY-0B_vI%JE zeLer$%*#SEUVelF{r5}E)) C@N!lF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_head.png b/src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_head.png new file mode 100644 index 0000000000000000000000000000000000000000..3b0302a0f0247fca5ababd8702146cdfec90754c GIT binary patch literal 510 zcmVEX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*10025kL_t(IjbmUKav;&m;D4f*!G9Q^iB!#HrGHVx z7)jCWV5ZD);M84)`P(iKtq;QxvNVo@Q9yG50Qf%;R54Bdg8%>k07*qoM6N<$f&+xw AYybcN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_shaft.png b/src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_shaft.png new file mode 100644 index 0000000000000000000000000000000000000000..e9e0caae15607d7556c0eb5e655c0bd24ef45e2e GIT binary patch literal 554 zcmV+_0@eMAP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003r5L_t(IjbmUK1@r-lUIzaU&C~dgO^%5e&50pD z80N3xz$(v3NV9{PGQ)vWcNykyyMR?KP6LS1jMIQbFN6PDN@5Jx?!CgR8K=#M=4t#- s^fJI2XaqH1->*xaW@JOi);u%;0FF;A%u+d#V*mgE07*qoM6N<$g08>r+5i9m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/bedrockium_uie_sword_accessory.png b/src/main/resources/assets/tinker/textures/items/broadsword/bedrockium_uie_sword_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..4e500dee9c845c365394a827e957dcacacd24fb5 GIT binary patch literal 234 zcmVI(M!u&p_wiGq_+7#$pi0prAoQR6tAkDXc^WMWjk$#Fv2k_wIDiwf<=W zjIq3~Ywqpo{+?j1rFovaAqQg^hAf20J&@axT@FYb$B|-;WQ_TUm2h>ROn`9CNo!3? zsjr|D0A*Mi=rm0fLZD??NJ?4t!P^X=6BxE_qm)t`f@=G|HzyAe1XxY4Z}i?1Ks5t~ k3DshFdpPF^!sQn|0sq-RZ{ne$umAu607*qoM6N<$g3c0OOaK4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/bedrockium_uie_sword_blade.png b/src/main/resources/assets/tinker/textures/items/broadsword/bedrockium_uie_sword_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..9706abb96e2bd73582a10caa30bf615b40d08804 GIT binary patch literal 263 zcmV+i0r>ujP)45sgWR<2pY}t1i@hM(2Fi`VPIJ1{bm$? zcwra{VV>vV#pX_FttCxUEX#tf>!9y|lO&NW%Miyg=6S}tuDBe5wte5nwr#L&8{;@) z7zTAI0>M>PVVWkmu8XE=(6;S0aoV;lOY%IIvMhyU=h$Bz6h$FQDFi_P$8pg2{cihA z@X-d9j?4tIXXZ1Qy^(<6<5W}@5!7{UoF$2|qA1!k^X|rh=kt#?@CMA1l{nxxIk%WLuT zC8eY|j!6?gbztH(Fwb)?r>1Fy;K; zLZI*a55mXM=;Rpex-NX*hhwlSn*01;Uf=~`y-9PW-VOi& O0000ZE6iXy zm?$XI-txOpg6|+}fP~X@C9!Qj8&r!YO!@LTEgTe~DWM4fdYVZT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_accessory.png b/src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..467962ac841e441d8843d71489381a780a91e37e GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGgQtsQNX4AwKmY&RGpjbVD&1Yowm`}t@$Rz!{~JmIC&(*DvK4IF zV6f-Mr=@w1cAfqIxw)p(j3v)u*L?BEEnjEZ?CmgOQRT6i=@{eI z7GM8g;59=C^QFHwl9Fb*|LdRJ`@8Gj*4h7z|0Snra2%E$*kHh5{P^c`|5wX$Z~U^?J|KN~+9`qhKZzg2Ga5RZVlH35 fU;lCCVNQm7>*Bw(Z`EB5^gDy6tDnm{r-UW|g=40f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_blade.png b/src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5935449ee1313320d15254d434ea656fbe2774 GIT binary patch literal 416 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|VoSrU@Ar*6y|NQ@N&%83>?YzDJXG%&+{$u*OX~L>X)_~9F4!gg0 zIeJ9$jY-IC52J*0=VJf!%UK1fYib|<@bj)U+XCf|a>xJ6*8cC8u?SecWX+imAHPbo zUlt&q?l!|Fj=9P_@8|yV@8_%>6BFC|zdR?757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGtEY=&NX4AwKmY&RGpjbVhVahy4*&E2^Lu;e(i|1#lWZnu757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwf~SjPNX4AwKmY&RGpjbVD&1Yo#*@t)m44>e{-nEBZKrpa8BEG? zxP8X*|N1*SBBxKDcgbZFw^iENzxxY+Z`;+=abek!2Leso7E4^PEB^LBSX}Rls++sH zY8#vIQpr39kI%b&XTJ`b{Akvtrq1g;W(#tEt@;1jEPs`EPd96p+PRw=Y#iMjhD%gb hOj27Wu9IY8IJ(Z{3ipc0yFj-wc)I$ztaD0e0sy$PX#W5J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_accessory.png b/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..33fd3eed1a1a51093e63c0da1687a81dd292efd1 GIT binary patch literal 584 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 FO#lfFGjsp| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head.png b/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head.png new file mode 100644 index 0000000000000000000000000000000000000000..86a03474e2695b521eec44144cddf350b6ae82c8 GIT binary patch literal 222 zcmV<403rX0P)I-j~*kquYKfm+~y^rG*!TVZb2fPuqREQ?_{A6a Y0QCVbq3AU_*Z=?k07*qoM6N<$f|{FP*#H0l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head_broken.png b/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..728c4fcf1fe2367504b4b776a6d00cb06927d78e GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr*{oC+y}upupoYS0T`V zDT(9Rf;69FPI3p=DvN9Wi0pLX757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=cb(9^{+q+(8T$^wB6JyHf)3}<;(%(VUf|6_2v757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGmZytjNX4Awlm!ACCM?$6x$4>fJKMzEHt~3@T=lp9;h~?quFU%N ze{-~yq^FU>%0<8azcfyN#q#5)q+aa4nCZ8#eVwnuJY&WT2^N+glKcMuIGT`@bjf7r zs-6n*6jPJ``>Xy|&E2&tO;}r6`|y=pT8|DdSg`i<|I`JOO|M>^on~^?Sn0H&$$~Yj z-~T@wz5Nx>*RQjyw7euQKK&>aaP8vX|9kNY6x2*hXZ+EtWm!a|9uB<(?IHeqTB-nrfShLSppQ&f+5uh&_JYD@< J);T3K0RU=757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwf~SjPNX4Awlm!ACdJLGC=|ujqS67=hQHNPgC-ztU`^M(d;KsHT zWl5(gjJDm=|K8u8Uq5&HUf*E0m3kTT_rLhxmmB^1j*ZPMqelUz!X^s}pS}5S-8f4& zHfGkTM~0@4O&6q|+w*^S`I|MxMTNPm{QVEEl3dSds_EI&Yy9lb`tt|Y0=Wtf9>$K$ e9gK$$Ffc4sFyRmQcjGD0Z492SelF{r5}E*04P|%$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/chisel/magical_wood_chisel_handle.png b/src/main/resources/assets/tinker/textures/items/chisel/magical_wood_chisel_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..9222a3fc584999341a1f19c3be72aad4230e9679 GIT binary patch literal 513 zcmV+c0{;DpP)EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoKS@MER5*=eU>F6XV9EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PobxA})R5*=eU>FFH=wEX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoKS@MER5*=eU>F4?fkZEZ|L9^&q-b_9Q^qiakrd4b zPTgggzwH8w9)bqo(@f9+LYna!K#XRB09&Y!0vZ4SUfU!Hwm)|WqF)NjKfG4|;K!sSv`Wgl%gb)2q`_w~6-j0XmvjM_p1jN; m@xxmtl>0L7s9yKIn)QyVz}X2NTeksCXYh3Ob6Mw<&;$Sxt}5sN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_handle.png b/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..336192f56fcc5b80b65c5a65dec7b82ae150eaca GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr*{oCmiHFpupq0Ki76g zvw9&ndy%wz5nFo!gQ(5&B>@}EZwK?U2?>R!-Kln8D{A>%bH>fy?(g%a1Z}vsuW9Dp$ZY~lYfXch literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_head.png b/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_head.png new file mode 100644 index 0000000000000000000000000000000000000000..91cccc4d2a09fae369c0e3c2296cdf886f783379 GIT binary patch literal 318 zcmV-E0m1%>P)Rj$n*|T_GUwmokpyz_xAJ_Z`c! zU>FAW)B)Mlbsc3{!gXEPwhcv5(6;S!aRL`b!DU(IX`1pljyb*kbp4Qp7M3Il>bl0d zuD6(`30>EnFsDK=lZt7Y-!u1p52|Tq(IfKR4oI06#6Y7*d=n_Ey`l>9;FwZlps`?j9xI1Rw_c;;$wJ-u)3L527<9jrH0v@082Z;lXxl%FJWit5iG22L=gPU@&W@wWX(1UD?Ae>^XAQ) zgns&!Wy!W}bCM(qK@hNI+5t$&4a1P)IHtC3X__W7Dgbid_ZHS|+i2f+T9$>zakL%_ zpiL-ORYmhWD-6RxP18JbNyx72a-Qd$Wf@BhMS&N7cfi09KhKlbbtM3v(Kg~AAu8}3 zMG-rWqbW-P%?FgbuA?+fl`51y&->1^D8n=EUDWPYZ3ZA0MWLo$*EJo-p>=sJq#eSu o@B8YJ;O?)<#(No}G2y=x-_xLTH5^Dp82|tP07*qoM6N<$g4D@%VE_OC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_shield.png b/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..d2f4cefa0839a3d46b25ae6c623c80df40b41d92 GIT binary patch literal 261 zcmV+g0s8)lP)O~$g-*?oe8v8Lw(;v> zcMIfsPSZ4j-ziX46^-Kv#u(Vu0$G-k5CZGEVi*Q?sRKn$(-dJCqHS9Z*Vi{)lx0cV zwxREPO*Wo~5x&=$=XriJ`#eWX%^U;)B}qcZrzN~27;+RvXqv{GYt`JPA{RwLob!+5 zJqvgmVZUnI%d()ZYe*@*wW*^Ey5W5oPv00000 LNkvXXu0mjfb*5@? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_guard.png b/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_guard.png new file mode 100644 index 0000000000000000000000000000000000000000..acfe757fb4fbb6f58d0650307c265753c6fb1561 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=cb*we)^q+(8T$^wB6JyHf)3|Dzpym<4U}TJ_T`uFlmC&Yr~UEo?ozxZFvY-PLy_g;B}=aS-_;rX z&;03gfm9ARg;iRbMh2TV2)$757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=cb%+tj&q+(8T$^wB6JyHf)48A-W(L28U|7Tk*QKmodyvHU+UgKwf z_LuxDiVcbh5x&51DdvJr^}YYf?tRym9&<5i-LXq3)%s4uw8-NB@q3Gw>P>Vxo4_2E zcK-kV^7HR@O__3J8HbQ*Gw+1S(-S=yvij7VjX4+?RzBD6ySx6R1JDHwp00i_>zopr E0GC)757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|VmYyz-Ar*6$PCV^(*g>St-{r!RlRnQTZHv1&{gdbsSKnP5L*8&G zKQim&{wR8fS4#QC7J z$jYNy!oQbsPBD5>VqMTNagD0L#?p8aB3`KyW(2(fc==;!CaZuPi+LvHZ@k~ zCd^^J{$X#M`Me2-Z+eLs^ey&XO;_LPfeKIVLjCvd?BCB4e z=m{KZ*uX8ZvmkHwrf^1amdsg=Z*MqA#Qy&}GxucN{&-Gtmid$UA3yr!Wq9gH=JeCq z`*-aOnehDW*P|6&&ZcV^r*nPc`M-1Lv<05q#A=wU6T`K4`zX!^1}cN6tDnm{r-UW| DY*@BL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_head_broken.png b/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..1e7b19582bd93264bf824f2a0d9957dd699c7a08 GIT binary patch literal 503 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|V37#&FAr*6yQx*tpn6SuV_2S?5+T7aA^7{NU&YwExw}&zFtnB~) ze}6}pS6q){a||?OE0oM+v$g%Jwut9M#_J#Ui&r%T-ahwl|AZYCa~nE1n%j0&1-q88 zC_6G2Sy%o0|L5y!zvK5l+V7uGFn7WXmgar?;(}v?n3O%_)-$%=t^NPoySu^6`p@%6 zPuD&c6-c>ogCYf$cSZ3q-+FfD_y51Q`>l%2&;PG+aw=_F zq{NeTfFb+j$wL=<5*@BLx&A*b^hjduo|=E$Ou1q#x7Ms&crRr7%*IgTW!(S%r*HWF z`Tu!kg$Q*Gl_Lw*ENKciZevXC{McjnvGc#A2c+nIVYbC@>mrmZdVccdT;)hCPF)tDnm{r-UW|*j~~7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_shield.png b/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..d769b9ab838cd062104f3701f243cdda53bc7251 GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGoTrOpNX4Awlm!ACCaf;}ckAo_lV%I5E?xPrZ(p}+vWQ5A(#?it zGdKS)E-bimvZK??wW7*kQi_AIhp~G4+$|j(5yl=p8O#o|DtGRDt(Ihkon{LX zUw!#+<1l+^gIRm!4nw8Wf+hZfD~-=2_|IntnvO z?9jY&Sax;V9JVXI^SHhkhtFNI!XtQv^|H+$r2>o-FV)*EIJ=-iZHeS+MqSp*p4Hpl t|L8w|vx1kQ(O^l1+G&O$hNHkh%Uok~`SNAM!$6-gc)I$ztaD0e0st2?gJ1vv literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_guard.png b/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_guard.png new file mode 100644 index 0000000000000000000000000000000000000000..e688c1239fbfbe3569b97e01abe43cff16347db6 GIT binary patch literal 515 zcmV+e0{s1nP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1002KpL_t(IjbmUK1*2flfJ85Y|A}4(|H;wI1Y>9^ zi7}9C2pnABuS>E^n2EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003A?L_t(IjbmUK1*2e4f; znKHwHQ+J8BkP%t4mXa95wR^7^=5M>eh+i8TNc1xJe`ub@|3ohXqMeSS`TBlc@-)K? eAX_s70|NjfBp{Gg0;YQa0000u4^P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004JML_t(IjbmV-5HOOWIMK`CKiLK(dKvuJQW9fe zU|?V{H+sY%s>sUF)y+(t0k|~J-*$nKi4@Hrzx+VaOwbGHnpG7<84jGf3)hU-0Ae)b zG=NymSPdXWGll`AYDO`D9L-o=AT7p6v}UXz(aYdJwj?`@0RV_PT?aQ>UX=g<002ov JPDHLkV1i=I^1}cC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_head_broken.png b/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..363caf3059e146ddb599deb78407fa2db2e0bd67 GIT binary patch literal 598 zcmV-c0;&CpP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1005FnL_t(IjbmV-5HOOWIMK`CKQe#*whN3bq-fSs z5@TRsU|=vedc+{A$jZRLVDO)bRGVR%ySkZ)a{;o=AHV!S(agZWz<}2U$Tolc@`FKD zK@>$Z1HM2+w^>y|l;OasyC|A*x&WKa*fe8x0kJk?bpa_hW4M4+o3VN!(aYe!v=|@J knz4dJFN6Q+Np_e60D8V$cJN+CXaE2J07*qoM6N<$f+T?krvLx| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_shield.png b/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..075a296fafc58714884d162d2a1cc5d6df43a537 GIT binary patch literal 562 zcmV-20?qx2P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003@DL_t(IjbmV-5HOOfG11H5KLY~;0~0x#56#o~ zUsn2;Jev>A)A)aVzwUpS3rGSr33eEoi4KFB1iSyL3Ze`LPTgggzwH8CA5jM2(oB>A z_%stVfRJXq1`wkervb!j#%cg5nsEZM63Ng70Og@a29VEv!~g&Q07*qoM6N<$g7moU A)&Kwi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_binding.png b/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_binding.png new file mode 100644 index 0000000000000000000000000000000000000000..c87392f1e5416fd02aecfc48d36d4b637dc70194 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr*{o16K1g7;@MimhfN^ zYd^G+>9_x-(~7fo-21+dX_`nTdu8Iq-8hYyRV~q-hHCJcHvn5Cj23gt}nzD-h1} z9IC1UP1CrPEK3&0F}vKTD6^n5>Ri`lhGEcAaW5576sZAHT?HckBhY!< zHj;K-$LmxOEHp-(Gmfe6d+FX&Q1K zh5`4=@d?8a)^&w_-<4qm=o7Lm!~A(DU)ASUck&D7v{WY_2+~&o0000j^j|C=geg%ciw_5%S2t*v@8o%Rke$Kp`tSquImcZGpEUl-7N?L8pn|^zA71bK0+MFh|k;OVVtk<2lEbs+)-suM>@^`00004Gu< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_2.png b/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6cca867bb4038158fc0718af729e19ac018d67a8 GIT binary patch literal 313 zcmV-90mlA`P)$(G{{kyo+VU}gg_kBG77LMZ(Bph6cnkGpSwrvyd^e%BH>xN+c8T{;T{C7pYU}(h6Ny00000 LNkvXXu0mjfL`aEK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_3.png b/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_3.png new file mode 100644 index 0000000000000000000000000000000000000000..5590fdece3c6140a300bcf302ded7d264680a188 GIT binary patch literal 305 zcmV-10nYx3P)Q0WvDG#a&96e_jGSNH?1AMzJ^k!U0mg+xgw?`}7D;*vY}j$~!++nL$f zN5LPD>$+m!-nOlB+ZR6N1d8LBk91u}Q51-xh`;A~7FW)`ya=48Dax|Mx~>?80YqZk zHu}Ct(=^JVg*?wiRaKa#3FA1jOxJaX7;YkEN<7aKj^n)frut!oVfY{5kWJ!n^Fzun zpLJbt^DoF<`(b7~^#j-4r+VYN`C$KCFNs{c!^6BNFEHq66 z-M3*F^2leW@><@R@ri>ioE?87I6FQOaG0if`tQ2~(GXY)PtTZX00000NkvXXu0mjf DpgV_z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_binding.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_binding.png new file mode 100644 index 0000000000000000000000000000000000000000..06fd213f0d5fe17bb8816bdd0c2089cb3c90a0e0 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwgQtsQNX4Awlm!AC7I2@jDtb~stCv?fl5I)Zw`NoSI~(8E?`szh zY&*c)u{!gQ{q8*iYclVCImvT(wfR4N-mmHz95))~`C9**{-d%%^mypizwuYD9eFW* z!l(He;teL{Ywv%mzrATGkHT5LI>-Or%zGt&U(f#=&#|QQlT+jZ{^aw=-u`C}Hv0d3 z_w7bg!Am_!3^!E&%}d~&{9W$n{MSA)J_#<$90IE)moqMD2xMk!W@Pws$VRwpMY|!; O?F^o-elF{r5}E+`wt95{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_body.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_body.png new file mode 100644 index 0000000000000000000000000000000000000000..677ea66b01823778b537d936f00e0e0d39390f70 GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^ZYo-U3d6?2kP76@$Uk!rZjF#pGq|IuRS(p643G(5TTe~pe#Y3kXt z|959)f0Syv+Q3_!ZhUR)wtxG7JqV2T4E|g{A;Mp_thu0S;mTdJHZI!v^#9uS{#X0z zejb}}{lgTe~DWM4f&2gp` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow.png new file mode 100644 index 0000000000000000000000000000000000000000..bfe2428374c9a5aa701ecb21fd9b5ad2f5218944 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|V=AJH&Ar*6yQxuq3(w_fKPfB6hJTo%lz?W5=wmk~7S|>dFaOl#1 z{`|Q0zyH6tZ=Nti;_&qI^CkZM`E_=}&3ixVt5PkMtp@rHOR_D9HD(YU`59#_9dD8#_B^I!62M zT&bwtta3Ji`QP8a=M|Q(J$vAU%ci&v#+)^0c;xTzNlOqAQ#s#ozy7~bP1WaV5BpEq zf8v=jVgB(5>(X2QpS|(f^oODE*t0h}pO_dp7%HZx>-_mDY6J{Y22WQ%mvv4FO#m#% BzN-KL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_1.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_1.png new file mode 100644 index 0000000000000000000000000000000000000000..316648d290640fa4f477d9a5850090c38496180f GIT binary patch literal 448 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|Vnw~C>Ar*7xPCoB-*g>E@y)0P%RG6;g9#=;e$0Liobf*RJyBfCJ zuDs%WP+dUqh`qwcH%GniD@rU8{K#7LD((2)t>($IQWB;op8TFFRM#D_U|YYxr=OZb z7lXjtn|B|aF*~PIvAW*rWAzK~l@3c+J`)nq+k zxxtc;ZJy=9>+URUSvu=GK3~&Ivz@GYG?!^d+ z-#uJ3KS5}jhvVLj8f@-&gEok&cqS=(S*3=a`qvz?bitA}Y7geTtT9gTTRZE)*Kcg= mzaG6YGi~>l1396I!S*YiO0+(#<}CyUB7>)^pUXO@geCw@yt4EF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_2.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_2.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc78839f895c99c76b643517d6accc95a26b20c GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|VW}YsNAr*6yQxt?+o{RlWfBY=v$Jf8?hyUN-FB#@L`v`|ny5bT; zo)sVO&yVNve|K+HavGafdQ!rV-{18Qx2T@}Cw|1m@R6y)wmrZ8-#snlGZFyM> zH2nC~^`Afg{>tPZ|EC{3bZ;AH21BM^0?VQL`a0tqJ1k92mo1b#c)I$ztaD0e0s!*Z Bzd-;1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_3.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_3.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b4069916169d0ae83954064edded5c9f2f859a GIT binary patch literal 516 zcmV+f0{i`mP)fP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9J+u00d`2O+f$vv5yPW(r3n9&!_09j)tnI-XZe6}y$IQaYz`zJJ;Ll%%+BpmU<24|y zuHpZ^8#n40{(@ZjpMjZ)nZY9@s0n1ij~~AoYT}~tyWrNviwulFC%Xj&HU0hjj{)S} zlJGD_WHnd~NGz@RKfk+!@!#LS3=RQ-O_ec`jM&s+H6Wp=^#9Vy6BvO8FdW*l38zM^ z1|%dTFf3iVlu4T_%Lot9An8H{%IT$=GOqwnq2Rc72j5Gs&1MU6(;RC}T zf-#Q6fbT#5GyMJei#**R1G;n47-#R;@&DS+okYhyG5`Q}aDLT1;p*oA0000EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*10022jL_t(IjbmV-Hc0d`_)oEBvJ64i)Sct@pCm)j zHIwCvL@$H?FwKYNX^?LSMS+NH5XFX!f)ND(+cY0^=WE^q00000NkvXXu0mjfA5z)O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_body.png b/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_body.png new file mode 100644 index 0000000000000000000000000000000000000000..21db389904788bfce4d24a37a065bea9c7e0b23a GIT binary patch literal 622 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_3.png b/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_3.png new file mode 100644 index 0000000000000000000000000000000000000000..5a7bedd483f78bba0501fff40cfb31ea211eee82 GIT binary patch literal 613 zcmV-r0-F7aP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1005y$L_t(IjbmgW0VH}E{72@`-*$nKg%nL%N@5IR zBD@TWa#tBd6wc;2alkMAQ}iFA_ih$s5@2QFgrRjlaJ6{ z-Bta)`auC7e5$H$kIyAZ!dn7C5HM)lHsUyj=XtD?=Q)1)bg>a!6a{2i#xzYZO%uNF zBTZA3Whq=%K=86G4A*tdX@+57+qNyUBHvCn>X$N8pA^=0oea9JL*MrdljEfT1!)ZQBm-c7>n)u-jWU!LlrbVTf@YFX5dzwT|QP-*+1PI{!`J Y4=K-JO{B0iQUCw|07*qoM6N<$f|fpn4rsa7qciGaiEcW3Ycr9iF4g~L%JgMOp2sez|J0Yf!~REJ!lb}Z_At;A22WQ%mvv4FO#n%*F<}4z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_blade.png b/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..1a166ce7ffa5ca07e23f029f3500335d68452b9d GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|V7M?DSAr*6uPCD;<*g)ji{ms5+30*l4z8q>~6q>j~eBGa$jC0Hy zjxae~;tA-KU8Urqy^-D5RXt;s)v`&~JwEU=SQ?D>_Z`O(t-dg)uSw#aqQqV~j0dtks;C&8pRgJq7e?w+0Zt{-BX zu!(JD)`DC4H~JMm{Fp1qx9@E>OGkUi*>0yPR;6>dzU&k3diuvqQ|BhYvJ^&p+N+ zFo${d_b~3})5RwI87mTVle7=Gh!<)v$o^yhfIC5|;Q5(=Gmn8`%HZkh=d#Wzp$P!D C^to&R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_blade_broken.png b/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_blade_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..06ad0b1ed0bdfde2a5c99463c922a2c1d9184bfb GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|V_MR?|Ar*6uPK@Zn`0_J@`MYi0^ign2iQ|Q{kxb)T* zmY|*`TUA}}PUqrU`lH!CwqaUW%aXm4`CN7!KR=(W+&$g${!C-%AI`GdZk^#dBY5_n zH}~fgO9Z84+if2{e);q0nY2v>M_E)9dt9{z3shqFs|go>Fgx(PqUGrwt_VeLr-XRz zV4VdI=X{RcpU-E1@1R}tlHE+3WcGUPjpJXnO3n4d!^(Lwq8fQ(4}Wd=wq??zE31tQ z12`F2gDqd(`o&hZRX4iJPoMX1xVy@NYc|RE#h1 zt$VgEo~j{XZQAg(ydZz4xyGj__LaemQgik0e|x|5H^|nwEo@;rX^MzqH7YbX!^-;a%lBhh)vk`PyPdMc};z6{I%65fI-XP>FVdQ I&MBb@02kG_4*&oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_guard.png b/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_guard.png new file mode 100644 index 0000000000000000000000000000000000000000..bae7e5b1f8cc0e54ea136bb964b95da15ec6cae7 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=a_$kW9!q+(9;pa1{unN=HFmF_NP>yc{6bNIXD<$uY4|B@4uk`q^) z_e)nf*>G#$$^Wyvi#o5hBstt|S(%c}CVk+9$F{f*Mje?mQzQds`_(igGBX_hC^Rot Sa9$(ObOujXKbLh*2~7Zq$Vx~6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_handle.png b/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..8105eee3516582e0304aca42efacd1bc6195952d GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=a_!_&nvq+(9;pa1{unN=HFmF_NP>ydIWW|k7uV_*KZ?T3fkB;Jg; zU7!B1e(wMJh|1F09%YWNKVALLpK~W5{rT(rA@b6WQ{EOZ-wIpz`~Rn##tYKyCz%}P qO-M^kn=ol|_9_lu6;ERh28QPn3Y(svs_+2X$>8bg=d#Wzp$PyS$5WjE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_blade.png b/src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..4c55b014f501223ce9a096086835ba8790a5d657 GIT binary patch literal 599 zcmV-d0;v6oP)EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`Pol}SWFR5*=eWFP?~dKvsj=Fi`Dfsut2jao`#3=9km z4CY3U7(^9W85kH0{xcGz8KzN8gqJ~4?ka<*A}d2zH#5WhZ5J5v8UWKQCc+CBJ8I@WlWC002ovPDHLkV1j|n{Vo6i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_blade_broken.png b/src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_blade_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..a46581a2e81f8582ddda387102193e4cf89204fb GIT binary patch literal 591 zcmV-V0EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PojY&j7R5*=eWFP?~dKvsj=Fi`Dfsut2jao`#3=9km z4CY3U7(^9W85kH0{xcGz8KzN8gqJ~4?kdClH5_mk;57iISxkf%E_UG5U55GFF2MB> zYi?D>7ihr3st!u>q{6B5THHJ6;zM3ouM3#dfSNn7{1;EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoF-b&0R5*=eU>F6XU@!ni7$eck;6IE#f7=B{oI0=p pWX&W4iZnAYFfdV~nJNZQ3;+eL2fFJa_+EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoK}keGR5*=eU>F6XV0eN=FN6PyUIzb(RnLU3SxZTb zBnuhQHD9~;iedh?3yk=+p@Bp%ga6m}>yqSj30nThUt4d(~@ZbX;sO zJ?f>o<=TYedC#8o>`;Bspp>oa#4&#oN7uXubF7z6F*v4h?8m9uLM5B0Oww5TrR@2C ZCJzN!{Wq2ucLN>3;OXk;vd$@?2>|bJMg#x= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade.png b/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..f93e5a70f9f94767096dddee7add58e5f43d5527 GIT binary patch literal 245 zcmVVU3`KvE6Ae8DLR1XE1Pnk8yU^Y~48jC7w5*UKN+h40BIJ+`a= zAMwuwZQBz2o2J1$&z_b1kaDZ4A}J-TwOE!VAS$Q}!SFOqsOuVC*TFf5bzR>V$dTf) zvn->&?`a%I;$lY@c*Vh455qu02$W@sJkPOh8}@w{vF|I06WpmN3K(NN$odSk|7QUn vS8MG%6H(YYL&=wmD5d<@B}0$#h7EiG{RTSp7RY@=00000NkvXXu0mjfPyu0F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade_broken.png b/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc7b22a70d18a728579070052896e04afee5d55 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b3I)gLn;{G25jVIR^%~JlvR~Y zVwQTgpe(C6P<>|BA@76+Jm2%gMgGj44~~!JNlIT+63aJUi^%oz&CQ zk757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwx~Gd{NX4Awlm!ACdZY|)@Mz4o`uu;`ycGp%^}tFu!+;PvS+95-~aF9b_RtT zRo?nP?~cx%wglcICskW}T!okY`Ty%>a_r+ht^Z$7epD#cWGwcJt4P9I&G+y5gU8y= oGyYh-QC)xb7Xt;+fE)&f_fJf{OpG_D0G-I->FVdQ&MBb@05L~ztpET3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/dagger/inverted_dagger_blade.png b/src/main/resources/assets/tinker/textures/items/dagger/inverted_dagger_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef0121b56a530ed84206273240d4bfab3faf720 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGwx^3@NX4Awlm!ACE?jMRcl7i>V?#ruf=vd7DXs0slTsYMKU(^~ zf4)Vax~Af}1uIuwa+$=vY;DZX{}(!gOPQFMc-G(FlNt~f*mhdbB;nnwtN+i(?2lAe z(Kzzq>+Nv1Z12y@{%~}B=9Dt1zWVC_^7Z$bvcyt;e0eF{+`ZB>IHy2Bd6U!}wlhpw z`wBjn&28CXad`Rp`4Tx>w$4&w`XhPq>O+$USC(q?I5{2Sk+-i+*$@z%$@TsCm7ePj zmb$$?mT%|&_YDb^D9AjP&A{QaQs?-}i5koujEmU}fS!+h757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGs;7%%NX4Awlm!ACE?jMRW=hr=v|5qDdlIS#Buw?oF|1*o9ziMe|k=R%B``Cxy@8x&MI5L0QUH#wq&;M|B z6^#=MR;@Vk;s5{t%i7-PJlZqi^2NXZ|IFN6T2u3fXa4@Ww1A)q`LFaelU%}@FE?D` zoc!C?3TyK^f`G3iO z`}%(=Ga>@JLXG2?9Tu!M;9u^xh)02~N9w=<28OfAKHRK<{;z-@WbkzLb6Mw<&;$VE C$&(KN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/dagger/inverted_dagger_handle.png b/src/main/resources/assets/tinker/textures/items/dagger/inverted_dagger_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..eab91d9d9b267156291a653ffc2c13a5f8fab024 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=a_$J50zq+(8T$^wB6JyHf)48A-o=Iws)|0FZJ#Gk)45=G9=5}rm3 zOMZS_8(r#f*7rz;o8f}8e~5Y-2N@+SV$#Rx*!4 tU!1+!JfPUsB6HS5wkhrHlhz2bF~lV+N4=ilHyvm%gQu&X%Q~loCICTXP{RNK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_accessory.png b/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf6b6e73d6a142400b334ecf2e76f7c8dd657a0 GIT binary patch literal 527 zcmV+q0`UEbP)EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoO-V#SR5*=eU>F6%4J3LQ{7>{U_)m%+CJaMDelU{mjuLS(gJjd0s!`_9@Iz^ RYo-7I002ovPDHLkV1kfo;e-GH literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade.png b/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..0d9042c0338e66d1e68ffcb7fd8da72bcd6b7451 GIT binary patch literal 554 zcmV+_0@eMAP)EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoXh}ptR5*=eU>In?NQ&Y_FN6Ou_WW%Z7#SEC7??=W ztfeHz;9#bVB2JV6FwJ5jybNacw@~B=dI4FpqTE%6`D-}f&L?O9vStPb28IKt?xJYM sYXC8taT-9ZW`Zt&v2kf01%m|u0PhYeqHnZl*#H0l07*qoM6N<$f-~XnkN^Mx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade_broken.png b/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..10b5fd31ce5a89459d95ece09f1f4435cab72a11 GIT binary patch literal 556 zcmV+{0@MA8P)EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoYDq*vR5*=eU>H&$(aYd}qL;ycWHBaEG&3+TFgTbg zGaws6lmUre2LH8`#26gRlo`zIZ=uLBl4A3LQ+F8{7#JAlZ@U23$3l$FVj{e7F=Wkn u4S?A!Cc=x=W`YI~vY9A=E!sxGU<3f3QY7JV#K_qI0000EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoPf0{UR5*=eU>F6XU@!nibb&-KgZ~a@$_xii-DQ}+ z?E;28UIP-n4E}2=i7{Ne_lhXZ7&af8r}010%iupr8ey8R@7E8YUrB^DNWeU$8W!Jt_J^fy_V_(>B{?9JzM|) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_grip.png b/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_grip.png new file mode 100644 index 0000000000000000000000000000000000000000..9b694d9d780f071260261ff9cc24abe12ce2540f GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr*{oCv4&lE^MlpH_LjpR-iQup00i_>zopr0GiA;ZU6uP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_handle.png b/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..fe26fb03e20be51d3efee32c27e3d87664c25784 GIT binary patch literal 222 zcmV<403rX0P)VD z?>k=Ch2uD4YuQ&z;G8344CZ-;Qp(V(dlabivMd$0);`v>41r*!6bd1lV}HUocN#m! z*wuL=$a`N+bIuS#0O#DzxQdOh9#KjO>$<{m99=MZPR5uarG)2sg4UXH-^I3VNYP8b Y0k9f3fOC&S6951J07*qoM6N<$f`f-#4*&oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_head.png b/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_head.png new file mode 100644 index 0000000000000000000000000000000000000000..c20c8089ed0c4066e210047e7e2bcb2ab1158d3f GIT binary patch literal 267 zcmV+m0rdWfP)&hs4Wy25o`3CD3zRh7CmVCzYeplw@to(EQ*rU}O$&~+V0 zFk%i3g)1y*97i0-A#FhrU|m757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=cb&C|s(q+(8T$^wB6Jq*md#PxpJr$5VKOAHKbOP0QFI4R}8lB3@L z&PQ)p;TIIv<{0DEb9;VvNq?Bd*^6o*zFtL5%GL!|b$4JO^0aco#G=GGtBB VZ9l$upE%G(44$rjF6*2UngFeDVNd`7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_grip.png b/src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_grip.png new file mode 100644 index 0000000000000000000000000000000000000000..07e71f09e5d7145dcebac04ad9265bdaff18afe5 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=a_#?!?yq+(8T$^wB6JyHf)2Mi1stXcZ@|NZ^-2j|@T73DUG_s945 z@`vXYi@$Ox`F!N$|Lo7jo<=Q8m#=HvxU&Ayf79Rm*9;8}C%$6vkhmiH%-GC##+UgI e|JP6AWnl0~R(SNc=YS&69tKZWKbLh*2~7ZOs#6O9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_handle.png b/src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..333b9630a85fd6fb0ce0e82b5257870107b4db68 GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGgr|#RNX4Awlm!ACdZY|)@Se!b{9XV3ATygRuW#GCNltE)cur(x z{jL9X=ciS+@n*G{S%p#)0^)xD|MvEFY1p!5zO|xDEliV5751%p^#3Ne_-mQm+*!Z0 zPk+cdW}vWf)3g73e}8}dW{u8lwW}e5S9r`6w(k3AZ>%iLtSl^ic;@HluXA*DX8k(l z-EoP>tf6)0)Q4AY8keqFvxcW{+cw`=*PkxgY|;jM*L7{&lK<%cVs*c3hDMW?h$k_0 oykNT(WtjNsfBpY|6LT0C&Nn-~`Ll+78_-V-p00i_>zopr0I-0FTmS$7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_head.png b/src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_head.png new file mode 100644 index 0000000000000000000000000000000000000000..cbc74d87781030b67d1d3bc73635e69ef81c236d GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|V9G)(YAr*6yQxq6|qW3+j4@+TD-Xy`jan|y65g+S+e!5y(dwSY` z{jRPSX{RZSwhq4D)7GsJ77<8^*qRb~_sG-J|DU@%@hE0Em(!p`e(!p6T&LUo1;KBVb^B>wfTLpy(iE?W?I6qq# z@z36p$&^757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGo2QFoNX4Awlm!AC1XdTk`eXTjvv9D)ZZVxd@zVs(drV>ses=z^ zefGsoyEwbW{>(QncZ@xLsP(`0BgHlW6NV)f$M&$6GBGjnu=B~S4Gs!Qi!e#Ai&YQU zBa^|ADE=os;lb0VsRDw6i2|a6sTChTu{xI&B?Vg=>SaW3c<}#M=<3%;jvkeCaXl(A z&%XZLhhJZ_+eEp=u9fP>eA%yK$G4w5OGrrKc4K4N|7UA=P1lb%+Eep&(!DAIP22tsA_P;x}hy*N5Mut1)D9Mjg1o*s?0kQv4TPB5_eDIqa7@6C6EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003Y~L_t(IjbmUK1&o9gBzhVAmloq=;OF6BD4ntk zLp@#tkTt^qx*<&X44A*|0^`$HpBNYz7#PGvcp1b*crn!AH2`MFwR^7^7#J8B4xGA6 mNI7nh=wEX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1002!%L_t(IjbmUK1*2dTFfcGMFeZ8#{D*PoZ@a)q zssStv3=9m3AwL*I6T49uiD0OA6eAtdW&U|;|M*`^Vt T{{Uo200000NkvXXu0mjfG0)hx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_handle.png b/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..4843a672d01420394430b7427fc1edaac8eecb60 GIT binary patch literal 576 zcmV-G0>AxEX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004YRL_t(IjbmUK1;ZUAdKvsbG*9DyqL;ycnrUXl zrCCc!jN#h7R}AyFUBIda2AHsEb}&;WN;8HFV44q{x=WO11_lNOMr1z{>uhAe!oa}5 zkQnlVK~#~Ip{tuT%?u0-3@i{02LBU7elRdFFq5Je;R2W;BEX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1005IoL_t(IjbmUS0VH}E{3k^{hUV-0b^oIq!bGfQ zX)!*A*Y|%jl$HKPaS1^KV44{i7#L2Tlfy8Cg;+1}^KifoF=u$hP*%#oz`$VepOF~b zVVW5j7#PGvco`TN7#I$my2~(s+XY6v2EYu_QWAq}MApo}z`#Jz0GJ^TX37i)PTgf- lU|@i2CJ9iK21dbP2LKLQH#S!MsLucZ002ovPDHLkV1hpY{Tl!P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_head_broken.png b/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..6dee37c90fa84fa4407e6bf96e8ba7c7a6ca63bd GIT binary patch literal 603 zcmV-h0;K(kP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1005UsL_t(IjqQ;k4#GeX0Otq-LBTX@ND#$URiUf< zi#`Ir(+{AlYpEbrbqyY#K$@%Crp4T05QH(SW^OkJ-y+WvJDtkHSKi5nJWK5P)XyT$ zfXV=IBs}jgrje!Z3ETAwfa`5fdwEcljd2F_b(H}m43IDYutnJz<8wkBiAn%ebvJI{ p3}_@h9;oULV3a@N{rmp>6a#|NFpaMvE!6-3002ovPDHLkV1g|Z1R?+c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_handle.png b/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d2edf22385cc13a1b54d254f92b2b3e88e16ce GIT binary patch literal 279 zcmV+y0qFjTP)x1eaw=(=<_4Ri^|h^G9g_ zls%54a@m*_Xi-}NFngXy!!S_Wwwryy7^k{Kd=m5=MbV{TWELpfbzSQF{;!@9qzV2u dL^EDEya7F5Nbg1qzOMiP002ovPDHLkV1ltKZ>9hM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head.png b/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head.png new file mode 100644 index 0000000000000000000000000000000000000000..cc7af35ee9748ac1849d29612c3f09ee80daf097 GIT binary patch literal 454 zcmV;%0XhDOP)zY;8LEk(pi3$;=aBvnWo2ubed44b%F zUAEuA+apVoRk`n9t{uD~DLW4njShPU!V|sMTtqOxOK>hi%(P zCX-a5>pC8fN93h|e>;O?v1fh-#y3AMnXbUGcy)#Y+IWHK2^m`oY zK{e=|%JFy%w&1-9n(!g#w}U9E)hb4#5m-bi1tyluWlX12u`~SFcR(kJ6DDUNa&Cbe wpiJoGq?Z6!eRQU&XyPZ57`u-Vx0z&wzLDkLEE&u=k07*qoM6N<$f>3?LsQ>@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head_broken.png b/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..6fe6db112ec7dee499adf9218be360deb005f7e4 GIT binary patch literal 462 zcmV;<0WtoGP)-Cyit!7H4lKJH8`(&hzL6oc23WY*JluoBjuh+xl@$m4D^ip_m zD49&ES|k!dwOU2L-$x>mKrk4TOE?@xx7$^$n5;jHQ0Mcxsu0EHa?#Chx5NE@M<^81 z`FK2Hzu$Y_60kZepU-DGQm4{vHZdBFz^_uNNGA$c0#=X5<5;iP@cHcV`2Bt?mrLYw zIiyl4Y&IKQuUBlhTiI+crnM*#2w2?y>-D;n*=#16$z&uOjRp>f16ZitZo`GZfzMuv zfYlkrnG}mfJfBY{RDGrqij%m4F`O z@faN3>2%^z{SO8M>5IkUwFT=<$o3`vixEXOn+1Di5@QS)$N{!mE!pYL4N$sfK!Zcv z2z4f+91e$ShdQBClHOXNk>og8Q1vP&lZhS<@BSHm1DZFj!vH`%@Bjb+07*qoM6N<$ Ef{Fgs4*&oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/frypan/inverted_frypan_handle.png b/src/main/resources/assets/tinker/textures/items/frypan/inverted_frypan_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..00f7585f666d40a58c2695dff79a7544aff4c4b9 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|nmk<`Lo9le z6C_v{H%LAB|Np3YnpYP?SN8H|% z@)M}EvxLQ``0%5t|C7B>WoJLr`@=7+e5>KuQSJZLYD*SmsNHIqrn>rH^%3=}+Z^Zm xu43$&dpi8j|L^bZon1p%l-pF4+XR5_a@&);`&Htc8lYPx$!AV3xR5*>*l227YHbp6s004_)!eWdeFA!&nnr?Z^uI=64TnVbD6`;JoC=*3Kv9c|E=P>kfsFd z*X8f}!nuPVJ}HACJI%ciz!IT#@J_L8g0t$P?H21>grDf7=j4?T)%5XUR)1*qZS|yHS z!bT&SRbUJPc%Fwb21|rdk^oAc8`3nLRa-1F3lPD!ZE`huUV$V@Kp;&sCKH3}Iv~P= zbD9xr77*NCmqxuFeLp$DD-^LTL4IH9x()!9%4NR9F=4$P1=p^g@x;*&RH5^^L%CcA z6xVeDp<1cZ>vkEB$6)jyK6v#;A3fa-&16EYRzn2x+|cQC(LCqj=4KS!x^cD-rjYib zBEsX{?a*}`vMl5NgRO|<=ZvM#1x!KjKPt8jIRvX$F6{pg;}_96wngTc%>w`c002ov JPDHLkV1nS)?%@Cc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/frypan/inverted_frypan_head_broken.png b/src/main/resources/assets/tinker/textures/items/frypan/inverted_frypan_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5e5e97c40b1e454fd982a446ce2674546f9466 GIT binary patch literal 561 zcmV-10?z%3P)Px$>q$gGR5*>*l1*z9VHAa*`@S=oiPe^3s@7yD_|=7i3zsgWASi{3X#PUux>zHO zG88NZKNc>9ZX^a2Yf6hED7bee?IH!MrHhEQ8fy|`CNr-q3uzj<_H6Gx5BDC9u!9OS z^M+UqnoZK9=Vj~M>S}!R&am+d|6a}$5gf;%F#F1&H0cY&VvIpVwg(i7FU^xj(|jzi zdb@ghu(X9`$H_gs?*+|}LUG=RhybV#^YdAg&p+lxep(J4NcoM%AL{iw)#?vicMm}; z;O5knSD2YI+X4teN~#!Oz|Hw9;s; znV7ilQ~TXk>8^lH(CfDbts#Q+@R=R=|3m!+_jIt$x)BP&00000NkvXXu0mjfQyKd* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/frypan/magical_wood_frypan_handle.png b/src/main/resources/assets/tinker/textures/items/frypan/magical_wood_frypan_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..6cb553458757e39d43e340e061b45a9e9125e817 GIT binary patch literal 571 zcmV-B0>u4^P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004JML_t(IjbmUKSs>BN;D4f*!GB~iCXzIV{2<@v zL-RB+Y-eC#U|=LhvxAv3!+}$G8Rl=hfT13*0f}A)|Fx9F7_QxWg;g^HzA%8P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1007TPL_t(Ijop$>4uUWcg&ziuBq|$2Xk7FHE;t9b z;AGyybGYyVEDQ~CQ!&9PNnPMze?X0K<*b_5zHfdy9^OQjCW_9R?as6B9ls7%KiK@k7>xG-0M3B=wl+Xc1$K7M za>UF-82gZ-fhZL6f*VzgUS$V>F!nJCT8OSw3<9WBDH>dB1t}Us?`^?uL!SZgoWaLK tY_oCg7b@q?@Ap85;M+~?1KGwuiaQv;bOVM+IRXFx002ovPDHLkV1iD%8?*ob literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/frypan/magical_wood_frypan_head_broken.png b/src/main/resources/assets/tinker/textures/items/frypan/magical_wood_frypan_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca1cdcbcc4ea24e8af807592a1721be306e1bc1 GIT binary patch literal 710 zcmV;%0y+JOP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1009C?L_t(IjbmgW01~|n{=?Yww_RXFm&Xu5*C;K< z2N!$#>Jx@RSPe+@GWZYE$j`$87ytO>2izc-AxyY5w=6is2(wX4gcoiYKMx0kv=|@U zg)D@;ATRll0YWn{Y(L7$fbK0ubWPG?d~j#WOFm@Sew34;Am{o=`~iHUIzs07*qoM6N<$f`7U>^Z)<= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_back.png b/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_back.png new file mode 100644 index 0000000000000000000000000000000000000000..8625ca1913500b97f6f90869dc9968070d551535 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr*{oCm8ZFD2g~&GYW|$ zG*0E^=5Sz(n$W`LVlc_TU~)YptIWyVKMOCv&yKod9e<$OzsJx@DPyfChvPAcs(nI9 zJy)vRgSZq~YM9QXoU>dqMIu?@`5%Lvdv9{qwiffPHC-|#?8hY8V{f9fW7jX8l6&7M d=4WN2cuuFvV$b3mpMlO`@O1TaS?83{1OULHKeqq? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_front.png b/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_front.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9cafc8e0f134a099dfe39ce461f17b24f86925 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr*{oCm8Y_P~dRQynI%> zf?3=>y|l>W-r3DNt69^fWHJrz#-u1P{$u|1(0@wMg{bbR>?glwn^*V-a4;tIJec$N zaj9>?TG3v^7kmH5#9#VibWl_EjAi!+)!c=zy;fT0t?k^EuGM04tl{2n4(=P7^6X|7 aADAk16q~v@3K)TIVDNPHb6Mw<&;$U0qCt}Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_handle.png b/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..56fc0d24e5aa834beabfda45564ef2ce69653c0f GIT binary patch literal 256 zcmV+b0ssDqP)pG0%__4EPb^$wwVF)QD)^)`+P5Ye{ zyUq)fRaF_nMNwcFhQlyfkGAc!`@a7PeiV5A-=nq(+PDM1yiG;f2gvUL00009&drN8Q-IiL6~a;L5}UH955beUY2c&;wTm2<}=I20Y$ew|gs zeDCbs+K_(3Z@(lT9&ak<`(DeQt-EB(IfMB3r!8_n%_-iu#?R;UkNxEbT|Tg>Ju{M< T-`IT}=v)R*S3j3^P6?->!}8okXtd!t*>hj&psD+qcd`gT!$hBS{h{ih_Bb zF-;Tdx;}O1;X%iaWH}5&Rv{;XAg}=xCOMI18Br9y9za9x z_xnLkc%BEXLz(RR&cb}U0*R?U$T!=z4_((`7zWC+M4F~7KL$j4RkTXq_l)-W2iWBw b{y+lnCQWCiR}Kj|00000NkvXXu0mjf$I6T5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_back.png b/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_back.png new file mode 100644 index 0000000000000000000000000000000000000000..1249dbd38ea4b97080803b2f982fff416db3c871 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|>O5T>Lo9le z6C_xBo@B)oJoxb6et-SsbcY0|qPO$+*GnD>x-=`o<7&>kH&MU8o)&Mrt{-Rc=kNdi z#+fFwCuc=QL`cT%uQ?fT_v$^7)aK^>Juxx0;^!Yr=g9Qv;Et)H%FLRL tJD%Ry_*TBk>cfq{{M5lhsah757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGil>WXNX4AwKmY&RGpjbVD&1YocHtny_m(OD_2=0q3y2A(Z7AK6 zp5fz}sB(*8`;R66`Q>d^2n&j(85o)7A6h24oY8LO%>VLt_6DmfX`M?*%e{LgctUfi zaTqhx=Fk7`@2gzw=ixHt;GJW;R_@=yusn^2S*iQfzx%sOSNp{gaa+a~jWgaGmGB*zftBGuLfc|6fboFyt=akR{07J)y An*aa+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_handle_broken.png b/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_handle_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8cb1b49fe21c1f2da38c9bb8acc581fbf29c62 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGs;7%%NX4AwKmY&RGpjbVD&1YocHv;dms!95m%qD{C?F`9x?!VP z;)&j#M3q|&S60pXZ@&KiipdiuB^4MNXLuc5B)OVVax3rubQ5!ffB(PFcMR~DaPZ)* zJ({LkQmfN=n2ToJ`nP$5Ly#J`Hg|LP>fqoo7Zty=5^O#zS2ty4>b7bBOoub&U7k%ejO*KI1VH!>z9lHqVr%z5#lW!PC{xWt~$(69CY- Bid_Hz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_head.png b/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_head.png new file mode 100644 index 0000000000000000000000000000000000000000..82b5fd927c0a4e80a3f34d9bc249589c5e880911 GIT binary patch literal 367 zcmV-#0g(QQP)Px$DM>^@R5*?8kv4%3zfC=~VbLr$tagOii0sJ=>S_oR@PfLQv6KdOnE2?z(M_W|5zU%UVk= zeW08|K}|-#=HCixT1zgSQt?C_3yV|dM3wHegc6)-E!k9BEhZ9}R)>dXlg?9{%W_Q> zZyO(ySdc(~rIlrTA9}9?yskkI5T7f@QH7hj4Ep`x22o%qxtE=tpJRR@&eZe_U1MlH zw(yL>$>-Jh*hFxHP5b@YWv%7>xT3@ttO$6<5R1mRcU^|!V+9FDDb^cuU9GB4tIdn| zOw)BaJj!LaY&+CE041$uJGq}(UE9c%^yeo+8!oh#J}?A+wfUbv;0-dWgR4K|U)%ry N002ovPDHLkV1i$apBVrE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_back.png b/src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_back.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ee81590d9856614111344a972eb513ffc9efaa GIT binary patch literal 547 zcmV+;0^I$HP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003V}L_t(IjbmUK1&risO!PANPqqOy33mS(7#J9y zzWT(#M5^ZQ9Jl{&cCQ%R>|T*>^TLMU|A*#j{J*|m_dm=FM7sc{fq{X6p{tvjVg9xY lj0~iN0kQ!w&7)wj001`>9)gZ?eI@_^002ovPDHLkV1n4S?a=@L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_front.png b/src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_front.png new file mode 100644 index 0000000000000000000000000000000000000000..4019f7d281749d9da293792f9d64d27bf161a1c6 GIT binary patch literal 555 zcmV+`0@VG9P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003u6L_t(IjbmgW0wj7F{D-mUZ@a*VEXPEQ=ERU6 z4ANqJSmp5=kmzObzpV5xoR4lh0|NsCh5)+F3=9kmC(p?-lup@&RV@oX7uUitt4002ovPDHLkV1iQX?ri`7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_handle.png b/src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bf2bf353944d17dbf95290a45c2804de2121ac GIT binary patch literal 554 zcmV+_0@eMAP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003r5L_t(IjbmUK1;YR^;*(7DGWf5hB*q{n!pm^r z)Ln-8+b&?J$7ujDnsFLHtY)kRkfIsG08%xh7(k9@xB=v9hTD8-p2q*{`*r^(dKvsD sS|b#&FfcGM%wNO7z`(#jn$1uE0A|TOg3$!4P5=M^07*qoM6N<$f}6hX_W%F@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_handle_broken.png b/src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_handle_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b77395c4c6d44882f9cc7a123e0354b8a4f66e GIT binary patch literal 568 zcmV-80>}M{P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004AJL_t(IjbmUK1;YR^;*(7DGWf5hB*q{n!pm^r z)Ln-8+b&?J$7ujDni&`v7?`kWgs}-}#xMX`GXnzyLCsVFaMO`(C&gAK2BZLUFjIz0 zpnC@=Nc1xJe`ub@|Lgm8{}ZhV39v9QFfhzt!$GpsVE_PD88A2;ld{?X0000EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1006E@L_t(IjbmgW0wj7F{D-mUZ@a*VEXPEQ=ERU6 z4ANqJSmp5=kmzObzpV5xoG&fLhvFIr1_lO3Y#NbmW?*1oIC)Nvfq{X6;o}zw|LLnw zaIfGsz`;xz&VTjhGln4qy>Q^vT?{dP9uBy7@VWq>OU#WPF)%PNFw9@WK{yuXZ@a*V z>=JXMM+~BhtPJzla4^i@c7c(g0oV-b>SiV!h}gV>Y#_1vMgctl00?kJg`8x-!vFvP M07*qoM6N<$g1$=-)c^nh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_accessory.png b/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..78d2e79b334064a662399b2f2e5ee6ed8e9b6829 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar*{o12*y=P~b7XdqY5( z{{#E{j||U0a5B$VFkHgAl0#7-R(qmmVbWMJc~+j31L zd5OTGOD7NB;9a2<F%=$iZCnf5HGr;Q@O1TaS?83{1OS;oLxlhU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_head.png b/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_head.png new file mode 100644 index 0000000000000000000000000000000000000000..796729ea5e91d02702fa017ecba1ed9a2ef31bb1 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr*{o1GM>A6?xv+#R<$| z>^!_6KxU?Q!i5YI3zLHaWtmOu@21T5vG=Suo^F`7_1c37&8JqDs{hI-Zxx$UERcNX z>8E>_r_XrKeD3F^C}oLcZ?B!-)VL-z1#wlqH#l}+rU26!OV9W}L0&gBS{kCXpUgRV nxZ>>&-_*xf;{S+LOlLAztT&j{mpbnQ&^-*Eu6{1-oD!M<$)-ue literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_head_broken.png b/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..33ae956c28e38e68f9da5ec23af7af1a4e09b31a GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{+=$5Ar*{oCmiHtFyvsd-DC9T zfZm%sNje9YSH#54j-SWrA`o_`F*S33;MITAXGXhJnci%6GnQVkJ2=$W{>#F;j~yJR k&ZJ7*T%FI{ZvKIBiKWPMhpMuDK%*HvUHx3vIVCg!01Egp8vp757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=cb&(p;*q+(9;pa1{unN=HFmF_NP>ydI;#prmI_y5wRDw1mH%Z(?c zHY}WGb@=M;@2^j#pZ|G(<}4=jmJH^s#mbV=)7So}fBtgwu2q)B|FBM~5uVB|V@rlD3PTs_r4RweAA3q;|bP0l+XkKNTg~y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_handle.png b/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..94f7c50406d21bdbd717e565db5ff4a7eb7998d7 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwxu=U`NX4Awlm!ACc!HUCP1pGsFC~21V;bY_YwLg4KluB5*FM+o zf8s}v3YxGSW>|kf;h3(2^SAwV@z-}&eEk0@;*Z|JSFG|26jz(A`(OX!)M!EDFAxxDyzrr!C?=z~0u#$dLWtp*B*=%me6T22WQ%mvv4F FO#pbbbk+a> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_head.png b/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_head.png new file mode 100644 index 0000000000000000000000000000000000000000..72e554ef95934740013bd1bf2edb6bf1d11245f8 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwji-xaNX4AwoH^G2?b*4x567#ev9;Czm(Y5=NK(>+LFbIa)8qZ~ zS1=cz(b18x64U(|FDUN3MNwzZ8ySc0|Arqve>RNSUpCb-)_L)|+<%AuhjxB+kvzl{ z^fV{`biuz#Ytk6S^B zKf~kvq^19tE?FX>CH%;P+eKorO52tT#|;`{46+WaU{qjW*s|Jy|F3lzopr085f<-2eap literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_head_broken.png b/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..bf099b0bd34860a0f571c355f5c66e611d87764f GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=a_#?!?yq+(8T$^wB60cRT~d^z*K{@EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoTuDShR5*=eU>F6XU`T=P9Jl|8UIzcs#hHjT;M%=c z3=U?>4Csb1lH!U)FN6PDN@5Jx?!97|zwH7^dQl8HG*1KW9TrjzfY@yCzpV5x0|NtQ gn2_WW1_lNO01KfWuuEDndjJ3c07*qoM6N<$f^fX)i~s-t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_handle.png b/src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a936b3baa9ed2468419752f80ff18428fcf94b GIT binary patch literal 544 zcmV+*0^j|KP)EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoUP(kjR5*=eU>F5hL86zze`3`#Vbh!#@`EHpu)5&T zJdOXv7{Y>0aQ?Onj0_A0{~gSf85kHC{zLdA7=SQ@fuJEcO@@I)FN6PDN@5Jx?!98b i=MsX3kfm`H5C;H^^(0c{>4%U20000EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoaY;l$R5*=eO!P7M&wvExZ@Iw8KmuT5U|?VEX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoN=ZaPR5*=eU>In?2xAVFUnQ3=iDD4O}z; O0000!wqZDrTQ2-%XRAGJ9%|!Ovr#AIi^v<-n0x@&5R$#pixE6!R?=Su$ms z6CYbdc6$)lTGK00M;F^GD;gYAIA#(2f7L{WT}Q4*74KZqeD?L;{D+^_6mJ}@XDT{( j<6t_&59TR3X3Mx+`IMtg_!~C@oxgTe~DWM4f5k^PQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_1.png new file mode 100644 index 0000000000000000000000000000000000000000..122df71ec9b41995cc9329d067cee9d62a81ae3a GIT binary patch literal 230 zcmVB`ZLc~TFg#?8ybYZ&{hEbe(fBcC5`hf$4 zkaV7B>P0{6LdICywhbW!aL&6Rj~cM=ds>zS)>>$-o4dO1<6a1nrfEvO$`|BT`Bwe* zfH8)7o-c5BE`aR3_Z~6E;kUoClraX*xnf>Ek3^XukDr?;r8x~n0Vt(#90#P7L(NU` gx~^Rxr)dK41{YO0=k1j$&j0`b07*qoM6N<$g1lf~>Hq)$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_2.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_2.png new file mode 100644 index 0000000000000000000000000000000000000000..990a8c1504116eb88a97a467a22a593abeae0725 GIT binary patch literal 216 zcmV;}04M*6P)YNbL{PN8;QM{od@PN}jXAtYO{$#%a)NWA&xdB8LNkbqLEN-66p z`n?K`F_kd}r4+E%9zk9!fOB3k#*lM{7~^)f>b~xsa}^;}Pdg9D?DA{(nSn88K(E#b z2qAzF;;Oib`xTmfLI|XkuEXmNn*H{4TI&YAnjJ9gd+)D`H!-F3=;Lff0Pq3Yq%$LK SbTrTa0000w+r)&-~YAfOAeSiF=b`V>U}l_#|~7^^YH2G zR%l@e@+wkflArNp&cbV5{zWmeXSklrESZw#weR$ioeq1;XUwg!ahj6cGjSUGM`Jt2 YFV9WSeXZJh8R%pNPgg&ebxsLQ0FUEX^8f$< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_grip.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_grip.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e2ae81a19778750bb657a0b7290e30dc7d9acc GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`sh%#5Ar*{o0}Qzi7;yMlvwZ6C z`RQ2j@&EgRPvUxJf>shLC3=FQU;K`G+i$zKyRPzmm&ewyvzF2>E{ewwOnfJJ?)lU5 z2p1VK(L6?_EX|`83=?KlR^RQ&&RYAjCh_h3Um6>NA24>d3jTaP!(kWDLIzJ)KbLh* G2~7Z(Av&u7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d889ec774ae2316467ad696ae1936c1b09ed5d77 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar*{o19o#BP!OnX47t_a z+Pc*_!m>TsvPIaUGa@pgW2&`^i-*VL30oAyW%?iAYd3%R)I)Rn+(QzFl^L_&I)1u$ zSi;yO$ZH1su87&QuSprY6`XU_Yz^XS5qL5u&}(L%u*LIf0!&faFZS}!j(V+|ZZmhf kz@v`(egA*tKS<_XqvfuowMj%W8t57ZPgg&ebxsLQ0GrT6OaK4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a71227df55f7aa736e468ff6c5ead1eeb145ae4d GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar*{o0}Q#2C*sHxJiHepub^ zk=@6FGV#oNzLzu=`}G)Jh757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwuBVG*NX4Awlm!ACdZY|y@O0>D{;z+0%d~CtZ8PIZsSMiM+|2g! z^|5vC=l^$#s=7!snJH-P|MCB3@bcF(GBUG0F7`ZW`p@%+=?~BU|Nm88^*1s0@W|ia zpPrDCqIS2TrR&xI=jZ0E+`N5j{;Zg2&q<#TvTfM7(fGuPQ-%c}K2FN9zQK@|rk23* tht+7t31bGA6)RSll!`o=_@)LJ5{XOIcP~)vy$^IKgQu&X%Q~loCIE@PY#9Im literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_1.png new file mode 100644 index 0000000000000000000000000000000000000000..aea5079ecc1a525cd1f6342734df5553a132fa62 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGw5N+>NX4AwKmY&RGpjbVD&0MNrQyJ&Q~%4)%}d;|r`}xoB-@cI z=6~y}z6QL3MVu=H%P90Iu&^dCzWlNX|^Nol|$-0`q=MJ1a>A8#XX>9C&`MAA7=^3dP zO?EDtqhj8`%aF=m=*h`urj|A-r(OC0$Cl5>`{f;Ged%E}d+_mRD8Wo84t#o+1c=d#Wzp$P!D)`If@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_2.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6ffde9aaa98941ac3cfc4b9ca9705764e10936bb GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGfTxRNNX4AwKmY&RGpjbVD&0MNh2i~{p8w+ga)}j1U%8Y|vaviB z{ky;9O@yquynS=N-@pH7gVlsgSdKCTv}`IYFv^%2X}Wg)4c}SZe~gR&$6Hh_Id|dS z#Ei2VY=3_LpWfKqKK&v81U1$K7A0|U{Yth!$q6Yxetl$S=GHcT$+kmv$)Ej&&r0S7 zI}}`AbggR9-~NJw`~UOE#KiE#@2^ohS+;{wXN?a}yj`tIr171G+~RcOwx{BM<4reC cS9#tH^Z~cM>)fm7zX4ecp00i_>zopr01hsEF#rGn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_3.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_3.png new file mode 100644 index 0000000000000000000000000000000000000000..eb77e2441dcd148b318a28097c153b4f92eb505b GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwyQhm|NX4AwKmY&RGpjbVD&0MNrJ=1e_}_c`vYv+zPNnv!NC(_E z|M-8MbNj0!swxs{XXpI1*SDR!Kv6%1> zvl?s$Mur9*jC23>Pu$YNYR<6a?aj^UJpX%mPZ&3JHco7uIdf*?%m493u^;9;1_e!O z{An*-$!1_|WK>YF!FYp_kZj!wwuU_){@tx+6Z)#mv*N_56p@6vf9;h`r>ZD3Fj^Uf U&n&FZ2YP|Q)78&qol`;+0Fx|rwEzGB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_grip.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_grip.png new file mode 100644 index 0000000000000000000000000000000000000000..9b39e2a81813d7fae7b449837af59845822b6793 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=cb&eO#)q+(8T$^wB6JaNon?{9v$zjCy5q7L)5xAs5&|7i6tRjr-; z@4Lv;ho&rt8+_aQ{@9nkb(1xg)^2W`C8fx|Kx)Io2Mhl%Umv$RIUyy<;95vNS80*T zS#HK}Wj(!{pZznxa4F%#_Kj*QBo8wPtnl|%^HTO>_F!Gi#>2+Uz+757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwj;D)bNX4Aw6a~SS=^=mEFaH1kFEJq@DJenGD>(J;|Nr&%#s+_W zpD%d#=B8DkVPM;R`+7r-l`G92nksBt`1Ak#`}-x&&9@0XuC8$4!@IN6Z0ypv)zbL* z*wn(p+Fm|&?Wy3ksD2~SykJ7W+}_qoVP#|Oh@7%yUgb?vd)Q)bZ=GwncjMFlXR1Pc sU8EV9ewYZSGAJ5k9azB_V#vU7PF}y_-~`7^pgS2nUHx3vIVCg!09JfxZU6uP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_1.png new file mode 100644 index 0000000000000000000000000000000000000000..1c6a5a6c8dbae51a5858d317117834f5ab8503d3 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwgQtsQNX4AwKmY&RGpjbViX2^8+WY^Y7?UBlwe;bhTUl;RY$7G! z{`~*?od59s{q+*-?(7LXe*E$w>!0J94rT7*H}bc?zsH>QD7E7I zGu`I3>*6l||6i}jB{5TC*D0?JyA?KX{rrFJ?()|a6+0w&u7u2P$V&^DB*2`dk?IoO zeYN4`)u%mnk(K|is;Wrr^6EA;5j0_7+2%95C0yB&xr22vTaOe26T{pjd-?AU$?Je_ OXYh3Ob6Mw<&;$T%;d&+j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_2.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e92946b196f2be94df3621d0386b34665932bdbc GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwou`XqNX4AwKmY&RGpjbVhVVwdt^F@4q4*|K)U}6&*F$rCo5jS5 zosCob+aG@U__)-GiHYaEeNBSK%mcsVmovWns{8-{|KEoTzFg_FQcO(TuynqCecFc) zpYxI!q)zgfY|ypl-p#$~)~757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwm8XkiNX4AwKmY&RGpjbVD&0LIG2#BDPxEIsPHgP#?0oote?8Cs zfB#Z{eErSOtUSSf@ybTQ<%~;n-~O-v`}cUk&s$%u7#SJc&d;}NJi2q|4vB_mhI^{N z_buGC`L}%-Ggnm9|M(p>Tm1q&CLD~3U(cCg%dE}KeK>vrw*$ip`4j)nUx*89y2~n@ zwMvrt(x!i_PoFf}5*Wn(yJ&6BjTZX$oX^;{|&E+9I<(5fgL$fUainboFyt I=akR{02D@cW&i*H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..10d2bf1bbd11e63a0627aa3f5f181f98a7249c2e GIT binary patch literal 557 zcmV+|0@D47P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003!8L_t(IjbmUK1;Ys>dKvuh&T;!ssy-%Uj+h89 zL!y@fNro`OY}Zl}W4Lzj6~p{(7Z}NQ0XYC}fS3p`Sq3mBdKvt8FjHnYaOy6}&WF1| vQSK^Pw!;k&Rb(aG0ER>_ga4#P9Wnp_J$o5${pBhI00000NkvXXu0mjfuUhEQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom_1.png new file mode 100644 index 0000000000000000000000000000000000000000..10d2bf1bbd11e63a0627aa3f5f181f98a7249c2e GIT binary patch literal 557 zcmV+|0@D47P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003!8L_t(IjbmUK1;Ys>dKvuh&T;!ssy-%Uj+h89 zL!y@fNro`OY}Zl}W4Lzj6~p{(7Z}NQ0XYC}fS3p`Sq3mBdKvt8FjHnYaOy6}&WF1| vQSK^Pw!;k&Rb(aG0ER>_ga4#P9Wnp_J$o5${pBhI00000NkvXXu0mjfuUhEQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom_2.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom_2.png new file mode 100644 index 0000000000000000000000000000000000000000..84953a0a25f2ccdd3f23672e561196fa1f76c2ed GIT binary patch literal 534 zcmV+x0_pvUP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1002@+L_t(IjbmUK1;Ys>dKvuh&T;!ssy-%c22o@H zMJ^B%;U(DsMh2*}wUopduHAdZFn`+xMzUN$j_oK0D9T->%m7hEREX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1002KpL_t(IjbmUK1;Ys>dKvuh&T;!ssy-%c22o@H z#V(-805K8X0d|3++*Qg95LIL)-zkY+2LDNoLIwr~1^~DV3pu2{juHR>002ovPDHLk FV1gR-)u#Xe literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_grip.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_grip.png new file mode 100644 index 0000000000000000000000000000000000000000..d9fb675cbee8cc23052f88904baa364119fba94a GIT binary patch literal 521 zcmV+k0`~ohP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1002cvL_t(IjbmUKz97-d;6E|ym~d&EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003D@L_t(IjbmgW5hQvU{72?9lB&tUOqoGZ?ka<* zA}d2zH#2?%U>dcQ#26SD7#PGvco`0yx(k<|zwH7e3qAw1l*CXpUAy;+Vg9xYM7bKP f^GCrb7{&kq7fTmfltz@l00000NkvXXu0mjf=ltSA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e56f2ba1214b8d02e48e0bea8992c72c05ac67c3 GIT binary patch literal 541 zcmV+&0^EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003D@L_t(IjbmgW5hQvU{72?9lB&tUOqoGZ?ka<* zA}d2zH#2?%U>dcQ#26SD7#PGvco`0yx(k<|zwH7e3qAw1l*CXpUAy;+Vg9xYM7bKP f^GCrb7{&kq7fTmfltz@l00000NkvXXu0mjf=ltSA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_2.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_2.png new file mode 100644 index 0000000000000000000000000000000000000000..be523a70f409f93cd9540c73189b98210a24d926 GIT binary patch literal 532 zcmV+v0_**WP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1002-)L_t(IjbmV-5HOOWIMK`CKS>6lYtT{>V-OSJ zWl)s6${?!9%Fxx#jNgFn95=WDVj{c@2Tt8Zk)OZq0wX~$AiHAzwhJVAc@&I-Ap`)9 Wq7k_-^+Egq0000EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1002QrL_t(IjbmUKXuyb1GSSQ6KOqBH@JVVZiJ|bt zM0gn(7#J87<*qV_DzY+kbu;640U=k+-*$nZ{!uUrh6n%vB^n6fY4(1=00000NkvXX Hu0mjfAo$q^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longsword/bedrockium_uie_longsword_accessory.png b/src/main/resources/assets/tinker/textures/items/longsword/bedrockium_uie_longsword_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..ad5c60b48dc24e525547a516de02b2f8e1395e54 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar*{o0}QziDDdnl6J{58 zmwzZ-)66e^U*QMS+?Ht^g_={9WJR5P`mEnI{r$%JZ^wayO2=k&|JPi)@%i0od(I8l z;?7xmXfB-6^u4Y_&~CM!fRja1kATyHt!+`-9wlxmZxW|2nlL$tYoE(YzKGtcb32b; kh`PKZ>`7AZ&I7v`H!W7ESK?u91v-Yo)78&qol`;+0B2=JDgXcg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longsword/bedrockium_uie_longsword_blade.png b/src/main/resources/assets/tinker/textures/items/longsword/bedrockium_uie_longsword_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..5a6b295661b38f7dfb5c08fddf795cbe075c99c8 GIT binary patch literal 256 zcmV+b0ssDqP)`0$;2+ zjx}jP5a7wfosv@OJkPN#3%ahu;|@8?GF_G>(lo_1O&G^fT#i87VHjdvSIqNl$P|~{ zTt#wS*GQ5CN+~o=b6FU)?fbqiibC`JF81-Is;aaQ!ZeJT+qOO64;Q-vZSR?fVZgR+ zR;+ajBy&_z6v6YnQ!>R)|3TmPhHSG3lCuCpL~On3Go2LfLJp|X|JeK)us(p9UIBfCHDEw7Wm@C zacoEn!w@HeBO#?UBxYHLbzN~jLeBHtBuRoaP0_Y3rfCwpN1*K}im)upO_O8-$;%Za z7e#@ps^I%Rx~|(T4BEbuOkLN8_*v}Z4w|MhLTqC5JfrXX?eWm%<>Q{CZQ>vZFpeX% z*4A391CqZE6iXy zm?$XI-txOpg6|+}fP~X@C9!Qj8&r!YO!@LTEgTe~DWM4fdYVZT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_accessory.png b/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..e57061d2182a407f17701f134c1f55fe7cd6ed12 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwp{I*uNX4AwKmY&RGpjbVD&1Yo#$(NF_59rb|IgpYv!$u2wRKHV zaht?5V^7V~|L5iHuif2QIQQYr$Lc)w|Ni`opFGiTiedtDk@8{5YH_`P>sPKm|KaiP z{#|chU%UGE=hxr$&T)K>&JW@=`ubV5^Je^c|NrRa^jH7>D(m$pusoW7zg|)#bc&=z z$C(rfwk;x0jm`Y#{n~G5KKqA(1N)IIHb#aNQHRS9?i7Ur9n0Y9>gTe~DWM4ffKPQt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_blade.png b/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..a0cc27cdd3c498590fe94987fe0cdb63f8e3acac GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGyQhm|NX4AwKmY&RGp|fI+1UKQ{{Qdu2hJTialmQSv!B2D|I9Zn zjhZ`Wj!pCY`ToM5Y-eumeEuUd}`^*ekzGTgz z2W(g7ym)eeLrDEpL*;M2Kl81VtL846B-AW^;ihN6Sr^F-A`%Ikm-{kX-#&eQx8^~{ zg)N+Fy0@l2xp%EL*wz?_~+q)ovxG7Q7Y}KR*0#T^)A)1(;hQcy n58OQ0w;*i~n*euPBO`;!{J@GDJ+>dfAYkxx^>bP0l+XkKO+2Au literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_blade_broken.png b/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_blade_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..b302adf5e5629cace6906652443512f6ecacab45 GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|V9G)(YAr*6y|NQ@N&%83>(w&?C{~H+^7yS8m^nlZ?ce|JYW@6LD0s5u zKVu^kQ56-#rX!t335WJX{*RQDc=hC|s6@oS|M{o757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwnx~6nNX4AwKmY&RGpjbVD&1Yo#*@vgrXT;g{&E{H&+c%&M3tKj z_gqi^pKo8jPR~$vS!arP$(iU+_24Z|vKvr>MD5^WNR58D|ri)z;tpQGfm2-O`(!iN1<*OETG{70w(# lBp@$&LFCa(?@ejIAeeaCq@qbbCJN|622WQ%mvv4FO#nM}Xkh>V literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_accessory.png b/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..37e43fa37512c9ad5ff6cedbacc3da79aa671693 GIT binary patch literal 543 zcmV+)0^t3LP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003J_L_t(IjbmUK1*3opfDy(>^fLGlW6$4qff1(; zG{6GWtfeHzASS{K6aP=FAs8+wEB(uG>Yy6Kfm3&hatRBjvkm?`m=Ws%1_mZW069Qu4gfI-91{ti6h{C6002ovPDHLkV1nKu;VJ+C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_blade.png b/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..87dcd5e6de07fcc4562d329431c50ea5b1121cd7 GIT binary patch literal 553 zcmV+^0@nSBP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003o4L_t(IjbmgW10;GG{D-lb$kD8&B*suy`j>%$ zfq{XM9L?rNj~M2!;b54*?E)jw24K@nvJ(<~;!%W&Y-T@1~54IoA{ rP6LS5%z!H$5UUxd0mNz^1ylk62YNvF8M#?h00000NkvXXu0mjfMQ!Qw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_blade_broken.png b/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_blade_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..4bcddaf746467b5293bbff15028de55161437fce GIT binary patch literal 581 zcmV-L0=oT)P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004nWL_t(IjbmgW10;GG{D-lb$kkj{`j>%$fq{XM zRLxpSVhrX+j~M2!;b54*?E)jw2Ea65yZ4HLfq{Wx{d T-EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003P{L_t(IjbmUK1*3opfDxNuqL;ycEhRCAYxiC; z%-?nas~Q+!!lv25OqnRn7%qTmK5*(TQJPTz>% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_handle.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..597caa834b8d7b1f05486726118904f6ff868c93 GIT binary patch literal 251 zcmV}>y zFplF6kw8%tm#}voa?Y|0LI|X3ifNj>b7XjUsH$prN|MAI7y;+|v<-s$zQ?jG$nzYZ z6M^D#cnXV~}?!4D|dS_Tpl$hiwi8L_?#$<8jjv&;lrScvx*N_fzY-smSsU**N{?T+cs#eaU2J;f(mHDS;+I8 xN_1VvcwHAOcwE5KcOW}A_)GqM@lSsK2fpiAKGgegRyY6v002ovPDHLkV1i|QV}}3$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_shield.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..f3bed20bcbaa7dbecc5fec74da05c477d5107169 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar*{o19tKrP~fpy(&N~D zqj{!8_d757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=a_&eO#)q+(8T$^wB6JyHf)2MkOUHZJ=0|4(0-+a?~5^=tqCfBO2m z)&HI~|E1G?ly3>_U_7Iv!&Cq7PijJP^7_-+@Bi4Z+%!kS`2iaT2Zs>{2bbyJ-~Z757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGxu=U`NX4Awlm!ACdZY|Ocuu^2^RxcvB~`Y>Fyn7Pg#E^U+qbBxO?X2 z|Nnpf9xwRzWu;XmD=V9{_3dRk_HWFRB?1gHPyK&>e*X2nH6JHAM!8Kpc+g|JW?w^^ z2=l*xf6ssTax$1L&@drG`jyF1Ha6iaJxL9_x^$YSEh@Qeucp=(v7cd)Nize(M0StF U%S(H_fL>Px#>q$gGR5*?8kUdMoU=&7A(r%)Y!PwfAfQtwY1qBBeC(+*`F2yl>|B+Kyq39xX z5W&Iatp;8ENKEp+kAqm8OkBk?-pliF?uB14&8#k;p7nj!ZW5fBR11qs>~E|m&RWh* zs@>JVYgBMy9(A}gNQCG`5f8H&Z)G*#`*j7`>kE>j7xj@7%R#{CVELW+0|5jtBu$4u|>hb)@I}EKYyPOg|=jF{@PCF00000NkvXXu0mjf DBz%a7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/inverted_lumberaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/inverted_lumberaxe_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..f43802397d3215eae65cca7055d0d94cdede58a6 GIT binary patch literal 299 zcmV+`0o4A9P)Px#&LY(mmlI=E&h5}eg2VE8Vf~Z?Ts}N0ofPUXbd9`Nw3gw?aWcApR^x>0Y^r%2)@%Rrtm>H)%rA?S0)uLcM4su|rqioh^DJ55~eSc+Egbw!ou x0GOs9d~tD`DrmJatpHb+3^w~ScmMhOd;t7qT4T_pBXIx#002ovPDHLkV1m7{gg^iQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/inverted_lumberaxe_shield.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/inverted_lumberaxe_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..c4f0ca467a245616f06fbb9dcfa54256bfd91e64 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=cb%+tj&q+(8T$^wB6Jig3-K6Cw_{W`-qWa(0aNjVMic@O{F*Z;fn z_wV=hohjlhqEr8-|MumATe^!VAMCl4GsapJ(4BR;bj({4ra z@cjR8zR|$g(13||g@<2?%E^XXTTEX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1002EnL_t(IjbmUK1*2dTV1Ps~ga4%JVM5lN81jRm zJI9SALzs{`qKd2x=0=Z5atR}{3t;T|+b%HT)PV*73y=>381qLv00000NkvXXu0mjf D_P*GT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_handle.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..20051bb1ace9048b85660f6ea0277580beef4a34 GIT binary patch literal 573 zcmV-D0>b@?P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004POL_t(IjqT4d4nRN4%A?8xLmEX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1005FnL_t(IjbmUS0VH}E{7>{U_>U~cNUTN%1_p-2 zkRJ@Y4v8^5ef5c9{S->P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004SPL_t(IjbmUS0VH}E{7>{U_>U~cM3Ux^9}LoB zd<@8j5N!Yh0|UdZLt+g4JRB%u1Py>Wd;Ycyj89*EVqjokV9-($gS!H+0l1tkCc+C> z!$PdHVNOTZOwa`|XJ5Pb3ae%Y1_lO3LN0&-^yr(v?E=wyN5Sw10PBw_lHD5(Z~y=R M07*qoM6N<$f-h9?Gynhq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_shield.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..3d6775683288654d09dab5bb6d49af9c064de1a9 GIT binary patch literal 521 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_back.png b/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_back.png new file mode 100644 index 0000000000000000000000000000000000000000..dc4634a871238ba58b16e2b528d4376c0ab77514 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar*{o0}QziDDddGpYzNqUa|FE)be}#D$l%K c;LmAOyjIpWcKOv>pd%POUHx3vIVCg!0DGuIZU6uP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_handle.png b/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe32a3bcd0f9c65278d36c835e11f46b69022ec GIT binary patch literal 272 zcmV+r0q_2aP)bm2v^<%qo1HJwMf1I-y1n>Zt W_(_R_X)U_|0000r(93<2fR1gYoK&U9#jD=y%;wILT00V#C&(GlB zDvBar^}Mgdd7fj}b)Y-fmo;dbCTguQjw7U$===U>lB_{p*I3sToO85oix2|H^qk~% z{z%^hkP*SlvcNe9V+^)!JGi4r!L+96LI@1QfU+#1l!Esj*4mxjj}*w&WJKCDO{l60 kjIpmIq&@qY!0icq05PdI;lZ+=B>(^b07*qoM6N<$g6*NklzxVVcTyFC` zAN#%^y+zMngX#q4oI@#vWm&$GJZP}zv^k}OQVN`N@ZQ5(+hCgHOhgK%X+q8!j4^}| zV2ptfqT*_B2ETKXPA9DEieVU_wMLAwD)~w9Nks9sZ5YQ9Qp!dN^=`jE@b?E^P;ffm T!n4oC00000NkvXXu0mjfW}#dk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_back.png b/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_back.png new file mode 100644 index 0000000000000000000000000000000000000000..f9dae3d66a0a12b0dcd096fce17e74e9cea18683 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=cb$J50zq+(8T$^wB6JyH(47!7@O|4%)tD)GmMN3yr4$HRC**{wDI zpRd2a&bs2g;o<%E`~NZXCa9cjSav4l*sqzz|KzO-m+>9Z*U?eA%ia4@v*+vo|NrmT ze~Fm8x%X@RCZ>=7|J(EQocS*iF>~gL?$%{ze2!JIJ^LT3>A9qpQCV4;YrCd)t%jP) cDrp7=V+HNoyTzBg0Nusl>FVdQ&MBb@08ut&&Hw-a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_handle.png b/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..bb109e9f92a12d4f710e0d2c9855fefc7e5a58ff GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGji-xaNX4AwKmY&RGpjbVD&1vHa(KTg^nYc;H?Fm#tz=TbFH`kl757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGuBVG*NX4AD7fCP`u2B!TKI|sETMgzv21B_6(IPUP?lX zHi~pcH?>Z`P&)hDjxA!oK9Sw^md4Ld+Z%hh2u$;fR}MY7IKy7Z?9M*^?8%bl5{oCT z+2h*c5dJ!_e%pi26rrB4ea6?9KANrObYS<4ayeDbp1+;Z7a6Yx&16twxl+R@+j%i# z-;<3MGC8-KzCJu7duioNzlZJ*CI*?cxBSrAY!&-f;_owrh zc1_^@e3k9XN0A$Uf3M1vv}amx^5@pn9-)Z;QUXu;|F9G=|2!1(G)YAuALvmAPgg&e IbxsLQ01)|!Hvj+t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_head_broken.png b/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..24e8bd1254564a4e9f52c6c11ba7dbcb8c045ee7 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGlBbJfNX4AwKmY&RGpjbVPG~A!?*IS)&(HSGOL`@hPqO7$6#x3a zY;N`I6crW8YnzPz^P8C;GhkWIc&5JI$Y7&^@t;4xrzal1_O|r@zkk2wvr@Z~IO3T9 z85$Yc)c@;poH2d+!}Is=^SJxZU-kR%`}_Yjq>J4a@q94foc8Bmx1_|G|B`k8e@1_Q zcDK5%JAB=h!VR1L@f(>Zsbny4xZH?n5M@e!ZLiI(efXMfwWQekn3Esg{=WX-kZ)TL y3vWZCMzr<@$A#0DX*_a~Zs6{bGSJ~+V2E1pyXYfd(mkN>7(8A5T-G@yGywp&r;5)2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_back.png b/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_back.png new file mode 100644 index 0000000000000000000000000000000000000000..0a012b38e960b5527635bd03757f95980ee63741 GIT binary patch literal 540 zcmV+%0^|LOP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003A?L_t(IjbmUK1@s3s33mSzy$t@t_)Mf|PV_SP z&(FibAT7qn05gOn1LkkLzu4^P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004JML_t(IjbmUKc_7it;D4f*!G9Q^iDb|mzMaNyKkhWXnrpy(lJK%$qye=Q|3hHLj;VQ6L`6b3MxacRcu z0zx+9bpbIp<8%SO03&DsvChT{aK$sxny>HIB~LR0mh?>u005WzPgTKx1C;;(002ov JPDHLkV1mw|^w0nR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_head.png b/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_head.png new file mode 100644 index 0000000000000000000000000000000000000000..1e1de1eacebcfcfff1e01ad91c2c8c70b264c310 GIT binary patch literal 574 zcmV-E0>S->P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004SPL_t(IjbmUS01~|n{u5GzSM&A#y8rPR!iZ0E zS?OPf*Y|%jFfcGM%wNO7Fn`+x4E0R-TmaL2@|+xlv=|>&@8EO+%oPr1$_xw)3=FT{ zd}jFgTXQGEX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003=CL_t(IjbmV-HAwU__@C%y@E?~v3qj2xKcGB= z|MRz9U_@8LM2ss=o|9vc7UN^U<`RMi+<&CaASS}gz|X^h)esCPp#zu(2Qy`cS8qNu zeEjl*;pwYS3^4ByGyt1Hw;#MlF=P~s0*V0uvY{!+HTAfc00000NkvXXu0mjfE)MX2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_arrow_shaft.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_arrow_shaft.png new file mode 100644 index 0000000000000000000000000000000000000000..617e320ab9efef806b520aaf86c590fdaed9b8e9 GIT binary patch literal 252 zcmVpIhpF7nAyAejv9Zey z8gTMOQGjpe@YZ!j(=@2-+SNas+qNa%;2Hb(SRdVnNf(`uSpNV3002ovPDHLkV1jPP BXx#t+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_axe_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_axe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..d7b3b114ade0e113330d4c77912d031264de0a8f GIT binary patch literal 232 zcmVP)x&bpswz^sCmweIgVQv@7=vY5ux;Bd$82IST$UxAbM#N``ws7Y!qQBN!!SfCCF;6{ zwU!K;rh!rl^E@YfQec8zaBtfd>$;-v`}4BnIH0xu$UF&N^#;Wd0)!A4#}P$Qu!}36 iKl58%*Tp>fo5TwT?m)hFXjygu0000hK zoL_L9xZ}QgJHFX{`1{WnTX;U7ooSj(B~(?#`FzIlctppJ&8BFi#NCKEg!42wOmaqxP*L@Ti0@4L2bMYvcjVB5Bc#^bSY6wpnc=cwx% zMNteL7=|IDvMdpXA@29Ph%L*KZx7q;cIe=Gy>?C0z;#{l)T*kao;efp>-8GsN2Ae) z1BC^&rzi@1-E629IlDvUje~s_uzkk00 X8{nSZ^m3M!00000NkvXXu0mjflRc{I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_binding.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_binding.png new file mode 100644 index 0000000000000000000000000000000000000000..876be15c7d5126f42ae6a4ef63c4380513937e4b GIT binary patch literal 252 zcmVl*vMV_nyX z9|1PrZHllOAq2Ktow{2_Q5dVw> z7(5IEnx=6*v-D+ITotKb@a3#WfmAkPG)wt*Fo6dsA4@+OctS$}00006K5S^e~*?ItL4`A<6yr^gJ5MnD9+Nt4nD{+%lDZ&ms7#{C44Bhji4{*+>wRZ06 z_>Met#+WIDpq%rW{%%)FO|A80jBVSIa(MxorIeIXqTc%h;vLwIL^Jr-8if!p&Ct9A z!0eo(F$Q_>-|Ar*{oC+y~AaO7~=yY`ra z_eNIkje^{pT{Xpz3sN#=Hhp!z5fNTc^%a%@b^#fW!-<@nf>)I=`~C) S3^D||mci52&t;ucLK6V6;#cbc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_chisel_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_chisel_head.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a9ead298fe356d0f0d66220a1b47433d6efb5a GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`D?D8sLn;`b_HX1ptRUdpuMi%0 zPh4U6&yCTT-%RpSengA5sXnHJ60nz*qu=$ME4!rj&X|1Xx_n;LoR{Bx#jQRbRY z9iJEm-Tl7zsKiML=N`kR8`j1m2Q~>bJ*!lEZ`&#$Q57$G=UQp*oX>6b{8qjVFK%zU zXyO~0r0p;e0+9I0d7M+-|o) zfy?Eh`|Wna{eI7RcA1pftyU}bJP)teOCiT`;JPlh+bsnYK5L*YM&*yVouUD*AE7-QJnFK+gWeAq@@*ic&Lh^7pgzx+6ED#Qd0|tWu zqA0@i`D6(>&nRIu8fmnCzpny}>b%u|JRWm0#SMY=dR=1{mSv&a?P9rHf+8$OdQc!! zpzWGA8&ff3$CJQtb3tVQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_crossbow_body.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_crossbow_body.png new file mode 100644 index 0000000000000000000000000000000000000000..30856406277b2096101f2f5034f2241e599ddc4c GIT binary patch literal 267 zcmV+m0rdWfP)ST5JfMM5Cs)t2_#AupkN2apkxLnU!*3V{{-v!)2)AwP#l{#CLL71-7seN;?|ar-6HEYpGrAZ+RM$0+X#L?U%TRF)-KYf~kE;9f4gNrvK| R`eOh9002ovPDHLkV1ne1Y?c53 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_crossbow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_crossbow_limb.png new file mode 100644 index 0000000000000000000000000000000000000000..e5bb9b699a433e20fe6904a7e887f7adf28326a3 GIT binary patch literal 297 zcmV+^0oMMBP)M z(El$>*FsfQVi*R#vMdW*sm5_+E-UGjHi{wv?7A);#{o!nU9;V`jXckzwr#0t8tWrK zmSy5RPbTjBPQLF`*L9SpDF;~BmF+Z5%w@%%OXYbkf*_#2?XimC(9LIt4JTZfSP4l%D(Ri!w`<+!1sOBb&WjFv92q+ zuKU3%r`2?jB#9J7A+~KxRaIj80}WIgIwAD6EfiE|w`&UAUViZ62g`*-)Uc0Q00000 M07*qoM6N<$f)aObssI20 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_frypan_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_frypan_head.png new file mode 100644 index 0000000000000000000000000000000000000000..6d02d35bf3dbe960396d862b33569f6b51167179 GIT binary patch literal 482 zcmV<80UiE{P)kHodwzW9yXOr4y1qUER4NsNzR_re?RNVyPGOK;R8=)1k%+NaEI?^A8sI&f z%?hABmbwFgLB(Pb`~4oFPza?`3H^Q_nM?-v`(1#TWEYDXDYGJ-nx?_!a#0oGz1eJv zJ{%6wZnv#GRjlUb@p!(Y(I~uLFRs_CX?c9fWD=9f1h?Bwn2pC{oX_W> zP!t8au4A*=pjxfM@AqRc7~r)|rxVKMGVCk_fNu|n!&t3W7InAVEqMf;&1OiYQo_vV z^WktfSd)>5#^Z6M(`od2J+xXabUGcxVlkK#5s+G~Cg*Oq0}DMFh)oz!;+HK zXGQ9{Tux}Snd|i$)9KWaBRyasg-$+&O$r8sG)Xew%u&Akr5$LJ@!ZIUK)k+7r2T)$ YFG4`KKlCl6kN^Mx07*qoM6N<$f_azT5&!@I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_full_guard.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_full_guard.png new file mode 100644 index 0000000000000000000000000000000000000000..66e3070a52d8f530a710ac5e30eb34aaa1e33d10 GIT binary patch literal 301 zcmV+|0n+}7P)s&Os^q`XYpEIz)%b|RTEK+yn)CpHLUR1nPubm26{f-)iu@K zc>neFUkPcN3S!Rl#J=we-e6E?zV8d#bzKlbpss6_Whu#C@#gE}xiiu8JUEVnIF8YE z9ky*l+qQ}Vg@BT6+eTGY$g&K_alkZ948x!#^Fzh?{LY|dSu%MXN8IYhB6~1Rlgu#;LpuQmwRJI& z{>-29UDpMb&GU@k&HR&qB(!JtB%nI_KFq!WY*A6&W&t9O00000NkvXXu0mjfCn|)e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_hammer_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_hammer_head.png new file mode 100644 index 0000000000000000000000000000000000000000..18fd571cba3be2682046a4c6e141cc54f8cf4cd0 GIT binary patch literal 341 zcmV-b0jmCqP)gykT{`2*236^Cs!!Xb^4e~sHtCK_qkH>?ZPA3#afoYmVl4I=q$o>-Qe81l@ z&oduU6a~L#jQt|N*f;e8O^ ngWX^l22MdFq7&G4AO8ITj`?xF8TL5N00000NkvXXu0mjf@mG$1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_knife_blade.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_knife_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f0eab5fb926ffad2d9a2bdfaeffd5a386e8472 GIT binary patch literal 225 zcmV<703QE|P)&lEVIOkxDft0e*H-Tb8ZO`+J5CW7^ zh%t7x-7gS)90!(V!8A=jVJg00000NkvXXu0mjf$RS;B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_large_guard.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_large_guard.png new file mode 100644 index 0000000000000000000000000000000000000000..86a1141b5325e30bfc89977eb8d37cfe6b3dc78a GIT binary patch literal 221 zcmV<303!d1P)s1^f^fH;0gTt*kxa5XJIrnd|JNq4?|UJ% zlRopR>2+Pf7{j+Fje#*{NGU-n1u12z7u5Yw6V%i8d7cqMfOD>^Asyj%c%EljmIdB> z9LE8z^{tkSx*(HjnhNK$>d7bsPsx)1WL%?kxfW^E{7j+psJP)^)`+O=#Pe;}6!mzhM|mQ52+U z3fs0}nkGb1L{Sv4#R;4w2@?c?g<;5i-)HppEOyHh$1w|n09lq{p65M=Vc31YBp?-C z*H6!NU4!oA`58>-KRqC2YLsPJkYyQ?B*F8%ThA8@zm-Wf&vUBel1Iu%oE03(G^!|y z_HGk+9LHNQk?aICXHC;U0wGoaJyAe~Ml8jWH& z916Z%E@gi{pLjeTxZm$styaGYE|-hEM5jdlTk`q5Ag9v_w8PUBdkcHtS2xiSS%Kt&u0nBX0x!{?Lxsw%mmcutpav| zS*O#fylgDw%kyHfKp+s{5yTkla5zLng(zD{4JclvQbDuXgv;fkOU$T-7rsuT23i*& zZKMVoA5oV?oOS+8G5NF8=>&~j+wC@J#2M>$yFrV^V!Y}UQmK@BJRY&%?*;t3FcI(6 ii94$`;yB90KC&M?qaFJ@aFbzQ9MifNiOjh2v|rs=_HmSr&&3xYuYVHl9-xu$suqPVK6!0Gcm!?tadWr=Ou zWSemu73L>A9g!<~o(JFe(RH1$I5`YM#BnUS>a=xKfH5!6MvU9Gy*whZU$-|H;!Jc3 S3n>c#0000sqHLH7R&4d~xg0fla^D62$9k{~s{v+Hh^%oy@g@$udRU3s+}+ zyLVWkd5-b**BU7^&Injd4boWpCUNUEX?x*Uod&8)T{sxe?UZYK$C+-lltqyxD*O4z k-Ty3}&wagIzCMAu>7in;*qOVbK({b>y85}Sb4q9e0N|2IU;qFB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_pickaxe_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_pickaxe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..5550e7751b1983d91ef33c1a1ee91d51a8556ec2 GIT binary patch literal 258 zcmV+d0sa1oP)WL65BERj2eU^$_t`IDQC4&P(ewj62(@c^Z8=O^q18% zjjQY0LHr5#i-Fwty{A0=D|1Bxk3)uGaBbU?F^1-OW-MB~HcgqqQ9Aq02)0KPAmzX0W`syNJAd#QX1KpEWzJNE3a zUjTU=NAC7CO{W4#{INp-o~^ZJET+ssyOX=|hBCw5p~%d*6>EO5?Ua)V{pb-T6pBx4*$WLbuFT@lAIlv3n5&vT#&24WmgRTU-3 z^Zb|q&N-Tk~iq1ygo*|3lSp8TSsHy5_d0u~lhDk1NNCoauT^2J^o^4O;d-mM2VVCYN*=H?hgc}S TRhsAubS;CYtDnm{r-UW|Nd;H6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_shuriken.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_shuriken.png new file mode 100644 index 0000000000000000000000000000000000000000..7232a47d264b4a9a1d28e59158350b21fd568e9f GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FprVLn;{G2H0{nEAp5w)oWTE z=U5;VySF|4W7WK4HxC-BGA{hvW_Dqt=%fdytA7Un|NfWNA&80Lg5~imme0GNoqHku zeDConZR2ASGWJ&4x^mryi>^rpd-cQ~-LCEMf2){8a)_qu#TR?aw|)<6364uKaXdG3 z_hl)ii;ArR8@3)(zRbAt#>vjd#o<~SV*eCAGHRXInz!KDKRKY|7(8A5T-G@yGywn_ C@KLk? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_sword_blade.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_sword_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e8af367f3878aee55e12843d6d19a13339a436 GIT binary patch literal 274 zcmV+t0qy>YP)SGadA`}#0%);>M2}2jB7U!Bc8(ph>MGZ2N1!*K~i2IVrxjdw!%+L^1k=~ zFZlgWd>bK(BB{00G#%VcAKF&JWmzJQV>ph3zV9De|Ir{#Q#p zckN_ai=vQ12!vq>*L5)r1J2`Wv13vn<29uBx+?5_Mf0 zwUO=G`RWtt{)T~}fb0&Extdp@6ZKA$N~Q(Bfq`UD09_xqjZ zd8WSascD+S4)l7x*zIOXv?;3 z8pn}}qTtNH;(R245tVqJN7w6>;y9*N=fQ2;Ql96#n4N-Pan>N&PE}R(cszE@0{10; z)EfiUb)9erK|q#esSvJfTq*+7o~DVHon;yK;&ou(4i=7&769^npHDjsLtZx85i?n5 zKv5LQIQfHYSQ0R!Y;|CG9oSLH<#LfpWCAd&OM;}^gGzqd6OMBnhaHbcxu)Ex2vmZj cnEz1y22}2sJM;%ppa1{>07*qoM6N<$f^r6$<|SENt6`aU9Wgo%a50f+R^q6h-hn565w! zsw!!&KO>;)x|rt~Wm(GTbUwL<0<76_94yO%zVBu16Mnd|<{$`!VHo05M5q8+hw9+F zvuT>h^IUmXSpuEcb(OJ;qQJiIN|?rf1PG^TifNjVW!WW6fgj3@O=sJ-<%6+Nc z3DEg>lU#x4*&8=(62fsDqix$;UnLXpt0*)K!!4N1zvl$^1^A4c^00005 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_arrow_shaft.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_arrow_shaft.png new file mode 100644 index 0000000000000000000000000000000000000000..7ecadf302a4fa5864f1095e605b3f004cbd4163e GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|Vte!58Ar*6yQx*tp;L&4_T7LHb|8I}o+xDGea@)l7{F zd3%4B-2H3WpZHz*{;~g_%>1wZY+15|lY#6M(WeI6{O5hG|2)yT)OEAi-}m0#&W0^3 zT0&;dK6YbM#>@YEt;?^8`p*2hU!VP<(4ycZ-x!nR-=|9dZ(kD^8E%q$?f z7V!Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_arrowhead.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_arrowhead.png new file mode 100644 index 0000000000000000000000000000000000000000..0e550cbc60b360fd0549bd7ff66289e7196ff207 GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGo2QFoNX4Awlm!ACc$}HbV)p&||NMMB&;Gisznu{{1*;kbC;u|46%e5^V{E2jw?hmYg|5;>V94694}FK0YBn@~TL7zVjSzr?qD! zr_0%V+P{A5(s%Y36l?bE*|DepE`z`i_L7733*P-$vqmj#L3o&MRD^l``^NtYA5+ZJ z-I~~rSlu)}cYp8u`Z>+I5g#udKK^h04D;=J8d|$LHN+bn7OfV(qZTlu<(Rt3K^~P; k3@Hu1K%YEdX3l3|xWkwdxkNZY5Eudsp00i_>zopr06~17!2kdN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_axe_head.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_axe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..a90024c14193aa3c8c8ad401553c3d905700f0ca GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGlBbJfNX4Awlm!ACdZZd|H@v)E{`WuslFc@EB|Oa%&aK<~fA{QJ zuUcAL8`$3doB#4<*JS}7=4bD%KkOG@5g8EB&?v|uett%ndHwx^|2zG@MerUpXqY^C za^uXIGanxBm*=^2=ME2#L;adr_WSd$_3izC*=CL*&p`u)Lzm_VrYPUgo~(BDc|>fl_)%V!Y|9yNz-p56|{O8*lZ`ia+=o^!fM_Czz y^cIE}N@@zS?W!^zUhJF}OcOGgKQuO)GcX)l?AE$2lSL8eI|ffzKbLh*2~7YnwTdqQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_battlesign_head.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_battlesign_head.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c3cb4a0a485e4723b491c1e57c133bedd54df6 GIT binary patch literal 546 zcmV+-0^R+IP)fP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9J+u00d`2O+f$vv5yP)5~-ApPAkIh&Nk)? z1)~e#Okh~ZitpW_-EM=$teatVWf@-hfXAl?jJY%Td~bl5)t(9@xjUYNLteYM!a8lb zy?=!7`&u;TOu@ECP|i=_<@p)L?-n>`II3Sm5X!VH99-5Bvseobk57=KHRXZlBa=zP z>>Hv%OnRJY2Voe(aU8^P1V0FL@2>0W_32UxuZ;%m{t6`4mKMP&_B;=>lX=9NYoJ^z zs-6*0I|~%oZyH+H0~ku0x&_8L611syen}O?bOH$tR8^Q1@1LF_m(A&!^#D|+(QFoy zj*An73l7GZ7D`Ez5fT;wlujk-tDv&Ep=MC+P~1{2k-yPPk~oSYq|>$@+_1VAa^?divR!s07*qoM6N<$f}n2R&j0`b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_binding.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_binding.png new file mode 100644 index 0000000000000000000000000000000000000000..d6428c64f637543c47026f1d742e4c48421121c4 GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGx2KC^NX4Awlm!ACc$}HT?%F(_m6**5xaIA=M|fct2gWI-m#){0k@J&j-;bhRn)A5ZGZm# zoxO1Fx^3%Ltz4;j=iao53m6py_)Jm`uG{-Rx>2hB@1K(ackgtB8v8LHcp%Tr%+Jq% z`1$|;l6C+8wFgUvF+Y2M<8S@Jo|UDVJ1c$b8{=kNxEQycjqPuyX7DL-_e}>YTCQIf9-GG6s^~3VB$?N_A%ygvA${CwCLmg`}757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwgQtsQNX4Awlm!ACdZZlYFq&R|{-^%e7tOc)j#Pomfulu=a*M=WUmOc8Qux3`F zltJ#_WB*T!>#XSZJezTf_shYRlB*dfUtjZkKhp|JGu^eCXKxFyPvc=u%e(cf{^y^{ z(n5!`nl2f~3?AJ1`I%>?>rvl_+rnHjkCiyq@;*LOm9#agTe~DWM4f(>#07 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_bolt_2.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_bolt_2.png new file mode 100644 index 0000000000000000000000000000000000000000..214313fbaa1e81a6cc97307a2cfeaeefdded51d1 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=a_-qXb~q+(8T$^wB67w$HEIQ8qle*B&U3xj$!<&$hIVxfQbSAHv* zJE<>D_@rJ&)Sh4ep9;IbdSbG5_O-9229t6eVskVef06zDFTKjbP^o+J6V{TmD$)(S gJyHf)3>*v$4<1RscdEUg1GI|4)78&qol`;+0D|UE)c^nh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_bow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_bow_limb.png new file mode 100644 index 0000000000000000000000000000000000000000..47a77c5678bbdf6258e9d2781b9515e97cf9f89f GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwucwP+NX4Awlm!ACdZZlOnSWi&|M~y<`TVy1_5Y1R+*%BTOcDk-T(CGny&VXh?t>hx_&|DL2v>wXJG`HRckfF5D+boFyt=akR{0KX`E6951J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_chisel_head.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_chisel_head.png new file mode 100644 index 0000000000000000000000000000000000000000..22911cf10c6778a97aa38b884b621ce16d942e2d GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGkf)1dNX4Awlm!ACcx0Kky}A4Q{_&eLC+dKhf9;qB@p7m|(+m*E7nTGnA1BbH@WUY91XcgC?)*c)I`q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_chunk.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_chunk.png new file mode 100644 index 0000000000000000000000000000000000000000..85a11ce66dd8497c1be52e0b68e12676865d5b17 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|V`kpS1Ar*6yQxt^$urs+SIEbe!x_ypckd~P`)hee=z~q5_$mUI5 zT49xY*cwc3@2tL-`RawipFba)4{EFM92T|UWza17@^Ss+M-Nkfe10z8JYxq-^MnqA zOuZfD&&`^bnVtAHpNEHuhiCGys@WY}%oE;jdNr%m%WD{bH&>^1x z|NbOC5Ee+7arw6M4Q>Tih439e*sn1<^B+kUU}3vgqVw_4KU!bUP zHYdX5vFU@?*VpqTIoSSj(BJSVsO2ofgwIbM3>U0Ab>PI2GX}f)FW+a0O~}mV=PPtn qJk#QQfgwUc>9eO%gM{x128P60Wv*K*4u1m%C4;A{pUXO@geCwjYOs9( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_crossbar.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_crossbar.png new file mode 100644 index 0000000000000000000000000000000000000000..43ccfe28a5056b47ee2aa0267cc665ef0017d97e GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwqNj^vNX4Awlm!ACdZZfeHcVyj|HIDI#=#!#wuvVpEiG+^ZDo?| z35B$@ur>kd;yG-IrV2-nO%hyE`Rt=757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|VT%InDAr*6yQx*tp;IU)gbGi6m{#?t}i8{=4geU#C-(S9b-GcH@ z|2dEDbdhXII&hD*SkiG8|Jxg3;Z~K;{>SgHGxSkO5NH#3Fcbgc_j7;xz}{A_8|k7bd#n%lWyDo{QuF``jw8Zj^w{TfBpA}CnOYQ>LuG757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|V(w;7kAr*6yQx*tp;K^g&6}Ijtf7p>z#||7kckIBqVIw=64jegh1<_uer$z>fo;qE=NqrF zsC!o5vXoP~jZyY=*uVL<8~6JOtT5cZX3fj@>+kcNIdg_*j!g}ZPtF;h9)}tG!bT}GrkhrV|M(xAM8K-g$4^FL-&90 V#pN#FtAN4A;OXk;vd$@?2>`4757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|VY@RNTAr*6yQx*tp;HhJN_TKJ;{l%+|6LpxyN~qH|*T~?eBRW{*{lPJxn{n#lLp;{%ZLPs(un}38o9GFMs>LGw@-lO-&8Y zp+ibMPKORTI3Idt)$mBPZe9-yZ$es9!h>he(gef=8KpnGI$F#&!COiw=~Y+Qx}W#O zQAzi(9Y^Hb}>tapEw?Q*dHqj%!_w}co5o}ZR~ z@0RAr?Mtfo|IYUC_4W59q@L+#t@`j?O^-*Y;o>$9iBGDYou#Fh(@i!S8W}ICw3sZ$ zU3eg4_Wtbm|6R=ANO4LrFtwNnn>0umd;kWvf^*ETuFrQZfFZ=->FVdQ&MBb@085mj A&j0`b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_frypan_head.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_frypan_head.png new file mode 100644 index 0000000000000000000000000000000000000000..fa0ffc7a4d3ac13e4455da28c23695cedacdd982 GIT binary patch literal 623 zcmV-#0+9WQP)fP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9J+u00d`2O+f$vv5yP|KHXtg(w4dUeylb%B!;__aG?WCH#1vq3LHB+x7CCV0K1gajrhJw&}8 z?Fu-Kgy(tq@$EaFG+!vax?%iURb&VdCm19NE_p@t7;IQR(Cv2ZQ!bSdh9TgNXD#UW zYvvhwE*6S7K0YGp4umm?qG))K!R2xp^~VnttM%vaioXizW?tpAzvw4g$2`9`!ohI<_*M$D?$pno+ zO-)@U3tgB*oB{)-(iMCq8){*p?%%p`PKf;jkZrWSv@kt$6`f9pz^-j^fbI5TIwdq~r!Qx{5Pk31cOmdG%XqXuJv>7N4E{#aHA4UZ002ov JPDHLkV1n)61hW7D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_full_guard.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_full_guard.png new file mode 100644 index 0000000000000000000000000000000000000000..0cec292f326381de1ff25eae0cd9c4754512f6c6 GIT binary patch literal 430 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|V;+`&!Ar*6yQx*tp;HhJtCTsa`erIRr!}ss+^IZI9*5e|*L1@Lt z>+9`#KCAh!`~Bso@ZtOR^%B$MEdJQvIyi0O0!D2<`JeXbpO)FG(BrNVqbNJl53_sp3yJUMgb9FZ1y{p!e$jO+LQ zbEltO^Z4Pjv>$9G2YnJ6)>&6RtDmrwv+$zC^Jiyvl-xh~zsEsbXQu7ycfY^C=b3D6 z{c791{U7e%zR*x$(&VsZvTejese~$q>gL{F##rMx<^+W!$Aq%K2<9>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|VE}kxqAr*7ZPTKEvI6&g)`P@Z%>slWyYp!H-?pD}Q8WO0jVfuqj zwWFYwhijj+YrB)G?`wMz^QEeGUaR?%vK(itUDvl_y?pD^(a(iD?>zitasQ!FkH*jc zOsD#ktr!(pCirIOXf(J!V@{s#zgo+zDEe6d=c*L5UK@WcE{U_PwdcJ1`y%Fc`wKG0 zOscfc|L|lA)Ay~c?~NN4?A*9&&yN7{n?JAUd$2gXPI8;;>ae@qZdb;Eo$(d)_!;^GlH4vRJ~%b$IH+S$YA$(&p6n5(F8HtHvcbJe)s?<^5wOxZHu_OQ_U zbEjfhn2tEyE>-k4iks#8W6HAp&V|!BL)Kh98oTt6^MM~XSmvGFQ(lsxmwC~s`d@R7 z)lsi0N9^pL`uDQ+NEF9AtnjpYz0>#da_e({)D757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwpQnpsNX4Awlm!ACdIXra<=y={|K)%Cw*5M5cPtS{Vr>Tov6=@3t( zq@?dZzikq;3Z;PB@BP2}cW>ze_g%%wM$Ej#3iFmvzXql zEyy}%kZ|^3^8aXS>sLowTqPz22hVom$T()eu!J#%gW2GelS~dr*0EQtNjXQe8CE7d b;ALR&W3~OwD757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwyQhm|NX4Awlm!ACc$}GErJw!(|NnXYwq?)Q8Dg4N6!CzKW_7FO^clw>-^vsTJ7(7;FZvvjSQda?|!lT|Ga$5HO&>-23LG%f8MXD&3ag1 z&&3;4W-^(vJXw19w%OII=jVLhZzy|Jpy?$;3P%T<^pOThH5YZ28ICE^4ct6?7#X~j WUCwN*=`R6#fx*+&&t;ucLK6UD)pv#f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_large_sword_blade.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_large_sword_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..3620a58fef95179d7923bfea3f69bc407ccf9713 GIT binary patch literal 478 zcmV<40U`d0P)fP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9J+u00d`2O+f$vv5yPaZFxbNwc;W=^1HUOqksJ|GT{jl(1==bgAixlvoYEBKWRIa4!+`nQcl~d!t*HYA7C+Edkmi__)TRh~8?2g9 z3|IsV?bf>5IzFhALH>>gX@-V2UIP~IJNUn=u^z0M2k3NAJcj}OOh_}_fLNga)}1=@ ze@a(Z9mwCYscB6iR^|jXqj(|6%!F~}k>mgW|NYBAtY#DgKp-5Lwu#k<)c|q;0M1ri U9AZqS^#A|>07*qoM6N<$f;joa9RL6T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_largeplate.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_largeplate.png new file mode 100644 index 0000000000000000000000000000000000000000..c99412ba64c3ef17d65f4897825d74a0956932b9 GIT binary patch literal 624 zcmV-$0+0QPP)fP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9J+u00d`2O+f$vv5yPCx(F z`?f1-Eq2$R5bV4lCV~8deMlApdkEwsa`1PC;1zNRdEAXOk5rGmUS!{#fzhM8r@E?o z4E}Rv`gs50Q`C2e0dk)btRxmwWA1Atw=FMp8&mT8zFc`ZZ_0B{!kQyT;=oA!2$A10o zJGBSY%Vh$tidi!8(M5vDy$sJet6?|IcJPF|z22feInjZlcbb1BfhOH`A36+OBuVHo zUoBx7@-%x<&k!Fnu)MN{<}6n$j@-dHMMd6PoJOhh83`s zq4!>a)Egb4wS#d=&Qn4NG6q<0Hn@0sdW9#f1aSH4%v?U@G}k{Ut+M!a5N^@{0000< KMNUMnLSTZkY6P757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGx2KC^NX4Awlm!ACdKj43)&2kd|M>TOo?}jXdQ>C}Uj2Oi|IVHo z9=};yrT_o^OSRy867AKMB++!W!T9|Bf8ULaSN%T!VZLLSU*E&4-Qqm=>;5a=T~hyZ+Gjy-1iLa6I{=zu)KP<)YX&PT1J2V{^rlP zP|p^~skx!CzV5%$o2L2p`4?^!~w)(&1 z3<*iA(_XLs{rh=ZK~MMahxh06+wR-f35c`#z4A(^f48ILtG%!>H?y*_@ZtOM`z36? nZ0YP~l{m1hQH8mKkvX4%;l`#kfwx=1!NB0@>gTe~DWM4f-qWGA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_medium_guard.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_medium_guard.png new file mode 100644 index 0000000000000000000000000000000000000000..37d11e8a29837f795a85b70fd9df5fbf968d94e4 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwlBbJfNX4Awlm!ACdZZd|H~hR^{{R2?_x6Y9+wYgS^tV>R(kP>*Ba(+j}_kI6)c>YUHJ3l|(Jp0iR zD*^j!S2+(0%!zBzjN{o-dv%d(>6$ZVj#M*>8W?qScR!q>n!#{FRUzDkVXx~lZilu6 ieuqW82iV&h85u5d7|#=HZczlfj=|H_&t;ucLK6V}`e)Gq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_pickaxe_head.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_pickaxe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..bfda96f8daeec65d7d1fc9c142b43fe3b545c8d7 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGlc$SgNX4Awlm!ACc#N5?($4-pf8@-W0~|+qczk%yGQ4Hui`d*`TuL{>em%N zD>$ner8Rsz(%!^wdGmkT+1anAotqtgeRsvp|Br5H>|k{{>Qopba$`cN!}LGDzqXr* zA2_gof4#)Mx}RN&enD0YtWW;$-+$70fr(+?#_E5I{@4Hir+S}N!FgHEtzYwVm>m?3 gpPyY|r2zEvd%g(ug|d757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGx2KC^NX4Awlm!ACCM?c8y7KdXR+gWVHX&0bJk1!ERK8urT6*&5 zPhXYY2_H8G|DS$tR^ar&pj#}P=BhA1dt?2l{_>`!r7vAweeX$W^%xW`;+e7a`+@(a z+|RG7raU$InX%GX>9n9p!nJ#c|8HLt5hOl)-c6CjyfYno{nr~fZl0NK zyk)9nTiPDBFS$2A)}P1ViZ>iwDY=?) zufy5f;p^9MdwM9XkUY#VVKdP9IPr;-yr!gyFguv#$8hny?OC%-r20757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGfv1aONX4Awlm!ACdZZfeHf-v9_diD_C*j-r`}GntW=cxl>h6-@ zl-ls_!N&jl|NlvvVYqRB-_+Kr4=*qGPxzRBf1lwM|2aSA_s*QT&`P~sa5757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGn5ThAaNy`J6*VYaL%q5=sO6~E1xwJ)f; z>`XYia`S&{u1~L8RF6nj{P-bhSO4Px!=`By8CUZg@OBs&r?E(Gs=0M#m;d|whI^{N zb}igfpADPALZ-i3(;0zIC>Ntg6=kfj(mJboFyt=akR{0CDzv@Bjb+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_shuriken.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_shuriken.png new file mode 100644 index 0000000000000000000000000000000000000000..574c471007885d3033c7db65d5b47ea9e10e2d77 GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGkf)1dNX4Awlm!ACdZZlYFq;4S_y7F4BL^5?Z`h5SNU+2#pVM!BTs&<`|gTtWa&j-fUtP#8hPZE>&eEEC+ zf7_!&R(^VVZSnT?MrR^-Zt`S1`?F&2fiq{$D5&Wj`|#_kcH6ej$+Ju%3``%JJb3dw z|Nru`ZC9U$UN`ys|9Ahx>+9$5cylnX!BAgZS>uW648?76|GvGp_hf5e@G<6iQM56! i)Gm&>gOxd-fniaA^^Bx*OL>64VeoYIb6Mw<&;$T2)`g+~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_sword_blade.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_sword_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3292153fd4579f79dbfe385a6160bce08b7f7f GIT binary patch literal 403 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_bolt_2.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_bolt_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3b0302a0f0247fca5ababd8702146cdfec90754c GIT binary patch literal 510 zcmVEX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*10025kL_t(IjbmUKav;&m;D4f*!G9Q^iB!#HrGHVx z7)jCWV5ZD);M84)`P(iKtq;QxvNVo@Q9yG50Qf%;R54Bdg8%>k07*qoM6N<$f&+xw AYybcN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_bow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_bow_limb.png new file mode 100644 index 0000000000000000000000000000000000000000..d5291df8231a95a1e6b070008685aaf03bf220e1 GIT binary patch literal 548 zcmV+<0^9wGP)EX>4Tx04R}tkv&L4Q5c4wdo2n{95RS#xI;BWE)`LmSR_G0sDWBT_a{y8Ugch; zr7>s?8v0rK8(NxcZD>O5yH>5mxX^)qBFqtG0R@dRIr5YUlEXs5Ax4C73x8kLzd#v{JUMg} zW+-5yR{e-S_?@kj85^xl>Iy^qi|c+2LdOnNwq5u8*mWx>;CY5CtKlyk!Q>}+wj0{O zA^11p;<}+}yKuP$y-!8eR;!W+kTV&0KLcM1x^Ka|RLiY?&*=jsHemh+_77kv3;yL6 zdv`YH_HR!;zaIx@a^l%%u%7?`0AWc)K~y-6V_+Bs0}mL9RhZ~y@E^vWzwH8C9}6)W z7#J8Bw3Ngc%#9u~h$^x&FfbVWhZ%z50+>cEB{8^|mEX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoYe_^wR5*=eU>G?d(aYdJHgP6mH7ADrz-kCV17Mm( z6Sn8O8trLmN4!h@l=!00000NkvXXu0mjfJ+$oT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_chunk.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_chunk.png new file mode 100644 index 0000000000000000000000000000000000000000..eb8d5562f994cbeebe6b7b78e373b5a7d19bd37d GIT binary patch literal 619 zcmV-x0+juUP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1005^+L_t(IjbmUK)F9Ez;6EWXO!zcAm?;x91g8No zK*$iR2Ec4rl)FmEd`tt7HH#{;GQ4{88LumFdO=i?m0`W^vAO^m;L`{LjJPCV{*@NvV_;xl zV0ilK6U=)k0H+t`Z@a)af7=Ddr>{N{bOk{`Op+cr001t6J9dVrUhMz?002ovPDHLk FV1kSp11bOj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbar.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbar.png new file mode 100644 index 0000000000000000000000000000000000000000..51caecd3a12f38380f856b69c3ed77bf9613f466 GIT binary patch literal 556 zcmV+{0@MA8P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003x7L_t(IjbmUK1+)Q)UIzaYy$t>nqm~7igoBwf z0|NuYe+C8yhWXnrFp^{dRKtHQB{2q{;O7hs3EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1005^+L_t(IjbmUKeqdok@PAU&Ghx%5=w(2(A&lq( ziCzZ(wUopduHAdZz`(%3Fn`+x3^jNSKsJPdfq~)Ly;pb*VZmp*xzQsAb0Y=@1_p!w zxC~*!COCiF1xA<`L={;Xw3Nhfh6_#?Kx~9~MNEVj9wz7jZvZhM#fXEMGQ)vWcQL{P zZx}G3#=?IGGi3$_1_qSyAZP%ZK^TS*Z2+<%r0AhN003@UKbN$0W99$=002ovPDHLk FV1kcT18D#N literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbow_limb.png new file mode 100644 index 0000000000000000000000000000000000000000..365c1792ab9acad6eaf81a917ef9d403d052fdf2 GIT binary patch literal 590 zcmV-U0EX>4Tx04R}tkvm8OK@>&LZWKk7AVv|f*g~yLqav0P#UL06NrWU?xS#wWyN2Ba z8%x1fu<+9uwXm_)*1}d01V13w7FLQj5>_S&B#7}fbGY;FW8NK*%X!^&+GfGDigqLz zP~wTC((#H+KfMevs_IT56kUkXvcB$-#Chizvs(B4Sv^L|(LqvxS-oHvL0SW*H;M(p z`+!f+ss>2sz_=YxBtd!n;i!I>({Vy4fIMdm>E0ZOKcwIwb(v$1YTMT=)Cfbt@;}d4?;i;a@Mq%qMtu8rsMa zc(>rEX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004tYL_t(IjbmUK{vgrI;6Fv0ukY9WkIxV$e43@j z_!wT_|IJWV`WL55uo?i<%)r3FaPpiSUPExYfPsO5fuDzipdpO7Y=>!PU|?Vn6X9iG zU|?W4aOy6@{B0K)@frX#L`z8wt`V1JoCd%QaWGS6IB@DN0|NsCR?P$fMQLCJ0RWa! VI*4`1QHuZo002ovPDHLkV1kW^_?Z9z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_frypan_head.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_frypan_head.png new file mode 100644 index 0000000000000000000000000000000000000000..13657b4683af1cf022c407381a552f17aeec2106 GIT binary patch literal 661 zcmV;G0&4wEX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1007ZRL_t(Ijm?rV3c@fHhX0gST4{)T^#fp z-olf43(w)uD+ongszOBzb&$j)zJREM{}f*GfA8f_fG@>-8>{7fRO|I->pl0fp^TNt zb#1pldO^%JDEX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoZ%IT!R5*=eU>Nd%k&uE!FN6Ou_WW%ZFx2BT0H#q( zNsNJkfq~)UmmdsIUwy(b1gimwUIzbR8u4jnU|?Wi!ll{G>ls1KSPfucU|=vedW6eo z#2G*ez-qwBb8gVfswQc00000NkvXXu0mjfNhEX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1006Z~L_t(IjbmUK@_-SSM533$e;9lIwhK7bG2zmj z81jQbT8xjN3or~w^fLHgR{9stmloqgaSb{^aT?5K1_lO(ljr0Z7#J8BK7N7lpT7Ep z)hieVIG8EJ`LEu5#xR5dEle=HaNyKk3}^E5aKOET4p@*mNGAVxFjHm_6XAus#Ley% zM9mrw6a%ov!u)L)7?E9KZuE#jRFRco{u&O9aKLH+Hbc6)nF$9XIv_SN4RHVfqD)Cs TmcI{j00000NkvXXu0mjfe$x$) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_knife_blade.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_knife_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..b02c89377eedd2194b9c4bce29a99c6271e8d8d8 GIT binary patch literal 543 zcmV+)0^t3LP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003J_L_t(IjbmUK1&qWfO7t@L4`a{Yb^%2X6ET{# zl*AayO8=7X0+?oVqel$$*KlCij@JN~W-$?7h6AVWV%3b(0Ae*`HGmY&7zU8487oNi hGWd@iZKHrN006TmF5&&D{Zjw{002ovPDHLkV1lUP=P&>O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_large_guard.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_large_guard.png new file mode 100644 index 0000000000000000000000000000000000000000..55a25776dfb845bfa223d9b95897c094dd3a207e GIT binary patch literal 566 zcmV-60?GY}P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*10044HL_t(IjbmUK1sEXF%iw>am%)Ex)iYre)KU^- zAl48J1LkkLzH<;#3pT;|+b%FNFfjZtEB(vBzyNUtRE#(S5E=~r zJD4fMg#KeQ1gojY02U5fN@5Jx?!Ch45`uu#=p9J_0N@xWVEN_+S^xk507*qoM6N<$ Ef?@scxBvhE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_large_sword_blade.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_large_sword_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..e1da36603cd721526b1f661aea0f19c1f5e826c4 GIT binary patch literal 578 zcmV-I0=@l-P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004eTL_t(IjbmUKXuwFU!bC5F|L9`#w_RXlAy%`N zk{AO60|SG((IW;?MOKEcZf4?KfJ^iIZ5J3B7#J9sh}Hb@%MT3AcwK<5Sye%l;lQc8 zD4KB^K&)o029Tl|!vIn>qZmMrX1D?5YQ}JZv=|>rnlV74m%)E*Np^4p0EACpF#4PL Q{r~^~07*qoM6N<$g0#f;@&Et; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_largeplate.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_largeplate.png new file mode 100644 index 0000000000000000000000000000000000000000..88d996e8da0f8b0ea1eecc096f05d389ecb258e5 GIT binary patch literal 699 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 Y02XO3Oo-bcrT_o{07*qoM6N<$g6>xLUjP6A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_rod.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_rod.png new file mode 100644 index 0000000000000000000000000000000000000000..76843c8ffae3cb1874c7690e0d19e24a97e23859 GIT binary patch literal 571 zcmV-B0>u4^P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004JML_t(IjbmUK2$1My@ITSZ;6DQc0|OITnnQk& zZ}Xvf8gSbg7#J8BNztsOB*t*<-YbUr+b+QM5#@zMFN6OMX37|viE;rhn~5@jkY>DI zz~^j&E`Vu1aOy5z%~%Z}#@RRlwsAxEX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004YRL_t(IjbmUK1r!5DY=Vhi2LI8;=5M=zRV|7j zOrwLDG6Mqx1H-E~pBWe!7#Kc&`N8n?)hDb5vEZ-;#UL1PvwOwBz+mtn*$}MG!sa4H zxvLDKimVK;@Be0)zlH;D84ErGP+g?Wz`$@7MKeht(aYdJw!j?)Q~&_zt1jO&ux|VS O0000EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004qXL_t(IjbmUK1r!5De3FS?2LEB~`P(jFRm*}; zv$Pl=gPYwe22n*;1_lO$|JV#+!l#*mfq~)VIXQ;c_kZJbC58dWn)!J+7{o+)8SX#Q z#%TaneV^5+E-+rZ_llrqf&e)dMgeXB00WLF UK|nix+yDRo07*qoM6N<$f~y|)uK)l5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_shuriken.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_shuriken.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab0b6a0f5da83cf7a6e0d47e3bb7a039fb1d659 GIT binary patch literal 558 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_handle.png b/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..7e237706ecc88d56b5ef06b40675f26bd3fe0b81 GIT binary patch literal 235 zcmV4&NatMcTBqwnUCs3+Iq1U zm};%9J@x1pD_bd58DkJafRxh3krmW@2y@OM=RCm8znp~-b=$W3I$)6Api4^I=;xN1 z5CYD*Wo*x#HfGjZS4!#I%xBPSXw{y{?m5~o(8kRBzJvE3VvHYU4*>`t#{s33d)3BI la_i10T}nB9D)j%XKLI+GI*1B)zFGhP002ovPDHLkV1n>HV*LOB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head.png b/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c5f674aca3553d3f130544918c7839bd9daf04 GIT binary patch literal 270 zcmV+p0rCEcP)+_u(;v zpC98Wf#-SZ{U66M>bi#GIB1$?$A7$u`aO=LK|xUzSe6B07-C&l(3qujcaA!!ld~)n zs4Pn(O;c4>m1w02@})&lq+HiU-}jj38B9sZX#z0+l{NdE&em%3x69$ UZ+3M+(*OVf07*qoM6N<$f`8y^?EnA( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..027ee6b62b96c86c40d554151ab680e41b944045 GIT binary patch literal 232 zcmVP)VNbr4!i)y%r*t(#9gES0000757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=a_$kW9!q+(9;pa1{unN=HFmF||9C)}K-`(LuLWJy22awJ>MosF{} zK0M4`S}!5-@3<4M;zuf!Ul!_z!OcRqhM R^Apf?22WQ%mvv4FO#q+HM;!nF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_handle.png b/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..efc671a20b730efef24221bf7a7825325f0f0764 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGjHioZNX4Awlm!ACdJLG=bR+-#e=@U}$6Ni2@uZvsE(@M{hv#40 zIcuhguIg3RU@`qa^$$*TTIpA>Uey@zv}-SdTNz#`*zuf9TjtC zZIm()e(_xUyS$^xarFmRdlDHmwtSy&75_Xx%i}^C53|F^nm=cLTE!bH@2NYM+3?~2 pf1bEwY`zy>aOm+FW{pzGd?ZxwP(92nWz#44$rjF6*2UngEf}g;M|k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head.png b/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..6a75ea54e8e7c7643725d0f1922f93797716ac95 GIT binary patch literal 303 zcmV+~0nq-5P)Px#=}AOER5*>@&@oFwQ53-O|Gg()1UBS{X=rm2K_en73jGQR&d=dRAc(`G2ny?k z)msFIphf#w-6fwMhcJSKdNu_8w|ltfHyrru%%WlI`bMn?Mg*{kw}KU+ez5oD|3U!Z z?D9&x(QR`hmt#GfB^f8|S8D+%CzW0EEdUUN=PKeMYpcABMonuC!}#Ge><{!a@}t^! zkGfUf@e9XQKkN@Q)$+VfFV=kJ(BCYU{LX!>05%QKs2!P7c{|8>8K!RusR4lLB*DG9 zk9TSSz&VFb#>=d}*N%GH>PE{Qa^A($^Y4Iv)C_}tM!9d5XNCX(002ovPDHLkV1g%Q Bh2j7J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..e933f9b372aea73ef527581eab7cae11a76458be GIT binary patch literal 275 zcmV+u0qp*XP)Px#%}GQ-R5*?8kwFW=a2Up){kM^tujAn6B(+H*A}gPOlH(l6g?3oEP)f#9WA6A^ zTxRw@mjSV66s*?a;I2BgTt0rImt~tv58ob|_N$fxfgT zQ?6>MoUG}lMF7B}2s&zwla+j5jEV4F50M1`;NLu4&X-^g{lYuCO_dwX=0vw^)aswF ZaR-sxK-d2)kvISV002ovPDHLkV1hXpckloJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_accessory.png b/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..c8c6bdc3937ccf9d1bfb34cb8ae7b5473c71b672 GIT binary patch literal 516 zcmV+f0{i`mP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1002NqL_t(IjbmUKSs>BN;D4f*!GB~i7E%n*QW9hE z34YGNz+muy{je=1?2LJ&2bqjoM#M})40000EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003r5L_t(IjbmUK1tft)FN6Pw=4t#-^fLHQHO-8~ zYIZPFW;k%_F2nq77f|#NGytDwf(9gd8T{8$5@Wb_?-f?f3=9kmOoVL4rx~XU2ssn+a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_head.png b/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..f6683b35c4b15f31a905ac48616725e6b19cfab9 GIT binary patch literal 585 zcmV-P0=E5$P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004zaL_t(IjbmUKXuya~Fwx84KQ0aPw_QNdgVg|- zAzDge3}Pa@aIpiY?qV2%(*SgrXeo&?m>WG}uuHnZnCNBjA7%(%1F*Ts+~^U*{52eK zmoO1)!2E3&7_Z%X#c=YR9D{?IGF+T!1CR|t1|%7P4UlEPt2dv?HvpSA$O8Bh+eiZd X)+8`Y=D9qk00000NkvXXu0mjfzykSi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..64e284149959caac64ce6381e24a79e64055c8a7 GIT binary patch literal 564 zcmV-40?Yl0P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003}FL_t(IjbmUKXuwEFL86zze`NmrZ5L4VFcD*m zgPAgegPAf`1Bn8OUIzcWbKL$Pny2v}-4KFaKsH26NsPhV=n=#GH5?2KQ11}s1(@P% z_g*oaJSPYD4g;}afNlsfU?If-21G279+0D8FarPt9wm!@7J5(s0000%!7mR~@B(b15dQ pox9)gnD=>+AgRaw3x3t^VBXcOVSQwuk`T~E44$rjF6*2UngHo&NNoTB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_blade.png b/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..a0767f1e7e644d94a987ad1b9513d778d87d9237 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFdm2Ln;{GPPFA>RupJW-<-3x zb?(&Gty4LwIQSpN?pfKob?#Crw}M1w&Pemrmc&1^A6Dl(c-^#k&Z~Bv`Sq4-59Z9y zV|u;IZ0QvdPj!u@I$OgWgp$vwPGVKgG1y7J={XIcsynmp2QzFPQWA!~H+^8r5I? Ww@~o>b;Wmjr4Jod>iRH4CgdEq%nua_R3e^%tKeHx`bJ!o55NQ2JNzBAXS3;kgHC?>6N T*|JO+XgPzYtDnm{r-UW|6`(^+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_handle.png b/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..3f62937c602fffea8a123364308e0a5ed9a86663 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar*{o0}S~NEAZ?INlZ&l zN=pH>fL!E2+o&`!!BymFIf|oEA)( z_56)i@`Jp4a}17cSf^cAWFVH~7nQwY>my$FxoV4Ud&Y7DoyOql>gTe~DWM4fbyHBI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_accessory.png b/src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..4d5cd1d91728ba1fa3d87c8b6bcea89bb0322cf0 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=cb$J50zq+(9;pa1{unN=HFmF_NP;|XO}(~JK2|Ns8~JgkNjdsHM1 zN{_Dk|Nr0LzIcW^fW-pqd;g(XlC}zR>_4ixWP0V1P@Yj19 bBhckajd~aFtb6hm=q?6NS3j3^P6757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGo2QFoNX4AH7dQGHHV|PAus?a9D@D8G(H6z?TNhuja6J%qOWx6G zjZX=aV`Hyar_shKQ@w?*w3-DTIw7lbds6?q$(}PMdL;|hcd+a`^7XQD{#&gc z|JY;~t6C2Zrx-uul=lpeCvOo{`mEZkEYx`H=wIgi?Ykv-`?8dawt6NzE1B$=Ww&X1 z;^9AcSTrVhOit>a{WCk)<=?)7X(zYW-qF2x^D>+BV(p2h3jT*=Kb5we%sFOV*YJ7C zpKfy|)+DDO+wPO6=h&W`b>pnBSEJ3k@5ble-foIM$&g-G&AXDNOYNqGY757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwmZytjNX4AwKmY&RGpjbVD&0MNqv6Q1YyZ>I(s*Xdt?NmVeDM19 z@eO%*Z|(a3|KH#9pNfuWbA&NB@svvb|NHlI{pDr8r7|)y|0mCRQz+GB%;V(4Bl-XT z@Bj73&&ifLZ2q@=mt}$}OTI$eEJ;JAga3PHZ@Xe>X!zH^Y~x{rmIR%a8B#|7{(k>n rzhfuoOT7lhm|2}>4Du3ezyN5SV%WQK*49rzS2B3I`njxgN@xNA4LEU^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_handle.png b/src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..7e630906ebd067409f598b7e0e655f5dc8945013 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwv8Rh;NX4AwKmY&RGpjbVD&1Yo)}z6E=J29_?5%AEQ`*@KC#5?0 z)Yu&Ucenc0t^fai$4d$}C2<6@J*nEwZ2I^A{)~5ftjfZ+{dYZBSK!>i*Bq12f6RV= z-GBSC9|d~cH-Or z_y2jLzh5c*_xJbwH5onypHoEsefnyD`+YnQgO;boqNe7zoj~U@c)I$ztaD0e0s#AZ BdXfMD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_accessory.png b/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea12a7da1a3515fa28346b7a6712a76d40f3418 GIT binary patch literal 550 zcmV+>0@?kEP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003f1L_t(IjbmUK1*3orkmzObKhewJKa9^pibe(o z1_lQ+WrhQ%?!v{HiPck}@P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004MNL_t(IjbljkGWeh9W$>SYOu)pzz`#&e`j>$c zLl_dh4E`UQr$LcR$Tox#-4HD$F@|gRUNOwyc7YMMHXH_!V+d9Sq!_}4O>q9U3yjz9 zy<%`MQzjTYEVv|~Hve}pQ)XabVEB*AB{&Tr#SnskqVzEe2m=6$7(dfJp6zP@0000< KMNUMnLSTZaJoBvp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_blade_broken.png b/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_blade_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..55a9f5e93b36f6b28ce3cc26b1d5142e9c555fd1 GIT binary patch literal 549 zcmV+=0^0qFP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003c0L_t(IjbmUK1sEXF%iw>am%)Ex)iYre)KU^- zAl48@T&~bk5@Wb_?-j%RZ5Obr!Rvzg+b%F(yZ4I0!AzN;OIUD8KyCi-V5ZE#z`*by nmrHOOK#Cy*0V%OE3djHep64Ug3*7pU00000NkvXXu0mjf6EN+F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_handle.png b/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..92f089d5ec804adf570743613151c30ccf5ce172 GIT binary patch literal 569 zcmV-90>=G`P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004DKL_t(IjbmUK1*3opfRT`bL@$H?T1sLJ*Y3Sy zn7{1;hI%GK2F%}ff$`eCR}2nj$_$BK2LI9JS%`5a)aL&VX37i<3=IE~T|&?c$bgV{ zh&JTVJdOV_?-1n$WB{?*;D1@^Uj_ySga70?1L_h61_lNIxn3%%$w%y_00000NkvXX Hu0mjfvNQB> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_accessory.png b/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..218de2882300ceffeb453332e2ca1236b15f4abd GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>z@qLn;{GPBi2`qQKL7x%phv z<^{VI^sIjUcdu`1-u&Rrg~z%_ovW4 z3A2>hj3*SQ1qEgIdTDyg+7{R3G%&dcv?Rxv$@0_LBlTWiZGzv5^oVJYrR{OR0@lomhdo^cOUD?78bRmPMtDnm{ Hr-UW|V)IyG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_binding.png b/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_binding.png new file mode 100644 index 0000000000000000000000000000000000000000..cf42505fc974dbad89c15aaa1de82137ffe45f28 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4xTQKAr*{oCs^|`IB+=YD>||= z3k9@@+g!;%@2t+Y>-+b6p6VCwnizX=&h#u#56xs`urU7B)N$eV((~!J{2nmZd=c;n TKkWSiXcmK~tDnm{r-UW|R3;_h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_handle.png b/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7091a5da2ab92240646c2e51b513aa9fa73771 GIT binary patch literal 330 zcmV-Q0k!^#P)jStM9>!)85{c;-{435fiDmvGr>R%LK=N3uWz6z3MR`kdr84@9Hy!&3&W5}A_V}(aTM0jIY|=QwvEcNqzedSUDs*f zcX|{-9?ei&mW2$%pswqrPb44Xhs5GICet+ejGpHax&qfU4Yh46P1A&5u>({zO(Wm; zsjh2E)0F0UrgdHEM!dKNo(F73QN*gMVtJl3%d+^UadUv+_*J`EWVUTn-}j^_3ZGAa zzob6y87yWP20D&|&hwm6JnH~h-sxWi c&iX#S0M-a<0;RBMh5!Hn07*qoM6N<$f?QsY7ytkO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_head.png b/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..64355d6ead33ff04dfc12e0206261cd618e5566d GIT binary patch literal 228 zcmV@tmK9y25O%t8@&+`S>T5BOTO@nb9(RH0fUDq(i(6(&|Av~BXz{#iR`<~WyMT`-{ zFrca`1SO*)8K6V}0000K0S^_QvM$bJ35za8Ivo7_ovq`l_lv}rc3YfZTn{W=ZVyfh~i$JsI7N@0B~&7k-s!|+(2#h0Uh n*G#!|wp;Oph(G(k=LgtMWy{QSkNKqwbPt24tDnm{r-UW|u%1Q3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_accessory.png b/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..aaa8adc03133841f3bbb0687d83b4b47e598bd9a GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGoTrOpNX4AH6Zdm9704X#YH|Xit;+{W~ca{FG?c1%)5F;7tz4O0F!fy2$vz%HPwpAa=+rRyW@r>_R z=PSrF1P5!@v|3p7g+8r3b0tpg$?8K+*F6MSEO?w;W@z0F@p#h__~~ukc@uRerCjsZ zf23Vz>4XQoGR?bi(yyP@BdPiGpKjJi22;2~3})%3G1=HB2pn3W`&|BFMpp=@^PJ|@ sM>j{8TK+tDMDVz7XUlQpt1>TnucmqJSKPuK3iKI+r>mdKI;Vst0O9t4`Tzg` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_binding.png b/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_binding.png new file mode 100644 index 0000000000000000000000000000000000000000..ce63294b2783ddbdb2fe5703949b48a73443b93c GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=a_$kW9!q+(9;pa1{unN=HFmF_y757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{^|Vk)AG&Ar*6yQx*tp=t*E!TNC&D|M~m-pGaQVo%QyA?C!FwH!Us9 z5=|Fm9h>t%S5mX*#*pZ`_=VpH>?GYd#_&DJkhU z-!Am{fdfY#ynTF|Opz>wkr)vz0vh`1tti84@!kjvPHIF=tNftcb`6 ziBn2WfqUAL7&Hp_WGo`Szx`d#=I(x6jm>SsTOWs+|9P$&PK-F*!W#McqO$ud7FHGs z8JRb;x(+*S$U2b8V0>ZG{rz=@FJ8Ykn`>RXZe8-puK%Kjf-Jm@(gvk(Z~gzxC%3Y= zv@qusH)rCUEoo=}7eCj({&j8K-~AdUBI^|k#5=k>53@S9one!jB;|BNI)VAe|NrR* k*8?)U+%Gxwqyb}b;>kL1`K4}~fPv27>FVdQ&MBb@02A`d_5c6? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_head.png b/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0d8c7f2d02fb7ad151d39899660880b7912d70 GIT binary patch literal 269 zcmV+o0rLKdP)Px#$4Nv%R5*?8%)M&DP#lKw=Xhf9YPr(jrvz6UGX6z5# zw3Q|dLja61eEPoFTGOo86@a>QkeF|_f`;K&&jkp61I(YnN~I{4D_*DJsH+Ew*?J>~ zL(Hf@aDy-)iXx73q*SeWxAZ5|757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwzNd?0NX4Aw6a|JZtKI+p|NK1v;r;*ndG^=+O`LHx_V@31_6!bYXSd|j^$PP7-C|9Z9htA4pTQRPL`L|(yo<4+;nll) z%eVJU?CeyO&A4#pmz3KcwgU(5sd7JL+qh}dmA}lJ-rwDOdIFnCiw5%q-Xd=grs~A+ wi+;B3ZQy+qWzhe_L4~bH${>p&l!t*Kl+Q9N>Eurlpi>z<{9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/invertedscythe_accessory.png b/src/main/resources/assets/tinker/textures/items/scythe/invertedscythe_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..dde58578782ff280587d265b864af038e321d19b GIT binary patch literal 6027 zcmeHLdu$ZP8DEHEgNYp+FmW6QFGr&A$llF9ZeRF;xih}QKI0mj*uia>-JP|!_C0#H z*oSE;fq+Uw8e+;L6ha83aw0&51}O=&khp0|TJcZ{3ZxB=2_b>n2o(Vp4|n#?Hntk6 zvSj-&pLBP-GvD`{@AsQ;=9}HMr6q;QNf}85K_q)U?lSy8-ujM7z`t4l?t=KQwW++) zEQ5_?C>+#{dPJH_Lx@CCLnnynIe+P*lveVg+m|NJn)9Q#LYe0nL-_n!4Y_?@MG?Jr zRk5e#{E1nIGhU=VKk(Zv>XSzgpy{4Rl7D@?_{`aH@&@n2U2A5SZIeHpc=z7htgobc zJ@x3WcbBQZdHn1@^8UH*&J_QIvCXY7A9(!jbqR;^A3Oi%md~2*ezee-n~|E)ad6p$ z+jTe3Ev&y6Gv(Y zV$^EG+Iy2S?^N!Q-xIG~ZksV?WfplnrR10Pvi7d#IWMI@{Hxp7I={To`2@+$ zD0UutbHzJVb7xGR@cZ{G_FqaHosfDo^UqJ|m)Blb5?;S>WpeHxzbuGuy7_)y;f`kE zv9<|ocNGiIv?sT}<}12%cz&kxly^$*)31YXSN`dh>dik~excf|Y~ zv!(k6kM^&wRn%`?3Kw^J3Ic>ah~0KZ#j`z6K;R- z)32@(#KeGs^Q+QVEUQ7k9cn=Z*`xjtPCSCh&WnbiT8B(hK{ZAo$9DD55gTb}Iksn= zKHv+vP_5x<3Zn&0CFN>UohoUzyxgShsEh&p$b@9nUmu9b(HvV0SH{;?v%^NlOw76* zTcxj*bOpnRgXlk#2Xi2y} zMn_W}s2=&TX#|f-_Zza%>nrW`uq3E4{Gpf^7Q3INY3TRG>KB{U6Qk2N5bWNI+t0d( zd(0SH`FyfFs4lU>^SX0v*7&j(R1HmzU8;~%I2N%Kbh0YNX&Ot3fOk?1hmZm}Rs@33 z2g)0Wm@uFs3krkV4U9ue0?;`pPtlwvQXGS?BwAo8T}8aaL0Ui}=mRl7Y~ZYf^?jqV zpfn7{>IiBQ%~J{kAjRo85Qub!QUFkCQDk*mk4K}a^4wt95Ak#weprJXp+HS+3`=l1 zzto#!W9;!!V=bli(A2R5UIRuz3pPgX8iUE3f%C0biW-weH4A$q^tPn`cv$xxa7nBA~=!Pc3pn&0I zz{m_;&H$OFWtN=@1i3o^ERO68YKFe_|5;nhhs=&oy2ps%@t4M$;%jOF`bqpQep_$E z786OvmW2$}IE4soKw2zLj1})vYhj=U;r*jKVSCz*?@0#W)K$O(oCi*bXHesulmrAw z(MV+&4Tw4~qW$xcJz7F66!Fjq0DrUXPIUEy$YDsb@W zIf2aZ!$A-4*_uX+9L4c?c;OutPu(Z&&ni(1U`6w-TJ3A`Nkd zsyfa~R$wRq6hYOXz$ubC1oRl06^DbKljaew#)#qt8Yd?%nv^I>EXC0fF(Rw+A|0=N zz5DWDY%NX!*PG#>r%I~M^Q=gTP65*sG(;(y##5Tg^QxjrkaG_9)`Dv(U}csW4tlsA zC^UxvB?vri&6!9^NRcR9Es!MYcnLD`>OXk1*K<_pp_lEjPRc!1KHKp>=YY6DpQAOd zm+>}yWXDecj^0Or?m~)V9m-Gl`C}-DAjy$I2BhzZTqAM~NPz(vk7U<~Tmw>IK*l54 zHE41r-G7OQ0{F?l5x*k*>E)&>{CY7#DJpamw}?xG`k&N=PvVxbAx~9=AW~Yb@2F3L zEgEi2G`+rp#BWEZC6Al3?uG4c+?4Be=a-9rRTrl}`1i!a&6!=^ADnn`-`T0B)@d$K zJ^nd#^XF~Jr*3TS$^-k~=x}uHc(!@NBVCbuS^ApsWe*V3uTI|HA~qLdB*I%z;@&rB H@yh=Kvj^qS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/magical_wood_scythe_accessory.png b/src/main/resources/assets/tinker/textures/items/scythe/magical_wood_scythe_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..23c941b9bcbe4d41e95110d0e70307c59df0ca21 GIT binary patch literal 540 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 T)Oq8d00000NkvXXu0mjfL0J08 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/magical_wood_scythe_head_broken.png b/src/main/resources/assets/tinker/textures/items/scythe/magical_wood_scythe_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..eabc3b7c063fa467258050e847501b524ffc11f5 GIT binary patch literal 558 zcmV+}0@3}6P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003%9L_t(IjbmgW01~|n{v-3}Z@a*V%xA>Vfkm^H zk{AO60|UdyFFzQbzWRh>5MBeY8T9eX4+b~8R}Ayla4^i@c7c&71CR|$4Eezzs>sUl w`u=Z*`D-{x(T*_W&^(R*L?|5vqhKfj03`|}KoIBBRsaA107*qoM6N<$f*Q*1^Z)<= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom.png b/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..122df71ec9b41995cc9329d067cee9d62a81ae3a GIT binary patch literal 230 zcmVB`ZLc~TFg#?8ybYZ&{hEbe(fBcC5`hf$4 zkaV7B>P0{6LdICywhbW!aL&6Rj~cM=ds>zS)>>$-o4dO1<6a1nrfEvO$`|BT`Bwe* zfH8)7o-c5BE`aR3_Z~6E;kUoClraX*xnf>Ek3^XukDr?;r8x~n0Vt(#90#P7L(NU` gx~^Rxr)dK41{YO0=k1j$&j0`b07*qoM6N<$g1lf~>Hq)$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_1.png new file mode 100644 index 0000000000000000000000000000000000000000..122df71ec9b41995cc9329d067cee9d62a81ae3a GIT binary patch literal 230 zcmVB`ZLc~TFg#?8ybYZ&{hEbe(fBcC5`hf$4 zkaV7B>P0{6LdICywhbW!aL&6Rj~cM=ds>zS)>>$-o4dO1<6a1nrfEvO$`|BT`Bwe* zfH8)7o-c5BE`aR3_Z~6E;kUoClraX*xnf>Ek3^XukDr?;r8x~n0Vt(#90#P7L(NU` gx~^Rxr)dK41{YO0=k1j$&j0`b07*qoM6N<$g1lf~>Hq)$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_2.png b/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_2.png new file mode 100644 index 0000000000000000000000000000000000000000..990a8c1504116eb88a97a467a22a593abeae0725 GIT binary patch literal 216 zcmV;}04M*6P)YNbL{PN8;QM{od@PN}jXAtYO{$#%a)NWA&xdB8LNkbqLEN-66p z`n?K`F_kd}r4+E%9zk9!fOB3k#*lM{7~^)f>b~xsa}^;}Pdg9D?DA{(nSn88K(E#b z2qAzF;;Oib`xTmfLI|XkuEXmNn*H{4TI&YAnjJ9gd+)D`H!-F3=;Lff0Pq3Yq%$LK SbTrTa0000w+r)&-~YAfOAeSiF=b`V>U}l_#|~7^^YH2G zR%l@e@+wkflArNp&cbV5{zWmeXSklrESZw#weR$ioeq1;XUwg!ahj6cGjSUGM`Jt2 YFV9WSeXZJh8R%pNPgg&ebxsLQ0FUEX^8f$< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top.png b/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top.png new file mode 100644 index 0000000000000000000000000000000000000000..a71227df55f7aa736e468ff6c5ead1eeb145ae4d GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar*{o0}Q#2C*sHxJiHepub^ zk=*sHxJiHepub^ zk=@6FGV#oNzLzu=`}G)Jh757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGpr?ytNX4AwKmY&RGpjbVD&0MNrQz4f%m4M`_RM&AZ)I|iiZsK; zJxlx?9UBuLO%nb8Ia!HAswwF}y+TMxP{N0ApR$zPjJp`OPG0^uep`uWY+71baA1r{ z;HTPhC7`&YU^&%GH>GL+(!ffdeO8wmjuv&QkOJzrW<=rCoRS+*#JNqF|B_ zgY*HQx&757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGpr?ytNX4AwKmY&RGpjbVD&0MNrD5C3%m4J__Ov|w)tTI*B7MOu z_t*c{Zn5hpPoFmSiQe?2KFo*5(K&$U$M^U4%}q^A&D*z!3meV~Jda=UMNq4>K{nJ3tFnGH9xvX757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwji-xaNX4AwKmY&RGpjbVD&0MNr9t%fx4-e5DkKk2`&lgEX_mko z@OhQ!>enJ7A`)eCw!iM*y)|orq6V7*Yd zLxw4HR8&fAHKW{W@C%Z{lrsHRFssGp8nr|)n}lqe>WOkt|(0D2D+QU)78&q Iol`;+0DAOsIRF3v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_3.png b/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_3.png new file mode 100644 index 0000000000000000000000000000000000000000..93e931a40c32ff28d12c20f43cb5df52d7da66d2 GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwm8XkiNX4AwKmY&RGpjbVD&0MNrQzr8vVZYAG6WAdih4_WnkBqE zH~0T^-RQ98OO~A2@ajP0|3p4M7G6ig2l4{iTAGFx7B|gV1s6&lZ3uO^JzXa@aQa-4 z`%m1Lq=_)sF>l;6N9J&RQt2Y;50B5=xBcdqGccH#&0s9NGU_4^17m7vC|la6ScW5K z&hRWr)7`GVeoTCuzCs5)eN4lelF{r G5}E)&Wo;t> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top.png b/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top.png new file mode 100644 index 0000000000000000000000000000000000000000..299da8927ee30a6019b638a3243fdd8a44f94433 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwm#2$kNX4AwKmY&RGpjbViX2^8%KQKS-@nH{JboR{Hev5+wQoj3 zCJMWDys_uj)@D`~7CwBknfRtXlW`|L^bmZN~2X zS2(*m4EEIjo_6r&?d323@BhzZUtg1c;lkDAh#Obi?y???to)xJvoq%S>Ep)}o=3`M`T%<^(ubSUBN7SEovd;9)}nwm757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwou`XqNX4AwKmY&RGpjbViX43^toA28B_Sn&DKjM{A>-8fbd?N; zr$;*fOE&be2&U`Dt`-&)OG`*dN%`^Np{?`rEieBUN(FFTIl*$J;@_*UR*H^}ZRYv+ zj4WnLm^40V_$4{x-)W;Msi{fjjvre(|NGCeV&39A<>0}9^_((ZT$^~NMn?9$$l54% zA$r337qjR7zaJ9Zx{#||t%757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwgQtsQNX4AwKmY&RGpjbVhVZTpUiR<*_wVw|%F4>lzHxlYj?7uR zs{b{M{Qv)5eof}jPpPF`TwOfK&mRBmzud5lbMn9c|31%7{J7|7DOVR4PmjZo zA0Lz3&YU@;rk0k*mZs*`cBX~pjb6q~o3H;TE%ko=757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwk*AAeNX4AwKmY&RGpjbVD&0LIaltJ4T)mo_8=F{K8k+)B^Zx%5 z5_SLnoD7&d^IXT}hQ7$+gLToHQatBQTBLONusgqGL}a9-h=_=UM8my(g`d@!?e`z3 zU&B^%X4d!mmzS27Djc=6jP!M2H!xr_)DDq5k@BIWJkf)f`|!J_t}QCZl8^WO{r;gK x`9v2-vWhm3neL3{aAim44%WqNJyHxz4A+@;9NIIqjsacE;OXk;vd$@?2>`bFX2k#i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom.png b/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..4f6addc6817dfaa33e6b7403fa494beb4f6059f5 GIT binary patch literal 552 zcmV+@0@wYCP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003l3L_t(IjbmUK1=I(LUIzcWbKL$DtDXs6vxAv3 zoK3O;FmUbOD~9>oE-(^f09;X`m%)E6B{7mT<8%Qj0L1_?5nhrFU}T`c`6wf`W`L+7D_I7>0kH`O9RL7J*dEWmO<3Xp0000EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003l3L_t(IjbmUK1=I(LUIzcWbKL$DtDXs6vxAv3 zoK3O;FmUbOD~9>oE-(^f09;X`m%)E6B{7mT<8%Qj0L1_?5nhrFU}T`c`6wf`W`L+7D_I7>0kH`O9RL7J*dEWmO<3Xp0000EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003u6L_t(IjbmUK1=I(LUIzcWbKL$DtDXs6vxAv3 zoK3O;FmUbOD~9>oE-(^f09;X`m%)E6B{7mT<8%QjfVu{ViSUwa03!oZ=pQ(Bmn8qA txIj_vD#^B^7$B<1N|pg|Ky1Q62LM7L9+*Fg&RYNg002ovPDHLkV1j$q>Qn## literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_3.png b/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_3.png new file mode 100644 index 0000000000000000000000000000000000000000..63536d0f55992563e69f03f3c0ea1175f531327c GIT binary patch literal 539 zcmV+$0_6RPP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*10037>L_t(IjbmUK1=I(LUIzcWbKL$DtDXs6vxAv3 zoK3O;FmUbOD~9>oE-(^f09;X`m%)E6B{7mT<8%QjfVu{ViSQ1v3l!z9Qf7dtA}eLi dAvWEX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003!8L_t(IjbmV-5HOOWIMK`CKQe#*whN3bq-b(5 zQ)XabU|>*`yUHM{$jZRLVDKNO3t$?xl*AYq7#JADM0gnvoVtsmX8yJdj93jw^fLIb vr6h)-Y5ukg#Cy3r$L&A5pGUzc7`y-gS$-Q2GrXiX00000NkvXXu0mjf9tG}* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_top_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b314102954bfac19758003ff1650204983ff9c97 GIT binary patch literal 556 zcmV+{0@MA8P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003x7L_t(IjbmV-5HOOWIMK`CKQe#*whN3bq-fGo z5@Qe(;bl;iyUHM{$jZRLVDKNO3t$?xl*AYq7#JADM0gnvoVtsmX8yJdj93jw^fLGl uvkh6({B0MA_i}fR+kbRFkAhJ!cmV)dq8kr!e+Z2L0000EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003!8L_t(IjbmV-5HOOeA<@g=Ka4$p+XY4zQZz6y zFfcfnDKjX_U1bneWMyDrF!+zt1u%_TN@8#^F%e#d1E=o7`SZ73V8m)bqL;ycEhRAw v4KPiFT+P71z`)R*EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003P{L_t(IjbmUKXuwEFL86zze_V3&w_RXlA*4}D zNenI~Cc?|Wz`($uD0h`XRFRc|fx+NERu?3C8T{8$5@Qe(;bk~*>Ml;#&EIwbw-35= j-2UTp{wNp)g9`uvHg^;bi`MWS00000NkvXXu0mjfpo-`C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_handle.png b/src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..7a4ad0f41cd0347aaf860abbc2af2ed801ac3df1 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn;{G2JYr{R^%yZadCF< zWeGN5aW)W5-oTO_5WMk-Yj{JPANnsMfsMCMx0_kY8_mdKI;Vst0OI0K A4*&oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_head.png b/src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_head.png new file mode 100644 index 0000000000000000000000000000000000000000..5230c15b366db6c82159743e26acb7701c89010f GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`n><|{Ln;{GPTa`bV!-2C@27r{ zB}9ZHFwl@ic>{~IfrzsKQ>KyQEEg}qrJh|KllMAId9`kbN7=`(^FQT2e(irnC1ToB z#s4P07Uw5N=BZ3u_5Szr*H+t>PI<7m{aVzXNKKQb{>Kf)e2OeQhZ|n+(qQf4)Yulp z^?H}mF^*)OS<4!y2wA3o)T-(Gz3-^ad7kaL-L>}(`;-qK5fh%!*>!AzY(#ct*`-z4 jx6SrBnf_p}t7VqgskQ4p{V=i*=z0cES3j3^P6x2ARz>T>+Wy?mNmPgB#fAu_w#24KYv4y z1J3zP{l{@Y2vOM@DB1ekw%yCJAf*Jx7(xiJ)()%%Qk~%QJhAUPrfEWq5ylvDfu;a| z+g3`!dykwmwAL8M5mHLh#z!NN$hxj5rC^@t3Vyu<=Ukn=s`Q5Iy6P2rxu^f{H}C?A Wwl?n$DT6Qo0000 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shovel/inverted_shovel_handle.png b/src/main/resources/assets/tinker/textures/items/shovel/inverted_shovel_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..62751afd793f64b8e2f89396ffe57fa3e347dba2 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=bwt*47)NX4AwKmY&RGpjbVD&1YocHv~hEKTEo^X;o=9Xxew+CnSU z#)&G-ua=$tx4-)Nx?K$q8kU`EvEVsd!MkF<-Ru8XPf!1tbu822>XVoMzrVQ^DJ~*& zC8W{aIE*=Kncx5Vzptk5a!@i^EOEiQ{@?%jo*tfdKA9EVU%uvP^(e2AJjyWPRqgKY zS6hGlGI@IRsL)c$qYaCWxVXussUgtr=&3^ZlP65E*p*#DNnEDr)C8JUB4% zKPR7AkBj7nA16-!zk8Im^ia|xo;^%VJpB3h(-KmXQx#6JYWvOodp~eOxVnzwxdVrf zpa1alFgu$Y8ylP3iuavd&7#ZC{foED&APk%`+JFd`zlTb+_T@PdFxcqk`KudHE*8O wGi$%Twe-0EUv*Dqqll_EDnDnrA536lSkGgzmET)h9_V}qPgg&ebxsLQ0BpW#X8-^I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shovel/inverted_shovel_head_broken.png b/src/main/resources/assets/tinker/textures/items/shovel/inverted_shovel_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..ba14d0b0679c2ba3fdea248915a0d684475963a3 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|c6hothFJ6_ zCrD%*@aTH9vzq^3dUA5=kKfZ96%QWln%D>gtr=&3^ZlQH?_!j?p4zbwub=C;v9kC5 z@h{krn4;wN`H`~vfB9RRHu|}^v^;!$U7trrCWmKD&Ke#NVBw7@eD&u4yj!bwiR;H1 z)cpQ6wQ=_B*$>aY-p!IP1|qoU;Cv?m-fwWZ+DFHnsm@oV~OUiQ$0&QBuCV| zc~W1?zWmnGgTe~DWM4f^^t4^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shovel/magical_wood_shovel_handle.png b/src/main/resources/assets/tinker/textures/items/shovel/magical_wood_shovel_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..ad264915367fb0316c842b542b579c076c11650e GIT binary patch literal 555 zcmV+`0@VG9P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003u6L_t(IjbmUK1tS3@dKvsbG*9DyqL;ycZ1RkR zG;1k|FN@}c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shovel/magical_wood_shovel_head.png b/src/main/resources/assets/tinker/textures/items/shovel/magical_wood_shovel_head.png new file mode 100644 index 0000000000000000000000000000000000000000..556da672ba3fcac21a39e116dfebe98fdbbb3e67 GIT binary patch literal 585 zcmV-P0=E5$P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1004zaL_t(IjbmUKXuwE{;zTcl|1kFaZ5J3B7#J8> zNYN}U#>e1h_liMOk(Ggg!QlV=Z5J4sNYTu|z`$_woE*dJ`@i9G1Pwse%+JHYASS}g zaQ~4uT%M>fNc1xJucai$ASS}gz`(%3aNyKkco-1nh56eqFkZX&3PUr=067*$!LR}V XDzYd+BV5F100000NkvXXu0mjfb2S0b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shovel/magical_wood_shovel_head_broken.png b/src/main/resources/assets/tinker/textures/items/shovel/magical_wood_shovel_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..b134d3a003f7b4aaf5c0ad7f57d80cbf57644a84 GIT binary patch literal 555 zcmV+`0@VG9P)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003u6L_t(IjbmUKQXtXG;6J(;6D67%7#J8BiPbDE z#>c?Gz`*eI)hD?4{B0K)SxC{$&%?o>svye1z`($8;M85xT%e^S#vmrb3)eh<+XY4j tV#8qmwhN5c?!Cg$OftX~kfUJ80|1hoA?Gi8#UlU!002ovPDHLkV1iH|^6mft literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shuriken/bedrockium_uie_shuriken.png b/src/main/resources/assets/tinker/textures/items/shuriken/bedrockium_uie_shuriken.png new file mode 100644 index 0000000000000000000000000000000000000000..d83d26c322c4f51d00a9f3f5ff1ef4176230b6b8 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`i#%N%Ln;{G1{iW3HsG-_4{qa` zDRg3nVx`xC|K|T14@%fn7*-TmI@*@3bUuDf;iQ${anB#$G`Vz62R*NRCVnmI;F6af z{6%}dOB@e$(hTkV+QuPsys`HF#&z23UNgDASmnOtrtSI7e1{u?y3SZWU$Sh9lzYQ= z6~2zb?*dHQa-Gl36tLr+e1+x4g+@a*L${2zj^Ri0kDB-v9SPrS`bYi$8`gO`TeKHW T^P0LB=voF(S3j3^P6757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGs;7%%NX4Awlm!AC8anz~yZ`_H^}YY$|NsAazIt-@s7N0;cj(ZD z)c1{66BzGyPy46e+pTs>U;|^0j}OnAoHaaqYWDEBua8+ddsEHRdbYOzJeCs$S$LVG zC&)^kv&eq>>i=&2m^F_dB&1uEzAl@)bC%ZODXH53p1V9WZ(%*=!OfpKXIs+M|H9_^ z*FJtOGG-_>O%=Y-lf=N$aOi+fsOXWbUB8}W-d(cv^#A9s?n2L*W`r-(iRLRQQ+eF7 z^fX7-F#`q`hgps#jwK?2hK-2~D-*6X90YlJj@OkCiIcHF4>EYV`njxgN@xNA^tFh) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/shuriken/magical_wood_shuriken.png b/src/main/resources/assets/tinker/textures/items/shuriken/magical_wood_shuriken.png new file mode 100644 index 0000000000000000000000000000000000000000..bac61bdb7ee64a8bc63e7e217245542db8653f26 GIT binary patch literal 550 zcmV+>0@?kEP)EX>4Tx04R}tkvT{MQ4~ebOcWOq1Wh4gF@*|(X^e=aL@@{kB#Dqj3uiG4WX3R) zU}GuR3KlMnQ41SuZ7pmCL2v=Fwy;vPkudU;K!O-w^AGpG`}psEkjr`9blRrDw2F2# z98wa=l+y8vOfOvo8C7+s5Q)vjX<1+QNaDN;h*_=s{w$xd=I9_Pz_ebliy*B6lN-f? z;C;ZaXH^5Fb70I)BvT+g3SF!5o8U~9Wiiul$D=bK`vE1>#99;US=$780vIw(%K$l1 zV?*$!U^8FR>+cjBde^L_n9zYi!psw45e1DBIr0<+JFfeE?7Ec`@I1qn)$p&EVd@h+I}L5< z2zs{Q;<}+}dvLi8{Z9qeR;!W+kke^+KLcM9`fj0nxt3e~p3?`2Z^FV292~+(26|Rn z?A_U%+rK^a{C)uI*K*fVC>p*1003f1L_t(IjbmV-5HK<@Ffb%~8T^L{%-?o_krV@% zV2rZTzYJPRVkm}@i_@%07*qoM6N<$f+tkvX#fBK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/throwingknife/bedrockium_uie_knife_blade.png b/src/main/resources/assets/tinker/textures/items/throwingknife/bedrockium_uie_knife_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..495006116a2a3b3260ce7827aeb5521f2ba4f2f2 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`r#xL8Ln;{G23m8q7zos6i?QhH z=!kClz#w<<9Crol`%Kj^rAd0Vc>+OcGd+$p%uk!$%Bx~L`Aqfaw5I#frLnWuz3vJA zS9Wgl+0S>HniLM0_*VZ?Ze;#e+i&7)$iw`svd*&2n~8nRDz3*CO~rgmMXr^WMr4<( zNz3xRGCpm@p(t>CBdfROMxE~VogogjYMxC7Jh@*NX)M@kH|0jmHp%}gKUMbXcza*i zrn^XE(ZkBCwO2f^nDi$0NdB_ArLOrse905L$Nzs#<*Z>?(POhBl>4(g&{qteu6{1- HoD!M=F34#} zVw7M$`|QmDwnD?q;EB^e39QW!4V->Dwr)dG?SswyEdmzDPWZFES?qCUsmKY-{-v4w zBF&Z_>EO6mow4?AR#^JRu9Qv1d>tHB?@vX4LkOW;VS#ueCp_TQIE4 WmA;vCZp$;E{S2P2elF{r5}E+7dqSW9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/throwingknife/inverted_knife_blade.png b/src/main/resources/assets/tinker/textures/items/throwingknife/inverted_knife_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..855b350dd8d924eddf5bddbcdad6c6c507279fdc GIT binary patch literal 400 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=dGr>Bc!NX4Awlm!ACF5GQc7Ww(#|9_unFSOL2J5h!Cl)CTV^C!<8 z+>m>BmeuG92=%zt^jYskKFi zue-Ll`g7aE-`Cgk99pErQ~&ReYhe3r)}9_7bG`VrzkmGGJ$(KAe94v;R!N<=Z)Qtf znk+eS>O+$U|NsBzd4GRT+K+EvxtkYkFkqG!`2X*>xU*~+GgsBGfA{y4^*%iQJ)fuM z4--#KQxi{C)GXh-tUG&LBn=iW;aGFQ-1PDOWqo|i%EHQr|JVQDuuCLgC*$Qy!;)ud oi8s8qFt(Ton>0um@bEA&tSt)O>egZX1{eqop00i_>zopr0L^=&i~s-t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/throwingknife/inverted_knife_handle.png b/src/main/resources/assets/tinker/textures/items/throwingknife/inverted_knife_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..71c47e249f8e8b30051c3c35221991ce436e00bf GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#Xy=7jQv%QTmvzRgWR1M zZ=Tet2XYjWJ%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+gM2 z*O7r?V?XzwL{=cb$E=?;t=c~yW$CB%AnDA}c+5i3W76Iugxp$`sdCW=M z!DxIf|4;p=2Meu&wO23ul2E_M^f2#_@4w}nJ5@c36+CA>WJ_tCxK5Cb;fuRY^5o1_ QAa5~vy85}Sb4q9e0Q%ftf&c&j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/items/throwingknife/magical_wood_knife_blade.png b/src/main/resources/assets/tinker/textures/items/throwingknife/magical_wood_knife_blade.png new file mode 100644 index 0000000000000000000000000000000000000000..bc9cfa4e5dfb663355483f306580bb565c6c2427 GIT binary patch literal 596 zcmV-a0;~OrP)EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`Pol1W5CR5*=eU>I^B(aYd}qL;yc7@vt$jb){OQN$UE z(a6BSz#uKg#}FF!j$y(S7KZuTF2MD%5TlWSfq{Xahl64DDj^02hEFK!a2f#9%+JHY zz`(%3@bSwJhNrJSq1etqN*Le*Si>OE%iurE_K#nFFfcGMV6`2m0WeULVE6y&D}EX>4Tx04R}tkv&L4Q5c4wdo7Z%8ZwAzxPvw2QW1?|kpu~%23if>pESXHlY5mG z$Dmbc=x51lXlbssp*0ACeju6~nu=ONZX6Yq$iC$~yytsA&i5XWD>>bCI%dGM3U(|U zQj)1#CaDKv)cFlSv|(Oql2UXGkV@GfV2ioZ58r@ z_W{4Yp&B5a17mhFwG7gu(6u_h3C`457Bl^JA~p-MA5bzathKPdVVfXN0s+Ic43Lv` zHUyUho4KOic&FIVw{9)Pg$@i8W`PJ%6f}xt$x$Fk77GQ37-2$f{6jT=lp-2Avgjzx zv5ARV^CSM?ceYM?V!S@d7lO_g*ZmlQu3e~>UHALgb*m@fd4?;i>EEot^e1@AO)YQ) zecNzx-PE)_xZHukr@U&bHOT|W=`_5bK~D<$Z=rjoo?GLd(+5bDVDSbH4q-F{eXDKu z_O|BsZ%-q?AGJkt!ENsyG5`PoR7pfZR5*=eU>F6XfC_*Sn_!}s!G8xcWrhQ%?lR2Z zb^)szoCc7h8N+}?FN6PDN@5Jx?!6*PGltEF=4t#-^fLHQl17;3>-%-d(+o3!Y|WGc Y09Z;TX&k7zY5)KL07*qoM6N<$g5DA7QUCw| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/trash_can_energy.json b/src/main/resources/assets/utilitiesinexcess/blockstates/trash_can_energy.json new file mode 100644 index 00000000..14390a0c --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/trash_can_energy.json @@ -0,0 +1,5 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/trash_can_energy"} + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/trash_can_fluid.json b/src/main/resources/assets/utilitiesinexcess/blockstates/trash_can_fluid.json new file mode 100644 index 00000000..bbee3f0a --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/trash_can_fluid.json @@ -0,0 +1,5 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/trash_can_fluid"} + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/trash_can_item.json b/src/main/resources/assets/utilitiesinexcess/blockstates/trash_can_item.json new file mode 100644 index 00000000..a3da567f --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/trash_can_item.json @@ -0,0 +1,5 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/trash_can_item"} + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang new file mode 100644 index 00000000..a98fd451 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -0,0 +1,535 @@ +itemGroup.utilitiesinexcess=Utilities In Excess + +tile.compressed_cobblestone.0.name=Compressed Cobblestone +tile.compressed_cobblestone.1.name=Double Compressed Cobblestone +tile.compressed_cobblestone.2.name=Triple Compressed Cobblestone +tile.compressed_cobblestone.3.name=Quadruple Compressed Cobblestone +tile.compressed_cobblestone.4.name=Quintuple Compressed Cobblestone +tile.compressed_cobblestone.5.name=Sextuple Compressed Cobblestone +tile.compressed_cobblestone.6.name=Septuple Compressed Cobblestone +tile.compressed_cobblestone.7.name=Octuple Compressed Cobblestone +tile.compressed_cobblestone.desc=%,d Cobblestone + +time.minutes_abbreviation=m +time.seconds_abbreviation=s + +tile.compressed_dirt.0.name=Compressed Dirt +tile.compressed_dirt.1.name=Double Compressed Dirt +tile.compressed_dirt.2.name=Triple Compressed Dirt +tile.compressed_dirt.3.name=Quadruple Compressed Dirt +tile.compressed_dirt.4.name=Quintuple Compressed Dirt +tile.compressed_dirt.5.name=Sextuple Compressed Dirt +tile.compressed_dirt.6.name=Septuple Compressed Dirt +tile.compressed_dirt.7.name=Octuple Compressed Dirt +tile.compressed_dirt.desc=%,d Dirt + +tile.compressed_sand.0.name=Compressed Sand +tile.compressed_sand.1.name=Double Compressed Sand +tile.compressed_sand.2.name=Triple Compressed Sand +tile.compressed_sand.3.name=Quadruple Compressed Sand +tile.compressed_sand.4.name=Quintuple Compressed Sand +tile.compressed_sand.5.name=Sextuple Compressed Sand +tile.compressed_sand.6.name=Septuple Compressed Sand +tile.compressed_sand.7.name=Octuple Compressed Sand +tile.compressed_sand.desc=%,d Sand + +tile.compressed_gravel.0.name=Compressed Gravel +tile.compressed_gravel.1.name=Double Compressed Gravel +tile.compressed_gravel.2.name=Triple Compressed Gravel +tile.compressed_gravel.3.name=Quadruple Compressed Gravel +tile.compressed_gravel.4.name=Quintuple Compressed Gravel +tile.compressed_gravel.5.name=Sextuple Compressed Gravel +tile.compressed_gravel.6.name=Septuple Compressed Gravel +tile.compressed_gravel.7.name=Octuple Compressed Gravel +tile.compressed_gravel.desc=%,d Gravel + +nei.infopage.uie.compressed.1=Tons of spare blocks lying around? Save yourself some space by compacting them. Compressible blocks can be repeatedly compressed up to eight times! + +tile.floating_block.name=Floating Block + +nei.infopage.uie.floating_block.1=Floating blocks can be placed in midair. Helpful for building in the middle of the sky. + +tile.ethereal_glass.0.name=Ethereal Glass +tile.ethereal_glass.2.name=Dark Ethereal Glass +tile.ethereal_glass.3.name=Ethereal Glass (Inverted) +tile.ethereal_glass.5.name=Dark Ethereal Glass (Inverted) + +nei.infopage.uie.ethereal_glass.0=Ethereal Glass makes for the perfect zombie-proof door. It stops all creatures in their tracks while letting players through. Sneaking causes players to collide with this block. +nei.infopage.uie.ethereal_glass.1=Placeholder +nei.infopage.uie.ethereal_glass.2=Dark Ethereal Glass works just like Ethereal Glass, stopping creatures and allowing players who aren't sneaking to pass through, but it also blocks light. How can you see through it? Stop asking so many questions! +nei.infopage.uie.ethereal_glass.3=Ethereal Glass (Inverted) has the exact opposite functionality as Ethereal Glass. Mobs can phase through, while it is solid to non-sneaking players. +nei.infopage.uie.ethereal_glass.4=Placeholder +nei.infopage.uie.ethereal_glass.5=Dark Ethereal Glass (Inverted) has the exact opposite functionality as Dark Ethereal Glass. Mobs can phase through, while it is solid to non-sneaking players. It still blocks all light. + +tile.decorative_glass.0.name=Smooth Glass +tile.decorative_glass.1.name=Rimmed Glass +tile.decorative_glass.2.name=Bricked Glass +tile.decorative_glass.3.name=Creepy Glass +tile.decorative_glass.4.name=Gilded Glass +tile.decorative_glass.5.name=Obsidian Glass +tile.decorative_glass.6.name=Latticed Glass +tile.decorative_glass.7.name=Glowing Glass +tile.decorative_glass.8.name=Beloved Glass +tile.decorative_glass.9.name=Tiled Glass +tile.decorative_glass.10.name=Dark Glass +tile.decorative_glass.11.name=Reinforced Dark Glass + +tile.decorative_block.0.name=Diamond-Etched Computational Matrix +tile.decorative_block.1.name=Sand-Infused Endstone +tile.decorative_block.2.name=Burnt Quartz +tile.decorative_block.3.name=Sandy Glass +tile.decorative_block.4.name=Frosted Stone +tile.decorative_block.5.name=Ender-Infused Obsidian +tile.decorative_block.6.name=Gravel Bricks +tile.decorative_block.7.name=Edged Stone Bricks +tile.decorative_block.8.name=Border Stone +tile.decorative_block.9.name=Border Stone (Alternate) +tile.decorative_block.10.name=Gravel Road +tile.decorative_block.11.name=Carved 'Eminence' Stone + +tile.inverted_block.name=Inverted Block +tile.bedrockium_block.name=Block of Bedrockium + +item.block_analyzer.name=Block Analyzer +nei.infopage.uie.block_analyzer.1=The block analyzer, when used on a block, will retrieve mysterious information about "block ids" and "NBT data". How strange... + +chat.block_analyzer.header=-----Analyzing Block----- +chat.block_analyzer.blockid=Block ID: %s +chat.block_analyzer.blockmeta=Block Meta: %s +chat.block_analyzer.foundTE=-----Found TileEntity %s----- +chat.block_analyzer.nbttag=%s: %s +chat.block_analyzer.footer=-----Analysis Complete----- + +item.inverted_ingot.name=Inverted Ingot +item.inverted_ingot.desc.1=This ingot is deteriorating rapidly... +item.inverted_ingot.desc.2=Will implode in %s seconds! +item.inverted_ingot.desc.3=Will also implode if thrown or the crafting table is closed. +item.inverted_ingot.desc.4=Does not stack. +item.inverted_ingot.desc.5=Cannot be crafted outside of a vanilla crafting table. +item.inverted_ingot.desc.c=Creatively spawned. Will not implode. + +nei.infopage.uie.inverted_ingot.1=Channeling a diamond into an Awakened Inversion Sigil will allow you to invert iron into this strange and highly unstable substance. Many powerful tools and items can be made through inversion... +nei.infopage.uie.inverted_ingot.2=The process of creating inverted ingots is quite dangerous. Firstly, they may only be created in vanilla crafting tables. Once crafted, you will have a limited time to use them. +nei.infopage.uie.inverted_ingot.3=Run out of time, leave the crafting table, or throw the ingots and your body will be rapidly inverted, killing you. They do not stack. + +item.inverted_ingot.stable.name=Stabilized Inverted Ingot +item.inverted_ingot.stable.desc=This ingot has been stabilized and will not implode. + +nei.infopage.uie.inverted_ingot_stable.1=Creating inverted ingots can be dangerous and irritating. Fortunately, it is possible to stabilize the process by either crafting individual stable nuggets with an Awakened Inversion Sigil or by using a Pseudo-Inversion Sigil. +nei.infopage.uie.inverted_ingot_stable.2=Inverted ingots created in this way will never implode, can stack, and can be safely removed from the crafting table. + +item.inverted_nugget.name=Stable Inverted Nugget + +death.attack.inverted_ingot=%1$s's insides were inverted! + +item.bedrockium_ingot.name=Bedrockium Ingot + +nei.infopage.uie.bedrockium.1=Bedrockium is a supremely strong material named after the virtually impervious foundation of the world. It is immensely heavy and will slow you to a crawl while holding it. + +item.inversion_sigil_inactive.name=Inert Inversion Sigil +item.inversion_sigil_active.name=Awakened Inversion Sigil +item.pseudo_inversion_sigil.name=Pseudo-Inversion Sigil +item.inversion_sigil_active.desc=Uses Remaining: %s + +chat.inversion_ritual.header=Ritual Of Inversion: +chat.inversion_ritual.time= - The time is right: %s +chat.inversion_ritual.redstone= - Redstone circle is drawn: %s +chat.inversion_ritual.grass= - Surrounded by natural earth: %s +chat.inversion_ritual.darkness= - There is no light: %s +chat.inversion_ritual.moon= - Can see the moon: %s +chat.inversion_ritual.complete=Ritual succeeded! The Inversion Sigil has transformed. + +chat.pseudo_inversion_ritual.header=Ritual Of Pseudo-Inversion: +chat.pseudo_inversion_ritual.difficultyPeaceful= - Difficulty is incorrect: World is too peaceful +chat.pseudo_inversion_ritual.correctDimension= - Dimension is correct: ✓ +chat.pseudo_inversion_ritual.incorrectDimensionOverworld= - Dimension is incorrect: Too much natural earth +chat.pseudo_inversion_ritual.incorrectDimensionNether= - Dimension is incorrect: Too hot +chat.pseudo_inversion_ritual.incorrectDimensionOther= - Dimension is incorrect: Too otherworldly +chat.pseudo_inversion_ritual.chestNorthContents= - North chest: %s +chat.pseudo_inversion_ritual.chestEastContents= - East chest: %s +chat.pseudo_inversion_ritual.chestSouthContents= - South chest: %s +chat.pseudo_inversion_ritual.chestWestContents= - West chest: %s +chat.pseudo_inversion_ritual.spiral= - Redstone and String spiral done correctly: %s +chat.pseudo_inversion_ritual.complete=Good luck. Survival is key... +chat.pseudo_inversion_ritual.ready=Perform the ritual +chat.pseudo_inversion_ritual.death=Unfortunately, your untimely demise has resulted in a fruitless ritual... +chat.pseudo_inversion_ritual.leftEnd=Unfortunately, your sudden departure has resulted in a fruitless ritual... +chat.pseudo_inversion_ritual.onequarter=You've held strong, but there is still a long way to go. %s mobs killed. +chat.pseudo_inversion_ritual.twoquarters=You're halfway there. Can you do it? %s mobs killed. +chat.pseudo_inversion_ritual.threequarters=You're almost done, don't let up now. %s mobs killed. +chat.pseudo_inversion_ritual.victory=You've proven yourself, and your sigil has been refreshed anew as a reward. Cherish it. + +nei.infopage.uie.inversion_sigil.1=The Inversion Sigil is a powerful item that may be found in various structures, such as dungeons. It may also be dropped by the Wither. It is used in the creation of Inverted Ingots, but it must first be awakened by a dark ritual. +nei.infopage.uie.inversion_sigil.2=Using an Inert Inversion Sigil on an Enchantment Table while sneaking will give some hints on how to complete the ritual, or read on for precise instructions. +nei.infopage.uie.inversion_sigil.3=Place an Enchantment Table outdoors on grass with a clear view of the sky, surround it with a ring of redstone dust, and wait until midnight. Ensure the Enchantment Table is in complete darkness, and sacrifice a living creature upon the table. +nei.infopage.uie.inversion_sigil.4=If the ritual has been completed successfully, lightning will strike the Enchantment Table, and the surrounding grass will transform into Cursed Earth, which rapidly summons hostile creatures. Be prepared for battle! + +item.architects_wand.name=Architect's Wand +tooltip.architects_wand.1=Can place up to %s blocks at once + +nei.infopage.uie.architects_wand.1=This wand is designed to aid the bearer in construction by placing many blocks at the same time. While looking at a block, you will see a wireframe indicating how a set of blocks will be extended by the wand. + +item.gluttons_axe.name=Glutton's Axe + +nei.infopage.uie.gluttons_axe.1=This axe contains potent restorative magic that will restore the bearer's hunger while it is held. Attacking with the axe will heal whatever is hit at the cost of hunger - but this healing is deadly to the undead. + +item.destruction_pickaxe.name=Destruction Pickaxe + +nei.infopage.uie.destruction_pickaxe.1=This pickaxe is imbued with a destructive rune that allows it to mine stone 5x faster than a diamond pickaxe. However, it is extremely slow at mining anything else and blocks mined will be destroyed instead of dropping. + +item.anti_particulate_shovel.name=Anti-Particulate Shovel + +nei.infopage.uie.anti_particulate_shovel.1=This shovel will deal with the annoyance of falling blocks by destroying all sand or gravel in a column above the block mined. Blocks mined with this will be destroyed instead of dropping. + +item.precision_shears.name=Precision Shears + +nei.infopage.uie.precision_shears.1=These shears can break any block at a stone harvest level and mining speed. Shift-using the shears will break a block instantly. Any blocks broken will be instantly teleported to your inventory. + +item.etheric_sword.name=Etheric Sword + +nei.infopage.uie.etheric_sword.1=This sword is partially ethereal and deals an additional 3 hearts of damage as magical armor-piercing damage. + +item.reversing_hoe.name=Reversing Hoe + +nei.infopage.uie.reversing_hoe.1=This hoe is steeped in inversion magic and can reverse crop growth on use. It will also convert dirt into grass and cobblestone into stone. + +item.unbreakable.desc=Unbreakable + +item.mob_jar.name=Mob Jar +item.mob_jar.desc.full=Contains: §f%s +item.mob_jar.desc.empty=Empty + +nei.infopage.uie.mob_jar.1=A deceptively small jar that can hold the soul of any passive creature. Use to capture a mob and again to release. + +item.disabled_item.name=Disabled Item '%s' + +tile.redstone_clock.name=Redstone Clock + +nei.infopage.uie.redstone_clock.1=A precisely calibrated redstone mechanism which will emit a pulse once every second. Will turn off when redstone powered. + +tile.smart_pump.name=Smart Pump +nei.infopage.uie.smart_pump.1=The Smart Pump is a lag-light way to gather in-world fluids. Place the pump directly above the surface of a fluid and feed it RF, and it will begin collecting fluid and replacing it with stone without triggering block updates. +nei.infopage.uie.smart_pump.2=Before pumping, it will try to output fluid to tanks located directly above it. The pump works chunk-wise and works in a diamond with a radius of 5 chunks. During operation, the pump will keep its own chunk loaded as well as the current working chunk. + +tile.wood_spike.name=Wooden Spikes +tile.iron_spike.name=Iron Spikes +tile.gold_spike.name=Gold Spikes +tile.diamond_spike.name=Diamond Spikes + +nei.infopage.uie.wood_spike.1=These spikes will damage anything that walks on them, but will not kill them, instead leaving them at the minimum health possible. +nei.infopage.uie.iron_spike.1=Iron spikes will kill enemies that walk on them, dropping only their non-"player-only" loot. +nei.infopage.uie.gold_spike.1=Gold spikes will kill enemies that walk on them, dropping their experience and non-"player-only" loot. +nei.infopage.uie.diamond_spike.1=Diamond spikes will kill enemies that walk on them, dropping experience and "player-only" loot. + +item.heavenly_ring.name=Heavenly Ring +nei.infopage.uie.heavenly_ring.1=Grants the bearer the power of creative flight while in the inventory. +nei.infopage.uie.heavenly_ring.2=Grants the bearer the power of creative flight while equipped in a baubles slot. +item.heavenly_ring.type.0=No wings +item.heavenly_ring.type.1=type 1 +item.heavenly_ring.type.2=type 2 +item.heavenly_ring.type.3=type 3 +item.heavenly_ring.type.4=type 4 + +item.watering_can_basic.name=Basic Watering Can +item.watering_can_advanced.name=Advanced Watering Can +item.watering_can_elite.name=Elite Watering Can +item.watering_can.activated=Activated (Toggle) +item.watering_can.deactivated=Deactivated (Toggle) +item.watering_can.desc.1=Area: %dx%d + +nei.infopage.uie.watering_can.1=Hydrates farmland and accelerates crop growth. Crouch and use to toggle automatic mode. + +item.fire_battery.name=Fire Battery +item.fire_battery.desc=RF %s / %s +nei.infopage.uie.fire_battery.1=Can be charged with RF and charge can be expended to fuel a furnace. + +item.glove.name=Glove +item.glove.desc.1=Press %s to activate. +item.glove.desc.2=+2,147,483,647 Breeze Projection +item.glove.desc.3=§oP.S. Breeze Projection does nothing. + +nei.infopage.uie.glove.1=This extremely comfortable glove will simulate clicking with an empty hand while held, saving you from having to clear an inventory slot. The colors of wool used to craft it will determine the top and bottom color of the item and its model. +nei.infopage.uie.glove.2=The glove can also be worn in a baubles slot. While equipped in this way, you can hold the "Activate Glove" keybind to be able to click with an empty hand at any time. + +tile.low_temperature_furnace_generator.name=Low-Temp Furnace Generator +tile.low_temperature_furnace_generator_plus.name=Low-Temp Furnace Generator +tile.low_temperature_furnace_generator_plusplus.name=Low-Temp Furnace Generator + +nei.infopage.uie.low_temperature_furnace_generator.1=Generates RF using furnace fuel. Low power output but the most efficient of the furnace generators. + +tile.furnace_generator.name=Furnace Generator +tile.furnace_generator_plus.name=Furnace Generator +tile.furnace_generator_plusplus.name=Furnace Generator + +nei.infopage.uie.furnace_generator.1=Generates RF using furnace fuel. + +tile.high_temperature_furnace_generator.name=High-Temp Furnace Generator +tile.high_temperature_furnace_generator_plus.name=High-Temp Furnace Generator +tile.high_temperature_furnace_generator_plusplus.name=High-Temp Furnace Generator + +nei.infopage.uie.high_temperature_furnace_generator.1=Generates RF using furnace fuel. High power output but the least efficient of the furnace generators. + +tile.ender_generator.name=Ender Generator +tile.ender_generator_plus.name=Ender Generator +tile.ender_generator_plusplus.name=Ender Generator + +nei.infopage.uie.ender_generator.1=Generates RF from ender pearls, eyes of ender, and ender-lotus seeds. + +tile.food_generator.name=Food Generator +tile.food_generator_plus.name=Food Generator +tile.food_generator_plusplus.name=Food Generator + +nei.infopage.uie.food_generator.1=Generates RF from food. Higher hunger value foods generate more RF/t and higher saturation foods will burn for longer. + +tile.tnt_generator.name=TNT Generator +tile.tnt_generator_plus.name=TNT Generator +tile.tnt_generator_plusplus.name=TNT Generator + +nei.infopage.uie.tnt_generator.1=Generates RF from the explosive force of TNT or gunpowder. May create dangerous explosions nearby. + +tile.nether_star_generator.name=Nether Star Generator +tile.nether_star_generator_plus.name=Nether Star Generator +tile.nether_star_generator_plusplus.name=Nether Star Generator + +nei.infopage.uie.nether_star_generator.1=Generates incredible amounts of RF by breaking down nether stars. Can you really afford this? + +tile.pink_generator.name=Pink Generator +tile.pink_generator_plus.name=Pink Generator +tile.pink_generator_plusplus.name=Pink Generator + +nei.infopage.uie.pink_generator.1=Generates RF from the most powerful of colors - pink. Pink dye, pink wool, and anything crafted using pink dye or wool. + +tile.lava_generator.name=Lava Generator +tile.lava_generator_plus.name=Lava Generator +tile.lava_generator_plusplus.name=Lava Generator + +nei.infopage.uie.lava_generator.1=Generates RF from molten lava. + +tile.solar_generator.name=Solar Generator +tile.solar_generator_plus.name=Solar Generator +tile.solar_generator_plusplus.name=Solar Generator + +nei.infopage.uie.solar_generator.1=Generates power from the sun! Will make more power as the sun rises in the sky. Cannot transmit power while it is generating - redstone power will switch it between transmission and generation mode. + +tile.redstone_generator.name=Redstone Generator +tile.redstone_generator_plus.name=Redstone Generator +tile.redstone_generator_plusplus.name=Redstone Generator + +nei.infopage.uie.redstone_generator.1=Generates RF by heating redstone to extreme temperatures in lava. More efficient than a lava generator. + +tile.potion_generator.name=Potion Generator +tile.potion_generator_plus.name=Potion Generator +tile.potion_generator_plusplus.name=Potion Generator + +nei.infopage.uie.potion_generator.1=Generates RF from potions. The more complex the potion is (the more steps involved in making it) the more RF/t it will generate. + +gui.energy.tooltip=RF: %s / %s + +item.golden_bag.name=Golden Bag of Holding +nei.infopage.uie.golden_bag.1=A fancy bag which can carry a double chest's worth of items. Right click to open. + +item.upgrade_speed.name=Speed Upgrade +item.upgrade_filter.name=Filter Upgrade +item.upgrade_world_interaction.name=World Interaction Upgrade +item.upgrade_stack.name=Stack Upgrade +item.upgrade_creative.name=Creative Upgrade +item.upgrade_ender_transmitter.name=Ender Transmitter +item.upgrade_ender_receiver.name=Ender Receiver +item.upgrade_search_depth.name=Depth-First Search Upgrade +item.upgrade_search_breadth.name=Breadth-First Search Upgrade +item.upgrade_search_round_robin.name=Round Robin Search Upgrade +item.upgrade_adv_filter.name=Advanced Filter Upgrade + +item.xray_glasses.name=X-Ray Glasses +nei.infopage.uie.xray_glasses.1=These stylish spectacles will highlight like blocks adjacent to the one you are looking at through walls. Spot entire ore veins with ease! + +utilitiesinexcess.config.block.ender_lotus=Ender Lotus + +item.ender_lotus_seed.name=Ender-Lotus Seed +nei.infopage.uie.ender_lotus_seed.1=This strange plant is native to The End and its seeds can occasionally be found in dungeons. It grows incredibly slowly (faster on endstone) but will eventually produce ender pearls. + +tile.ender_lotus.name=Ender Lotus + +tile.pacifists_bench.name=Pacifist's Bench +nei.infopage.uie.pacifists_bench.1=The Pacifist's Bench provides a solution for generating mob drops in peaceful mode. Simply place the bench next to a chest containing a sword and it will slowly gather mob drops. Enchantments will be applied, and the sword will take durability damage respective to the number of hits it takes to kill each mob. +nei.infopage.uie.pacifists_bench.2=The bench will gather mob drops dependent on where it is placed (for instance, you must place it in a Nether Fortress to gather Wither Skeleton drops). + +utilitiesinexcess.config.item.watering_can=Watering Can +utilitiesinexcess.config.item.watering_can_tier=Watering Can Tier +utilitiesinexcess.config.item.watering_can_flowering=Watering Can Flowering + +tile.block_update_detector.name=Block Update Detector +nei.infopage.uie.block_update_detector.1=This mechanism keeps tabs on neighboring blocks and will emit a redstone pulse if any of them receive a block update. + +tile.drum.name=Drum +tile.drum.desc=Holds %s buckets of fluid +tile.drum.desc.fluid=Currently holding %s %sL +tile.drum.chat.filled=In drum: %s %sL +tile.drum.chat.empty=Drum is empty + +nei.infopage.uie.drum.1=Drums are simple fluid tanks that keep their contents when broken. + +tile.trash_can_item.name=Trash Can (Item) +tile.trash_can_fluid.name=Trash Can (Fluid) +tile.trash_can_energy.name=Trash Can (Energy) + +nei.infopage.uie.trash_can_item.1=A quick and easy way to destroy unwanted items! Where do they go? Nobody knows. +nei.infopage.uie.trash_can_fluid.1=An endless drain for unwanted fluids! Where do they go? Nobody knows. +nei.infopage.uie.trash_can_energy.1=A painless way to dispose of unwanted RF! Where does it go? Nobody knows. + +tile.magic_wood.name=Magic Wood + +nei.infopage.uie.magic_wood.1=The enchantments woven into this block give it the enchanting power of five bookshelves! + +tile.cursed_earth.name=Cursed Earth +tile.cursed_earth.desc=Spawns mobs aggressively +tile.cursed_earth.blessed.name=Blessed Earth +tile.cursed_earth.blessed.desc=Spawns passive mobs aggressively + +nei.infopage.uie.cursed_earth.1=Cursed Earth is created by the Inversion Sigil's Awakening Ritual. It rapidly spawns monsters, spreads in darkness, and burns away in bright light. Monster Spawners are supercharged when Cursed Earth is below them, and they will continue to operate even when a player is not nearby. + +utilitiesinexcess.config.block.cursed_earth=Cursed Earth Configuration +utilitiesinexcess.config.item.unstable_tools=Unstable Tools Configuration +utilitiesinexcess.config.item.inversion=Inversion Ritual Configuration + +tile.pure_love.name=Pure Love +tile.pure_love.desc=Range: %d + +nei.infopage.uie.pure_love.1=This infectiously positive block will inspire nearby animals to fall in love. Cute! + +utilitiesinexcess.config.block.pure_love=Pure Love Configuration + +tile.marginally_maximised_chest.name=Marginally Maximised Chest + +nei.infopage.uie.marginally_maximised_chest.1=This chest is ever-so-slightly larger than normal (not large enough to store any more items than usual). It will not form double chests and can be opened even if there is a block above it. + +tile.significantly_shrunk_chest.name=Significantly Shrunk Chest + +nei.infopage.uie.significantly_shrunk_chest.1=This tiny chest holds only a single stack of items. It's not very space-efficient, but look at how adorable it is! + +tile.radically_reduced_chest.name=Radically Reduced Chest + +nei.infopage.uie.radically_reduced_chest.1=This chest is so small that it can only hold a single item. Maybe you can find some use for it? + +utilitiesinexcess.config.block.sound_muffler=Sound Muffler Configuration +utilitiesinexcess.config.block.rain_muffler=Rain Muffler Configuration + +tile.sound_muffler.name=Sound Muffler +tile.sound_muffler.desc.1=Range: %s blocks +tile.sound_muffler.desc.2=Volume: %s%% + +nei.infopage.uie.sound_muffler.1=The calming presence of this block will lower the volume of nearby sounds. You can power it with redstone to turn it off. + +tile.rain_muffler.name=Rain Muffler +tile.rain_muffler.desc.1=Range: %s blocks + +nei.infopage.uie.rain_muffler.1=This comforting block allows you tune out the sounds of nearby weather. You can power it with redstone to turn it off and can right click to toggle weather sounds globally. + +tile.rain_muffler.chat.global_enable=You dull your senses to the sound of the rain +tile.rain_muffler.chat.global_disable=You become aware of the sound of the rain + +tile.lapis_aetherius.0.name=Lapis Aetherius Candidus (White) +tile.lapis_aetherius.1.name=Lapis Aetherius Flammeus (Orange) +tile.lapis_aetherius.2.name=Lapis Aetherius Fucatus (Magenta) +tile.lapis_aetherius.3.name=Lapis Aetherius Coeruleus (Light Blue) +tile.lapis_aetherius.4.name=Lapis Aetherius Aureus (Yellow) +tile.lapis_aetherius.5.name=Lapis Aetherius Chlorinus (Lime) +tile.lapis_aetherius.6.name=Lapis Aetherius Floreus (Pink) +tile.lapis_aetherius.7.name=Lapis Aetherius Canus (Gray) +tile.lapis_aetherius.8.name=Lapis Aetherius Argenteus (Light Gray) +tile.lapis_aetherius.9.name=Lapis Aetherius Aqua (Cyan) +tile.lapis_aetherius.10.name=Lapis Aetherius Violaceus (Purple) +tile.lapis_aetherius.11.name=Lapis Aetherius Venetus (Blue) +tile.lapis_aetherius.12.name=Lapis Aetherius Brunneus (Brown) +tile.lapis_aetherius.13.name=Lapis Aetherius Smaragdinus (Dark Green) +tile.lapis_aetherius.14.name=Lapis Aetherius Sanguineus (Red) +tile.lapis_aetherius.15.name=Lapis Aetherius Ater (Black) + +nei.infopage.uie.lapis_aetherius.1=Lapis Aetherius is a luminous decorative block that comes in 16 different colors. Its bright, solid colors are sure to make your base pop! + +tile.blackout_curtains.name=Blackout Curtains + +nei.infopage.uie.blackout_curtains.1=Blackout Curtains have no collision and block most light from passing through them. + +tile.conveyor.name=Conveyor + +nei.infopage.uie.conveyor.1=A simple conveyor belt which will push anything on it, keeping it centered on the block if possible. If a conveyor pushes an item into the side of another conveyor, it will be pushed up and onto it. + +tile.underworld_portal.name=Portal to the Underworld + +uie.chat.portal_blocked=§5§oThe portal fizzled out... perhaps the other end is blocked or missing? + +nei.infopage.uie.underworld_portal.1=The Underworld is a dimension fraught with peril and treasures. While the ground is rich with ore, the very darkness itself will begin to damage you if you stray from the light for too long! +nei.infopage.uie.underworld_portal.2=Certain areas will have even higher quantities of ore than normal, but the denizens of the deep will not take kindly to your presence. +nei.infopage.uie.underworld_portal.3=Night Vision potions will be little help in this dimension, as their effects are drastically shortened. + +uie.chat.underworld_safe=§5§oYou no longer feel watched. +uie.chat.underworld_aggressive=§5§oYour skin begins to crawl. Something does not want you here. + +death.attack.underworld-ghost=%1$s wasn't afraid of the dark. + +tile.temporal_gate.name=Temporal Gate +tile.temporal_gate.desc=A portal to the End of Time +nei.infopage.uie.temporal_gate.1=What remains after the last stars die out and all movement ceases in the universe? Plenty of space for your factories and urban development projects, of course! +nei.infopage.uie.temporal_gate.2=No monsters will spawn to harass you, and there is no rain (unless you re-enabled either in the configs). There is simply you and the endless march of eternity. +nei.infopage.uie.temporal_gate.3=Right-click the portal in any other dimension to enter. Right-click the portal in the End of Time to return to where you came from, or shift-right-click it to return to the Overworld's spawn point. +nei.infopage.uie.temporal_gate.4=You will appear at the most recent portal placed in the End of Time. If it no longer exists, you will appear at the bedrock below where you originally entered. If even that is gone, the platform will reappear, replacing anything in its way. +nei.infopage.uie.temporal_gate.5=§4§oWas that red star in the sky always there? + +tile.trading_post.name=Trading Post +tile.trading_post.villager_count=Found %,d Villagers +tile.trading_post.search_hint=Search... +tile.trading_post.help_tooltip.0=Trade Controls: +tile.trading_post.help_tooltip.1=§6Left-Click§7 to Trade +tile.trading_post.help_tooltip.2=§6Shift + Left-Click§7 to Trade Stack +tile.trading_post.help_tooltip.3=§6Alt + Left-Click§7 to Favorite Trade +tile.trading_post.help_tooltip.4=§6Right-Click§7 to Highlight Villager +tile.trading_post.help_tooltip.5=You can search for: +tile.trading_post.help_tooltip.6=§7 - Item names & tooltips +tile.trading_post.help_tooltip.7=§7 - Villager professions +tile.trading_post.help_tooltip.8=§7 - Villager name tags + +nei.infopage.uie.trading_post.1=This block allows you to trade with every villager in 32 block area all in one place! Simply click on a trade from the list to trade. + +key.categories.uie=Utilities In Excess +key.uie.glove=Activate Glove + +uie.colored_blocks.color.0=Colored %s (White) +uie.colored_blocks.color.1=Colored %s (Orange) +uie.colored_blocks.color.2=Colored %s (Magenta) +uie.colored_blocks.color.3=Colored %s (Light Blue) +uie.colored_blocks.color.4=Colored %s (Yellow) +uie.colored_blocks.color.5=Colored %s (Lime) +uie.colored_blocks.color.6=Colored %s (Pink) +uie.colored_blocks.color.7=Colored %s (Gray) +uie.colored_blocks.color.8=Colored %s (Light Gray) +uie.colored_blocks.color.9=Colored %s (Cyan) +uie.colored_blocks.color.10=Colored %s (Purple) +uie.colored_blocks.color.11=Colored %s (Blue) +uie.colored_blocks.color.12=Colored %s (Brown) +uie.colored_blocks.color.13=Colored %s (Dark Green) +uie.colored_blocks.color.14=Colored %s (Red) +uie.colored_blocks.color.15=Colored %s (Black) + +material.bedrockium_uie=Bedrockium +material.bedrockium_uie.ability=Heavy +material.magical_wood=Magical Wooden +material.magical_wood.ability=Magically Modifiable +material.inverted=Inverted +material.inverted.ability=Fully Inverted + +nei.infopage.uie.ticon_inverted=If a Tinker's Construct tool is made using entirely inverted parts, it will be unbreakable. +nei.infopage.uie.ticon_magic_wood=If a Tinker's Construct tool is made using entirely magical wooden parts, it will gain 8 additional modifiers. +nei.infopage.uie.ticon_bedrockium=Tinker's Construct tools made with a bedrockium part are heavy and will slow the wielder down while held. + +tile.transfer_pipe.name=Transfer Pipe + +tile.transfer_node.name=Transfer Node +tile.transfer_node_fluid.name=Transfer Node (Fluid) +tile.transfer_node_energy.name=Transfer Node (Energy) +tile.transfer_node_hyper_energy.name=Transfer Node (Hyper Energy) +tile.retrieval_node.name=Retrieval Node +tile.retrieval_node_fluid.name=Retrieval Node (Fluids) + +gui.title.transfer_node.name=Transfer Node +gui.title.transfer_node_fluid.name=Fluid Transfer Node diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/trash_can_energy.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/trash_can_energy.json new file mode 100644 index 00000000..88c51989 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/trash_can_energy.json @@ -0,0 +1,6 @@ +{ + "parent": "utilitiesinexcess:blocks/trash_can_item", + "textures": { + "0": "utilitiesinexcess:models/trash_can_energy" + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/trash_can_fluid.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/trash_can_fluid.json new file mode 100644 index 00000000..1ca47774 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/trash_can_fluid.json @@ -0,0 +1,6 @@ +{ + "parent": "utilitiesinexcess:blocks/trash_can_item", + "textures": { + "0": "utilitiesinexcess:models/trash_can_fluid" + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/trash_can_item.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/trash_can_item.json new file mode 100644 index 00000000..c1b6e039 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/trash_can_item.json @@ -0,0 +1,101 @@ +{ + "format_version": "1.21.6", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "utilitiesinexcess:models/trash_can_item" + }, + "elements": [ + { + "name": "body", + "from": [1, 0, 1], + "to": [15, 12, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, + "faces": { + "north": {"uv": [4, 7, 7.5, 10], "texture": "#0"}, + "east": {"uv": [7.5, 0, 11, 3], "texture": "#0"}, + "south": {"uv": [7.5, 3, 11, 6], "texture": "#0"}, + "west": {"uv": [7.5, 6, 11, 9], "texture": "#0"}, + "up": {"uv": [7.5, 3.5, 4, 0], "texture": "#0"}, + "down": {"uv": [7.5, 3.5, 4, 7], "texture": "#0"} + } + }, + { + "name": "lidtop", + "from": [0, 12, 0], + "to": [16, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 12, 1]}, + "faces": { + "north": {"uv": [0, 8, 4, 8.5], "texture": "#0"}, + "east": {"uv": [0, 8.5, 4, 9], "texture": "#0"}, + "south": {"uv": [0, 9, 4, 9.5], "texture": "#0"}, + "west": {"uv": [7.5, 9, 11.5, 9.5], "texture": "#0"}, + "up": {"uv": [4, 4, 0, 0], "texture": "#0"}, + "down": {"uv": [4, 4, 0, 8], "texture": "#0"} + } + }, + { + "name": "handle", + "from": [7, 14, 10], + "to": [9, 16, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 10]}, + "faces": { + "north": {"uv": [2, 9.5, 2.5, 10], "texture": "#0"}, + "east": {"uv": [3, 9.75, 3.25, 10.25], "texture": "#0"}, + "south": {"uv": [2.5, 9.5, 3, 10], "texture": "#0"}, + "west": {"uv": [9.5, 9.5, 9.75, 10], "texture": "#0"}, + "up": {"uv": [3.5, 10.25, 3.25, 9.75], "rotation": 270, "texture": "#0"}, + "down": {"uv": [3.75, 9.75, 3.5, 10.25], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "handle", + "from": [7, 15, 6], + "to": [9, 16, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 10]}, + "faces": { + "north": {"uv": [7.5, 9.75, 8, 10], "texture": "#0"}, + "east": {"uv": [7.5, 9.5, 8.5, 9.75], "texture": "#0"}, + "south": {"uv": [8, 9.75, 8.5, 10], "texture": "#0"}, + "west": {"uv": [3, 9.5, 4, 9.75], "texture": "#0"}, + "up": {"uv": [1, 10, 0, 9.5], "rotation": 270, "texture": "#0"}, + "down": {"uv": [2, 9.5, 1, 10], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "handle", + "from": [7, 14, 5], + "to": [9, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 10]}, + "faces": { + "north": {"uv": [8.5, 9.5, 9, 10], "texture": "#0"}, + "east": {"uv": [9.75, 9.5, 10, 10], "texture": "#0"}, + "south": {"uv": [9, 9.5, 9.5, 10], "texture": "#0"}, + "west": {"uv": [3.75, 9.75, 4, 10.25], "texture": "#0"}, + "up": {"uv": [0.25, 10.5, 0, 10], "rotation": 270, "texture": "#0"}, + "down": {"uv": [0.5, 10, 0.25, 10.5], "rotation": 90, "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "root", + "origin": [8, 0, 8], + "color": 0, + "children": [ + { + "name": "bin", + "origin": [8, 0, 8], + "color": 0, + "children": [0] + }, + { + "name": "lid", + "origin": [8, 0, 8], + "color": 0, + "children": [1, 2, 3, 4] + } + ] + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/underworld_portal/frame.obj b/src/main/resources/assets/utilitiesinexcess/models/underworld_portal/frame.obj new file mode 100644 index 00000000..05fe4c42 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/underworld_portal/frame.obj @@ -0,0 +1,459 @@ +# Made in Blockbench 5.0.3 +mtllib materials.mtl + +o cube +v -0.25 1 -0.25 +v -0.25 1 -0.5 +v -0.25 0 -0.25 +v -0.25 0 -0.5 +v -0.5 1 -0.5 +v -0.5 1 -0.25 +v -0.5 0 -0.5 +v -0.5 0 -0.25 +vt 0.75 1 +vt 1 1 +vt 1 0 +vt 0.75 0 +vt 0.5 1 +vt 0.75 1 +vt 0.75 0 +vt 0.5 0 +vt 0.25 1 +vt 0.5 1 +vt 0.5 0 +vt 0.25 0 +vt 0 1 +vt 0.25 1 +vt 0.25 0 +vt 0 0 +vt 0 1 +vt 0.25 1 +vt 0.25 0.75 +vt 0 0.75 +vt 0 0.25 +vt 0.25 0.25 +vt 0.25 0 +vt 0 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_74528393-02fc-e7ac-ca5d-9349b9d919bf +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o cube +v 0.5 1 -0.25 +v 0.5 1 -0.5 +v 0.5 0 -0.25 +v 0.5 0 -0.5 +v 0.25 1 -0.5 +v 0.25 1 -0.25 +v 0.25 0 -0.5 +v 0.25 0 -0.25 +vt 0 1 +vt 0.25 1 +vt 0.25 0 +vt 0 0 +vt 0.75 1 +vt 1 1 +vt 1 0 +vt 0.75 0 +vt 0.5 1 +vt 0.75 1 +vt 0.75 0 +vt 0.5 0 +vt 0.25 1 +vt 0.5 1 +vt 0.5 0 +vt 0.25 0 +vt 0.75 1 +vt 1 1 +vt 1 0.75 +vt 0.75 0.75 +vt 0.75 0.25 +vt 1 0.25 +vt 1 0 +vt 0.75 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_74528393-02fc-e7ac-ca5d-9349b9d919bf +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o cube +v 0.5 1 0.5 +v 0.5 1 0.25 +v 0.5 0 0.5 +v 0.5 0 0.25 +v 0.25 1 0.25 +v 0.25 1 0.5 +v 0.25 0 0.25 +v 0.25 0 0.5 +vt 0.25 1 +vt 0.5 1 +vt 0.5 0 +vt 0.25 0 +vt 0 1 +vt 0.25 1 +vt 0.25 0 +vt 0 0 +vt 0.75 1 +vt 1 1 +vt 1 0 +vt 0.75 0 +vt 0.5 1 +vt 0.75 1 +vt 0.75 0 +vt 0.5 0 +vt 0.75 0.25 +vt 1 0.25 +vt 1 0 +vt 0.75 0 +vt 0.75 0.25 +vt 1 0.25 +vt 1 0 +vt 0.75 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_74528393-02fc-e7ac-ca5d-9349b9d919bf +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o cube +v -0.25 1 0.5 +v -0.25 1 0.25 +v -0.25 0 0.5 +v -0.25 0 0.25 +v -0.5 1 0.25 +v -0.5 1 0.5 +v -0.5 0 0.25 +v -0.5 0 0.5 +vt 0.5 1 +vt 0.75 1 +vt 0.75 0 +vt 0.5 0 +vt 0.25 1 +vt 0.5 1 +vt 0.5 0 +vt 0.25 0 +vt 0 1 +vt 0.25 1 +vt 0.25 0 +vt 0 0 +vt 0.75 1 +vt 1 1 +vt 1 0 +vt 0.75 0 +vt 0 0.25 +vt 0.25 0.25 +vt 0.25 0 +vt 0 0 +vt 0 1 +vt 0.25 1 +vt 0.25 0.75 +vt 0 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_74528393-02fc-e7ac-ca5d-9349b9d919bf +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o cube +v -0.25 0.25 0.25 +v -0.25 0.25 -0.25 +v -0.25 0 0.25 +v -0.25 0 -0.25 +v -0.5 0.25 -0.25 +v -0.5 0.25 0.25 +v -0.5 0 -0.25 +v -0.5 0 0.25 +vt 0.25 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.25 0 +vt 0.25 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.25 0 +vt 0.4375 0.75 +vt 0.6875 0.75 +vt 0.6875 0.25 +vt 0.4375 0.25 +vt 0.0625 0.75 +vt 0.3125 0.75 +vt 0.3125 0.25 +vt 0.0625 0.25 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_74528393-02fc-e7ac-ca5d-9349b9d919bf +f 35/100/25 36/99/25 34/98/25 33/97/25 +f 39/104/26 40/103/26 38/102/26 37/101/26 +f 38/108/27 33/107/27 34/106/27 37/105/27 +f 39/112/28 36/111/28 35/110/28 40/109/28 +o cube +v -0.25 1 0.25 +v -0.25 1 -0.25 +v -0.25 0.75 0.25 +v -0.25 0.75 -0.25 +v -0.5 1 -0.25 +v -0.5 1 0.25 +v -0.5 0.75 -0.25 +v -0.5 0.75 0.25 +vt 0.3125 0.75 +vt 0.8125 0.75 +vt 0.8125 0.5 +vt 0.3125 0.5 +vt 0.25 1 +vt 0.75 1 +vt 0.75 0.75 +vt 0.25 0.75 +vt 0 0.75 +vt 0.25 0.75 +vt 0.25 0.25 +vt 0 0.25 +vt 0.25 0.4375 +vt 0.25 0.6875 +vt 0.75 0.6875 +vt 0.75 0.4375 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_74528393-02fc-e7ac-ca5d-9349b9d919bf +f 43/116/29 44/115/29 42/114/29 41/113/29 +f 47/120/30 48/119/30 46/118/30 45/117/30 +f 46/124/31 41/123/31 42/122/31 45/121/31 +f 47/128/32 44/127/32 43/126/32 48/125/32 +o cube +v 0.5 0.25 0.25 +v 0.5 0.25 -0.25 +v 0.5 0 0.25 +v 0.5 0 -0.25 +v 0.25 0.25 -0.25 +v 0.25 0.25 0.25 +v 0.25 0 -0.25 +v 0.25 0 0.25 +vt 0.25 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.25 0 +vt 0.25 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.25 0 +vt 0.4375 0.75 +vt 0.6875 0.75 +vt 0.6875 0.25 +vt 0.4375 0.25 +vt 0.75 0.75 +vt 1 0.75 +vt 1 0.25 +vt 0.75 0.25 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_74528393-02fc-e7ac-ca5d-9349b9d919bf +f 51/132/33 52/131/33 50/130/33 49/129/33 +f 55/136/34 56/135/34 54/134/34 53/133/34 +f 54/140/35 49/139/35 50/138/35 53/137/35 +f 55/144/36 52/143/36 51/142/36 56/141/36 +o cube +v 0.5 1 0.25 +v 0.5 1 -0.25 +v 0.5 0.75 0.25 +v 0.5 0.75 -0.25 +v 0.25 1 -0.25 +v 0.25 1 0.25 +v 0.25 0.75 -0.25 +v 0.25 0.75 0.25 +vt 0.25 1 +vt 0.75 1 +vt 0.75 0.75 +vt 0.25 0.75 +vt 0.25 0.75 +vt 0.75 0.75 +vt 0.75 0.5 +vt 0.25 0.5 +vt 0.75 0.75 +vt 1 0.75 +vt 1 0.25 +vt 0.75 0.25 +vt 0.25 0.375 +vt 0.25 0.625 +vt 0.75 0.625 +vt 0.75 0.375 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_74528393-02fc-e7ac-ca5d-9349b9d919bf +f 59/148/37 60/147/37 58/146/37 57/145/37 +f 63/152/38 64/151/38 62/150/38 61/149/38 +f 62/156/39 57/155/39 58/154/39 61/153/39 +f 63/160/40 60/159/40 59/158/40 64/157/40 +o cube +v 0.25 0.25 0 +v 0.25 0.25 -0.5 +v 0.25 0 0 +v 0.25 0 -0.5 +v -0.25 0.25 -0.5 +v -0.25 0.25 0 +v -0.25 0 -0.5 +v -0.25 0 0 +vt 0.25 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.25 0 +vt 0.25 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.25 0 +vt 0.25 0.75 +vt 0.75 0.75 +vt 0.75 0.25 +vt 0.25 0.25 +vt 0.25 0.5 +vt 0.75 0.5 +vt 0.75 0 +vt 0.25 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +usemtl m_74528393-02fc-e7ac-ca5d-9349b9d919bf +f 68/164/41 71/163/41 69/162/41 66/161/41 +f 72/168/42 67/167/42 65/166/42 70/165/42 +f 70/172/43 65/171/43 66/170/43 69/169/43 +f 71/176/44 68/175/44 67/174/44 72/173/44 +o cube +v 0.25 1 -0.25 +v 0.25 1 -0.5 +v 0.25 0.75 -0.25 +v 0.25 0.75 -0.5 +v -0.25 1 -0.5 +v -0.25 1 -0.25 +v -0.25 0.75 -0.5 +v -0.25 0.75 -0.25 +vt 0.25 1 +vt 0.75 1 +vt 0.75 0.75 +vt 0.25 0.75 +vt 0.25 0.75 +vt 0.75 0.75 +vt 0.75 0.5 +vt 0.25 0.5 +vt 0.25 1 +vt 0.75 1 +vt 0.75 0.75 +vt 0.25 0.75 +vt 0.25 0.75 +vt 0.75 0.75 +vt 0.75 0.5 +vt 0.25 0.5 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +usemtl m_74528393-02fc-e7ac-ca5d-9349b9d919bf +f 76/180/45 79/179/45 77/178/45 74/177/45 +f 80/184/46 75/183/46 73/182/46 78/181/46 +f 78/188/47 73/187/47 74/186/47 77/185/47 +f 79/192/48 76/191/48 75/190/48 80/189/48 +o cube +v 0.25 1 0.5 +v 0.25 1 0.25 +v 0.25 0.75 0.5 +v 0.25 0.75 0.25 +v -0.25 1 0.25 +v -0.25 1 0.5 +v -0.25 0.75 0.25 +v -0.25 0.75 0.5 +vt 0.25 0.75 +vt 0.75 0.75 +vt 0.75 0.5 +vt 0.25 0.5 +vt 0.25 1 +vt 0.75 1 +vt 0.75 0.75 +vt 0.25 0.75 +vt 0.25 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.25 0 +vt 0.25 0.5 +vt 0.75 0.5 +vt 0.75 0.25 +vt 0.25 0.25 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +usemtl m_74528393-02fc-e7ac-ca5d-9349b9d919bf +f 84/196/49 87/195/49 85/194/49 82/193/49 +f 88/200/50 83/199/50 81/198/50 86/197/50 +f 86/204/51 81/203/51 82/202/51 85/201/51 +f 87/208/52 84/207/52 83/206/52 88/205/52 +o cube +v 0.25 0.25 0.5 +v 0.25 0.25 0 +v 0.25 0 0.5 +v 0.25 0 0 +v -0.25 0.25 0 +v -0.25 0.25 0.5 +v -0.25 0 0 +v -0.25 0 0.5 +vt 0.25 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.25 0 +vt 0.25 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.25 0 +vt 0.75 0.25 +vt 0.25 0.25 +vt 0.25 0.75 +vt 0.75 0.75 +vt 0.25 1 +vt 0.75 1 +vt 0.75 0.5 +vt 0.25 0.5 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +usemtl m_74528393-02fc-e7ac-ca5d-9349b9d919bf +f 92/212/53 95/211/53 93/210/53 90/209/53 +f 96/216/54 91/215/54 89/214/54 94/213/54 +f 94/220/55 89/219/55 90/218/55 93/217/55 +f 95/224/56 92/223/56 91/222/56 96/221/56 \ No newline at end of file diff --git a/src/main/resources/assets/utilitiesinexcess/models/underworld_portal/materials.mtl b/src/main/resources/assets/utilitiesinexcess/models/underworld_portal/materials.mtl new file mode 100644 index 00000000..8878846b --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/underworld_portal/materials.mtl @@ -0,0 +1,4 @@ +# Made in Blockbench 5.0.3 +newmtl m_74528393-02fc-e7ac-ca5d-9349b9d919bf +map_Kd bedrockium_block.png +newmtl none \ No newline at end of file diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/bedrockium_block.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/bedrockium_block.png new file mode 100644 index 0000000000000000000000000000000000000000..628b1854bdac4c2f71f483d99d8cb4a54197198b GIT binary patch literal 429 zcmV;e0aE^nP)Px$XGugsR5*=&lfA0KKoEsLLD&r}h>$`^n+Hf?AA4WJ$I8QGI}3|EK-z%C!dfgO z!iu-hUGt-Ny7^&d&N(wHA;gonrD=*W1}P-~!!VGhX-H#?0f>2}6e}UbbGO?8aKGOf zn-F3VAIGe40A4Z*AtJ;3{hq3-D2gKb-(=){>Wf4A zhLseK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBDDmCX z#W6(VeD0*^NkYcd8Ledc5ctc_tk5^ z?ppVIpSR}LYxk<(+dkiu8=d{OQm(8#w6xqVeWDD}r7nNDO z-pxzX$5}pHR!KxbR5(v{Qq5}&&}cLf3Jt(8T8PDB*0614vsrXH9oWXl zCs3_ctwfKS7>~#Cap5Z>kuZY6K8%c9uvpoxq8+PI1L<@cKA#`c)7Rnk`e0jI%j4C< zH%O&Y2m}I{pMMUTVHj9?{7y;h?;lXHc6%TB7oXwrcu*`Bk$JKLZD#b8*&9uumV2#| zPA3QP>E$?paA@ z(AfL}pWA_-%{?`}V_hO&+JdLYf!#(+#px`j*#vM(X=~>%b)ipYltdF*#FW5yUGy^` zCYX%=E$o)X;WjB^GC$IZZ%+;@nv@}NVzQ)rhps9H_M2DE%nCK?rOu(jV`_2SMKd@I zy|Jm{HceCeIBpH77W1mPcK=4)B#_g|PIw(Q`JagtC87K7>)ZQ^8fi*1ks<#Ci$#jM z0t+PRP{&Z1F)owI+y~jnHM*JULXk<`Q@NzD^+PcxCKr>-aL_N)%~nE&m3*`S0000< KMNUMnLSTaYMmQt@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/blessed_earth_top.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/blessed_earth_top.png new file mode 100644 index 0000000000000000000000000000000000000000..cc80eef3d7608eae516de38d660dc060dad09863 GIT binary patch literal 793 zcmV+!1LpjRP)pH%Sl8*R5(v1Q&~$JQ560%8MDV|mMS$GwH72=ELKD`wFWU3e6zo$ z@BKf%);B>a79^G!D-982D~TAhm`oNYW^;PZ@xs7xmv1}gm<%IsoSdBC;o$+-*Vj;0 z6`PxzNTpI}wRGIy7trf<>Hi51hXX@H9;~l_!qL$WY;S*tX>aeVVYfSQex8KQW~a{v zO{>zQJ`BTv%jHC~`H1oHAauQjm6a7DD^EEEWsgZZ|TS44$8#p|sm=6pIDi-26i%@=-3bw8uvsoDHkXX0tGx&4@;$ z0>F09&Js`*1!_1vhttzvs8*|}*Bc^_0UC{lfHj*9%Ec;|kB@(1U_g~%*)oT%cDr5j zGDs>)#G+8rb^_BRJoe8k9*;{ly~~iFXDn6pAR9 z%jk64^j{#qeR}X0CXX8TW?D?5u(rZ*Ow~#w(TjBV8E?1V~*5 zS65eJi+yuunpUGq)uHkMV3Ou&wOW#NrBWrvC23b~D!$D1=SC|Qi{RE@TwD|)mFw>F zc|}gGR+r6o`$^QWM`mm^G}+JPZY7U!I4l`(g_KYzBz3pjZPbYoVdCM*W^?o)C&T0Q zdf{|BWuVMv70G0h$Z9g73L{&s7V3kjOc|GwOFK6gmSJHgZX8813Gnpvv?zXQ{~P=V X)XR#8m@hzG00000NkvXXu0mjfhX-dC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector.png new file mode 100644 index 0000000000000000000000000000000000000000..fcfbab950ec5ec49552a3a60edf7f6c8fc539130 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv=}#LT=BJwMkF1yemk zJqzi~S1W*OwxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHL?Lq;aB>!N_{ z%yt&AcovWi0trA2(hsB2EM;J3V3@$pzyefZU}S8-xBy}*NC)czh)Gj`Y!F}qn!^NE z8DwbzWI=Tq8W@0NS2rjM2hX$605StST^vI!{F6-#41SzPx&2uVaiR5*=IlFdpg4FEvT==d{^qchGJrWv;=YZbLAk_aQ(l+Y{nQmtxXn-C(9 zh|#RfqI670$bZph?&5>XcOKv@4o5gVJah+x0j}$^v9ZB?KBwJoGo4OZT3X`w_m^(B zOTXV|JRT#8B9bJLPN(tte29L(pG+o0E|J!-WY$z+m7qd_DRL6l{ga=Fan;v&1dyNpI7LZJ}X*VjBh zKNF9~IX^$=c!gH8ed;u7=}Tk(fDVdPNz7IgK3($ zu8X25%w{vf;V|WLnO3WXCsng&3;&CK`>RswyWZCseCdWLd^>oc~td+uLI{o8h`H#bS|Kt;Xu= zDzYrIzP`@R&JKk_0f5x6G7U6K1bUKaK>*e+Jm1s1| YUlgEYUPx%`AI}UR5*=IliNx%3jju!(~NUcM`uXWvLCIRh%PEYu;?a(9_xRwt_t#|BBCfp zO~z5gQ${wP8l8O+d$ZRQEEeAvDi({uWHKQL0(N$G@O_`*aL8h@Ae~OLTCEt3MtGjb zbUH;8MHEFLlgS`S5@I+UW@BT6QmKR>2sE2bWLc(IEaJK@`Fx&Mt3@ajqE@RB3WYd6 zKE`!jo}Qi%N23wtav9sUSzB8JU^E&5plKR!Z*KrdlEh>(ArgsjcX!AB{yu^rAOJi( zJdnv`Sglrgo`)!k)a!M=zP^Y?qX5{pjUWgV3IzaOUS8<+dWiq(UtL}Ce}=;$mSu5& ze~&1NTwGi*9*=Pxhg2#>x7#HejUsBAMzvZcnM`tcc*t}*MO9U9Zfe*q zcAH+WM>HB`JRY;Xy-lOhU@aDl{mtcabUGa@%c9%u((QJML?SE}3s$QYwrvvx0g*@q z-}ljV9ox1U3At(jA@!wDi!AQIYAJhC<=Rfd!*B89LJ&AY!VKK(RH0pr-Py> zNRq@_B9Zueetu3enIxajBS{jo*^F|z%yPLzRaFv+1iG%{c^va@G zp<1mHi^VVugR`?U-rwKRG>z42^*iOGqa%KPeh7kqhld9o$KlVPKWLgpE|=rr;DFoP zTL66D2VgRp@cH?Pn9XJhhr^7=V-|}Ax~|jf^{CZqn5Idu*CQ5-vA(`ezu(8UZFF5{ zHkPx%%Sl8*R5*=Ilgm!>YygCxwl7e6qJ;=TOk_h$j0X~3xRHcA`>xJlqATOdq(DSP zsak0Rtv$T|!i4;D0h4DkGs@A?kxbJRDJ9)*m!c?$qKG`t@jMSHC2<^+BnfGnqG=k{ zYL#ZQi4X!&sZ_}GoL;YoqA0A_Yw|p&+wBrX5w7bZrNlH%!Z1Wp6x!`JQ4|r!F(Qg0 zdc7V82M4IC3cz$aWi%S`{r%0)&kq2VN(JBdF-?=QEGdeD^?Hp8@bU3Mr_(`7$#%O% z2*GSNBZ?v{%L2gneNZ5u^V_`fX6!t*?Q-$w|+Xfz^@V}c+6 zU^1BiAaq?P3_}Kk0VgLXBuRp<>)hVn^8Eaa=Xs3BW0uP$K@ebB7I7S7+csesqSfp5 zf3;c-RaNmkkJW0$YPG^NO|mRQN{R3Llx2x&niNHWVHi9qO?(gqO z(-eSOt;S$5pxth>SS)yXd7)aZVi*SR@9%&3LZDfe^>2TFpNoqN4i66zLXad0*Voq+ zMS-sCG#U*I!(g-7(C_zgU6=WMPEiyHfG`YsdwU~IQ%uujyWMhkcSpTm$8j70USD6a zZJWttLZi{3+wGDh3F`0fFHscjT6lPPz;PVPvLsDYZfF~UCBWa1 zR8>XOG@hQG&@>IlaX3FeN7r>`vl+Eojp=lXZQD4G!`0Ol^ZA_Zc8in}RR}@5-DWr( za(a47nx-rk3z8(EUaxa}e9U+}-t8mLa{#g|`y<%f+e6bd(ljN@G7Q5Y2m+?lDX!}h z1Oc{f(`vQ&{QSiCeGJ2(EK8)6DE)q4Hk(a!UEjS>2(inkC<!o*-ny*|_Le P00000NkvXXu0mjf-WX*? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_3.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_3.png new file mode 100644 index 0000000000000000000000000000000000000000..0dc2f3455d98a60fc78306ddab1e0f9718dead4b GIT binary patch literal 755 zcmVPx%tw}^dR5*=Il21?iOc+H^JAzOArL?_j?@2q1)|}=Q(+vBa5P7Fc@%k zb%pD?04$eFrqe0={hln#0FY7=$1y<=P}eoa7>qHv0GrK*UayC>ma;4nLXad0d7cvl z0RV9v_`d(I(P$uqAc`Wk z+b!GemLLeIstRi@aU5f<#rJ*cy2kf?-rwIb#vlQzs-o3uu~;n7S_5!#alvpnq}%PX zTCMo{`l8Wj&}=r@Y&HN0ArL_j{Ok34OePbqudk6(qP6Dv`59vjp6AhOwP-e*lx4~7 z?JZFhkt7LqUH=heS;l(3Mr)1l`;=wLVzI#UJi;&p;QRXFbt{d8m%=iFE1oXf>Me&jtRq%$z%dRQ4~nWad2IikB<+85QJgKcs$1Q zyz>^8%Oy%F!Z76N>4_vsI3ADGb&V^fq}%QC`1r_ZG(v05YPCA+yuZI^Hk+OIQB~FX z9u5cO<>e(p2(;EzRfX^Sq-n}>xg?4r(lkXWMW@qYx7!iN@mXhG*ElyfH@4kw<9Qx= zo>Ns7Qp)p>0M=TRQXCEkgb*B$M*v*c#r1ukpPwJnG^MUPx%dr3q=R5*=AliNz`S`>!AdCZ|rVkxyk1<|{L%f8}zHy^+|5d`a9k%Xd+G&6JN zurKy*_P88_ao``{FBXf%*!MjEv)PPs9BJE@aU6-`m~kBO-qZIzecvO5Kq*BW$4DvB zQc9$h6h(m$0_Pk`De^q0ZCjEg!8r#&(=-Snn9t|5ZHsdb8A2e-vT1`c27ok8nayT& zU5C~hYb{DCthKali?tRZ1R~G#(HO&Owc_UH2Jbzm(}~q;g_M#gifEdKvMdoou-$HX zetyP#k8=(kMG;w+aXcQ;T62lt-(TkQIUgS%D5d!G=MT;~%CaPiBE0u#tiAdX||x<)(aNYj)M0_XFYx~>T!kmot4 z(}`giczJmt&vW89o^-m@G(g|?SZjHIe~((ln(g3LYOHxxKw5j$@vlo`|9dAq1<{ip^$&F^22wYl@;kN(q39qUf&>0$|!u zRTXtz)3z-|Q2=l_97vLc&(BZlx@JC~|9eH>_c-Uc4B7AZ6OkbVUSD7N`uZYC5)Ow0 zX_~TJE&=e~qpY=mjWL7}CPW_|9$2r}bX|uKf~u+*h5>6W+wGS9eoqJi?>$l}MV4hO z77On0@A2MKmgV%$ySqDfyWPac#W%w+5JEt#*XwaMn<1rS7zUhk48uUzbrZhE7=~e( z5Y}3AKA$00000NkvXXu0mjfb)!X0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_5.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_5.png new file mode 100644 index 0000000000000000000000000000000000000000..d39a6e0f6aabb88af0a457ab4d9a17f906548d58 GIT binary patch literal 674 zcmV;T0$u%yP)Px%TuDShR5*=AlR;1OIuJ#V?TO>0DOHQ8gkVt#+TZzpB1=}N2+F8;jFGyorw$?lfOC$jsu;%+V+=)6{B;x| zgfQvUY&Odx!g9If{{Eg20+-8$<#LHq3TrLid)l@|DaB^9;qC2>5CYzN#9B*T*PKo# zj4|Bmdc9KDHQ(RgXsvmDePtL1x~`)rifIZl#^AlDClN|dG)=?#d?uyD`};dh(_pQge7amNX&PQ$URbZ!SZmpC zw^(aYO0irnS+CcK2&>hKrfJYx1E6pB?fahN@i-au`T0rLb(5*5(+TGs`~9B2@0rbJ zIOovgI8J~791aJZa}$9dA0Hf#N1Su~{QTgYW3gBO5JJEdMe(1A5M!JWeSUsswOTQb zBT6aSwk4&6h_KmgI2;bd7;k?xbzO6JcgNGy6EQ~Gwk5_$Q4~BrKC;{Grd4jaNhuLy zM6FhFd!mmt*1C^ttrcL5)Z?GF@~}%QA*MGJ;oUR0Ss$UZaD@BJOBUy07*qo IM6N<$f{+(73jhEB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_6.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef5215c4fe2fafbb8e4630fce61bbdd73fe542d GIT binary patch literal 542 zcmV+(0^$9MP)Px$*hxe|R5*=Qlfi2BIt+wAS+bp`Cv;ILw0-|KD_tBYlr$*`KDPeF!M?o)Z-g`+ z&uApZ=L^De13jXO5r?DT5DJcVW2O|!pqAGs>=0x zW!pA#&b+_Bv+p~{aSUNq^$yU7`+t9be`&2TO%um);O=~Ud@xPZa7k4;&+{%efV*R6 z?E6l)R8@I;dg9^XfqmcEwrx0a90&baN9qVrHb20LJjw*Vot+08v#BAu!J~s`|en5#e^b@%Z=%z`Cv+$3cvd<2Wd# z+!=@n=Xqjg%=66i^E0Z-&(9B~6xMYmr9?^zRUKNn`+b#TjN^WPe-FCdp%4P=x&koI zGhKLhM{>??X2YUd>j+d2ObB7rL}b`lNgluz5oCK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_7.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_7.png new file mode 100644 index 0000000000000000000000000000000000000000..e1be94bc0fbd3e0d9704a490d5d7d99b3481ca2b GIT binary patch literal 406 zcmV;H0crk;P)Px$P)S5VR5*=oQ`wHgFbEvLuA|Bi{r}&r6v-FtLlFgU zvyX|003hyW7B(UR5h1yOnL$KQ)gu`*hs_iDKUD=Wvx!J#1^`t>&N-aC;#%vEAIArC zoE>IL2_h0ckH;f|RTU&6=8%X8Ip=_xQbKDD08nd%s^Y$HthKP#`m{(y5nM{a^Z7)r z6#&qChlt?ydO=l>7J|E-ATz_96RkC*l)%gYfcN{2wbntb6Pk7jd+!Hnr4*!;FvdXd zJp$*PK_t7gh@g~$QVNI&wbp={bH;UD;U^+z0+(xtdEfU@X^a6836!oD5s^9j-t%5T zRYSVgS_IEIKQa=Lc{bPix~_v0ufC&k#K{9iB!cFg5RqV9L@>q(KK8MWL2~%2dMuM4 zm)Y+=OvKF5!tV6Fg}e6t4g|ks{9EaJmA{k!0DSxr1jmKmfdBvi07*qoM6N<$f?0sB Aq5uE@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_0.png new file mode 100644 index 0000000000000000000000000000000000000000..338ae59d8b6a5a17ec3657c00b79d356fbb66459 GIT binary patch literal 621 zcmV-z0+RiSP)Px%CrLy>R5*=glgm!qP!NVchlFr3xkxdPh&Z6CMT(21s#2>+ED$Q)bjN}f55rUR z3A*a8s?<$4-JytGQQQjkf}JWfF(p2UlQ>1iT|~!n!fejWIcF~aKQqelz8QA?5dgvu z0N7m5GkfRxBXa6u^nUrf%jSBXxy<7H$%`jjTwM#cHwqN#CU912hR%nxZ<9fi&H(n!EiJbfO`s&RX6O;A5?Px%A4x<(R5*=glTB~aKoEwXq)yT%agySYkT@!Ws<^2H0!5-yD(Hbz54rRg^{?;) zIB`Kp9Jp|+0;ejjR28sOrL{}#m7R}5!@*k1N$0XNyE`B6J2R=nz4qJ-CIE(dF`{=Sf^IW^Y~GP^3FatzXxnK);ZYSLa&x6 zWEBo}x5z4KJP~5r*Q5^j+Vjd<27saK)9bc59@t3f82W-ebbSDN-8Sz(|3LAA37OUl z-d24WfaUlMU7w~_qGRY-j!#`v8M%VGrp7@nCkm7XD7YtBj!(zX>6PB+`v(zQtq@#qw0B+|3B}r8BQMRgY+Vr|@06u;@q3)3RpGSivodK+yzl>ZFPoN~TW9Tud5}p@KNUMb$BUi+qGXKU5U7wLF=$ldh<$f$r zC_w7n%O`UYOz*95w*Hja=nUCrxzPx%7fD1xR5*=YlR;10Koo?(n00VsLv1C*P*kZTR6;~mC8U-!$NuX6fJ&8mXl{^0 z+Nw?r>yWkM*c;M=@shBYwdc*QXXZUOt}jkESzZFLeBL{Lo7Y&jDrxWArhcDfbo@5f zeUi}>7IU@478bU!(0UCAp}|g%4mjy}=2`1Ch1N`>IgRU!)6JvGxqR1Unka6r2K>5< zsMoL`?z~SE1%M^?_%mBzWqC>I1PuEjJ>Mge%8-WrkVq=JfeS!4aOwFTH&+AHvZyWs zuyaWy6~lhWXdH2Q76Of$42Y5A;&T`q186(Olp+?vm~V{M3uoCZ{Lu&L#w@S zAFP#*CNVJnik4IT(sQ*UTb29=RXstSB2>H500000NkvXXu0mjf2iP0q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_3.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_3.png new file mode 100644 index 0000000000000000000000000000000000000000..4b267a9494e85c1d825156ea21b8e5382e7ec06b GIT binary patch literal 569 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 M07*qoM6N<$f?_fT&;S4c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_7.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_7.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe1df2d8d3956b99fd09c86130c80f4b57cc8c6 GIT binary patch literal 538 zcmV+#0_FXQP)Px$)Ja4^R5*=glihA3Aq<5-zzkuO$wqB2`u^`%sej6Z0h_%bnY6n|2m`Wpj?b~1 zlXTM#fH6)9o`2uW4DbE^-_(%cag+Fd$`k9>kPrZf!J(4bE?-Cp%t@$CsoM8=-5RAf z+?=Gx5O6?MACKnJ`8kAy&LMpGjkUnr$=NW$y$!t3(_!1SY)VS+VM?oZ&scnQa?y3 z0`UI5vew46G}b!y9YG9k6!VN=Ee#P*DeMLAH2$120HxGjjdg1nee@s(H=5!A0w13% zz|Q?=VxA(<=>=5#P+^#7$aX&FoqtM^YiXR1ne#DoEsd&5Rl}zlqvJh}db4d+WvwIO z{d=I8PR~34LlUkxG*&K{*|2g9o}A*tEH^~!_JICt_0jZ?OBodMB(!GGVbe})HXIl{ zbf`@q?z<(|rbEU%g}aGdA8~EQS}HjSr#W#cjXVh*xcrz6caYGH{@)0@5b0XE%X}Z} cpLa9kFNIAn$;neH1ONa407*qoM6N<$g3GD$jsO4v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_0.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee0e07213f6202b73cef4854497c4d4ae6c7e6a GIT binary patch literal 741 zcmVPx%pGibPR5*=gl3h;|K@^6cmX>b67Fz2-p+M<&cZ)zGL=&$Bqd&~wMPkq!6Nyni zm4-%_3axBwq1*0ucY)RmbQAR4oS8H8o_XHM3BA~OKI&X{P)cPS$Hw)1JkKQ-lgMN< z*tP>evvJ1k%q#$|=L67gUobW?k$zoVnB&#UmpsT$Vs)=j%L=Q@D|nvE-24Jg|B7rj zL#6TvA*R@TvB~9Shnt%bk^FQXRbAp&y9L0A5s9Qsy?#nIn*%^mbS$e2fTnBMeVf}G zA1O9Yq}S{5H+J{;g7xGdaZU&tjdK9xRFZ17O5?na_s2$fu5jn;ym^75=qQSgoJs~_ z!!S5I{f;b80MN56)Ur;gq~dx$;alIs_@f`hALvDyc*q0K+hF zT^CuNU~O%kwY7DA)D5Pm@}#9`AgE8bE@PM%A zxnv&*DwS0dafzG|dMI06W;YqjIxa}#k1wJ=3G9wQP8fu=7p91f|SRN4LXk#4uc z(zX5lz)_1}=s9d3HX$M=9&~uuEl?wrSF_ zE=kK7!l_h}{oT(L3Pk`~Et5oCy1N}Bz|IMQ`K!ab?JX>;OR1#aO`>UDa625K=^8O9 z8hGE?c~8r1-FyA2(`I@3aWG8Mc$Cn}^3rG~KZ}2TjcGO!A|D9Gqfz|p>mdJI_kEY& X;s!NXy&Lwl00000NkvXXu0mjfH@;iv literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6b5dd2d4fb61fec303e431cf4d1d5c3a23e1948f GIT binary patch literal 724 zcmV;_0xSKAP)Px%j!8s8R5*=gl3P>LP!xr~lwQ&{wIv=ZEtE7(1RT+E#s`tX|K?v~oPh@)#1Rys z2pS3$(o)E+Nr3nOWCmR?=QeAfZ=JKHmF0KI=yHUn=>&mK7)C@0|5G` z$4pN*00_effZ@<)qEb;lwq~1rSY1V}RdJk4^mdyU3k!tdnC8qZfp^Jdt%_;PBZOdO zWrfSD5jWSjWb5^3==yUmhC}X@P%J6*dPmf1Dgc^h;J6L|9mBx)eQvKK3WYpb&vkjw z_K)p!{^Z`Q3PHbr3P7b?Vt>C&|FlOK#QJedHZ7j_1*8>6D8y0G4GDh9MQD!qUw9(+36Af zJw8C8kVksIyqqjP?_l+gFwMpE(Dz)PJ{4(RfTAovTJQYaArnO*wMl_#E>e_bR3T7> z;3i1`QtZRSZu+=ISw?S8p~!i%k^~*oB)LsE__fdWx363|Bi_7zOE4b)hy9@4?g77h zJ+kGJg6Fwxtbd}>XwlIPg7KKf%nX}fKBKkGN7!0hXK348xFZy$N~TmU@qKHHMxzD5 zU|>^}?|uY{6k8Pn`{II)^)(#VL7Ox0I&om1bCV==41>I!OS5loer8|~9^HO58nQ6| zGHs?pK8Lh0Zzj{v8boo7ZJ!}TJvHQWIifgD$A9Px%c}YY;R5*=gl3Q=vMi55NQlxgpCAFe0#VKVefMHv`{QM%npbr6BpeYa_2?FIs zbqd9?%$rD&A}RGjFx|_%>|!wA;LJB87B@G?yvUhMUa;R+)OADCHrPEI?P;oN4?q$> zG8zQ{)O7>EcAH}5MUD^xDf{#thqBz!cO10qvdywnVV2VC*$81FgvEF~rfFL|Z-{M- zK?sWyT%aYfxf5venR#{eE(em@M`#*_I5YQZ2 z0JJ+`wOaAv{X3fWl(Wu)5dhydkA&fjFr1;?K__0X*W9oFLc1D(qR6?N&KdfKx^A!! zO-+_1^n?JQEDN+dATM$NqRst3#@Nvlg0ebMo1u@LW?KN%z{LashJfX#kGR?cAPi?+ zW2Icwz{Qmg0IRz@tX);&`-Xv%0Ib(*_WM2B)!g1LxV>F)|8>pz**UIsI&qpNn4!UT zT@TOGBuPZStayC5XF8psq~!OvzY<3=byJfUJ2nqrJA44gv9ST-I7WyAujW@wrzhk% zju@Z4z|+sGoKELmgDB289uHVe+aRUl)%*%2<;jO2pgkS|I_xiBR^2@)De<*JJrS7E zi0kVc?*3e{{PdA+p7F!tC(5e&ANEtkNk(4e*s3q7>zX%jeql0s$?WokIk~vt!~1vt z!UhPZmn2a{RaYqGVo4>5HXA0Bm)-12o;HGbK4TLEL}|(&Z+{~%a(wUPjkvzLI$Cy* z@%fl-zNIWn25P`=m$TcI7&BsD@A3U1kDCXy_Gs!F+i^G^T15EW#c^Z;nzkiP6NbZQ l*X>@9rfs|Tzxk$Z_#1VaDrLZ!QGNgb002ovPDHLkV1gorOo0FZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_3.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_3.png new file mode 100644 index 0000000000000000000000000000000000000000..12097397ff9ae8b7f7b2a76c31972fd03f7222b9 GIT binary patch literal 662 zcmV;H0%`q;P)Px%P)S5VR5*=gl37pNKoo^P+vCZ2iE%=((3OuEl&Sq$>xw-j>5H9vf;)#61i5x}|=GXw>DaCrd=Kkj$rfFw(^y=%+ z%bxLQ%6K%zQ>r6xHXF8^-`%Vz3MP{ofge)W2GN+BG)r)-cC*&4)VwGF*zdOQY&aHZ zt=k1bfJn18DA`klQ3OP+9v@K32Vgv!b{|WrkUfQx0)X}N6LzUJfgjTANdPvR4OLa) zDaF-d$<<=XcDvy$icwN@|VA^##5w}e82rlvQMZ@OWl0$Jsp<;f57_Ts@H`(=*Em9OY#OZ5 wXn5?05ylwOG$9DyQg<8&V@&t{J2#EtFOuXbC6qLm3IG5A07*qoM6N<$f<8VjF#rGn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_4.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_4.png new file mode 100644 index 0000000000000000000000000000000000000000..8a9aca1e4f9b6dc6ff947a3ff97c70e1bb0ef587 GIT binary patch literal 641 zcmV-{0)G98P)Px%J4r-AR5*=YliP0FI1oUOc&DtmjvYTW+5i8fZLtd!=mkNsT`QJ#At_RQkfVpr z%K!t;@bC~*Jv7ZS=ZtfXk~5_g%CaD;3Z*qUX8=-)7;OM3r2sJJnaX>=cxQP$9+_jL z>wB!R7_FH?Kq|#FjR1IG-?QiK?Tu+1QATTgy@O>zX^oTuV+`}0aLxgsn+N8cQBqRx zb}QAA5kjEe5!cBU@6Vi$=dD&Z4PAF7#l&I1XAFVQpFfey0)Q~q0x*Th>9{t#d#!F7 zE|&}K<=0jVAyC&lyss&xASi`#9H{O$#u)Ac1HBQ^nD|3!WDXAVG4~w%7W7b8+_eVvQrji1(gx9GS)u=RKmTXxkQ* zV!~RBHil`M)(uM)!_X6B1Oz$H%=1i`*5;BkNQn@F%6qqHZCFYn&1rK1Pzk|O%9j7E bmu2BMUXwZA?RL%G00000NkvXXu0mjf18OOu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_5.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_5.png new file mode 100644 index 0000000000000000000000000000000000000000..616a669fc64e95b20f84e0cbd94de2d8df7b27ba GIT binary patch literal 627 zcmV-(0*w8MP)Px%ElET{R5*=Ylgp0VI21&W_?G3it!&cC|9@8|2{4#W(3ojkmL)zeISV=NAlwiv z@NudxZ#V3At%%^gr;5;8qqc_XI^X`d)Acr`t>hr-E1i98~`yTPREhcam3%Xei%5P&s@%L z4=trc=y!M@Xsw~Bl^9pL`-?fJ$A!y0bDO6JO-u>ZLA?iSti|L~u+E~jrXL1+27dl{ z!MV-GbQH-_Mc-}BQYh6QVJ2_a(Ux)JTTrdpPruh=jHDQ_PdRd*Vk8y zWVF_Fhr?6z&SUM?C?bM&4(A-#>x6TD`#d4At}7`{D)p!<9{`lpw5 N002ovPDHLkV1l6PB!B<_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_6.png new file mode 100644 index 0000000000000000000000000000000000000000..a13bfcdd9c6b639cb920dfdc96e8d9951b38ae41 GIT binary patch literal 593 zcmV-X0Px%3rR#lR5*=YlTmZrAPj^*gur&|QeEg&7TtR=X>= z%=56;h%qvHXN*A~191-Vp58kEW=2p2V2p9pTEm49#uOv#Wu=?3?^S^xR+LY!utRMNH~ zj6o?o?qp%j0H|h^oXP2SXIRZ}4#vsat0HCxzhU9rcQ;_rw^er80Ua^~PnrAga9l z`oW$GeRQfBTTY~u7$-aD9C}bGm{k_Pa9J-$hdndTk3^k5$5}6wz1%~TQ$qR}coCL) z!HE#(nK;j!VMA3=72Z!>T5C8Frf_6N0p?}Fizn}y*Vo_FQh0j)PB-HtC)z3W*ON=7 zl!9B9Wn8aUQo0etA?E1)i0gJEgm|~jiQv7*Y9;T9S_}~pa?ZqX%xbkBpM2?Nt>IOv zwetSMoIb%A fpZ9Px$>`6pHR5*=YlfiD>FbqVWC`#IOvPu8{8`~6Un%J@^vIo1nX>}1mU^p}6Ftu7^ zx}&NPK}6sYNJ=CTA_9OpCz>f4L?_Q zdwJ#d^2*jXT5V+g7n~)dS%gv)8%BuG!&$BiqRQLP?~Fe1aLkNt@ATe@Q(a041=#n& zoJOmS<+>aUd#AN4C6|Yt<%zM6dx-Yl4+~j@RvSr#(i){T&ajbH$SQoUp8&W!NrbBT zp`f;gh_LTF@9)2`F?f0XhM%(i9Q4=MhcV1Zt+lw_Zfx61(Q@S9{fO(fqFU~2OCpE} z(~Ny|Y)mAjMDLxVhu3L#H2K0d-S3I~{PK(6^+IsgCw07*qoM6N<$f=1~C AeEPx%{7FPXR5*<#&&zHbRRDnDf6h5`%iQ8i61#!YL^wsIED)g}v0%r(Pr!o5V}U@3 zeUZ8;NFYR^k*SiVO&vS&*kg}9XYMTe2H$6V_w6@r7=*NKOWl@O%Au$vk zQ}#QD09b*CkdpWB+(YL%rc(HJmu0eIzPje44?n>)O+=cexQ@d#e#7YF$IO!nhE(j@gT3jn)HlH9=i|yFF8vn&$IApi8OB~NphKbf29NT$Uu%*v$e?G;tIwZ@4 zFo>{Ri6cYyb`REQuEYZ0}=q$rjCXc>2Wiok7zrV-L@(NQ~)W(*0 zHDx|uuufNu?w^qBobmIYsLG1vB0=niJ@O`H87CZ{+(ih3x~?&mVmh00dvgN-jlsXq z|G{^Abo>L_wjm4ygf2CX49Kg3XTLvVy-CyXAAZSx|1JmJ_XylBK@cMCl9is* zj}B>Ti4v_~oo?8%U53K}zSBi#8J1@dr`O!Xw;*!PFU}bZ2Sje4EJ-MeD=f=G6;;L$ zzdWHRayFYS9~_^soL`fsDZSkTvSN+rMl4si*y;idgNBNxY0z5pKb&K7zZE-W0{{R3 M07*qoM6N<$f@Kwj7XSbN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_1.png new file mode 100644 index 0000000000000000000000000000000000000000..046843c13b3033415530a2d73a137a1b2e8b3440 GIT binary patch literal 821 zcmV-51Iqk~P)Px%?@2^KR5*<#(aUb!Q~-eC-{<)Fczl~nGEQh|AfYN*AW}dqSh4N{u;4ja01{#g zQWsDm5NcY6q)D61WMYrU_V|8S@V&xkef!PVCI|wIF$|_d*_yVi>ADUnCAP8|dc)B7 zNMU0JgFlT~FE4N$2ix~YJbU&TT822b!@m~`#(N_MW0000n4BQnE&E5OTrHj>21#RT zw0y#MKm3YqVKWO47>!0;y<4yshZsOB8-TWY3rcZ!`8S>#vn@8%ZAB+rwDJ&TowH7E zxW2i-(GE@9;c88_s}RQK)vI&LqM&F}T1vtwV1IUqqcv}D-eCK_2bLl7W^9TT`{P3Z zlNa7?9>G`o2fhbp^f4P+PoN{6v~;Xqt+qY1wrt7+5ZE@zj{JPrt(V zJ*Iw)6cSHIh$xJx`i%K}PT%*$@5N->96#_mK0d+G4s8jW@{ZT9|3C^s+joSM$2eLc zgpjy0!f`aAo?;shVOhvQv%F4eb}dhyo{`)qXxF9M)pSkEcKr`+UtwoiMm^-nO0w%V z7!0n8xJzykw!zVwtHoc$2QkrjOqwRxmZGjow4)JG6rrWhi$9pU?pPYWd{_G+1$pZp+Lf{7orzNiwX5k@bkl2ze-nK2mbUSE^s!00000NkvXXu0mjfVKsqv literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2c10a7a16e276fe224037c84058bdcea7594fe31 GIT binary patch literal 769 zcmV+c1OEJpP)Px%yGcYrR5*G`|rNx&BGl+ zKmwH300;zHYgDvIDd>il$#wkj<1c7sk&_=8r;hu_f5=RRa{+4%(>NiM;`a82ap)Ob zgJYyxl&nwAky`Pz-=b}90a)ZU$6?2Mc?N(k3#61>oIhi74y__ZwxaDi_T3Jf6=>BW zr*T4Q#jbha>bat?N=WZ!h>GY0|K9z~ zu{q-0gma!T93jDW_eh}^Tz~i(MOjc6rwAdixpxIZ;G@Tw8l5Sm6cQy2nK4wRMyDJp1S%SK_YH3Jy!+ys!@j{-%QVh- z=b6Wb5FNT328>Zm)6C?LBobCHcxtu?mB@_Y&D~#|o}IE-E@+wtEi@@aGOdwSQ6Oc; z%Rhf5&z5v;OI1~5Mq*^edT~a*T4JqbzuN(@dG;wuMx6J^+095HdGYZz+wCLu$qD=8 z14?H^G1Bxq4$YCi@3?yBIc}c0yZMP26Mf$!%X~q=(KaoY&o7Wd5Mo42#naP{!+s9{ zNpSP(meSTNiw&eip65s(9GVOl9KXN(jjkVnL_hR=@ct*P>kBr^wcTAJx z?0kir2F7lrs%m0{-~=Rz8zWBiL?Y2e{OtH28YpN+Fue#Y00000NkvXXu0mjf&^=of literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_3.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_3.png new file mode 100644 index 0000000000000000000000000000000000000000..289986daadcfdb12e55f37f76a65ef784255a260 GIT binary patch literal 731 zcmV<10wn#3P)Px%l}SWFR5*aKJ;A(;$bFhPZR5rhHp5BT6e7hl9z5uzeV zW}KO%yX$)DTwF`O|L(5(5THUKW7LpKrsRUEpvF*3rPhLqq1K9TJBI!lYYf(VhjW66 z#Yn?2_Bd~;)*yg&9a>lX=8S20hAPxD(QUV+l(3*U+wk*GKl0)EJt9y6V+;U-V5~ul zM-`@dBBqI7e*FWZ4vjey*NKlW|6!darHpru7$bu6`1rsw&n&4Y5otFKyR!?_D98SQ z_1*)p2_3_HWVhV|V48rcaCvdXni9q+p>&MX#A!OveEybxI)Evp zy09!O#wpiV*LWBBbbMmX3vJu5riD^Lb6TM&HNl5>zcchBDMeCB#4w(5u|FWD zVx8mTyMNj5&uOVs0gJNj4G$&f&O#?fC>)}k2J1h6V9Plf)8je34=4Ix~ zFTP>dU9#I=(zuScX%L&4*Ph@SsDk|P_Dyxxf+TXOSmP-d44 zUKT_vB?~r}1O;+V#F*G$Y)R`vJVlzeqf{sfs7i{JBr}CVO_jVR{s+++VGmg|3vd7c N002ovPDHLkV1nfqPqY94 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_4.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_4.png new file mode 100644 index 0000000000000000000000000000000000000000..2866b671e6deb70e2e93fb096e72bd372dd28d9a GIT binary patch literal 693 zcmV;m0!safP)Px%Z%IT!R5*<_lS_^xMHEHPdl8YDWxHLb+-`x?#fT9D#?8hN8|VQGfDHhmt4ac6 zJ3o;T@g4(<1zhRgt8?UZ+4u*7?@z=OX)8?m#_Q{!hzjmTh+9Mj6%kY-s(~SGQ4)#}JaRpc z)V1;Tx6h2@L`sRW7Tk=sPPiLdYQw$KtdYw|wM+^RT*oW9PG}PTdHajU{hnbnpivQ3 z+zeGkQw)ekE|)VYZdm4-VHk)}NHVY+9@%Ukh$(WrTmk4F4!AgGhBmw7yFcu?UM_5R zJ8sjN5F#ckQ@%2dGdX8YA5PR#nZ`HFq1Jjo(W$gjIi3!P2ggUa5}iEVs5l%48uUHg;pCeCCnN@1GQE3f5C7Z b@Mio6{KHn#h(CeJ00000NkvXXu0mjfN>DJ* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_5.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_5.png new file mode 100644 index 0000000000000000000000000000000000000000..743e87ce576872b23633f96701e8997f9f264e39 GIT binary patch literal 665 zcmV;K0%rY*P)Px%Q%OWYR5*<_lg)A)M+}5N05h|sNXaB^P9DH6nW{u4xw|ui zK@L=K!==$({Xve0U6>^Z2nHfb#2_LN5k!OtfItueu#{+RMMX)b#;1>a5JN>-)|r$N z|Bu;(;H0vpt``Ua2FQ-{`HcjESz)s&tn19~VIlw#eU})B7!sXL+2G#s0o?~8Lh^9B zS85%6{`?!YHm0et)=Ei*^S2ic#{(*Y<%~(wN_-GKI z5d(%oz(22lv&_pqXYaIF0JvN(WSjW;$6qNWldOP%ilL@P;N+5tG1xusSZXCth2!yr zCBqvm^~U-2E22Wgz-)`Cpdx}`s2EdvKuIWqM&kN*!<+N`%TLVnz24qBF#>N35d-b+ zfaBrRe#1v4>BM!uQhh;_@bBvj`~9A2GodDk3Phl)XfgvaE|>45v}IjarfDLXkYwUv zdStuZkdkq`UIEC{6CuGE1NCtSV*j}3dbzNDc;L2tN6iQtbGfiE{&ZKRT^>q^cU(?qL|XrQ9V>G&9` z%80=jgHk4jcif$nGGjQVM)!`sKUfe1_e1{yACF9|Mh+(U00000NkvXXu0mjf+c7W` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_6.png new file mode 100644 index 0000000000000000000000000000000000000000..2be410212b64300976ef8af97e1c741591d3f635 GIT binary patch literal 614 zcmV-s0-61ZP)Px%AW1|)R5*=2lg*A5R}6$d+vjxmoqHJ|AhBS9^8Rmylqictz=S(<{%o`8NxbsH zs&ZA?^7!VGW(EmKA|hlanP)EonE)U_0&0b|1}aK1Ro=gQ05L?AJ{rZ0|4MB`2ueMe z;|?i6fL!?Y{U-$k)s20xjL~>FHWCogSBOMJkz8zbC*1J__dpQTGw>M9*-eM@+a~ub38|+Y^zFnGrc5K{EqFA)&V)j6O(rJRHvfz;kPuRX)7` zgqcySf`E#mrbgn_S|F3-axm7U)WY@lh^dkj#_Bx%`wav#1JwgjK}A3?L=4q}VhDny z(VrXc!P}3&F?z>d&CP&Voy?>x55S3ZG8|`NTIszZny4!Gr|(>j3w5ji9~Udn4T>p< zaeuy}T9{*=F`1xJIqC!ZzM(~Fy#Y|R8!1Ufq8P(%rlV>UG7*eO=YIc5 ztsBURemQO|pA@TjI6?prv9MB3IV7Y9NFriHKt>=2FXM$Z7G+zEF{q`WT3Evo1rPx$<4Ht8R5*=AlgpMHArM2a3UIe)JURLQ&&)V}H1)`WPO_pFoI+O;`uy0+%m63~ zA&PUqxOeE3G#E-8X)R4q658Am9z}i40t#9~zLJ3IF#;@-O9fWLf8J+0| z`(>=hrE^6g8LD9P3zA)>#YZcpqdYnGQ;cG+rRK|FsMo*3mNR&hRk@+7gnkA%Gc$^y_XbsrOUEN-&ZU(c0GI{pj1>9mSyEqAd&m7)>?AV| zraO_rzVBoe$8o0$GLpXjL6QOE(s?}IL?+#gIS)8puS)Ls7i~!+2+WL56~d@Wp3f(} z4-iBq+x9_((^@Ap5eY!%!UX656$M(IuRLQic+WR6gEoRWC%rYy8b0InNa*&t*WxWQ ri{1y7PG+5rOH8&Dh<`N)s4V^fp<6aurQY4*00000NkvXXu0mjftxxYR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank.png new file mode 100644 index 0000000000000000000000000000000000000000..c72b150d7c1e38cadbecc95bd88620daad4b7238 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1IggaDrqS0F7V zq3Nn&lV)kyA7(v2NcQG}w0DPR{r+S&^JzfVJ_GY9dES}&LEb7xHkS7GB?bvi(RmM( zXaA2s`{eZPKi95Zo3d(KOI>?rR#s$KP?=NL8Y82d;mOylclA&A>dH58zfj)@v_qjJ z$S;`TKYlQ2*4i?lT7FL##}J9B$pWs-Jj&4w44PX-8BgY{PXJ0Wc)I$ztaD0e0suV4 BV_g6M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_down.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_down.png new file mode 100644 index 0000000000000000000000000000000000000000..277814f6af7c3a459dcffd73c8bf8e2f32c0fcc4 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA*!3-o-7PBt_QjEnx?oJHr&dIz4auNc3LR^8g zl!T_MhE1BKVSkwQ{2lp7r~a+03T_S^Eskr{sBO>IZqN7};3b+m{$5G)3n< zOrHHe{_K;}xBpzbc5TY4Z7p@}nORwpVL@e1U2BYtZiXjcuin)^-K#6#!2LpfBhU_o zk|4iehX44%q*-grfNHfpT^vI!dXoi2lUbP0l+XkK)fR7Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_down.png.mcmeta b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_down.png.mcmeta new file mode 100644 index 00000000..0645f48c --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_down.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_left.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_left.png new file mode 100644 index 0000000000000000000000000000000000000000..5d8a6afc5abc029ef2af37fa1980663ddc9a0b99 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA*!3-o-7PBt_QjEnx?oJHr&dIz4auNc3LR^8g zl!T_MhE1BKVSkwQ{2lp7r~a+03T_S^Eskr{sBO>IZqN7};3b+m{$5G)3n< zOrHHe{_K;}xBpzbc5TY4Z7p@}nORwpVL@e1U2BYtZiXjcuin)^-K#6#!2LpfBhU_o zk|4iehX44%q*-grfNCv0T^vI!dXoiQnR${j8X6}~ohT^DpUTK{KCxncLB)cZCoQJ1 tt`L;VNZZ7h%J`~lp7r~a+03T_S^Eskr{sBO>IZqN7};3b+m{$5G)3n< zOrHHe{_K;}xBpzbc5TY4Z7p@}nORwpVL@e1U2BYtZiXjcuin)^-K#6#!2LpfBhU_o zk|4iehX44%q*-grfNCu~T^vI!dXoiQnR${j8X6}~oGK{EpUTK{KCxo{j1LZ`r5fA; s$~F-fePmBDg?P$mEaOXMYzopr0MGq&yZ`_I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_right.png.mcmeta b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_right.png.mcmeta new file mode 100644 index 00000000..0645f48c --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_right.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_up.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_up.png new file mode 100644 index 0000000000000000000000000000000000000000..3e524e978ff39a95648fa6b51f7128c0ddc16013 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA*!3-o-7PBt_QjEnx?oJHr&dIz4auNc3LR^8g zl!T_MhE1BKVSkwQ{2lp7r~a+03T_S^Eskr{sBO>IZqN7};3b+m{$5G)3n< zOrHHe{_K;}xBpzbc5TY4Z7p@}nORwpVL@e1U2BYtZiXjcuin)^-K#6#!2LpfBhU_o zk|4iehX44%q*-grfNFI-T^vI!dXoi2lU)3C5mdKI;Vst0Cz-j6#xJL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_up.png.mcmeta b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_up.png.mcmeta new file mode 100644 index 00000000..0645f48c --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_up.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_0.png new file mode 100644 index 0000000000000000000000000000000000000000..691bba56bc3f8a72800642e4aac8ea3210b9c0f7 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN@JY5_^ zEP9g@Bv=jX?15`ttMt|KHhjzQb2G%<-JV z_5V&?MH)%@dh?Qh?EG%iRy9ZO$G^AMhaB|$*wpL<*Swmsf%D)0AFSune*fh@YEaT} zm750$Wc;T6XBAm0DFFm_`+lGJQ2RG;O%|g!i;C{r*Ssfy?qTqB^>bP0l+XkKr}k4p literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fa534f0784b00f34f43a24db3ddc318783af162c GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qNPdb&7< zSo9_*NU$z$xYpnr`_X>-%6s*DvI;y4X1@9>zQr^(0SJD4efjynz4?3Nq~P|@3C0(` z?w_zort8M+?&lJ9?`-=Q%B|-9S6g-X!|UA=hwuOAxNiKhGoe&dILy&bP~_~Km^l%q zk4+x@{<*rq?DqS3p8NZ2-36W5W+X09_&UFHs_5!R_516M4Qwjf7O^wj{i8dpim`n! P&~Xf&u6{1-oD!M<2`XC} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f465e1bea0fd8f6c7d2b941f7869cb57e62f17bd GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qOKc)B=- zSoFS~xRL9SgMf?r!R{wqj)E;BlS0Z~21Wg1{I_Bnm(T}po@rsXGL|}taGtDOmuj(T zC%?e4U!WMWt$=U*k?$M-zhwcc*Aqlwv;*LCei zXQk@Q9K)}#ES+~->O;e$(q;{}3oZ>G7#Q;MPcX&!>0CZ@F=Y9NrTs}e6JKuvI&1xQ z1_u973;nRQqO-0TY}m)Uyt^=&=}<$A;+pUBOLmdKI;Vst E07i~wtN;K2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_3.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_3.png new file mode 100644 index 0000000000000000000000000000000000000000..2929686c6dcef462b511aa29eab0c7086db85215 GIT binary patch literal 292 zcmV+<0o(qGP)C6oo%!bkHIw1_T)2WxrFv`UyAn+g4GoOX7>*Zy$!NA z9!c&g)YF8ugCPKu>pT3t0ihP&E^li)E&C839ZEIJ#=7B`cXt5DJwSC z20(RUUeB*;HJsnrKRFhFpe*pZU7k_`v82E mrQwX;2>7v3%@u6U1OngcLtBpx$KQ|u0000vQbKqq*BoufS=XM*9sipARy<0FyB|poBjfH#BIt7mgmF(0000< KMNUMnLSTYqI-i~Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_6.png new file mode 100644 index 0000000000000000000000000000000000000000..b2fb6f91c56c1f149950cf63d17dfdc5c6be013a GIT binary patch literal 385 zcmV-{0e=38P)I*#76KHEELo>MlqY2&1NiQ$Jt!ObpFlEobzAKfq{PwHwv{Ih59#6XXs(Z9V%y?+4UuddMO#C$$H z0q}NlZFD7DEXzNBjZVy1O2$&s=)?fz{X7W3%`dX-5M;#(H}<>co(%>BnZ^z&7}yD3 zGQzJ2BLq;MZ~8(AlIaza^D9RPVa!xAA{izq&qsMa070g)IWrTOadmN(O0@#Ou=aiS z&o0d#&a^nk`r&~F@KZ&(UgzcbbRl;!T1`!>x%^LD298Ox@%ZY{YU+~b0We8ZQ=8@$ fh&d){%3o_=0EKUU6lYGE00000NkvXXu0mjftskY; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_7.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_7.png new file mode 100644 index 0000000000000000000000000000000000000000..9cd4f476bcc78b8650efda0fc5bca2743e450279 GIT binary patch literal 399 zcmV;A0dW3_P)@BvD`4yO1rZ&^WHu!{3p~_Q>v||%+n}&=7Y-% zHjX;vg=7Xy&4I2FX0n96-EFIheJmF0RZKygK3%oxT=C-TYTMiMd}HLZ85Gn z0CBa@_v8Jz<{*}A{L)|Jae!YE@ltlSu)>JY_fd5n0J*&x8x6zAp270zvGhC-dwq3M zQO?dR>U|)r$x}XW?gW53Kh-RwS(%uA=FF)Ml2|!ElS%XY)%8N{Vl?WKM!n!yE+Ed* ti7BaQ8URrcz)MdQpHSxH1eR5(v{QcF)0VH7=61_Rn6g(wdlDMbjNwODp2iP2~X3GR%+ zh57^BnV7g^?GJG6&b^vwG{z=iVn`&s6ilR4nnH(GJAF($Maekl!)qE7Z}Mf%-0wcl zx%boNXI$6Jm*Lc^$mCPd8yXP}N07COsQs$K%%{Dt4Xcz!TT3s3{tgTpA$&@%<4kA} z`r5Z7nh!N&ZR-R4hmWZO@x_;LewN|7!0})o3grxjj4{}?3Ql*2uv-Fltu3VHKf^b0 zG6btyLun7_C{{9$ff%~l`Z2fq0b~!-VtHc+fg?@Gm#fOp!(^II0K07L{P;^<=#v>G(L@$8CGcMt z{d9;4CZm57>t(UIPm&nSOCI986QhbIWr&}cEO}aDQ;I>ut;>-ap+>#b8SC#>gX1jh z&Qa*)ZRPiAnwm$C*C6|KSrykF-WYQUWOXtVZihwwXCg&OsNZ`cx2LF)rW6wy@+O!p zQq&fhAVH1$6@}^JFd58wkd17ko|!Hb8C2huLkf8hias&fm~4iPegip;R8-08?-~FA N002ovPDHLkV1j2(GoknAmtPE0&tPG4mmKP99L)jqLXfQH^#X;^dWMl%nE(*xb zY-a(BX93wDkO0IW{V*EMQU+$Aci0(NfGP}(j13qUKuiVcU|j$)X$p`H0!%=2n7}H7 zEG>X6s4hbT1CZ?M21ViEc@`Q#b++}IW8z}0w1>Uom& zw~e(mw!iIOeQC*HJG9T-*o`Np|NCz4%b%3}jn(R&%=qSV^4e3MjgdF4|Ce07mmOqZ zZ!BQ>vFJy++Eo9KlM;IiJ2)6wcN&`iK6`g}-+Q^R*}J&U{oenJu}NRF9;91vj1PTGw6z(wzAmD*vh32Y)q zzvjste$MaD)6&dgEm(N@>w#;RZ2pIS53G%jwSJMYfA8i{;|XhX?)513FRQ3n{%HzB zQONroZRr?+4xJwrf6sjtcDV8J&!pt1ACm-vX6Hms6XI0isH=TnEqRKKm^${K=BVzYe>{+pHAJyJewy>ZadXR*nl{ zzwR)_EVbBd6E%^`I9cfE!n~QBoSYr@=i3Ameq6fy@zmeX_oo*Mu@uVuNVABW@ys&h zY4p1MC9JMbf~KXn7cQ74efg?}OEGtEX4`%3veIZ}mMz*(rFU!9ls(@aweT^kMn|&D z=fWoi6Verh+rDK~w%Ob*5|d0^9BI8p=1m3TpKk~Iy`zOKUT&yLh`1F}FV9q&S@U9L zyqn?dM@yqNHVYrzGMy)7k;)=XE`tfVq0-yBKi`a5S)jkz>{8HahqT0EX{V^;3RhR; irDPlL{r~Ln>i>*Nf7=$BuL^$;O7fnrelF{r5}E)%*`2Qd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_0.png new file mode 100644 index 0000000000000000000000000000000000000000..2def15583a153f2f84e44cfd6aa6fde48825fb02 GIT binary patch literal 489 zcmVIOby>o9G zGk15-{dV{4x998$A`-bQJl#Yq4_DFR-FZ~MK8>muCsFO}*en>nQs*{_Cyx!(#^3Am zrY&C9_oT6PAg$d)Y3?7H1$$iGmTq~&Vq9f503=AOiB=b_ZdTcd$^E4$3&Ii!O38lG z4ysKS3Q2X?n5^vx1uQ|8wk%=x?Om55!#=Iq(i90WKnxgD6wH5qOZe^eV^^yaTh%zB zO#cXLFm>5Si!dQK44Q2N(`xwKwnKCbHemd-ndgLVPeQKu1uj4Rmpn@p^!8CF+V54=O2W-uIspxfcQ9b zL)<+vh_m5cWZnXfhK?)rk@3ew0X9fWW&_>@K~(eVSlED($oykn{r~^~|Np@5+z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2k8qP3n?s8_d-wr00KQpL_t(I%cYY$ZyQGxg}*y9yR$D+q*gWzCq=3hsq_Ck zcd1hZNSxT9Wm}fW6}9BfJB0w#Zqnp*w>kLE!96m~ZwlXNX6C=t(|>mxfIoi!4J{C2 zLPQX)Ng+~OL&=a*1O%lug+fUgQHq~``4t6_VnmEk)f%6KQfg2TQ-Vq`jbZVHm^8Mj zuw6rp@j}oKJuzfrQViS7i_H(5P7?sZWkf?`16S*jzu)fIj+S9~j-X~{ymO>dG2X1{ zs*d1iq!N5^G;IqK@aM$shxc4v*E~+1oHH}?a|ES?5FLm8o`?H8_74*|7uLg;D31O8 z9Z;~HCHq7v8Rxy`qII$+Mra$ z>(@V_O-m`6`Sify%PqDVsGFMY%Ynnw7jl4ZXmRI!F<8zgf=e9pgzajy5#j=Mb%pmH z?;i=yQ7SOSkVB?WE)jA{7^`Udmh2N!YP!vUv4YZqCF1Rff!k@Ua{meyT5i+)i)g|tr>ft=T_* z#8xe#I80OV>HVMBX22MECg|x=MWCGd=j}VLx@%s(`jOQz(%TKE=}7dNq1zCm$N7rB zGhcUMF0;rCgJO64870EaI1+F)v7_MmxSPwQ= rRZos*IxDnwMnvPC`}zm+f9L!!pi?3|SXKho00000NkvXXu0mjfrMpN2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_10.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_10.png new file mode 100644 index 0000000000000000000000000000000000000000..f5c18a0bb8fab5d865c0dd1fbe3961e689f919bb GIT binary patch literal 593 zcmV-X0z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2k8t83n3K(d6WYH00EUrL_t(I%Y~A?uA?vzg};puqVQCR0ym+8hR*53qvdJR z4;^U43hdyg@OX_}JztZiGI zbBG84N-4beD5a9b$KyfB4PmV%3x&=(>bi~~q3how)E)MSUteE%@A2NVZ5v7{@;pzv zzTfZI2>37
6WTI-lBBJsaz8bkyUp{lBcWj0OIZ^E3Tc-JkJvbhkfU=ECDdaFwZl6-zVdU2zj0-;wAtA-Fr`6 z*No#x-}fk`5D~1kY}=NMd)V(kJRXlnM1<4n#QlD!X&L~u*1TS?6u>zbDFuLW9MM`c zjw3};aJ${&%*GguF=(ynx{howNQkPcxL&Wx-JiDQz5niEXxuff@wlwaAaV+EXywq_U;SeoI@!UzrAt1_t6u;M+0L_vTG5c f>$-p1JDh(4w&~u>a@?bS00000NkvXXu0mjf41M{= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_11.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_11.png new file mode 100644 index 0000000000000000000000000000000000000000..a069afd39d13579d0d7521c08665a059b560c311 GIT binary patch literal 498 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?e4|6Qg%`9dx`&s_M zI{onPz0=m-Lv-X`{{PqB)3iCU=b_B-a4s-otKQ_Qxw(aF!-(Fy|-MOAt%!1 z3FEZxP!)N}%*`6w>edDGs!}RdCFXUD=@E1!Spn# z#D**@|An@vYbM|Rt+?%wa?paS|4uD=ap8&FH!a`KT$#64t8y0JjAr9Ja^b<}?AYHX klfK+fXUdTMJ@-GudAIs~msG{2fPu>3>FVdQ&MBb@0LNm$j{pDw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_2.png new file mode 100644 index 0000000000000000000000000000000000000000..eff706bc0777226d9ae2835acac8b592818d07c7 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?e421szvPzXl`*f=Gu;7n0i&mj zV~EA+(qPY`BMLk@o!Jb3(?RkrVv0>)a1U7e; zN#5C2_ax$1od5jh`(ul3y~f5YS(R2ze?P6g8e5shCc2Ze?7{0@+mdC}uX}5_@9pB6 z#M$pP!>8j^^N}+SLTA?SJ$tao%(Udp`b|3}=T2>P3EAbKz0;sVzc++^ZO^t#Yo7_8 zdGc04LSSNEXsDvv?am)hzh`Zid-LybeQf@z`p(x%scK4(w!QxMBWANhW&M6}Q(2)I goKLPiRs6^OlX2Po+vnO^f#Jj8>FVdQ&MBb@02&plEC2ui literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_3.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_3.png new file mode 100644 index 0000000000000000000000000000000000000000..37702dccc5e163296d2cfc2ae670e3b245ccb6b6 GIT binary patch literal 973 zcmV;;12X)HP)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007 zbV*G`2k8qQ2@^1KZoB3H00R+8L_t(I%Y~3jZyRM8g`b)6B{Lbv(>QTM?oH(2q-h(v ziGYCEAe9{~*dQTxL8Sc={S#$Tf)G`Ogpd%Z5{dvR*^~tcgutzvSVv(aG9HgT zw!e>sg#>Ik(peno)zR}Fgb?y?=N@g#f9C)5o+qRtgpdcBZH6?9Xe7#${Va(I6CnhR z%ePpl?h)#q@j_~i!|X0eBq?+1f>gi_$iUN@+ zrQGkBkpyRM9lz5e2nD=3Uql5c+j+v)2FLsNXmVSm$q>6ycSp2Kf<-Y!!Qhv3t1{FA8_IE9qdMtc=1cL z*Vg6jQFD^!xlgN=qg<{qGGfy9I}}sz<3GNO+dL<(Cs|&3iT?5TSVodQT?(xCSn38_4j~O#jdO9QH3p}*rgBPl)O|IBG z#PxB)(nM8N(xnF!j&0grz_nLirdF+?>ju8((+vWgN)}*1aPa4+n9)(Z;1r1@jEU9pHamo}NmeL^@IMG8r;-{r-0 z8X4Lk^V`QrA<3IJP#c9Ea?@{fT6b7lxrC}J^m=_3o_|5HRHRz20Dw@Cp$+ocuSmou zkx~pc*z<&3dj2iN`cq2960j!lmgncD+t=Y>c1HH<&BjClpd~-6ocCkzaeO zsITjA?z#*Q=}b>g5!1)e`Z~IyQ+JD$?K~ByKzH{xzTZOY592vqDo&o*+~R=1JvrpR v8moQH()<;E@=}B0nmgpp8~?hA%`Ng5UQeXj_D1b&00000NkvXXu0mjfB)YP8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_4.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_4.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e4a55f2e18e3c38fd1c36500ea8a66714a9b80 GIT binary patch literal 823 zcmV-71IYY|P)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;%MC^8n*4_woM#000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2k8t01Q`z|Y`#zc00MhSL_t(I%cYacPZLoT#(y1drvsg7X>1S@4GGa;fCVJV zBT^qRF~GWEB__Ht?))oUxp1osUBHg6AyE>-D<}y<3>eVFM573GXlXm812diLqIzM$ z&a=AroO93pzVDn9l2S^5O#X<|mQF;J@AUa}93Uj6loLN(zOM@aT6+STMV^^iNmnYt zkfrfrKBQvXb6ZHgjrM-Qy$c4R$($=cPH%HLb&1htgQt@l9BWO);&FoL+8Wz*kNiJ>}=eY-{}9AxpdCICu~!^Q##VUo#*5diVV zC~M^`;UJ3<>!9S=9G0t!j$tG*&Qzz0mQF zx*^ptiA?^8+tC*GQa&3CImI6!-R&_x{}o?r`s=IVSn&cX?h%=MxYkCuEZKhNtDl81 zF)ah9jcR0w~_`XBmwSDCq>#yV0g3SkK zN1+w}TGN#Z__n60nIEzQQw5iq*&=st?y-{KvUFUJ z@oA~3bQZ#-yI7_x-Q8@t$0EAT(-{0BDfHKYv@_C){y002ovPDHLkV1gct BVNL)5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_5.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_5.png new file mode 100644 index 0000000000000000000000000000000000000000..5eb5b74baba78be28910d04ebf313f14318d857c GIT binary patch literal 782 zcmV+p1M&QcP)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;%MC^8n*4_woM#000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2k8t13=<^d`^K9900L4;L_t(I%caxHOVm*m!13?>-QT>NA!`&SK_PqKgxXev z9tM>S7;Q``XzQkRwGCRgY~z2RxfLOTCfW)b_JSHKD{KtM=kMO%{k?9B0YzGcXLA;Z zb2xksN2GenmP3RCAc{H0Co2D)0Ys{&Y{w@mEX}UqI1T`{x39rkLSrZo470lYfk1B( zh5@10oIPLRz4ry%(9Hp&n4?$^kW#X<`5Pw+!CHDR-J0^e&u6ao+f(si-ECUH~9bOxg}t;G(s+CX=gunpZbn4YQPZ?9p30OM;+ z5D*%JQ3{dGA%wtqyJRwHe6NA931g!}2MuPQKF7u}-TfC1C@(L(A~1&X;0)+|>zeu4_ptsV=)Z`pewzoeX zzjqBAbYQe53=}pAY00-Dgdj8u>AJ+kM8;s_7;kHx`IR4_qkV&~OKr^gTs3p>={H}8<8;t#)H6M-4;k9 z65~_sJdII`C{(!V42_?kS*&jyG^l_3L>$M6bQV91XvrVJkrLb#jbAkYviY{=ZByxg z4H~61SMOg(brre&WP(O1&B(($#C@l@JaJ{ee)2dY561Tl#9`n0FEesNmUn+x8UO$Q M07*qoM6N<$f@vZ{Z2$lO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_6.png new file mode 100644 index 0000000000000000000000000000000000000000..cf0d9f8a0fc944540e19e0f6d8d67719f129c319 GIT binary patch literal 765 zcmVz@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2k8t502Kty0|yBJ00KctL_t(I%Z-xXPf}q3h9B|Zf&(5c1tKH{DbBPyfVm)Y zT|ov4o=RB1zr2J#N0|@&K%Uc*|H|41hwh1i#p8C7NTyEQw>@8Y(){>2u5kl&nN1Xm zB`h`@i9~{L+gl8Hhv+h!*xLSz{k)y>UIhT5+hS#)R@aydg#yv&G9I^!NMxKY$&C5d zO|45LQ%F*`=1Mq?`CmRHgI?>7IQTn0S!OjBYw05ryw1v-_W-otnVESQ4&9(pui|vN zP?TLpMy?69z9_0KjBJ<$KwDD5BvU$`FJO!QeOb@`vc5Bo^Q$gE*8_6k4FfHf;gN` zmX@C4lVwDsf%0C3q02+Oe)WPr$3^YWMWX?+QzDnmlG#pTceoKQ^f@qzMkXewG_G(c zNYA;m$i4tlXD5oPQmIr}S$RpVTITNDJ|$ujYc4RkskjYdN|0S3L^Bm4Lb``Kg#@QhAF00000NkvXXu0mjf0?$Xz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_7.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_7.png new file mode 100644 index 0000000000000000000000000000000000000000..f42fa9be18f63a35e7e951e6dd36e16562646b66 GIT binary patch literal 829 zcmV-D1H$}?P)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2k8t512HR=d}Xfy00MzYL_t(I%UzPsPV!6?#(y)@&VUqJAcTaFn7H&NTzauy z$$J4Vh$}^!D3%s!DQ%}S@4`=#_j@+yY|hE^Pdq(6d8HI}T{D?X==+}WcuZZ_bX|wF zmeFWLmSsdygfWJysxZdz`ua)`1Od;_&j=xK&f%OR2m+*(G);q2iurs_mStFLS+Cdh zeNUEUyu7>+04$eF&gV0y(}|)eP)d;`2}zOwu;1?yLLj9iO;fbie0_ZZ5Y%%w{w4JSWgvV~oLCi?x=;VgW!L$NV4r{hs^# zdp4U5&N-x%1hd(U%jJTU5-BBGYs#{uu4@3=w!O|MifG#wYb{|Ik|YW8a5!*09tpz` zAq07z({&wro?rK_>*)KQG))mg5QZVv+8>!(Yi6_ARePT2|Ioft{m&2Q9N*vHBuT<> zI3y54Fquraxw&Dx-SY78aHag`&mSHiA8DHAdZ@K#KA!_{xm*aGbDT~m%Cf|J&vv^7 zpePEQa}-7Kk0*=80;Lqjm>=(cGe4b9IOk~Fmf>)SF$Sd+zb*ZR5Q3&@$nzXy3{q>2 z_ntV8QA!cVF?C&Yxm@tx6NVwf;gGT{Da#VAHBl5@`w^67Nt&kI-QA&-V!dADy+><} za}Mu4x3{;fRx7;sG)+TQRjgJk-rwJUQi!66-EPNdG-9{g0Z`X9Qp#(EkH;g^>6F1> zK;QSgy}eOY6+z$kIOh;TptYu|DzYp?DaCX;Wjr2Zt)=Tay!RAEfiZ@`V8CE7AlPg+ ze13k?wk>Iz^7~LJ#qoH=T1(S3#Bq%Gp7Z&P)|$TWvDWezj`(=c!y>I~00000NkvXX Hu0mjfI?QYk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_8.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_8.png new file mode 100644 index 0000000000000000000000000000000000000000..15714e71924377c0632c5d8aaa164bb2be09188d GIT binary patch literal 818 zcmV-21I_%2P)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2k8t53^_Q`N9jZW00MSNL_t(I%Te(xDRIt`Wf>s^(lo_6$2g97@0m`glx0bp zrWj*r+ZJOC+wB&ul;ZXE6(Iy61VRWXrBF)I_dQA}mdhn&Su&0zcXxM;<49FiyuZJr z0oLm^&N-Tky0Xr zz!<}PJ}1v}=JPqv&(9=Dg7^Mf#a{!Dn48s6G-}mSkBTds>zwW)~@$r$Tr>83*#z<9F z#29JY7Hcim+6zERNl_GRw_7HY2>?ygu-R--O0nDRh%u678D&|rTCF&r&p78W#-NQc zgb>K{{MzuRtM{HXO&NxP7$fWTn&omy*L5^aa}nuuI`Q@O#r^&LRoxH*%jJ@B90?&H zrR4Ybm%i^g91aK}xVgDux7%G-n9XMF_j_iu+10$m;c%T*N=e(c6h(oxmb$L_`1qi0 zTeSC{5CTF7wAOT8M_HCAr6`JmEXx?jk#QV}G4k{CgS8f84Axro+uIx8-`@D we?X-abzL)#Bj@v(`Fu`{5$D`hD(^l20i0oOj`7jGT>t<807*qoM6N<$f)sLRz@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2k8t63?w9hmcDWT00NsyL_t(I%RQ3IZrfHAMb~|hmnLPBjubR#jb>mZ{}6v_ z^GE5(v!FoSL5;|YZHbm>zV7365F_I~*c)qY_4)H(qP1q4X3o!7#F$vEDyC_|dryps zvOME(=qSrGoXZ%7i9FA_yW3)|HGKX04@xOSAf<#c2CX&AvS5ti;-ckn=qD;(=}i`I(1pAiw1(imd^NGURoBhFdcwxR3x*gVg0E+>S*JVk!|xJPS^_W_ZF z)|wC^)*7tM`0(K)heP+88Eo6OOw)|k3TrJPM(VPnZQZX0DJ4L-zP{$mm%kAavdmJ~ zHMZ+IPNx&=^%`vw3ZX0uHk%C~6vY|dCzfT#T8l9nr67bv*LBz|%V^sc5EK?`Gh!4% zh@_N=@r4-Es};{YFL)nlnwp|0uu3Ubs}*JGczQbEy$1!uFj1BTB9P|}=W?`Gym`~G z_yrK=dB%z)`o3ovUPwt00j)Ge;YbOzRxHbc4;~R1h8gD^dG46!8LhRVX&O$a7h?2) zkW!#13aaXiaU7YZ8A(D)5v?`zyzu}Y@jUt|=DG|}6Bz*dG4S z*6Ry~VW#g-0NB1C+3g;9|Nc*=DR6al#m&tPZQBw;B*veu$K&zWAGFrId$(b`{STYx zj%Q~loCIGEfLec;L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f09f3ed1813d3c5a56d2c2e230797cbe70bc2c GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|3_M*NLo9le zr%amk>pTPN`FXapwLUf3W{+V-hOmu?m(f@v1tJa-F?o<<_)2fuTx*6R%sJ z{~)2<%9EgXk}rShlC@J5{DVS;1vmZQ!@yh-U9A(C|4F>Yx!}vc$86_oR`*4pcuhqvm5ZhbLBrY*BKcyj;D=QT_TA^LLt+hQVs?qTqB^>bP0l+XkK`$|hH literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass_dark_inverted.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass_dark_inverted.png new file mode 100644 index 0000000000000000000000000000000000000000..391ef0c26720ce6ad4e4312eefcb003ae6de39f6 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|@;qG}Lo9mV zPTt6S*no${Q#rUsIR8WOpCfacrB6&YXkF~!A_8Zc0xwb55&!c3i`~ zfle?orcJ)q4Dp00i_>zopr08^+!G5`Po literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass_inverted.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass_inverted.png new file mode 100644 index 0000000000000000000000000000000000000000..7277d0799c761821638ce8e8a08e3054ce8d45dd GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|JUm?-Lo9le zW47nrt!L9%v2tZ%iUQM?En5zJHCPwD{hj?rsg06HT>9Kn4y;(Z)O8}G$nJzI4S~!O nKrmy1G26-ptIEbpZ+IA-?4{0B)T~+xG?T&8)z4*}Q$iB}lLs$z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/floating_block.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/floating_block.png new file mode 100644 index 0000000000000000000000000000000000000000..209caf8976997e3d648f22a2f28ce9ffd68a4d73 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|c6+)whFJ7Y zoxG8^*+9faUd%cmAacr-5SPr1iQ%2QdnUF;>Zm#7ICRD=Js}d{(kYW9{nP6AyZ_ep zuhV^R=elaHO!4J_upDSV`1aX9d^dGn3x+B@4FPw~XO^>5m2 z|2?zl`-ES@43U@1Zl@atZM^k#Z|~~ZN!`y+eyEBnOTT4vJmkp?S)ex@rVPeF9z|9KCnlyHv5jAM?HB)Ky>aQpzt!87>o>=3eQ#*8;d$A< zMQp2`nCeQV3%4EMd&z2ZB|tEnXvDa@)4;!(`75H@B{6 qoWu`w?En83mQBBa3^tIfnHiRQbr|jp57-M7VeoYIb6Mw<&;$U}v0KUj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/ender_generator_plusplus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/ender_generator_plusplus.png new file mode 100644 index 0000000000000000000000000000000000000000..34f32466f0e4e661c2751954605c275c59666d2c GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`%ROBjLn;{0^c!*=au9H}XXN(Y zSQfo^iueZ(v!us@dm5&1^3$ItCT8`2apKImuA9s_Z6^IS{y*{UrL4cd+WEeH`75d$ zAu9CYalx(xo;MR54>)s&9;_^L_w$wGia7GNQ6{xgTe~DWM4f9AsWL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/food_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/food_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..3e27197fdf06d3bed22e94e13aeeee00d6298895 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|rg*wIhG6A}~_JlyB?b7i*gk*t8IJ1=6+tG@a!8p-d+ z>(wpoSs>(6`fIVdOJ>7t+hD(z4Qw%b2iGyKlUkj8!SqhJX8Y!ceK&9ac>7f?&v>oX z4iWA-U#o<_-#fNG-;pz{sM0F*H1O>-q^3OzIb}ZS3Fj^ZsuR6^`hO zzvY>hyxwKKm@89sW`q34x?ZCV&RZJn?ey+S_AOs3{L}NoO%(~9tc~tAW-ix%z<9*>#H!WnZiRbz%-VnP+5z`lf8N)!Oj>d9 z$6tQVuBBf^b2V0Ju>SG*ZaM1!-$tf?M|SjHvxqNqe4>8P;Jksq^$Y!ZjZaoLq`HKK zB%IRzyCU=om(R?z&94fD1zGbVb1d5%59l6WmnSo?!9SJl&fV4XH;KPHu9tRM*Ims2 z07J9ToY2!-DwxKo6i z@Cn2yDb*PmEVQxNli+)@zewItSR+Z*u-V>WSz^H6;_B077W$&OiJF~lCbJjVuG!_a z_e6n~kiNg1bA@ijQoAXK;#Xdqaxqj-p~6jXR+jaN*?E`N_dGbbuHf;`a-f?GN`m}? z8UB+7PMx103)E}p>Eak7F*P~CjhW|+j0VH@h7}sCfH;IjOF@fExRJY~Q<1yFiN$3i u%aJ1sydE%ld9kouICEf&*#7tn3=ARrxWccRvpoQs#Ng@b=d#Wzp$P!-DU!qh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ba0f85dcc4d1a846f2451c1c1daa61cc8a3c87 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`dp%toLn;`T^qu8oG8AxY-^ys) z&83v1t7P`z;NsF8SvlJq4INuKlqx=~;qBP1Kfyp{X6xTZ_V~0DXTvLXL8BT>YvNyMWp8fMQyuHP?~iS~J#ND>my*-rN+UXl~4^ldx+R#{}I;_8a1y zCfrtK(rc=VOfQoPKCtxtJ9UR`8KM!Yw&twwkGmgxKCyX?x0QO+^IrnrL=N(QId@)& zkz4Osg19it)inLs4@&A0Io>asCrL3d{Qu9C&D;j`2ph;F%nTLPeTG{mUknC{FnGH9 KxvXF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator_plusplus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator_plusplus.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea7f7449bf8d72f343e4a25294b9464382c4d42 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`dp%toLn;`T^x1MT849?ye`Sj5 z)^xeBx`OrKHRl^0z3m%B_cVoX6zFEn-rMkEpTnUEDPrH)z%~7g6N-qIbrK zky~$C!gL|l%6MHoC? L{an^LB{Ts5glJ~E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/high_temperature_furnace_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/high_temperature_furnace_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..681d9bedd6d64578e281dae290dccc125ae97db7 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|x;$MRLo9le zr%Vq0f8K#HAu%B#!Q;#dHSf=VB-irzOu2FHz=4MQ4Wc@?c(fz7oHS;LRJL>8Al2Z@ ztmpip%JG)ZEFhMeFXY4g!BTv-jGwr|?Vj_Z6?-q}X`KS%E`QFaFB@2=AGsXtFR67_ zAZJmmz{lrWU5Y1WO?>)c7sG6)MX?TA2}?|@nHi)uDQZ7x&{G1siow&>&t;ucLK6T5 C&`Syc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/high_temperature_furnace_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/high_temperature_furnace_generator_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9d522a4e1b984b995ea772e144bb457393b9d8 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`dp%toLn;`T^x1M9au9H9e;^vf zy45G~z3P#Br>bu({VW&u?UCvmT^-$^r(8`Zqi>|%xXby3U9QG@^ZnZ*vrGTRJ1HLi zUR#sG=Nvkx;et)R5v!E|i%inH)pH$euBQht=(c)oWT|~Zw8%L40Mn{kRflaJ{|;1f zI_6F1*un8Db?(hfAI9nHQZ*g6Nr*6}>K8S=-8jus;Uyyj!~g%^?yU<4dV~$+5oU&xvOdFabN}uDiZFP( L`njxgN@xNA?piXX^5UcYb}gy~V3-eXhMx z`$DZahaGq1j99G%SY?9dt)A;(bv-?JLATXwqn#QWqF%^x^kJO-u2k1yn}leDs;xQe-PMzW?^mDLwWL_hqUL^~zu+N<_lICkFnGH9xvX@)KK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/lava_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/lava_generator_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..ad4e308718788db304c763e6de22fffcc009fc27 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hdf;zLn;`T^dICr6d>Rt{(jm5 zx!|6NCQYY3v!iS(LyjcbXxwPx%}_IVn0vxrg1P_h{@untX{TMk{%nuja{qNzzvh-p zFL z=3QA3c|CBxoNd+Qhv(E{o31YF(me5mn}Ol~|Jj$*rGdU-1NnxTK~Cq3q1fLGM}Z;? Mp00i_>zopr00_}(3;+NC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/lava_generator_plusplus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/lava_generator_plusplus.png new file mode 100644 index 0000000000000000000000000000000000000000..509f15ca3336a6884181bde8411d17ae1bd6053e GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hdf;zLn;`T^l#)n6u{%M_DhdL zRD@O%yNj#v#SI+X2TTGKx_S;UP3SJUSUe?OK*{#z{cm&iLigUQ`M0p^-|JoOIt!;C zOIWbXHvWm6q1UoW2x?#zjK!GN$lo1cV&A zyXN4_8%N&#leswCr`$|Z=*m~KX$q6|fu8vPpI{fFcZ@ Lu6{1-oD!MwMyIxYluAV2|E} zFu@ccR=LaSbvu1w#*{F@BQLp{8hFzEb*HRbRj}pfeaeUHx3vIVCg!00>1zegFUf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/low_temperature_furnace_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/low_temperature_furnace_generator_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..d30eb369615d0c1b39bb0f6297eb5b6263fdbea7 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>pWc?Ln;`z^d00py>xHTN)X1AgTO{;DqEIOmSOWjg0*t zalLs|`fbDY{yQ2!!j3)T>U-RJuD$!+>F9pWc?Ln;`z^civ;au9H}-`Tiz zh7-%)u5f`I+m_yphl)Tde4{{j!&aq;u4lRuZ5Gley~O1H$UfVDS4X}l{{MuPHm-#s zT&bas4iUNEvzTR9u*3wt2s5yG!{Te-{qKNS?z+>9n8bcBp4T9ASoFgp-AOYmg~AiW z^EWTwTlduM;Cdso@Pc`IC6=*YZ`@%{NfUXsgK3&Z#EeQ8)_a@GSF^l+8k76uM3cgK sbuY$~(hLm$|7-bo8v$L;268zwgUP8j!%Pv4pFj}?Pgg&ebxsLQ0B-$Ul>h($ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/nether_star_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/nether_star_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..a6f456ed70bae61d68bc517384ef25e4ba31d265 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|)_A%&hGf{Eh#_x4wOlvCPQ^*K>Q`oTN5Fy6#D*44l7+`L_|dc$wVbyCaa z!}9HPRCSe9b(>b+IuUX8M1<%&l@@sgC!iH4q$W&FD!=sVYGwAgBhXp>`2l51ir>mdKI;Vst0Ja2OF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/nether_star_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/nether_star_generator_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b768fbaf443ce60693ecf3900fa9863a766872 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`FFaiwLn;`T^cr#<3J`FaKIfoU z;6?#%>$SFx5x1(Q%{h9_sDdf`tgTe~DWM4f Do27c% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/nether_star_generator_plusplus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/nether_star_generator_plusplus.png new file mode 100644 index 0000000000000000000000000000000000000000..77dedfd8887f27b035d3179ad7426276b216d428 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`uRL8GLn;`T^cr#<3J`D+KcBEv zBFBY0cgr`9Y1874xaI8WSi01G!!|h9>(iXR@a8{qzHCm6PBZ^Zb`_8tq?m6*V zE+y@G)c=`GJ`N7Pg?~03{+D#eA%9^5vts~r;`J#Earax9;$Orc-gVtlBxjp-w#jQv ziLOJ31CKN4%W<%B@Hq%ZeN-sFo6hy8p|c@7t!&-b_=p8<@x_^p`k#ypri->VJ*`Qr z{MEe8v9AByp)CqsRbi}Nc0kYm|9^1FyyHLy8_3tp49jHK7|#6g&KoGg;OXk;vd$@? F2>>y8fA|0Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/pink_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/pink_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..a9bc86cfff23a38aa42edcda78b69287295523f0 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|x;? z%xE~_ctb#RhLV68cUb$OsX`x^4H;G?K0V&8v`lJ;Nau{KHGe858cBbMXv(qK#XFF=G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/pink_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/pink_generator_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..6c892321008fe8a84bda3f1984d49b4bfba3446d GIT binary patch literal 288 zcmV+*0pI?KP)C8aXI%6>womz}SrK8kqi~yhHoSb`H65Qm^S$plZ*X{iO z^)BDgiQ9KvAL0{kr*SVJ7Mo?fgB#=m17<(N0A0dE>Cue>fzx&$panqlK=Ts0z(OD` zXddX=PjfCvM)^8K>DBsWK^<0U zCGHp4_qsD~yp{7<_>O|Ogu(CGEH8xQy!!J*Ip%yn&Y;UMi+$Gg6RcuPnU0?wuGh^f zb~HM5UD0d(wS4YZ1=r_rmrZy6@zVFdi?K)HKx^9geIv6zl#QHYbxP9 zzwXP6mdKI;Vst0F(!Br~m)} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/potion_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/potion_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..3a816010b4ffa4aa481a4175f54f98b296ea8b1f GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1Ig2?0JKu0WcT zi$_3EOior^L(SOS#MLh%J1xJbzID-}`MY*)KYiuWeO@Ug1+6dxi#jj6#UbJQ>Ko6i z@Cn2yDb*PmEVQxNli+)@zewItSR+Z*u-V>WSz^H6;_B077W$&OiJF~lCbJjVuG!_a z_e6n~kiNg1bA@ijQoAXK;#Xdqaxqj-p~6jXR+jaN*?E`N_dGbbuHf;`a-f?GN`m}? z8UB+7PMx103)E}l>Eak7F*P~CjhW|+j7CESV@Fwv=$V+9GcrF|W`qL4#4Qa!1q5d> snD1&>wMxr;5<{D$K)b;E5)%f7nZ2CK(^sfI1DeC&>FVdQ&MBb@04>jxTL1t6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/potion_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/potion_generator_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..5a47319bacf9bb6200f71d4a1584972210271c77 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Cp=voLn;`TOz`D8WFX*neBR;t zsn_Q@?`=}xsA5?-JFkkxafw2QdBFLHx0XJz&5Bo0R7qaC@xzOhw0+kn<=C8>U4LRp zZQS+cOD?z_<a%l7T(>iT($b$80dhTC-}`QpnQ-1;Tc z=X)HO;L2q8Wk%}?rfD2ME?h2XD%v*1E@GyjkJ!#74NsUE82gTe~DWM4f8sBea literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/potion_generator_plusplus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/potion_generator_plusplus.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c2841b778573e5dbf9f2b7153be6a1ac68e7e0 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Cp=voLn;`TOmO5nWFX*re4g{} zt82f1;L>Ap>{lpL)O*FtGO>xs=N7x5Pa-PDW%#Rg@SR|KF-|TK#ew$ILDM zvHMk9&9vMc3N7v~lP&x!nyzj$*nRb@;(>$TR@8OEZ?Lo_BP zPnjH=uE4s%z`#HyEkt-_)xVxFwMjkc2?+<*HP-vt{-0BoWO`s~($(g5jJ|@)s4>4mb%H7V&=p=Ywrm&hZ_Z~8oMs?9M)<&~u7N^*9Ets=%gZK@r$bb7UPBPpgZem&;EnX4L(EUr-VKb{@*p>4Q*S{U8>ohxb zp)TLDFMb0%nS_w|9d@n?+Wx08^}k@3~S>i V8P>jVTn7|k@O1TaS?83{1OT?hZa4q{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/redstone_generator_plusplus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/redstone_generator_plusplus.png new file mode 100644 index 0000000000000000000000000000000000000000..07c71795e9177aee59b221449128d14c3c35ea2c GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`2R&UJLn;`TOkB%%D1fJRwxkNv z*{vUfEaowEMy6G8$>_Jvn&GZsc)-@X%<^s2q`xZaJ9E$fypz$o?xgd0r)+ONb9e7>Ko6i z@Cn2yDb*PmEVQxNli+)@zewItSR+Z*u-V>WSz^H6;_B077W$&OiJF~lCbJjVuG!_a z_e6n~kiNg1bA@ijQoAXK;#Xdqaxqj-p~6jXR+jaN*?E`N_dGbbuHf;`a-f?GN`m}? z8UB+7PMx103)Ji6>Eak7F?H^FYd!`A4i`t^S+?x&|CO6)Wwo4pJEJ9j^OUqIqXV_! z@3>VMc>=dMcreJ!WC*WY$a6OPbmG%5e`37YyEp^{cS#;T05pxk)78&qol`;+01FA1 A-~a#s literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/solar_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/solar_generator_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..6482e4fe5e0bbe0099ec956a4c8db07e53ee3a4e GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`n>}3|Ln;{0OfuwZHV|o(zqj0b zVfOUCy$;Lg9o<~=iq)#DP}Jpv!z}%TKf=w6^tk4$y|4Z0tKfP+s=npWo#20V+t{~X zsbOe7{WkkR1*eR}TmgrLtK(~IzPl%P>F=6um1p(VL0V_Y$_(GT8SFX%6L(H}?aFBB z$SkqkPo!bP)XA(N|6jl23`#F+3Au12MxW)y+f$uU!R9O<)N?mDEaZP>z|VL`Z@~^0 zzMejQjrsYvnH8CVuKxf3Me06ZAcGC$d}fA=rM-;Jvrg^=iZFP(`njxgN@xNAREl8f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/solar_generator_plusplus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/solar_generator_plusplus.png new file mode 100644 index 0000000000000000000000000000000000000000..cc45eb4ee8f87ea967533d344a3906f70b77769c GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`n>}3|Ln;{0OxnoXY#`w3|7NmU z&@GclC0{X5;iV^)GB>$MMX5-!8P!cQxPOd^k=KL&&F<&@x;u@Y-;vY$eE#+4t-3#! ziZMyd(X(ehR{Y?=gCh)FvBl4Ycif8#cDlI#%E!xv?6(pWeO{G>^3T9u(gez@nAS-T7y>@%BLxoQL2D|sH2F&?!n zNGNbR@cZWmU4cu?3=IGOf03)Z3Uodj$ob3+^2ho=#?Eet28u9vy85}Sb4q9e0DhKV AuK)l5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/tnt_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/tnt_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..47ee1c0a20af353eca0f3596b393f0bf3ab9feb7 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|LOfj@Lo_BP zPnjH=uE4s%z`#HyEkt-_)xVxFF%Iv{LS@IR-;-WTN=VFjP_uXI?624Ij-7YA=%A9& zxLJ?&w@}LDSwk@GhL z3)6AGRR$Vj?S~fZ5|&{)=(S+^$$X2E=gslXqgGynfT i=B^t8WUztU%gmsoIm>WkR*EiAgu&C*&t;ucLK6TSw@nG!? zuK?-tq^C?Vv$;1EshdSbq$rI~9f4|F{8P-1j(P!%8pDf0) z{jr`_MYHRIIq&)#cqENdPV}l|BtMKyYpDuv^*c!nRNEVZC7tx=q0p6 z+*fJw^|zi0D<-kLbDezRMQOE=#444>>WeBs<@-3+t@jW4Ah9_?f^Q>RlRVIw|Nr*~ hDPI6G*g)=OW|(n#mf>to?`J>}22WQ%mvv4FO#p49SxNu^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_0.png new file mode 100644 index 0000000000000000000000000000000000000000..c0a412a187667a8251eaa5441112ce32678a44d4 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Og&v3Lo9le z|9pRczn;zL;KKJjJUmk*HvGKx_P@`QthUBLW;b35QwAmp{+hqv|9?KbJ4Kp-VV
    jYWCO`uiJYD@<);T3K0RUggC_(@L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_1.png new file mode 100644 index 0000000000000000000000000000000000000000..02ed9847d7910be3245bef39b713978bd227e2cc GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|GCf@!Lo9mV zPTt6SK!Jzl{5@6QvXfhM1Pobt7bUQXTy&f@VTsC;r>dvVzW#GG+Dmh)<4qo}1*KF_7g{VCDSL+@ z$s{@Odpl=;)S?3`7@H3;Oj|f#NHQXBZ&mC0m-QEZ=w#HSF%-HQTO2=Hl@7Fr!PC{x JWt~$(697SEH`o9G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_11.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_11.png new file mode 100644 index 0000000000000000000000000000000000000000..29fa71923c0b5a49cd901e1f8bd6d3f3f4410d42 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|>^xl@Lo9le zO^l7Lk2tVZe0?R#3=Szgf7-St-!PtD5K`dfj)6(2s byBQcx-w@Q8?0&5pXcB{`tDnm{r-UW|7l^Cha^;3L&{DFSc%!ZO{U0Zm3xJ&Jec;u2k6o}`kB`nSD`twhGL2T#R c<-b|1xBo9V-}c+$I?$~Qp00i_>zopr09un=;Q#;t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_4.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_4.png new file mode 100644 index 0000000000000000000000000000000000000000..a43e85a84cf16119b5cf587e8ca8122dd66f9a67 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Ogvp2Lo9le z|NP(n)1GPMpUXO@geCy*lqO;T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_5.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_5.png new file mode 100644 index 0000000000000000000000000000000000000000..10b6ad390d33a46b7b5a4f1836ad1152fdf7bdb7 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|7J9lkhFJ6_ zZ!zTf{r~A{akioZulv7CNbrR0`Dbk4kRc&0?+~W0pzv|N;IW4fA0}E9C5kE=nt69; z{rUgvH!~Or`%H*9%L4@d@%J58s2;nyqoJYUNWGfUm4~d0*?6RwPk3@OF$w(-j8V{C z<+w$0&YV95TYW$p#NXv4{{b3vC&bBY^X6isnjasUCN=_rpk?v|uDXAJ&M`2Y@iSkc T&KPw`KW5B0*zzvboFyt=akR{04yXk2><{9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_7.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_7.png new file mode 100644 index 0000000000000000000000000000000000000000..43f250090bf937260a4e4ef2449d99956fd92264 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|7J9lkhFJ6_ z|M?FD@!`*nCNSTKlSxYWQJH$Ko{f!zH~BI1iC27IcK=OpDZH^|vZREhq-5vDpa19W z_|LAtKLHGyIE7ZvYy^Ufse(?rhUbp4f;A{P$;KIE9av!4FlS4_g8OgnySV?o?^M1e zP|wY{BT9`82+HP)9BZB)f52BYr8seiWV7=_JvWfJ+mjwgtrzi?U5pGoXFLsb&S&)i P9n0Y9>gTe~DWM4ftIbz6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_8.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_8.png new file mode 100644 index 0000000000000000000000000000000000000000..3dffcfb62506ca0784245f059d16de754bd1b82a GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|x;tZn%GI7O`$P_$ zU%_pxd1YPTvzf1IEm(DCR4O|CUUFoCx_{&R#Pm}0BVU@Eaw^NkGP&=(`z^qv?|FF3 z0}h+7H*OqV(W1F;lV|K|v5@Opk24O279gSkuYs&Z2WlOdj0>z tg}uBVPH7uIn4B)-%YOJEL)T?ShTLPin>U$6aRNU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png new file mode 100644 index 0000000000000000000000000000000000000000..0684a2486a203af40b5e8fea37f39afcad4022c3 GIT binary patch literal 436 zcmV;l0ZaagP)Px$Zb?KzR5*==lfO#CP!xy1OD{%qL0d~eCj&x-E`5_ay9@3v;v49jIQalw931RW z>{0^RS{$mT*ftn#Gy4Ac-__Fu}-j z%19*ui2CFC9^mBql4aFI6@ZS{%bX8qgLM6PbBB~l;CI^q>~9{VmmP+)&YzQNu=?+?VJOq z^hLRLJ$1wclW{P?Z}l<`nDRSo5RynEm0KxvA&0T#0Kom#Z7~AC$PU*wQQFD|!Kh^E zTob(yzEeblA(be0VG#qbP0l+XkKc$*s_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_1.png new file mode 100644 index 0000000000000000000000000000000000000000..00598416bc21433211d75c7ae2703c21baced4f6 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le v|HPmFFu#%MfJ^7IKxQ{y3DX1vNd|`KTBf;Q=gO@BDrE3<^>bP0l+XkKbyXU| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_10.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_10.png new file mode 100644 index 0000000000000000000000000000000000000000..65f2714c327b986c79cea79d1e9ffaf8c13b7b31 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le v@1*?sZ_muy&?$6wFgTe~DWM4ffQcK< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_11.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_11.png new file mode 100644 index 0000000000000000000000000000000000000000..af91f596413ccc24b8d9dce779ea44222a586903 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le uQxbmspWn!Iz@_t9AhR2SWg$$mqelF{r5}E)`r5OMK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_12.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_12.png new file mode 100644 index 0000000000000000000000000000000000000000..2a41569ed799d9f2827685adbfe13aeb845ef543 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le u*O;gMIPbuiu*l`}3dY53JyHfUcz`-qFkVd2DYgYFWbkzLb6Mw<&;$TmD;d@R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_13.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_13.png new file mode 100644 index 0000000000000000000000000000000000000000..0c6b5dd14a69a2ec5e763c05a54e1f21fdba1022 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le vQ)Zm}Fu#%MfJ^7IKxQ{y3DX1vNd|_Udl+}@sScY7RLJ1z>gTe~DWM4fZxb5g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_14.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_14.png new file mode 100644 index 0000000000000000000000000000000000000000..e1430a4e92927b85c7d58595b40bf05b6a05c96c GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le v|C~SYVSXdi0hi8afy{2a5~c|Tk_-$HxlD31r{CQHRLJ1z>gTe~DWM4ffI1rf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_15.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_15.png new file mode 100644 index 0000000000000000000000000000000000000000..d59329cbd56c69938bae3924dc6903f668c9243f GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le uQxXz>oOfVMSmg3~1><729w~zvJPZuJ4vg{*DPBH6g$$mqelF{r5}E)=ml*#5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_2.png new file mode 100644 index 0000000000000000000000000000000000000000..286f1e0f8f156c2de62921479788719b6f3cb1ab GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le v|D6Bu-=3MZp;PGWVzwSBgRBDyMhpyzbC_jci}aTQ6*73b`njxgN@xNAeUTdL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_3.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f9ee0e43a41579d51392be292397fc4df1f01b89 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le vQ&#N%IKPqUfJ^7IKxQ{y3DX1vNd|`9rA%eJU#sQ<6*73b`njxgN@xNAXk!|6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_4.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_4.png new file mode 100644 index 0000000000000000000000000000000000000000..254f834f807f381374e51f249e36e74ffcdd595f GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le v|NNi-(4LvKp;PGWVzwSBgRBDyMhpx|vzcWNpM1UxsF1aHZj33Iju8IdhDGm)aGeLIzJ)KbLh*2~7Ym&=|x3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_7.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_7.png new file mode 100644 index 0000000000000000000000000000000000000000..380127849604aa45a7c4d83cf764ccbd7d09681c GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le v*Q{Uv|GWcZ!XlT?D;O8E^+*}a;9+10D`1+lRYNrosF1aHZj33IoG`d*+g$$mqelF{r5}E)x4jG96 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_9.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_9.png new file mode 100644 index 0000000000000000000000000000000000000000..457e0072ebc1409a6ea502ce7ce73215e1807132 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le vQ-1vaZ_muy&?$6wFPx%BS}O-R5*=glS^;YKoo^P&)B0nuG5FD1}QETDlL_$1j}w%!5`oc@=MqNn{JRQ zP$gcKijoM5>?%p)I2p$-i}9mX@5a|-pL6cL=Z^L9-O+76FZnU*0B|+vGn?kzjrFe6 zG--S72wI^g7+VK0A$OYY?<@sB%#;y8bnXI7v+< z`Kp;qeO^1Ib;JQ*Vja%&njG;oj2s4PO|i)aQS+d}+Nv%Hc~@wkx}fxWHN|hiMO2 zFfZcnP-}R>v}h@R!kJHpgM(vBvzuR*=1#k&KZko;>4cZ*4Gcgf-#$xjD4UVDckaEc k@7Wu!zhweC5(17?Gfeoa#Tx6G1adfor>mdKI;Vst0Gxnhw*UYD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/gold_spike.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/gold_spike.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe13b67c841e4e6fc6e0fac34f8ee2c2045500c GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|)_A%&hE&XX zd&8IOkOL3fg|M`TGr#<)QY+sTIN{I*`O-^bZs`HsQU)z4*}Q$iB}bdF-D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/iron_spike.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/iron_spike.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef236ac4e30652555c8cccd4767407b503e61da GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|)_S@)hE&XX zd&8IOkOL3fg|KG~d0+pfUtVi|p|?q-?ca*YeUU*c%Xht6_9gra{#19L_q@+|m0{8KXl*NnT@4vm88-2_ z%L>Fgm@vAC3+UD|Bu|r{H|y1^XlbAI*_*f2J&f6~w%Ny?nFXk1%lz{VTMw7Ke)}bC jcYO2SJaM2SAwc0Cb83tB+L+cEpFskiu6{1-oD!M<=2&8S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/trash_can_energy.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/trash_can_energy.png new file mode 100644 index 0000000000000000000000000000000000000000..da2524b7601ec3892b9ee23cb8d501aeeab8d269 GIT binary patch literal 1331 zcmV-31Px(?MXyIRCt{2T0LtUNf>@C7SyahW~DfoCD2l-{!U70e~ z6~5vcbAbz_2-qPA$p#@=n@DO@>IW+_2YH38}yR_z7pn zN2rBW{CV{cemg%0fW-LKyAL=!K1yj%5eQiIf4{s){Ifq8YZZL{><2ym`s!LUfDe^L z{C)g@u4-X8iS?SiH=`C-aUVb63`hFe%kUJVFFC2qKm}`c770${8Tx}U`h#&|Vt+8! zJ^*9_okkPGNxV_=AO?x_BUQ(J{D4|mMWpKJs+MMowAmjC_v@0(vTg<_HvDDHx51L0U zg=w;;{Ozh1=8I(_+)m?}9^VBt18iZ+wP{wk+XfuxMZI~i`C@4u-$fKiXn@!>OB`ep zHazuEXU9j6Y8Q<_8pBD9i|o08#qmiL=&II6TkWbAdTphd_V(i^V6A;Ntuk|wqLL{_ zVA^yotfo|7`lc4hvqC@?6WEiB32;(mCOT{;yC7VkGeJS5>WCB)c>pItav*s|4!KRH zCWN@=afaxs1&W3?fnHnT`u&YH_2pET39&gzvDd7kh#`F*ceQtcK!}jk))m&w^wlJu z2{DN^D?VOx@3nw5=8L8F_M6IK8(2e3Et39l5-04r47EUzRJWB>=8JLSa9Ocfq{yC} zy|?MWWQ=Qp%kXq>wSd+Db8%M^WL|1;`|{`0#DO`iPU9J_-hD`|x9?gY;Ev5s1sont z=O&VmR9#08Gn|@{1ZAoPgrF=HbD4q5F-5AL${@uYWS=tB0s(vX`C^%hzXCH!fng4k zN!srgXV$ekjpp8KfkYHwxSZfNU_ZdBZA*7cQwsidie7BURVTi&Q%2 zFGVe2%l&O&b?0YnYWZzFyJIU|Eg;}1U}H+B(R3y+!%2*jc$V_^(faIc3Z<+C1f1%+ z9HM}k)N3o;-i?5}5nxeUHWMar-?c!6iC{uq8=IFUARFeNfcwG(W~^M3pB#2@eRGRW zqnR4#tMsCg(f}7Wy*UyaHZw)r>o9Xo+xT~TFJP*mDd8;6XW23g;zhDNrws1}oV9={ zIrjQCsphrieb)jNIh^f)HjcZ-^4M}|Y5{@C1ltP|8?!dqvOv^bP^wyh39(&>L~13a zTG&Y(8laad=(Vwk-Z)|-dB-ph|dU$wvczAet pczAetczAetczAetczEm%{{xjFU9QKbP>28k002ovPDHLkV1jv#aHjwO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/trash_can_fluid.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/trash_can_fluid.png new file mode 100644 index 0000000000000000000000000000000000000000..c2ea066baf01536cce289c89eeb46f341ed6527e GIT binary patch literal 1286 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/pacifists_bench.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/pacifists_bench.png new file mode 100644 index 0000000000000000000000000000000000000000..a681dade59e0c0b51807e00d2af779b044c715cc GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|dOcknLo9le zznEYAf8K#H;h^fpZI5KR_G>wDthRD15nqt)!v2EIaN;7#*-~mbLTpm!C3sBcJ$$0P z+O?3;$55}qx34o|`C{f7ay=0{3Y@u|4b2Qi!~>WDVjAAKmqZtyJb0P$jQddI7AdsM-iK-h-gUXB#A^J1SCKZ0RhV9Kl`V8TQy zAjouG9XrkS1nlyr*<*}2$FA3@_30y?+K+iJE{-AA3}4b(=qP>j_;o}@cKy;#qo+NnXMCira5Jv2rc_*&iz%sBc5$Jb26f3Vp6lX`1uva#wY!2 zC81jMV)a+ooW1OCR)+0=sDD>|sL|y`v3=e-ti5KjT082ctNxcN7z>^SEs5`YC~t<# zlJIbLN`C!-TMa6o_LmgxsLkbbQ(RY-?XHI)oB3pDXsk3e^g}tIh?3bwqKFg0UMK$+ zzkjm7Yo=SDy4Z~J#f$hW{QFgj$x-_rrRpE{=a3O`$zDCLo*~ce zYEpD@R8imde|Su-$CX_L^vT3WtsW!=t2#}a=}_4qdWID;8q zu(e;~1OBmRw{JgAS*gqz+t&ObQSWOPM4LJP;dfz2LV^yH4@=te=I!tsS<_roY@bs2 zs_5~av)U48SLYyh+NR>xnh<&UkG1+idpE4_d){rK$E1z3e16?iZC<>0>drm)MX#Oh z1nS`@Ggc4HMIC1jgT>*V!8}0ze(Zzn?v_4`QMoiAXmmNIHZJYTAv}ybI_XagJxeZ{%zRX%^ zY&+2QvSpQG&baNi`Xi$~*HnPE%OpX2CCQ?Nm{uKt;#xToU{dQq-$78&IFk;=(g_Nd z6G~DeqO}~Zq`@REq9t-=h)fqsq>&L>dLlk6CIQPz#{@WS+*qd|lMoQ72?~WxYL&(y zG>K?dULm-*m>D$K3Zc?Pv?N(99IDk5FeiW$fY8HCWG0I?)(H;M;|gJ%B)pRXJc(#& z6r~d~7)GNpz{n2J>Xi(pKpL^mHfi0Y< zT$@3OXf)u5Kjf#@$z&htHHJAGg2+Jfi)X=UJIQB7Km!Vf#%fT@Qp(4}(Y5=P;KU;FVR2KU&!Xkl^RO_r!KS=}9Fbnq_?tS~D+?74sQ3zmE5HyAoz3SWbPgt9(fNp+ zL+9~0avqbeu0T!KRvpn-hQPjZZo3b+b-pgfQ-V1qW{ zaRNVQH)s`<5!DkRN}waq3N)xyE7-4dt44l~H>MGmeE^ct5gz@MWGot^vsi{@VtlAJ zi1A-~1X%%HMhuASuz}G9CL!bFDD2eBGIajJPv<`Tg)0E+?nS;x-)_0O<@zE8z6jji zUEOkhkpf=??(VMtn_NzxUZw~Q_y=SJuS#1Dx8H)-EPHv>cnK5^@gd*K3r2(ji=!@L ziUES0-7Q}mXm!Z|V056QvM`5-_TG+sTh5fmV-RF}QYr~a;Gg9dmTL!1@|s(D>zfv@ z!v`37PlHLvNj@<}!TxI?l= zJ1_TNaPi>v?e1^nw{9M8!_wZ+Z@rzZZ>uHBX1PChIpCh{cMX>?2V!~19o?v2;s&>C zxih@CT^PA@cWy~j{j0ex1=(pUo{eL$!479)fOV*he52s8` zymjh8e{Dl4$b~-ylo_`E7x4zHhylZ zu3+n(mGN$pKBHsw5ntc=H&m~ApL5y8XYkBOmz*$1zeQCx-aYgAA&o$)^6KW&H^~v_V()C9l}8@EdJ^(JzveKb zHN#k)UEwjq#%7rqjrCub88`iA3Q=I=;6j#VFt?C`Wf-fJd6B7oGQDZ>J%<~0QIY%a zI#o2UO)s@cuiG14m*l%eI+zqjZwt!q8@8&>YxwR}s@<0c?Md`+UtXO!%I@;g#+nPM z)s7*{9Y?s?o*OsXoUc56O}Povv@*)~nMLNj^mmmLo02bVl+DYpso!_pUDxBxJg;B3 zIxkDuw^^FFBCWB BBIy7C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/rain_muffler.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/rain_muffler.png new file mode 100644 index 0000000000000000000000000000000000000000..0de4202504db78144179b4352385190be572378d GIT binary patch literal 4947 zcmeHLc~leU79T{!Qsk&8paczZL6IbrWU@A44G_>^M0g^G>LfFP0kW73BrH{=RqImw zFm**-=&`guwJt{}MIR_AMLbWRxKy!9MXjh5kcYTneP6;NoY!;S@tpb}NhULMzu*0R z_x`?nzmv&2MNH%vm&q;=1dWN3Nn^oztnC;*3VcuPe1n41ne4a(G8Q#c4Mx3&NXMyU zmI0^Y7D59-mYZ5dJ9IvbJ_$f{efE^SB+_osPGSpJiu=t(hc)Bg40M-(?*4vDraU-}}1ELKTzx}N{()D7{@p2nu1U&gNT8(+I!mr(P#hEurpUs-zu7tU`E&5aSG zmz>s3EoW5poGZU~q>57=!IMN%W_rx^2{6NRy!|_n<Sejh*;R)<8~^Zf%&!POu4}wgTl$OGq32@NmTS)zc~?F0Yw0TW5RQ0Rwra!U z(wS`z+dislw=yPep7w%pIZJC_5pm}$=TZ7qx8uvot_8+S%?rplK{`?>BbsNN|G3j) zo}a9LvzzGZcKpKEc(m^OvMUhe7EgfcN|4VJsr6b0is@B2!=g2SvV$OTki~$i({Pfi z!jlP|gw|G3Nuv^>mw)hvkMaJcW>D8}WtNF>&hbG_??;1qHf@Eh0dm#YvQE(WdK6 zB8!A(=M{l#o0&y3RDsM$yY5#Z77>VIT>;j%wpX zRr(B4LZg9kYJYrMgIqp9uQT_2fSFn?bFhbr49^54eF6Qchbay;DKi!~ z=`)OKJUkQEk<$iKVCn&XLxwTko(`sF;_0{+Kuus)){rS9qvVPK51RzZgw|m90%8wA zl7!~1SVLm7jo8x}90+h9;2nbQ&)p6ND7joD)vGgX;YCR$G~4_lOs^&|k^Pb{P^&aN zE}t%7qiQN2or`f$ zI)Zc9bQQv3(Q%B8BM6RhVF5gdV!n|8Rf(n#j><-b0V+fz;PALY6`jw4K{Ol=Ojl_z zl&%&C*%*rOgb0q>sW7!DLT}WfU^xjbnv63Ix@7x+O>j|&B1%GIGkRyWTNLRisR0h4 z2M8UeH=Evq;|MLjkVI{IviMw>#X;CSgoAKdLe^W*-*BS|)S``*1v5B^eZ;mfB9IP{ z7PVC>Ah6p(Hli>ij*@y~oL-+Uq1i&9+B^q_<)EQ3ltiT{i33uY%@x5s5sM$kLPTuv z;ml#dB6tv9j}e-z|A)4<4^`Z|=rY0t=FhU5dV6XizP$IY_coodHxrd=ZwnEs?oGjj zX5yGVPQcYWq)tI~$vD_Q`UbNT7d$!Yek*aw^Xx-;>{_zZ5@DQbeKo)m5jv~!2%ld{inx8 zRD3nc7SM67fK5kuu!fFm)F@~d1QlQ~&SSycq2c}&>Dej*=}%A0v~7s}iz#OQ&vN$y z2JN6gmR=j!nZZWS9N6jm^s?=#@A1`FX76zZKs`LkJLx+t*RWjgq`*6YhpTH?u6I)4 zoxsD@^_R)z^7dH~*MT2+X7D7qg763ePm!Zkb0ekD8{2#DsS+!&d|;3*HbKyb?zY1L z+PTXM7@f%|dAM`SsBt5`yj(|qp@yIlzERSUI6?h>YfzfIgV(v0<_G5|&ND``rzhOh zUvfKri1Zi8$WD&5GS8||e&)7%`>BP^P18qjS{+)l`Le>fQL)dr_5NmZ^xD7Qx_`0x zZjxf0(^8A2bFgda(%aSDpSV^xU9Aw;*VmtX zaU{C+>{q#gm9k5^vWejZ5nmVh$G1FuDC^2j%7c6;l!wosCu})@O!<<#V;(|ri)RRn zmBzU5qC>_$ymwEUlasTqW6{-AF1Ju#-Y9?Z&q~O$+s|C_9f&Asr@Hm`-yik#D7PH& z$SW-LzM6WX64=_>>N`(5?frL3&vD_k`}g;spAk75s$HIfOva8cE}nJw*)xyE(i=B# zj%aFcADb7tFW7&J3YpBJxH-ri#0PV~?k0*VDn6prp3X=LsE^jou+~j)fBZNtz41ZI zW7k4fQ}M?&i2QO3f_lxA9PaA6^Xu)}SK`Kz?$q_Pm#+hxJG|&oiGPyHZk?|SVYG8W!*aq*HRuUc+opPI56mRnUvKcD`f hGwWD>M`c@&PhzZMPq*if;Eyl}iVBaB9u8fW|6dnPDGC4p literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock.png new file mode 100644 index 0000000000000000000000000000000000000000..a9727705f69ad2eb4a172b703f6b726fe841a4f5 GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv=}#LT=BJwMkF1yemk zJqzi~S1W*OwxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHO@Lq;aB>!N_{ z%yt&AcovWi0*fazFuVXNg3)M}G61C}ursg#RT>x>8!#?_m$Nv;eZ8x(p2rK(f2!Eu4S$=yd{_dpunnLoEE0O$-cvoOfVkkQNXSV0b!-%`E4} zfdee5lX(MpR^(?iY?6@Rld))MN@R%Stsbp`ncVu`{viby<20vrO0uz}A5mTp| zCm5bFu`S@9z<5;8!I0sJ`3CLoOfVMNK8mbcv1Ct;zFM(^A~PgFhRrjtnjagRT3*7HQj1*5(zHc$r9`Pxuvdy z(I7zW6n}UJ_kk-17=(@5XBaqyA8rX&otSWi!G!sPtGu46#><8&EiBAeJWnytn#tgJ W%oOfVMNK8mb(1=MrbV0tXZQ-^B6Eu9!3jcaoC9(2R)2${ak>J9eEU~_yTk6<= zpzZ%w*4FTV#=W(H4JKbLh*2~7YrcR&IF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_front.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_front.png new file mode 100644 index 0000000000000000000000000000000000000000..f57bb7f9e7d7e2df4e0c59d60fe5ce8fcc330dc3 GIT binary patch literal 982 zcmV;{11bE8P)EX>4Tx04R}tkv&MmKpe$iQ?()$2Rl@8$WWc^q9Proibb$c+6t{Ym|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jf7n~Gbq{ROvg%&X$9QWhhy~o`6^Clb#w-LQx^h-Wt~ zo%23%h?OOU_?&pspbHW|a$R=$jdRIifoFz{YZQ$a%qse=~`}BBpaT&{3!qc02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00FK^L_t(I%cYaCY87D=gugle?#;!k1`;hqEo_2~U?Zfn z%j<}5;R6}45qt(Eh^2&ZA<+mS5H`F2nH0MuSG-B%G=K3QhM75Yw70us{sRrbt7miW z&niYBq3N?`a+wK0Q7|h)3JjcGn1iEkBzUnsu(cR4A`L?(nZ^mmgiHx&N})s{EsoDB z2S<~FbvXLnad3D}Q{d&(1<$u1@DAqPN-D5br*GFd@bKP@ z&4sS}aA%PS5luk|14a60Fh`LT1w|05Hw0}2tqc=^FUADLAelt;Y5F1QhLt9M`3}&o&6l-t0*tqD1sWN|xO2aLtpET307*qoM6N<$ Ef}gs!A^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_side.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_side.png new file mode 100644 index 0000000000000000000000000000000000000000..8fdb9046c05841204abad402291ac050da81879a GIT binary patch literal 924 zcmV;N17rM&P)EX>4Tx04R}tkv&MmKpe$iQ?()$2Rl@8$WWc^q9Proibb$c+6t{Ym|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jf7n~Gbq{ROvg%&X$9QWhhy~o`6^Clb#w-LQx^h-Wt~ zo%23%h?OOU_?&pspbHW|a$R=$jdRIifoFz{YZQ$a%qse=~`}BB@3Dr-3$N#02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00DGKL_t(I%cYaOiWN~1gum)@W>`=Y#mvNHGjlUDpV>t4 z8H7cAfJHD77UVj2PInp1c=zgF478JTpo{9N{?Xgl*XBQ>1H5{1#p5|K0txNOtm0S& zKvOU`Aq58R4(8@|*$7@f8$5k9Fro~jiYns*V?w3{^wwz6D2uOm$<6Jq;9|%`59Z#H zHcifP*}~Cgu>m8A)g~fn(r@5IghT;rCD1m4cOMft2gljJ{-~Mz+a4hQeF|@`&GRQK zl9-~A7%7;0JNZ8>M|y~+z=$v32Jb)b77!p|iNyGV|9R?X<29=bXqPR7p+}smfB&)m z-2x$^H-s=esD3p!Y70*B$#;?ts0r&~}m#p4*#r)&|0000EX>4Tx04R}tkv&MmKpe$iQ?()$2Rl@8$WWc^q9Proibb$c+6t{Ym|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jf7n~Gbq{ROvg%&X$9QWhhy~o`6^Clb#w-LQx^h-Wt~ zo%23%h?OOU_?&pspbHW|a$R=$jdRIifoFz{YZQ$a%qse=~`}B9yAca9|-^e02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00E~-L_t(I%cYY+Zd5T4L|>KtXAlyw1F?r=a0PD96;RlX zA|)dEzq?p?NJeb2f7kAymR%O#@S4paPdi zxVx7oz?VbZC2*SN%{H#l5KmQf!jL%4jVA2f6v2oiV!t&p zXoUw6!LT?>NFssmW(cG;;z+P=JTTy_LIP3PbJYwS-6Uby;3f^}yb^2{n?+(8sBW%V zhJ>kL!SJFe1>J7pKW=002ovPDHLkV1mYav(Eqk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/smart_pump.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/smart_pump.png new file mode 100644 index 0000000000000000000000000000000000000000..6f502b5a8d7aa51162fe811dc16aca5872977e1b GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|CV09yhFJ6_ z=d4)w>wE*tl_{bU9~z^}@WZP-OrB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/sound_muffler.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/sound_muffler.png new file mode 100644 index 0000000000000000000000000000000000000000..850eba81c06fb4a67d04c05a1eac5171e6662739 GIT binary patch literal 4774 zcmeHKc~nzp7Js+^A{MZSTa^%T1SQE!@&d_gSY(q>qY$Yg2*XR>OL<B&=2I03y(e zEN;W%zD%nyq9Q1c%YY)HLZOP)1L9Jaf;bf&WNNWr02SGtB0hK@c=U;O8v@cT4?cY7BmD``%&TR+SVKtP^4J6tzYrCFKM~m#8Kv zL;@*=po9mCfWVoacBXIptrr*t2l2CBhqGG_Jl$3sz3(nsGM&3D_um~)_t7W+Gap&E ztk_x;+4QHDt>1Zn$RitY58NcB(5PreL{DKu zn6=FJ^;hPxv`Z)}YVUx@;O#DtB%@~W`kC*7Zq0!pqphTuSAf9F>wP#Nh{8=du6|V> zpIrO1``JUYtUgWW;(vP*F?&{w)8|gfTN~F#-o5&)krCOLeWZeGRx;JZ-R8tc^g9>O z3bW)kll02ABc0U6gAB*B=|8ts*uLm>?QJz`_1)^2=5FTj?Kj7tFzpILXHEKh=XJ{4 z&Z^WK=CqvfTUTN?wp3L$SDMyq-1|E^_w*T0=1+>*NnQ|KT+Xi~qYC>oyiVHRtnR4J zL&LJ)ih}H09_=(#2tR`|Lid%k&>;Jz2%-pxyC5dOf87 z8N$9lTbpvjRndxeNZ0=4TqCd#pajZN5YOU`q&|GPtHB`30y7!=_YjXC%lHIB;DP9p5{eI}C zzv%7idH#r9Jh&N3nWZWAJhLDU)Lk42>MK~d5|yYFbPQLC33`G;4GIr}`0fd6OcG7# zC}KiJDqX2BDlbzhB<@OG#}UFpwHFad`XykiB+*WS1J|kQ{MZhPz!}4@Jj743xE$s0;Xm#=`cf~V2st!>U`n=$go4dtDy}7 zZORZ4T2-t@LiofHO5LKd5V&MSUmdHF8^XaQ3_?yQfT$K&WsWnsLLdwn(a=*MBNb|c z79e|^q>hx1k~PjZ{f;4=v5o-s5!`Xo?_)Oz11X^p^;St@_3jD0U8#EeD6W!_IBIz0 z5-`S+!Y~bIJHs@D&2*u0F(!*fuyKTgiP=no#T^4BP-=CUQbOpV063ilI4}(Ja1O?y zaiuVuhDgQWiN(fg&Kx#d!s2n9VK!?F#A*!*suGir^-2$g11KH~kuouYpkXYoGYugK z;Ef9#p^0%ZkH?l^&Io}Rpl}K5tI{YikWNy8$q0s8DKl*72}hR)2wbTwIy|}(Ajfo4 zpa6P+RN|_5?dVnzsUX(qFg>447Y@v1BTN@A7hxeTE~7$g35^!iq8^nA)7e8#=o5p2 zZ~(QKzES~zK?6jCdT9tur_uzeRB~6U-YJS+b7Wfx8VbjBm^Y>)04U7jps+K_bO~Z2 zD2s)1T$V9mKPKv5Aq7tDpt za$$22>3DRlN~(*;G{kZl;1O^I3e>iWOYWj1=4B9!1CP&_y)Q3ii>1IH|5@nIv!7hph}(xOcB(FJAr=QO^$)1_30M@k zWDk>?Rkd<~pYQFTu`}0RU|MBa1xJ>J^z`P8{b@p5+sl`^h%n}pZ6{7FlRxxzyw=s_7#bQXS1Knpbm=TTDXAWg zQ@2dnTU4}oPo0&IRn}9>8fHyR&G%7do7o=D1w>R-W=@V(GGz|eG#P3_cql54jh*%I zoR#OP^70y!h+pTzZf>i}9})`r*ZteCLv4u*pU2HF=4_W8T-V*O?fdT7%|T0@dU_g^ z<@@QAEz|5ux^rvsaK6Oi9n0UNy>kY90slnwy(bu{R<1H>78RcVDZmt%Vw* z%G6=A>rRKuf7<@9bKxBwjWhG|@_sEh-m){-Arm%FxpvJ5>h0~l-`YAT$?$i)x6pO~ z&)<0I{NrDmWmld*r};bH{E@ZQ)2Imv^nd(|TU}kR#7Z!7D3xtOp=6wyb*(oBk z`aXwU{IoMWE(bYc$F6kJ=5?mw9qXqELN^u*)V@umZZJC{YFRMn@cfRhK~wg#13 z3`u)h1-Xwf^h6vGJ^sVw@Rx)mOm@y2T+O|79vHKPMbVz^s{joF@G< jHZYhlb*`j@gam`BLXf$GKJQJSn;AS^{an^LB{Ts5NNHJT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/trading_post_bottom.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/trading_post_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..db2e6e2e130f0c43ace69afb3f47ad19b605a817 GIT binary patch literal 627 zcmV-(0*w8MP)IZKoA|<>&3=kECYp<28pNqNk67P%L@;XC@+nw zhBQhr#l*(9&Y8t-Mp}8jJC`%(%v$mIM`KwQrRfuSo=4a>O+#6hQEOqilI{6?rp2P7 zs;bDgZK~^<6awz?n zTrORr$z;Mr52cOPlz|!0U_er}g}z#?L>1GbOPkGxeIkjAqA7EPL=M@Li7yDSmdm9$ zXsspibUN|M{sDMqya}8_iBReYYH|TUnWfqxRONGcR!+6_f zzz|el``+z#5?ED_EZNPqT93zDOOaM$T(pl(k!29XaZH-u0i1kRq^fM$hhZ#<@K&^T z#TN;S;v#Ze^PBGt9J7y1Mzd~AD@pQA(3It~{4W+?B!P!Rr{pLRk5A&LnYs0$LURI#ujW$DnRmFURS zu}dbT?%g}FBk>pXuV_2brAtF4iUO5V0--3e6FVkx?B3lI7AHMDKfk;0zWeT;R(NN| zIU^6YxT497xyWUN52QR|ZnaEk2E4`0xyM)f}X9bdrfno~jOeP7Kg`xU> z6xirBaeDd-sW4Q?OJCnA#0jw=#~Eedz{kN4h_8kp5^zm7_ToaJfK)1l`}=!nnuc)i zE3)%B2rfYfFNrQ`LJGI|u@to&8oK zdY(@irntChOQu%qCo(h#oShYSU55Z-bh}+_Y&<2c90Hpv4aRh)m2x(xD3~I;W*4l&4vK1 zS{8D-9EQUoR;)$pvyNJ=hLe*Y;#9BKDPSi3=XvpcU;ee*Z3Vz;j!5D8av2d#T0TFe ziHk_6Aq=BTOQ)Jc5^o~(Ss#u`7!;^JrtcC1gIZUqR1g`8q6n2rQ&xw7)XN-?$BBqq zwfZtP3WmG|rpGi@`(EJo_8*;Z1kkc-62vWJ2CPB5-NApr>^oBZH`sgt00007XrW3)K^25#%f#TEb9=YTygk{>dcAvh^Jd??nN|7C z)sSW#(85U-SK9KR7uTg(7T2HCUyE;;dbqIx>f*hSLRM2e5d z!h*s@vT{80=M(i{MO^J7eNLKYhYg26u(~mbZYBtInQc!-35A7#r78?EH?saSnzS0w zX20d3Z{TZjV+A-B_pF3)5dN%Ek}M!C1O9!{Z&AA%zVh-yqY4heh;WICqA8h1OEruf z(0ELzM|d}U7y~4{7+1P?@UeW2OXV#Tc_9h`z5YhjM(ZvrUt&BvKyFS*pLDTza2MCl zJj34j0W@z_a1 kQqd^b+|;;jsH!~1KmRTs7H_S}O8@`>07*qoM6N<$f};F0h5!Hn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_node_bottom.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_node_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab44c39d0193938007a82994eedaa123d18fd59 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|f<0XvLo9le zx0rnSciw?9Au%B#At2}$HJ?d1<>opYIX)q~+M>yDh3ojkE~ z%JdxgyAx&DnDY-P^svU5Jv4prZ?AmHZU%;9owAW%b{#weG@ilJ)z4*}Q$iB}PHroOfVMNK61SHo4AfJpNqMIoDA!aMmpKFNePx1RZ7F%G#>2>`@Wtu367G{|YcC zGys*vDC#i;Gc)^~kV!hk5X&pVz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_node_fluid_top.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_node_fluid_top.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd48f6e114d515000456c6892b9b6d67229cfae GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|vOHZJLo9le zQxXz>oOfVMNK8mbxDdMMc)`zoLe9C4ih;9csed{A)gb67>sHoQjb)FDICsr@#`#x( zIpM*lTGbs+F$~Mt*k(+yJkr9rOG<5yRwv71wgr+6`o9WRI(o7%QBjdt;1?u!;S39d XTd`$sV6?$8psfs^u6{1-oD!M<_{}@u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_node_hyper_energy_top.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_node_hyper_energy_top.png new file mode 100644 index 0000000000000000000000000000000000000000..41efc54c52cf94ec525713452375edb8da0f16c0 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|vOHZJLo9le zQxXz>oOfVMNK61S_UB16Cr=P}&UI7_oHa}R%i*sEK}T7)vbJh0dsM`^Yt}Q)zXHq& z4TdMU*9nL>tZZadOW`w2Y*^REx!goOfVMNK8mbsCc&UxWd-QLe9C4ih;9csed{A)gb67>sHoQjb)FDICsr@#`#x( zIl&?8xatn47=~qRY%?ZU9%*6RC8ah;tCM9h+XBf3{a*zu9X;8XsHjLR@C%Z=aE67! XP{@*(Wty!v&{hUdS3j3^P6WD?<=x|+8&?b;8Z|^1WHB%^KQ<0O{r`qaP`<~a59!%9 z$Fmr?bygWT{8MhzUABq`1nidQ8$Sp#{}6Xz)-DORV5M4K28N{law|6Mcw7UtjKR~@ K&t;ucLK6TiS2{}o literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_energy.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_energy.png new file mode 100644 index 0000000000000000000000000000000000000000..27e252f1533db44f02397055c862273e63100aea GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1Ig2?0JKu0WcT zi$_3EOior^L(SOS#MLh%J1xJbzID-}`MY*)KYiuWeO@Ug1+6dxi#jj6#UbJQ>Ko6i z@Cn2yDb*PmEVQxNli+)@zewItSR+Z*u-V>WSz^H6;_B077W$&OiJF~lCbJjVuG!_a z_e6n~kiNg1bA@ijQoAXK;#Xdqaxqj-p~6jXR+jaN*?E`N_dGbbuHf;`a-f?GN`m}? z8UB+7PMx103)HLQ>Eak7F*RAhnVBa^NrOS9L5E+^VbXEMhIOnedP;0+E-$ni3fef# c&M#zSFkLAs`6?@>9;lDO)78&qol`;+0AJyWYXATM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_fluid.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_fluid.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bd60ed26af99d23c6807525ad7ddd927bb4960 GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF&>+gFlE)^)kS>O>_%)r2R7=#&*=dVZs3QCl?MwA5SrRCu0n&|F=+~r4FXI+bC|#?gDfq8ET}F+0|Suk>IOyO;CU7rK&G~*i(`ny<>Z70MmI+T zfrNyX4~;w!~Uz95`{p!;U#;F~gxC2?hqSKIYqQsBnbIB?>GhaGdyVunLO5)2GteayGrRBOXQMtHjVxvXY& zIi|kVnO$-9Oh7Y`K*h>yx7;^f{F^XsiRn^-4O2cfs-vp-BO`H-KToo?dzZ_ZZF507 NJzf1=);T3K0RYpZJS6}C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/gui/trade_highlight.png b/src/main/resources/assets/utilitiesinexcess/textures/gui/trade_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..b2e3563f17dea1a613e87499f5b35dceacaccbca GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|&H|6fVg?4j{UFR}!5XXr6x8x` zaSXBWPmbA9@UWgui$P6m2BTTh6@^2JmQrqu6J0D=I95yey0;wWU{G7h%=W)#3&QUnA;y4?=-Z&#W+h|W^f&4q&J$en2i;Vu?tKYYL zwZxXKrjkCTrGZaA?rLakY;;WhxA%XrXo}>%yB-HF_z0{xv;TYj^MCjMnPx$EJ;K`R5*>*k}-2<^yWNf`ia4E4Y&IM3BoIP4Yb{BV&@>GI(=>T#eLfzK z7-N{{nK+Ia$ML&`^Z86&*FNxiy#kP?sfPd#hXeQf9VsQiPXd5E&uQD1JkL=|VT?g3 zMV4h~tpU(lBc)^_IcDs>fnFqAiPr$3f#d4aa02pI@#WlFt?)!et2cfk# zxLhv&7v_0>f~A!7eUDPgLvO7JAzV=uZoA#OBuN~wUcc%o+j<_>)AqOZ1@S(Z%@Z;< QsQ>@~07*qoM6N<$f;{G$CjbBd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/block_analyzer.png b/src/main/resources/assets/utilitiesinexcess/textures/items/block_analyzer.png new file mode 100644 index 0000000000000000000000000000000000000000..451ca8fbfd67e07d5f7ac7e5d861652fe9422138 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Vm)0PLo9le z6BY;1Hj4K$oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/destruction_pickaxe.png b/src/main/resources/assets/utilitiesinexcess/textures/items/destruction_pickaxe.png new file mode 100644 index 0000000000000000000000000000000000000000..1d58e0454885143387d982d6f8d24c967752033b GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr*1S2@+cpZqC2`|Dxe8 zsW}WwDlW~9{hxgO`#;GTxuyne?P{OcD z@|n`4JCHKA-}rV}tzlRqdGn^hdx2DjO=k@Z7x6l5mt=F0;;dqveb#`XJ82Hv vgH4i>53cr{PHSqAnEjDyg4-t3U?zs2zm9lJcrf=r&{+(gu6{1-oD!MNS%G}%0G|-obJ@9%85qus%N}B2xNdH_5y)m>xEvS)l&|2J*AJvPOM?7@|3d*o zuz!URNU*>ovY3H^?=T269?xHq0u+=eag8Vm&QB{TPb^Ah2uRG#E79|F4N)-FGt@Ks zy@z=lP|dc~2+uT6Pb~%xAcvJfijkFp5yX0SLDkZs7w1ol}Jke%7i z0v68#vOypLh(Y>cG@7Lh%nS?@*cn)WDh!N_4Hy?dOavp@3Xlx~Oh9v(z$$|* zEr2YjE<*zYknGE=-z-ku%Bcb}eLYLA>hTobAw^`nEUS!@Ry^3==|AunM@`kl_yPiFtvig4AH>Ul+ VSrgWJ6~%!p@pScbS?83{1OOe#aHRkM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/ender_lotus_seed.png b/src/main/resources/assets/utilitiesinexcess/textures/items/ender_lotus_seed.png new file mode 100644 index 0000000000000000000000000000000000000000..f624ef91770999234c8b5f7f28cab2d08355c415 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|R(rZQhFJ8z zop_e3DL|lg|7-r~++w;WETUgFR!tPM%~e?`>J%cKX{dX~L1g8%c~2A1nH$T@Fx8ss z#^fNx<*8x&e)@)~N0U-FmfVwY=?%IU9lMsX!p!&e^Q#H>q`0H|npd07zAMI{|KTIk zf984n6gZD^*UY*tyEi7GhjD?PmkY~H`D)2@h7;Of85kpGnlemx{`Z$#t9Oa?o_Xi4 nxOQ&J127 wnLvuMkFi;0Nufmpt3;gZ4~8>rMZ63Q8?Eo3Z_bSD1GPx$07*naR5*>@k~>esFcgJ9x0C`BAa$ful_kwW7Fgr3ckI>?`FG@Jv7jd&ZpcPN$$4=wg{r`Wd(|;ZQ*(u?x(V6jrnW5>V;algX S+c$vjWbkzLb6Mw<&;$S_>`*uW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_1.png b/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_1.png new file mode 100644 index 0000000000000000000000000000000000000000..eacf588206c7a86b67279e96b85620a342ed9f8d GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|R(rZQhFJ6_ zCnzwPn3xnSUAlCm(@hx*(Pcn}m6r6M@({Bh{d(=*b695$4=wgFVdQ&MBb@05k$uVE_OC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_2.png b/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a3254d245ae3811479b39f43d9383b0b4f18ab1f GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|wtBiahFJ6_ zCnzwPn3xnSUAlCm(@hx*(Pcn}m6r6M@({Bh{d(=*b695$4=wg3pjcXPHJ;31U>gTe~DWM4fMNC|Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_3.png b/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6b46595b3776f1041f8dd7d9199eb09c907ff6aa GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|4tu&dhFJ6_ zCnzwPn3xnSUAlCm(@hx*(Pcn}m6r6M@({Bh{d(=*b695$4=wg$4=wgN(Ebai#N?XUm8$@}laKQ0%}zUa(&!OYOT%vF41?akvrUod#O`njxgN@xNA>iuDh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_5.png b/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_5.png new file mode 100644 index 0000000000000000000000000000000000000000..90f8c5d7c0ffd96a8585f7e966bc3c322d12dd41 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|j(NH`hFJ6_ zCnzwPn3xnSUAlCm(@hx*(Pcn}m6r6M@({Bh{d(=*b695+?h8?dfop3GPe=jUcHz>cq~E{4>+ilIf6m_`REcqli^&&8hRPk@%`0`4o&kNt N;OXk;vd$@?2>?4WW*z_l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/glove.png b/src/main/resources/assets/utilitiesinexcess/textures/items/glove.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0824e5fb21b8fc9be740f22541557a10a062a3 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf67>k44ofy`glX(f`%;+4rA2Y8kyCe&Wtz@&CFCtnEHdPpocu1c^Gn7y49mZ|{57e^WEp zJN6fwNGou-3A6Cc&{~qcTb7x*{nTnEnLfD_Z?u=JHm=r@k12k=y*gKK@WERJ8yA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/glove_bottom.png b/src/main/resources/assets/utilitiesinexcess/textures/items/glove_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5a16dcb0b63475029022a96537a4cf2764556b GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf67>k44ofy`glX(f`7rSn&J*{r?q9=l}oz`@dzFs?P}-n`I?nPGa`1kD3Vy3JShv3=B(uN*zwu(%b>m O&EV;VSxYUZt6ID8=Ii9)ODmU4oJ#$TSP*`1-tic0@0-<)L%XL#S<{7tNs8q8tV3bQ( z>}DlraDA~flYy6@%C)TG*;o6w>fcZB{v|iFq7kCDtKXg-Ghz=m3s#6v|NA(+hJj1cyu7Vcb_LKI44$rjF6*2U FngEB)XCnXr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/glove_top.png b/src/main/resources/assets/utilitiesinexcess/textures/items/glove_top.png new file mode 100644 index 0000000000000000000000000000000000000000..43fac187ac380cd86bf800ab95921042d448363b GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf67>k44ofy`glX(f`G&Z--qGZ+Y^YzTROFS$rtu-cyh}>B{r{ArI?aqNu xZ=cCruQ(!={iH&_(&5|FE$-9qF8+6Lo+^{hpD+2D(}8Yb@O1TaS?83{1OWH4QWO9H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/gluttons_axe.png b/src/main/resources/assets/utilitiesinexcess/textures/items/gluttons_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..e924ac16ad1f0b6312ff6989d57ebda7b7b5fca9 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|E_=E-hFJ6_ zCoEu(`1btU|J3@t|Hsvid-Oar=YMBx00bQx8b&S~S1fvwsO0v!Np!V@U;MtFP+mWA zh3vLQ|4X4fob@*(vVu|{{Q9t~p|P>iF*Ge{O5%~1-=Fm0QpAA>BHNlIYBB~WO}$l zp56bwzxekHOQ`&t;ucLK6TsadOoF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/golden_bag.png b/src/main/resources/assets/utilitiesinexcess/textures/items/golden_bag.png new file mode 100644 index 0000000000000000000000000000000000000000..04944aa4a41443caada9f64ba56c1eba338a96ca GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv=}#LT=BJwMkF1yemk zJy)37&w3&Rt70XRt82O%L|C5p=^+AG#Ht|;!HrcAtMvmbx}Ze zW;+X5JPXJMfdn81>4(v1mNGCiFic=)U;(NyFfuk^TmUf@q=R(<#H1-eHV7~Q&0zwo z46?KUvY@&Q4GciCKIad3sPUpR z!RgJbzyqu5+W!B~PdL7V=NQ+vb1oTotR}Pc@>s+)o-R`>VXS%ZpI7Nh@@Coj+8nbz z7y@z_!Wzy>2N?2jZ&d5~Z!WPTEI<86myX!0lM07c9Q+^_nKOfd;cr4>rB{BfC&)3L Lu6{1-oD!MXzN?0<-!&O`mFE5_imuCFNbdRNQpTnn@K<=#7H3wuKNat*nHc{YDox7P zWlQ<(HuEIcnKxH#^b1S_zAg)36@0lZvg51Sgw+N7Obl0+-jz5z0Vsd$+j+^VWQT9s zyxTu!S5G`y_l#AqZAv54&G?g36;c%r=D#hS6}lzS{=^E^HLBAaq*As^SJoT9fBf+e b*AJG&M{(zEx=oe?oyy?p>gTe~DWM4fp*UKr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.1.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.1.png new file mode 100644 index 0000000000000000000000000000000000000000..00ebd68f4ca64661c42e77fef3b93e23dd341bf2 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9F3${@^GvDCf{D0tJ; z#WBRg`)t@j!Da)VZtt>}b+HS44(wlCIzz~y{8>-uL9>VJ_9$3PTI|B)(e^rgp6j&I z53Gl;ltdh9sPhGAQoA1)~SHqU}6f>^(7z5 zbY6dsJ>c?X$E}Aq{|GS3UN$bMkyqMKrQq`5;K&qIHkfukIy#Pf=PIE>W7nmTk7wmAabC|P rtoPw;4(qOod%hh{@I1MHgTe~DWM4fe|UB* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_active.png b/src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_active.png new file mode 100644 index 0000000000000000000000000000000000000000..fb460947022d8e636ac935f6c27c38f8a12356db GIT binary patch literal 810 zcmV+_1J(SAP)Px%%cs)w!RQ3bwP1o#cYJs7Sejs(c!4Lbg_fYpKAbE3DSC!3)*>C z=U_;qDUdH}M^6G+7h4I|))xZyk*^uQh(;p$#=Zf-^4=bq))=~xa!ggR4aT2_2Gr&- z(V)Tm{SW|Za~OcW2rPO`r=j>j-~JW=ca^l~{2Oz*qZ6pjVP=&!0IPy*Isw3}(q`R@ zk`z1EK;ru%qw@#ly)W23n4QcUFdpv~59;p0 z$aEZlv3JwrL9N5j9$X#lbtJ0TgJ*BPfbID}JUB}a%y{+ft9VeW@T&)7y=`bcosL8m zd7$-l@~B!5#^c=pyncAYbNUN6Su4L;N^pl z06f1x<2qlq2UDA?o&$&nrx4VJnLs=c4-gN; ogF=W0;sN4;cu)xO;9vCMF9wnaRpHh#o&W#<07*qoM6N<$f-Z52ApigX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_active.png.mcmeta b/src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_active.png.mcmeta new file mode 100644 index 00000000..24f863c9 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_active.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":3 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_inactive.png b/src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d12dd308e09438098bd402229bf445667488b2 GIT binary patch literal 350 zcmV-k0iphhP)Px$7)eAyR5*>LlS@m(Koo_)JcvnS1aToE79oY;#`^z%g?3k{3aL^Qim7>(&_);O z3^OsQg`VA9&b{}XnKN)C41nQH^dk!Kd}{1#Xmf3G7k$B+>jN--e(JPiwhMw7zt1`wth(+W;JH3gIBqQM6jVhDKopMUUF=mL$W~oz+YYu+ zu5*nX_-FDwnLXkRg8vn$Nb_&*M-Nh28`>*WMT)h1ve(6nPPClP1zMEVAgKXD2@ycD wT0%R@YCIe5U%j?O>@^Fb`H;_4C~A(zFU#_Admb;B`v3p{07*qoM6N<$f_>+d6aWAK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/inverted_ingot.png b/src/main/resources/assets/utilitiesinexcess/textures/items/inverted_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..5192097e5d4c0c7c7d81035a5461e654233632ae GIT binary patch literal 364 zcmV-y0h9iTP)Px$CP_p=R5*>*lA(^mP!L7W&>Ct;6_SvYpm5|l(po+PiRK%S=<5DLO+^K*eIJ2C zVEPAT5TtMWHXGLNj=H(;-nlcG2mhw5wQ8-^?|k^1X~37u#c{?M8F=|*%JZDt?S{yg zY(AfJI-MAr$WKX+#{+=A?+Jo{^?FSZ1OTYMrH8`-V~j{$*V=U*d7gWdj7@_v%Q8>1 zTrLS`vl-{}nd9+D(=@26H*%V$4qva=_ue9?>bn8JVzHoYTe2*pX&NtS+;lRTpsFNE z;zGPDR8_@(zo%_mRMqVZuv)DgemPx$MM*?KR5*>jlA(^mKoEw%r8Qs(W|5Sn1XYJ6)bbceG|zxUSMv&(O4{dWQdWSV zf;WIULAuxNk)FBSsM*PW|39-k@Lyq!5o3(B>*_bC&a0{dKx<791eW_D@CgDq91Z~N zb~{HzbwNpzP?jZ1efx~ZV@E_8W2EhLzuy6PKA(7=$9z7=^E?1V-d>x{2CX%IQ4~BL z50WHtMrlGd7{{?aUoIB_{NZrOe!pkC-I8S)BI2~XTCHq;KA+zYrxYT>bUMWcm`o<* zc}^V1WLf4oHAQ>99wI^*hStPyww-CyE&k+$jFTiXzv-#`wvbhg17z~`YYe%IN zVHnz4zu#xESlD}7YwRx^k4HwM5m6LzyWOmah_GBP9jJ~V2$bD}s;W4hPDD|}^?L1u pnq%8Tdmp->j{>wdvJ3jt_yX#OEZ?Lo9le z6C_xBcBoAIyYsL7vA(3hqbvJZr$002e`kDV-qw!Bsr}6hAAf)OUv$l~2;Rg)sYX7V z+cw)YUolQ=>$|`Fe{yj9Wrmauzwgw|DXKV}aQdYvkJzGTJolflN_u=_VrFJ;Ze3y7 v%&?jx?z-Sp)=dXD*>C^6`uRD75(;mgIv)g#e#B$T1{HpDG?(ibE<=h>t zBGL@(Pu!Gi_c{cbBwg;&jp{UG2%oheE=@_CfkE-S^|NY+HTQuwFnGH9xvXPx$7fD1xR9J=WRxyskKn$EkG}rJ1vOgda?^xc%ed+QJq~!y-EG2X_l%_dOE3h3e zpgSaXnkb1q87rBIfd}F8lVKRh(&W8&Hy5qVYORH2v?edOF6Npi8WB5dsk{)AszOv? zg-Q@&qUG%4Mg@y&X(1*eB3k!*A|i1NRl(=?0RXVt?!+3AplchqIi9dNp3t?8<5a36 zX!p${Q1if$2PPwFPk1N~EOr(NLQM3vm;(SVN0orfK+ewIdzX(fm6*G> zarlvbv9pSjZ{RLFOEF*b;63snH`3ql2O%a}_j^^v^X$yQ@^}7)6lYu-neqUz&^Mx4N4Jznt5EzMYI_#g^#gG zHm#YsAWeYbr{FQRoh=!?Cm2#VHaR*oGcfGja-j7`>`#B7(-=Hm{an^LB{Ts5$Mj05 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/precision_shears_cooldown.png b/src/main/resources/assets/utilitiesinexcess/textures/items/precision_shears_cooldown.png new file mode 100644 index 0000000000000000000000000000000000000000..11af87014a0fb400d140f7ed0f5b44ecd51c1dc4 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar*1S2@+o%QvdD!udqh2 z_=){48Apao8rRCZN_rI>g3ng$Wxlkh_<#PMx?}3@7aFGB^e;FSxJ;5|gCs+@Q`0QR zgiCW{|4;wBlQ)c|yM99Bi?$@zjjyX8ayhgqWUH)@Wa)_tdeG&drx>Md#30#}bKwF5 Z!z=05@9_=O=L4O<;OXk;vd$@?2>=+xLUjND literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/pseudo_inversion_sigil.png b/src/main/resources/assets/utilitiesinexcess/textures/items/pseudo_inversion_sigil.png new file mode 100644 index 0000000000000000000000000000000000000000..0dcaec9ebea5c6f58e416daeaa13067640b5d87c GIT binary patch literal 1024 zcmeAS@N?(olHy`uVBq!ia0vp^0t^g{4J^z+R@j;UOM#R^vPY0F14ES>14Ba#1H&(% zP{RubhEf9thF1v;3|2E37{m+a>EamTaeVD{$LvQA5^M>7*>_Fd``%x}adt)YoLu9*ZLwb>#4a6Kty3W{ z{9I00V*Mue|4;pl-kV>%amq=p{gb1k{JlLNXY;U?@E-qq|6_*1AG2%Mo8{DceCzl2 zvNfOVo-*6~@B8(2Z#vT^>{Q?P`r*NT@ylr+ZY;`ao3i%GV#zv@uLhN&ua>a?ZM-~x zdlSKXQSF$1M7JncW(VD z(SPTl@VdTrHln|34la1;A~(BV@?NC5{LF>t6XX3GYKlS^m>qnnHox!qv(NjS=R5Co zvWxWh=j0DRqS2K%-~Pi4J9WiRl@ldx>g@U5>t|R!GF$rgua@1*;!F3|^ZdPe>i!G= zYp07F+F!FTNj$S^-E+VB!eUj&Hcw}omnzS{{JFR6#rX}tYx>iU`FWoTKmQKaU+}udkSZ|@1|&b4K;``;Ej{PsS~@`=$|mccu6%fi2^yK2jxSgz`@ zVQS8o_n z!^5*mKL@J*I`g}#=1H(;4zxlqk?s3EO`tz&* zGuZ5V+9Q3`!3vm?RZCnWN>UO_QmvAUQh^kMk%5t^uAw0ig&0^`85>&}8E6|ASQ!{( zTQA5&(U6;;l9^VCTZ2@Z#8sdM4Y&;@nYpROC5gEOxb^rJTY~aBgQu&X%Q~loCIAz@ B#rgmM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/pseudo_inversion_sigil.png.mcmeta b/src/main/resources/assets/utilitiesinexcess/textures/items/pseudo_inversion_sigil.png.mcmeta new file mode 100644 index 00000000..0abd1dd9 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/textures/items/pseudo_inversion_sigil.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/reversing_hoe.png b/src/main/resources/assets/utilitiesinexcess/textures/items/reversing_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..4e69482726fcb9c2a90c135c2bdc0024df33543e GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`DV{ElAr*1S2@6yszCHg|FX1*_ znZse0+TEL9?aONQB_`)`a7b@ma)38*X8rs6({I$5NU|BTw3NU5|2JOw8Am2t1H*~5 z3EB>A6W++q*z9OFdFf20^uswIQ`~aZm?z{KFJ)l3EjyuSRzc!+pnVLUu6{1-oD!M< DT+%lP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/super_architects_wand.png b/src/main/resources/assets/utilitiesinexcess/textures/items/super_architects_wand.png new file mode 100644 index 0000000000000000000000000000000000000000..04f62bd47ebcf92545a61c983412aeda1160d248 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|j(EB_hFJ6- zz2wW)Y#_k;K>Q^mi+SEu%Z>{T;xCtFFSK-%hBjm}P7>w4K_SLCc^6U`X~Jwrn~9!oG>*rq!}^0G0y`MZ3VZ)MN}OtKW)_!oj9if;!640WNkdKZ-~<6dPB9m@ z+kEfZHwD}@U?@Mh`nkS=NCOXB=lPpuuj>PTp8493q63S-;rZ})jP71ilY0e_qz;lo-fQNx`h9bAs zsf9{E7~2>X7>te_JIs0NFpI+T<~@u_$)*g_4t-8D(gY4>)$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/watering_can_basic.png b/src/main/resources/assets/utilitiesinexcess/textures/items/watering_can_basic.png new file mode 100644 index 0000000000000000000000000000000000000000..9e21b95765719c6c63b1f98f7ec349c23ab5c496 GIT binary patch literal 1832 zcmV+@2iN$CP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+SOKT*6St={I6AX2}t6(9L(dK?x4%>;283-lbf%- zKU#Ba6amtBM&MBU>(5Sq;1UxpSr?*D-Wyyt*(4c8G`B15Pd0Xc9zV=9p8T{11TICd zx1S*&^E3SJzF_9y?b%Q97?F4cnvsuyIx-84`Unz!x%t^1fl|8}KE?0|b(33Pj)^;z z<1TFvZTLtwe$%7F2C!5eW~oS1xc6tgA<%KN=Dp9b+?b~d+i4 zdLnsR^veFSUdWex`1OTLe{clja)8}6`8&lAiFF~8=YiH{s58mE*VuczyGnC|9Hr~e&nAcjX7CsxPzG{QD;pGG=cEFpSXD0+B+AH*HG%iJ;>62v z<7|QuPQ3O?r#|Ld!T24^akm4y07rz zL5HM^!??=1rMgUi_m+IQ1L*UHeXPj`p!dAn+Gks|2Ceg;OLlYI}2uDJW<_w8QZD;53VJM^)q-}J@)Zv;~OYfAJt8%yuF{_iO(0004m zX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$iQ%glE3U&~2$WR5rf~bgYT7@E12(?11 z4kp)6Xws0RxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOiU6f~epZjxkXLBY4d?N8I z(+!JwgLrDw(mC%Fhgnh15}y-~8gxP8N3JU_zi}=&Ebz>*kxI@Jhl#~P8!K(hiiS!& zNgT00006VoOIv0RI600RN!9r;`8x z010qNS#tmY4#NNd4#NS*Z>VGd000McNliru?AT;Yuu})ZaN^W_a((Ifr2wZf)H=b{Qn^ zJ#}4oOQ5xuX`1Ln@Gek$3)kj@3s;p=+N@h$cr6l*7a z&Nr(JqV3sq&j+#j<#p8N?=vts#M8K&fyJRML?r4kuOpj+^9Du{W(S5e5BL9pD>&*J z5*auecr;IJY5Qcrc;cr*e#4Cj-UDnC77HwsWGQ&YIzjhM4$p%IW>y7_HiwNLK8sIe pYhWlUImoanO+ezsof8Kb7?ukpO* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/xray_glasses.png b/src/main/resources/assets/utilitiesinexcess/textures/items/xray_glasses.png new file mode 100644 index 0000000000000000000000000000000000000000..2bca425795b0d0b35f08fb9f4cdcb23c362fa376 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qNDJY5_^ zEP9g@Bv`L7dKm@%zj?zVV8f)IEA>fFB&Vh<`Db7GwJ&k*6d`6HXx?_mpA7`Q3j0f@ z9BGjNfe$B*H*GBZb6zwgwcyDg?sCCRN+2aQpL`4s{=Gl*A=f&)q~jmd^eWXP4Her? pzRyqAXtJC*!RBbA1=k7&hA1B|ZF`~2QlMKHJYD@<);T3K0RZ05MB)Gd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/xray_glasses_model.png b/src/main/resources/assets/utilitiesinexcess/textures/items/xray_glasses_model.png new file mode 100644 index 0000000000000000000000000000000000000000..7a50397a28becdc88a7f86e8fb1bc400374bd2d0 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQY`6?zK#qG8~bX02Tlg^e|ow& zhE&XXd+neXlcNm#gZZpsT$4m)r!8$(kge*9TloFM)vDHYdmY006Xl$oo4WWC)m?=T zhj2amoscm7{<}Bl-theQ1)2i|3Z7A^hU>zD_z(9eaP^SJ=EilMg>GoMf|qpH9l$H0$Z?@|Qo~?BC;M zw>ogOx+mM>g{>dC%fj{+7)XV&Elyk-xH^5C@0~qw{rca(`!4n_ep>z8{7-XA*^ivh zS<6x~>#fSncVAZ5m9JybIX$(Z{(!#%%ykGl=c0Pik`$TsmU|gNf}XB^F6*2UngC1( BgL(h} literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info new file mode 100644 index 00000000..90e253a8 --- /dev/null +++ b/src/main/resources/mcmod.info @@ -0,0 +1,21 @@ +{ + "modListVersion": 2, + "modList": [{ + "modid": "${modId}", + "name": "${modName}", + "description": "", + "version": "${modVersion}", + "mcversion": "${minecraftVersion}", + "url": "https://github.com/FourIsTheNumber/UtilitiesInExcess", + "updateUrl": "", + "authorList": ["FourIsTheNumber"], + "credits": "", + "logoFile": "", + "screenshots": [], + "parent": "", + "requiredMods": [], + "dependencies": [], + "dependants": [], + "useDependencyInformation": false + }] +} diff --git a/src/main/resources/mixins.utilitiesinexcess.early.json b/src/main/resources/mixins.utilitiesinexcess.early.json new file mode 100644 index 00000000..cda7db38 --- /dev/null +++ b/src/main/resources/mixins.utilitiesinexcess.early.json @@ -0,0 +1,11 @@ +{ + "required": true, + "minVersion": "0.8.5-GTNH", + "package": "com.fouristhenumber.utilitiesinexcess.mixins.early", + "refmap": "mixins.utilitiesinexcess.refmap.json", + "target": "@env(DEFAULT)", + "mixinextras": { + "minVersion": "0.5.0" + }, + "compatibilityLevel": "JAVA_8" +} diff --git a/src/main/resources/mixins.utilitiesinexcess.json b/src/main/resources/mixins.utilitiesinexcess.json new file mode 100644 index 00000000..1fd306c6 --- /dev/null +++ b/src/main/resources/mixins.utilitiesinexcess.json @@ -0,0 +1,7 @@ +{ + "required": true, + "minVersion": "0.8.5-GTNH", + "refmap": "mixins.utilitiesinexcess.refmap.json", + "target": "@env(DEFAULT)", + "compatibilityLevel": "JAVA_8" +} From a2ec6f5d19100c0b0ca206fd4956f3165211af26 Mon Sep 17 00:00:00 2001 From: alone13141 <108046873+alone13141@users.noreply.github.com> Date: Fri, 24 Apr 2026 20:32:42 -0400 Subject: [PATCH 02/21] Fixed reviewed comments I think everything still works --- .../transfer/TileEntityRetrievalNode.java | 8 +++--- .../transfer/TileEntityTransferNode.java | 26 +++++++++++-------- .../transfer/walk/BreadthWalker.java | 6 ++--- .../transfer/walk/DepthWalker.java | 5 ++-- .../transfer/walk/RoundRobinWalker.java | 4 --- .../transfer/walk/StandardWalker.java | 4 +-- 6 files changed, 27 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RoundRobinWalker.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java index f67fbf95..33ec2949 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java @@ -65,10 +65,12 @@ public void updateEntity() { for (TileEntity entity : ents) { boolean side=true; - if (pipe instanceof TileEntityTransferNodeBase ) - { - side=((TileEntityTransferNodeBase)pipe).canConnectFrom(Walker.getDirectionFromCurrent(entity)); + + if (pipe instanceof TileEntityTransferNodeBase node) { + side = node.canConnectFrom(Walker.getDirectionFromCurrent(entity)); } + + if (side) { IInventory iEntity=(IInventory)entity; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java index 678dcc1d..95fd7a6a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java @@ -1,5 +1,6 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; +import com.cleanroommc.modularui.widgets.layout.Flow; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; @@ -82,9 +83,8 @@ public void updateEntity() { for (TileEntity entity : ents) { boolean side=true; - if (pipe instanceof TileEntityTransferNodeBase ) - { - side=((TileEntityTransferNodeBase)pipe).canConnectFrom(Walker.getDirectionFromCurrent(entity)); + if (pipe instanceof TileEntityTransferNodeBase node) { + side = node.canConnectFrom(Walker.getDirectionFromCurrent(entity)); } if (side) { @@ -162,22 +162,22 @@ public void importItems() { } //TODO: SWITCH ALL CODE TO BASENODE SO EVERY FILE HAS THIS SAVING AND UPGRADES @Override - public void writeToNBT(NBTTagCompound shrug) + public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(shrug); + super.writeToNBT(nbt); for (int i = 0; i < getSizeInventory(); i++) { if (buffer[i]==null) {continue;} - shrug.setTag(String.valueOf(i),buffer[i].writeToNBT(new NBTTagCompound())); + nbt.setTag(String.valueOf(i),buffer[i].writeToNBT(new NBTTagCompound())); } } @Override - public void readFromNBT(NBTTagCompound shrug) + public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(shrug); + super.readFromNBT(nbt); for (int i = 0; i < getSizeInventory(); i++) { - if (!shrug.hasKey(String.valueOf(i))) {continue;} - buffer[i]= ItemStack.loadItemStackFromNBT(shrug.getCompoundTag(String.valueOf(i))); + if (!nbt.hasKey(String.valueOf(i))) {continue;} + buffer[i]= ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(String.valueOf(i))); this.setInventorySlotContents(i,buffer[i]); } } @@ -262,9 +262,13 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet IItemHandler itemHandler = new InvWrapper(this); + + Flow flow=Flow.row(); + flow.pos(34,60).size(108,18); for (int i = 0; i < 6; i++) { - panel.child(new ItemSlot().slot(new ModularSlot(itemHandler,i+1).slotGroup(slotGroup1)).pos(34+i*18,60)); + flow.child(new ItemSlot().slot(new ModularSlot(itemHandler,i+1).slotGroup(slotGroup1))); } + panel.child(flow); ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); panel.child( diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java index 5d51401b..c85f38d8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java @@ -1,5 +1,6 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; import net.minecraft.inventory.IInventory; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.fluids.IFluidHandler; @@ -38,10 +39,9 @@ public void step() { continue; } - Package apple=tile.getClass().getPackage(); - if (apple!=null&&apple.getName().equals("com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer")) //somehow gonna need to kill the chest from the node(s) itself.. + if (tile instanceof ITransferNetworkComponent) //should.. work { - extend.add(tile); + extend.add(tile); // they i think used a bias random.. continue; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java index 02bc5e19..3314a43f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java @@ -1,5 +1,6 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; import net.minecraft.inventory.IInventory; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.fluids.IFluidHandler; @@ -39,8 +40,7 @@ public void step() { if (tile==null || ignore.contains(tile)) {continue;} - Package apple=tile.getClass().getPackage(); - if (apple!=null&&apple.getName().equals("com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer")) //somehow gonna need to kill the chest from the node(s) itself.. + if (tile instanceof ITransferNetworkComponent) //should.. work { extend.add(tile); // they i think used a bias random.. continue; @@ -57,7 +57,6 @@ public void step() Collections.shuffle(extend); lastChoice.addAll(0,extend); - System.out.println(lastChoice); if (lastChoice.isEmpty()) {reset();} } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RoundRobinWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RoundRobinWalker.java deleted file mode 100644 index e394349b..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RoundRobinWalker.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.walk; - -public class RoundRobinWalker implements ITransferWalker { -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java index 16a7362d..6eef41e9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java @@ -1,5 +1,6 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; import net.minecraft.inventory.IInventory; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.fluids.IFluidHandler; @@ -40,8 +41,7 @@ public void step() { if (tile==null || ignore.contains(tile)) {continue;} - Package apple=tile.getClass().getPackage(); - if (apple!=null&&apple.getName().equals("com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer")) //somehow gonna need to kill the chest from the node(s) itself.. + if (tile instanceof ITransferNetworkComponent) //should.. work { extend.add(tile); // they i think used a bias random.. continue; From 8eb51582ee8943dc31ecb845a1960425f0e0a71e Mon Sep 17 00:00:00 2001 From: rjnasers Date: Thu, 7 May 2026 22:30:16 +0200 Subject: [PATCH 03/21] Merging with upstream --- .github/workflows/optimize-images.yml | 17 + dependencies.gradle | 14 +- gradle.properties | 2 +- .../utilitiesinexcess/ClientProxy.java | 5 + .../utilitiesinexcess/CommonProxy.java | 7 + .../utilitiesinexcess/ModBlocks.java | 6 + .../utilitiesinexcess/ModItems.java | 8 +- .../utilitiesinexcess/UtilitiesInExcess.java | 20 +- .../utilitiesinexcess/client/IMCForNEI.java | 24 +- .../blocks/BlockAdvancedUpdateDetector.java | 83 +++ .../common/blocks/BlockChandelier.java | 118 ++++ .../common/blocks/BlockConveyor.java | 19 +- .../common/blocks/BlockDecorativeGlass.java | 2 +- .../common/blocks/BlockDrum.java | 16 + .../common/blocks/BlockEtherealGlass.java | 27 +- .../common/blocks/BlockGigaTorch.java | 87 +++ .../common/blocks/BlockInverted.java | 15 + .../common/blocks/BlockPortalEndOfTime.java | 30 + .../common/blocks/BlockRedstoneClock.java | 16 + .../common/blocks/BlockSmartPump.java | 26 + .../common/blocks/BlockUpdateDetector.java | 20 +- .../common/events/MobDenySpawnEvents.java | 51 ++ .../common/events/WateringCanEvent.java | 10 +- .../common/items/ItemArchitectsWand.java | 139 +++-- .../common/items/ItemGoldenBag.java | 11 - .../items/ItemInversionSigilActive.java | 163 ++++-- .../common/items/ItemWateringCan.java | 2 +- .../tools/ItemAntiParticulateShovel.java | 3 +- .../items/tools/ItemDestructionPickaxe.java | 3 +- .../common/items/tools/ItemEthericSword.java | 3 +- ...GluttonsAxe.java => ItemGourmandsAxe.java} | 33 +- .../items/tools/ItemPrecisionShears.java | 3 +- .../common/items/tools/ItemReversingHoe.java | 3 +- .../common/recipe/RecipeLoader.java | 64 ++- .../renderers/HeavenlyRingRenderer.java | 28 +- .../common/renderers/WireframeRenderer.java | 2 +- ...TileEntityAdvancedBlockUpdateDetector.java | 145 +++++ .../TileEntityBlockUpdateDetector.java | 12 + .../tileentities/TileEntityChandelier.java | 29 + .../tileentities/TileEntityGigaTorch.java | 29 + .../tileentities/TileEntityRedstoneClock.java | 53 +- .../tileentities/TileEntityTrashCanFluid.java | 12 +- .../tileentities/TileEntityTrashCanItem.java | 56 +- .../generators/TileEntityBaseGenerator.java | 6 +- .../compat/ForgeMultipart/FMPItems.java | 60 ++ .../ForgeMultipart/FMPRecipeLoader.java | 72 +++ .../multipart/ConnectablePart.java | 242 ++++++++ .../ForgeMultipart/multipart/Content.java | 65 +++ .../ForgeMultipart/multipart/FencePart.java | 107 ++++ .../multipart/MaterialBasedPart.java | 64 +++ .../multipart/PipeCoverPart.java | 27 + .../ForgeMultipart/multipart/SpherePart.java | 50 ++ .../ForgeMultipart/multipart/UEMultipart.java | 39 ++ .../multipart/UEMultipartItem.java | 135 +++++ .../ForgeMultipart/multipart/WallPart.java | 127 +++++ .../block/MultipartFenceRenderingHelper.java | 153 +++++ .../block/MultipartWallRenderingHelper.java | 159 ++++++ .../render/block/SphereRenderingHelper.java | 525 ++++++++++++++++++ .../render/item/ItemUEMultiPartRenderer.java | 61 ++ .../ForgeMultipart/util/CuboidUtils.java | 205 +++++++ .../utilitiesinexcess/compat/Mods.java | 5 +- .../compat/nei/NEIConfig.java | 4 +- .../compat/nei/QEDRecipeHandler.java | 3 +- .../config/blocks/BlockConfig.java | 34 ++ .../config/items/InversionConfig.java | 46 +- .../config/items/ItemConfig.java | 4 + ...AxeConfig.java => GourmandsAxeConfig.java} | 4 +- .../items/unstabletools/UnstableTools.java | 2 +- .../utilitiesinexcess/mixins/Mixins.java | 12 +- .../MixinBlockEnchantmentTable_MagicWood.java | 27 - .../minecraft/MixinModelBiped_Baubles.java | 3 +- .../render/TESRUnderworldPortal.java | 13 +- .../utils/ArchitectsSelection.java | 136 +++++ .../utils/ArchitectsWandUtils.java | 141 +++-- .../utils/ForgeEventHandler.java | 6 +- .../utils/ItemStackBaseCompare.java | 36 ++ .../utils/MovingObjectPositionUtil.java | 23 + .../utils/VoidingInventory.java | 75 --- .../mcpatcher/ctm/decorative_1/0.png | Bin 0 -> 388 bytes .../mcpatcher/ctm/decorative_1/1.png | Bin 0 -> 318 bytes .../mcpatcher/ctm/decorative_1/2.png | Bin 0 -> 443 bytes .../mcpatcher/ctm/decorative_1/3.png | Bin 0 -> 404 bytes .../mcpatcher/ctm/decorative_1/4.png | Bin 0 -> 389 bytes .../ctm/decorative_1/decorative_1.properties | 6 + .../mcpatcher/ctm/decorative_10/0.png | Bin 0 -> 526 bytes .../mcpatcher/ctm/decorative_10/1.png | Bin 0 -> 403 bytes .../mcpatcher/ctm/decorative_10/2.png | Bin 0 -> 486 bytes .../mcpatcher/ctm/decorative_10/3.png | Bin 0 -> 458 bytes .../mcpatcher/ctm/decorative_10/4.png | Bin 0 -> 512 bytes .../decorative_10/decorative_10.properties | 6 + .../mcpatcher/ctm/decorative_11/0.png | Bin 0 -> 571 bytes .../mcpatcher/ctm/decorative_11/1.png | Bin 0 -> 489 bytes .../mcpatcher/ctm/decorative_11/2.png | Bin 0 -> 593 bytes .../mcpatcher/ctm/decorative_11/3.png | Bin 0 -> 568 bytes .../mcpatcher/ctm/decorative_11/4.png | Bin 0 -> 645 bytes .../decorative_11/decorative_11.properties | 6 + .../mcpatcher/ctm/decorative_2/0.png | Bin 0 -> 328 bytes .../mcpatcher/ctm/decorative_2/1.png | Bin 0 -> 229 bytes .../mcpatcher/ctm/decorative_2/2.png | Bin 0 -> 285 bytes .../mcpatcher/ctm/decorative_2/3.png | Bin 0 -> 275 bytes .../mcpatcher/ctm/decorative_2/4.png | Bin 0 -> 254 bytes .../ctm/decorative_2/decorative_2.properties | 6 + .../mcpatcher/ctm/decorative_4/0.png | Bin 0 -> 795 bytes .../mcpatcher/ctm/decorative_4/1.png | Bin 0 -> 752 bytes .../mcpatcher/ctm/decorative_4/2.png | Bin 0 -> 809 bytes .../mcpatcher/ctm/decorative_4/3.png | Bin 0 -> 793 bytes .../mcpatcher/ctm/decorative_4/4.png | Bin 0 -> 809 bytes .../ctm/decorative_4/decorative_4.properties | 6 + .../mcpatcher/ctm/decorative_5/0.png | Bin 0 -> 314 bytes .../mcpatcher/ctm/decorative_5/1.png | Bin 0 -> 224 bytes .../mcpatcher/ctm/decorative_5/2.png | Bin 0 -> 293 bytes .../mcpatcher/ctm/decorative_5/3.png | Bin 0 -> 256 bytes .../mcpatcher/ctm/decorative_5/4.png | Bin 0 -> 279 bytes .../ctm/decorative_5/decorative_5.properties | 6 + .../mcpatcher/ctm/decorative_6/0.png | Bin 0 -> 509 bytes .../mcpatcher/ctm/decorative_6/1.png | Bin 0 -> 486 bytes .../mcpatcher/ctm/decorative_6/2.png | Bin 0 -> 507 bytes .../mcpatcher/ctm/decorative_6/3.png | Bin 0 -> 508 bytes .../mcpatcher/ctm/decorative_6/4.png | Bin 0 -> 514 bytes .../ctm/decorative_6/decorative_6.properties | 6 + .../mcpatcher/ctm/decorative_7/0.png | Bin 0 -> 489 bytes .../mcpatcher/ctm/decorative_7/1.png | Bin 0 -> 490 bytes .../mcpatcher/ctm/decorative_7/2.png | Bin 0 -> 488 bytes .../mcpatcher/ctm/decorative_7/3.png | Bin 0 -> 487 bytes .../mcpatcher/ctm/decorative_7/4.png | Bin 0 -> 498 bytes .../ctm/decorative_7/decorative_7.properties | 6 + .../mcpatcher/ctm/decorative_8/0.png | Bin 0 -> 440 bytes .../mcpatcher/ctm/decorative_8/1.png | Bin 0 -> 460 bytes .../mcpatcher/ctm/decorative_8/2.png | Bin 0 -> 464 bytes .../mcpatcher/ctm/decorative_8/3.png | Bin 0 -> 441 bytes .../mcpatcher/ctm/decorative_8/4.png | Bin 0 -> 466 bytes .../ctm/decorative_8/decorative_8.properties | 6 + .../mcpatcher/ctm/decorative_9/0.png | Bin 0 -> 522 bytes .../mcpatcher/ctm/decorative_9/1.png | Bin 0 -> 438 bytes .../mcpatcher/ctm/decorative_9/2.png | Bin 0 -> 480 bytes .../mcpatcher/ctm/decorative_9/3.png | Bin 0 -> 480 bytes .../mcpatcher/ctm/decorative_9/4.png | Bin 0 -> 496 bytes .../ctm/decorative_9/decorative_9.properties | 6 + .../mcpatcher/ctm/ethereal_glass_dark/0.png | Bin 0 -> 241 bytes .../mcpatcher/ctm/ethereal_glass_dark/1.png | Bin 0 -> 211 bytes .../mcpatcher/ctm/ethereal_glass_dark/10.png | Bin 0 -> 160 bytes .../mcpatcher/ctm/ethereal_glass_dark/11.png | Bin 0 -> 163 bytes .../mcpatcher/ctm/ethereal_glass_dark/12.png | Bin 0 -> 242 bytes .../mcpatcher/ctm/ethereal_glass_dark/13.png | Bin 0 -> 220 bytes .../mcpatcher/ctm/ethereal_glass_dark/14.png | Bin 0 -> 167 bytes .../mcpatcher/ctm/ethereal_glass_dark/15.png | Bin 0 -> 215 bytes .../mcpatcher/ctm/ethereal_glass_dark/16.png | Bin 0 -> 244 bytes .../mcpatcher/ctm/ethereal_glass_dark/17.png | Bin 0 -> 238 bytes .../mcpatcher/ctm/ethereal_glass_dark/18.png | Bin 0 -> 225 bytes .../mcpatcher/ctm/ethereal_glass_dark/19.png | Bin 0 -> 203 bytes .../mcpatcher/ctm/ethereal_glass_dark/2.png | Bin 0 -> 177 bytes .../mcpatcher/ctm/ethereal_glass_dark/20.png | Bin 0 -> 185 bytes .../mcpatcher/ctm/ethereal_glass_dark/21.png | Bin 0 -> 188 bytes .../mcpatcher/ctm/ethereal_glass_dark/22.png | Bin 0 -> 167 bytes .../mcpatcher/ctm/ethereal_glass_dark/23.png | Bin 0 -> 155 bytes .../mcpatcher/ctm/ethereal_glass_dark/24.png | Bin 0 -> 190 bytes .../mcpatcher/ctm/ethereal_glass_dark/25.png | Bin 0 -> 160 bytes .../mcpatcher/ctm/ethereal_glass_dark/26.png | Bin 0 -> 100 bytes .../mcpatcher/ctm/ethereal_glass_dark/27.png | Bin 0 -> 164 bytes .../mcpatcher/ctm/ethereal_glass_dark/28.png | Bin 0 -> 204 bytes .../mcpatcher/ctm/ethereal_glass_dark/29.png | Bin 0 -> 198 bytes .../mcpatcher/ctm/ethereal_glass_dark/3.png | Bin 0 -> 214 bytes .../mcpatcher/ctm/ethereal_glass_dark/30.png | Bin 0 -> 193 bytes .../mcpatcher/ctm/ethereal_glass_dark/31.png | Bin 0 -> 201 bytes .../mcpatcher/ctm/ethereal_glass_dark/32.png | Bin 0 -> 138 bytes .../mcpatcher/ctm/ethereal_glass_dark/33.png | Bin 0 -> 141 bytes .../mcpatcher/ctm/ethereal_glass_dark/34.png | Bin 0 -> 171 bytes .../mcpatcher/ctm/ethereal_glass_dark/35.png | Bin 0 -> 174 bytes .../mcpatcher/ctm/ethereal_glass_dark/36.png | Bin 0 -> 227 bytes .../mcpatcher/ctm/ethereal_glass_dark/37.png | Bin 0 -> 204 bytes .../mcpatcher/ctm/ethereal_glass_dark/38.png | Bin 0 -> 165 bytes .../mcpatcher/ctm/ethereal_glass_dark/39.png | Bin 0 -> 211 bytes .../mcpatcher/ctm/ethereal_glass_dark/4.png | Bin 0 -> 240 bytes .../mcpatcher/ctm/ethereal_glass_dark/40.png | Bin 0 -> 200 bytes .../mcpatcher/ctm/ethereal_glass_dark/41.png | Bin 0 -> 196 bytes .../mcpatcher/ctm/ethereal_glass_dark/42.png | Bin 0 -> 205 bytes .../mcpatcher/ctm/ethereal_glass_dark/43.png | Bin 0 -> 202 bytes .../mcpatcher/ctm/ethereal_glass_dark/44.png | Bin 0 -> 143 bytes .../mcpatcher/ctm/ethereal_glass_dark/45.png | Bin 0 -> 140 bytes .../mcpatcher/ctm/ethereal_glass_dark/46.png | Bin 0 -> 188 bytes .../mcpatcher/ctm/ethereal_glass_dark/5.png | Bin 0 -> 242 bytes .../mcpatcher/ctm/ethereal_glass_dark/6.png | Bin 0 -> 207 bytes .../mcpatcher/ctm/ethereal_glass_dark/7.png | Bin 0 -> 220 bytes .../mcpatcher/ctm/ethereal_glass_dark/8.png | Bin 0 -> 179 bytes .../mcpatcher/ctm/ethereal_glass_dark/9.png | Bin 0 -> 190 bytes .../ethereal_glass_dark.properties | 6 + .../minecraft/mcpatcher/ctm/glass_0/0.png | Bin 110 -> 154 bytes .../minecraft/mcpatcher/ctm/glass_0/1.png | Bin 108 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_0/10.png | Bin 87 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_0/11.png | Bin 85 -> 109 bytes .../minecraft/mcpatcher/ctm/glass_0/12.png | Bin 104 -> 156 bytes .../minecraft/mcpatcher/ctm/glass_0/13.png | Bin 102 -> 138 bytes .../minecraft/mcpatcher/ctm/glass_0/14.png | Bin 85 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_0/15.png | Bin 98 -> 143 bytes .../minecraft/mcpatcher/ctm/glass_0/16.png | Bin 108 -> 150 bytes .../minecraft/mcpatcher/ctm/glass_0/17.png | Bin 114 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_0/18.png | Bin 96 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_0/19.png | Bin 112 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_0/2.png | Bin 96 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_0/20.png | Bin 90 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_0/21.png | Bin 89 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_0/22.png | Bin 85 -> 111 bytes .../minecraft/mcpatcher/ctm/glass_0/23.png | Bin 83 -> 109 bytes .../minecraft/mcpatcher/ctm/glass_0/24.png | Bin 108 -> 153 bytes .../minecraft/mcpatcher/ctm/glass_0/25.png | Bin 91 -> 128 bytes .../minecraft/mcpatcher/ctm/glass_0/26.png | Bin 75 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_0/27.png | Bin 96 -> 128 bytes .../minecraft/mcpatcher/ctm/glass_0/28.png | Bin 102 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_0/29.png | Bin 89 -> 118 bytes .../minecraft/mcpatcher/ctm/glass_0/3.png | Bin 108 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_0/30.png | Bin 95 -> 130 bytes .../minecraft/mcpatcher/ctm/glass_0/31.png | Bin 94 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_0/32.png | Bin 80 -> 106 bytes .../minecraft/mcpatcher/ctm/glass_0/33.png | Bin 81 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_0/34.png | Bin 83 -> 109 bytes .../minecraft/mcpatcher/ctm/glass_0/35.png | Bin 85 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_0/36.png | Bin 112 -> 166 bytes .../minecraft/mcpatcher/ctm/glass_0/37.png | Bin 97 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_0/38.png | Bin 85 -> 120 bytes .../minecraft/mcpatcher/ctm/glass_0/39.png | Bin 106 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_0/4.png | Bin 106 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_0/40.png | Bin 90 -> 125 bytes .../minecraft/mcpatcher/ctm/glass_0/41.png | Bin 102 -> 133 bytes .../minecraft/mcpatcher/ctm/glass_0/42.png | Bin 94 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_0/43.png | Bin 104 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_0/44.png | Bin 83 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_0/45.png | Bin 80 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_0/46.png | Bin 92 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_0/5.png | Bin 106 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_0/6.png | Bin 107 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_0/7.png | Bin 94 -> 121 bytes .../minecraft/mcpatcher/ctm/glass_0/8.png | Bin 88 -> 111 bytes .../minecraft/mcpatcher/ctm/glass_0/9.png | Bin 87 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_1/0.png | Bin 162 -> 222 bytes .../minecraft/mcpatcher/ctm/glass_1/1.png | Bin 155 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_1/10.png | Bin 137 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_1/11.png | Bin 132 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_1/12.png | Bin 157 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_1/13.png | Bin 148 -> 125 bytes .../minecraft/mcpatcher/ctm/glass_1/14.png | Bin 117 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_1/15.png | Bin 142 -> 164 bytes .../minecraft/mcpatcher/ctm/glass_1/16.png | Bin 155 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_1/17.png | Bin 169 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_1/18.png | Bin 146 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_1/19.png | Bin 170 -> 152 bytes .../minecraft/mcpatcher/ctm/glass_1/2.png | Bin 144 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_1/20.png | Bin 157 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_1/21.png | Bin 142 -> 165 bytes .../minecraft/mcpatcher/ctm/glass_1/22.png | Bin 120 -> 141 bytes .../minecraft/mcpatcher/ctm/glass_1/23.png | Bin 127 -> 146 bytes .../minecraft/mcpatcher/ctm/glass_1/24.png | Bin 161 -> 120 bytes .../minecraft/mcpatcher/ctm/glass_1/25.png | Bin 129 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_1/26.png | Bin 75 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_1/27.png | Bin 145 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_1/28.png | Bin 152 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_1/29.png | Bin 137 -> 141 bytes .../minecraft/mcpatcher/ctm/glass_1/3.png | Bin 152 -> 190 bytes .../minecraft/mcpatcher/ctm/glass_1/30.png | Bin 143 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_1/31.png | Bin 144 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_1/32.png | Bin 95 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_1/33.png | Bin 120 -> 131 bytes .../minecraft/mcpatcher/ctm/glass_1/34.png | Bin 113 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_1/35.png | Bin 143 -> 150 bytes .../minecraft/mcpatcher/ctm/glass_1/36.png | Bin 164 -> 174 bytes .../minecraft/mcpatcher/ctm/glass_1/37.png | Bin 139 -> 153 bytes .../minecraft/mcpatcher/ctm/glass_1/38.png | Bin 118 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_1/39.png | Bin 157 -> 142 bytes .../minecraft/mcpatcher/ctm/glass_1/4.png | Bin 159 -> 154 bytes .../minecraft/mcpatcher/ctm/glass_1/40.png | Bin 131 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_1/41.png | Bin 161 -> 138 bytes .../minecraft/mcpatcher/ctm/glass_1/42.png | Bin 142 -> 153 bytes .../minecraft/mcpatcher/ctm/glass_1/43.png | Bin 152 -> 130 bytes .../minecraft/mcpatcher/ctm/glass_1/44.png | Bin 115 -> 135 bytes .../minecraft/mcpatcher/ctm/glass_1/45.png | Bin 95 -> 120 bytes .../minecraft/mcpatcher/ctm/glass_1/46.png | Bin 157 -> 175 bytes .../minecraft/mcpatcher/ctm/glass_1/5.png | Bin 162 -> 186 bytes .../minecraft/mcpatcher/ctm/glass_1/6.png | Bin 163 -> 170 bytes .../minecraft/mcpatcher/ctm/glass_1/7.png | Bin 153 -> 157 bytes .../minecraft/mcpatcher/ctm/glass_1/8.png | Bin 139 -> 162 bytes .../minecraft/mcpatcher/ctm/glass_1/9.png | Bin 148 -> 160 bytes .../minecraft/mcpatcher/ctm/glass_10/0.png | Bin 155 -> 202 bytes .../minecraft/mcpatcher/ctm/glass_10/1.png | Bin 151 -> 179 bytes .../minecraft/mcpatcher/ctm/glass_10/10.png | Bin 130 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_10/11.png | Bin 122 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_10/12.png | Bin 146 -> 206 bytes .../minecraft/mcpatcher/ctm/glass_10/13.png | Bin 140 -> 170 bytes .../minecraft/mcpatcher/ctm/glass_10/14.png | Bin 123 -> 126 bytes .../minecraft/mcpatcher/ctm/glass_10/15.png | Bin 134 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_10/16.png | Bin 149 -> 195 bytes .../minecraft/mcpatcher/ctm/glass_10/17.png | Bin 158 -> 195 bytes .../minecraft/mcpatcher/ctm/glass_10/18.png | Bin 142 -> 169 bytes .../minecraft/mcpatcher/ctm/glass_10/19.png | Bin 150 -> 164 bytes .../minecraft/mcpatcher/ctm/glass_10/2.png | Bin 141 -> 133 bytes .../minecraft/mcpatcher/ctm/glass_10/20.png | Bin 136 -> 162 bytes .../minecraft/mcpatcher/ctm/glass_10/21.png | Bin 129 -> 164 bytes .../minecraft/mcpatcher/ctm/glass_10/22.png | Bin 124 -> 152 bytes .../minecraft/mcpatcher/ctm/glass_10/23.png | Bin 129 -> 147 bytes .../minecraft/mcpatcher/ctm/glass_10/24.png | Bin 146 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_10/25.png | Bin 129 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_10/26.png | Bin 111 -> 110 bytes .../minecraft/mcpatcher/ctm/glass_10/27.png | Bin 136 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_10/28.png | Bin 138 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_10/29.png | Bin 127 -> 150 bytes .../minecraft/mcpatcher/ctm/glass_10/3.png | Bin 150 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_10/30.png | Bin 131 -> 163 bytes .../minecraft/mcpatcher/ctm/glass_10/31.png | Bin 129 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_10/32.png | Bin 116 -> 135 bytes .../minecraft/mcpatcher/ctm/glass_10/33.png | Bin 118 -> 135 bytes .../minecraft/mcpatcher/ctm/glass_10/34.png | Bin 127 -> 158 bytes .../minecraft/mcpatcher/ctm/glass_10/35.png | Bin 132 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_10/36.png | Bin 155 -> 205 bytes .../minecraft/mcpatcher/ctm/glass_10/37.png | Bin 140 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_10/38.png | Bin 129 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_10/39.png | Bin 152 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_10/4.png | Bin 142 -> 189 bytes .../minecraft/mcpatcher/ctm/glass_10/40.png | Bin 141 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_10/41.png | Bin 144 -> 161 bytes .../minecraft/mcpatcher/ctm/glass_10/42.png | Bin 144 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_10/43.png | Bin 141 -> 162 bytes .../minecraft/mcpatcher/ctm/glass_10/44.png | Bin 125 -> 137 bytes .../minecraft/mcpatcher/ctm/glass_10/45.png | Bin 123 -> 138 bytes .../minecraft/mcpatcher/ctm/glass_10/46.png | Bin 135 -> 161 bytes .../minecraft/mcpatcher/ctm/glass_10/5.png | Bin 142 -> 193 bytes .../minecraft/mcpatcher/ctm/glass_10/6.png | Bin 140 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_10/7.png | Bin 134 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_10/8.png | Bin 134 -> 162 bytes .../minecraft/mcpatcher/ctm/glass_10/9.png | Bin 131 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_11/0.png | Bin 119 -> 220 bytes .../minecraft/mcpatcher/ctm/glass_11/1.png | Bin 117 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_11/10.png | Bin 114 -> 157 bytes .../minecraft/mcpatcher/ctm/glass_11/11.png | Bin 107 -> 152 bytes .../minecraft/mcpatcher/ctm/glass_11/12.png | Bin 117 -> 256 bytes .../minecraft/mcpatcher/ctm/glass_11/13.png | Bin 112 -> 217 bytes .../minecraft/mcpatcher/ctm/glass_11/14.png | Bin 105 -> 142 bytes .../minecraft/mcpatcher/ctm/glass_11/15.png | Bin 109 -> 202 bytes .../minecraft/mcpatcher/ctm/glass_11/16.png | Bin 129 -> 223 bytes .../minecraft/mcpatcher/ctm/glass_11/17.png | Bin 123 -> 230 bytes .../minecraft/mcpatcher/ctm/glass_11/18.png | Bin 123 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_11/19.png | Bin 123 -> 227 bytes .../minecraft/mcpatcher/ctm/glass_11/2.png | Bin 120 -> 163 bytes .../minecraft/mcpatcher/ctm/glass_11/20.png | Bin 119 -> 166 bytes .../minecraft/mcpatcher/ctm/glass_11/21.png | Bin 122 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_11/22.png | Bin 113 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_11/23.png | Bin 111 -> 154 bytes .../minecraft/mcpatcher/ctm/glass_11/24.png | Bin 119 -> 234 bytes .../minecraft/mcpatcher/ctm/glass_11/25.png | Bin 100 -> 187 bytes .../minecraft/mcpatcher/ctm/glass_11/26.png | Bin 86 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_11/27.png | Bin 104 -> 170 bytes .../minecraft/mcpatcher/ctm/glass_11/28.png | Bin 120 -> 215 bytes .../minecraft/mcpatcher/ctm/glass_11/29.png | Bin 115 -> 166 bytes .../minecraft/mcpatcher/ctm/glass_11/3.png | Bin 125 -> 204 bytes .../minecraft/mcpatcher/ctm/glass_11/30.png | Bin 107 -> 215 bytes .../minecraft/mcpatcher/ctm/glass_11/31.png | Bin 115 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_11/32.png | Bin 95 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_11/33.png | Bin 96 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_11/34.png | Bin 110 -> 138 bytes .../minecraft/mcpatcher/ctm/glass_11/35.png | Bin 113 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_11/36.png | Bin 129 -> 244 bytes .../minecraft/mcpatcher/ctm/glass_11/37.png | Bin 110 -> 203 bytes .../minecraft/mcpatcher/ctm/glass_11/38.png | Bin 101 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_11/39.png | Bin 112 -> 200 bytes .../minecraft/mcpatcher/ctm/glass_11/4.png | Bin 118 -> 241 bytes .../minecraft/mcpatcher/ctm/glass_11/40.png | Bin 116 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_11/41.png | Bin 113 -> 198 bytes .../minecraft/mcpatcher/ctm/glass_11/42.png | Bin 114 -> 170 bytes .../minecraft/mcpatcher/ctm/glass_11/43.png | Bin 115 -> 208 bytes .../minecraft/mcpatcher/ctm/glass_11/44.png | Bin 105 -> 137 bytes .../minecraft/mcpatcher/ctm/glass_11/45.png | Bin 101 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_11/46.png | Bin 129 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_11/5.png | Bin 119 -> 222 bytes .../minecraft/mcpatcher/ctm/glass_11/6.png | Bin 126 -> 236 bytes .../minecraft/mcpatcher/ctm/glass_11/7.png | Bin 126 -> 185 bytes .../minecraft/mcpatcher/ctm/glass_11/8.png | Bin 122 -> 166 bytes .../minecraft/mcpatcher/ctm/glass_11/9.png | Bin 121 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_3/0.png | Bin 220 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_3/1.png | Bin 202 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_3/10.png | Bin 188 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_3/11.png | Bin 188 -> 176 bytes .../minecraft/mcpatcher/ctm/glass_3/12.png | Bin 216 -> 225 bytes .../minecraft/mcpatcher/ctm/glass_3/13.png | Bin 198 -> 214 bytes .../minecraft/mcpatcher/ctm/glass_3/14.png | Bin 186 -> 179 bytes .../minecraft/mcpatcher/ctm/glass_3/15.png | Bin 214 -> 203 bytes .../minecraft/mcpatcher/ctm/glass_3/16.png | Bin 202 -> 209 bytes .../minecraft/mcpatcher/ctm/glass_3/17.png | Bin 225 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_3/18.png | Bin 194 -> 192 bytes .../minecraft/mcpatcher/ctm/glass_3/19.png | Bin 223 -> 208 bytes .../minecraft/mcpatcher/ctm/glass_3/2.png | Bin 196 -> 194 bytes .../minecraft/mcpatcher/ctm/glass_3/20.png | Bin 191 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_3/21.png | Bin 188 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_3/22.png | Bin 184 -> 177 bytes .../minecraft/mcpatcher/ctm/glass_3/23.png | Bin 184 -> 176 bytes .../minecraft/mcpatcher/ctm/glass_3/24.png | Bin 226 -> 223 bytes .../minecraft/mcpatcher/ctm/glass_3/25.png | Bin 188 -> 197 bytes .../minecraft/mcpatcher/ctm/glass_3/26.png | Bin 179 -> 171 bytes .../minecraft/mcpatcher/ctm/glass_3/27.png | Bin 223 -> 204 bytes .../minecraft/mcpatcher/ctm/glass_3/28.png | Bin 198 -> 205 bytes .../minecraft/mcpatcher/ctm/glass_3/29.png | Bin 190 -> 182 bytes .../minecraft/mcpatcher/ctm/glass_3/3.png | Bin 219 -> 209 bytes .../minecraft/mcpatcher/ctm/glass_3/30.png | Bin 193 -> 199 bytes .../minecraft/mcpatcher/ctm/glass_3/31.png | Bin 190 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_3/32.png | Bin 184 -> 173 bytes .../minecraft/mcpatcher/ctm/glass_3/33.png | Bin 183 -> 175 bytes .../minecraft/mcpatcher/ctm/glass_3/34.png | Bin 184 -> 176 bytes .../minecraft/mcpatcher/ctm/glass_3/35.png | Bin 186 -> 179 bytes .../minecraft/mcpatcher/ctm/glass_3/36.png | Bin 229 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_3/37.png | Bin 194 -> 203 bytes .../minecraft/mcpatcher/ctm/glass_3/38.png | Bin 189 -> 185 bytes .../minecraft/mcpatcher/ctm/glass_3/39.png | Bin 228 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_3/4.png | Bin 201 -> 215 bytes .../minecraft/mcpatcher/ctm/glass_3/40.png | Bin 190 -> 188 bytes .../minecraft/mcpatcher/ctm/glass_3/41.png | Bin 225 -> 207 bytes .../minecraft/mcpatcher/ctm/glass_3/42.png | Bin 194 -> 191 bytes .../minecraft/mcpatcher/ctm/glass_3/43.png | Bin 221 -> 206 bytes .../minecraft/mcpatcher/ctm/glass_3/44.png | Bin 184 -> 176 bytes .../minecraft/mcpatcher/ctm/glass_3/45.png | Bin 180 -> 173 bytes .../minecraft/mcpatcher/ctm/glass_3/46.png | Bin 191 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_3/5.png | Bin 216 -> 206 bytes .../minecraft/mcpatcher/ctm/glass_3/6.png | Bin 201 -> 203 bytes .../minecraft/mcpatcher/ctm/glass_3/7.png | Bin 195 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_3/8.png | Bin 189 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_3/9.png | Bin 186 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_4/0.png | Bin 109 -> 210 bytes .../minecraft/mcpatcher/ctm/glass_4/1.png | Bin 106 -> 188 bytes .../minecraft/mcpatcher/ctm/glass_4/10.png | Bin 87 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_4/11.png | Bin 85 -> 130 bytes .../minecraft/mcpatcher/ctm/glass_4/12.png | Bin 103 -> 206 bytes .../minecraft/mcpatcher/ctm/glass_4/13.png | Bin 101 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_4/14.png | Bin 85 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_4/15.png | Bin 102 -> 174 bytes .../minecraft/mcpatcher/ctm/glass_4/16.png | Bin 115 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_4/17.png | Bin 114 -> 195 bytes .../minecraft/mcpatcher/ctm/glass_4/18.png | Bin 97 -> 164 bytes .../minecraft/mcpatcher/ctm/glass_4/19.png | Bin 106 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_4/2.png | Bin 96 -> 170 bytes .../minecraft/mcpatcher/ctm/glass_4/20.png | Bin 89 -> 143 bytes .../minecraft/mcpatcher/ctm/glass_4/21.png | Bin 90 -> 137 bytes .../minecraft/mcpatcher/ctm/glass_4/22.png | Bin 86 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_4/23.png | Bin 84 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_4/24.png | Bin 108 -> 188 bytes .../minecraft/mcpatcher/ctm/glass_4/25.png | Bin 93 -> 147 bytes .../minecraft/mcpatcher/ctm/glass_4/26.png | Bin 75 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_4/27.png | Bin 97 -> 149 bytes .../minecraft/mcpatcher/ctm/glass_4/28.png | Bin 113 -> 162 bytes .../minecraft/mcpatcher/ctm/glass_4/29.png | Bin 89 -> 158 bytes .../minecraft/mcpatcher/ctm/glass_4/3.png | Bin 112 -> 201 bytes .../minecraft/mcpatcher/ctm/glass_4/30.png | Bin 97 -> 156 bytes .../minecraft/mcpatcher/ctm/glass_4/31.png | Bin 94 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_4/32.png | Bin 80 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_4/33.png | Bin 81 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_4/34.png | Bin 83 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_4/35.png | Bin 85 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_4/36.png | Bin 114 -> 202 bytes .../minecraft/mcpatcher/ctm/glass_4/37.png | Bin 97 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_4/38.png | Bin 85 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_4/39.png | Bin 107 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_4/4.png | Bin 105 -> 186 bytes .../minecraft/mcpatcher/ctm/glass_4/40.png | Bin 89 -> 157 bytes .../minecraft/mcpatcher/ctm/glass_4/41.png | Bin 99 -> 157 bytes .../minecraft/mcpatcher/ctm/glass_4/42.png | Bin 93 -> 163 bytes .../minecraft/mcpatcher/ctm/glass_4/43.png | Bin 104 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_4/44.png | Bin 82 -> 122 bytes .../minecraft/mcpatcher/ctm/glass_4/45.png | Bin 80 -> 117 bytes .../minecraft/mcpatcher/ctm/glass_4/46.png | Bin 93 -> 146 bytes .../minecraft/mcpatcher/ctm/glass_4/5.png | Bin 110 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_4/6.png | Bin 114 -> 169 bytes .../minecraft/mcpatcher/ctm/glass_4/7.png | Bin 95 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_4/8.png | Bin 89 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_4/9.png | Bin 88 -> 141 bytes .../minecraft/mcpatcher/ctm/glass_5/0.png | Bin 218 -> 233 bytes .../minecraft/mcpatcher/ctm/glass_5/1.png | Bin 216 -> 197 bytes .../minecraft/mcpatcher/ctm/glass_5/10.png | Bin 155 -> 128 bytes .../minecraft/mcpatcher/ctm/glass_5/11.png | Bin 152 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_5/12.png | Bin 221 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_5/13.png | Bin 188 -> 177 bytes .../minecraft/mcpatcher/ctm/glass_5/14.png | Bin 129 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_5/15.png | Bin 178 -> 171 bytes .../minecraft/mcpatcher/ctm/glass_5/16.png | Bin 226 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_5/17.png | Bin 211 -> 183 bytes .../minecraft/mcpatcher/ctm/glass_5/18.png | Bin 199 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_5/19.png | Bin 202 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_5/2.png | Bin 197 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_5/20.png | Bin 178 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_5/21.png | Bin 181 -> 131 bytes .../minecraft/mcpatcher/ctm/glass_5/22.png | Bin 141 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_5/23.png | Bin 158 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_5/24.png | Bin 220 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_5/25.png | Bin 164 -> 128 bytes .../minecraft/mcpatcher/ctm/glass_5/26.png | Bin 75 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_5/27.png | Bin 167 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_5/28.png | Bin 186 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_5/29.png | Bin 168 -> 131 bytes .../minecraft/mcpatcher/ctm/glass_5/3.png | Bin 210 -> 195 bytes .../minecraft/mcpatcher/ctm/glass_5/30.png | Bin 199 -> 138 bytes .../minecraft/mcpatcher/ctm/glass_5/31.png | Bin 168 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_5/32.png | Bin 113 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_5/33.png | Bin 124 -> 121 bytes .../minecraft/mcpatcher/ctm/glass_5/34.png | Bin 154 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_5/35.png | Bin 148 -> 133 bytes .../minecraft/mcpatcher/ctm/glass_5/36.png | Bin 226 -> 206 bytes .../minecraft/mcpatcher/ctm/glass_5/37.png | Bin 205 -> 164 bytes .../minecraft/mcpatcher/ctm/glass_5/38.png | Bin 154 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_5/39.png | Bin 188 -> 172 bytes .../minecraft/mcpatcher/ctm/glass_5/4.png | Bin 216 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_5/40.png | Bin 190 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_5/41.png | Bin 186 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_5/42.png | Bin 173 -> 139 bytes .../minecraft/mcpatcher/ctm/glass_5/43.png | Bin 189 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_5/44.png | Bin 117 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_5/45.png | Bin 115 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_5/46.png | Bin 190 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_5/5.png | Bin 210 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_5/6.png | Bin 217 -> 150 bytes .../minecraft/mcpatcher/ctm/glass_5/7.png | Bin 199 -> 141 bytes .../minecraft/mcpatcher/ctm/glass_5/8.png | Bin 185 -> 131 bytes .../minecraft/mcpatcher/ctm/glass_5/9.png | Bin 161 -> 135 bytes .../minecraft/mcpatcher/ctm/glass_6/0.png | Bin 0 -> 243 bytes .../minecraft/mcpatcher/ctm/glass_6/1.png | Bin 0 -> 238 bytes .../minecraft/mcpatcher/ctm/glass_6/10.png | Bin 0 -> 214 bytes .../minecraft/mcpatcher/ctm/glass_6/11.png | Bin 0 -> 214 bytes .../minecraft/mcpatcher/ctm/glass_6/12.png | Bin 0 -> 236 bytes .../minecraft/mcpatcher/ctm/glass_6/13.png | Bin 0 -> 228 bytes .../minecraft/mcpatcher/ctm/glass_6/14.png | Bin 0 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_6/15.png | Bin 0 -> 232 bytes .../minecraft/mcpatcher/ctm/glass_6/16.png | Bin 0 -> 240 bytes .../minecraft/mcpatcher/ctm/glass_6/17.png | Bin 0 -> 236 bytes .../minecraft/mcpatcher/ctm/glass_6/18.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/19.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/2.png | Bin 0 -> 217 bytes .../minecraft/mcpatcher/ctm/glass_6/20.png | Bin 0 -> 214 bytes .../minecraft/mcpatcher/ctm/glass_6/21.png | Bin 0 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_6/22.png | Bin 0 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_6/23.png | Bin 0 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_6/24.png | Bin 0 -> 223 bytes .../minecraft/mcpatcher/ctm/glass_6/25.png | Bin 0 -> 222 bytes .../minecraft/mcpatcher/ctm/glass_6/26.png | Bin 0 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_6/27.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/28.png | Bin 0 -> 222 bytes .../minecraft/mcpatcher/ctm/glass_6/29.png | Bin 0 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_6/3.png | Bin 0 -> 239 bytes .../minecraft/mcpatcher/ctm/glass_6/30.png | Bin 0 -> 224 bytes .../minecraft/mcpatcher/ctm/glass_6/31.png | Bin 0 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_6/32.png | Bin 0 -> 214 bytes .../minecraft/mcpatcher/ctm/glass_6/33.png | Bin 0 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_6/34.png | Bin 0 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_6/35.png | Bin 0 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_6/36.png | Bin 0 -> 244 bytes .../minecraft/mcpatcher/ctm/glass_6/37.png | Bin 0 -> 240 bytes .../minecraft/mcpatcher/ctm/glass_6/38.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/39.png | Bin 0 -> 235 bytes .../minecraft/mcpatcher/ctm/glass_6/4.png | Bin 0 -> 230 bytes .../minecraft/mcpatcher/ctm/glass_6/40.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/41.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/42.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/43.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/44.png | Bin 0 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_6/45.png | Bin 0 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_6/46.png | Bin 0 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_6/5.png | Bin 0 -> 232 bytes .../minecraft/mcpatcher/ctm/glass_6/6.png | Bin 0 -> 224 bytes .../minecraft/mcpatcher/ctm/glass_6/7.png | Bin 0 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_6/8.png | Bin 0 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_6/9.png | Bin 0 -> 211 bytes .../mcpatcher/ctm/glass_6/glass_5.properties | 6 + .../minecraft/mcpatcher/ctm/glass_7/0.png | Bin 218 -> 208 bytes .../minecraft/mcpatcher/ctm/glass_7/1.png | Bin 212 -> 179 bytes .../minecraft/mcpatcher/ctm/glass_7/10.png | Bin 158 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_7/11.png | Bin 151 -> 109 bytes .../minecraft/mcpatcher/ctm/glass_7/12.png | Bin 221 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_7/13.png | Bin 191 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_7/14.png | Bin 146 -> 126 bytes .../minecraft/mcpatcher/ctm/glass_7/15.png | Bin 185 -> 161 bytes .../minecraft/mcpatcher/ctm/glass_7/16.png | Bin 218 -> 166 bytes .../minecraft/mcpatcher/ctm/glass_7/17.png | Bin 225 -> 156 bytes .../minecraft/mcpatcher/ctm/glass_7/18.png | Bin 215 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_7/19.png | Bin 228 -> 138 bytes .../minecraft/mcpatcher/ctm/glass_7/2.png | Bin 207 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_7/20.png | Bin 188 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_7/21.png | Bin 192 -> 116 bytes .../minecraft/mcpatcher/ctm/glass_7/22.png | Bin 156 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_7/23.png | Bin 161 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_7/24.png | Bin 224 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_7/25.png | Bin 168 -> 133 bytes .../minecraft/mcpatcher/ctm/glass_7/26.png | Bin 75 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_7/27.png | Bin 160 -> 131 bytes .../minecraft/mcpatcher/ctm/glass_7/28.png | Bin 192 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_7/29.png | Bin 181 -> 130 bytes .../minecraft/mcpatcher/ctm/glass_7/3.png | Bin 217 -> 183 bytes .../minecraft/mcpatcher/ctm/glass_7/30.png | Bin 193 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_7/31.png | Bin 184 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_7/32.png | Bin 118 -> 106 bytes .../minecraft/mcpatcher/ctm/glass_7/33.png | Bin 124 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_7/34.png | Bin 161 -> 111 bytes .../minecraft/mcpatcher/ctm/glass_7/35.png | Bin 156 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_7/36.png | Bin 221 -> 173 bytes .../minecraft/mcpatcher/ctm/glass_7/37.png | Bin 197 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_7/38.png | Bin 155 -> 120 bytes .../minecraft/mcpatcher/ctm/glass_7/39.png | Bin 189 -> 153 bytes .../minecraft/mcpatcher/ctm/glass_7/4.png | Bin 216 -> 160 bytes .../minecraft/mcpatcher/ctm/glass_7/40.png | Bin 187 -> 124 bytes .../minecraft/mcpatcher/ctm/glass_7/41.png | Bin 193 -> 135 bytes .../minecraft/mcpatcher/ctm/glass_7/42.png | Bin 184 -> 125 bytes .../minecraft/mcpatcher/ctm/glass_7/43.png | Bin 196 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_7/44.png | Bin 121 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_7/45.png | Bin 122 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_7/46.png | Bin 218 -> 118 bytes .../minecraft/mcpatcher/ctm/glass_7/5.png | Bin 221 -> 165 bytes .../minecraft/mcpatcher/ctm/glass_7/6.png | Bin 222 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_7/7.png | Bin 210 -> 133 bytes .../minecraft/mcpatcher/ctm/glass_7/8.png | Bin 183 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_7/9.png | Bin 186 -> 116 bytes .../minecraft/mcpatcher/ctm/glass_8/0.png | Bin 197 -> 244 bytes .../minecraft/mcpatcher/ctm/glass_8/1.png | Bin 176 -> 232 bytes .../minecraft/mcpatcher/ctm/glass_8/10.png | Bin 159 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_8/11.png | Bin 150 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_8/12.png | Bin 194 -> 237 bytes .../minecraft/mcpatcher/ctm/glass_8/13.png | Bin 172 -> 222 bytes .../minecraft/mcpatcher/ctm/glass_8/14.png | Bin 150 -> 195 bytes .../minecraft/mcpatcher/ctm/glass_8/15.png | Bin 167 -> 227 bytes .../minecraft/mcpatcher/ctm/glass_8/16.png | Bin 175 -> 221 bytes .../minecraft/mcpatcher/ctm/glass_8/17.png | Bin 181 -> 235 bytes .../minecraft/mcpatcher/ctm/glass_8/18.png | Bin 162 -> 196 bytes .../minecraft/mcpatcher/ctm/glass_8/19.png | Bin 179 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_8/2.png | Bin 161 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_8/20.png | Bin 163 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_8/21.png | Bin 155 -> 182 bytes .../minecraft/mcpatcher/ctm/glass_8/22.png | Bin 151 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_8/23.png | Bin 150 -> 185 bytes .../minecraft/mcpatcher/ctm/glass_8/24.png | Bin 198 -> 230 bytes .../minecraft/mcpatcher/ctm/glass_8/25.png | Bin 169 -> 210 bytes .../minecraft/mcpatcher/ctm/glass_8/26.png | Bin 141 -> 175 bytes .../minecraft/mcpatcher/ctm/glass_8/27.png | Bin 170 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_8/28.png | Bin 173 -> 210 bytes .../minecraft/mcpatcher/ctm/glass_8/29.png | Bin 154 -> 197 bytes .../minecraft/mcpatcher/ctm/glass_8/3.png | Bin 179 -> 246 bytes .../minecraft/mcpatcher/ctm/glass_8/30.png | Bin 171 -> 210 bytes .../minecraft/mcpatcher/ctm/glass_8/31.png | Bin 155 -> 199 bytes .../minecraft/mcpatcher/ctm/glass_8/32.png | Bin 145 -> 177 bytes .../minecraft/mcpatcher/ctm/glass_8/33.png | Bin 146 -> 179 bytes .../minecraft/mcpatcher/ctm/glass_8/34.png | Bin 149 -> 183 bytes .../minecraft/mcpatcher/ctm/glass_8/35.png | Bin 158 -> 176 bytes .../minecraft/mcpatcher/ctm/glass_8/36.png | Bin 198 -> 241 bytes .../minecraft/mcpatcher/ctm/glass_8/37.png | Bin 172 -> 220 bytes .../minecraft/mcpatcher/ctm/glass_8/38.png | Bin 152 -> 192 bytes .../minecraft/mcpatcher/ctm/glass_8/39.png | Bin 178 -> 231 bytes .../minecraft/mcpatcher/ctm/glass_8/4.png | Bin 174 -> 223 bytes .../minecraft/mcpatcher/ctm/glass_8/40.png | Bin 156 -> 198 bytes .../minecraft/mcpatcher/ctm/glass_8/41.png | Bin 176 -> 215 bytes .../minecraft/mcpatcher/ctm/glass_8/42.png | Bin 166 -> 191 bytes .../minecraft/mcpatcher/ctm/glass_8/43.png | Bin 177 -> 217 bytes .../minecraft/mcpatcher/ctm/glass_8/44.png | Bin 155 -> 175 bytes .../minecraft/mcpatcher/ctm/glass_8/45.png | Bin 145 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_8/46.png | Bin 158 -> 183 bytes .../minecraft/mcpatcher/ctm/glass_8/5.png | Bin 174 -> 229 bytes .../minecraft/mcpatcher/ctm/glass_8/6.png | Bin 174 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_8/7.png | Bin 158 -> 199 bytes .../minecraft/mcpatcher/ctm/glass_8/8.png | Bin 154 -> 185 bytes .../minecraft/mcpatcher/ctm/glass_8/9.png | Bin 154 -> 181 bytes .../mcpatcher/ctm/ineffable_glass/0.png | Bin 0 -> 214 bytes .../mcpatcher/ctm/ineffable_glass/1.png | Bin 0 -> 194 bytes .../mcpatcher/ctm/ineffable_glass/10.png | Bin 0 -> 147 bytes .../mcpatcher/ctm/ineffable_glass/11.png | Bin 0 -> 145 bytes .../mcpatcher/ctm/ineffable_glass/12.png | Bin 0 -> 195 bytes .../mcpatcher/ctm/ineffable_glass/13.png | Bin 0 -> 168 bytes .../mcpatcher/ctm/ineffable_glass/14.png | Bin 0 -> 132 bytes .../mcpatcher/ctm/ineffable_glass/15.png | Bin 0 -> 172 bytes .../mcpatcher/ctm/ineffable_glass/16.png | Bin 0 -> 197 bytes .../mcpatcher/ctm/ineffable_glass/17.png | Bin 0 -> 196 bytes .../mcpatcher/ctm/ineffable_glass/18.png | Bin 0 -> 169 bytes .../mcpatcher/ctm/ineffable_glass/19.png | Bin 0 -> 191 bytes .../mcpatcher/ctm/ineffable_glass/2.png | Bin 0 -> 153 bytes .../mcpatcher/ctm/ineffable_glass/20.png | Bin 0 -> 160 bytes .../mcpatcher/ctm/ineffable_glass/21.png | Bin 0 -> 167 bytes .../mcpatcher/ctm/ineffable_glass/22.png | Bin 0 -> 146 bytes .../mcpatcher/ctm/ineffable_glass/23.png | Bin 0 -> 150 bytes .../mcpatcher/ctm/ineffable_glass/24.png | Bin 0 -> 172 bytes .../mcpatcher/ctm/ineffable_glass/25.png | Bin 0 -> 144 bytes .../mcpatcher/ctm/ineffable_glass/26.png | Bin 0 -> 102 bytes .../mcpatcher/ctm/ineffable_glass/27.png | Bin 0 -> 140 bytes .../mcpatcher/ctm/ineffable_glass/28.png | Bin 0 -> 166 bytes .../mcpatcher/ctm/ineffable_glass/29.png | Bin 0 -> 152 bytes .../mcpatcher/ctm/ineffable_glass/3.png | Bin 0 -> 198 bytes .../mcpatcher/ctm/ineffable_glass/30.png | Bin 0 -> 168 bytes .../mcpatcher/ctm/ineffable_glass/31.png | Bin 0 -> 152 bytes .../mcpatcher/ctm/ineffable_glass/32.png | Bin 0 -> 129 bytes .../mcpatcher/ctm/ineffable_glass/33.png | Bin 0 -> 129 bytes .../mcpatcher/ctm/ineffable_glass/34.png | Bin 0 -> 146 bytes .../mcpatcher/ctm/ineffable_glass/35.png | Bin 0 -> 146 bytes .../mcpatcher/ctm/ineffable_glass/36.png | Bin 0 -> 194 bytes .../mcpatcher/ctm/ineffable_glass/37.png | Bin 0 -> 175 bytes .../mcpatcher/ctm/ineffable_glass/38.png | Bin 0 -> 130 bytes .../mcpatcher/ctm/ineffable_glass/39.png | Bin 0 -> 169 bytes .../mcpatcher/ctm/ineffable_glass/4.png | Bin 0 -> 188 bytes .../mcpatcher/ctm/ineffable_glass/40.png | Bin 0 -> 152 bytes .../mcpatcher/ctm/ineffable_glass/41.png | Bin 0 -> 169 bytes .../mcpatcher/ctm/ineffable_glass/42.png | Bin 0 -> 150 bytes .../mcpatcher/ctm/ineffable_glass/43.png | Bin 0 -> 162 bytes .../mcpatcher/ctm/ineffable_glass/44.png | Bin 0 -> 126 bytes .../mcpatcher/ctm/ineffable_glass/45.png | Bin 0 -> 127 bytes .../mcpatcher/ctm/ineffable_glass/46.png | Bin 0 -> 178 bytes .../mcpatcher/ctm/ineffable_glass/5.png | Bin 0 -> 194 bytes .../mcpatcher/ctm/ineffable_glass/6.png | Bin 0 -> 187 bytes .../mcpatcher/ctm/ineffable_glass/7.png | Bin 0 -> 167 bytes .../mcpatcher/ctm/ineffable_glass/8.png | Bin 0 -> 162 bytes .../mcpatcher/ctm/ineffable_glass/9.png | Bin 0 -> 167 bytes .../ineffable_glass.properties | 6 + .../textures/blocks/liquid_bedrockium.png | Bin 9137 -> 5754 bytes .../blocks/liquid_bedrockium_flow.png | Bin 13201 -> 7812 bytes .../textures/blocks/liquid_inverted.png | Bin 6915 -> 4490 bytes .../textures/blocks/liquid_inverted_flow.png | Bin 7156 -> 4890 bytes .../arrow/bedrockium_uie_arrow_fletching.png | Bin 185 -> 152 bytes .../items/arrow/bedrockium_uie_arrow_head.png | Bin 168 -> 140 bytes .../arrow/bedrockium_uie_arrow_shaft.png | Bin 257 -> 156 bytes .../items/arrow/inverted_arrow_fletching.png | Bin 321 -> 276 bytes .../items/arrow/inverted_arrow_head.png | Bin 284 -> 256 bytes .../items/arrow/inverted_arrow_shaft.png | Bin 374 -> 322 bytes .../items/arrow/magical_wood_arrow_head.png | Bin 166 -> 138 bytes .../items/arrow/magical_wood_arrow_shaft.png | Bin 187 -> 174 bytes .../items/axe/bedrockium_uie_axe_handle.png | Bin 180 -> 146 bytes .../items/axe/bedrockium_uie_axe_head.png | Bin 233 -> 162 bytes .../axe/bedrockium_uie_axe_head_broken.png | Bin 212 -> 152 bytes .../items/axe/inverted_axe_handle.png | Bin 353 -> 305 bytes .../textures/items/axe/inverted_axe_head.png | Bin 252 -> 216 bytes .../items/axe/inverted_axe_head_broken.png | Bin 224 -> 191 bytes .../items/axe/magical_wood_axe_handle.png | Bin 537 -> 506 bytes .../items/axe/magical_wood_axe_head.png | Bin 189 -> 142 bytes .../axe/magical_wood_axe_head_broken.png | Bin 188 -> 136 bytes .../bedrockium_uie_battleaxe_back.png | Bin 146 -> 117 bytes .../bedrockium_uie_battleaxe_backhead.png | Bin 215 -> 156 bytes .../bedrockium_uie_battleaxe_binding.png | Bin 146 -> 117 bytes .../bedrockium_uie_battleaxe_front.png | Bin 207 -> 156 bytes .../bedrockium_uie_battleaxe_fronthead.png | Bin 207 -> 156 bytes ...rockium_uie_battleaxe_fronthead_broken.png | Bin 219 -> 154 bytes .../bedrockium_uie_battleaxe_handle.png | Bin 232 -> 145 bytes .../bedrockium_uie_battleaxe_head.png | Bin 215 -> 156 bytes .../bedrockium_uie_battleaxe_head_broken.png | Bin 219 -> 154 bytes .../battleaxe/inverted_battleaxe_back.png | Bin 252 -> 224 bytes .../battleaxe/inverted_battleaxe_backhead.png | Bin 326 -> 279 bytes .../battleaxe/inverted_battleaxe_binding.png | Bin 250 -> 222 bytes .../battleaxe/inverted_battleaxe_front.png | Bin 315 -> 280 bytes .../inverted_battleaxe_fronthead.png | Bin 306 -> 277 bytes .../inverted_battleaxe_fronthead_broken.png | Bin 332 -> 293 bytes .../battleaxe/inverted_battleaxe_handle.png | Bin 346 -> 304 bytes .../battleaxe/inverted_battleaxe_head.png | Bin 332 -> 295 bytes .../inverted_battleaxe_head_broken.png | Bin 325 -> 295 bytes .../battleaxe/magical_wood_battleaxe_back.png | Bin 512 -> 495 bytes .../magical_wood_battleaxe_backhead.png | Bin 580 -> 534 bytes .../magical_wood_battleaxe_binding.png | Bin 512 -> 495 bytes .../magical_wood_battleaxe_front.png | Bin 585 -> 532 bytes .../magical_wood_battleaxe_fronthead.png | Bin 585 -> 532 bytes ...agical_wood_battleaxe_fronthead_broken.png | Bin 571 -> 529 bytes .../magical_wood_battleaxe_handle.png | Bin 563 -> 504 bytes .../battleaxe/magical_wood_battleaxe_head.png | Bin 580 -> 534 bytes .../magical_wood_battleaxe_head_broken.png | Bin 571 -> 529 bytes .../bedrockium_uie_battlesign_handle.png | Bin 161 -> 128 bytes .../bedrockium_uie_battlesign_head.png | Bin 417 -> 237 bytes .../bedrockium_uie_battlesign_head_broken.png | Bin 399 -> 239 bytes .../battlesign/inverted_battlesign_handle.png | Bin 261 -> 241 bytes .../battlesign/inverted_battlesign_head.png | Bin 449 -> 434 bytes .../inverted_battlesign_head_broken.png | Bin 444 -> 412 bytes .../magical_wood_battlesign_handle.png | Bin 136 -> 119 bytes .../magical_wood_battlesign_head.png | Bin 278 -> 170 bytes .../magical_wood_battlesign_head_broken.png | Bin 281 -> 176 bytes .../bolt/bedrockium_uie_bolt_fletching.png | Bin 166 -> 129 bytes .../items/bolt/bedrockium_uie_bolt_head.png | Bin 142 -> 114 bytes .../items/bolt/bedrockium_uie_bolt_shaft.png | Bin 206 -> 140 bytes .../items/bolt/inverted_bolt_fletching.png | Bin 298 -> 258 bytes .../items/bolt/inverted_bolt_head.png | Bin 246 -> 214 bytes .../items/bolt/inverted_bolt_shaft.png | Bin 317 -> 261 bytes .../items/bolt/magical_wood_bolt_head.png | Bin 510 -> 494 bytes .../items/bolt/magical_wood_bolt_shaft.png | Bin 554 -> 505 bytes .../bedrockium_uie_sword_accessory.png | Bin 234 -> 155 bytes .../broadsword/bedrockium_uie_sword_blade.png | Bin 263 -> 173 bytes .../bedrockium_uie_sword_blade_broken.png | Bin 264 -> 162 bytes .../bedrockium_uie_sword_handle.png | Bin 193 -> 134 bytes .../broadsword/inverted_sword_accessory.png | Bin 391 -> 318 bytes .../items/broadsword/inverted_sword_blade.png | Bin 416 -> 375 bytes .../inverted_sword_blade_broken.png | Bin 396 -> 343 bytes .../broadsword/inverted_sword_handle.png | Bin 295 -> 270 bytes .../magical_wood_sword_accessory.png | Bin 584 -> 517 bytes .../broadsword/magical_wood_sword_blade.png | Bin 560 -> 507 bytes .../magical_wood_sword_blade_broken.png | Bin 592 -> 518 bytes .../broadsword/magical_wood_sword_handle.png | Bin 549 -> 508 bytes .../chisel/bedrockium_uie_chisel_handle.png | Bin 158 -> 122 bytes .../chisel/bedrockium_uie_chisel_head.png | Bin 222 -> 151 bytes .../bedrockium_uie_chisel_head_broken.png | Bin 172 -> 122 bytes .../items/chisel/inverted_chisel_handle.png | Bin 264 -> 227 bytes .../items/chisel/inverted_chisel_head.png | Bin 369 -> 296 bytes .../chisel/inverted_chisel_head_broken.png | Bin 295 -> 242 bytes .../chisel/magical_wood_chisel_handle.png | Bin 513 -> 502 bytes .../items/chisel/magical_wood_chisel_head.png | Bin 567 -> 506 bytes .../magical_wood_chisel_head_broken.png | Bin 513 -> 486 bytes .../cleaver/bedrockium_uie_cleaver_guard.png | Bin 139 -> 119 bytes .../cleaver/bedrockium_uie_cleaver_handle.png | Bin 180 -> 130 bytes .../cleaver/bedrockium_uie_cleaver_head.png | Bin 318 -> 206 bytes .../bedrockium_uie_cleaver_head_broken.png | Bin 290 -> 197 bytes .../cleaver/bedrockium_uie_cleaver_shield.png | Bin 261 -> 158 bytes .../items/cleaver/inverted_cleaver_guard.png | Bin 266 -> 224 bytes .../items/cleaver/inverted_cleaver_handle.png | Bin 269 -> 237 bytes .../items/cleaver/inverted_cleaver_head.png | Bin 464 -> 382 bytes .../cleaver/inverted_cleaver_head_broken.png | Bin 503 -> 411 bytes .../items/cleaver/inverted_cleaver_shield.png | Bin 357 -> 294 bytes .../cleaver/magical_wood_cleaver_guard.png | Bin 515 -> 495 bytes .../cleaver/magical_wood_cleaver_handle.png | Bin 540 -> 505 bytes .../cleaver/magical_wood_cleaver_head.png | Bin 571 -> 513 bytes .../magical_wood_cleaver_head_broken.png | Bin 598 -> 522 bytes .../cleaver/magical_wood_cleaver_shield.png | Bin 562 -> 504 bytes .../bedrockium_uie_crossbow_binding.png | Bin 148 -> 131 bytes .../crossbow/bedrockium_uie_crossbow_body.png | Bin 271 -> 172 bytes .../crossbow/bedrockium_uie_crossbow_bow.png | Bin 304 -> 202 bytes .../bedrockium_uie_crossbow_bow_1.png | Bin 304 -> 189 bytes .../bedrockium_uie_crossbow_bow_2.png | Bin 313 -> 190 bytes .../bedrockium_uie_crossbow_bow_3.png | Bin 305 -> 193 bytes .../crossbow/inverted_crossbow_binding.png | Bin 327 -> 250 bytes .../items/crossbow/inverted_crossbow_body.png | Bin 407 -> 318 bytes .../items/crossbow/inverted_crossbow_bow.png | Bin 462 -> 369 bytes .../crossbow/inverted_crossbow_bow_1.png | Bin 448 -> 371 bytes .../crossbow/inverted_crossbow_bow_2.png | Bin 461 -> 373 bytes .../crossbow/inverted_crossbow_bow_3.png | Bin 516 -> 433 bytes .../magical_wood_crossbow_binding.png | Bin 509 -> 505 bytes .../crossbow/magical_wood_crossbow_body.png | Bin 622 -> 523 bytes .../crossbow/magical_wood_crossbow_bow.png | Bin 599 -> 547 bytes .../crossbow/magical_wood_crossbow_bow_1.png | Bin 599 -> 547 bytes .../crossbow/magical_wood_crossbow_bow_2.png | Bin 605 -> 542 bytes .../crossbow/magical_wood_crossbow_bow_3.png | Bin 613 -> 546 bytes .../cutlass/bedrockium_uie_cutlass_blade.png | Bin 326 -> 196 bytes .../bedrockium_uie_cutlass_blade_broken.png | Bin 303 -> 190 bytes .../cutlass/bedrockium_uie_cutlass_guard.png | Bin 118 -> 96 bytes .../cutlass/bedrockium_uie_cutlass_handle.png | Bin 146 -> 113 bytes .../items/cutlass/inverted_cutlass_blade.png | Bin 463 -> 383 bytes .../cutlass/inverted_cutlass_blade_broken.png | Bin 470 -> 387 bytes .../items/cutlass/inverted_cutlass_guard.png | Bin 233 -> 216 bytes .../items/cutlass/inverted_cutlass_handle.png | Bin 255 -> 235 bytes .../cutlass/magical_wood_cutlass_blade.png | Bin 599 -> 531 bytes .../magical_wood_cutlass_blade_broken.png | Bin 591 -> 531 bytes .../cutlass/magical_wood_cutlass_guard.png | Bin 499 -> 483 bytes .../cutlass/magical_wood_cutlass_handle.png | Bin 515 -> 489 bytes .../bedrockium_uie_dagger_accessory.png | Bin 174 -> 123 bytes .../dagger/bedrockium_uie_dagger_blade.png | Bin 245 -> 157 bytes .../bedrockium_uie_dagger_blade_broken.png | Bin 214 -> 148 bytes .../dagger/bedrockium_uie_dagger_handle.png | Bin 169 -> 128 bytes .../dagger/inverted_dagger_accessory.png | Bin 302 -> 236 bytes .../items/dagger/inverted_dagger_blade.png | Bin 370 -> 308 bytes .../dagger/inverted_dagger_blade_broken.png | Bin 364 -> 303 bytes .../items/dagger/inverted_dagger_handle.png | Bin 259 -> 225 bytes .../dagger/magical_wood_dagger_accessory.png | Bin 527 -> 491 bytes .../dagger/magical_wood_dagger_blade.png | Bin 554 -> 507 bytes .../magical_wood_dagger_blade_broken.png | Bin 556 -> 511 bytes .../dagger/magical_wood_dagger_handle.png | Bin 529 -> 501 bytes .../bedrockium_uie_excavator_binding.png | Bin 168 -> 131 bytes .../bedrockium_uie_excavator_grip.png | Bin 148 -> 118 bytes .../bedrockium_uie_excavator_handle.png | Bin 222 -> 147 bytes .../bedrockium_uie_excavator_head.png | Bin 267 -> 185 bytes .../bedrockium_uie_excavator_head_broken.png | Bin 256 -> 178 bytes .../excavator/inverted_excavator_binding.png | Bin 285 -> 241 bytes .../excavator/inverted_excavator_grip.png | Bin 243 -> 221 bytes .../excavator/inverted_excavator_handle.png | Bin 351 -> 295 bytes .../excavator/inverted_excavator_head.png | Bin 415 -> 334 bytes .../inverted_excavator_head_broken.png | Bin 397 -> 320 bytes .../magical_wood_excavator_binding.png | Bin 548 -> 504 bytes .../excavator/magical_wood_excavator_grip.png | Bin 529 -> 493 bytes .../magical_wood_excavator_handle.png | Bin 576 -> 511 bytes .../excavator/magical_wood_excavator_head.png | Bin 599 -> 536 bytes .../magical_wood_excavator_head_broken.png | Bin 603 -> 531 bytes .../frypan/bedrockium_uie_frypan_handle.png | Bin 279 -> 161 bytes .../frypan/bedrockium_uie_frypan_head.png | Bin 454 -> 267 bytes .../bedrockium_uie_frypan_head_broken.png | Bin 462 -> 273 bytes .../items/frypan/inverted_frypan_handle.png | Bin 200 -> 182 bytes .../items/frypan/inverted_frypan_head.png | Bin 519 -> 427 bytes .../frypan/inverted_frypan_head_broken.png | Bin 561 -> 472 bytes .../frypan/magical_wood_frypan_handle.png | Bin 571 -> 507 bytes .../items/frypan/magical_wood_frypan_head.png | Bin 659 -> 564 bytes .../magical_wood_frypan_head_broken.png | Bin 710 -> 590 bytes .../hammer/bedrockium_uie_hammer_back.png | Bin 180 -> 144 bytes .../hammer/bedrockium_uie_hammer_front.png | Bin 177 -> 140 bytes .../hammer/bedrockium_uie_hammer_handle.png | Bin 256 -> 160 bytes .../bedrockium_uie_hammer_handle_broken.png | Bin 220 -> 154 bytes .../hammer/bedrockium_uie_hammer_head.png | Bin 329 -> 221 bytes .../items/hammer/inverted_hammer_back.png | Bin 196 -> 168 bytes .../items/hammer/inverted_hammer_front.png | Bin 209 -> 172 bytes .../items/hammer/inverted_hammer_handle.png | Bin 363 -> 330 bytes .../hammer/inverted_hammer_handle_broken.png | Bin 364 -> 311 bytes .../items/hammer/inverted_hammer_head.png | Bin 367 -> 312 bytes .../items/hammer/magical_wood_hammer_back.png | Bin 547 -> 519 bytes .../hammer/magical_wood_hammer_front.png | Bin 555 -> 517 bytes .../hammer/magical_wood_hammer_handle.png | Bin 554 -> 501 bytes .../magical_wood_hammer_handle_broken.png | Bin 568 -> 518 bytes .../items/hammer/magical_wood_hammer_head.png | Bin 626 -> 548 bytes .../bedrockium_uie_javelin_accessory.png | Bin 174 -> 122 bytes .../javelin/bedrockium_uie_javelin_handle.png | Bin 179 -> 127 bytes .../javelin/bedrockium_uie_javelin_head.png | Bin 189 -> 145 bytes .../bedrockium_uie_javelin_head_broken.png | Bin 136 -> 107 bytes .../javelin/inverted_javelin_accessory.png | Bin 293 -> 252 bytes .../items/javelin/inverted_javelin_handle.png | Bin 318 -> 248 bytes .../items/javelin/inverted_javelin_head.png | Bin 323 -> 290 bytes .../javelin/inverted_javelin_head_broken.png | Bin 243 -> 209 bytes .../magical_wood_javelin_accessory.png | Bin 542 -> 499 bytes .../javelin/magical_wood_javelin_handle.png | Bin 544 -> 493 bytes .../javelin/magical_wood_javelin_head.png | Bin 563 -> 514 bytes .../magical_wood_javelin_head_broken.png | Bin 524 -> 493 bytes .../longbow/bedrockium_uie_bow_bottom.png | Bin 184 -> 139 bytes .../longbow/bedrockium_uie_bow_bottom_1.png | Bin 230 -> 151 bytes .../longbow/bedrockium_uie_bow_bottom_2.png | Bin 216 -> 148 bytes .../longbow/bedrockium_uie_bow_bottom_3.png | Bin 224 -> 156 bytes .../items/longbow/bedrockium_uie_bow_grip.png | Bin 158 -> 114 bytes .../items/longbow/bedrockium_uie_bow_top.png | Bin 187 -> 145 bytes .../longbow/bedrockium_uie_bow_top_1.png | Bin 197 -> 149 bytes .../longbow/bedrockium_uie_bow_top_2.png | Bin 209 -> 152 bytes .../longbow/bedrockium_uie_bow_top_3.png | Bin 185 -> 138 bytes .../items/longbow/inverted_bow_bottom.png | Bin 308 -> 270 bytes .../items/longbow/inverted_bow_bottom_1.png | Bin 354 -> 315 bytes .../items/longbow/inverted_bow_bottom_2.png | Bin 343 -> 308 bytes .../items/longbow/inverted_bow_bottom_3.png | Bin 334 -> 301 bytes .../items/longbow/inverted_bow_grip.png | Bin 277 -> 233 bytes .../items/longbow/inverted_bow_top.png | Bin 307 -> 269 bytes .../items/longbow/inverted_bow_top_1.png | Bin 327 -> 297 bytes .../items/longbow/inverted_bow_top_2.png | Bin 325 -> 291 bytes .../items/longbow/inverted_bow_top_3.png | Bin 321 -> 289 bytes .../items/longbow/magical_wood_bow_bottom.png | Bin 557 -> 512 bytes .../longbow/magical_wood_bow_bottom_1.png | Bin 557 -> 512 bytes .../longbow/magical_wood_bow_bottom_2.png | Bin 534 -> 505 bytes .../longbow/magical_wood_bow_bottom_3.png | Bin 515 -> 501 bytes .../items/longbow/magical_wood_bow_grip.png | Bin 521 -> 494 bytes .../items/longbow/magical_wood_bow_top.png | Bin 541 -> 508 bytes .../items/longbow/magical_wood_bow_top_1.png | Bin 541 -> 508 bytes .../items/longbow/magical_wood_bow_top_2.png | Bin 532 -> 507 bytes .../items/longbow/magical_wood_bow_top_3.png | Bin 517 -> 502 bytes .../bedrockium_uie_longsword_accessory.png | Bin 186 -> 134 bytes .../bedrockium_uie_longsword_blade.png | Bin 256 -> 163 bytes .../bedrockium_uie_longsword_blade_broken.png | Bin 259 -> 165 bytes .../bedrockium_uie_longsword_handle.png | Bin 193 -> 134 bytes .../inverted_longsword_accessory.png | Bin 312 -> 273 bytes .../longsword/inverted_longsword_blade.png | Bin 398 -> 341 bytes .../inverted_longsword_blade_broken.png | Bin 415 -> 349 bytes .../longsword/inverted_longsword_handle.png | Bin 301 -> 273 bytes .../magical_wood_longsword_accessory.png | Bin 543 -> 508 bytes .../magical_wood_longsword_blade.png | Bin 553 -> 507 bytes .../magical_wood_longsword_blade_broken.png | Bin 581 -> 518 bytes .../magical_wood_longsword_handle.png | Bin 545 -> 505 bytes .../bedrockium_uie_lumberaxe_binding.png | Bin 152 -> 116 bytes .../bedrockium_uie_lumberaxe_handle.png | Bin 251 -> 163 bytes .../bedrockium_uie_lumberaxe_head.png | Bin 246 -> 190 bytes .../bedrockium_uie_lumberaxe_head_broken.png | Bin 247 -> 183 bytes .../bedrockium_uie_lumberaxe_shield.png | Bin 160 -> 126 bytes .../lumberaxe/inverted_lumberaxe_binding.png | Bin 245 -> 217 bytes .../lumberaxe/inverted_lumberaxe_handle.png | Bin 382 -> 330 bytes .../lumberaxe/inverted_lumberaxe_head.png | Bin 305 -> 277 bytes .../inverted_lumberaxe_head_broken.png | Bin 299 -> 266 bytes .../lumberaxe/inverted_lumberaxe_shield.png | Bin 269 -> 242 bytes .../magical_wood_lumberaxe_binding.png | Bin 513 -> 500 bytes .../magical_wood_lumberaxe_handle.png | Bin 573 -> 505 bytes .../lumberaxe/magical_wood_lumberaxe_head.png | Bin 598 -> 531 bytes .../magical_wood_lumberaxe_head_broken.png | Bin 574 -> 536 bytes .../magical_wood_lumberaxe_shield.png | Bin 521 -> 499 bytes .../items/materials/bucket_fiery_metal.png | Bin 4522 -> 4371 bytes .../items/materials/bucket_knightmetal.png | Bin 4512 -> 4369 bytes .../mattock/bedrockium_uie_mattock_back.png | Bin 178 -> 124 bytes .../mattock/bedrockium_uie_mattock_handle.png | Bin 272 -> 163 bytes .../mattock/bedrockium_uie_mattock_head.png | Bin 234 -> 167 bytes .../bedrockium_uie_mattock_head_broken.png | Bin 217 -> 156 bytes .../items/mattock/inverted_mattock_back.png | Bin 291 -> 256 bytes .../items/mattock/inverted_mattock_handle.png | Bin 387 -> 330 bytes .../items/mattock/inverted_mattock_head.png | Bin 372 -> 313 bytes .../mattock/inverted_mattock_head_broken.png | Bin 361 -> 309 bytes .../mattock/magical_wood_mattock_back.png | Bin 540 -> 506 bytes .../mattock/magical_wood_mattock_handle.png | Bin 571 -> 506 bytes .../mattock/magical_wood_mattock_head.png | Bin 574 -> 523 bytes .../magical_wood_mattock_head_broken.png | Bin 561 -> 514 bytes .../parts/bedrockium_uie_arrow_shaft.png | Bin 252 -> 143 bytes .../items/parts/bedrockium_uie_arrowhead.png | Bin 251 -> 164 bytes .../items/parts/bedrockium_uie_axe_head.png | Bin 232 -> 162 bytes .../parts/bedrockium_uie_battlesign_head.png | Bin 377 -> 238 bytes .../items/parts/bedrockium_uie_binding.png | Bin 252 -> 170 bytes .../items/parts/bedrockium_uie_bolt.png | Bin 206 -> 140 bytes .../items/parts/bedrockium_uie_bolt_2.png | Bin 142 -> 114 bytes .../items/parts/bedrockium_uie_bow_limb.png | Bin 219 -> 154 bytes .../parts/bedrockium_uie_chisel_head.png | Bin 225 -> 143 bytes .../items/parts/bedrockium_uie_chunk.png | Bin 415 -> 248 bytes .../items/parts/bedrockium_uie_crossbar.png | Bin 176 -> 138 bytes .../parts/bedrockium_uie_crossbow_body.png | Bin 267 -> 164 bytes .../parts/bedrockium_uie_crossbow_limb.png | Bin 297 -> 190 bytes .../parts/bedrockium_uie_excavator_head.png | Bin 262 -> 179 bytes .../parts/bedrockium_uie_frypan_head.png | Bin 482 -> 267 bytes .../items/parts/bedrockium_uie_full_guard.png | Bin 301 -> 185 bytes .../parts/bedrockium_uie_hammer_head.png | Bin 341 -> 223 bytes .../parts/bedrockium_uie_knife_blade.png | Bin 225 -> 139 bytes .../parts/bedrockium_uie_large_guard.png | Bin 221 -> 146 bytes .../bedrockium_uie_large_sword_blade.png | Bin 327 -> 204 bytes .../items/parts/bedrockium_uie_largeplate.png | Bin 544 -> 323 bytes .../parts/bedrockium_uie_lumberaxe_head.png | Bin 268 -> 183 bytes .../parts/bedrockium_uie_medium_guard.png | Bin 185 -> 136 bytes .../parts/bedrockium_uie_pickaxe_head.png | Bin 258 -> 170 bytes .../items/parts/bedrockium_uie_rod.png | Bin 270 -> 151 bytes .../parts/bedrockium_uie_scythe_head.png | Bin 240 -> 174 bytes .../parts/bedrockium_uie_shovel_head.png | Bin 219 -> 161 bytes .../items/parts/bedrockium_uie_shuriken.png | Bin 202 -> 157 bytes .../parts/bedrockium_uie_sword_blade.png | Bin 274 -> 169 bytes .../items/parts/bedrockium_uie_toughbind.png | Bin 382 -> 233 bytes .../items/parts/bedrockium_uie_toughrod.png | Bin 308 -> 178 bytes .../items/parts/inverted_arrow_shaft.png | Bin 412 -> 299 bytes .../items/parts/inverted_arrowhead.png | Bin 397 -> 330 bytes .../items/parts/inverted_axe_head.png | Bin 361 -> 297 bytes .../items/parts/inverted_battlesign_head.png | Bin 546 -> 513 bytes .../textures/items/parts/inverted_binding.png | Bin 402 -> 329 bytes .../textures/items/parts/inverted_bolt.png | Bin 327 -> 269 bytes .../textures/items/parts/inverted_bolt_2.png | Bin 246 -> 213 bytes .../items/parts/inverted_bow_limb.png | Bin 340 -> 292 bytes .../items/parts/inverted_chisel_head.png | Bin 345 -> 266 bytes .../textures/items/parts/inverted_chunk.png | Bin 454 -> 388 bytes .../items/parts/inverted_crossbar.png | Bin 296 -> 248 bytes .../items/parts/inverted_crossbow_body.png | Bin 417 -> 315 bytes .../items/parts/inverted_crossbow_limb.png | Bin 434 -> 383 bytes .../items/parts/inverted_excavator_head.png | Bin 413 -> 346 bytes .../items/parts/inverted_frypan_head.png | Bin 623 -> 507 bytes .../items/parts/inverted_full_guard.png | Bin 430 -> 362 bytes .../items/parts/inverted_hammer_head.png | Bin 475 -> 391 bytes .../items/parts/inverted_knife_blade.png | Bin 341 -> 285 bytes .../items/parts/inverted_large_guard.png | Bin 334 -> 265 bytes .../parts/inverted_large_sword_blade.png | Bin 478 -> 412 bytes .../items/parts/inverted_largeplate.png | Bin 624 -> 588 bytes .../items/parts/inverted_lumberaxe_head.png | Bin 402 -> 357 bytes .../items/parts/inverted_medium_guard.png | Bin 297 -> 245 bytes .../items/parts/inverted_pickaxe_head.png | Bin 393 -> 326 bytes .../textures/items/parts/inverted_rod.png | Bin 402 -> 309 bytes .../items/parts/inverted_scythe_head.png | Bin 375 -> 314 bytes .../items/parts/inverted_shovel_head.png | Bin 349 -> 283 bytes .../items/parts/inverted_shuriken.png | Bin 345 -> 288 bytes .../items/parts/inverted_sword_blade.png | Bin 403 -> 334 bytes .../items/parts/inverted_toughbind.png | Bin 583 -> 459 bytes .../items/parts/inverted_toughrod.png | Bin 449 -> 361 bytes .../items/parts/magical_wood_arrow_shaft.png | Bin 579 -> 505 bytes .../items/parts/magical_wood_arrowhead.png | Bin 604 -> 533 bytes .../items/parts/magical_wood_axe_head.png | Bin 570 -> 524 bytes .../parts/magical_wood_battlesign_head.png | Bin 658 -> 552 bytes .../items/parts/magical_wood_binding.png | Bin 585 -> 529 bytes .../items/parts/magical_wood_bolt.png | Bin 554 -> 505 bytes .../items/parts/magical_wood_bolt_2.png | Bin 510 -> 494 bytes .../items/parts/magical_wood_bow_limb.png | Bin 548 -> 513 bytes .../items/parts/magical_wood_chisel_head.png | Bin 557 -> 505 bytes .../items/parts/magical_wood_chunk.png | Bin 619 -> 542 bytes .../items/parts/magical_wood_crossbar.png | Bin 556 -> 511 bytes .../parts/magical_wood_crossbow_body.png | Bin 619 -> 524 bytes .../parts/magical_wood_crossbow_limb.png | Bin 590 -> 527 bytes .../parts/magical_wood_excavator_head.png | Bin 583 -> 532 bytes .../items/parts/magical_wood_frypan_head.png | Bin 661 -> 562 bytes .../items/parts/magical_wood_full_guard.png | Bin 561 -> 512 bytes .../items/parts/magical_wood_hammer_head.png | Bin 633 -> 545 bytes .../items/parts/magical_wood_knife_blade.png | Bin 543 -> 503 bytes .../items/parts/magical_wood_large_guard.png | Bin 566 -> 508 bytes .../parts/magical_wood_large_sword_blade.png | Bin 578 -> 513 bytes .../items/parts/magical_wood_largeplate.png | Bin 699 -> 564 bytes .../parts/magical_wood_lumberaxe_head.png | Bin 596 -> 529 bytes .../items/parts/magical_wood_medium_guard.png | Bin 544 -> 508 bytes .../items/parts/magical_wood_pickaxe_head.png | Bin 586 -> 529 bytes .../textures/items/parts/magical_wood_rod.png | Bin 571 -> 510 bytes .../items/parts/magical_wood_scythe_head.png | Bin 576 -> 520 bytes .../items/parts/magical_wood_shovel_head.png | Bin 582 -> 522 bytes .../items/parts/magical_wood_shuriken.png | Bin 558 -> 511 bytes .../items/parts/magical_wood_sword_blade.png | Bin 564 -> 510 bytes .../items/parts/magical_wood_toughbind.png | Bin 632 -> 539 bytes .../items/parts/magical_wood_toughrod.png | Bin 586 -> 506 bytes .../bedrockium_uie_pickaxe_accessory.png | Bin 130 -> 106 bytes .../pickaxe/bedrockium_uie_pickaxe_handle.png | Bin 235 -> 149 bytes .../pickaxe/bedrockium_uie_pickaxe_head.png | Bin 270 -> 171 bytes .../bedrockium_uie_pickaxe_head_broken.png | Bin 232 -> 157 bytes .../pickaxe/inverted_pickaxe_accessory.png | Bin 233 -> 214 bytes .../items/pickaxe/inverted_pickaxe_handle.png | Bin 355 -> 277 bytes .../items/pickaxe/inverted_pickaxe_head.png | Bin 303 -> 245 bytes .../pickaxe/inverted_pickaxe_head_broken.png | Bin 275 -> 213 bytes .../magical_wood_pickaxe_accessory.png | Bin 516 -> 496 bytes .../pickaxe/magical_wood_pickaxe_handle.png | Bin 554 -> 504 bytes .../pickaxe/magical_wood_pickaxe_head.png | Bin 585 -> 525 bytes .../magical_wood_pickaxe_head_broken.png | Bin 564 -> 510 bytes .../bedrockium_uie_rapier_accessory.png | Bin 191 -> 134 bytes .../rapier/bedrockium_uie_rapier_blade.png | Bin 222 -> 145 bytes .../bedrockium_uie_rapier_blade_broken.png | Bin 170 -> 123 bytes .../rapier/bedrockium_uie_rapier_handle.png | Bin 200 -> 127 bytes .../rapier/inverted_rapier_accessory.png | Bin 291 -> 256 bytes .../items/rapier/inverted_rapier_blade.png | Bin 397 -> 317 bytes .../rapier/inverted_rapier_blade_broken.png | Bin 305 -> 255 bytes .../items/rapier/inverted_rapier_handle.png | Bin 314 -> 271 bytes .../rapier/magical_wood_rapier_accessory.png | Bin 550 -> 508 bytes .../rapier/magical_wood_rapier_blade.png | Bin 572 -> 500 bytes .../magical_wood_rapier_blade_broken.png | Bin 549 -> 490 bytes .../rapier/magical_wood_rapier_handle.png | Bin 569 -> 501 bytes .../bedrockium_uie_scythe_accessory.png | Bin 207 -> 143 bytes .../scythe/bedrockium_uie_scythe_binding.png | Bin 121 -> 114 bytes .../scythe/bedrockium_uie_scythe_handle.png | Bin 330 -> 210 bytes .../scythe/bedrockium_uie_scythe_head.png | Bin 228 -> 172 bytes .../bedrockium_uie_scythe_head_broken.png | Bin 189 -> 144 bytes .../scythe/inverted_scythe_accessory.png | Bin 357 -> 288 bytes .../items/scythe/inverted_scythe_binding.png | Bin 233 -> 213 bytes .../items/scythe/inverted_scythe_handle.png | Bin 496 -> 406 bytes .../items/scythe/inverted_scythe_head.png | Bin 269 -> 233 bytes .../scythe/inverted_scythe_head_broken.png | Bin 310 -> 261 bytes .../items/scythe/invertedscythe_accessory.png | Bin 6027 -> 6014 bytes .../scythe/magical_wood_scythe_accessory.png | Bin 540 -> 509 bytes .../scythe/magical_wood_scythe_binding.png | Bin 524 -> 497 bytes .../scythe/magical_wood_scythe_handle.png | Bin 628 -> 550 bytes .../items/scythe/magical_wood_scythe_head.png | Bin 581 -> 522 bytes .../magical_wood_scythe_head_broken.png | Bin 558 -> 508 bytes .../shortbow/bedrockium_uie_bow_bottom.png | Bin 230 -> 151 bytes .../shortbow/bedrockium_uie_bow_bottom_1.png | Bin 230 -> 151 bytes .../shortbow/bedrockium_uie_bow_bottom_2.png | Bin 216 -> 148 bytes .../shortbow/bedrockium_uie_bow_bottom_3.png | Bin 224 -> 156 bytes .../items/shortbow/bedrockium_uie_bow_top.png | Bin 197 -> 149 bytes .../shortbow/bedrockium_uie_bow_top_1.png | Bin 197 -> 149 bytes .../shortbow/bedrockium_uie_bow_top_2.png | Bin 209 -> 152 bytes .../shortbow/bedrockium_uie_bow_top_3.png | Bin 185 -> 138 bytes .../items/shortbow/inverted_bow_bottom.png | Bin 344 -> 311 bytes .../items/shortbow/inverted_bow_bottom_1.png | Bin 344 -> 308 bytes .../items/shortbow/inverted_bow_bottom_2.png | Bin 323 -> 288 bytes .../items/shortbow/inverted_bow_bottom_3.png | Bin 321 -> 284 bytes .../items/shortbow/inverted_bow_top.png | Bin 337 -> 302 bytes .../items/shortbow/inverted_bow_top_1.png | Bin 325 -> 284 bytes .../items/shortbow/inverted_bow_top_2.png | Bin 327 -> 295 bytes .../items/shortbow/inverted_bow_top_3.png | Bin 313 -> 282 bytes .../shortbow/magical_wood_bow_bottom.png | Bin 552 -> 516 bytes .../shortbow/magical_wood_bow_bottom_1.png | Bin 552 -> 516 bytes .../shortbow/magical_wood_bow_bottom_2.png | Bin 555 -> 516 bytes .../shortbow/magical_wood_bow_bottom_3.png | Bin 539 -> 514 bytes .../items/shortbow/magical_wood_bow_top.png | Bin 557 -> 514 bytes .../items/shortbow/magical_wood_bow_top_1.png | Bin 556 -> 513 bytes .../items/shortbow/magical_wood_bow_top_2.png | Bin 557 -> 517 bytes .../items/shortbow/magical_wood_bow_top_3.png | Bin 545 -> 508 bytes .../shovel/bedrockium_uie_shovel_handle.png | Bin 201 -> 146 bytes .../shovel/bedrockium_uie_shovel_head.png | Bin 235 -> 158 bytes .../bedrockium_uie_shovel_head_broken.png | Bin 220 -> 160 bytes .../items/shovel/inverted_shovel_handle.png | Bin 324 -> 287 bytes .../items/shovel/inverted_shovel_head.png | Bin 249 -> 203 bytes .../shovel/inverted_shovel_head_broken.png | Bin 254 -> 212 bytes .../shovel/magical_wood_shovel_handle.png | Bin 555 -> 508 bytes .../items/shovel/magical_wood_shovel_head.png | Bin 585 -> 521 bytes .../magical_wood_shovel_head_broken.png | Bin 555 -> 513 bytes .../shuriken/bedrockium_uie_shuriken.png | Bin 219 -> 159 bytes .../items/shuriken/inverted_shuriken.png | Bin 364 -> 290 bytes .../items/shuriken/magical_wood_shuriken.png | Bin 550 -> 509 bytes .../bedrockium_uie_knife_blade.png | Bin 259 -> 175 bytes .../bedrockium_uie_knife_handle.png | Bin 173 -> 122 bytes .../throwingknife/inverted_knife_blade.png | Bin 400 -> 339 bytes .../throwingknife/inverted_knife_handle.png | Bin 281 -> 243 bytes .../magical_wood_knife_blade.png | Bin 596 -> 522 bytes .../magical_wood_knife_handle.png | Bin 534 -> 500 bytes .../blockstates/chandelier.json | 8 + .../utilitiesinexcess/blockstates/drum.json | 5 + .../blockstates/giga_torch.json | 5 + .../assets/utilitiesinexcess/lang/en_US.lang | 54 +- .../models/blocks/chandelier.json | 30 + .../models/blocks/chandelier_copper.json | 7 + .../models/blocks/chandelier_redstone.json | 7 + .../models/blocks/chandelier_soul.json | 7 + .../utilitiesinexcess/models/blocks/drum.json | 186 +++++++ .../models/blocks/giga_torch.json | 86 +++ .../advanced_block_update_detector_active.png | Bin 0 -> 358 bytes ...dvanced_block_update_detector_inactive.png | Bin 0 -> 370 bytes .../textures/blocks/bedrockium_block.png | Bin 429 -> 269 bytes .../textures/blocks/blackout_curtains.png | Bin 377 -> 359 bytes .../textures/blocks/blessed_earth_side.png | Bin 676 -> 440 bytes .../textures/blocks/blessed_earth_top.png | Bin 793 -> 546 bytes .../textures/blocks/block_update_detector.png | Bin 417 -> 0 bytes .../blocks/block_update_detector_active.png | Bin 0 -> 358 bytes .../blocks/block_update_detector_inactive.png | Bin 0 -> 366 bytes .../blocks/compressed_cobblestone_0.png | Bin 846 -> 608 bytes .../blocks/compressed_cobblestone_1.png | Bin 831 -> 584 bytes .../blocks/compressed_cobblestone_2.png | Bin 785 -> 584 bytes .../blocks/compressed_cobblestone_3.png | Bin 755 -> 553 bytes .../blocks/compressed_cobblestone_4.png | Bin 705 -> 533 bytes .../blocks/compressed_cobblestone_5.png | Bin 674 -> 506 bytes .../blocks/compressed_cobblestone_6.png | Bin 542 -> 456 bytes .../blocks/compressed_cobblestone_7.png | Bin 406 -> 358 bytes .../textures/blocks/compressed_dirt_0.png | Bin 621 -> 323 bytes .../textures/blocks/compressed_dirt_1.png | Bin 613 -> 322 bytes .../textures/blocks/compressed_dirt_2.png | Bin 605 -> 349 bytes .../textures/blocks/compressed_dirt_3.png | Bin 569 -> 345 bytes .../textures/blocks/compressed_dirt_4.png | Bin 601 -> 366 bytes .../textures/blocks/compressed_dirt_5.png | Bin 580 -> 364 bytes .../textures/blocks/compressed_dirt_6.png | Bin 574 -> 378 bytes .../textures/blocks/compressed_dirt_7.png | Bin 538 -> 369 bytes .../textures/blocks/compressed_gravel_0.png | Bin 741 -> 526 bytes .../textures/blocks/compressed_gravel_1.png | Bin 724 -> 518 bytes .../textures/blocks/compressed_gravel_2.png | Bin 703 -> 546 bytes .../textures/blocks/compressed_gravel_3.png | Bin 662 -> 527 bytes .../textures/blocks/compressed_gravel_4.png | Bin 641 -> 525 bytes .../textures/blocks/compressed_gravel_5.png | Bin 627 -> 513 bytes .../textures/blocks/compressed_gravel_6.png | Bin 593 -> 496 bytes .../textures/blocks/compressed_gravel_7.png | Bin 562 -> 483 bytes .../textures/blocks/compressed_sand_0.png | Bin 834 -> 779 bytes .../textures/blocks/compressed_sand_1.png | Bin 821 -> 764 bytes .../textures/blocks/compressed_sand_2.png | Bin 769 -> 759 bytes .../textures/blocks/compressed_sand_3.png | Bin 731 -> 721 bytes .../textures/blocks/compressed_sand_4.png | Bin 693 -> 687 bytes .../textures/blocks/compressed_sand_5.png | Bin 665 -> 658 bytes .../textures/blocks/compressed_sand_6.png | Bin 614 -> 609 bytes .../textures/blocks/compressed_sand_7.png | Bin 553 -> 548 bytes .../textures/blocks/conveyor_belt_blank.png | Bin 237 -> 0 bytes .../blocks/conveyor_belt_blank_left.png | Bin 0 -> 174 bytes .../blocks/conveyor_belt_blank_right.png | Bin 0 -> 178 bytes .../textures/blocks/conveyor_belt_down.png | Bin 265 -> 162 bytes .../textures/blocks/conveyor_belt_left.png | Bin 279 -> 174 bytes .../textures/blocks/conveyor_belt_right.png | Bin 278 -> 176 bytes .../textures/blocks/conveyor_belt_up.png | Bin 266 -> 165 bytes .../blocks/crops/ender_lotus_stage_0.png | Bin 205 -> 154 bytes .../blocks/crops/ender_lotus_stage_1.png | Bin 218 -> 165 bytes .../blocks/crops/ender_lotus_stage_2.png | Bin 257 -> 176 bytes .../blocks/crops/ender_lotus_stage_3.png | Bin 292 -> 201 bytes .../blocks/crops/ender_lotus_stage_4.png | Bin 340 -> 224 bytes .../blocks/crops/ender_lotus_stage_5.png | Bin 364 -> 237 bytes .../blocks/crops/ender_lotus_stage_6.png | Bin 385 -> 253 bytes .../blocks/crops/ender_lotus_stage_7.png | Bin 399 -> 266 bytes .../textures/blocks/cursed_earth_side.png | Bin 679 -> 481 bytes .../textures/blocks/cursed_earth_top.png | Bin 1068 -> 1000 bytes .../textures/blocks/decorative_block_0.png | Bin 489 -> 329 bytes .../textures/blocks/decorative_block_1.png | Bin 761 -> 388 bytes .../textures/blocks/decorative_block_10.png | Bin 593 -> 526 bytes .../textures/blocks/decorative_block_11.png | Bin 498 -> 571 bytes .../textures/blocks/decorative_block_2.png | Bin 445 -> 328 bytes .../textures/blocks/decorative_block_3.png | Bin 973 -> 521 bytes .../textures/blocks/decorative_block_4.png | Bin 823 -> 795 bytes .../textures/blocks/decorative_block_5.png | Bin 782 -> 314 bytes .../textures/blocks/decorative_block_6.png | Bin 765 -> 509 bytes .../textures/blocks/decorative_block_7.png | Bin 829 -> 489 bytes .../textures/blocks/decorative_block_8.png | Bin 818 -> 440 bytes .../textures/blocks/decorative_block_9.png | Bin 855 -> 522 bytes .../textures/blocks/drum.png | Bin 375 -> 373 bytes .../textures/blocks/ethereal_glass.png | Bin 118 -> 224 bytes .../textures/blocks/ethereal_glass_dark.png | Bin 202 -> 241 bytes .../blocks/ethereal_glass_dark_inverted.png | Bin 180 -> 134 bytes .../blocks/ethereal_glass_inverted.png | Bin 142 -> 118 bytes .../textures/blocks/floating_block.png | Bin 257 -> 736 bytes .../blocks/generators/ender_generator.png | Bin 179 -> 128 bytes .../generators/ender_generator_plus.png | Bin 245 -> 128 bytes .../generators/ender_generator_plusplus.png | Bin 242 -> 127 bytes .../blocks/generators/food_generator.png | Bin 218 -> 165 bytes .../blocks/generators/food_generator_plus.png | Bin 283 -> 168 bytes .../generators/food_generator_plusplus.png | Bin 281 -> 167 bytes .../blocks/generators/furnace_generator.png | Bin 348 -> 249 bytes .../generators/furnace_generator_plus.png | Bin 264 -> 154 bytes .../generators/furnace_generator_plusplus.png | Bin 264 -> 153 bytes .../high_temperature_furnace_generator.png | Bin 208 -> 157 bytes ...igh_temperature_furnace_generator_plus.png | Bin 264 -> 154 bytes ...temperature_furnace_generator_plusplus.png | Bin 261 -> 153 bytes .../blocks/generators/lava_generator.png | Bin 155 -> 125 bytes .../blocks/generators/lava_generator_plus.png | Bin 269 -> 126 bytes .../generators/lava_generator_plusplus.png | Bin 269 -> 125 bytes .../low_temperature_furnace_generator.png | Bin 193 -> 141 bytes ...low_temperature_furnace_generator_plus.png | Bin 249 -> 139 bytes ...temperature_furnace_generator_plusplus.png | Bin 249 -> 138 bytes .../generators/nether_star_generator.png | Bin 242 -> 173 bytes .../generators/nether_star_generator_plus.png | Bin 307 -> 171 bytes .../nether_star_generator_plusplus.png | Bin 309 -> 170 bytes .../blocks/generators/pink_generator.png | Bin 209 -> 161 bytes .../blocks/generators/pink_generator_plus.png | Bin 288 -> 165 bytes .../generators/pink_generator_plusplus.png | Bin 287 -> 164 bytes .../blocks/generators/potion_generator.png | Bin 346 -> 253 bytes .../generators/potion_generator_plus.png | Bin 275 -> 147 bytes .../generators/potion_generator_plusplus.png | Bin 275 -> 146 bytes .../blocks/generators/redstone_generator.png | Bin 197 -> 161 bytes .../generators/redstone_generator_plus.png | Bin 273 -> 163 bytes .../redstone_generator_plusplus.png | Bin 268 -> 162 bytes .../blocks/generators/solar_generator.png | Bin 352 -> 254 bytes .../generators/solar_generator_plus.png | Bin 254 -> 142 bytes .../generators/solar_generator_plusplus.png | Bin 254 -> 141 bytes .../blocks/generators/tnt_generator.png | Bin 154 -> 124 bytes .../blocks/generators/tnt_generator_plus.png | Bin 239 -> 113 bytes .../generators/tnt_generator_plusplus.png | Bin 239 -> 112 bytes .../textures/blocks/glass_0.png | Bin 123 -> 153 bytes .../textures/blocks/glass_1.png | Bin 175 -> 215 bytes .../textures/blocks/glass_10.png | Bin 162 -> 191 bytes .../textures/blocks/glass_11.png | Bin 132 -> 213 bytes .../textures/blocks/glass_12.png | Bin 0 -> 203 bytes .../textures/blocks/glass_2.png | Bin 148 -> 179 bytes .../textures/blocks/glass_3.png | Bin 230 -> 212 bytes .../textures/blocks/glass_4.png | Bin 122 -> 203 bytes .../textures/blocks/glass_5.png | Bin 231 -> 226 bytes .../textures/blocks/glass_6.png | Bin 137 -> 263 bytes .../textures/blocks/glass_7.png | Bin 231 -> 214 bytes .../textures/blocks/glass_8.png | Bin 209 -> 274 bytes .../textures/blocks/glass_9.png | Bin 148 -> 158 bytes .../textures/blocks/ineffable_glass.png | Bin 0 -> 214 bytes .../blocks/ineffable_glass_inverted.png | Bin 0 -> 224 bytes .../textures/blocks/inverted_block.png | Bin 436 -> 674 bytes .../textures/blocks/inverted_block.png.mcmeta | 11 + .../textures/blocks/lapis_aetherius_0.png | Bin 99 -> 92 bytes .../textures/blocks/lapis_aetherius_1.png | Bin 99 -> 95 bytes .../textures/blocks/lapis_aetherius_10.png | Bin 99 -> 96 bytes .../textures/blocks/lapis_aetherius_11.png | Bin 99 -> 94 bytes .../textures/blocks/lapis_aetherius_12.png | Bin 99 -> 95 bytes .../textures/blocks/lapis_aetherius_13.png | Bin 99 -> 94 bytes .../textures/blocks/lapis_aetherius_14.png | Bin 99 -> 95 bytes .../textures/blocks/lapis_aetherius_15.png | Bin 99 -> 94 bytes .../textures/blocks/lapis_aetherius_2.png | Bin 99 -> 96 bytes .../textures/blocks/lapis_aetherius_3.png | Bin 99 -> 94 bytes .../textures/blocks/lapis_aetherius_4.png | Bin 99 -> 96 bytes .../textures/blocks/lapis_aetherius_5.png | Bin 99 -> 92 bytes .../textures/blocks/lapis_aetherius_6.png | Bin 99 -> 96 bytes .../textures/blocks/lapis_aetherius_7.png | Bin 99 -> 95 bytes .../textures/blocks/lapis_aetherius_8.png | Bin 99 -> 96 bytes .../textures/blocks/lapis_aetherius_9.png | Bin 99 -> 95 bytes .../textures/blocks/magic_wood.png | Bin 617 -> 453 bytes .../blocks/models/bedrockium_drum.png | Bin 0 -> 810 bytes .../textures/blocks/models/chandelier.png | Bin 0 -> 2086 bytes .../blocks/models/chandelier_copper.png | Bin 0 -> 2084 bytes .../blocks/models/chandelier_redstone.png | Bin 0 -> 2079 bytes .../blocks/models/chandelier_soul.png | Bin 0 -> 2079 bytes .../textures/blocks/models/diamond_spike.png | Bin 243 -> 186 bytes .../textures/blocks/models/drum.png | Bin 0 -> 672 bytes .../textures/blocks/models/giga_torch.png | Bin 0 -> 193 bytes .../textures/blocks/models/gold_spike.png | Bin 242 -> 185 bytes .../textures/blocks/models/iron_spike.png | Bin 243 -> 185 bytes .../blocks/models/trash_can_energy.png | Bin 1331 -> 797 bytes .../blocks/models/trash_can_fluid.png | Bin 1286 -> 796 bytes .../textures/blocks/models/trash_can_item.png | Bin 1228 -> 794 bytes .../textures/blocks/models/wood_spike.png | Bin 759 -> 497 bytes .../textures/blocks/pacifists_bench.png | Bin 211 -> 172 bytes .../textures/blocks/pure_love.png | Bin 4889 -> 4882 bytes .../textures/blocks/rain_muffler.png | Bin 4947 -> 4769 bytes .../textures/blocks/redstone_clock.png | Bin 525 -> 0 bytes .../textures/blocks/redstone_clock_active.png | Bin 0 -> 410 bytes .../blocks/redstone_clock_inactive.png | Bin 0 -> 419 bytes .../textures/blocks/scaled_chest_side.png | Bin 924 -> 920 bytes .../textures/blocks/scaled_chest_top.png | Bin 975 -> 955 bytes .../textures/blocks/smart_pump.png | Bin 214 -> 504 bytes .../textures/blocks/smart_pump_top.png | Bin 0 -> 427 bytes .../textures/blocks/sound_muffler.png | Bin 4774 -> 4664 bytes .../textures/blocks/temporal_gate.png | Bin 238 -> 0 bytes .../textures/blocks/temporal_gate_bottom.png | Bin 0 -> 335 bytes .../textures/blocks/temporal_gate_east.png | Bin 0 -> 337 bytes .../textures/blocks/temporal_gate_north.png | Bin 0 -> 335 bytes .../textures/blocks/temporal_gate_south.png | Bin 0 -> 338 bytes .../textures/blocks/temporal_gate_top.png | Bin 0 -> 335 bytes .../textures/blocks/temporal_gate_west.png | Bin 0 -> 338 bytes .../textures/blocks/trading_post_bottom.png | Bin 627 -> 393 bytes .../textures/blocks/trading_post_side.png | Bin 724 -> 474 bytes .../textures/blocks/trading_post_top.png | Bin 702 -> 609 bytes .../textures/blocks/trash_can_energy.png | Bin 330 -> 195 bytes .../textures/blocks/trash_can_fluid.png | Bin 398 -> 388 bytes .../textures/blocks/trash_can_item.png | Bin 398 -> 388 bytes .../textures/gui/progress_energy.png | Bin 187 -> 166 bytes .../textures/gui/trade_highlight.png | Bin 120 -> 106 bytes .../textures/gui/vanilla_search.png | Bin 139 -> 118 bytes .../items/anti_particulate_shovel.png | Bin 159 -> 332 bytes .../textures/items/architects_wand.png | Bin 272 -> 378 bytes .../textures/items/bedrockium_ingot.png | Bin 370 -> 239 bytes .../textures/items/block_analyzer.png | Bin 163 -> 161 bytes .../textures/items/destruction_pickaxe.png | Bin 196 -> 370 bytes .../textures/items/ender_lotus_seed.png | Bin 241 -> 169 bytes .../textures/items/etheric_sword.png | Bin 201 -> 394 bytes .../textures/items/fire_battery.png | Bin 326 -> 238 bytes .../textures/items/fire_battery_bg.png | Bin 163 -> 131 bytes .../textures/items/fire_battery_overlay_0.png | Bin 226 -> 173 bytes .../textures/items/fire_battery_overlay_1.png | Bin 241 -> 187 bytes .../textures/items/fire_battery_overlay_2.png | Bin 251 -> 197 bytes .../textures/items/fire_battery_overlay_3.png | Bin 265 -> 201 bytes .../textures/items/fire_battery_overlay_4.png | Bin 256 -> 208 bytes .../textures/items/fire_battery_overlay_5.png | Bin 268 -> 219 bytes .../textures/items/glove.png | Bin 222 -> 210 bytes .../textures/items/glove_bottom.png | Bin 120 -> 128 bytes .../textures/items/glove_model.png | Bin 257 -> 201 bytes .../textures/items/glove_top.png | Bin 198 -> 190 bytes .../textures/items/gluttons_axe.png | Bin 281 -> 0 bytes .../textures/items/golden_bag.png | Bin 454 -> 182 bytes .../textures/items/gourmands_axe.png | Bin 0 -> 353 bytes .../textures/items/heavenly_ring.0.png | Bin 229 -> 277 bytes .../textures/items/heavenly_ring.1.png | Bin 0 -> 404 bytes .../textures/items/heavenly_ring.2.png | Bin 0 -> 473 bytes .../textures/items/heavenly_ring.3.png | Bin 0 -> 430 bytes .../textures/items/heavenly_ring.4.png | Bin 0 -> 201 bytes .../textures/items/heavenly_ring.wing.0.png | Bin 0 -> 244 bytes .../textures/items/heavenly_ring.wing.1.png | Bin 295 -> 585 bytes .../textures/items/heavenly_ring.wing.2.png | Bin 0 -> 314 bytes .../textures/items/inversion_sigil_active.png | Bin 810 -> 484 bytes .../items/inversion_sigil_inactive.png | Bin 350 -> 236 bytes .../textures/items/inverted_ingot.png | Bin 364 -> 442 bytes .../textures/items/inverted_ingot_stable.png | Bin 395 -> 566 bytes .../textures/items/inverted_nugget.png | Bin 197 -> 182 bytes .../textures/items/mob_jar.png | Bin 156 -> 137 bytes .../textures/items/mob_jar_full.png | Bin 349 -> 233 bytes .../textures/items/precision_shears.png | Bin 200 -> 379 bytes .../items/precision_shears_cooldown.png | Bin 176 -> 414 bytes .../textures/items/pseudo_inversion_sigil.png | Bin 1024 -> 1019 bytes .../textures/items/reversing_hoe.png | Bin 157 -> 358 bytes .../textures/items/super_architects_wand.png | Bin 266 -> 377 bytes .../textures/items/watering_can_advanced.png | Bin 346 -> 255 bytes .../textures/items/watering_can_basic.png | Bin 1832 -> 1716 bytes .../textures/items/watering_can_elite.png | Bin 351 -> 254 bytes .../textures/items/xray_glasses.png | Bin 201 -> 188 bytes .../textures/items/xray_glasses_model.png | Bin 322 -> 225 bytes 1386 files changed, 4117 insertions(+), 454 deletions(-) create mode 100644 .github/workflows/optimize-images.yml create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockAdvancedUpdateDetector.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockChandelier.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockGigaTorch.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/MobDenySpawnEvents.java rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/{ItemGluttonsAxe.java => ItemGourmandsAxe.java} (77%) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityAdvancedBlockUpdateDetector.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityChandelier.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityGigaTorch.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPItems.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPRecipeLoader.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/ConnectablePart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/Content.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/FencePart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/MaterialBasedPart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/PipeCoverPart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/SpherePart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipartItem.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/WallPart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartFenceRenderingHelper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartWallRenderingHelper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/SphereRenderingHelper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/item/ItemUEMultiPartRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/util/CuboidUtils.java rename src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/{GluttonsAxeConfig.java => GourmandsAxeConfig.java} (95%) delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinBlockEnchantmentTable_MagicWood.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsSelection.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MovingObjectPositionUtil.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/VoidingInventory.java create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/decorative_1.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/decorative_10.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/decorative_11.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/decorative_2.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/decorative_4.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/decorative_5.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/decorative_6.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/decorative_7.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/decorative_8.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/decorative_9.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/ethereal_glass_dark.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/glass_5.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/ineffable_glass.properties create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/chandelier.json create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/drum.json create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/giga_torch.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_copper.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_redstone.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_soul.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/drum.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/giga_torch.json create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/advanced_block_update_detector_active.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/advanced_block_update_detector_inactive.png delete mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector_active.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector_inactive.png delete mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank_left.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank_right.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_12.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/ineffable_glass.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/ineffable_glass_inverted.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png.mcmeta create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/bedrockium_drum.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_copper.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_redstone.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_soul.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/drum.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/giga_torch.png delete mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock_active.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock_inactive.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/smart_pump_top.png delete mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_bottom.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_east.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_north.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_south.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_top.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_west.png delete mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/gluttons_axe.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/gourmands_axe.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.2.png diff --git a/.github/workflows/optimize-images.yml b/.github/workflows/optimize-images.yml new file mode 100644 index 00000000..0ebed016 --- /dev/null +++ b/.github/workflows/optimize-images.yml @@ -0,0 +1,17 @@ +name: Optimize images + +on: + pull_request: + branches: [ master, main, release/** ] + paths: + - "**/*.png" + + push: + branches: [ master, main, release/** ] + paths: + - "**/*.png" + +jobs: + optimize-images: + uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/optimize-images.yml@master + secrets: inherit \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle index 4f9733dc..3d1caadf 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,7 +34,7 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - implementation("com.github.GTNewHorizons:GTNHLib:0.8.32:dev") + implementation("com.github.GTNewHorizons:GTNHLib:0.9.40:dev") // TODO: remove MUI1 dep when the implicit dependency // TODO: in IItemHandlerModifiable is removed api("com.github.GTNewHorizons:ModularUI:1.3.1:dev") @@ -42,19 +42,27 @@ dependencies { api("com.github.GTNewHorizons:CraftTweaker:3.4.2:dev") api('curse.maven:cofh-lib-220333:2388748') compileOnly('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev') - compileOnly('com.github.GTNewHorizons:Angelica:1.0.0-beta68a:dev') + compileOnly('com.github.GTNewHorizons:Angelica:2.1.16:dev') compileOnly("com.github.GTNewHorizons:FindIt:1.4.0:dev") compileOnly('com.github.GTNewHorizons:TinkersConstruct:1.14.14-GTNH:dev') + compileOnly('com.github.GTNewHorizons:ForgeMultipart:1.7.2:dev') {transitive = false} + compileOnly("com.github.GTNewHorizons:Backhand:1.8.2:dev") + compileOnly('com.github.GTNewHorizons:GT5-Unofficial:5.09.52.296:dev') devOnlyNonPublishable("com.github.GTNewHorizons:Baubles-Expanded:2.2.4-GTNH:dev") devOnlyNonPublishable("io.github.legacymoddingmc:unimixins:0.1.23:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.40-GTNH:dev") + runtimeOnlyNonPublishable('com.github.GTNewHorizons:Angelica:2.1.4:dev') + // For testing NBT data (/nbtedit) // runtimeOnlyNonPublishable("com.github.GTNewHorizons:ServerUtilities:2.2.6:dev") // For testing glove // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Translocators:1.4.0:dev") // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Backhand:1.8.2:dev") + + // For testing trowel + wand + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Backhand:1.8.2:dev") + // runtimeOnlyNonPublishable('com.github.GTNewHorizons:GT5-Unofficial:5.09.52.296:dev') } diff --git a/gradle.properties b/gradle.properties index cf8e9f11..825b7047 100644 --- a/gradle.properties +++ b/gradle.properties @@ -82,7 +82,7 @@ usesMixins = true separateMixinSourceSet = # Adds some debug arguments like verbose output and class export. -usesMixinDebug = false +usesMixinDebug = true # Specify the location of your implementation of IMixinConfigPlugin. Leave it empty otherwise. mixinPlugin = diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java index b613ece7..2b8127ac 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java @@ -14,6 +14,8 @@ import com.fouristhenumber.utilitiesinexcess.common.renderers.GloveRenderer; import com.fouristhenumber.utilitiesinexcess.common.renderers.InvertedIngotRenderer; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPItems; +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.item.ItemUEMultiPartRenderer; import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.fouristhenumber.utilitiesinexcess.compat.findit.FindItHelper; import com.fouristhenumber.utilitiesinexcess.render.ISBRHUnderworldPortal; @@ -46,6 +48,9 @@ public void init(FMLInitializationEvent event) { if (ModItems.INVERTED_NUGGET.isEnabled()) { MinecraftForgeClient.registerItemRenderer(ModItems.INVERTED_INGOT.get(), new InvertedIngotRenderer()); } + if (Mods.ForgeMicroBlock.isLoaded()) { + MinecraftForgeClient.registerItemRenderer(FMPItems.UE_MULTI_PART.get(), new ItemUEMultiPartRenderer()); + } if (ModBlocks.UNDERWORLD_PORTAL.isEnabled()) { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPortalUnderWorld.class, new TESRUnderworldPortal()); RenderingRegistry.registerBlockHandler(ISBRHUnderworldPortal.INSTANCE); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java index 74580fca..2adac9d7 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java @@ -5,9 +5,12 @@ import com.fouristhenumber.utilitiesinexcess.client.IMCForNEI; import com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime.EndOfTimeEvents; import com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld.UnderWorldEvents; +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPItems; import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.fouristhenumber.utilitiesinexcess.network.PacketHandler; import com.fouristhenumber.utilitiesinexcess.utils.SoundVolumeChecks; +import com.gtnewhorizon.gtnhlib.datastructs.space.ArrayProximityCheck4D; +import com.gtnewhorizon.gtnhlib.datastructs.space.VolumeShape; import com.gtnewhorizon.gtnhlib.keybind.SyncedKeybind; import cpw.mods.fml.common.event.FMLInitializationEvent; @@ -18,6 +21,7 @@ public class CommonProxy { public SoundVolumeChecks soundVolumeChecks; + public ArrayProximityCheck4D mobSpawnBlockChecks = new ArrayProximityCheck4D(VolumeShape.CUBE); public SyncedKeybind GLOVE_KEYBIND; @@ -35,6 +39,9 @@ public void preInit(FMLPreInitializationEvent event) { if (Mods.NEI.isLoaded()) { IMCForNEI.IMCSender(); } + if (Mods.ForgeMicroBlock.isLoaded()) { + FMPItems.init(); + } } public void init(FMLInitializationEvent event) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index d6aaecc4..8e9eab1a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -6,8 +6,10 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockAdvancedUpdateDetector; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockBedrockium; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockBlackoutCurtains; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockChandelier; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockCompressed; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockConveyor; @@ -18,6 +20,7 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderLotus; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEtherealGlass; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockFloating; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockGigaTorch; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockInverted; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockLapisAetherius; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockMagicWood; @@ -146,6 +149,7 @@ public enum ModBlocks { NETHER_STAR_GENERATOR_PLUS(GeneratorConfig.enableNetherStarGenerator, new BlockNetherStarGenerator("nether_star_generator_plus", 8), "nether_star_generator_plus"), NETHER_STAR_GENERATOR_PLUSPLUS(GeneratorConfig.enableNetherStarGenerator, new BlockNetherStarGenerator("nether_star_generator_plusplus", 64), "nether_star_generator_plusplus"), BLOCK_UPDATE_DETECTOR(BlockConfig.enableBlockUpdateDetector, new BlockUpdateDetector(), "block_update_detector"), + ADVANCED_BLOCK_UPDATE_DETECTOR(BlockConfig.enableBlockUpdateDetector, new BlockAdvancedUpdateDetector(), "advanced_block_update_detector"), ENDER_LOTUS(EnderLotusConfig.enableEnderLotus, new BlockEnderLotus(), null, "ender_lotus"), BLACKOUT_CURTAINS(BlockConfig.enableBlackoutCurtains, new BlockBlackoutCurtains(), "blackout_curtains"), CONVEYOR(BlockConfig.enableConveyor, new BlockConveyor(), BlockConveyor.ItemBlockConveyor.class, "conveyor"), @@ -168,6 +172,8 @@ public enum ModBlocks { TRANSFER_NODE_HYPER_ENERGY(true, new BlockTransferNodeHyperEnergy(), "transfer_node_hyper_energy"), RETRIEVAL_NODE(true, new BlockRetrievalNode(), "retrieval_node"), RETRIEVAL_NODE_FLUID(true, new BlockRetrievalNodeFluid(), "retrieval_node_fluid"), + CHANDELIER(BlockConfig.chandelier.enableChandelier, new BlockChandelier(), BlockChandelier.ItemBlockChandelier.class, "chandelier"), + GIGA_TORCH(BlockConfig.gigaTorch.enableGigaTorch, new BlockGigaTorch(), BlockGigaTorch.ItemBlockGigaTorch.class, "giga_torch"), ; // leave trailing semicolon // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java index b77327ef..d6f361a8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java @@ -24,7 +24,7 @@ import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemAntiParticulateShovel; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemDestructionPickaxe; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemEthericSword; -import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemGluttonsAxe; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemGourmandsAxe; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemPrecisionShears; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemReversingHoe; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderLotusConfig; @@ -35,7 +35,7 @@ import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.AntiParticulateShovelConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.EthericSwordConfig; -import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GluttonsAxeConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GourmandsAxeConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.PrecisionShearsConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.ReversingHoeConfig; @@ -46,7 +46,7 @@ public enum ModItems { // spotless:off // make sure to leave a trailing comma - GLUTTONS_AXE(GluttonsAxeConfig.enable, new ItemGluttonsAxe(), "gluttons_axe"), + GOURMANDS_AXE(GourmandsAxeConfig.enable, new ItemGourmandsAxe(), "gourmands_axe"), DESTRUCTION_PICKAXE(DestructionPickaxeConfig.enable, new ItemDestructionPickaxe(), "destruction_pickaxe"), ANTI_PARTICULATE_SHOVEL(AntiParticulateShovelConfig.enable, new ItemAntiParticulateShovel(), "anti_particulate_shovel"), PRECISION_SHEARS(PrecisionShearsConfig.enable, new ItemPrecisionShears(), "precision_shears"), @@ -73,8 +73,6 @@ public enum ModItems { GLOVE(ItemConfig.enableGlove, new ItemGlove(), "glove"), // todo config UPGRADE(true, new ItemUpgrade(), "upgrade"), - - ; // leave trailing semicolon // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index 56339537..5a1ab471 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -18,9 +18,12 @@ import com.fouristhenumber.utilitiesinexcess.common.renderers.SpikeRenderer; import com.fouristhenumber.utilitiesinexcess.common.renderers.transfer.TransferNodeRenderer; import com.fouristhenumber.utilitiesinexcess.common.renderers.transfer.TransferPipeRenderer; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityAdvancedBlockUpdateDetector; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityBlockUpdateDetector; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityChandelier; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityConveyor; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityGigaTorch; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityMarginallyMaximisedChest; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPacifistsBench; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; @@ -52,6 +55,8 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeFluid; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; import com.fouristhenumber.utilitiesinexcess.common.worldgen.WorldGenEnderLotus; +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPRecipeLoader; +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.Content; import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.fouristhenumber.utilitiesinexcess.compat.crafttweaker.QEDCraftTweakerSupport; import com.fouristhenumber.utilitiesinexcess.compat.tinkers.TinkersCompat; @@ -77,7 +82,7 @@ version = Tags.VERSION, name = "UtilitiesInExcess", acceptedMinecraftVersions = "[1.7.10]", - dependencies = "required-after:gtnhlib@[0.6.31,)") + dependencies = "required-after:gtnhlib@[0.9.9,); after:ForgeMicroblock") public class UtilitiesInExcess { public static final String MODID = "utilitiesinexcess"; @@ -100,6 +105,9 @@ public class UtilitiesInExcess { @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { GameRegistry.registerTileEntity(TileEntitySpike.class, "utilitiesinexcess:TileEntitySpike"); + if (Mods.ForgeMicroBlock.isLoaded()) { + new Content().init(); + } proxy.preInit(event); } @@ -127,7 +135,11 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityRadicallyReducedChest.class, "TileEntityRadicallyReducedChestUIE"); GameRegistry.registerTileEntity(TileEntitySoundMuffler.class, "TileEntitySoundMufflerUIE"); GameRegistry.registerTileEntity(TileEntityRainMuffler.class, "TileEntityRainMufflerUIE"); + GameRegistry.registerTileEntity(TileEntityChandelier.class, "TileEntityPendantLightUIE"); + GameRegistry.registerTileEntity(TileEntityGigaTorch.class, "TileEntityGigaTorchUIE"); GameRegistry.registerTileEntity(TileEntityBlockUpdateDetector.class, "TileEntityBlockUpdateDetector"); + GameRegistry + .registerTileEntity(TileEntityAdvancedBlockUpdateDetector.class, "TileEntityAdvancedBlockUpdateDetector"); GameRegistry.registerTileEntity(TileEntityConveyor.class, "TileEntityConveyor"); GameRegistry.registerTileEntity(TileEntityPortalUnderWorld.class, "TileEntityPortalUnderWorld"); GameRegistry.registerTileEntity(TileEntityBlockUpdateDetector.class, "TileEntityBlockUpdateDetectorUIE"); @@ -210,6 +222,10 @@ public void init(FMLInitializationEvent event) { public void postInit(FMLPostInitializationEvent event) { proxy.postInit(event); + if (Mods.ForgeMicroBlock.isLoaded()) { + FMPRecipeLoader.run(); + } + if (Mods.Tinkers.isLoaded() && OtherConfig.enableTinkersIntegration) { TinkersCompat.init(); } @@ -228,7 +244,7 @@ public Item getTabIconItem() { .getItem(); } - public static final ItemStack ICON_ITEM = new ItemStack(ModItems.GLUTTONS_AXE.get()); + public static final ItemStack ICON_ITEM = new ItemStack(ModItems.GOURMANDS_AXE.get()); @Override public ItemStack getIconItemStack() { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java index 40d8437a..27bd9e02 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java @@ -31,16 +31,25 @@ public static void IMCSender() { sendInfoPage("utilitiesinexcess:inverted_ingot", "nei.infopage.uie.ticon_inverted"); } - sendInfoPage("", "nei.infopage.uie.gluttons_axe.1"); + sendInfoPage("", "nei.infopage.uie.gourmands_axe.1"); sendInfoPage("", "nei.infopage.uie.destruction_pickaxe.1"); sendInfoPage("", "nei.infopage.uie.anti_particulate_shovel.1"); sendInfoPage("", "nei.infopage.uie.precision_shears.1"); sendInfoPage("", "nei.infopage.uie.etheric_sword.1"); sendInfoPage("", "nei.infopage.uie.reversing_hoe.1"); + sendInfoPage( ",", "nei.infopage.uie.architects_wand.1"); + if (Mods.Backhand.isLoaded()) { + sendInfoPage( + ",", + "nei.infopage.uie.architects_wand.2"); + if (Mods.GT.isLoaded()) sendInfoPage( + ",", + "nei.infopage.uie.architects_wand.3"); + } sendInfoPage("", "nei.infopage.uie.mob_jar.1"); sendInfoPage("utilitiesinexcess:glove", "nei.infopage.uie.glove.1"); @@ -70,6 +79,9 @@ public static void IMCSender() { sendInfoPage("", "nei.infopage.uie.drum.1"); sendInfoPage("", "nei.infopage.uie.block_update_detector.1"); + sendInfoPage( + "", + "nei.infopage.uie.advanced.block_update_detector.1"); sendInfoPage("", "nei.infopage.uie.rain_muffler.1"); sendInfoPage("", "nei.infopage.uie.sound_muffler.1"); @@ -155,9 +167,13 @@ public static void IMCSender() { sendInfoPage("", "nei.infopage.uie.temporal_gate.4"); sendInfoPage("", "nei.infopage.uie.temporal_gate.5"); - sendInfoPage("", "nei.infopage.uie.ethereal_glass.0"); + sendInfoPage( + ",", + "nei.infopage.uie.ethereal_glass.0"); sendInfoPage("", "nei.infopage.uie.ethereal_glass.2"); - sendInfoPage("", "nei.infopage.uie.ethereal_glass.3"); + sendInfoPage( + ",", + "nei.infopage.uie.ethereal_glass.3"); sendInfoPage("", "nei.infopage.uie.ethereal_glass.5"); sendInfoPage( @@ -183,6 +199,8 @@ public static void IMCSender() { sendInfoPage("", "nei.infopage.uie.underworld_portal.2"); sendInfoPage("", "nei.infopage.uie.underworld_portal.3"); + sendInfoPage("", "nei.infopage.uie.chandelier.1"); + sendInfoPage("", "nei.infopage.uie.giga_torch.1"); sendInfoPage("", "nei.infopage.uie.trading_post.1"); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockAdvancedUpdateDetector.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockAdvancedUpdateDetector.java new file mode 100644 index 00000000..89bbe5d5 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockAdvancedUpdateDetector.java @@ -0,0 +1,83 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static net.minecraft.util.Facing.facings; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityAdvancedBlockUpdateDetector; + +public class BlockAdvancedUpdateDetector extends BlockContainer { + + private IIcon iconInactive; + private IIcon iconActive; + + public BlockAdvancedUpdateDetector() { + super(Material.rock); + setBlockName("advanced_block_update_detector"); + setHardness(1.0F); + setHarvestLevel("pickaxe", 0); + } + + @Override + public void registerBlockIcons(IIconRegister reg) { + iconInactive = reg.registerIcon("utilitiesinexcess:advanced_block_update_detector_inactive"); + iconActive = reg.registerIcon("utilitiesinexcess:advanced_block_update_detector_active"); + } + + @Override + public IIcon getIcon(int side, int meta) { + boolean active = (meta) == 1; + return active ? iconActive : iconInactive; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityAdvancedBlockUpdateDetector(); + } + + @Override + public boolean canProvidePower() { + return true; + } + + @Override + public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof TileEntityAdvancedBlockUpdateDetector tileABUD) { + return tileABUD.getOutputPower(); + } + return 0; + } + + @Override + public boolean isNormalCube(IBlockAccess world, int x, int y, int z) { + return true; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + if (!player.isSneaking()) { + return false; + } + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof TileEntityAdvancedBlockUpdateDetector tileABUD) { + tileABUD.toggleFace(side); + player.addChatMessage( + new ChatComponentTranslation( + "chat.tile.advanced_block_update_detector.toggle", + facings[side], + tileABUD.getScanning(side))); + return true; + } + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockChandelier.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockChandelier.java new file mode 100644 index 00000000..9ee215a4 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockChandelier.java @@ -0,0 +1,118 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static net.minecraftforge.common.util.ForgeDirection.*; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityChandelier; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.gtnewhorizon.gtnhlib.client.model.ModelISBRH; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockChandelier extends BlockContainer { + + public BlockChandelier() { + super(Material.circuits); + setBlockName("chandelier"); + setHardness(0.0F); + setLightLevel(0.9375F); // 15 light level + setStepSound(soundTypeWood); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityChandelier(); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getRenderType() { + return ModelISBRH.JSON_ISBRH_ID; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World worldIn, int x, int y, int z) { + return null; + } + + @Override + public boolean canPlaceBlockAt(World worldIn, int x, int y, int z) { + return worldIn.isSideSolid(x, y + 1, z, DOWN); + } + + @Override + public boolean canPlaceBlockOnSide(World worldIn, int x, int y, int z, int side) { + return canPlaceBlockAt(worldIn, x, y, z); + } + + @Override + public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) { + if (!this.canPlaceBlockAt(worldIn, x, y, z) && worldIn.getBlock(x, y, z) == this) { + this.dropBlockAsItem(worldIn, x, y, z, worldIn.getBlockMetadata(x, y, z), 0); + worldIn.setBlockToAir(x, y, z); + } + } + + @Override + public int damageDropped(int meta) { + return meta; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { + for (int i = 0; i < 4; i++) { + list.add(new ItemStack(itemIn, 1, i)); + } + } + + public static class ItemBlockChandelier extends ItemBlock { + + public ItemBlockChandelier(Block block) { + super(block); + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + public int getMetadata(int damage) { + return damage; + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return this.getUnlocalizedName() + "." + stack.getItemDamage(); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean bool) { + tooltip.add( + StatCollector + .translateToLocalFormatted("tile.chandelier.desc", BlockConfig.chandelier.chandelierLightRange)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java index 90c0a4ce..c24043b4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java @@ -20,7 +20,7 @@ public class BlockConveyor extends BlockContainer { @SideOnly(Side.CLIENT) - private IIcon belt_up, belt_down, belt_left, belt_right, blank; + private IIcon belt_up, belt_down, belt_left, belt_right, blank_right, blank_left; public BlockConveyor() { super(Material.piston); @@ -45,17 +45,26 @@ public void registerBlockIcons(IIconRegister reg) { belt_down = reg.registerIcon("utilitiesinexcess:conveyor_belt_down"); belt_left = reg.registerIcon("utilitiesinexcess:conveyor_belt_left"); belt_right = reg.registerIcon("utilitiesinexcess:conveyor_belt_right"); - blank = reg.registerIcon("utilitiesinexcess:conveyor_belt_blank"); + blank_right = reg.registerIcon("utilitiesinexcess:conveyor_belt_blank_right"); + blank_left = reg.registerIcon("utilitiesinexcess:conveyor_belt_blank_left"); } @SideOnly(Side.CLIENT) @Override public IIcon getIcon(int s, int meta) { - if (s == getFacing(meta).getOpposite() + ForgeDirection facing = getFacing(meta); + if (s == facing.ordinal()) return belt_down; + if (s == facing.getOpposite() .ordinal()) return belt_up; - if (s != ForgeDirection.UP.ordinal()) return blank; - return switch (getFacing(meta)) { + if (s != ForgeDirection.UP.ordinal() && s != ForgeDirection.DOWN.ordinal()) { + if (s == facing.getRotation(ForgeDirection.DOWN) + .ordinal()) return blank_left; + else return blank_right; + } + + if (s == ForgeDirection.DOWN.ordinal()) facing = facing.getOpposite(); + return switch (facing) { case NORTH -> belt_up; case SOUTH -> belt_down; case WEST -> belt_left; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java index 35fec990..82157605 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java @@ -18,7 +18,7 @@ public class BlockDecorativeGlass extends BlockGlass { - private static final int META_VALUES = 12; + private static final int META_VALUES = 13; public BlockDecorativeGlass() { super(Material.glass, false); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDrum.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDrum.java index 96946737..24a00574 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDrum.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDrum.java @@ -23,6 +23,7 @@ import com.cleanroommc.modularui.utils.NumberFormat; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; +import com.gtnewhorizon.gtnhlib.client.model.ModelISBRH; public class BlockDrum extends BlockContainer { @@ -139,6 +140,21 @@ public void breakBlock(World world, int x, int y, int z, Block block, int meta) super.breakBlock(world, x, y, z, block, meta); } + @Override + public int getRenderType() { + return ModelISBRH.JSON_ISBRH_ID; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + public static class ItemBlockDrum extends ItemBlock implements IFluidContainerItem { public final int capacity; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEtherealGlass.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEtherealGlass.java index 04dc5e0d..e92a76d1 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEtherealGlass.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEtherealGlass.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks; import java.util.List; +import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockGlass; @@ -20,13 +21,16 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +// Extending glass makes the rendering work properly public class BlockEtherealGlass extends BlockGlass { public enum EtherealGlassType { NORMAL(0, "ethereal_glass"), + INEFFABLE(1, "ineffable_glass"), DARK(2, "ethereal_glass_dark"), INVERTED(3, "ethereal_glass_inverted"), + INEFFABLE_INVERTED(4, "ineffable_glass_inverted"), DARK_INVERTED(5, "ethereal_glass_dark_inverted"); public final int meta; @@ -48,6 +52,17 @@ public BlockEtherealGlass() { @SideOnly(Side.CLIENT) private IIcon[] icons; + @Override + public int getRenderBlockPass() { + return 1; + } + + // Have to override glass method back to the default + @Override + public int quantityDropped(Random random) { + return 1; + } + @Override public int damageDropped(int meta) { return meta; @@ -58,13 +73,15 @@ public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlig List list, Entity collider) { int meta = worldIn.getBlockMetadata(x, y, z); - if ((meta == EtherealGlassType.NORMAL.meta || meta == EtherealGlassType.DARK.meta) - && collider instanceof EntityPlayer) { + if ((meta == EtherealGlassType.NORMAL.meta || meta == EtherealGlassType.DARK.meta + || meta == EtherealGlassType.INEFFABLE.meta) && collider instanceof EntityPlayer player + && !player.isSneaking()) { return; } - if ((meta == EtherealGlassType.INVERTED.meta || meta == EtherealGlassType.DARK_INVERTED.meta) - && !(collider instanceof EntityPlayer)) { + if ((meta == EtherealGlassType.INVERTED.meta || meta == EtherealGlassType.DARK_INVERTED.meta + || meta == EtherealGlassType.INEFFABLE_INVERTED.meta) + && !(collider instanceof EntityPlayer player && !player.isSneaking())) { return; } @@ -74,7 +91,7 @@ public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlig @Override public int getLightOpacity(IBlockAccess world, int x, int y, int z) { int meta = world.getBlockMetadata(x, y, z); - return (meta == EtherealGlassType.NORMAL.meta || meta == EtherealGlassType.INVERTED.meta) ? 0 : 255; + return (meta == EtherealGlassType.DARK.meta || meta == EtherealGlassType.DARK_INVERTED.meta) ? 255 : 0; } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockGigaTorch.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockGigaTorch.java new file mode 100644 index 00000000..1740ac5f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockGigaTorch.java @@ -0,0 +1,87 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static net.minecraftforge.common.util.ForgeDirection.*; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityGigaTorch; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.gtnewhorizon.gtnhlib.client.model.ModelISBRH; + +public class BlockGigaTorch extends BlockContainer { + + public BlockGigaTorch() { + super(Material.circuits); + setBlockName("giga_torch"); + setHardness(0.0F); + setLightLevel(0.9375F); // 15 light level + setStepSound(soundTypeWood); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityGigaTorch(); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getRenderType() { + return ModelISBRH.JSON_ISBRH_ID; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World worldIn, int x, int y, int z) { + return null; + } + + @Override + public boolean canPlaceBlockAt(World worldIn, int x, int y, int z) { + if (World.doesBlockHaveSolidTopSurface(worldIn, x, y - 1, z)) { + return true; + } else { + Block block = worldIn.getBlock(x, y - 1, z); + return block.canPlaceTorchOnTop(worldIn, x, y - 1, z); + } + } + + @Override + public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) { + if (!this.canPlaceBlockAt(worldIn, x, y, z) && worldIn.getBlock(x, y, z) == this) { + this.dropBlockAsItem(worldIn, x, y, z, 0, 0); + worldIn.setBlockToAir(x, y, z); + } + } + + public static class ItemBlockGigaTorch extends ItemBlock { + + public ItemBlockGigaTorch(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean bool) { + tooltip.add( + StatCollector.translateToLocalFormatted("tile.giga_torch.desc", BlockConfig.gigaTorch.gigaTorchRange)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockInverted.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockInverted.java index f360908c..dcf7f78a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockInverted.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockInverted.java @@ -3,6 +3,11 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + public class BlockInverted extends Block { public BlockInverted() { @@ -12,4 +17,14 @@ public BlockInverted() { setHardness(0.5F); setResistance(150F); } + + @Override + public boolean isOpaqueCube() { + return BlockConfig.invertedBlockDoesXRay; + } + + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() { + return 1; + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalEndOfTime.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalEndOfTime.java index a0ae655e..9b83e44b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalEndOfTime.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalEndOfTime.java @@ -4,6 +4,7 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; @@ -16,7 +17,9 @@ import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.ForgeDirection; @@ -30,6 +33,8 @@ import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class BlockPortalEndOfTime extends Block { @@ -41,6 +46,31 @@ public BlockPortalEndOfTime() { setResistance(5); } + IIcon[] icons; + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + icons = new IIcon[6]; + icons[0] = reg.registerIcon(this.getTextureName() + "_bottom"); + icons[1] = reg.registerIcon(this.getTextureName() + "_top"); + icons[2] = reg.registerIcon(this.getTextureName() + "_north"); + icons[3] = reg.registerIcon(this.getTextureName() + "_south"); + icons[4] = reg.registerIcon(this.getTextureName() + "_west"); + icons[5] = reg.registerIcon(this.getTextureName() + "_east"); + } + + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return icons[side]; + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(IBlockAccess worldIn, int x, int y, int z, int side) { + return icons[side]; + } + @Override public int onBlockPlaced(World world, int x, int y, int z, int side, float subX, float subY, float subZ, int meta) { if (!world.isRemote && world.provider instanceof WorldProviderEndOfTime) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRedstoneClock.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRedstoneClock.java index f04b8a77..08f1e62a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRedstoneClock.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRedstoneClock.java @@ -3,7 +3,9 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -11,12 +13,26 @@ public class BlockRedstoneClock extends BlockContainer { + private IIcon iconInactive; + private IIcon iconActive; + public BlockRedstoneClock() { super(Material.rock); setBlockName("redstone_clock"); setBlockTextureName("utilitiesinexcess:redstone_clock"); } + @Override + public void registerBlockIcons(IIconRegister reg) { + iconInactive = reg.registerIcon("utilitiesinexcess:redstone_clock_inactive"); + iconActive = reg.registerIcon("utilitiesinexcess:redstone_clock_active"); + } + + @Override + public IIcon getIcon(int side, int meta) { + return meta == 1 ? iconActive : iconInactive; + } + @Override public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityRedstoneClock(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSmartPump.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSmartPump.java index 263a0528..6a82656c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSmartPump.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSmartPump.java @@ -2,11 +2,17 @@ import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySmartPump; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + public class BlockSmartPump extends BlockContainer { public BlockSmartPump() { @@ -15,6 +21,26 @@ public BlockSmartPump() { setBlockTextureName("utilitiesinexcess:smart_pump"); } + IIcon sides; + IIcon top; + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + sides = reg.registerIcon("utilitiesinexcess:smart_pump"); + top = reg.registerIcon("utilitiesinexcess:smart_pump_top"); + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int s, int meta) { + if (s == ForgeDirection.UP.ordinal() || s == ForgeDirection.DOWN.ordinal()) { + return top; + } else { + return sides; + } + } + @Override public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntitySmartPump(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockUpdateDetector.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockUpdateDetector.java index 91eb9bfa..c75ded46 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockUpdateDetector.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockUpdateDetector.java @@ -3,8 +3,10 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.init.Blocks; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -12,10 +14,26 @@ public class BlockUpdateDetector extends BlockContainer { + private IIcon iconInactive; + private IIcon iconActive; + public BlockUpdateDetector() { super(Material.rock); setBlockName("block_update_detector"); - setBlockTextureName("utilitiesinexcess:block_update_detector"); + setBlockTextureName("utilitiesinexcess:block_update_detector_inactive"); + setHardness(1.0F); + setHarvestLevel("pickaxe", 0); + } + + @Override + public void registerBlockIcons(IIconRegister reg) { + iconInactive = reg.registerIcon("utilitiesinexcess:block_update_detector_inactive"); + iconActive = reg.registerIcon("utilitiesinexcess:block_update_detector_active"); + } + + @Override + public IIcon getIcon(int side, int meta) { + return (meta) == 1 ? iconActive : iconInactive; } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/MobDenySpawnEvents.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/MobDenySpawnEvents.java new file mode 100644 index 00000000..eea55867 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/MobDenySpawnEvents.java @@ -0,0 +1,51 @@ +package com.fouristhenumber.utilitiesinexcess.common.events; + +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.entity.monster.EntitySlime; +import net.minecraftforge.event.entity.living.LivingSpawnEvent; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.eventbus.EventBusSubscriber; + +import cpw.mods.fml.common.eventhandler.Event; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +@SuppressWarnings("unused") +@EventBusSubscriber() +public class MobDenySpawnEvents { + + @EventBusSubscriber.Condition + public static boolean shouldSubscribe() { + return ModBlocks.GIGA_TORCH.isEnabled(); + } + + // context https://github.com/GTNewHorizons/GT5-Unofficial/pull/905 + @SubscribeEvent + public static void denySpawn(LivingSpawnEvent.CheckSpawn event) { + if (event.getResult() == Event.Result.DENY) return; + + if (event.entityLiving instanceof EntitySlime slime && !slime.hasCustomNameTag() + && event.getResult() == Event.Result.ALLOW) { + event.setResult(Event.Result.DEFAULT); + } + + if (event.getResult() == Event.Result.ALLOW) { + return; + } + + if (event.entityLiving.isCreatureType(EnumCreatureType.monster, false)) { + if (UtilitiesInExcess.proxy.mobSpawnBlockChecks.isInRange( + event.entity.worldObj.provider.dimensionId, + event.entity.posX, + event.entity.posY, + event.entity.posZ)) { + if (event.entityLiving instanceof EntitySlime slime) { + slime.setCustomNameTag("DoNotSpawnSlimes"); + } + event.setResult(Event.Result.DENY); + } + } + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/WateringCanEvent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/WateringCanEvent.java index 0afaa414..7e3d98df 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/WateringCanEvent.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/WateringCanEvent.java @@ -1,10 +1,11 @@ package com.fouristhenumber.utilitiesinexcess.common.events; -import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.event.world.WorldEvent; -import cpw.mods.fml.common.eventhandler.Event; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; -public class WateringCanEvent extends Event { +public class WateringCanEvent extends WorldEvent { public final BlockPos wateredBlock; public final BlockPos originBlock; @@ -23,7 +24,8 @@ public class WateringCanEvent extends Event { *
    * This event is fired on the {@link net.minecraftforge.common.MinecraftForge#EVENT_BUS}. **/ - public WateringCanEvent(BlockPos wateredBlock, BlockPos originBlock, int wateringCanTier) { + public WateringCanEvent(World world, BlockPos wateredBlock, BlockPos originBlock, int wateringCanTier) { + super(world); this.wateredBlock = wateredBlock; this.originBlock = originBlock; this.wateringCanTier = wateringCanTier; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemArchitectsWand.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemArchitectsWand.java index 69c14c23..54c06cb6 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemArchitectsWand.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemArchitectsWand.java @@ -1,7 +1,11 @@ package com.fouristhenumber.utilitiesinexcess.common.items; +import static com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig.damageTrowelWithArchitectsWand; +import static com.fouristhenumber.utilitiesinexcess.utils.ArchitectsWandUtils.damageBackhand; + import java.util.List; import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; @@ -12,18 +16,23 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.StatCollector; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import org.jetbrains.annotations.NotNull; + import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.common.renderers.WireframeRenderer; +import com.fouristhenumber.utilitiesinexcess.utils.ArchitectsSelection; import com.fouristhenumber.utilitiesinexcess.utils.ArchitectsWandUtils; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class ItemArchitectsWand extends Item { +public class ItemArchitectsWand extends Item implements ITranslucentItem { public int buildLimit; @@ -50,20 +59,28 @@ public void onUpdate(ItemStack stack, World world, Entity entity, int slot, bool return; } - if (!isSelected) return; + if (!isSelected) { + return; + } - MovingObjectPosition mop = Minecraft.getMinecraft().objectMouseOver; + // I'm pretty sure this will never determine whether we render or not but I'm not certain + MovingObjectPosition movingObjectPosition = Minecraft.getMinecraft().objectMouseOver; // Check if player is looking at a block. - if (mop == null || mop.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK) { + if (movingObjectPosition == null + || movingObjectPosition.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK) { WireframeRenderer.clearCandidatePositions(); return; } - int x = mop.blockX; - int y = mop.blockY; - int z = mop.blockZ; - int side = mop.sideHit; + // 1. Target block location + BlockPos target = new BlockPos( + movingObjectPosition.blockX, + movingObjectPosition.blockY, + movingObjectPosition.blockZ); + + // 2. Side + int side = movingObjectPosition.sideHit; ForgeDirection forgeSide = ForgeDirection.getOrientation(side); if (forgeSide == ForgeDirection.UNKNOWN) { UtilitiesInExcess.LOG @@ -71,31 +88,67 @@ public void onUpdate(ItemStack stack, World world, Entity entity, int slot, bool return; } - Block blockToPlace = world.getBlock(x, y, z); - if (blockToPlace == null) return; - int metaToPlace = world.getBlockMetadata(x, y, z); - ItemStack itemStack = new ItemStack(Item.getItemFromBlock(blockToPlace), 1, metaToPlace); - - int inventoryBlockCount = ArchitectsWandUtils.countItemInInventory(player, itemStack); - if (!player.capabilities.isCreativeMode && inventoryBlockCount == 0) { - WireframeRenderer.clearCandidatePositions(); - return; - } - int placeCount = player.capabilities.isCreativeMode ? this.buildLimit - : Math.min(inventoryBlockCount, this.buildLimit); - - Set blocksToPlace = ArchitectsWandUtils - .findAdjacentBlocks(world, blockToPlace, metaToPlace, placeCount, forgeSide, new BlockPos(x, y, z)); + // 4. Target block to place + ArchitectsSelection selection = new ArchitectsSelection(player, world, movingObjectPosition); + List itemStackToPlace = selection.blockToPlace(player); + + // 3. Total amount to place + int placeCount = selection.maxPlaceCount(player, buildLimit); + + Set blocksToPlace = ArchitectsWandUtils.findAdjacentBlocks( + world, + itemStackToPlace, + placeCount, + forgeSide, + target, + movingObjectPosition, + player, + selection); WireframeRenderer.clearCandidatePositions(); for (BlockPos pos : blocksToPlace) { WireframeRenderer.addCandidatePosition(pos.offset(forgeSide.offsetX, forgeSide.offsetY, forgeSide.offsetZ)); } + } + private void placeBlock(World world, EntityPlayer player, @NotNull ItemStack itemStack, BlockPos pos, int side, + float hitX, float hitY, float hitZ, ForgeDirection forgeSide) { + + // This block is here because some mods want to use TEs to + ItemStack itemCopy = itemStack.copy(); + itemCopy.stackSize = 1; + Block comparisonBlock = world.getBlock(pos.x, pos.y, pos.z); + int comparisonMeta = world.getBlockMetadata(pos.x, pos.y, pos.z); + ItemStack comparisonItemStack = new ItemStack(comparisonBlock, 1, comparisonMeta); + + boolean useCompatPlacement = !ItemStack.areItemStacksEqual(itemCopy, comparisonItemStack); + if (useCompatPlacement) { + itemStack.getItem() + .onItemUse(itemCopy, player, world, pos.x, pos.y, pos.z, side, hitX, hitY, hitZ); + } else { + Block block = Block.getBlockFromItem(itemCopy.getItem()); + world.setBlock( + pos.x + forgeSide.offsetX, + pos.y + forgeSide.offsetY, + pos.z + forgeSide.offsetZ, + block, + comparisonMeta, + 3); + + world.playSoundEffect( + pos.x + forgeSide.offsetX, + pos.y + forgeSide.offsetY, + pos.z + forgeSide.offsetZ, + block.stepSound.func_150496_b(), + (block.stepSound.getVolume() + 1.0F) / 2.0F, + block.stepSound.getPitch() * 0.8F); + } } @Override public boolean onItemUse(ItemStack itemstack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + if (world.isRemote) return true; + // TODO: Prevent player from placing blocks into themself / other entities? ForgeDirection forgeSide = ForgeDirection.getOrientation(side); if (forgeSide == ForgeDirection.UNKNOWN) { @@ -104,30 +157,34 @@ public boolean onItemUse(ItemStack itemstack, EntityPlayer player, World world, return false; } - Block blockToPlace = world.getBlock(x, y, z); - if (blockToPlace == null) return false; - int metaToPlace = world.getBlockMetadata(x, y, z); - ItemStack itemStack = new ItemStack(Item.getItemFromBlock(blockToPlace), 1, metaToPlace); + BlockPos target = new BlockPos(x, y, z); + MovingObjectPosition mop = new MovingObjectPosition(x, y, z, side, Vec3.createVectorHelper(hitX, hitY, hitZ)); + ArchitectsSelection selection = new ArchitectsSelection(player, world, mop); - int inventoryBlockCount = ArchitectsWandUtils.countItemInInventory(player, itemStack); - if (!player.capabilities.isCreativeMode && inventoryBlockCount == 0) return false; - int placeCount = player.capabilities.isCreativeMode ? this.buildLimit - : Math.min(inventoryBlockCount, this.buildLimit); + List itemStackToPlace = selection.blockToPlace(player); + + int placeCount = selection.maxPlaceCount(player, buildLimit); Set blocksToPlace = ArchitectsWandUtils - .findAdjacentBlocks(world, blockToPlace, metaToPlace, placeCount, forgeSide, new BlockPos(x, y, z)); + .findAdjacentBlocks(world, itemStackToPlace, placeCount, forgeSide, target, mop, player, selection); + + ItemStack nowPlacing; for (BlockPos pos : blocksToPlace) { - // TODO: Group these by a bigger number instead of decreasing by 1 every time. - if (player.capabilities.isCreativeMode || ArchitectsWandUtils.decreaseFromInventory(player, itemStack)) { - world.setBlock( - pos.x + forgeSide.offsetX, - pos.y + forgeSide.offsetY, - pos.z + forgeSide.offsetZ, - blockToPlace, - metaToPlace, - 3); + List candidates = selection.blockToPlace(player); + if (candidates.size() == 1) { + nowPlacing = candidates.get(0); + } else { + nowPlacing = candidates.get( + ThreadLocalRandom.current() + .nextInt(candidates.size())); + } + + if (player.capabilities.isCreativeMode || (ArchitectsWandUtils.decreaseFromInventory(player, nowPlacing) + && damageBackhand(damageTrowelWithArchitectsWand, player))) { + placeBlock(world, player, nowPlacing, pos, side, hitX, hitY, hitZ, forgeSide); } } + player.inventoryContainer.detectAndSendChanges(); return true; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGoldenBag.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGoldenBag.java index 8642c60e..9b456ec8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGoldenBag.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGoldenBag.java @@ -1,7 +1,5 @@ package com.fouristhenumber.utilitiesinexcess.common.items; -import java.util.List; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -24,9 +22,6 @@ import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public class ItemGoldenBag extends Item implements IGuiHolder { private final int inventorySize = 54; @@ -49,12 +44,6 @@ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer pla return super.onItemRightClick(stack, world, player); } - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { - tooltip.add(StatCollector.translateToLocal("item.golden_bag.desc")); - } - @Override public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { final int panelHeight = 220; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java index cb0beb02..be1d5d12 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java @@ -1,8 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.common.items; -import static com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig.awakenedInversionDurability; - import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import net.minecraft.block.Block; @@ -35,18 +34,22 @@ import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingSpawnEvent; +import org.apache.logging.log4j.Level; import org.jetbrains.annotations.NotNull; import com.fouristhenumber.utilitiesinexcess.ModItems; import com.fouristhenumber.utilitiesinexcess.common.entities.EntitySiegeProperty; import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; +import com.fouristhenumber.utilitiesinexcess.utils.ItemStackBaseCompare; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.eventhandler.Event; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.common.registry.GameRegistry; public class ItemInversionSigilActive extends Item { @@ -54,28 +57,13 @@ public class ItemInversionSigilActive extends Item { private static final int BEACON_SEARCH_RADIUS = 6; private final int[][] LIGHTNING_POSITIONS = { { 0, 0 }, { -5, 0 }, { 5, 0 }, { 0, -5 }, { 0, 5 } }; - private final ItemStack[] CHEST_NORTH_CONTENTS = { new ItemStack(Blocks.stone), new ItemStack(Items.brick), - new ItemStack(Blocks.glass), new ItemStack(Items.cooked_fished), new ItemStack(Blocks.hardened_clay), - new ItemStack(Items.dye, 1, 2), new ItemStack(Items.coal, 1, 1), new ItemStack(Items.cooked_beef), - new ItemStack(Items.iron_ingot), new ItemStack(Items.cooked_chicken), new ItemStack(Items.gold_ingot), - new ItemStack(Items.baked_potato), new ItemStack(Items.cooked_porkchop), new ItemStack(Items.netherbrick) }; - - private final int[] POTION_IDS = { 8193, 8194, 8195, 8196, 8197, 8198, 8200, 8201, 8202, 8204, 8205, 8206, 8225, - 8226, 8228, 8229, 8232, 8233, 8234, 8236, 8257, 8258, 8259, 8260, 8262, 8264, 8265, 8267, 8268, 8269, 8270 }; + private HashSet CHEST_NORTH_CONTENTS = new HashSet<>(); - private final ItemStack[] CHEST_EAST_CONTENTS = new ItemStack[62]; + private HashSet CHEST_EAST_CONTENTS = new HashSet<>(); - private final ItemStack[] CHEST_SOUTH_CONTENTS = { new ItemStack(Blocks.grass), new ItemStack(Blocks.lapis_ore), - new ItemStack(Blocks.dirt), new ItemStack(Blocks.obsidian), new ItemStack(Blocks.sand), - new ItemStack(Blocks.diamond_ore), new ItemStack(Blocks.gravel), new ItemStack(Blocks.redstone_ore), - new ItemStack(Blocks.gold_ore), new ItemStack(Blocks.clay), new ItemStack(Blocks.iron_ore), - new ItemStack(Blocks.emerald_ore), new ItemStack(Blocks.coal_ore) }; + private HashSet CHEST_SOUTH_CONTENTS = new HashSet<>(); - private final ItemStack[] CHEST_WEST_CONTENTS = { new ItemStack(Items.record_13), - new ItemStack(Items.record_mellohi), new ItemStack(Items.record_cat), new ItemStack(Items.record_stal), - new ItemStack(Items.record_blocks), new ItemStack(Items.record_strad), new ItemStack(Items.record_chirp), - new ItemStack(Items.record_ward), new ItemStack(Items.record_far), new ItemStack(Items.record_11), - new ItemStack(Items.record_mall), new ItemStack(Items.record_wait) }; + private HashSet CHEST_WEST_CONTENTS = new HashSet<>(); public ItemInversionSigilActive() { super(); @@ -84,10 +72,25 @@ public ItemInversionSigilActive() { setMaxStackSize(1); setContainerItem(this); - for (int i = 0; i < 31; i++) { - CHEST_EAST_CONTENTS[2 * i] = new ItemStack(Items.potionitem, 1, POTION_IDS[i]); - CHEST_EAST_CONTENTS[2 * i + 1] = new ItemStack(Items.potionitem, 1, POTION_IDS[i] + 8192); - } + CHEST_NORTH_CONTENTS = getValidChestContents( + ForgeDirection.NORTH, + InversionConfig.northChestValidItems, + InversionConfig.northChestRequiredItems); + + CHEST_EAST_CONTENTS = getValidChestContents( + ForgeDirection.EAST, + InversionConfig.eastChestValidItems, + InversionConfig.eastChestRequiredItems); + + CHEST_SOUTH_CONTENTS = getValidChestContents( + ForgeDirection.SOUTH, + InversionConfig.southChestValidItems, + InversionConfig.southChestRequiredItems); + + CHEST_WEST_CONTENTS = getValidChestContents( + ForgeDirection.WEST, + InversionConfig.westChestValidItems, + InversionConfig.westChestRequiredItems); ItemInversionSigilActiveEvents eventHandler = new ItemInversionSigilActiveEvents(); MinecraftForge.EVENT_BUS.register(eventHandler); @@ -96,6 +99,73 @@ public ItemInversionSigilActive() { .register(eventHandler); } + private int parseItemMetaFromString(String string) { + try { + return Integer.parseInt(string); + } catch (NumberFormatException ignored) { + return -1; + } + } + + private HashSet getValidChestContents(ForgeDirection direction, String[] itemIds, + int itemReq) { + HashSet validChestContents = new HashSet<>(); + for (String itemId : itemIds) { + String[] itemIdSplit = itemId.split(":"); + ItemStack validChestItemStack; + if (itemIdSplit.length == 2) { + validChestItemStack = new ItemStack(GameRegistry.findItem(itemIdSplit[0], itemIdSplit[1])); + } else if (itemIdSplit.length == 3) { + Item validChestItem = GameRegistry.findItem(itemIdSplit[0], itemIdSplit[1]); + int validChestItemMeta = parseItemMetaFromString(itemIdSplit[2]); + validChestItemStack = new ItemStack(validChestItem, 1, validChestItemMeta); + if (validChestItem == Items.potionitem && InversionConfig.chestSplashPotionsValid) { + ItemStack splashPotion = new ItemStack(validChestItem, 1, validChestItemMeta + 8192); + boolean successfulAdd = validChestContents.add(new ItemStackBaseCompare(splashPotion)); + if (successfulAdd) { + FMLLog.log( + Level.DEBUG, + "Used splash potion %s as siege requirement from item id %s.", + splashPotion.getDisplayName(), + itemId); + } else { + FMLLog.log( + Level.DEBUG, + "Could not add splash potion %s as siege requirement from item id %s since it was a duplicate!", + splashPotion.getDisplayName(), + itemId); + } + } + } else { + FMLLog.log(Level.WARN, "Could not parse item id %s for the %s chest!", itemId, direction.toString()); + continue; + } + boolean successfulAdd = validChestContents.add(new ItemStackBaseCompare(validChestItemStack)); + if (successfulAdd) { + FMLLog.log( + Level.DEBUG, + "Used item %s as siege requirement from item id %s.", + validChestItemStack.getDisplayName(), + itemId); + } else { + FMLLog.log( + Level.DEBUG, + "Could not add item %s as siege requirement from item id %s since it was a duplicate!", + validChestItemStack.getDisplayName(), + itemId); + } + } + if (itemReq > validChestContents.size()) { + FMLLog.log( + Level.WARN, + "There are only %s valid items for the %s chest, but there are %s required items! The ritual will be impossible!", + validChestContents.size(), + direction.toString(), + itemReq); + } + return validChestContents; + } + private EntitySiegeProperty getProperties(EntityPlayer player) { return (EntitySiegeProperty) player.getExtendedProperties(EntitySiegeProperty.PROP_KEY); } @@ -209,18 +279,14 @@ private void startSiege(World world, int beaconX, int beaconY, int beaconZ, Enti curentity.setDead(); } } - for (int i = 0; i < LIGHTNING_POSITIONS.length; i++) { + for (int[] lightningPosition : LIGHTNING_POSITIONS) { EntityLightningBolt lightningBolt = new EntityLightningBolt( world, - beaconX + LIGHTNING_POSITIONS[i][0] + 0.5, + beaconX + lightningPosition[0] + 0.5, beaconY + 0.5, - beaconZ + LIGHTNING_POSITIONS[i][1] + 0.5); + beaconZ + lightningPosition[1] + 0.5); world.addWeatherEffect(lightningBolt); - world.setBlock( - beaconX + LIGHTNING_POSITIONS[i][0], - beaconY, - beaconZ + LIGHTNING_POSITIONS[i][1], - Blocks.air); + world.setBlock(beaconX + lightningPosition[0], beaconY, beaconZ + lightningPosition[1], Blocks.air); } } @@ -245,29 +311,22 @@ private void endSiege(boolean won, EntityPlayer player) { } } - private boolean checkChest(TileEntityChest chest, ItemStack[] itemsToCheck, int requiredAmount) { - int foundItemsAmount = 0; - boolean[] hasItem = new boolean[itemsToCheck.length]; + private boolean checkChest(TileEntityChest chest, HashSet itemsToCheck, int requiredAmount) { + HashSet confirmedItems = new HashSet<>(); for (int i = 0; i < chest.getSizeInventory(); i++) { ItemStack stack = chest.getStackInSlot(i); - for (int j = 0; j < itemsToCheck.length; j++) { - if (stack != null && ItemStack.areItemStacksEqual(stack, itemsToCheck[j])) { - hasItem[j] = true; - break; - } - } - } - for (int i = 0; i < itemsToCheck.length; i++) { - if (hasItem[i]) { - foundItemsAmount++; + if (stack == null) continue; + ItemStackBaseCompare stackCustomCompare = new ItemStackBaseCompare(stack); + if (itemsToCheck.contains(stackCustomCompare)) { + confirmedItems.add(stackCustomCompare); } } - return foundItemsAmount >= requiredAmount; + return confirmedItems.size() >= requiredAmount; } private boolean checkChestInDirection(ForgeDirection direction, int beaconX, int beaconY, int beaconZ, World world) { - ItemStack[] contents; + HashSet contents; int requiredAmount; if (direction == ForgeDirection.NORTH) { @@ -452,7 +511,7 @@ public void whenPlayerLeavesEnd(PlayerEvent.PlayerChangedDimensionEvent event) { } @SubscribeEvent(priority = EventPriority.NORMAL) - public void whenPlayerLeavesEnd2(PlayerEvent.PlayerRespawnEvent event) { + public void whenPlayerLeavesEndAlternate(PlayerEvent.PlayerRespawnEvent event) { if (getProperties(event.player).siege) { event.player.addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.leftEnd")); endSiege(false, event.player); @@ -550,7 +609,7 @@ public void getSubItems(Item p_150895_1_, CreativeTabs p_150895_2_, List tt, boolean p_77624_4_) { NBTTagCompound tag = stack.getTagCompound(); - if (tag != null && awakenedInversionDurability != 0) { + if (tag != null && InversionConfig.awakenedInversionDurability != 0) { tt.add( StatCollector .translateToLocalFormatted("item.inversion_sigil_active.desc", tag.getInteger(DURABILITY_NBT_KEY))); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemWateringCan.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemWateringCan.java index fe383b50..445bfec6 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemWateringCan.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemWateringCan.java @@ -188,7 +188,7 @@ public void accelerateGrowth(World world, int x, int y, int z) { int bz = z + dz; Block plant = world.getBlock(bx, by, bz); MinecraftForge.EVENT_BUS - .post(new WateringCanEvent(new BlockPos(bx, by, bz), new BlockPos(x, y, z), tier)); + .post(new WateringCanEvent(world, new BlockPos(bx, by, bz), new BlockPos(x, y, z), tier)); if (plant instanceof IGrowable || plant instanceof IPlantable || plant == mycelium) { world.scheduleBlockUpdateWithPriority(bx, by, bz, plant, 0, 1000); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemAntiParticulateShovel.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemAntiParticulateShovel.java index 1a0db32d..daebb88e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemAntiParticulateShovel.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemAntiParticulateShovel.java @@ -13,8 +13,9 @@ import net.minecraft.world.World; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.AntiParticulateShovelConfig; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; -public class ItemAntiParticulateShovel extends ItemSpade { +public class ItemAntiParticulateShovel extends ItemSpade implements ITranslucentItem { public ItemAntiParticulateShovel() { super(ToolMaterial.EMERALD); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java index 53c56d61..2724b069 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java @@ -12,10 +12,11 @@ import net.minecraft.util.StatCollector; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; import akka.japi.Pair; -public class ItemDestructionPickaxe extends ItemPickaxe { +public class ItemDestructionPickaxe extends ItemPickaxe implements ITranslucentItem { public ItemDestructionPickaxe() { super(ToolMaterial.EMERALD); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemEthericSword.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemEthericSword.java index b19c833c..ecd6409d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemEthericSword.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemEthericSword.java @@ -14,8 +14,9 @@ import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.EthericSwordConfig; import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorEntityLivingBase; import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorItemSword; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; -public class ItemEthericSword extends ItemSword { +public class ItemEthericSword extends ItemSword implements ITranslucentItem { public ItemEthericSword() { super(ToolMaterial.EMERALD); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGluttonsAxe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGourmandsAxe.java similarity index 77% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGluttonsAxe.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGourmandsAxe.java index 4398aba9..958dfbb6 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGluttonsAxe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGourmandsAxe.java @@ -16,24 +16,25 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; -import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GluttonsAxeConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GourmandsAxeConfig; import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorEntityZombie; import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorItemTool; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; -public class ItemGluttonsAxe extends ItemAxe { +public class ItemGourmandsAxe extends ItemAxe implements ITranslucentItem { - public ItemGluttonsAxe() { + public ItemGourmandsAxe() { super(ToolMaterial.EMERALD); - setTextureName("utilitiesinexcess:gluttons_axe"); - setUnlocalizedName("gluttons_axe"); - if (GluttonsAxeConfig.unbreakable) setMaxDamage(0); - ((AccessorItemTool) this).setDamageVsEntity(GluttonsAxeConfig.damageAgainstUndead); + setTextureName("utilitiesinexcess:gourmands_axe"); + setUnlocalizedName("gourmands_axe"); + if (GourmandsAxeConfig.unbreakable) setMaxDamage(0); + ((AccessorItemTool) this).setDamageVsEntity(GourmandsAxeConfig.damageAgainstUndead); } private static final Random particleRandom = new Random();; public static void spawnParticles(Entity e) { - if (!GluttonsAxeConfig.spawnParticles) return; + if (!GourmandsAxeConfig.spawnParticles) return; int ci = Potion.potionTypes[Potion.heal.getId()].getLiquidColor(); double d0 = (double) (ci >> 16 & 255) / 255.0D; double d1 = (double) (ci >> 8 & 255) / 255.0D; @@ -58,7 +59,7 @@ public void onUpdate(ItemStack s, World w, Entity e, int slot, boolean selected) if (e instanceof EntityPlayer p && selected) { if (w.getTotalWorldTime() % (2 * 20) == 0) { FoodStats fs = p.getFoodStats(); - fs.addStats(GluttonsAxeConfig.foodGain, GluttonsAxeConfig.saturationGain); + fs.addStats(GourmandsAxeConfig.foodGain, GourmandsAxeConfig.saturationGain); } } } @@ -80,10 +81,10 @@ public boolean onLeftClickEntity(ItemStack stack, EntityPlayer attacker, Entity } if (!target.isEntityUndead()) { - float amountToHeal = Math.min(GluttonsAxeConfig.maxHeal, target.getMaxHealth() - target.getHealth()); - if (amountToHeal == 0) if (GluttonsAxeConfig.useHungerAlways) attacker.addExhaustion(3 * 4); + float amountToHeal = Math.min(GourmandsAxeConfig.maxHeal, target.getMaxHealth() - target.getHealth()); + if (amountToHeal == 0) if (GourmandsAxeConfig.useHungerAlways) attacker.addExhaustion(3 * 4); else { - if (GluttonsAxeConfig.drainHp) if (attacker.getHealth() >= amountToHeal + 1) + if (GourmandsAxeConfig.drainHp) if (attacker.getHealth() >= amountToHeal + 1) attacker.setHealth(attacker.getHealth() - amountToHeal); else return true; target.setHealth(target.getHealth() + (amountToHeal + 1)); @@ -99,26 +100,26 @@ public boolean onLeftClickEntity(ItemStack stack, EntityPlayer attacker, Entity @Override public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { - if (GluttonsAxeConfig.unbreakable) + if (GourmandsAxeConfig.unbreakable) tooltip.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted("item.unbreakable.desc")); } // Unbreakable @Override public boolean isDamageable() { - if (GluttonsAxeConfig.unbreakable) return false; + if (GourmandsAxeConfig.unbreakable) return false; return super.isDamageable(); } @Override public boolean getIsRepairable(ItemStack stack, ItemStack repairMaterial) { - if (GluttonsAxeConfig.unbreakable) return false; + if (GourmandsAxeConfig.unbreakable) return false; return super.getIsRepairable(stack, repairMaterial); } @Override public boolean showDurabilityBar(ItemStack stack) { - if (GluttonsAxeConfig.unbreakable) return false; + if (GourmandsAxeConfig.unbreakable) return false; return super.showDurabilityBar(stack); } // diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemPrecisionShears.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemPrecisionShears.java index 80013203..3c3bc255 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemPrecisionShears.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemPrecisionShears.java @@ -16,8 +16,9 @@ import net.minecraftforge.common.ForgeHooks; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.PrecisionShearsConfig; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; -public class ItemPrecisionShears extends ItemShears { +public class ItemPrecisionShears extends ItemShears implements ITranslucentItem { public static final String COOLDOWN_NBT_TAG = "uie:cooldown"; private IIcon cooldownIcon; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java index 0756783b..9cdf4164 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java @@ -14,9 +14,10 @@ import com.fouristhenumber.utilitiesinexcess.ModBlocks; import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.ReversingHoeConfig; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; // TODO: Add new features to the reversing hoe -public class ItemReversingHoe extends ItemHoe { +public class ItemReversingHoe extends ItemHoe implements ITranslucentItem { public ItemReversingHoe() { super(ToolMaterial.EMERALD); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java index c35fe793..2ce5d2e0 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java @@ -165,6 +165,19 @@ public static void run() { 'p', Blocks.sticky_piston); + // Advanced Block Update Detector + addShapedRecipe( + ModBlocks.ADVANCED_BLOCK_UPDATE_DETECTOR, + "srs", + "rbr", + "srs", + 's', + Blocks.stone, + 'r', + Blocks.redstone_block, + 'b', + ModBlocks.BLOCK_UPDATE_DETECTOR); + // Trash Can (Items) addShapedRecipe( ModBlocks.TRASH_CAN_ITEM, @@ -348,17 +361,15 @@ public static void run() { // Temporal Gate addShapedRecipe( ModBlocks.END_OF_TIME_PORTAL, - "qgq", - "geg", - "qcq", + "qeq", + "ece", + "qeq", 'q', - Blocks.quartz_block, // TODO use burnt quartz replacement instead? + ModBlocks.DECORATIVE_BLOCKS.newItemStack(1, 2), 'e', - Items.ender_pearl, + ModBlocks.DECORATIVE_BLOCKS.newItemStack(1, 11), 'c', - Items.clock, - 'g', - Blocks.glass_pane); + Items.clock); // Trading Post addShapedRecipe( @@ -788,6 +799,17 @@ private static void loadEtherealGlassRecipes() { 'i', ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE)); + // Ineffable Glass + addShapedRecipe( + new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 0), + "ggg", + "gig", + "ggg", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0), + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE)); + // Dark Ethereal Glass addShapedRecipe( new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 2), @@ -805,6 +827,12 @@ private static void loadEtherealGlassRecipes() { new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 0), Blocks.redstone_torch); + // Ineffable Glass (Inverted) + addShapelessRecipe( + new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 4), + new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 1), + Blocks.redstone_torch); + // Dark Ethereal Glass (Inverted) addShapelessRecipe( new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 5), @@ -837,7 +865,11 @@ private static void loadBedrockiumRecipes() { } private static void loadGlassRecipes() { - // TODO: Smooth Glass reliant on "sandy glass" + // Smooth Glass + addFurnaceRecipe( + ModBlocks.DECORATIVE_BLOCKS.newItemStack(8, 3), + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0), + 0.5F); // Rimmed Glass addShapedRecipe( @@ -884,7 +916,7 @@ private static void loadGlassRecipes() { 'o', Blocks.obsidian); - // Latticed Glass + // Vortex Glass addShapedRecipe( ModBlocks.DECORATIVE_GLASS.newItemStack(5, 6), " g ", @@ -941,6 +973,14 @@ private static void loadGlassRecipes() { ModBlocks.DECORATIVE_GLASS.newItemStack(1, 10), 'o', Blocks.obsidian); + + // Latticed Glass + addShapedRecipe( + ModBlocks.DECORATIVE_GLASS.newItemStack(4, 12), + "gg", + "gg", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 2)); } private static void loadColoredBlockRecipes() { @@ -1031,9 +1071,9 @@ private static void loadInversionRecipes() { // Inverted Ingot (stable) addShapedRecipe(ModItems.INVERTED_INGOT.newItemStack(1, 1), "nnn", "nnn", "nnn", 'n', ModItems.INVERTED_NUGGET); - // Glutton's Axe + // Gourmand's Axe addShapedRecipe( - ModItems.GLUTTONS_AXE, + ModItems.GOURMANDS_AXE, "ii", "is", " s", diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/HeavenlyRingRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/HeavenlyRingRenderer.java index 6808739a..50a71f69 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/HeavenlyRingRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/HeavenlyRingRenderer.java @@ -36,19 +36,30 @@ public static float getNextAngle(float curAngle, boolean isFlying) { public static void render(int meta, float angle) { Tessellator t = Tessellator.instance; + int boundTexIndex = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + boolean blendWasEnabled = GL11.glIsEnabled(GL11.GL_BLEND); + Minecraft.getMinecraft() .getTextureManager() .bindTexture(TextureMap.locationItemsTexture); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + IIcon icon = ItemHeavenlyRing.wingIcons[meta]; - // 1.5 3 0.1 20 25 0.001 + // Derive scale + float scaleX = icon.getIconWidth() / 16.0F; + float scaleY = icon.getIconHeight() / 16.0F; + // Left wing GL11.glPushMatrix(); GL11.glTranslatef(0.0625F, -0.3125F, 0.125F); GL11.glRotatef(-(WING_MIN + angle), 0, 1, 0); if (Minecraft.getMinecraft().gameSettings.fancyGraphics) { + GL11.glScalef(scaleX, scaleY, 1.0F); GL11.glTranslatef(0, 1, 0); GL11.glRotatef(180, 1, 0, 0); ItemRenderer.renderItemIn2D( @@ -62,9 +73,9 @@ public static void render(int meta, float angle) { -0.03125F); } else { t.startDrawingQuads(); - t.addVertexWithUV(0, 1, 0, icon.getMinU(), icon.getMaxV()); - t.addVertexWithUV(1, 1, 0, icon.getMaxU(), icon.getMaxV()); - t.addVertexWithUV(1, 0, 0, icon.getMaxU(), icon.getMinV()); + t.addVertexWithUV(0, scaleY, 0, icon.getMinU(), icon.getMaxV()); + t.addVertexWithUV(scaleX, scaleY, 0, icon.getMaxU(), icon.getMaxV()); + t.addVertexWithUV(scaleX, 0, 0, icon.getMaxU(), icon.getMinV()); t.addVertexWithUV(0, 0, 0, icon.getMinU(), icon.getMinV()); t.draw(); } @@ -75,6 +86,7 @@ public static void render(int meta, float angle) { GL11.glTranslatef(-0.0625F, -0.3125F, 0.125F); GL11.glRotatef((-180 + WING_MIN) + angle, 0, 1, 0); if (Minecraft.getMinecraft().gameSettings.fancyGraphics) { + GL11.glScalef(scaleX, scaleY, 1.0F); GL11.glTranslatef(0, 1, 0); GL11.glRotatef(180, 1, 0, 0); ItemRenderer.renderItemIn2D( @@ -88,15 +100,15 @@ public static void render(int meta, float angle) { 0.03125F); } else { t.startDrawingQuads(); - t.addVertexWithUV(0, 1, 0, icon.getMinU(), icon.getMaxV()); - t.addVertexWithUV(1, 1, 0, icon.getMaxU(), icon.getMaxV()); - t.addVertexWithUV(1, 0, 0, icon.getMaxU(), icon.getMinV()); + t.addVertexWithUV(0, scaleY, 0, icon.getMinU(), icon.getMaxV()); + t.addVertexWithUV(scaleX, scaleY, 0, icon.getMaxU(), icon.getMaxV()); + t.addVertexWithUV(scaleX, 0, 0, icon.getMaxU(), icon.getMinV()); t.addVertexWithUV(0, 0, 0, icon.getMinU(), icon.getMinV()); t.draw(); } GL11.glPopMatrix(); - GL11.glDisable(GL11.GL_BLEND); + if (!blendWasEnabled) GL11.glDisable(GL11.GL_BLEND); GL11.glBindTexture(GL11.GL_TEXTURE_2D, boundTexIndex); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/WireframeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/WireframeRenderer.java index 74ab244d..d270d623 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/WireframeRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/WireframeRenderer.java @@ -34,7 +34,7 @@ public static void addCandidatePosition(BlockPos pos) { } public static void clearCandidatePositions() { - if (!candidatePositions.isEmpty()) candidatePositions.clear(); + candidatePositions.clear(); } @EventBusSubscriber.Condition diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityAdvancedBlockUpdateDetector.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityAdvancedBlockUpdateDetector.java new file mode 100644 index 00000000..46d8c272 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityAdvancedBlockUpdateDetector.java @@ -0,0 +1,145 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import java.util.Objects; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityAdvancedBlockUpdateDetector extends TileEntity { + + private boolean isProvidingPower = false; + private int pulseTimer = 0; + private final boolean[] scanningOnFace = { true, true, true, true, true, true }; + private final Block[] blockOnPreviousTick = new Block[ForgeDirection.VALID_DIRECTIONS.length]; + private final int[] blockMetadataOnPreviousTick = new int[ForgeDirection.VALID_DIRECTIONS.length]; + private final NBTTagCompound[] tileEntityNBTCompoundOnPreviousTick = new NBTTagCompound[ForgeDirection.VALID_DIRECTIONS.length]; + + public void toggleFace(int face) { + scanningOnFace[face] = !scanningOnFace[face]; + } + + public boolean getScanning(int face) { + return scanningOnFace[face]; + } + + @Override + public void updateEntity() { + if (worldObj.isRemote) { + return; + } + + if (isProvidingPower && pulseTimer > 0) { + pulseTimer--; + isProvidingPower = false; + updateBlockState(); + worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); + } + + for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + if (!scanningOnFace[i]) { + continue; + } + ForgeDirection neighborDirection = ForgeDirection.getOrientation(i); + Block blockOnCurrentTick = worldObj.getBlock( + xCoord + neighborDirection.offsetX, + yCoord + neighborDirection.offsetY, + zCoord + neighborDirection.offsetZ); + int blockMetadataOnCurrentTick = worldObj.getBlockMetadata( + xCoord + neighborDirection.offsetX, + yCoord + neighborDirection.offsetY, + zCoord + neighborDirection.offsetZ); + if (blockOnPreviousTick[i] == null) { + blockOnPreviousTick[i] = blockOnCurrentTick; + } else if (blockOnCurrentTick != blockOnPreviousTick[i] && !(blockOnCurrentTick == Blocks.redstone_wire)) { + sendRedstonePulse(); + blockOnPreviousTick[i] = blockOnCurrentTick; + blockMetadataOnPreviousTick[i] = blockMetadataOnCurrentTick; + break; + } else { + if (blockMetadataOnCurrentTick != blockMetadataOnPreviousTick[i]) { + sendRedstonePulse(); + blockOnPreviousTick[i] = blockOnCurrentTick; + blockMetadataOnPreviousTick[i] = blockMetadataOnCurrentTick; + break; + } + blockMetadataOnPreviousTick[i] = blockMetadataOnCurrentTick; + } + if (blockOnCurrentTick.hasTileEntity(blockMetadataOnPreviousTick[i])) { + if (!blockOnPreviousTick[i].hasTileEntity(blockMetadataOnPreviousTick[i])) { + sendRedstonePulse(); + blockOnPreviousTick[i] = blockOnCurrentTick; + break; + } + NBTTagCompound tileEntityNBTCompoundOnCurrentTick = new NBTTagCompound(); + worldObj + .getTileEntity( + xCoord + neighborDirection.offsetX, + yCoord + neighborDirection.offsetY, + zCoord + neighborDirection.offsetZ) + .writeToNBT(tileEntityNBTCompoundOnCurrentTick); + if (tileEntityNBTCompoundOnPreviousTick[i] == null) { + blockOnPreviousTick[i] = blockOnCurrentTick; + tileEntityNBTCompoundOnPreviousTick[i] = tileEntityNBTCompoundOnCurrentTick; + } else + if (!Objects.equals(tileEntityNBTCompoundOnCurrentTick, tileEntityNBTCompoundOnPreviousTick[i])) { + sendRedstonePulse(); + blockOnPreviousTick[i] = blockOnCurrentTick; + tileEntityNBTCompoundOnPreviousTick[i] = tileEntityNBTCompoundOnCurrentTick; + break; + } + tileEntityNBTCompoundOnPreviousTick[i] = tileEntityNBTCompoundOnCurrentTick; + } + blockOnPreviousTick[i] = blockOnCurrentTick; + } + } + + private void updateBlockState() { + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + int newMeta = isProvidingPower ? 1 : 0; + + if (meta != newMeta) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, newMeta, 3); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + super.readFromNBT(compound); + byte scannedFaces = compound.getByte("faces"); + for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + scanningOnFace[i] = (scannedFaces >> i) > 0; + } + isProvidingPower = compound.getBoolean("powered"); + pulseTimer = compound.getInteger("pulse"); + } + + @Override + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + byte scannedFaces = 0; + for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + scannedFaces += (byte) ((scanningOnFace[i] ? 1 : 0) << i); + } + compound.setByte("faces", scannedFaces); + compound.setBoolean("powered", isProvidingPower); + compound.setInteger("pulse", pulseTimer); + } + + private void sendRedstonePulse() { + if (!isProvidingPower) { + isProvidingPower = true; + pulseTimer++; + updateBlockState(); + worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); + worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, getBlockType(), 1); + } + } + + public int getOutputPower() { + return isProvidingPower ? 15 : 0; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityBlockUpdateDetector.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityBlockUpdateDetector.java index 03ecb843..29ac554f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityBlockUpdateDetector.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityBlockUpdateDetector.java @@ -17,6 +17,7 @@ public void updateEntity() { pulseTimer--; if (pulseTimer <= 0) { isProvidingPower = false; + updateBlockState(); worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); } } @@ -26,11 +27,22 @@ public void onNeighborUpdate() { if (!isProvidingPower) { isProvidingPower = true; pulseTimer++; + updateBlockState(); worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, getBlockType(), 1); } } + private void updateBlockState() { + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + int newMeta = isProvidingPower ? 1 : 0; + + if (meta != newMeta) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, newMeta, 3); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + public int getOutputPower() { return isProvidingPower ? 15 : 0; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityChandelier.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityChandelier.java new file mode 100644 index 00000000..5f43bfc9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityChandelier.java @@ -0,0 +1,29 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.tileentity.TileEntity; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; + +public class TileEntityChandelier extends TileEntity { + + @Override + public boolean canUpdate() { + return false; + } + + // placed or loaded from chunk + @Override + public void validate() { + super.validate(); + UtilitiesInExcess.proxy.mobSpawnBlockChecks + .put(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, BlockConfig.chandelier.chandelierLightRange); + } + + // removed or unloaded + @Override + public void invalidate() { + UtilitiesInExcess.proxy.mobSpawnBlockChecks.remove(worldObj.provider.dimensionId, xCoord, yCoord, zCoord); + super.invalidate(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityGigaTorch.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityGigaTorch.java new file mode 100644 index 00000000..4ee8ab1e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityGigaTorch.java @@ -0,0 +1,29 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.tileentity.TileEntity; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; + +public class TileEntityGigaTorch extends TileEntity { + + @Override + public boolean canUpdate() { + return false; + } + + // placed or loaded from chunk + @Override + public void validate() { + super.validate(); + UtilitiesInExcess.proxy.mobSpawnBlockChecks + .put(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, BlockConfig.gigaTorch.gigaTorchRange); + } + + // removed or unloaded + @Override + public void invalidate() { + UtilitiesInExcess.proxy.mobSpawnBlockChecks.remove(worldObj.provider.dimensionId, xCoord, yCoord, zCoord); + super.invalidate(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRedstoneClock.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRedstoneClock.java index 301216d6..d8273603 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRedstoneClock.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRedstoneClock.java @@ -7,51 +7,46 @@ public class TileEntityRedstoneClock extends TileEntity { private boolean powered = false; private boolean outputOn = false; - private int timer = 0; - private final int TIMER_FREQUENCY_IN_TICKS = 20; + private int timer = 20; @Override public void updateEntity() { if (worldObj.isRemote) return; - if (!powered) { - timer = (timer + 1) % TIMER_FREQUENCY_IN_TICKS; - boolean newState = (timer < 2); - if (newState != outputOn) { - outputOn = newState; - notifyNeighbors(); - } - } else { - if (outputOn) { - outputOn = false; - notifyNeighbors(); - } - timer = 0; + boolean prevOutput = outputOn; + + outputOn = false; + // Clock does not deactivate during the period where it emits redstone, in order to prevent the clock + // from disabling itself. + timer--; + if (timer <= 1) { + outputOn = true; + if (timer <= 0) timer = 20; + } else if (powered) { + timer = 20; } + + if (prevOutput != outputOn) updateBlockState(); + } public void onInputChanged() { - boolean nowPowered = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); - if (nowPowered != powered) { - powered = nowPowered; - if (powered) { - outputOn = false; - notifyNeighbors(); - } - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord), 1); + powered = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); + } + + private void updateBlockState() { + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + int newMeta = outputOn ? 1 : 0; + + if (meta != newMeta) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, newMeta, 3); } } - // Return 0 or 15 for our block’s power output public int getOutputPower() { return outputOn ? 15 : 0; } - private void notifyNeighbors() { - worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord)); - } - @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanFluid.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanFluid.java index e712ef73..016f9f21 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanFluid.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanFluid.java @@ -26,7 +26,6 @@ import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; -import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; public class TileEntityTrashCanFluid extends TileEntity implements IGuiHolder, ISidedInventory, IFluidHandler { @@ -87,7 +86,7 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet new ParentWidget<>().coverChildren() .topRelAnchor(0, 1) .child( - IKey.str(StatCollector.translateToLocal("tile.trash_can_fluid.name")) + IKey.str(StatCollector.translateToLocal("gui.title.trash_can_fluid.name")) .asWidget() .marginLeft(5) .marginRight(5) @@ -130,7 +129,6 @@ public void writeToNBT(NBTTagCompound compound) { @Override public void readFromNBT(NBTTagCompound compound) { - UtilitiesInExcess.LOG.info(compound); super.readFromNBT(compound); if (compound.hasKey("slotIn")) { ItemStack slotIn = new ItemStack(Items.feather, 1); @@ -191,14 +189,10 @@ public boolean isUseableByPlayer(EntityPlayer player) { } @Override - public void openInventory() { - - } + public void openInventory() {} @Override - public void closeInventory() { - - } + public void closeInventory() {} @Override public boolean isItemValidForSlot(int index, ItemStack stack) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanItem.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanItem.java index 0c8bd21e..48e636f0 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanItem.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanItem.java @@ -2,9 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.StatCollector; @@ -17,13 +15,11 @@ import com.cleanroommc.modularui.utils.item.InvWrapper; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.ParentWidget; -import com.cleanroommc.modularui.widgets.layout.Grid; import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; import com.cleanroommc.modularui.widgets.slot.SlotGroup; -import com.fouristhenumber.utilitiesinexcess.utils.VoidingInventory; -public class TileEntityTrashCanItem extends TileEntity implements IGuiHolder, ISidedInventory { +public class TileEntityTrashCanItem extends TileEntity implements IGuiHolder, IInventory { @Override public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { @@ -33,42 +29,27 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet ModularPanel panel = new ModularPanel("panel"); panel.bindPlayerInventory(); - // Add title panel.child( new ParentWidget<>().coverChildren() .topRelAnchor(0, 1) .child( - IKey.str(StatCollector.translateToLocal("tile.trash_can_item.name")) + IKey.str(StatCollector.translateToLocal("gui.title.trash_can.name")) .asWidget() .marginLeft(5) .marginRight(5) .marginTop(5) .marginBottom(-15))); - // Create voiding inventory - IInventory inv = new VoidingInventory(1, "Trash Can"); - IItemHandler itemHandler = new InvWrapper(inv); + IItemHandler itemHandler = new InvWrapper(this); ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); - // Add item slot panel.child( - new Grid().coverChildren() - .pos(79, 34) - .mapTo(1, 1, index -> new ItemSlot().slot(slot))); + new ItemSlot().slot(slot) + .pos(79, 34)); return panel; } - @Override - public void writeToNBT(NBTTagCompound compound) { - super.writeToNBT(compound); - } - - @Override - public void readFromNBT(NBTTagCompound compound) { - super.readFromNBT(compound); - } - @Override public int getSizeInventory() { return 999; @@ -94,7 +75,7 @@ public void setInventorySlotContents(int index, ItemStack stack) {} @Override public String getInventoryName() { - return StatCollector.translateToLocal("tile.trash_can_item.name"); + return StatCollector.translateToLocal("gui.title.trash_can.name"); } @Override @@ -104,7 +85,7 @@ public boolean hasCustomInventoryName() { @Override public int getInventoryStackLimit() { - return 999; + return Integer.MAX_VALUE; } @Override @@ -113,32 +94,13 @@ public boolean isUseableByPlayer(EntityPlayer player) { } @Override - public void openInventory() { - - } + public void openInventory() {} @Override - public void closeInventory() { - - } + public void closeInventory() {} @Override public boolean isItemValidForSlot(int index, ItemStack stack) { return true; } - - @Override - public int[] getAccessibleSlotsFromSide(int p_94128_1_) { - return new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - } - - @Override - public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { - return true; - } - - @Override - public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { - return false; - } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGenerator.java index 63398a9c..00a2e531 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGenerator.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGenerator.java @@ -230,7 +230,7 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .tooltipDynamic( tt -> tt.add( StatCollector.translateToLocalFormatted( - "gui.energy.tooltip", + "gui.tooltip.energy-max", formatNumber(energySyncer.getIntValue()), formatNumber(maxEnergySyncer.getIntValue()))))); @@ -246,7 +246,9 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet panel.childIf( showGenerationRate(), - IKey.dynamic(() -> (multSyncer.getIntValue() * rftSyncer.getIntValue() + " RF/t")) + IKey.dynamic( + () -> (multSyncer.getIntValue() * rftSyncer.getIntValue() + + StatCollector.translateToLocal("gui.tooltip.energy-tick"))) .asWidget() .pos(10, 62)); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPItems.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPItems.java new file mode 100644 index 00000000..969c8774 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPItems.java @@ -0,0 +1,60 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemDisabled; +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.UEMultipartItem; +import com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig; + +import cpw.mods.fml.common.registry.GameRegistry; + +public enum FMPItems { + + UE_MULTI_PART(true, new UEMultipartItem(), "multi_part_item"); + + public static final FMPItems[] VALUES = values(); + + public static void init() { + for (FMPItems item : VALUES) { + if (item.isEnabled()) { + item.theItem.setCreativeTab(UtilitiesInExcess.uieTab); + GameRegistry.registerItem(item.get(), item.name); + } else if (ItemConfig.registerDisabledItems) GameRegistry.registerItem(item.disabledVersion, item.name); + } + } + + private final boolean isEnabled; + private final Item theItem; + private final String name; + private final ItemDisabled disabledVersion; + + FMPItems(boolean enabled, Item item, String name) { + this.isEnabled = enabled; + theItem = item; + this.name = name; + if (ItemConfig.registerDisabledItems) disabledVersion = new ItemDisabled(theItem); + else disabledVersion = null; + } + + public boolean isEnabled() { + return isEnabled; + } + + public Item get() { + return theItem; + } + + public ItemStack newItemStack() { + return newItemStack(1); + } + + public ItemStack newItemStack(int count) { + return newItemStack(count, 0); + } + + public ItemStack newItemStack(int count, int meta) { + return new ItemStack(this.get(), count, meta); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPRecipeLoader.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPRecipeLoader.java new file mode 100644 index 00000000..0c73e062 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPRecipeLoader.java @@ -0,0 +1,72 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.common.recipe.DisableableItemStack; + +import codechicken.microblock.EdgeMicroClass; +import codechicken.microblock.FaceMicroClass; +import codechicken.microblock.ItemMicroPart; +import codechicken.microblock.MicroMaterialRegistry; +import scala.Tuple2; + +public class FMPRecipeLoader { + + public static void run() { + + for (Tuple2 material : MicroMaterialRegistry.getIdMap()) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setString("mat", material._1()); + + // Fence + addShapedRecipe( + withTag(FMPItems.UE_MULTI_PART.newItemStack(2, 0), tag), + "pPp", + "pPp", + " P ", + 'p', + ItemMicroPart.create((EdgeMicroClass.getClassId() << 8) | 2, material._1()), // Post + 'P', + ItemMicroPart.create((EdgeMicroClass.getClassId() << 8) | 4, material._1()) // Pillar + ); + + // Wall + addShapedRecipe( + withTag(FMPItems.UE_MULTI_PART.newItemStack(5, 1), tag), + " B ", + "SBS", + "SBS", + 'B', + MicroMaterialRegistry.getMaterial(material._1()) + .getItem(), // Block the material is derived from + 'S', + ItemMicroPart.create((FaceMicroClass.getClassId() << 8) | 4, material._1()) // Slab + ); + + // Sphere + addShapedRecipe( + withTag(FMPItems.UE_MULTI_PART.newItemStack(1, 2), tag), + "CSC", + "SUS", + "CSC", + 'S', + ItemMicroPart.create((FaceMicroClass.getClassId() << 8) | 4, material._1()), // Slab + 'B', + ModBlocks.INVERTED_BLOCK.newItemStack(), + 'C', + ItemMicroPart.create((FaceMicroClass.getClassId() << 8) | 1, material._1()) // Cover + ); + } + } + + public static ItemStack withTag(ItemStack stack, NBTTagCompound tag) { + stack.setTagCompound(tag); + return stack; + } + + private static boolean addShapedRecipe(Object outputObject, Object... params) { + return DisableableItemStack.addShapedRecipe(outputObject, params); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/ConnectablePart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/ConnectablePart.java new file mode 100644 index 00000000..9adc4ab9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/ConnectablePart.java @@ -0,0 +1,242 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import static net.minecraft.client.renderer.RenderGlobal.drawOutlinedBoundingBox; + +import java.util.EnumMap; +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MovingObjectPosition; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import codechicken.lib.data.MCDataOutput; +import codechicken.lib.vec.Cuboid6; +import codechicken.multipart.BlockMultipart; +import codechicken.multipart.TMultiPart; +import codechicken.multipart.TileMultipart; +import it.unimi.dsi.fastutil.Pair; + +public abstract class ConnectablePart extends MaterialBasedPart { + + public static final Map iteratorKey; + static { + Map map = new EnumMap<>(ForgeDirection.class); + + map.put( + ForgeDirection.DOWN, + new ForgeDirection[] { ForgeDirection.NORTH, ForgeDirection.WEST, ForgeDirection.SOUTH, + ForgeDirection.EAST }); + map.put( + ForgeDirection.UP, + new ForgeDirection[] { ForgeDirection.SOUTH, ForgeDirection.WEST, ForgeDirection.NORTH, + ForgeDirection.EAST }); + map.put( + ForgeDirection.EAST, + new ForgeDirection[] { ForgeDirection.NORTH, ForgeDirection.DOWN, ForgeDirection.SOUTH, + ForgeDirection.UP }); + map.put( + ForgeDirection.WEST, + new ForgeDirection[] { ForgeDirection.NORTH, ForgeDirection.UP, ForgeDirection.SOUTH, + ForgeDirection.DOWN }); + map.put( + ForgeDirection.NORTH, + new ForgeDirection[] { ForgeDirection.UP, ForgeDirection.WEST, ForgeDirection.DOWN, ForgeDirection.EAST }); + map.put( + ForgeDirection.SOUTH, + new ForgeDirection[] { ForgeDirection.DOWN, ForgeDirection.WEST, ForgeDirection.UP, ForgeDirection.EAST }); + + iteratorKey = map; + } + + // What direction is "down" for the connectable part + public ForgeDirection downDirection; + + ConnectablePart(int side) { + this.downDirection = ForgeDirection.getOrientation(side); + } + + // Is there a better way to implement this? + protected boolean doPartsOccludeDirection(ForgeDirection side) { + for (TMultiPart part : tile().jPartList()) { + if (part != this) { + for (Cuboid6 cube : part.getSubParts()) { + if (cube.intersects(getConnectionInDirection(side))) { + return true; + } + } + } + } + return false; + } + + public abstract Cuboid6 getConnectionInDirection(ForgeDirection side); + + // TODO CACHE THESE RESULTS + public boolean canConnectOnSide(ForgeDirection side) { + if (tile() == null) { + return false; + } + if (doPartsOccludeDirection(side)) { + return false; + } + int offsetX = x() + side.offsetX; + int offsetY = y() + side.offsetY; + int offsetZ = z() + side.offsetZ; + Block block = world().getBlock(offsetX, offsetY, offsetZ); + if (block.isSideSolid(world(), offsetX, offsetY, offsetZ, side.getOpposite()) && block.renderAsNormalBlock() + && block.getMaterial() + .isOpaque()) { + return true; + } else if (block instanceof BlockMultipart) { + if (world().getTileEntity(offsetX, offsetY, offsetZ) instanceof TileMultipart mpTile) { + for (TMultiPart part : mpTile.jPartList()) { + if (part instanceof ConnectablePart cPart && part.getClass() == this.getClass() + && cPart.downDirection == this.downDirection + && !cPart.doPartsOccludeDirection(side.getOpposite())) { + return true; + } + } + return false; + } + } + return false; + } + + public int getConnectionMask() { + int mask = 0b0000; + ForgeDirection[] iteratorList = iteratorKey.get(downDirection); + for (int i = 0; i < iteratorList.length; i++) { + if (canConnectOnSide(iteratorList[i])) { + mask = mask | 1 << i; + } + } + return mask; + } + + public int getCullMask(int relativeDirection) { + return switch (relativeDirection) { + case (1), (3) -> transformCullMask(0b110000); + case (0), (2) -> transformCullMask(0b001100); + default -> 0; + }; + } + + private int transformCullMask(int mask) { + switch (downDirection) { + case DOWN, UP -> { + return mask; + } + case NORTH, SOUTH -> { + if (mask == 0b001100) { + return mask >> 2; + } + return mask; + } + case WEST, EAST -> { + if (mask == 0b110000) { + return mask >> 4; + } + return mask; + } + case UNKNOWN -> { + throw new IllegalArgumentException( + "Switch falloff in transforming the cullmask in a connectable part."); + } + } + return mask; + } + + @Override + public void save(NBTTagCompound tag) { + super.save(tag); + tag.setInteger("side", this.downDirection.ordinal()); + } + + @Override + public void load(NBTTagCompound tag) { + super.load(tag); + downDirection = ForgeDirection.getOrientation(tag.getInteger("side")); + } + + @Override + public void writeDesc(MCDataOutput packet) { + super.writeDesc(packet); + packet.writeInt(this.downDirection.ordinal()); + } + + protected int indexInFrame(ForgeDirection side) { + ForgeDirection[] frame = iteratorKey.get(downDirection); + for (int i = 0; i < frame.length; i++) { + if (frame[i] == side) { + return i; + } + } + throw new IllegalArgumentException( + "Somehow multipart connectable is trying to access a direction outside of it's frame!"); + } + + public boolean drawConnecableHighLight(MovingObjectPosition hit, EntityPlayer player, float frame, + Iterable> highlightCuboidList) { + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.4F); + GL11.glLineWidth(2.0F); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDepthMask(false); + double dx = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) frame; + double dy = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) frame; + double dz = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double) frame; + + ForgeDirection[] iteratorList = iteratorKey.get(downDirection); + + for (Pair cubeWithDirInfo : highlightCuboidList) { + AxisAlignedBB bb = cubeWithDirInfo.second() + .toAABB() + .offset(x(), y(), z()); + if (cubeWithDirInfo.first() != -1) { + switch (iteratorList[cubeWithDirInfo.first()]) { + case UP: { + bb.minY += 0.004F; + break; + } + case DOWN: { + bb.maxY -= 0.004F; + break; + } + case NORTH: { + bb.maxZ -= 0.004F; + break; + } + case SOUTH: { + bb.minZ += 0.004F; + break; + } + case EAST: { + bb.minX += 0.004F; + break; + } + case WEST: { + bb.maxX -= 0.004F; + break; + } + } + } + drawOutlinedBoundingBox( + bb.expand(0.002F, 0.002F, 0.002F) + .getOffsetBoundingBox(-dx, -dy, -dz), + -1); + } + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + + return true; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/Content.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/Content.java new file mode 100644 index 00000000..689571a8 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/Content.java @@ -0,0 +1,65 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import net.minecraft.nbt.NBTTagCompound; + +import codechicken.lib.data.MCDataInput; +import codechicken.microblock.MicroMaterialRegistry; +import codechicken.multipart.MultiPartRegistry; +import codechicken.multipart.TMultiPart; + +// This is basically the part factory. +public class Content implements MultiPartRegistry.IPartFactory2 { + + public static final String[] partNames = new String[] { FencePart.name, WallPart.name, SpherePart.name }; + public static final Map partMap = new HashMap<>(); + + public static final Set sidedParts = new HashSet<>(); + + public void init() { + for (int i = 0; i < partNames.length; i++) { + partMap.put(partNames[i], i); + } + sidedParts.add(WallPart.name); + sidedParts.add(FencePart.name); + MultiPartRegistry.registerParts(this, partNames); + } + + public UEMultipart createUEMultiPart(boolean isClient, int material, int side, String name) { + switch (name) { + case ("ue_fence"): { + return new FencePart(material, side); + } + case ("ue_wall"): { + return new WallPart(material, side); + } + case ("ue_sphere"): { + return new SpherePart(material); + } + } + return null; + } + + // Called on the server + @Override + public TMultiPart createPart(String name, NBTTagCompound nbt) { + return createUEMultiPart( + false, + MicroMaterialRegistry.materialID(nbt.getString("material")), + nbt.getInteger("side"), + name); + } + + // Called on the client + @Override + public TMultiPart createPart(String name, MCDataInput packet) { + if (sidedParts.contains(name)) { + return createUEMultiPart(true, MicroMaterialRegistry.readMaterialID(packet), packet.readInt(), name); + } + return createUEMultiPart(true, MicroMaterialRegistry.readMaterialID(packet), 0, name); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/FencePart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/FencePart.java new file mode 100644 index 00000000..faf6e12f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/FencePart.java @@ -0,0 +1,107 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartFenceRenderingHelper.PRECOMPUTED_BOUNDS; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartFenceRenderingHelper.PRECOMPUTED_COLLISION; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartFenceRenderingHelper.PRECOMPUTED_MODEL; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartFenceRenderingHelper.itemConnectorMiddle; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartFenceRenderingHelper.itemConnectorNotch; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartFenceRenderingHelper.postBounds; + +import java.util.Arrays; +import java.util.Collections; +import java.util.stream.Collectors; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.MovingObjectPosition; +import net.minecraftforge.common.util.ForgeDirection; + +import codechicken.lib.raytracer.IndexedCuboid6; +import codechicken.lib.vec.Cuboid6; +import codechicken.lib.vec.Vector3; +import codechicken.microblock.MicroblockRender; +import it.unimi.dsi.fastutil.Pair; + +public class FencePart extends ConnectablePart { + + public static final String name = "ue_fence"; + + public FencePart(int material, int side) { + super(side); + this.material = material; + } + + @Override + public Cuboid6 getConnectionInDirection(ForgeDirection side) { + return PRECOMPUTED_BOUNDS.get(downDirection)[15][indexInFrame(side) + 1].second(); + } + + @Override + public String getType() { + return name; + } + + @Override + public void render(Vector3 position, int pass) { + // Render post + if (pass == -1) { + // Posts + MicroblockRender.renderCuboid(position.add(0, 0, -.375), getIMaterial(), pass, postBounds, 0); + MicroblockRender.renderCuboid(position.add(0, 0, .750), getIMaterial(), pass, postBounds, 0); + + // Connectors & Notches TODO notches would be nice to remove if I could figure out how to wrap the texture + // with MicroblockRender + // Bottom Connector + MicroblockRender.renderCuboid(position.add(0, .3125, -.375), getIMaterial(), pass, itemConnectorMiddle, 0); + MicroblockRender.renderCuboid(position.add(0, 0, -.125), getIMaterial(), pass, itemConnectorNotch, 0); + MicroblockRender.renderCuboid(position.add(0, 0, 1.125), getIMaterial(), pass, itemConnectorNotch, 0); + + // Top Connector + MicroblockRender.renderCuboid(position.add(0, .5, -1), getIMaterial(), pass, itemConnectorMiddle, 0); + MicroblockRender.renderCuboid(position.add(0, 0, -.125), getIMaterial(), pass, itemConnectorNotch, 0); + MicroblockRender.renderCuboid(position.add(0, 0, 1.125), getIMaterial(), pass, itemConnectorNotch, 0); + } else { + Pair[] models = PRECOMPUTED_MODEL.get(this.downDirection)[getConnectionMask()]; + for (int i = 0; i < models.length; i++) { + if (i == 0) { + MicroblockRender.renderCuboid(position, getIMaterial(), pass, models[i].second(), 0); + } + MicroblockRender + .renderCuboid(position, getIMaterial(), pass, models[i].second(), getCullMask(models[i].first())); + } + } + } + + @Override + public Iterable getSubParts() { + return Arrays.stream(PRECOMPUTED_BOUNDS.get(downDirection)[getConnectionMask()]) + .map(t -> new IndexedCuboid6(0, t.second())) + .collect(Collectors.toList()); + } + + @Override + public Iterable getCollisionBoxes() { + return Arrays.asList(PRECOMPUTED_COLLISION.get(downDirection)[getConnectionMask()]); + } + + @Nonnull + @Override + public Cuboid6 getBounds() { + return postBounds; + } + + @Override + public Iterable getOcclusionBoxes() { + return Collections.singleton(PRECOMPUTED_BOUNDS.get(downDirection)[0][0].second()); + } + + @Override + public boolean drawHighlight(MovingObjectPosition hit, EntityPlayer player, float frame) { + return drawConnecableHighLight( + hit, + player, + frame, + Arrays.asList(PRECOMPUTED_BOUNDS.get(downDirection)[getConnectionMask()])); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/MaterialBasedPart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/MaterialBasedPart.java new file mode 100644 index 00000000..4c42ea2d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/MaterialBasedPart.java @@ -0,0 +1,64 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; + +import codechicken.lib.data.MCDataOutput; +import codechicken.lib.vec.Vector3; +import codechicken.microblock.MicroMaterialRegistry; + +public abstract class MaterialBasedPart extends UEMultipart { + + protected int material; + + @Override + public void save(NBTTagCompound tag) { + tag.setString("mat", MicroMaterialRegistry.materialName(material)); + } + + @Override + public void load(NBTTagCompound tag) { + material = MicroMaterialRegistry.materialID(tag.getString("mat")); + } + + @Override + public void writeDesc(MCDataOutput packet) { + MicroMaterialRegistry.writeMaterialID(packet, material); + } + + MicroMaterialRegistry.IMicroMaterial getIMaterial() { + return MicroMaterialRegistry.getMaterial(material); + } + + @Override + public IIcon getBreakingIcon(Object subPart, int side) { + return MicroMaterialRegistry.getMaterial(material) + .getBreakingIcon(side); + } + + @Override + public IIcon getBrokenIcon(int side) { + MicroMaterialRegistry.IMicroMaterial material = getIMaterial(); + if (material == null) { + return Blocks.stone.getIcon(0, 0); + } + return material.getBreakingIcon(side); + } + + @Override + public boolean renderStatic(Vector3 position, int pass) { + if (getIMaterial().canRenderInPass(pass)) { + render(position, pass); + return true; + } + return false; + } + + @Override + public ItemStack pickItem(MovingObjectPosition hit) { + return UEMultipartItem.createStack(material, Content.partMap.get(this.getType())); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/PipeCoverPart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/PipeCoverPart.java new file mode 100644 index 00000000..2d912cfd --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/PipeCoverPart.java @@ -0,0 +1,27 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import codechicken.lib.vec.Cuboid6; +import codechicken.lib.vec.Vector3; + +public class PipeCoverPart extends MaterialBasedPart { + + @Override + public String getType() { + return "ue_pipecover"; + } + + @Override + public void render(Vector3 position, int pass) { + + } + + @Override + public Cuboid6 getBounds() { + return null; + } + + @Override + public Iterable getOcclusionBoxes() { + return null; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/SpherePart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/SpherePart.java new file mode 100644 index 00000000..375b678f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/SpherePart.java @@ -0,0 +1,50 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.SphereRenderingHelper.RenderMicroMaterialSphere; + +import java.util.Collections; + +import codechicken.lib.raytracer.IndexedCuboid6; +import codechicken.lib.vec.Cuboid6; +import codechicken.lib.vec.Vector3; + +public class SpherePart extends MaterialBasedPart { + + public static final Cuboid6 Bounds = new Cuboid6(0.125, 0.125, 0.125, 0.875, 0.875, 0.875); + + public final static String name = "ue_sphere"; + + public SpherePart(int material) { + this.material = material; + } + + @Override + public String getType() { + return name; + } + + @Override + public void render(Vector3 position, int pass) { + RenderMicroMaterialSphere(position, pass, getIMaterial(), world()); + } + + @Override + public Cuboid6 getBounds() { + return Bounds; + } + + @Override + public Iterable getOcclusionBoxes() { + return Collections.singleton(Bounds); + } + + @Override + public Iterable getCollisionBoxes() { + return Collections.singleton(Bounds); + } + + @Override + public Iterable getSubParts() { + return Collections.singleton(new IndexedCuboid6(0, Bounds)); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipart.java new file mode 100644 index 00000000..29ba1173 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipart.java @@ -0,0 +1,39 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import java.util.Collections; + +import net.minecraft.client.particle.EffectRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; + +import codechicken.lib.vec.Vector3; +import codechicken.multipart.IconHitEffects; +import codechicken.multipart.JIconHitEffects; +import codechicken.multipart.JNormalOcclusion; +import codechicken.multipart.NormalOcclusionTest; +import codechicken.multipart.TMultiPart; + +public abstract class UEMultipart extends TMultiPart implements JIconHitEffects, JNormalOcclusion { + + public abstract void render(Vector3 position, int pass); + + @Override + public Iterable getDrops() { + return Collections.singletonList(UEMultipartItem.createStack(this)); + } + + @Override + public void addDestroyEffects(EffectRenderer renderer) { + IconHitEffects.addDestroyEffects(this, renderer); + } + + @Override + public void addHitEffects(MovingObjectPosition movingObjectPosition, EffectRenderer renderer) { + IconHitEffects.addHitEffects(this, movingObjectPosition, renderer); + } + + @Override + public boolean occlusionTest(TMultiPart part) { + return NormalOcclusionTest.apply(this, part) && super.occlusionTest(part); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipartItem.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipartItem.java new file mode 100644 index 00000000..748b9707 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipartItem.java @@ -0,0 +1,135 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.Content.partNames; + +import java.util.Arrays; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPItems; + +import codechicken.lib.raytracer.RayTracer; +import codechicken.lib.vec.BlockCoord; +import codechicken.microblock.MicroMaterialRegistry; +import codechicken.multipart.TMultiPart; +import codechicken.multipart.TileMultipart; + +// Most of this is just ripped from FMP ngl +public class UEMultipartItem extends Item { + + public UEMultipartItem() { + setUnlocalizedName("ue_microPartItem"); + setHasSubtypes(true); + } + + @Override + public String getItemStackDisplayName(ItemStack stack) { + MicroMaterialRegistry.IMicroMaterial material = getMaterial(stack); + int damage = getDamage(stack); + if (material == null || damage > partNames.length) { + return "Unnamed"; + } + return StatCollector.translateToLocalFormatted(partNames[damage] + ".name", material.getLocalizedName()); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List listOfStacks) { + Arrays.stream(MicroMaterialRegistry.getIdMap()) + .forEach(t -> { + for (int i = 0; i < partNames.length; i++) { + listOfStacks.add(createStack(t._1, i)); + } + }); + } + + @Override + public boolean onItemUse(ItemStack item, EntityPlayer player, World world, int x, int y, int z, int side, + float hitX, float hitY, float hitZ) { + int materialID = getMaterialID(item); + int damage = item.getItemDamage(); + if (materialID < 0 || damage > partNames.length) { + return false; + } + + MovingObjectPosition hit = RayTracer.retraceBlock(world, player, x, y, z); + BlockCoord position = new BlockCoord(x, y, z).offset(side); + TMultiPart potentialPart = new Content() + .createUEMultiPart(false, materialID, ForgeDirection.OPPOSITES[side], partNames[damage]); + if (hit != null && hit.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK + && TileMultipart.canPlacePart(world, position, potentialPart)) { + if (!world.isRemote) { + TileMultipart.addPart(world, position, potentialPart); + if (!player.capabilities.isCreativeMode) item.stackSize--; + + Block.SoundType sound = MicroMaterialRegistry.getMaterial(materialID) + .getSound(); + if (sound != null) world.playSoundEffect( + x + 0.5d, + y + 0.5d, + z + 0.5d, + sound.func_150496_b(), + (sound.getVolume() + 1.0f) / 2.0f, + sound.getPitch() * 0.8f); + } + + return true; + } + + return false; + } + + public static ItemStack createStack(String material, int damage) { + ItemStack stack = new ItemStack(FMPItems.UE_MULTI_PART.get(), 1, damage); + stack.stackTagCompound = new NBTTagCompound(); + stack.getTagCompound() + .setString("mat", material); + return stack; + } + + public static ItemStack createStack(UEMultipart part) { + if (part instanceof MaterialBasedPart matPart) { + return createStack(matPart.material, Content.partMap.get(part.getType())); + } + return null; + } + + public static ItemStack createStack(int materialID, int damage) { + return createStack(MicroMaterialRegistry.materialName(materialID), damage); + } + + public static MicroMaterialRegistry.IMicroMaterial getMaterial(ItemStack stack) { + if (stack.hasTagCompound()) { + if (!stack.getTagCompound() + .hasKey("mat")) { + return null; + } + return MicroMaterialRegistry.getMaterial( + stack.getTagCompound() + .getString("mat")); + } + return null; + } + + public static int getMaterialID(ItemStack stack) { + if (stack.hasTagCompound()) { + if (!stack.getTagCompound() + .hasKey("mat")) { + return 0; + } + return MicroMaterialRegistry.materialID( + stack.getTagCompound() + .getString("mat")); + } + return 0; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/WallPart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/WallPart.java new file mode 100644 index 00000000..b4d74eba --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/WallPart.java @@ -0,0 +1,127 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper.PRECOMPUTED_BOUNDS; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper.PRECOMPUTED_COLLISION; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper.PRECOMPUTED_MODEL; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper.PRECOMPUTED_SIMPLE_MODEL; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper.connectorNS; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper.postBounds; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util.CuboidUtils.Rotate90AboutYBlockCenterPos; + +import java.util.Arrays; +import java.util.Collections; +import java.util.stream.Collectors; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.MovingObjectPosition; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper; + +import codechicken.lib.raytracer.IndexedCuboid6; +import codechicken.lib.vec.Cuboid6; +import codechicken.lib.vec.Vector3; +import codechicken.microblock.MicroblockRender; +import it.unimi.dsi.fastutil.Pair; + +public class WallPart extends ConnectablePart { + + public static final String name = "ue_wall"; + + public WallPart(int material, int side) { + super(side); + this.material = material; + } + + @Override + public String getType() { + return name; + } + + @Override + public void render(Vector3 position, int pass) { + // Render post + if (pass == -1) { + // Post + MicroblockRender.renderCuboid(position, getIMaterial(), pass, postBounds, 0); + // Connector + MicroblockRender + .renderCuboid(position, getIMaterial(), pass, Rotate90AboutYBlockCenterPos(connectorNS, 1), 0); + } else { + int mask = getConnectionMask(); + if (mask == 0b1010) { + Cuboid6 model = PRECOMPUTED_SIMPLE_MODEL.get(this.downDirection)[1]; + MicroblockRender.renderCuboid(position, getIMaterial(), pass, model, getCullMask(1)); + } else if (mask == 0b0101) { + Cuboid6 model = PRECOMPUTED_SIMPLE_MODEL.get(this.downDirection)[0]; + MicroblockRender.renderCuboid(position, getIMaterial(), pass, model, getCullMask(0)); + } else { + Pair[] models = PRECOMPUTED_MODEL.get(this.downDirection)[mask]; + for (int i = 0; i < models.length; i++) { + if (i == 0) { + MicroblockRender.renderCuboid(position, getIMaterial(), pass, models[i].second(), 0); + } else { + MicroblockRender.renderCuboid( + position, + getIMaterial(), + pass, + models[i].second(), + getCullMask(models[i].first())); + } + } + } + } + } + + @Override + public Cuboid6 getConnectionInDirection(ForgeDirection side) { + return PRECOMPUTED_BOUNDS.get(downDirection)[15][indexInFrame(side) + 1].second(); + } + + @Override + public Iterable getSubParts() { + int mask = getConnectionMask(); + if (mask == 0b1010) { + return Collections.singleton(new IndexedCuboid6(0, PRECOMPUTED_SIMPLE_MODEL.get(this.downDirection)[1])); + + } else if (mask == 0b0101) { + return Collections.singleton(new IndexedCuboid6(0, PRECOMPUTED_SIMPLE_MODEL.get(this.downDirection)[0])); + } + return Arrays.stream(PRECOMPUTED_BOUNDS.get(downDirection)[mask]) + .map(t -> new IndexedCuboid6(0, t.second())) + .collect(Collectors.toList()); + } + + @Override + public Iterable getCollisionBoxes() { + return Arrays.asList(PRECOMPUTED_COLLISION.get(downDirection)[getConnectionMask()]); + } + + @Nonnull + @Override + public Cuboid6 getBounds() { + return MultipartWallRenderingHelper.postBounds; + } + + @Override + public Iterable getOcclusionBoxes() { + return Collections.singleton(MultipartWallRenderingHelper.PRECOMPUTED_BOUNDS.get(downDirection)[0][0].second()); + } + + @Override + public boolean drawHighlight(MovingObjectPosition hit, EntityPlayer player, float frame) { + int mask = getConnectionMask(); + Iterable> highlightCuboidList; + if (mask == 0b1010) { + highlightCuboidList = Collections.singleton(Pair.of(-1, PRECOMPUTED_SIMPLE_MODEL.get(downDirection)[1])); + } else if (mask == 0b0101) { + highlightCuboidList = Collections.singleton(Pair.of(-1, PRECOMPUTED_SIMPLE_MODEL.get(downDirection)[0])); + } else { + highlightCuboidList = Arrays.asList(PRECOMPUTED_BOUNDS.get(downDirection)[mask]); + } + return drawConnecableHighLight(hit, player, frame, highlightCuboidList); + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartFenceRenderingHelper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartFenceRenderingHelper.java new file mode 100644 index 00000000..422f173b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartFenceRenderingHelper.java @@ -0,0 +1,153 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util.CuboidUtils.Rotate90AboutYBlockCenterPos; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util.CuboidUtils.RotateModel; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraftforge.common.util.ForgeDirection; + +import codechicken.lib.vec.Cuboid6; +import it.unimi.dsi.fastutil.Pair; + +public class MultipartFenceRenderingHelper { + + // Selection bounds defaulted to North side (-Z) + public static final Cuboid6 postBounds = new Cuboid6(.375, 0, .375, .625, 1, .625); + public static final Cuboid6 connectorBounds = new Cuboid6(0.4375, .375, 0, 0.5625, 0.9375, .375); + + // Defaulted on the North side (-Z) These are for rendering + public static final Cuboid6 connector = new Cuboid6(0.4375, 0.75, 0, 0.5625, 0.9375, 0.375); + public static final Cuboid6 connectorNS = new Cuboid6(0.4375, 0.75, 0, 0.5625, 0.9375, 1); + + // Collision bounds + public static final Cuboid6 postCollisionBounds = new Cuboid6(.375, 0, .375, .625, 1.5, .625); + public static final Cuboid6 connectorCollisionBounds = new Cuboid6(.375, 0, 0, .625, 1.5, .375); + + // Because of some vanilla weirdness we need to make two copies one for bounds that are vertical (as seen above). + // and one for bounds that are non-vertical. Rubberbanding happens if you don't do this. + public static final Cuboid6 getPostCollisionBoundsHorizontal = new Cuboid6(.375, 0, .375, .625, 1.0, .625); + public static final Cuboid6 connectorCollisionBoundsHorizontal = new Cuboid6(.375, 0, 0, .625, 1.0, .375); + + // Item rendering helpers + public static final Cuboid6 itemConnectorMiddle = new Cuboid6(.4375, 0, .25, .5625, .125, .75); + public static final Cuboid6 itemConnectorNotch = new Cuboid6(.4375, 0, 0, .5625, .125, .125); + + // Compute model/bounds/collision all at class initialization + public static final Map[][]> PRECOMPUTED_MODEL; + public static final Map[][]> PRECOMPUTED_BOUNDS; + public static final Map PRECOMPUTED_COLLISION; + + static { + PRECOMPUTED_MODEL = new HashMap<>(); + + // Make our base model in the down direction + Pair[][] baseModels = new Pair[16][]; + for (int i = 0; i < 16; i++) { + Pair[] values = new Pair[1 + 2 * Integer.bitCount(i)]; + values[0] = Pair.of(-1, postBounds); + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + 2 * count] = Pair.of(j, Rotate90AboutYBlockCenterPos(connector, j)); + values[2 + 2 * count] = Pair.of( + j, + Rotate90AboutYBlockCenterPos( + connector.copy() + .offset(new Cuboid6(0, -.375, 0, 0, -.375, 0)), + j)); + count++; + } + + } + } + baseModels[i] = values; + } + + PRECOMPUTED_MODEL.put(ForgeDirection.DOWN, baseModels); + + PRECOMPUTED_BOUNDS = new HashMap<>(); + + // Make our base bounds in the down direction + Pair[][] baseBounds = new Pair[16][]; + for (int i = 0; i < 16; i++) { + Pair[] values = new Pair[1 + Integer.bitCount(i)]; + values[0] = Pair.of(-1, postBounds); + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Pair.of(j, Rotate90AboutYBlockCenterPos(connectorBounds, j)); + count++; + } + + } + } + baseBounds[i] = values; + } + + PRECOMPUTED_BOUNDS.put(ForgeDirection.DOWN, baseBounds); + + PRECOMPUTED_COLLISION = new HashMap<>(); + + // Make our base bounds in the down direction + Cuboid6[][] baseCollision = new Cuboid6[16][]; + for (int i = 0; i < 16; i++) { + Cuboid6[] values = new Cuboid6[1 + Integer.bitCount(i)]; + values[0] = postCollisionBounds; + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Rotate90AboutYBlockCenterPos(connectorCollisionBounds, j); + count++; + } + + } + } + baseCollision[i] = values; + } + + // See comment about why we are doing this twice. + Cuboid6[][] baseCollisionNonVert = new Cuboid6[16][]; + for (int i = 0; i < 16; i++) { + Cuboid6[] values = new Cuboid6[1 + Integer.bitCount(i)]; + values[0] = getPostCollisionBoundsHorizontal; + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Rotate90AboutYBlockCenterPos(connectorCollisionBoundsHorizontal, j); + count++; + } + + } + } + baseCollisionNonVert[i] = values; + } + + PRECOMPUTED_COLLISION.put(ForgeDirection.DOWN, baseCollision); + + // The direction maps to the direction that it's place into. So if the post is hooked into the + // ground the forge direction is actually down. + for (int i = 0; i < ForgeDirection.values().length - 1; i++) { + Pair[][] modelList = new Pair[16][]; + Pair[][] boundsList = new Pair[16][]; + Cuboid6[][] collisionList = new Cuboid6[16][]; + ForgeDirection direction = ForgeDirection.getOrientation(i); + if (direction == ForgeDirection.DOWN) { + continue; + } + for (int j = 0; j < baseModels.length; j++) { + modelList[j] = RotateModel(baseModels[j], direction); + boundsList[j] = RotateModel(baseBounds[j], direction); + collisionList[j] = RotateModel(baseCollisionNonVert[j], direction); + } + PRECOMPUTED_MODEL.put(direction, modelList); + PRECOMPUTED_BOUNDS.put(direction, boundsList); + PRECOMPUTED_COLLISION.put(direction, collisionList); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartWallRenderingHelper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartWallRenderingHelper.java new file mode 100644 index 00000000..f2602c38 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartWallRenderingHelper.java @@ -0,0 +1,159 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util.CuboidUtils.Rotate90AboutYBlockCenterPos; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util.CuboidUtils.RotateCube; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util.CuboidUtils.RotateModel; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraftforge.common.util.ForgeDirection; + +import codechicken.lib.vec.Cuboid6; +import it.unimi.dsi.fastutil.Pair; + +public class MultipartWallRenderingHelper { + + // Selection bounds defaulted to North side (-Z) + public static final Cuboid6 postBounds = new Cuboid6(.25, 0, .25, .75, 1, .75); + public static final Cuboid6 connectorBounds = new Cuboid6(0.3125, 0, 0, 0.6875, 0.8125, .25); + public static final Cuboid6 connectorNS = new Cuboid6(0.3125, 0, 0, 0.6875, 0.8125, 1.0); + + // Collision bounds + public static final Cuboid6 postCollisionBounds = new Cuboid6(.25, 0, .25, .75, 1.5, .75); + public static final Cuboid6 connectorCollisionBounds = new Cuboid6(0.3125, 0, 0, 0.6875, 1.5, .25); + + // Because of some vanilla weirdness we need to make two copies one for bounds that are vertical (as seen above). + // and one for bounds that are non-vertical. Rubberbanding happens if you don't do this. + public static final Cuboid6 getPostCollisionBoundsHorizontal = new Cuboid6(.25, 0, .25, .75, 1.0, .75); + public static final Cuboid6 connectorCollisionBoundsHorizontal = new Cuboid6(0.3125, 0, 0, 0.6875, 1.0, .25); + + // Compute model/bounds/collision all at class initialization + public static final Map[][]> PRECOMPUTED_MODEL; + public static final Map[][]> PRECOMPUTED_BOUNDS; + public static final Map PRECOMPUTED_COLLISION; + public static final Map PRECOMPUTED_SIMPLE_MODEL; + + static { + // BASIC MODEL + PRECOMPUTED_MODEL = new HashMap<>(); + + // Make our base model in the down direction + Pair[][] baseModels = new Pair[16][]; + for (int i = 0; i < 16; i++) { + Pair[] values = new Pair[1 + Integer.bitCount(i)]; + values[0] = Pair.of(-1, postBounds); + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Pair.of(j, Rotate90AboutYBlockCenterPos(connectorBounds, j)); + count++; + } + } + } + baseModels[i] = values; + } + + PRECOMPUTED_MODEL.put(ForgeDirection.DOWN, baseModels); + + // SIMPLE MODEL + PRECOMPUTED_SIMPLE_MODEL = new HashMap<>(); + + Cuboid6[] baseSimpleModel = new Cuboid6[2]; + baseSimpleModel[0] = connectorNS; + baseSimpleModel[1] = Rotate90AboutYBlockCenterPos(connectorNS, 1); + + PRECOMPUTED_SIMPLE_MODEL.put(ForgeDirection.DOWN, baseSimpleModel); + + // BOUNDS + PRECOMPUTED_BOUNDS = new HashMap<>(); + + // Make our base bounds in the down direction + Pair[][] baseBounds = new Pair[16][]; + for (int i = 0; i < 16; i++) { + Pair[] values = new Pair[1 + Integer.bitCount(i)]; + values[0] = Pair.of(-1, postBounds); + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Pair.of(j, Rotate90AboutYBlockCenterPos(connectorBounds, j)); + count++; + } + + } + } + baseBounds[i] = values; + } + + PRECOMPUTED_BOUNDS.put(ForgeDirection.DOWN, baseBounds); + + // COLLISION + PRECOMPUTED_COLLISION = new HashMap<>(); + + // Make our base bounds in the down direction + Cuboid6[][] baseCollision = new Cuboid6[16][]; + for (int i = 0; i < 16; i++) { + Cuboid6[] values = new Cuboid6[1 + Integer.bitCount(i)]; + values[0] = postCollisionBounds; + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Rotate90AboutYBlockCenterPos(connectorCollisionBounds, j); + count++; + } + + } + } + baseCollision[i] = values; + } + + // See comment about why we are doing this twice. + Cuboid6[][] baseCollisionNonVert = new Cuboid6[16][]; + for (int i = 0; i < 16; i++) { + Cuboid6[] values = new Cuboid6[1 + Integer.bitCount(i)]; + values[0] = getPostCollisionBoundsHorizontal; + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Rotate90AboutYBlockCenterPos(connectorCollisionBoundsHorizontal, j); + count++; + } + + } + } + baseCollisionNonVert[i] = values; + } + + PRECOMPUTED_COLLISION.put(ForgeDirection.DOWN, baseCollision); + + // The direction maps to the direction that it's place into. So if the post is hooked into the + // ground the forge direction is actually down. + for (int i = 0; i < ForgeDirection.values().length - 1; i++) { + Pair[][] modelList = new Pair[16][]; + Pair[][] boundsList = new Pair[16][]; + Cuboid6[][] collisionList = new Cuboid6[16][]; + Cuboid6[] simpleModelList = new Cuboid6[2]; + ForgeDirection direction = ForgeDirection.getOrientation(i); + if (direction == ForgeDirection.DOWN) { + continue; + } + for (int j = 0; j < baseModels.length; j++) { + modelList[j] = RotateModel(baseModels[j], direction); + boundsList[j] = RotateModel(baseBounds[j], direction); + collisionList[j] = RotateModel(baseCollisionNonVert[j], direction); + } + simpleModelList[0] = RotateCube(baseSimpleModel[0], direction); + simpleModelList[1] = RotateCube(baseSimpleModel[1], direction); + + PRECOMPUTED_MODEL.put(direction, modelList); + PRECOMPUTED_BOUNDS.put(direction, boundsList); + PRECOMPUTED_COLLISION.put(direction, collisionList); + PRECOMPUTED_SIMPLE_MODEL.put(direction, simpleModelList); + } + + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/SphereRenderingHelper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/SphereRenderingHelper.java new file mode 100644 index 00000000..27648f38 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/SphereRenderingHelper.java @@ -0,0 +1,525 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block; + +import java.util.Arrays; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import codechicken.lib.vec.Vector3; +import codechicken.microblock.BlockMicroMaterial; +import codechicken.microblock.GrassMicroMaterial; +import codechicken.microblock.MicroMaterialRegistry; +import it.unimi.dsi.fastutil.Pair; + +public class SphereRenderingHelper { + + // Verts are ordered as follows for easy UV mapping [latitude][longitude] + static Vector3[][] verts; + static Pair[] UVs = new Pair[34]; + // Wil do a 2 part slerp. First part to generate the equitorial verts, then the second + // part will generate the longitudinal verts. Have to do this because antipodal points break slerp. + static { + Vector3[] baseEquitorialVert = new Vector3[] { new Vector3(0, 0, 1), new Vector3(1, 0, 0), + new Vector3(0, 0, -1), new Vector3(-1, 0, 0), }; + + // Slerp along equitorial latitudes + Vector3[] equitorialVerts = new Vector3[16]; + for (int j = 0; j < 4; j++) { + Vector3 p0 = baseEquitorialVert[j]; + Vector3 p1; + if (j != 3) { + p1 = baseEquitorialVert[j + 1]; + } else { + p1 = baseEquitorialVert[0]; + } + + int offsetIndex = j * 4; + equitorialVerts[offsetIndex] = p0.copy(); + for (int i = 1; i < 4; i++) { + double t = (double) i / 4; + equitorialVerts[offsetIndex + i] = slerp(p0.copy(), p1.copy(), t); + } + } + + Vector3[] polarVerts = new Vector3[] { new Vector3(0, -1, 0), new Vector3(0, 1, 0) }; + + // Slerp along longitude and assemble verts + int latBands = 9; // 2 pole verts + 7 band verts + int longBands = 16; + + // Note that we use longBAnds for latitude positions in parts of this algorithm and vice versa. + // This is because longitudinal bands are located on specific latitudes. + + verts = new Vector3[latBands][longBands]; + for (int latPos = 0; latPos < longBands; latPos++) { + verts[0][latPos] = polarVerts[0].copy() + .multiply(.375); + verts[latBands - 1][latPos] = polarVerts[1].copy() + .multiply(.375); + } + + // Bottom + for (int latitude = 0; latitude < longBands; latitude++) { + for (int longitude = 1; longitude < 4; longitude++) { + double t = (double) longitude / 4; + verts[longitude][latitude] = slerp(polarVerts[0].copy(), equitorialVerts[latitude].copy(), t) + .multiply(.375); + } + } + + // Equator + for (int i = 0; i < equitorialVerts.length; i++) { + verts[4][i] = equitorialVerts[i].copy() + .multiply(.375); + } + + // Top + for (int latitude = 0; latitude < longBands; latitude++) { + for (int longitude = 1; longitude < 4; longitude++) { + double t = (double) longitude / 4; + verts[longitude + 4][latitude] = slerp(equitorialVerts[latitude].copy(), polarVerts[1].copy(), t) + .multiply(.375); + } + } + + // Calculate UV points for the polar aligned faces + // Calculations are between 0-1 for UVs + // Assume center lies at U, V = 0.5, 0.5 and it's not included. + + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 2; j++) { + int side = i / 4; + int subSideOrdinal = i % 4; + double U; + double V; + switch (side) { + case (0): { + if (j == 0) { + U = 0.0; + V = (double) subSideOrdinal / 4; + } else { + U = 0.25; + V = 0.25 + (double) subSideOrdinal / 8; + } + break; + } + case (1): { + if (j == 0) { + U = (double) subSideOrdinal / 4; + V = 1.0; + } else { + U = 0.25 + (double) subSideOrdinal / 8; + V = 0.75; + } + break; + } + case (2): { + if (j == 0) { + U = 1.0; + V = 1.0 - ((double) subSideOrdinal / 4); + } else { + U = 0.75; + V = 0.75 - ((double) subSideOrdinal / 8); + } + break; + } + case (3): { + if (j == 0) { + U = 1.0 - ((double) subSideOrdinal / 4); + V = 0.0; + } else { + U = 0.75 - ((double) subSideOrdinal / 8); + V = 0.25; + } + break; + } + default: { + U = 0.0; + V = 0.0; + } + } + UVs[(i * 2) + j] = Pair.of(U, V); + } + + // For ease of iteration we make a copy of 0 and 1 at 32 and 33 for coordinate wrapping. + UVs[32] = UVs[0]; + UVs[33] = UVs[1]; + } + } + + public static Vector3 slerp(Vector3 p0, Vector3 p1, double t) { + double omega = Math.acos(p0.dotProduct(p1)); + return p0.multiply((Math.sin((1 - t) * omega)) / (Math.sin(omega))) + .add(p1.multiply((Math.sin(omega * t) / (Math.sin(omega))))); + } + + public static void RenderMicroMaterialSphere(Vector3 position, int pass, MicroMaterialRegistry.IMicroMaterial mat, + World world) { + double ox = position.x + 0.5; + double oy = position.y + 0.5; + double oz = position.z + 0.5; + Tessellator tess = Tessellator.instance; + if (mat instanceof GrassMicroMaterial gMat) { + IIcon[] icons = gMat.icont().icons; + int color = getBlockColor(gMat.block(), world, (int) position.x, (int) position.y, (int) position.z, pass); + int brightness; + if (pass != -1) { + brightness = gMat.block() + .getMixedBrightnessForBlock(world, (int) position.x, (int) position.y, (int) position.z); + } else { + brightness = 0xF000F0; + } + // Base + RenderSphereBottom(tess, icons[0], ox, oy, oz, brightness, 0xFFFFFFFF); + RenderSphereSides(tess, Arrays.copyOfRange(icons, 2, icons.length), ox, oy, oz, brightness, 0xFFFFFFFF); + + // Do biome overlays + IIcon[] overlayArr = new IIcon[4]; + Arrays.fill(overlayArr, gMat.sideIconT().icon); + RenderSphereSides(tess, overlayArr, ox, oy, oz, brightness, color); + RenderSphereTop(tess, icons[1], ox, oy, oz, brightness, color); + } else if (mat instanceof BlockMicroMaterial bMat) { + IIcon[] icons = bMat.icont().icons; + int color = getBlockColor(bMat.block(), world, (int) position.x, (int) position.y, (int) position.z, pass); + int brightness; + if (pass != -1) { + brightness = bMat.block() + .getMixedBrightnessForBlock(world, (int) position.x, (int) position.y, (int) position.z); + } else { + brightness = 0xF000F0; + } + RenderSphere(tess, icons, ox, oy, oz, brightness, color); + } + } + + public static void RenderSphereTop(Tessellator tess, IIcon topIcon, double x, double y, double z, int brightness, + int color) { + double uWindow = topIcon.getMaxU() - topIcon.getMinU(); + double vWindow = topIcon.getMaxV() - topIcon.getMinV(); + double minU = topIcon.getMinU(); + double minV = topIcon.getMinV(); + + int UVCounter = 0; + int UVCounterMiddle = 1; + for (int longitude = 6; longitude < 8; longitude++) { + if (longitude == 7) { + tess.draw(); // Empty tess buffer + tess.startDrawing(GL11.GL_TRIANGLES); // STart with triangles. + } + for (int latitude = 0; latitude < 16; latitude++) { + // using non axis aligned faces so we need special uv for each vertex. + double u1, u2, u3, u4, v1, v2, v3, v4; + + // I know these look funny how they're assigned, but because of how + // the UVs are ordered when they are generated. It works. + if (longitude == 6) { + u1 = minU + UVs[UVCounter].first() * uWindow; + v1 = minV + UVs[UVCounter++].second() * vWindow; + u4 = minU + UVs[UVCounter].first() * uWindow; + v4 = minV + UVs[UVCounter++].second() * vWindow; + u2 = minU + UVs[UVCounter].first() * uWindow; + v2 = minV + UVs[UVCounter++].second() * vWindow; + u3 = minU + UVs[UVCounter].first() * uWindow; + v3 = minV + UVs[UVCounter++].second() * vWindow; + UVCounter -= 2; + + int lon0 = longitude; + int lon1 = longitude + 1; + int lat0 = WrapNumber(0, 15, latitude + 2); + int lat1 = WrapNumber(0, 15, latitude + 3); + + Vector3 vert0 = SphereRenderingHelper.verts[lon0][lat0].copy() + .add(x, y, z); + Vector3 vert1 = SphereRenderingHelper.verts[lon0][lat1].copy() + .add(x, y, z); + Vector3 vert2 = SphereRenderingHelper.verts[lon1][lat1].copy() + .add(x, y, z); + Vector3 vert3 = SphereRenderingHelper.verts[lon1][lat0].copy() + .add(x, y, z); + + renderSphericFaceVanilla( + tess, + vert0, + vert1, + vert2, + vert3, + u1, + v1, + u2, + v2, + u3, + v3, + u4, + v4, + brightness, + color); + } else { + + u1 = minU + UVs[UVCounterMiddle].first() * uWindow; + v1 = minV + UVs[UVCounterMiddle].second() * vWindow; + UVCounterMiddle += 2; + u2 = minU + UVs[UVCounterMiddle].first() * uWindow; + v2 = minV + UVs[UVCounterMiddle].second() * vWindow; + + u3 = minU + (0.5 * uWindow); + v3 = minV + (0.5 * vWindow); + + int lon0 = longitude; + int lon1 = longitude + 1; + int lat0 = WrapNumber(0, 15, latitude + 2); + int lat1 = WrapNumber(0, 15, latitude + 3); + + Vector3 vert0 = SphereRenderingHelper.verts[lon0][lat0].copy() + .add(x, y, z); + Vector3 vert1 = SphereRenderingHelper.verts[lon0][lat1].copy() + .add(x, y, z); + Vector3 vert2 = SphereRenderingHelper.verts[lon1][lat0].copy() + .add(x, y, z); + + renderSphericFaceVanilla(tess, vert0, vert1, vert2, u1, v1, u2, v2, u3, v3, brightness, color); + } + } + } + tess.draw(); // Draw our triangles + tess.startDrawingQuads(); // go back to drawing quads once done. + } + + public static void RenderSphereBottom(Tessellator tess, IIcon bottomIcon, double x, double y, double z, + int brightness, int color) { + double uWindow = bottomIcon.getMaxU() - bottomIcon.getMinU(); + double vWindow = bottomIcon.getMaxV() - bottomIcon.getMinV(); + double minU = bottomIcon.getMinU(); + double minV = bottomIcon.getMinV(); + + int UVCounter = 0; + int UVCounterMiddle = 1; + for (int longitude = 1; longitude > -1; longitude--) { + if (longitude == 0) { + tess.draw(); // Empty tess buffer + tess.startDrawing(GL11.GL_TRIANGLES); // STart with triangles. + } + for (int latitude = 0; latitude < 16; latitude++) { + // using non axis aligned faces so we need special uv for each vertex. + double u1, u2, u3, u4, v1, v2, v3, v4; + + // I know these look funny how they're assigned, but because of how + // the UVs are ordered when they are generated. It works. + if (longitude == 1) { + u1 = minU + UVs[UVCounter].first() * uWindow; + v1 = minV + UVs[UVCounter++].second() * vWindow; + u4 = minU + UVs[UVCounter].first() * uWindow; + v4 = minV + UVs[UVCounter++].second() * vWindow; + u2 = minU + UVs[UVCounter].first() * uWindow; + v2 = minV + UVs[UVCounter++].second() * vWindow; + u3 = minU + UVs[UVCounter].first() * uWindow; + v3 = minV + UVs[UVCounter++].second() * vWindow; + UVCounter -= 2; + + int lon0 = longitude + 1; + int lon1 = longitude; + int lat0 = WrapNumber(0, 15, latitude + 2); + int lat1 = WrapNumber(0, 15, latitude + 3); + + Vector3 vert0 = SphereRenderingHelper.verts[lon0][lat0].copy() + .add(x, y, z); + Vector3 vert1 = SphereRenderingHelper.verts[lon0][lat1].copy() + .add(x, y, z); + Vector3 vert2 = SphereRenderingHelper.verts[lon1][lat1].copy() + .add(x, y, z); + Vector3 vert3 = SphereRenderingHelper.verts[lon1][lat0].copy() + .add(x, y, z); + + renderSphericFaceVanilla( + tess, + vert0, + vert3, + vert2, + vert1, + u1, + v1, + u4, + v4, + u3, + v3, + u2, + v2, + brightness, + color); + } else { + u1 = minU + UVs[UVCounterMiddle].first() * uWindow; + v1 = minV + UVs[UVCounterMiddle].second() * vWindow; + UVCounterMiddle += 2; + u2 = minU + UVs[UVCounterMiddle].first() * uWindow; + v2 = minV + UVs[UVCounterMiddle].second() * vWindow; + + u3 = minU + (0.5 * uWindow); + v3 = minV + (0.5 * vWindow); + + int lon0 = longitude + 1; + int lon1 = longitude; + int lat0 = WrapNumber(0, 15, latitude + 2); + int lat1 = WrapNumber(0, 15, latitude + 3); + + Vector3 vert0 = SphereRenderingHelper.verts[lon0][lat0].copy() + .add(x, y, z); + Vector3 vert1 = SphereRenderingHelper.verts[lon0][lat1].copy() + .add(x, y, z); + Vector3 vert2 = SphereRenderingHelper.verts[lon1][lat0].copy() + .add(x, y, z); + + renderSphericFaceVanilla(tess, vert0, vert2, vert1, u1, v1, u3, v3, u2, v2, brightness, color); + } + } + } + tess.draw(); // Draw our triangles + tess.startDrawingQuads(); // go back to drawing quads once done. + } + + public static void RenderSphereSides(Tessellator tess, IIcon[] sideIcons, double x, double y, double z, + int brightness, int color) { + for (int latitude = 0; latitude < 16; latitude++) { + for (int longitude = 2; longitude < 6; longitude++) { + int side = latitude / 4; + switch (side) { + case (0): { + side = ForgeDirection.SOUTH.ordinal() - 2; + break; + } + case (1): { + side = ForgeDirection.EAST.ordinal() - 2; + break; + } + case (2): { + side -= 2; + break; // Side is already at north ordinal + } + case (3): { + side = ForgeDirection.WEST.ordinal() - 2; + break; + } + } + + double uWindow = sideIcons[side].getMaxU() - sideIcons[side].getMinU(); + double vWindow = sideIcons[side].getMaxV() - sideIcons[side].getMinV(); + + int k = latitude & 3; + int min = (k + 2) & 3; + int max = min + 1; + + double u1 = sideIcons[side].getMinU() + (uWindow * ((double) min / 4)); + double u2 = sideIcons[side].getMinU() + (uWindow * ((double) max / 4)); + double v1 = sideIcons[side].getMaxV() - (vWindow * ((double) (longitude - 1) / 4)); + double v2 = sideIcons[side].getMaxV() - (vWindow * ((double) (longitude - 2) / 4)); + + int lon0 = longitude; + int lon1 = longitude + 1; + int lat0 = latitude; + int lat1 = WrapNumber(0, 15, latitude + 1); + + Vector3 vert0 = SphereRenderingHelper.verts[lon0][lat0].copy() + .add(x, y, z); + Vector3 vert1 = SphereRenderingHelper.verts[lon0][lat1].copy() + .add(x, y, z); + Vector3 vert2 = SphereRenderingHelper.verts[lon1][lat1].copy() + .add(x, y, z); + Vector3 vert3 = SphereRenderingHelper.verts[lon1][lat0].copy() + .add(x, y, z); + + renderSphericFaceVanilla(tess, vert0, vert1, vert2, vert3, u1, v1, u2, v2, brightness, color); + } + } + } + + // Most blocks can just use this + public static void RenderSphere(Tessellator tess, IIcon[] icons, double x, double y, double z, int brightness, + int color) { + RenderSphereTop(tess, icons[1], x, y, z, brightness, color); + RenderSphereSides(tess, Arrays.copyOfRange(icons, 2, icons.length), x, y, z, brightness, color); + RenderSphereBottom(tess, icons[0], x, y, z, brightness, color); + } + + public static int getBlockColor(Block block, World world, int x, int y, int z, int pass) { + if (pass == -1) { + return block.getBlockColor(); + } else { + return block.colorMultiplier(world, x, y, z); + } + } + + public static void renderSphericFaceVanilla(Tessellator tess, Vector3 vert0, Vector3 vert1, Vector3 vert2, + Vector3 vert3, double u1, double v1, double u2, double v2, int brightness, int color) { + tess.setBrightness(brightness); + + Vector3 n = vert0.copy() + .normalize(); + float shade = (float) (0.6 + 0.4 * Math.max(0, n.y)); + + float cr = ((color >> 16) & 0xFF) / 255f; + float cg = ((color >> 8) & 0xFF) / 255f; + float cb = (color & 0xFF) / 255f; + + tess.setColorOpaque_F(cr * shade, cg * shade, cb * shade); + tess.setNormal((float) n.x, (float) n.y, (float) n.z); + + tess.addVertexWithUV(vert0.x, vert0.y, vert0.z, u1, v2); + tess.addVertexWithUV(vert1.x, vert1.y, vert1.z, u2, v2); + tess.addVertexWithUV(vert2.x, vert2.y, vert2.z, u2, v1); + tess.addVertexWithUV(vert3.x, vert3.y, vert3.z, u1, v1); + } + + public static void renderSphericFaceVanilla(Tessellator tess, Vector3 vert0, Vector3 vert1, Vector3 vert2, + Vector3 vert3, double u1, double v1, double u2, double v2, double u3, double v3, double u4, double v4, + int brightness, int color) { + tess.setBrightness(brightness); + + Vector3 n = vert0.copy() + .normalize(); + float shade = (float) (0.6 + 0.4 * Math.max(0, n.y)); + + float cr = ((color >> 16) & 0xFF) / 255f; + float cg = ((color >> 8) & 0xFF) / 255f; + float cb = (color & 0xFF) / 255f; + + tess.setColorOpaque_F(cr * shade, cg * shade, cb * shade); + tess.setNormal((float) n.x, (float) n.y, (float) n.z); + + tess.addVertexWithUV(vert0.x, vert0.y, vert0.z, u1, v1); + tess.addVertexWithUV(vert1.x, vert1.y, vert1.z, u2, v2); + tess.addVertexWithUV(vert2.x, vert2.y, vert2.z, u3, v3); + tess.addVertexWithUV(vert3.x, vert3.y, vert3.z, u4, v4); + } + + public static void renderSphericFaceVanilla(Tessellator tess, Vector3 vert0, Vector3 vert1, Vector3 vert2, + double u1, double v1, double u2, double v2, double u3, double v3, int brightness, int color) { + tess.setBrightness(brightness); + + Vector3 n = vert0.copy() + .normalize(); + float shade = (float) (0.6 + 0.4 * Math.max(0, n.y)); + + float cr = ((color >> 16) & 0xFF) / 255f; + float cg = ((color >> 8) & 0xFF) / 255f; + float cb = (color & 0xFF) / 255f; + + tess.setColorOpaque_F(cr * shade, cg * shade, cb * shade); + tess.setNormal((float) n.x, (float) n.y, (float) n.z); + + tess.addVertexWithUV(vert0.x, vert0.y, vert0.z, u1, v1); + tess.addVertexWithUV(vert1.x, vert1.y, vert1.z, u2, v2); + tess.addVertexWithUV(vert2.x, vert2.y, vert2.z, u3, v3); + } + + public static int WrapNumber(int min, int max, int in) { + if (in > max) { + return in - max + min - 1; + } else if (in < min) { + return in - min + max + 1; + } + return in; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/item/ItemUEMultiPartRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/item/ItemUEMultiPartRenderer.java new file mode 100644 index 00000000..73322494 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/item/ItemUEMultiPartRenderer.java @@ -0,0 +1,61 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.item; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.Content.partNames; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.IItemRenderer; + +import org.lwjgl.opengl.GL11; + +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.Content; +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.UEMultipart; + +import codechicken.lib.render.CCRenderState; +import codechicken.lib.render.TextureUtils; +import codechicken.lib.vec.Vector3; +import codechicken.microblock.MicroMaterialRegistry; + +public class ItemUEMultiPartRenderer implements IItemRenderer { + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return true; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + if (!item.hasTagCompound()) { + return; + } + + GL11.glPushMatrix(); + if (type == ItemRenderType.ENTITY) { + GL11.glScaled(0.5, 0.5, 0.5); + } + + if (type == ItemRenderType.INVENTORY || type == ItemRenderType.ENTITY) { + GL11.glTranslatef(-0.5f, -0.5f, -0.5f); + } + + TextureUtils.bindAtlas(0); + CCRenderState state = CCRenderState.instance(); + state.resetInstance(); + state.useNormals = true; + state.pullLightmapInstance(); + state.startDrawingInstance(); + + int materialId = MicroMaterialRegistry.materialID( + item.getTagCompound() + .getString("mat")); + UEMultipart part = new Content().createUEMultiPart(true, materialId, 0, partNames[item.getItemDamage()]); + part.render(new Vector3(0, 0, 0), -1); + + state.drawInstance(); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/util/CuboidUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/util/CuboidUtils.java new file mode 100644 index 00000000..ccf99dad --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/util/CuboidUtils.java @@ -0,0 +1,205 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util; + +import net.minecraftforge.common.util.ForgeDirection; + +import codechicken.lib.vec.Cuboid6; +import codechicken.lib.vec.Vector3; +import it.unimi.dsi.fastutil.Pair; + +public class CuboidUtils { + + public final Vector3 posX = new Vector3(1, 0, 0); + public final Vector3 posY = new Vector3(0, 1, 0); + public final Vector3 posZ = new Vector3(0, 0, 1); + public final Vector3 negX = new Vector3(-1, 0, 0); + public final Vector3 negY = new Vector3(0, -1, 0); + public final Vector3 negZ = new Vector3(0, 0, -1); + + // ROTATION ASSUMES MIN VECTOR IS ZEROED. + public Cuboid6 rotateXPos(Cuboid6 target) { + double newX = target.max.x; + double newY = -target.max.z; + double newZ = target.max.y; + target.max.x = newX; + target.max.y = newY; + target.max.z = newZ; + return target; + } + + public Cuboid6 rotateXNeg(Cuboid6 target) { + double newX = target.max.x; + double newY = target.max.z; + double newZ = -target.max.y; + target.max.x = newX; + target.max.y = newY; + target.max.z = newZ; + return target; + } + + public Cuboid6 rotateYPos(Cuboid6 target) { + double newX = target.max.z; + double newY = target.max.y; + double newZ = -target.max.x; + target.max.x = newX; + target.max.y = newY; + target.max.z = newZ; + return target; + } + + public Cuboid6 rotateYNeg(Cuboid6 target) { + double newX = -target.max.z; + double newY = target.max.y; + double newZ = target.max.x; + target.max.x = newX; + target.max.y = newY; + target.max.z = newZ; + return target; + } + + public Cuboid6 rotateZPos(Cuboid6 target) { + double newX = -target.max.y; + double newY = target.max.x; + double newZ = target.max.z; + target.max.x = newX; + target.max.y = newY; + target.max.z = newZ; + return target; + } + + public Cuboid6 rotateZNeg(Cuboid6 target) { + double newX = target.max.y; + double newY = -target.max.x; + double newZ = target.max.z; + target.max.x = newX; + target.max.y = newY; + target.max.z = newZ; + return target; + } + + public static Cuboid6 Translate(Cuboid6 input, Vector3 direction) { + input.max.add(direction); + input.min.add(direction); + return input; + } + + public static Cuboid6 Rotate90AboutXBlockCenterPos(Cuboid6 input, int times) { + Cuboid6 output = input.copy(); + Translate(output, new Vector3(0, -0.5, -0.5)); + Vector3 rotVector = new Vector3(1, 0, 0); + for (int i = 0; i < times; i++) { + output.max.rotate(Math.toRadians(90), rotVector); + output.min.rotate(Math.toRadians(90), rotVector); + } + Translate(output, new Vector3(0, 0.5, 0.5)); + + // Cuboids can become inside out after this. Gotta fix that + Vector3 newMin = new Vector3( + Math.min(output.min.x, output.max.x), + Math.min(output.min.y, output.max.y), + Math.min(output.min.z, output.max.z)); + + Vector3 newMax = new Vector3( + Math.max(output.min.x, output.max.x), + Math.max(output.min.y, output.max.y), + Math.max(output.min.z, output.max.z)); + + output.min = newMin; + output.max = newMax; + + return output; + } + + public static Cuboid6 Rotate90AboutYBlockCenterPos(Cuboid6 input, int times) { + Cuboid6 output = input.copy(); + Translate(output, new Vector3(-0.5, 0, -0.5)); + Vector3 rotVector = new Vector3(0, 1, 0); + for (int i = 0; i < times; i++) { + output.max.rotate(Math.toRadians(90), rotVector); + output.min.rotate(Math.toRadians(90), rotVector); + } + Translate(output, new Vector3(0.5, 0, 0.5)); + + // Cuboids can become inside out after this. Gotta fix that + Vector3 newMin = new Vector3( + Math.min(output.min.x, output.max.x), + Math.min(output.min.y, output.max.y), + Math.min(output.min.z, output.max.z)); + + Vector3 newMax = new Vector3( + Math.max(output.min.x, output.max.x), + Math.max(output.min.y, output.max.y), + Math.max(output.min.z, output.max.z)); + + output.min = newMin; + output.max = newMax; + + return output; + } + + public static Cuboid6 Rotate90AboutZBlockCenterPos(Cuboid6 input, int times) { + Cuboid6 output = input.copy(); + Translate(output, new Vector3(-0.5, -0.5, 0)); + Vector3 rotVector = new Vector3(0, 0, 1); + for (int i = 0; i < times; i++) { + output.max.rotate(Math.toRadians(90), rotVector); + output.min.rotate(Math.toRadians(90), rotVector); + } + Translate(output, new Vector3(0.5, 0.5, 0)); + + // Cuboids can become inside out after this. Gotta fix that + Vector3 newMin = new Vector3( + Math.min(output.min.x, output.max.x), + Math.min(output.min.y, output.max.y), + Math.min(output.min.z, output.max.z)); + + Vector3 newMax = new Vector3( + Math.max(output.min.x, output.max.x), + Math.max(output.min.y, output.max.y), + Math.max(output.min.z, output.max.z)); + + output.min = newMin; + output.max = newMax; + + return output; + } + + // Takes a model that is assumed to be defaulted to the ForgeDirection Down and rotates it so the + // specified direction is considered "down" for that model + public static Cuboid6[] RotateModel(Cuboid6[] model, ForgeDirection direction) { + if (direction == ForgeDirection.DOWN) { + return model; + } + + Cuboid6[] rotatedModel = new Cuboid6[model.length]; + for (int i = 0; i < model.length; i++) { + rotatedModel[i] = RotateCube(model[i], direction); + } + return rotatedModel; + } + + // Same function as above, but is used for cuboids that have some directional information attached to them. + @SuppressWarnings("unchecked") + public static Pair[] RotateModel(Pair[] model, ForgeDirection direction) { + if (direction == ForgeDirection.DOWN) { + return model; + } + + Pair[] rotatedModel = new Pair[model.length]; + for (int i = 0; i < model.length; i++) { + rotatedModel[i] = Pair.of(model[i].first(), RotateCube(model[i].second(), direction)); + } + return rotatedModel; + } + + public static Cuboid6 RotateCube(Cuboid6 cube, ForgeDirection direction) { + return switch (direction) { + case NORTH -> Rotate90AboutXBlockCenterPos(cube, 1); + case SOUTH -> Rotate90AboutXBlockCenterPos(cube, 3); + case EAST -> Rotate90AboutZBlockCenterPos(cube, 1); + case WEST -> Rotate90AboutZBlockCenterPos(cube, 3); + case DOWN -> cube; + case UP -> Rotate90AboutXBlockCenterPos(cube, 2); + case UNKNOWN -> throw new IllegalArgumentException("Switch fall off"); + }; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java index 6d9235cc..f651c9e9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java @@ -13,7 +13,10 @@ public enum Mods { NEI("NotEnoughItems"), CraftTweaker("MineTweaker3"), FindIt("findit"), - Tinkers("TConstruct") + Tinkers("TConstruct"), + ForgeMicroBlock("ForgeMicroblock"), + Backhand("backhand"), + GT("gregtech_nh") ; // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/NEIConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/NEIConfig.java index 2cf8bb95..ffeb0dbf 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/NEIConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/NEIConfig.java @@ -1,5 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.compat.nei; +import net.minecraft.util.StatCollector; + import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import codechicken.nei.api.IConfigureNEI; @@ -13,7 +15,7 @@ public class NEIConfig implements IConfigureNEI { @Override public String getName() { - return "UtilitiesInExcess NEI Plugin"; + return StatCollector.translateToLocal("nei.title.uie.plugin"); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/QEDRecipeHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/QEDRecipeHandler.java index 179b5138..48fc3140 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/QEDRecipeHandler.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/QEDRecipeHandler.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.compat.nei; import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; import com.fouristhenumber.utilitiesinexcess.api.QEDRecipe; import com.fouristhenumber.utilitiesinexcess.api.QEDRegistry; @@ -18,7 +19,7 @@ public String getOverlayIdentifier() { @Override public String getRecipeName() { - return "QED Recipes"; + return StatCollector.translateToLocal("nei.title.uie.qed"); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java index d06c02c4..33e3911c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java @@ -18,6 +18,10 @@ public static void registerConfig() throws ConfigException { @Config.DefaultBoolean(true) public static boolean enableFloatingBlock; + @Config.DefaultBoolean(false) + @Config.Comment("If enabled, inverted block will have a similar X-Ray effect to Extra Utilities' Unstable Block.") + public static boolean invertedBlockDoesXRay; + @Config.DefaultBoolean(true) public static boolean enableColoredBlocks; @@ -165,6 +169,36 @@ public static class RainMuffler { public int rainMufflerRange; } + @Config.Comment("Chandelier Configuration") + public static final Chandelier chandelier = new Chandelier(); + + @Config.LangKey("utilitiesinexcess.config.block.chandelier") + public static class Chandelier { + + @Config.DefaultBoolean(true) + public boolean enableChandelier; + + @Config.Comment("The radius a chandelier blocks mob spawns (as a square box)") + @Config.DefaultInt(16) + @Config.RangeInt(min = 1, max = 256) + public int chandelierLightRange; + } + + @Config.Comment("Giga Torch Configuration") + public static final GigaTorch gigaTorch = new GigaTorch(); + + @Config.LangKey("utilitiesinexcess.config.block.giga_torch") + public static class GigaTorch { + + @Config.DefaultBoolean(true) + public boolean enableGigaTorch; + + @Config.Comment("The radius a giga torch blocks mob spawns (as a square box)") + @Config.DefaultInt(64) + @Config.RangeInt(min = 1, max = 256) + public int gigaTorchRange; + } + @Config.Comment("Cursed Earth Configuration") public static final Spikes spikes = new Spikes(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java index 8ce594cf..fb1b7171 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java @@ -20,24 +20,62 @@ public class InversionConfig { @Config.Comment("Amount of unique items in the list the north chest has to contain for the pseudo-inversion ritual") @Config.DefaultInt(12) - @Config.RangeInt(min = 1, max = 14) + @Config.RangeInt(min = 1, max = 10000) public static int northChestRequiredItems; + @Config.Comment("List of valid items the north chest can contain. Must be item ids in the form 'modid:itemname:meta'") + @Config.DefaultStringList( + value = { "minecraft:stone", "minecraft:brick", "minecraft:glass", "minecraft:cooked_fished", + "minecraft:hardened_clay", "minecraft:dye:2", "minecraft:coal:1", "minecraft:cooked_beef", + "minecraft:iron_ingot", "minecraft:cooked_chicken", "minecraft:gold_ingot", "minecraft:baked_potato", + "minecraft:cooked_porkchop", "minecraft:netherbrick" }) + public static String[] northChestValidItems; + @Config.Comment("Amount of unique items in the list the east chest has to contain for the pseudo-inversion ritual") @Config.DefaultInt(12) - @Config.RangeInt(min = 1, max = 27) + @Config.RangeInt(min = 1, max = 10000) public static int eastChestRequiredItems; + @Config.Comment("List of valid items the east chest can contain. Must be item ids in the form 'modid:itemname:meta'. Enable splash potions with chestSplashPotionsValid (applies for other chests too).") + @Config.DefaultStringList( + value = { "minecraft:potion:8193", "minecraft:potion:8194", "minecraft:potion:8195", "minecraft:potion:8196", + "minecraft:potion:8197", "minecraft:potion:8198", "minecraft:potion:8200", "minecraft:potion:8201", + "minecraft:potion:8202", "minecraft:potion:8204", "minecraft:potion:8205", "minecraft:potion:8206", + "minecraft:potion:8225", "minecraft:potion:8226", "minecraft:potion:8228", "minecraft:potion:8229", + "minecraft:potion:8232", "minecraft:potion:8233", "minecraft:potion:8234", "minecraft:potion:8236", + "minecraft:potion:8257", "minecraft:potion:8258", "minecraft:potion:8259", "minecraft:potion:8260", + "minecraft:potion:8262", "minecraft:potion:8264", "minecraft:potion:8265", "minecraft:potion:8267", + "minecraft:potion:8268", "minecraft:potion:8269", "minecraft:potion:8270" }) + public static String[] eastChestValidItems; + @Config.Comment("Amount of unique items in the list the south chest has to contain for the pseudo-inversion ritual") @Config.DefaultInt(12) - @Config.RangeInt(min = 1, max = 13) + @Config.RangeInt(min = 1, max = 10000) public static int southChestRequiredItems; + @Config.Comment("List of valid items the south chest can contain. Must be item ids in the form 'modid:itemname:meta'") + @Config.DefaultStringList( + value = { "minecraft:grass", "minecraft:lapis_ore", "minecraft:dirt", "minecraft:obsidian", "minecraft:sand", + "minecraft:diamond_ore", "minecraft:gravel", "minecraft:redstone_ore", "minecraft:gold_ore", + "minecraft:clay", "minecraft:iron_ore", "minecraft:emerald_ore", "minecraft:coal_ore" }) + public static String[] southChestValidItems; + @Config.Comment("Amount of unique items in the list the west chest has to contain for the pseudo-inversion ritual") @Config.DefaultInt(12) - @Config.RangeInt(min = 1, max = 12) + @Config.RangeInt(min = 1, max = 10000) public static int westChestRequiredItems; + @Config.Comment("List of valid items the west chest can contain. Must be item ids in the form 'modid:itemname:meta'") + @Config.DefaultStringList( + value = { "minecraft:record_13", "minecraft:record_mellohi", "minecraft:record_cat", "minecraft:record_stal", + "minecraft:record_blocks", "minecraft:record_strad", "minecraft:record_chirp", "minecraft:record_ward", + "minecraft:record_far", "minecraft:record_11", "minecraft:record_mall", "minecraft:record_wait" }) + public static String[] westChestValidItems; + + @Config.Comment("Whether or not vanilla splash potions should also be valid if a regular potion of the same type is found.") + @Config.DefaultBoolean(true) + public static boolean chestSplashPotionsValid; + @Config.Comment("Amount of mobs needed to kill to pass the siege of the ritual") @Config.DefaultInt(100) @Config.RangeInt(min = 4) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java index b2f50e45..25379e21 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java @@ -38,6 +38,10 @@ public static void registerConfig() throws ConfigException { @Config.DefaultInt(49) public static int superArchitectsWandBuildLimit; + @Config.DefaultInt(100) + @Config.Comment("[GT5U] Durability damage dealt to Trowels per block placed by the Architect's Wand. (Set to 0 to disable)") + public static int damageTrowelWithArchitectsWand; + @Config.DefaultBoolean(true) public static boolean enableBedrockium; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GluttonsAxeConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GourmandsAxeConfig.java similarity index 95% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GluttonsAxeConfig.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GourmandsAxeConfig.java index e46b15a0..adca422a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GluttonsAxeConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GourmandsAxeConfig.java @@ -3,8 +3,8 @@ import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.gtnewhorizon.gtnhlib.config.Config; -@Config(modid = UtilitiesInExcess.MODID, category = "items.unstable_tools.gluttons_axe") -public class GluttonsAxeConfig { +@Config(modid = UtilitiesInExcess.MODID, category = "items.unstable_tools.gourmands_axe") +public class GourmandsAxeConfig { @Config.DefaultBoolean(true) @Config.RequiresMcRestart diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/UnstableTools.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/UnstableTools.java index cf046428..1c28da6e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/UnstableTools.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/UnstableTools.java @@ -13,7 +13,7 @@ public class UnstableTools { // Not sure abt nested categories, lets disccuss that later public static void registerConfig() throws ConfigException { ConfigurationManager.registerConfig(UnstableTools.class); - ConfigurationManager.registerConfig(GluttonsAxeConfig.class); + ConfigurationManager.registerConfig(GourmandsAxeConfig.class); ConfigurationManager.registerConfig(EthericSwordConfig.class); ConfigurationManager.registerConfig(AntiParticulateShovelConfig.class); ConfigurationManager.registerConfig(DestructionPickaxeConfig.class); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java index c31ff8af..cb580177 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java @@ -1,11 +1,8 @@ package com.fouristhenumber.utilitiesinexcess.mixins; -import static com.fouristhenumber.utilitiesinexcess.mixins.TargetedMod.ANGELICA; - import javax.annotation.Nonnull; import com.fouristhenumber.utilitiesinexcess.config.OtherConfig; -import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; import com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig; import com.gtnewhorizon.gtnhmixins.builders.IMixins; @@ -20,19 +17,12 @@ public enum Mixins implements IMixins { .setPhase(Phase.EARLY) .setApplyIf(() -> CursedEarthConfig.enableCursedEarth || CursedEarthConfig.enableBlessedEarth) /*.addRequiredMod(TargetedMod.VANILLA)*/), - MAGIC_WOOD_PARTICLES(new MixinBuilder("Adds particles for Magic Wood when connected to an Enchantment Table") - .addClientMixins("minecraft.MixinBlockEnchantmentTable_MagicWood") - .setPhase(Phase.EARLY) - .setApplyIf(() -> BlockConfig.enableMagicWood) - .addExcludedMod(ANGELICA) - /*.addRequiredMod(TargetedMod.VANILLA)*/ - ), GLOVE(new MixinBuilder("Implements the Glove's special right click") .addCommonMixins("minecraft.MixinNetHandlerPlayServer_Glove", "minecraft.MixinItemRenderer_Glove", "minecraft.MixinPlayerControllerMP_Glove") .setPhase(Phase.EARLY) .setApplyIf(() -> ItemConfig.enableGlove) /*.addRequiredMod(TargetedMod.VANILLA)*/), - BUABLE_RENDERS(new MixinBuilder("Renders equipped baubles on the player") + BAUBLE_RENDERS(new MixinBuilder("Renders equipped baubles on the player") .addCommonMixins("minecraft.MixinModelBiped_Baubles", "minecraft.MixinModelRenderer_Baubles") .setPhase(Phase.EARLY) .setApplyIf(() -> OtherConfig.enableBaubleRenders) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinBlockEnchantmentTable_MagicWood.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinBlockEnchantmentTable_MagicWood.java deleted file mode 100644 index 3cf5b1e8..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinBlockEnchantmentTable_MagicWood.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockEnchantmentTable; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -import com.fouristhenumber.utilitiesinexcess.ModBlocks; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; - -@Mixin(BlockEnchantmentTable.class) -public class MixinBlockEnchantmentTable_MagicWood { - - // Wraps World.getBlock() to avoid a mixin into an if-statement - @WrapOperation( - method = "Lnet/minecraft/block/BlockEnchantmentTable;randomDisplayTick(Lnet/minecraft/world/World;IIILjava/util/Random;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getBlock(III)Lnet/minecraft/block/Block;")) - private Block uie$addMagicWoodParticles(World world, int x, int y, int z, Operation original) { - Block block = original.call(world, x, y, z); - if (block == ModBlocks.MAGIC_WOOD.get()) return Blocks.bookshelf; - return block; - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelBiped_Baubles.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelBiped_Baubles.java index b0e252bc..a59aa979 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelBiped_Baubles.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelBiped_Baubles.java @@ -74,7 +74,8 @@ public class MixinModelBiped_Baubles { if (ring == null) { ring = UIEUtils.getBauble(player, ItemHeavenlyRing.class); } - if (ring != null && ring.getItemDamage() != 0) { + // meta 4 is the invisible ring, no rendering + if (ring != null && ring.getItemDamage() != 4) { final ItemStack finalRing = ring; uie$heavenlyRingWing = HeavenlyRingRenderer .getNextAngle(uie$heavenlyRingWing, player.capabilities.isFlying); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/TESRUnderworldPortal.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/TESRUnderworldPortal.java index 5cbadc7a..40f0413d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/TESRUnderworldPortal.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/TESRUnderworldPortal.java @@ -1,6 +1,5 @@ package com.fouristhenumber.utilitiesinexcess.render; -import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; @@ -10,21 +9,21 @@ import org.lwjgl.opengl.GL11; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; -import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager; +import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator; import com.gtnewhorizon.gtnhlib.client.renderer.postprocessing.shaders.UniversiumShader; import com.gtnewhorizon.gtnhlib.client.renderer.shader.ShaderProgram; -import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VertexBuffer; -import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; +import com.gtnewhorizon.gtnhlib.client.renderer.vao.IVertexArrayObject; +import com.gtnewhorizon.gtnhlib.client.renderer.vao.VertexBufferType; public class TESRUnderworldPortal extends TileEntitySpecialRenderer { public static final IModelCustom FRAME = AdvancedModelLoader .loadModel(new ResourceLocation(UtilitiesInExcess.MODID, "models/underworld_portal/frame.obj")); - private VertexBuffer core; + private IVertexArrayObject core; private void initCoreVBO() { - Tessellator tessellator = TessellatorManager.startCapturingAndGet(); + final DirectTessellator tessellator = DirectTessellator.startCapturing(); tessellator.startDrawingQuads(); @@ -60,7 +59,7 @@ private void initCoreVBO() { tessellator.draw(); - core = TessellatorManager.stopCapturingToVBO(DefaultVertexFormat.POSITION); + core = DirectTessellator.stopCapturingToVBO(VertexBufferType.IMMUTABLE); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsSelection.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsSelection.java new file mode 100644 index 00000000..dffb4d84 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsSelection.java @@ -0,0 +1,136 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +import org.jetbrains.annotations.Nullable; + +import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +import gregtech.api.items.MetaGeneratedTool; +import gregtech.common.tools.ToolTrowel; +import xonin.backhand.api.core.BackhandUtils; + +public class ArchitectsSelection { + + private final Set validBlocks; + private final ItemStack backhand; + private final ItemStack lookAtBlock; + + public ArchitectsSelection(EntityPlayer player, World world, MovingObjectPosition movingObjectPosition) { + this.validBlocks = new HashSet<>(); + backhand = Mods.Backhand.isLoaded() ? BackhandUtils.getOffhandItem(player) : null; + lookAtBlock = getBlockByLocation(world, movingObjectPosition, player); + + // No logic is executed if we don't look at any block, no need to bother checking other cases + if (lookAtBlock == null) { + return; + } + + this.validBlocks.add(lookAtBlock); // Clicked block is always valid + + if (backhand == null) { + return; + } + if (isValidBlock(backhand)) { + this.validBlocks.add(backhand.copy()); + return; + } + if (isTrowel(backhand)) { + this.validBlocks.addAll(hotbarBlocks(player)); + } + } + + /** + * + * @param player + * @return Always a valid block list or null + */ + public List blockToPlace(EntityPlayer player) { + + if (backhand == null) { + return Collections.singletonList((lookAtBlock)); + } + if (isValidBlock(backhand)) { + return Collections.singletonList(backhand); + } else if (isTrowel(backhand)) { + return hotbarBlocks(player); + } else { + return Collections.singletonList(lookAtBlock); + } + } + + public int maxPlaceCount(EntityPlayer player, int wandLimit) { + if (player.capabilities.isCreativeMode) return wandLimit; + int count = 0; + for (ItemStack block : blockToPlace(player)) { + count += ArchitectsWandUtils.countItemInInventory(player, block); + } + return Math.min(count, wandLimit); + } + + public boolean matches(ItemStack other) { + if (other == null) return false; + return this.validBlocks.stream() + .anyMatch( + validBlock -> validBlock.getItem() == other.getItem() + && ItemStack.areItemStackTagsEqual(validBlock, other) + && validBlock.getItemDamage() == other.getItemDamage()); + } + + public static boolean isTrowel(@Nullable ItemStack stack) { + if (stack == null) { + return false; + } + if (Mods.GT.isLoaded() && stack.getItem() instanceof MetaGeneratedTool metaGeneratedTool) { + return metaGeneratedTool.getToolStats(stack) instanceof ToolTrowel; + } + return false; + } + + private static boolean isValidBlock(@Nullable ItemStack stack) { + return (stack != null && stack.getItem() instanceof ItemBlock); + } + + private static List hotbarBlocks(EntityPlayer player) { + List candidates = new ArrayList<>(); + + for (int i = 0; i < 9; i++) { + if (i == player.inventory.currentItem) { + continue; + } + ItemStack item = player.inventory.mainInventory[i]; + if (!isValidBlock(item)) { + continue; + } + candidates.add(item); + } + return candidates; + } + + public static ItemStack getBlockByLocation(World world, MovingObjectPosition movingObjectPosition, + EntityPlayer player) { + + BlockPos blockPos = new BlockPos( + movingObjectPosition.blockX, + movingObjectPosition.blockY, + movingObjectPosition.blockZ); + + Block block = world.getBlock(blockPos.x, blockPos.y, blockPos.z); + if (block == null) { + return null; + } + return block.getPickBlock(movingObjectPosition, world, blockPos.x, blockPos.y, blockPos.z, player); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsWandUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsWandUtils.java index 6c7306f2..c35d74ca 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsWandUtils.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsWandUtils.java @@ -1,21 +1,34 @@ package com.fouristhenumber.utilitiesinexcess.utils; +import static com.fouristhenumber.utilitiesinexcess.utils.ArchitectsSelection.getBlockByLocation; +import static com.fouristhenumber.utilitiesinexcess.utils.ArchitectsSelection.isTrowel; +import static com.fouristhenumber.utilitiesinexcess.utils.MovingObjectPositionUtil.TranslateMovingObjectPoistionToLocation; + import java.util.HashSet; import java.util.LinkedList; +import java.util.List; +import java.util.Objects; import java.util.Queue; import java.util.Set; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; +import gregtech.api.items.MetaGeneratedTool; +import xonin.backhand.api.core.BackhandUtils; + public class ArchitectsWandUtils { - public ArchitectsWandUtils() {}; + public ArchitectsWandUtils() {} + + ; /** * Counts the items of a certain type in a player's inventory @@ -45,7 +58,7 @@ public static int countItemInInventory(EntityPlayer player, ItemStack itemStack) * @return True if the ItemStack has been decremented, otherwise false */ public static boolean decreaseFromInventory(EntityPlayer player, ItemStack itemStack) { - for (int slotIndex = 0; slotIndex < player.inventory.mainInventory.length; slotIndex++) { + for (int slotIndex = player.inventory.mainInventory.length - 1; slotIndex >= 0; slotIndex--) { ItemStack stack = player.inventory.mainInventory[slotIndex]; if (stack != null && stack.getItem() == itemStack.getItem() && stack.getItemDamage() == itemStack.getItemDamage()) { @@ -60,19 +73,19 @@ public static boolean decreaseFromInventory(EntityPlayer player, ItemStack itemS } /** - * Finds the blocks adjacent to the start position that are connected cardinally - * and have air infront of them relative to the side clicked on. + * Finds the blocks adjacent to the start position that are connected cardinally, or diagonally + * and have air in front of them relative to the side clicked on. * - * @param world The world in which to place - * @param blockToFind The block that is being found - * @param metaToFind The metadata of the block that is being found - * @param findCount The maximum amount of blocks it should search - * @param clickedSide The side of the block that was clicked - * @param startPos The position to start + * @param world The world in which to place + * @param findCount The maximum amount of blocks it should search + * @param clickedSide The side of the block that was clicked + * @param startPos The position to start + * @param architectsSelection The pattern used to search adjacent blocks * @return The set of 1<=x<=findCount adjacent blocks with air on their face */ - public static Set findAdjacentBlocks(World world, Block blockToFind, int metaToFind, int findCount, - ForgeDirection clickedSide, BlockPos startPos) { + public static Set findAdjacentBlocks(World world, List possiblePlacements, int findCount, + ForgeDirection clickedSide, BlockPos startPos, MovingObjectPosition mop, EntityPlayer player, + ArchitectsSelection architectsSelection) { Set region = new HashSet<>(); if (findCount <= 0) { return region; @@ -84,27 +97,26 @@ public static Set findAdjacentBlocks(World world, Block blockToFind, i int[][] allowedOffsets = switch (clickedSide) { case UP, DOWN -> // Plane: x/z plane (y remains constant) - new int[][] { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 0, 1 }, { 0, 0, -1 } }; + new int[][] { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 0, 1 }, { 0, 0, -1 }, // Cardinal + { 1, 0, 1 }, { 1, 0, -1 }, { -1, 0, 1 }, { -1, 0, -1 } }; // Diagonal case NORTH, SOUTH -> // Plane: x/y plane (z remains constant) - new int[][] { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 1, 0 }, { 0, -1, 0 } }; + new int[][] { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 1, 0 }, { 0, -1, 0 }, // Cardinal + { 1, 1, 0 }, { 1, -1, 0 }, { -1, 1, 0 }, { -1, -1, 0 } }; // Diagonal case EAST, WEST -> // Plane: y/z plane (x remains constant) - new int[][] { { 0, 1, 0 }, { 0, -1, 0 }, { 0, 0, 1 }, { 0, 0, -1 } }; + new int[][] { { 0, 1, 0 }, { 0, -1, 0 }, { 0, 0, 1 }, { 0, 0, -1 }, // Cardinal + { 0, 1, 1 }, { 0, 1, -1 }, { 0, -1, 1 }, { 0, -1, -1 } }; // Diagonal default -> throw new RuntimeException("UE's BuilderWand's findAdjacentBlocks called with invalid side"); }; - int sx = startPos.x; - int sy = startPos.y; - int sz = startPos.z; + // translate the mop + TranslateMovingObjectPoistionToLocation(mop, startPos); // Base case - if (world.getBlock(sx, sy, sz) == blockToFind && world.getBlockMetadata(sx, sy, sz) == metaToFind - && world.isAirBlock(sx + clickedSide.offsetX, sy + clickedSide.offsetY, sz + clickedSide.offsetZ)) { - - BlockPos neighbor = new BlockPos(sx, sy, sz); - region.add(neighbor); - queue.add(neighbor); + if (IsValidForWireFrame(world, possiblePlacements, startPos, mop, player, clickedSide, architectsSelection)) { + region.add(startPos); + queue.add(startPos); visited.add(startPos); } else { return region; @@ -113,33 +125,30 @@ public static Set findAdjacentBlocks(World world, Block blockToFind, i // Flood-fill the contiguous region in the allowed plane. while (!queue.isEmpty() && region.size() < findCount) { BlockPos current = queue.poll(); - int cx = current.x; - int cy = current.y; - int cz = current.z; for (int[] off : allowedOffsets) { - // Check if already visited - int nx = cx + off[0]; - int ny = cy + off[1]; - int nz = cz + off[2]; + if (region.size() >= findCount) { + break; + } - BlockPos key = new BlockPos(nx, ny, nz); + BlockPos key = current.offset(off[0], off[1], off[2]); if (visited.contains(key)) { continue; } visited.add(key); - // Check and add to region+queue - int airx = nx + clickedSide.offsetX; - int airy = ny + clickedSide.offsetY; - int airz = nz + clickedSide.offsetZ; - - if (world.getBlock(nx, ny, nz) == blockToFind && world.getBlockMetadata(nx, ny, nz) == metaToFind - && world.isAirBlock(airx, airy, airz)) { - - BlockPos neighbor = new BlockPos(nx, ny, nz); - region.add(neighbor); - queue.add(neighbor); + // translate the mop + TranslateMovingObjectPoistionToLocation(mop, key); + if (IsValidForWireFrame( + world, + possiblePlacements, + key, + mop, + player, + clickedSide, + architectsSelection)) { + region.add(key); + queue.add(key); } } } @@ -147,4 +156,50 @@ public static Set findAdjacentBlocks(World world, Block blockToFind, i return region; } + private static boolean IsValidForWireFrame(World world, List possibleBlocks, BlockPos targetLocation, + MovingObjectPosition mop, EntityPlayer player, ForgeDirection clickedSide, ArchitectsSelection selection) { + ItemStack currentBlock = getBlockByLocation(world, mop, player); + + if (currentBlock == null) return false; + + return possibleBlocks.stream() + .allMatch(itemStackToPlace -> { + if (itemStackToPlace == null) return false; + + Block block = Block.getBlockFromItem(itemStackToPlace.getItem()); + return selection.matches(currentBlock) + && world.isAirBlock( + targetLocation.x + clickedSide.offsetX, + targetLocation.y + clickedSide.offsetY, + targetLocation.z + clickedSide.offsetZ) + && block.canPlaceBlockOnSide( + world, + targetLocation.x + clickedSide.offsetX, + targetLocation.y + clickedSide.offsetY, + targetLocation.z + clickedSide.offsetZ, + clickedSide.ordinal()) + && world.canPlaceEntityOnSide( + block, + targetLocation.x + clickedSide.offsetX, + targetLocation.y + clickedSide.offsetY, + targetLocation.z + clickedSide.offsetZ, + false, + clickedSide.ordinal(), + null, + itemStackToPlace); + }); + } + + public static boolean damageBackhand(int damage, EntityPlayer player) { + if (!player.capabilities.isCreativeMode && Mods.Backhand.isLoaded() + && isTrowel(BackhandUtils.getOffhandItem(player))) { + MetaGeneratedTool trowel = (MetaGeneratedTool) Objects.requireNonNull(BackhandUtils.getOffhandItem(player)) + .getItem(); + if (trowel == null) { + return true; + } + return trowel.doDamage(BackhandUtils.getOffhandItem(player), damage); + } + return true; + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java index 0cbe9cc8..95119802 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java @@ -31,13 +31,13 @@ import com.fouristhenumber.utilitiesinexcess.common.items.ItemXRayGlasses; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemAntiParticulateShovel; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemDestructionPickaxe; -import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemGluttonsAxe; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemGourmandsAxe; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemPrecisionShears; import com.fouristhenumber.utilitiesinexcess.common.renderers.XRayRenderer; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPacifistsBench; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.AntiParticulateShovelConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig; -import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GluttonsAxeConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GourmandsAxeConfig; import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorEntityLivingBase; import com.gtnewhorizon.gtnhlib.client.event.LivingEquipmentChangeEvent; @@ -139,7 +139,7 @@ public void onBlockBroken(BlockEvent.HarvestDropsEvent event) { Item heldItemType = heldItem.getItem(); if ((heldItemType instanceof ItemDestructionPickaxe && DestructionPickaxeConfig.voidMinedBlock) || (heldItemType instanceof ItemAntiParticulateShovel && AntiParticulateShovelConfig.voidMinedBlocks) - || (heldItemType instanceof ItemGluttonsAxe && GluttonsAxeConfig.voidMinedBlock)) { + || (heldItemType instanceof ItemGourmandsAxe && GourmandsAxeConfig.voidMinedBlock)) { event.drops.clear(); } if (heldItemType instanceof ItemPrecisionShears) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java new file mode 100644 index 00000000..ff965cac --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java @@ -0,0 +1,36 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +/** + * Wrapper class of ItemStack that compares with itemStack Item, Count and Damage. + */ + +public class ItemStackBaseCompare { + + public ItemStackBaseCompare(ItemStack itemStack) { + item = itemStack.getItem(); + count = itemStack.stackSize; + damage = itemStack.getItemDamage(); + } + + Item item; + int count; + int damage; + + @Override + public boolean equals(Object o) { + if (!(o instanceof ItemStackBaseCompare that)) return false; + return count == that.count && damage == that.damage && item == that.item; + } + + @Override + public int hashCode() { + int result = 1; + result = 31 * result + (item != null ? item.hashCode() : 0); + result = 31 * result + count; + result = 31 * result + damage; + return result; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MovingObjectPositionUtil.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MovingObjectPositionUtil.java new file mode 100644 index 00000000..2ab8a5fa --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MovingObjectPositionUtil.java @@ -0,0 +1,23 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; + +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +public class MovingObjectPositionUtil { + + public static void TranslateMovingObjectPoistionToLocation(MovingObjectPosition movingObjectPosition, + BlockPos location) { + double offsetXn = movingObjectPosition.hitVec.xCoord - movingObjectPosition.blockX; + double offsetYn = movingObjectPosition.hitVec.yCoord - movingObjectPosition.blockY; + double offsetZn = movingObjectPosition.hitVec.zCoord - movingObjectPosition.blockZ; + + movingObjectPosition.blockX = location.x; + movingObjectPosition.blockY = location.y; + movingObjectPosition.blockZ = location.z; + + movingObjectPosition.hitVec = Vec3 + .createVectorHelper(location.x + offsetXn, location.y + offsetYn, location.z + offsetZn); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/VoidingInventory.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/VoidingInventory.java deleted file mode 100644 index 7012ac44..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/VoidingInventory.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.utils; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; - -public class VoidingInventory implements IInventory { - - private int size; - private String name; - - public VoidingInventory(int size, String name) { - this.size = size; - this.name = name; - } - - @Override - public int getSizeInventory() { - return size; - } - - @Override - public ItemStack getStackInSlot(int slotIn) { - return null; - } - - @Override - public ItemStack decrStackSize(int index, int count) { - return null; - } - - @Override - public ItemStack getStackInSlotOnClosing(int index) { - return null; - } - - @Override - public void setInventorySlotContents(int index, ItemStack stack) { - if (stack != null) stack.stackSize = 0; - } - - @Override - public String getInventoryName() { - return name; - } - - @Override - public boolean hasCustomInventoryName() { - return true; - } - - @Override - public int getInventoryStackLimit() { - return Integer.MAX_VALUE; - } - - @Override - public void markDirty() {} - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - return true; - } - - @Override - public void openInventory() {} - - @Override - public void closeInventory() {} - - @Override - public boolean isItemValidForSlot(int index, ItemStack stack) { - return true; - } -} diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/0.png new file mode 100644 index 0000000000000000000000000000000000000000..740558bf5735f596c6d88306bfb82a8aa1ae4256 GIT binary patch literal 388 zcmV-~0ek+5P)Bw5Vll~Y;H|saSfzM(H+wU0-n_YM)OFXkL4!+wuxrIl)6pw-9EyjdR*1QehX+>N zH601TWO8Va4{gWnrDM;tQ!A@uf7bc*>BwVpAq)g`;qd+A!sfr%_V#-2`1W(!)Mx|< zX!_^DVBZNy5J6lZ5|r^i^8mK0It%hui~^Y_BLUmlNDzA<_Z3qpWvK1<_EHZZAW^f2 zjjX^3QUWp$SR-@A>sxm}-U=g7ldW-6vF4XLP?jetfkx0LO9vGF7iS*uRiT1)0@(Ef i5%a7Z{bb1&w!spW|BWcQ!r{IE00002BR0px_5j z7sn6_|Juohd`y8HE<67(-C~%P^w6{H=OMaa-_$KWXxaxLoeXS4B O?+l)FmPZ-%i(p{O3o@M&r!i z)OLHDMsHG8Ek8Uy?0GQ-gqmkxm*LDCu)&~d?VE;;M@>t306;Rnk;Z9t?%&F<0sOFb z1_1Q$wmk_&8si2)2>vPe{Iu@?uusbJ%S--avrXYa2agxJ-c@O|VD~jVl zU(GO(c`}m7i-TVir;{`Q#2(0fowY=O!M5AkT6zEqXaG ltyr_b@I|I72LQ5R@C_4ml?8FGE;#@I002ovPDHLkV1k%l!2bXM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/3.png new file mode 100644 index 0000000000000000000000000000000000000000..5bab3e8f801699904b3969ce6da2ce41e6781f0a GIT binary patch literal 404 zcmV;F0c-w=P)CRK_p zOGrnEN{y2G5!99hN>B#qIOTpmg3cC`>0*^w96Kjam6%<2x`yr?o*=T~J(pPG|Kw#siDxZtr$xcjxwEu^5!$Nv}LU^vh~>US{*7^8B>_$8`Swc2Hhk2e~Tt z@@l*x4Sc7I0s=6WMP)BSk6>Oci(E<0YXzE(K;U00000NkvXXu0mjf7v`$4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/decorative_1.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/decorative_1.properties new file mode 100644 index 00000000..220cb7e4 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/decorative_1.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=1 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/0.png new file mode 100644 index 0000000000000000000000000000000000000000..63be3703d1ac68f1eb07a6bf3ec5e2453a0f0fbe GIT binary patch literal 526 zcmV+p0`dKcP)($=xx6a4o5u9$f+fDKB_p8(W)oRs3IMV5~9NX>I z=JUDDX0w0ZImhF%?e}}j<#LutBrHTX91h|MUI4)1a0o!o=d+4ywVK6ZF$*1!M+F@< z8jb$f3Wb7lMx&7c#Ncwds4M6s<@0$fm&;Zx7A+EqSiN4iQmJIUUQhAY>!sXa1O&nX z0}@)TmT1$3jucKNlc2%%3?w2y5eLN}yFn9!A$#Y(SS)l8 zhrxmHJeTO&;?_y6ha>miO83Q3J;%`w;OMd{p|P)00JI(f#Ze-#ZJQ@B7kkEnph)T+Kz^b!)u_sz1B|2y5IKl|i6pEnOP`Aw z;RFtdM?M%y;DF$#*dhVCz@!e{X(Y)QRY_52Dv^kB3B56aNoK6;I``9ECaU90YjvY{ zqTDZl7*$KJ*ULGO=CVA`e{rFG()_W-IAeUe`UmjB>Hv3{B1r%uFFw2w6ED~w4kVKR x@%7oFGOX~!7)e@dy}vyD72XLs`Um)&{{T|)U1fOEmp%Xh002ovPDHLkV1oZSuC4$8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/2.png new file mode 100644 index 0000000000000000000000000000000000000000..c39d2253f65ea43bdcb763f8a5ff78ba28884fe5 GIT binary patch literal 486 zcmV@P)8mD1u(R30^#T@JSzAP4Xubyx(t0(^T&FyOhgi>G%7x-|yvkJj!4&kjLX8*Xvcz=d+YbCHZ_l zx*w0n(r7d!z<@JGA3)H2KG!b`8|TmG(*Y`#iUb(Q00<7tU?p_BU0JPGayT5c90S-n7g`1iFauN^rqihg zTrL-xOeVSqVgSnk4O|8s`XX+(TMhI9rh#SbG_WpM8^bVE2pRxD2lnVf8|^}u0VVid zfV^I><#xNN4K3L3cDtMg0Qe8S-*2u9qtQs63Bt}|PislpE(B1o*Z&##Dw6@uS(d3I zUjUoUMgca7P6KKJU?o(mRn>s{hr^*;&1O?;wi0^1o-QY%KZ!QV_7*6EOyW4sO=4~i ztPB1qlf~(DQaHLqQ6y-_KY(_-{ReQ1Y2X7W1v>$Brq~62jl~S?H3GF6n9XL=>2%y6 c8GxDj0Wkqj%03a#7ytkO07*qoM6N<$f)>ThZvX%Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/3.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f6f15865218bfe3a926f8c7b3e9692e5702311 GIT binary patch literal 458 zcmV;*0X6=KP)R5(wilgX+=K@3Fmfue{aD9*EjI8UGmx)C>m8&`tjhvsnt zby0Bl7DZLkNp5b^ZTI`#uh*+T9*1_Txt!-BZlbq4FL=$+t)?bkc_T&3n9TSJsK z2?BKIKNEfx)k7lA3Wb7~N~KsKTDE|#vroV92jrtxlNiwfYXATM07*qoM6N<$g8J&z AWdHyG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/4.png new file mode 100644 index 0000000000000000000000000000000000000000..abd806633f169a8aef59dbef2c1470295d61c076 GIT binary patch literal 512 zcmV+b0{{JqP)J<-#Y8 ze1QYry9oJ{Nls46gm$}a_xs&$x0}UrY^_$y*6X$Hc022II+muXozG`G9*>sIX6^lc z`#VVzTdh_WNCf0^x%>ejX*?dgM)2|d@pyQ$Ktruob0nOFLcw~yo=qkb4}bw0HUdy( zd`Q5F>x*eEgyez->RDPb-(p zmdRv%m^x+kOdBxa*Z_XLUY>*YA%ac-08rE^6U=&vSuU4e@$>n3yapMRj3EX9&_Au{ zCYTKjsEm()2xfjrI55P37PKZd!(EUNMUm4cULapc4M@3j9R$|^0000u4^P)UKq&^W=TZu7<%AmSb`I=Su76`&z2L)nc@% zX1wM9SSxvL|90h#8E3g;0DK6r*uy6qQBS}Mr zXEhB^R5Uy}llrp?;<^FAj%T1Z?bnmV*Lv7^3Oif= zsK*O0b#LarifxRZ*4^p5dNltWxc1Up#QEic!&)2w*M?8(!Q5lrpM9v!{)4c~weKKZ z89a(OBE-((NQ)!{so=EvUN2U^B1uKII&|DosQ?8Cs4ZBsGD*OI?s$pUt>1{RkF>+w zDFRcrCvPH%Xt8%MxS za?T`!BRh+zN(rN+0PalP#Nwv9qX>MmCTqOoAM=cB#yE z%q#YQ3T;Rf$YCMT5}^MG#B)z#4-7&=%Fn^MBbh4T+`j)qj%V}(B-z>uAoZUYN182( zQ(`83xmy3}EK(AvAc@y=o;@99*-8+Ycb3#QN??<_dX7>>Qq0000GWMx7}MMgF- fIYdS|F)%emLN-M(O*e>@00000NkvXXu0mjf@nhK% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/2.png new file mode 100644 index 0000000000000000000000000000000000000000..d50a20c4ff0f898587f0772ac53d97ee3c714a02 GIT binary patch literal 593 zcmV-X0@Oy`Dw~HT7 zKjDorP#eWVT>CD5pB}K?ZZQ}Pz<8RbFwWwxdy7`9g)~bA&zRSZK9|b{z7?U-Xh?Nh zyWK7c3_=J(V68<_6cQ5!4A8+O{?9K#WE04QD2iaGrP2VL&u76C#~iDPT*Xl)SzD>0 zf-K8~;B{Qv7OcvqkzHla=W|KubUK(!CZJ-is;Z?0zUXw$$s@tMK(pBt5EV#b=?f+Z zMoGAOl}7Nx<}a4J1#Gh+y{}d)slwAJCOIbO6i>@%;AMc)hV~+>DHT{(?o6$Kb~>HP zidFB<`g#U6fhu?xzr}6m1FUygEEeeZ`xuQz*zfl!kmF&$d-nV^Y!8fvUalImn~ znG1{Q9T6qkiz*QXA;)Ys6CW?pdcEdcg^Wr?dbtXTN_kCW3RmBI0y&4`5^C8rUcUNc zQcJgwc+6%n4TB^}Fr7{XG#n0rX~3`S50a47cozH*hN>!Y@q6kA0000GWMx7}HbX>1 fGB7bQHbp{0IWjaiDu9E?00000NkvXXu0mjf`soIM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/3.png new file mode 100644 index 0000000000000000000000000000000000000000..683b530f2872c9162d6de836aa7616caa0a33480 GIT binary patch literal 568 zcmV-80>}M{P)x-Ef%CdYH^y}|$Vm_3e&7>-9NJ24y?q8qC z<}W!V)bHNq8Q}cH0ZM5anX`@olKnFuU)Y~seRN7I(vfLF8V3sGY6nEt6)Elon_7EQ zk~R@F75h2Xe!l-ihr>Zo(=?UlpfAw4qX&7OOY^cUqd1Ofzu(JqSF06SBoBu}2?Whv zuScWNNT?zaw)uQ61pos3VzH3(cDp4TPQZ@`U>G6nz9*1=zwH%bilPv0m&>If0RWUC zpa>@_gYs^-6VUN^EDRA3nNFvq<~MiFNdX>@X-B0EclyM$$1ZTMq`}H{Ok{J*iksMw zt=Ujw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/4.png new file mode 100644 index 0000000000000000000000000000000000000000..9b800f3502f380dbb47822260e1ff116e946223b GIT binary patch literal 645 zcmV;00($+4P)x3z#lZ|}WrujQ7-wi;PVSzHnYitG^lX4t8q#u&wYjlah~H=bvj zL-fOB&NB0!ciuB&F877f+-*yktxFV+Nl(5c>48|zHonXHzAoK*RvJ z70yaFOk|^ZBu7s^%HF~|*=n80)$)*nk0*~6z~!01uggSrUXz={i!vI_NG7Pr@$x6> ztbS2{(0(tT1qGZ~;*^Ok$6Uz;dQmUlliTG7Y6O!EgVXhI>N#ta?kkI7zoieQdP`!` z17%zDP4R+3rOxZnMZDKLzg2^ku|3H~iR6k^>#^=SbuAKevhrEBr#o8b^R=(??9m%l zpFPRkqX&D~xIG3-L$FiZCE&S4eeQSX->MeeasFcShn5A)3xHSKzx2WdV+3F?w|?p# zc21Z5#d8JM5?E|b9V-yuM$K-Iv3@#trVYg-u4L9GeccLJNK{0W#t;cmUI73WT>-ly ztGB`Nm*$tCUn7w3RGJZvcbF+YGUXW;c zyiV-JFu8G#at)=F?u!LsNp|B*37(zCbbqWd|BmxtG9TOp70000GWMx7}I50vm fF)=qYH!w3WML|M0NQzEB00000NkvXXu0mjf_ZBD2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/decorative_11.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/decorative_11.properties new file mode 100644 index 00000000..a94ab822 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/decorative_11.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=11 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/0.png new file mode 100644 index 0000000000000000000000000000000000000000..5794430f647c6732601fd9f3d06d37b31a80ed87 GIT binary patch literal 328 zcmV-O0k{5%P)l~AM-g&9+rZ@^iWNy6R`Fqt5-hNq-|RhW{XLx as*)e9giDNK$Tt=M00002BR0px|^* z7sn8b)4h{Cxfm3ASUz)@+f;n`Uw`I;kzU6}TNcNlRI#I$%R2;`mQ68vzGmqZv8~qx z|MFQH9y?a?K9s?zll5^9liJ3FCtN}^k2JL>OjlUxZPl||mQB6l;3S2-4*~|Atj&{4 zPfY_#9++exF~^|d?wO5DY?mcBY}$A%+WOO_;^}9~{`_IrXSVkKH~)vx+u1I0VWpF6 Yj%T=U%v`|`1#}{Vr>mdKI;Vst07Cm#5&!@I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/2.png new file mode 100644 index 0000000000000000000000000000000000000000..b44f314841bc48728f35807bec018ec76cbe236f GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px}8= z7sn8b-qy*Cd`AQXTxWLd{_^j5R?LEhW&5AKo^jMGWkuzE^DFYl1MhBMI%Q7B7CEN_ z%jGT>ozsoG{xoatJDc-n;%axl-?g5cs}ke&^3bC4Tb&sJO>G@Y;H5|5nBhEu;z2}H8j z@>Fm2{UhHKdtoid_2yEC8QTOom6P_BBqYw6`k%e~TgP6$YTmRBqLuO4va$}P;csVh h%>Hol-GjL&*ge+pf02BR0px{wY z7sn8b)4h|txmpc)T%GN$H)!$6SZFWekhLuOzq;$rCn@=)-sWzpqCVf~E<>YDI^6lU zk7=sj`)>Q(g3oj1!t~hdXU=>+!xAw0N`lSG+-SF1%T6AwzW?2Zhq?c;hU41TyY2`( zO^9<^thVx?(hlznAu6nHZ~2;)|14BP{nnL9n!6&@<(-`~P V4So|(L;*d-;OXk;vd$@?2>|IAYoP!D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/4.png new file mode 100644 index 0000000000000000000000000000000000000000..333d4a67291532fa1fd8adc8e7ef4fb2de01985a GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px_2i z7sn8b)4h|e`B)V>TsyNrh;wsWbAR7&6Thy~Kv>y`wY9BSB;eIvf0v%ZXLHguQ?EsZ zZ@H#Y!EdR#^yQrBY^h|O#_w@c-xw5aWOHv2xN$|rTE=NYjMF03iwS~ngj6=RB))lT zU~!0Z7E58XYl5dqh3~_=slJO2DqTteRU-dlHBwx1I!?$+d-ZG%u89ZJ6T-G@yGywoq8(g*k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/decorative_2.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/decorative_2.properties new file mode 100644 index 00000000..1e329869 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/decorative_2.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=2 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/0.png new file mode 100644 index 0000000000000000000000000000000000000000..936e150dfe455c996f797a5956f2cceec5198350 GIT binary patch literal 795 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/decorative_4.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/decorative_4.properties new file mode 100644 index 00000000..0a0a01d1 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/decorative_4.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=4 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/0.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ddaab3a6b7e0ec5a4aab8b051060b1496c999e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px_%% z7sn8b-nqfnTuzQWH8&z|cD1%HSh{v@1zUf@%8muC=^Hj)Iu#~h(|Nt?+@Y2|hTKUT z@299w_T2XJi@TV6zR}hZr8qj=X~nXx$_=2i{{HTw7o0% zb6J7o8*4+qvg;f6&8}Xv70xkyDOg#_>>w|k@Yi!S!vR5dql6>WHNtC$Y* z#b+=?H*<3>>RZJqIf?PjO16#fCJG*ml1f;_wslUn)D#gQ-50EO2BR0px`7= z7sn8b-l@Tcd<_abId@`v7dJ0nz54%uQMSpGKJS=jV8XaArayaQsx{ZKsyNrVl?G`$ zZoXfxx-vzyZTdup>t4P`r5h)`@a$qauREzNROyfMgH@O13Y5ane&~u+ne3a|+UL!G zA!OZ*a|eBPSY;}O2g$yi_rUYizc)I$ztaD0e0sv$qSLgr$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/2.png new file mode 100644 index 0000000000000000000000000000000000000000..f069495d8c3f205baeb51064ef3c530acbe8e4c8 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px|{+ z7sn8b-rh-uTuzQWF5=SK(Hl1iY}v9^_tFpVS#$a6E}`>gx4&I?Ju7Cp_xbasM_c(hj~;z@VYZS&^p~Pcb^|u91sl_y z-+wLr&oCk23iA<3k5dQkvpA?NtaeyjxxlUWTZ3EbgZ!@!Z!TNg_WbXsjO}~aC-z({ p7C7tlh3mvShKn+PJ~>M6Vf3rd;GA7H)f?zV22WQ%mvv4FO#p<9c@Y2r literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/3.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9f7b9e36eaf09c6947005c8556d1d53dd82f25 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px`D? z7sn6_|KtRr;2-@xm7yj7l7*WSXGrYsF`ALK;iTV>_#H`)>ILTR-ooIMuJcN9*7=4U zB}0j4LY%?Y9oz+$g3CB&PoHp9@`CC`-UI6VW(;@3B;;qGy5jL>s^Tt zA{3_7Of=k-n82JM*>Z>HXoK#qf=b3`Q7MHCr=DiCOcpeI26R1xr>mdKI;Vst0MN2r A8UO$Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/4.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1ae6c310b321c934900ef88f008ef71b38637c GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px{YQ z7sn6_|K4CjE+$7F9<#7*Nr{RXnc3?54ywoKH}&R!U<|W6u>Qx|shm$biZ{O&Ys}eX zJX7UJ-}HrZh!Tc?!MO=sGKgh^CdHrs@(v&eK5{1UNZ zvhx$KEak~!k0#IZ%wB4*`{m8tlTXA#q`S^=76=sj{GY-iP|m=^cd=lSLgvZvON?ya ZxbwTCmdl@BeGlj<22WQ%mvv4FO#s8hYfS(E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/decorative_5.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/decorative_5.properties new file mode 100644 index 00000000..d929973a --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/decorative_5.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=5 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/0.png new file mode 100644 index 0000000000000000000000000000000000000000..7881604a9501c1182d6d30b028c9f65f8bd5da0d GIT binary patch literal 509 zcmV|9LKoYt(F`TyW_I@#y*vD@t?eZ5{K_>srsA^m>8ZM9n2@p!b$+xr1<>;jNIsueAe+sa$0)$>Kn{Yf5ik~ug&Y(#n@s^U8VzZrTrNvjtJS2L02l#) z$z&o&6h%rRdB5K)5ztnvr95Ijjz(~RN~L0(%|=Be(Y;oyS+Q7@uGi~|1L%7z6be58 zr{nX|eYe}G0AUx502tuDn}h*pBnW+9AOOBxG`@d8POKf=@At&uwiG}adMq=S%O%TW zJiwmMr*x@QvVd3B>2xH%L;yG&-FR_mc0kN`1^_w1`Fu`h_dD}s=?qmLfu+L07YJL8 zKnDyz4b-7a(*G5pO|g&J@ArQIbaMv&%CJfHB4>ikW;1DkGy)9#!{7v&BrZeZd_K3) zXrvD|9*-s7NC3EJS-CYZ}_J|yAS;Zu~uRmjVM7t00000NkvXXu0mjf@NnW) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/1.png new file mode 100644 index 0000000000000000000000000000000000000000..065ebc26a2a3e898cbbe7bfa6369ff38c49c0225 GIT binary patch literal 486 zcmV@P)Q2OMy~2@xl*ii*0>jpFzA;}leQ zE}BkysOst@^?JSNbUIP3R^_|huB_Q?#_@QJ!{HFi?|_Vj;iZ?;}knlW4cw z@%?_|e!s`#@rd1SCxF>(_5(N^4rP@}MP%i2ITB42oX_XDTrNT$kH>28otoF{B`cLm z^2D*kSRiuoh{z(wRNL(~7jv%H>$#3eQ=`#P5Ur!pC>sDC7egkVTBc(X?vg-oFc?S* zXY`R|RM=ql;w;575^OYii6j7k-OI!G`+emNh_SciB9hh%`}6r!3VBRtSwOUO@ z@Aq4t9guSkF)gvxYUPbPc)ec5jCM<4sjh*5SHY*EDDrqTZ#J8lPNzR#*w4$?rjZyV z+JQC0@PCQK%t#Ht6N1y}q#CA^g!z1)H%t&@rt-6Sk$~fUra1$!aV{{KjZt|@%*BvU c4*(wf107XRha4u1J^%m!07*qoM6N<$f@WIVzW@LL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/2.png new file mode 100644 index 0000000000000000000000000000000000000000..3d440e8827bb50139c3b1de4c2cdbde579244e13 GIT binary patch literal 507 zcmVA zBi}D6dI)J|GGCH^ra_V<7RRxbN+p|2Cf4b6Wc7O8w%e_3HXEBxr*=A>>$VI^Z$j>-8$j z<#P6XKGhB10V4n)@D{t>t`&<#^F7uuzN^)$)`<&+!gmCMTCHYb7-j~5cJWxV*_3wx z#ROmk0OfL7vy#wmx0OuGBvKiH$zzQX_|^yxa1luWKy?=n-|O|X572d^YXQ6+pO@;F z%S8t;T4n@bz<+fUfNNxv_E~fQNj?H=zd+uFG}LJ#rjCPLQT)7LbSr$Kz3z{kqskR5~EXU!q2UMgV}r z%jMFB!{Of(_Uq+obDe+}i^UhnW4(MQ zDYu=``y0ZuRWhn$;aa%U?~0f$wtetC7FxG;xCSFL#b4fk+wUX&JPr5x7(7STCGYFOQ*1-hvV@mW2@D& zMx&u~yf&*zm4GuQK% zAeny>CX_w3i~10m$$Gukg3w5>|B9dXZa8S0000#`_{Y_r+edc8I<$Kz3+*!%sKUn~|D_WQj} zCKIbxt9Ck_L^hw#MbPi}{|MXdwhEumr*Nau$U-KQF>E{@8)N{w-L4A!4Dt1Pm7!uf zom#C{vs5Z&fxv7wQ^F-S8V$>4v-WsAlp}`ux8qP6N~Mw&i$%@a>2$sZ0g~}prBaax zi#ob<4#*?eYPB>g-^e5BlIhHX>FT3koCDn`LaxsW0o{Fh_-3=Iyc1%(-Ohr8NcxO) zzg#YgVURNdIA0zZEfE08IF6;nlMwiF@x+`EqWk@>??55<4T!s?097oP@$&h+is{UF z;AliKk1KGe<#O55>GXHY5EKdpfo`{(JUbxg7-Cu?#T3Bq!NcL8&dly3uvEu@_h%mn za`0t$51#Au=&(1o|nD8EbmRfP&(Ck?jSt(5UYy1Kp6yRbpT;SMy8o0gvlh8{CJ91ONa407*qoM6N<$ Ef&-82KL7v# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/decorative_6.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/decorative_6.properties new file mode 100644 index 00000000..9f500d16 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/decorative_6.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=6 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/0.png new file mode 100644 index 0000000000000000000000000000000000000000..67f7e3e06f51a4e818538a0e01a891bd895a4269 GIT binary patch literal 489 zcmVO)cuW&c@@hB}rmg zmbo7ehZe_ih*8LQzu)&5-)-Ce0f0tux7%4&Rqio>m&>K+X0w@pU$0lYTrRfX?|ni5 zqv!MKNHme4=yW>SLmgl+0(BXJI zdNbc#4D|@{;Cwh7LV;+A0zh0qBbQK%m`(vPIFx1SMiULw>C_vb$C;dB)C3BMGa8L- zFc^41o~dZ&ESpRw*6a0rBVh{?k$rzYA0JJ-CPtn!9zzQ}0Ib+W1VG&24qvU6jYtPz;6dKUASgwYm~qh=LP}pokOJ2~h-H_+KMm z-Dlc&wUt$*whAf zlqRs-@)*kHHY`38KC$73&G^+u!NKJEmxxR`AM9SML* z34$RAG~!?sGDP?t0&8|U9h=Q&E)-FKkA!NqTEyie2ODUiUawo0Wmc=ze3~?Vim@fF zR?BIvR4SfF+-YRJzRc0UBn8!(s6*)Jz+a({8ta5Lg9FS}}es_~Pe_ z4W#vY?MxLAnDYOHF-1)TEB;rw9n1vyrHD;vCLsaA5AV|Wq#XiX;8vVBn@xWM@Qh&d gKOp2#gyw+A7dTg7BmO5_5dZ)H07*qoM6N<$f@!nc^#A|> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/2.png new file mode 100644 index 0000000000000000000000000000000000000000..2dde937e1b00bb074b8c52d81be37551793568ae GIT binary patch literal 488 zcmVP)U}Q4odCKSUv)w=P8aiWDiF5R#AL!han->uv3q zi)r?my=To@Gjp=*^%}KWEl#IXaDKnv$#%P46bc1-?vBUfkFQiJkv*T!Xti1~pU-2p zTFI~1YbABNU4i#{Jr$TtCc0lN7IDAd{{TQMm&-o@*zIWxN2vB%>fX(aPa zVWekhtJmwXTrSfC%diB1C_o}bcuNx{fo5=+&1N!^Na%DrNFPzSoyC zl3{w6Zp4juB_>_Qbpgk^lo{>zT8j>;U_Kai&KY eZ%D#Z80H_j+F?wx?kBzg0000cce5?c);=uSo5fnj3R2&$D5ncFS zbNM2tjCT>zo+fE>P8%MNhgDT&MNt^*&*u{j{C2y!=j?vJ|9C7UNn*p{(Aw>`^?E(` zV69dwVx3OM_swS0G4|bV*L_&6R<_-4-42ICTtA;r%d*T9rqijtUN5^|uXaA4ZMWO` zn%qDzfIJ7M)5(3BrhY30*mJ&Kuifk7*g>A>-U0jNa_I@P+06R=zGLukJRX0N=_XK- zgZ+LV12l$4pwQ)V@kA~mR)qp>P9_uEY&LErkpM;jMCn`@F{~NQRTvBg&MLRbgOki! zHX4nr(P+3LQ3cvYPxOAj-%($*1}n?b*LVyr@NkC2fmTS+Y$8;$qDWmOFbXdgi*E2LSdFx_Y%wym%FArAtfhuS#&H0(U0d&S#^B*u` d^gAIC`vVbVVLHV@V;leg002ovPDHLkV1f&B)Ykw2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/4.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef3eb5202d7f81576f8f33f067f967e06b32ab7 GIT binary patch literal 498 zcmVn$4zNuUC6K9`^ly3p<@oR;g6nbC&0M;pw9$v|26ySglsJ z-EQ6Q_j|isE;bkp96U)9zhE|-`T2Ui_MUpZZb8X10QP)7Z9E=ZtyXiO_xo+<^VyEa zqXQ7r8-ys&!QpVQ+wEq<;n1qpssoVU?RGYw&%I6;7Ywp2a|V1*r&Di$dK|}|d%a#h zTDciE0YnZqn@v%mF*E`|ERRMmp;kZvn*Dy?7K?=&O*D|BfJNzCIckU*%~fc(+tz3_ z{5E;=G!x6Z-LA_TMUmIJ3ebigvVA@ukEJ!a`~B`Q9%C1Hc80_ODl}*|EmX3iNLeLv z08b{99|Pv#kdc4$fLVFIXrzR5|9LKrFo~* o@i&0Z7%~3?Mh$c0`ITAXA85Z`<+ZeiQUCw|07*qoM6N<$f)lFQ5&!@I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/decorative_7.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/decorative_7.properties new file mode 100644 index 00000000..80da1a4b --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/decorative_7.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=7 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/0.png new file mode 100644 index 0000000000000000000000000000000000000000..3135557310c1a66cfc416dc629841f9df8405b10 GIT binary patch literal 440 zcmV;p0Z0CcP)kV7*vbpF~7k_Ew zNjd$Zd_&0l=5mspBzZoc_IkZs^nSnJ{*FHRqwR9JSi)nw-CEnWF1+Kvu4}8R$~K#g z-EKGA@Ard$u~=Agzu&Da%de!<=`;Z0+wFFCI2^2L8W;T7=kvKGv_ujH0UVFVK?|7b z0;MZ-Q4~D@feMa+5ri=iY-qaj5q>#{TnG%U4&ed;WEg=e=kwV`bFWq_uYjfqZ4(C= zd;sv(!S#CewWvDI(P(7j@z}bqbMi=v<2eV9$HNV@MFkPGUaxI3nYhp;%xgStEz7cg zjhZ#iuVbM)0OA0jNYC^9|3mr>q^nqjZm>_M)4w~2$!e1%*2V1nAury^Y&Pow;_h{} z+P5xI94HQP0C6CvW+e$b)u^n4if5muY0m)_buj9N>iVl?1U}G!I*AzAIah^VE|)I+ i*)y6yKE;uUu*MJTGjq@sc#azY0000^nA;^K17Jj1^V&@g-pkJZ!aEIVj@X?RI}H{GWjU!EiWq1)t9+Dr6P_5^sUT z*=%M-Q8A_%N{eC}A9w0x z@T*w9Kw_uUaVHXECiz5`59#g!>tRhKFf=)luclU4U63X9sC{D;6wt!+`HYfN+j9>x zhZv;>CE5Z5Q)}3mQ|$yXii8J1jC|IMg7kkNGIG8>E>-3HESZb|00000WbcEP)pHDZBNAW1fA$bRvC>( zBgaqE)He|V%+sE5hAG5Lf>HPZUc226npCo2y!KGK2mGil z6b&QN6q=?9tuZA|+Hn&h&=@%hpvh$7_?=G2352Zzh@3B^Fl4gFMK?b~|4a!Fs*+zQf^Qo6W{n ztCjO1&vP3L1~!>YY&;&DaxfeYZ8RE1^!xqD(bwzsEM!^c1tJ4#m`ZSXX=D_M=xV$NQP&BW21CqdGn>!nwpc9O jC>RHhNDfCId1|gdGWTQ$`TKLUrA$D4*oM7WG zjXZgoWqGj}cGo0xlVl8=&BjirlSB8*GFNWlH zyV+{Ba^l@?7xOv8VzDrgl9Xi`71U}qdp@7G-|y{sJUWO|17T1hKZxLPIJkmVtK}rL zK(f@W*X#H}C!hduS0V~%0g}h#Vaw&xK@sP6yZvk7{|p2OdcB@2_ zr&F8FW)9x{e&1Wr7S89h4TnR|o6qMqnM`aj7NpigP)`A{%IeE)~!jY$HMc87q~FGTh*f62>`VJ>L+*yCK*=h!E(9OgIq4Blt9I8q%fvZDeZYClaWTF zp?<{UaXnLj_xr7X;q`hcGK_*jMP4g&s?tXCX+JG@e5T;r-fp+5*Cg=r7)gdDpY7kj zfQcm7+s9bUqDufEmCBZnsg475av4N6f8T#B7E^D+;jq-}^{;>P2iucnX#-|z7ytkO M07*qoM6N<$f-%MC!TbHCqdyWLV* zmeZPL8AsDJ(;oNs`~7r(wOWz!e!uxpiZy`Fe|?MNcvPU7C6I$j*tLqw^iGm;? z1AS_S!{NZi!Y1nGDgdxpEXcrsG&_0*%kg-mG)*T~}wSfSmRwKap#?OeK2}zP9 z3?ThV5rDDocDpY_S(Y^_5X1bEk2Aay0OsCc1)I%=*6TIf5{QoD@bj3a$*XPKeCBx` gg<&||TP~Lze{v6TY@*kelmGw#07*qoM6N<$g2;HwlmGw# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/2.png new file mode 100644 index 0000000000000000000000000000000000000000..79fc1a1d2e4a6d3493c8e04c714ab622d4053111 GIT binary patch literal 480 zcmV<60U!Q}P) zICnZT%p%+-H}~Y^B#qKEwfTH*+wIo6-L74)S9?4jmgl*j_xs(R&!^pPH(RY%?vpzn zkF8#>Tl9Lp?0i0ZkU*!?@ozw})9Dnxr_-qyARmBIsbtan{SFKW6ah%W@UecsZ@dIqAPxZeQI=(aCJf>@ z_R7oU(t8F#J^(N#f3w+qGY~}ppeg^q761Uy0T_|!LWv}ar#N(v$D<3Zf(Yp%5@1x& zZMWM&#A0Pc(-{Bk0RXBf1`>`wvHgB;>-E|OgMkAGjDisXk`{}F_XGgF|L$Lp)H1AG z0|0oeDFC3ciK?cA2COvxY&QG3iHE}>Fep}qo!D@v#Uthb{7g8L$;1Pr(a8JNBY-*C z5AA_O4h*y~h^Q%uK6gwB02qid)@(Mvrl2Yy)@n6tG#YM|O2yA=wQ8+a%Qey_O0y3X We`&e3(h`RN0000)Nt%@jS1o1O#I5kxB zdcxvT;oYv>?tDJWe!rL9ZYQVHNsh;(>W{}mCHCv}lH2X3IzTtL>2xZa%|=?SmY|#L z_xp0MI-M4Gzu%QK7z~0SWcsUrd~mI*TrMZ>a5(5{DwT?^ zi9Mr(d_J!$1H2&%g@X28tyc9O-2463`+h#3!R`CFUaw*t|3AP7-?0u#>vTHWg7s@H zESF1_?RGmDunif${tI?6Har6a-q;cWY!1dHnd6@6i91Klgs5Ihr>bU^SR=l&!@hP$76A9 zn$4#4`+Z5L(^4*%6*wFY)wbKM-wy@@xn8dxAB)Ar!Nvgq7a>8n+g0O?)$4UtVt4|& zPN$o9~IFghQ%|-@N5PFgsD_2Dq<)%ES~LY?`E_4xnC}qQYw`q z1;|D&5lv2BR0px|Op z7sn8b(@TSIb2b?8oSFaQzUqjjFeALRMn7yHMfAZNs}T|h3WqW59*lXjD$ mDXUF4OqSc}bM<~Jhu-o4zuF+%W^JHz89ZJ6T-G@yGywpAeOq1t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/1.png new file mode 100644 index 0000000000000000000000000000000000000000..356de83cf8f14fe1bb9fdd25a8e2a14547d623bc GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkS+~ zi(`nz>0|*x!Jqz|X$*qhTTK67-(399JUQVu@GD8+7mr6&DmVe0I#* z+$fR5;A6b&rGl@)VS^mDRpzad4QnJ<929TaDDkYjPcnf`!E$oS0fu5NSGEO~Q%jg9 zIM*fcEV#if!mf1mqDP?<)6&eYNk$s_2Y3{2BR0pkR=v zi(`mIZ}JC4!H$lOKi?CQe(m>&{%qfI)}fDa84u6@&5b+e&7EAr+;BiVjpKxBiX?+^ zi;n(+=0Ik*HH;$aDyJqH`50@MPntS2;ilvg$s=qGFJBpdQFLb00GiI=>FVdQ&MBb@ E02(kdrvLx| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/11.png new file mode 100644 index 0000000000000000000000000000000000000000..ee804b0fee7e65a1e4798c75e429e53f4cb0d638 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSz{ zi(`mIZ}NwQ0tP)&23ZFT3>{otp4f9R-`p4A!_jc{;1|OR1H-@OsR<5dEejYGwkp^v z?B(g+V*3C3=3*u3Ch-F%hrcxLWk_o9QNG47A!>r0fHcFe8zvIcLYtg`7BG0a`njxg HN@xNA0?IOe literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/12.png new file mode 100644 index 0000000000000000000000000000000000000000..f1cdf6a1d09ad5df081847d42d8657f3dc4a9737 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px_cu z7sn8b(`zRk2BR0pkSY; zi(`nz>0|*x!Jqz|X$*qhTTK67-(399JUQVu@GD8+7mr6&DmVe0I#* z+$fR5;A6b&rGl@)VS^mDRpzad4QnJ<929TaDDkYjPcnf`!BSYoQ7ECoa;g&Zg*jfk z7*8nL8?XhuVeMiToN`FRsNqpb!?ar-<_vR|HO|Ok-jpcGoW$YDz|fd&r@BqA=_=4= N44$rjF6*2UngFIcNMry2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/14.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8c5372b58854209a451b2355e989706b96c34d GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSn@ zi(`m||J$C8yax<8Sn4^<96ir6q)d7fKY32d@&%>hk}q}kf82X!P1pt9t3RCzzISz; zI-}2Ae(%QFp61of$s#2a(jwW@cRad$^`+B&=5V>HmdKI;Vst0F=@^*Z=?k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/15.png new file mode 100644 index 0000000000000000000000000000000000000000..17727f6093e0763e4478cd001fcbf804ce45d59e GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSw` zi(`mIZ?b@(;7@2BR0px`o3 z7sn8b-nEkr`5F{>T&2YxpHuBozBu!uqyHntJ>BB2c2Pkk0SDCXH!S4m+P`FLnf65K zJtwm3IM>XdQdE84vWIj2`jb2ds&aOjzU54)W&9B#(KMN*!BCC+z=VjVt!C^KSYkU% z8=9&;7DgV)}Q0=k&N)78&qol`;+06wx>lK=n! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/17.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe8cd81c08e09d6582489d3d639a34ca89569a4 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px^>e z7sn8b(`$nr`5F{>vUfQ)|1#z9n^sZ^=TPt$XGlJ+;N~)5F%1sjCcMCnhOm>2&i63!M*I jRT6hX=FoASEsq!y&F$VVOxP6$bSs0WtDnm{r-UW|h=5+I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/18.png new file mode 100644 index 0000000000000000000000000000000000000000..e0b8e97239e442a80de80a7b8eefd352d97d1092 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px|Ur z7sn8b({Cp`ay2LjxZ39}+B>~t+NA91x?fae7ws;&cv4?V$jNng#)Ia=XX+LHG+v9k zwr+Z)=EK|ZBIP@F_d4HVKg+EUd?l8l{N+ONC85tAtk)Ld*qabMGoO)5rS{>|~Q>g#| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/19.png new file mode 100644 index 0000000000000000000000000000000000000000..0b5194df5426a06fff9d25b2620840e3c7bbdf96 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkS@1 zi(`mIZ?b@(;LrH;=YHOA?tE$A@z$Baz`)>-IqRbw1-6yx44LQJxP+1!HYp}BJD4eF zep5ZhFd<4Jt-)}?tWL87H*QEIF&Ij1kbLmqfx}Ejhb|lD34i^!F)G|X$;Z4(!eOHL xgjmP98A~h_1LsT;&&+NrR=zp2^U@n0hTHa5zNg!h#efcB@O1TaS?83{1OWQBL_Poj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/2.png new file mode 100644 index 0000000000000000000000000000000000000000..033e293088adcd262e6f9803de60d07e4de5cdb6 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkT76 zi(`m||J%tMc^eFPSn4_Qg&f~9o>6%dFYV{0aYwPd!$bUN;X7^jv}v*>UOVpx^cY^c zYpgU+%A(jk|Ek4~TQ|}iSTkEg3zlii$xhX}V)sC6)@%MBZVuHGZY{p^&&TwquK3Od W+ZFGap6&)($KdJe=d#Wzp$PzaraayN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/20.png new file mode 100644 index 0000000000000000000000000000000000000000..b69c3759511eaea40c7def9829d0b5600002c76d GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkTJA zi(`nz>EsWJf*l)FLx#56#8pjFM6iEi- z79ITs&4J8q?Ti~(7`+u#)KvnCSX8}LoISixEr?+~CF0R0Fm-0auLE%mh7QXFvl%>e dJ@`9#8BThb{`kFZ-x{E`44$rjF6*2UngDH}J7NF; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/21.png new file mode 100644 index 0000000000000000000000000000000000000000..7db5038273719fb2f59f2b32fcdbe3a140f88b85 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSV- zi(`nz>0|*x!JqNx&;7jL-1*YJk%fra8iwbY=}!zRr|$`-~G glNnB=O-K`vW~fdw&9#}E4ss5Ir>mdKI;Vst001>UWdHyG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/22.png new file mode 100644 index 0000000000000000000000000000000000000000..2421176403d868621dd2f831e52124aa111d6489 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSn@ zi(`nz>0|*x!JqNx&;7jL-1*YJ2BR0prEg( zi(`mIZ?b@(;LrH;=YHOA?tE$A@zz->fg$r;TEdTft|KXu44Wi9H|w8dYcNsDRJ+R% yWZENTV8gq>LNRd86!FaLrefurGdnN6;bD;EHSV1*{p=;sU2BR0pkRTg zi(`nz>7|o5@*Ys&Vae~f&$2YVA!pLx*Z$3c3pyuGd{M)0V>anegTBFo-|2=~@*7l? zHF@7p((ITkS|h2lb8DFn2b<@+z4F{mi4Dh_5~lGOP1;+RHes*poP8+)VpHY^@NN9l k`_xTqdr{>Kt;c_uI&Robko#0^1GJmL)78&qol`;+0LLOk1ONa4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/25.png new file mode 100644 index 0000000000000000000000000000000000000000..21ae011383728810995dd47679f8fd9fc4f62665 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkR=v zi(`nz>0|*x!JqTb9{6xyq(iddM!U-a2BU_UvjxlvGjf=FdV4jE4;(z$XvExLlFAk! z#P`8K;kxJ*!-gdN0GSREcjcp;osX9I6s9dwv1VpCHr?z(vnzWo&~ye*S3j3^P62BR0prDwi ti(`mIZ}NwQ0tP)&23ZGIFdjb2z_7yHK;XJjzXDJNgQu&X%Q~loCIAe`7@7b8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/27.png new file mode 100644 index 0000000000000000000000000000000000000000..b9315aab04b361a45fb7c25d05f32476ca2e905e GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSD% zi(`nz>EsWJf(8Z#f6Q4QNOh$(; z8|Ddr{ed#KPx3LZl5m)sp<*qtQmj`*U8U<#!=f`S^X4*URhV7SpY`o3&;|xiS3j3^ HP62BR0pkSS+ zi(`nz>0|*x!JqTb9{6xyq(iddMmqz;%I^tDzxI1Xf41*9%b?V8mB*N2iCjvit+o0Q z28nNqd_NBHFz#f@Y1p{Y(39-|Ph<7Lg9jT$m;)G?LzGk5CJ6GaU~4$k5ECA7oS|#4 yL!m;DOs|TX%AG`qZH!A&)Yh;~m^AkyBg0g7iw(19>fZ*sgu&C*&t;ucLK6UAxI<0= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/29.png new file mode 100644 index 0000000000000000000000000000000000000000..fc2eb220c0df6a9ecf62bc72fa66db2921785154 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkRfk zi(`m||JzB1d<_abuF_(U&#Cq(Uz~Z7(f^U+o^J8A`&fM5sP%Y#^5EWcKIr4UZ0=2+ zFKQfxoi0c$UN+^O+zQLb>%Lg*FxvQ(fjfwE^MjP|iY-xV65cb02R;79Y$yFeV#_K9 tmtz%$?`j<;_7`5*`}#H056PLoSoXJDJouuyTOH^I22WQ%mvv4FO#puxOBetE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/3.png new file mode 100644 index 0000000000000000000000000000000000000000..2342d36ed7262d471ca6cc20bce17520b6a3856f GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkRlm zi(`mIZ?b@(;7@2BR0pkT45 zi(`nz>0|*x!JqTb9{6xyq(iddM!U-a1|tT~&H9mS2MlhqNk~fvr!_P;GpDjKWS-)2 z;Aa1Hh~cCta{|NBxCIshntg6U!a^Rs`e#l*QAv%D`1dg(>6d>|TGPt-C2N1~pEp-H mi9z$G2BR0pkTG9 zi(`nz>0|*x!Jqz|X(!SWe&n+qQRv&a@nbzZd;5PoJG%lqj^-N*h7)9Z_%AVEI-S6! zw190v@&vURi4tbaUmd<0HHiFNl&sU1xPtLz>W75_JyHfXJO?HPco-jO?&O@KGLc8| vY=i5qS^r<(w4BJRc$Zs&*+Eb7I0J+BB8vwJ*|yh!&S3C#^>bP0l+XkKY3V~Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/32.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2ee6952c0681d4f0feb87d6900a14eb07a0222 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0prDPX zi(`mIZ}NwQ0tP)&23ZGAm>v*sadmO|*K82U)?hNr$l%ZSge0ZA3^Sg&-kSCQ^-ar@ h#tbRO9>yKK4APxOB8oZ}jDhAbc)I$ztaD0e0sxmWDPaHr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/33.png new file mode 100644 index 0000000000000000000000000000000000000000..32dd1a5a668057cacc741bd46d7afa675a47158e GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0prE~{ zi(`nz>EsU!1q^zm46+Uw7&^GPJhA6szPT^JXBMNJkI#Q!Nr?%(if0>KZ_WDu`ljVX kUd6lI3d|0AipLok+NTFVdQ&MBb@0Gv`N00000 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/34.png new file mode 100644 index 0000000000000000000000000000000000000000..a07e85e3d91770f724d27a4fef8b1d7de8b2d7ff GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkS=0 zi(`nz>0|*x!JqNx&;7jL-1*YJAxw1gk|Tt`wQ88%6JZq`4^)?lKPsdkq^ zp6lQWM&)Y^1x?MW4x4xwGFepX1I!d|GR%19dTZ8$7@uj33bP$&Ip#2|`DEN1+JApF P&>{v;S3j3^P62BR0pkRWh zi(`nz>EsWJf*l)FLx#56#8pjFM6iEi- z79ITs&4J8q?Ti~(7`+u#q#3;W7Nm5haAdMI6p3mCD@Z!+5_e#0h;iy;WC&w5{_;*R R{5H@o22WQ%mvv4FO#s52BR0px{(b z7sn8b(@Q4@ay2OMw0#%bTP=Jtoj*YRrGV_+SvkpF7mhXAtNht_C&WW@tMmfd_y?zd zer7o9$`*NGy68Mrr3VqLvtBmM*&KbqNBm0EU8b}KhwTkB7qW|;w27}uh-Lj>`@%6o zKu__`kq?#{B|4r(iDFB6?|0jssxaK*;5H XaV|`%r*3=$I*`HB)z4*}Q$iB}UTsw& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/37.png new file mode 100644 index 0000000000000000000000000000000000000000..d26ad9bd298b432ec159cba22fd108471eecc58c GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSS+ zi(`nz>9vzL@*XwdaETXRnl3!$3QvRjNdd{ZA#NJK&YEv5Y2}``gIQqW4h23Ag+J%p zJ9Na=6S5>1tg>yG`IX__J?4_46FgzNf3RKHc7bo>UUu~m?!$MF^JhQSRhV%+L~*Ic z+r39^90WV7Zwm*hFIsgqZbsxk|Bh@Xt11Q&M%#P_8U9&7moRv``njxgN@xNA!fQph literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/38.png new file mode 100644 index 0000000000000000000000000000000000000000..1fef63e2ea5181a7c4e8c7fbbd31959bad527706 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkTPC zi(`mIZ}NwQ0tP)&23ZFT3>i57F=xh?=qM?Dl9x;lX1;VfflH}DB9=KsSR#2c^Gn9p zXW4|(0+@Sxd;eQoSR62I{Gq^O%%j5oxcN)N7o!B@xgtCaqD^LZ)UUEU16sl0>FVdQ I&MBb@0Bt-l3jhEB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/39.png new file mode 100644 index 0000000000000000000000000000000000000000..ab6da3f14d59aa743885acf3c9c829242cc5a1f3 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkS+~ zi(`nz>EsWJf(8Z#f6Q4QNOh$(; z8|Ddr{ed#KPx3LZl5m)sp<*pyc!^OXlIdv8MZ;ae7muDz@RXdgOmcyY&a4N1uE)|& z%;Y@MFq5rFOr!OnN#hTL<%gW)mhGH3S2&5mY_{h?hQ0S~^F6BMSb+{=@O1TaS?83{ F1OPf|NGSjS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/4.png new file mode 100644 index 0000000000000000000000000000000000000000..5ea23d61e2f6e2ba455c0124216fdd6418c8d9db GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px`1; z7sn8b-lLNZ`5F{>T&2YxpHuBozBuzDqyHntJ>BAK|ICtdVV~$YIe*oc{bE5UqE4GC z?b){P@z%^rm89n~?E)!+hAk5R_k4eDUNl{UafRjb!%H?qKb>K(p2BR0pkS4! zi(`mI@7u|STnz?1uJ*A-&8Pgp8@)uX)&-}3M9 v$QFJwXX}(Cf%iVsKd!xhazbl*{}Z-luPs8GKOEZ&bOnQ_tDnm{r-UW|^}9@( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/41.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/41.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fb7eeab05c40691a020f0c466346f21d6cf0eb GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSG& zi(`nz>EsWJf(8Z#f6Q4QNOh$(; z8|Ddr{ed#KPx3LZl5m)sp<*pyxJdAs$budEB9o_0u$eLA!OK}9%nuSbctn4$x3yN^ pq_`wiO@Pse;fYWZkHh(M44&64t{jurvIn|=!PC{xWt~$(69CvxKw2BR0pkTeH zi(`nz>EsWJf*l)FLx#56#8pjFM6iEi- z79ITs&4J8q?Tii|bP0l+XkKS;9sD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/43.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd6365736a1469eb10eb1cd0b6a1bdfac998a5b GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkR%s zi(`nz>0|*x!JqNx&;7jL-1*YJdWo0P=43 zEV(&dg4rP}aR%eDhAg#P49UsK9gKEMm^U!;@$pTOWLR?2nBnIC6lsP{bKe*&=wcM9 vY<%RfB+4Xc&IAoE<|$`fR^@$p!^6N|YZ1IM?dl?+I~Y7&{an^LB{Ts5o6kcq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/44.png new file mode 100644 index 0000000000000000000000000000000000000000..941240a48f62c2ba76ccaffef2a611c83c2a3345 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0prE6t zi(`mIZ}JC4!H$lOKi?CQe(m>&{%qfI)}fDa84u6@&5b+e&7EAr+;BiVjpKxBiX?+^ li;n(+=0IjQUI{gz@ny>mKRo7r+YdC1!PC{xWt~$(69B^4EA#*W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/45.png new file mode 100644 index 0000000000000000000000000000000000000000..8002d52775543b8130c9cd757a9bc37be0ecfdd3 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0prDfg$r;TEdTft|KXu44Wi9H|w8dYcNsDRJ+R% iWZENTkafVol!3u=y2BR0pkSV- zi(`nz>0|*x!JqNx&;7jL-1*YJ2BR0px_cu z7sn8b(`zRi@--;%xJrvZKBwBFd~xPQM*l~Od%DHf)+}-9>|~nshh^3`$A`{dn(GAD zy4YAIF5H@y%oCmcSn80B;hBlMx5~bEu4i%+U%=qes?->(D!}is(K{;0_CQ{trRmKk z#kZl1OH8#i_w99h`R=IhAEp&q3x5f*G90gR$eNNPf5!K4azQAc!aYVi)|%SJJ$yIf mKh<(GJWz>e2-?GTfbs4D2c=^y|EhrQW$<+Mb6Mw<&;$T|Csn%u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/6.png new file mode 100644 index 0000000000000000000000000000000000000000..faf939461298604434f7c3e8b7771f3217ac4064 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSk? zi(`nz>0|*x!JqTb9{6xyq(iddMmqz;%I^tDzxI1Xf41*9%b?V8mB*N2iCjvit+o0Q z28nNqd_NBHFz#f@Y1p{Y(39-|Ph<7Lg9jT$m;)G?LzGk5CJ6GaU~4$k5ECA7oS|#4 zL!m;DOs|N#O4no~%bA>0q#w@gob!g~5>FB{14pFQ7Nb2rpMj2H@O1TaS?83{1OO%3 BL<#@^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/7.png new file mode 100644 index 0000000000000000000000000000000000000000..ec9855ce3f885619f5f5e060d859ee748e1a14bc GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSY; zi(`m||JzB1T!#$=Sj0^a?zKw{;#wXy)2Xsk{^9;7i>LQ&XsT_ocyO*F@#x%=%?cJr zC35>sy~?U*t1V5jOxIpoQ{{73Hh*n<=n#g4f1Eq6m{m$=l@a8vwBl-`T;|x zeLAP6g>^5h<|tJaSBzd|z_VuF^?S>_xAXj5$!5N;uCZxLJ@bs#g>{Vco?1Pb`I!GA P&}9ssu6{1-oD!M2BR0pkS(} zi(`mIZ?b@(;LrH;=YHOA?tE$A@zz->fg$r;TEdTft|KXu44Wi9H|w8dYcNsDRJ+R% zWZENTV8g4Rtk`(<;FpP$ryQK+SmjV9DVCYtRII#lCg(EAW&Mp;-tYu52XS9wPGV;0 X2{4`b>D<0jpoI*cu6{1-oD!M<9uhkM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/9.png new file mode 100644 index 0000000000000000000000000000000000000000..6b46613fafd065a5a75a0efdf4c709f213214229 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkRTg zi(`nz>0|*x!JqNx&;7jL-1*YJMT)ebY8 jZk%bk%Dp5dy@Y|`d7f!*d}??<&~64#S3j3^P6 m00I~feEs+T^TWGj8vp>F8554Rpdvp20000R4vMmIP)L_;+~H%37?HrkNB QTmS$707*qoM6N<$f_rT&ZvX%Q delta 78 zcmeBS%$cC#VeIMR7*a7O`Oo+F_v_h=4laDp!^1O0;s6M^bUq7YcH@;WWnh%xulf7^ f|L4QIQ=}Ofx+?^<54RgKGXR07tDnm{r-UW|AblS9 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/10.png index b5c619dded11a3a43f7117c1326b45d1f1d26c1a..feeac18348e26c40ccac21ae20a9484e5da3ab9b 100644 GIT binary patch delta 81 zcmWG9n4sb#?djqeVsSb-VF828k6-WY4{J!UE>5su2q;PHmw|ynASKnw k-Q2*!z|hdm)ZEF$%*oZ&t-o!`Q=lA!r>mdKI;Vst07#e_asU7T delta 56 zcmXR2pP*ta=jq}YQZXkvVF828k6-WYRe!l3)R16pX3N=E_S>F8V=cQFql4Nn1|aZs L^>bP0l+XkKQ+N}$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/11.png index fb46a162943d5dad8e5f73e09da6bbe7a190a936..ae05d858da9fbc534bc093b9565a32a8ad8fe195 100644 GIT binary patch delta 78 zcmWH|ouJ|=;pyTSV$qwNAi=sgL4-%V;KA$t|EIiQW%yjfo~r*&-IRfWK_Dg7$=%Gt h$k@Qp(#gWW&B@Z(*tunHvNlkT!PC{xWt~$(69D^t7%Kn( delta 54 zcmc}|ouFbUR!3 gIW#p!HbF!%G%`0dGFl$?Z~y=R07*qoM6N<$g3ypLaR2}S delta 74 zcmbQkm@z@cMc>oKF{ENn@}KYT@7J>#9bEXHhlgj1#D<@@-v0M_lGWB2$n3@|Vakwo eVBz~Ik_-%OihNH^Ele31fWXt$&t;ucLK6V4WE}Yb diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/13.png index 1a7f8d0b05ac0d6f10fe3b72bd3eb9abe30a3d9d..5bbd97cb44573b5ef2f18d2110addecd7fcbc9c4 100644 GIT binary patch delta 108 zcmV-y0F(b_iUE)$W;IDfK~y-6WBB*)-+z4g{xAG;3?K#rC1BKm!C=6FuM`@v>)D$D zHemC$+XHOCz=r{)(Fg#%Om}e2Xj2vd000nVWkN?rGe$*3Mlm!(Ha0>xLqtVnw+>$b O0000*?YcV&R|s2n-YKX1V0c2Gk?kAYzUtG&i&5y5W^3=9G( msZQ?ZmWHM#7A9^kE*1uEt|q3@X0E(IIR;NxKbLh*2~7as9U2q> delta 54 zcmXR4ouFbU)DJBE`0ywl??0R1Q8x528JDdtXtIQ3b!%s~j-+u-&0a)*@XK%@A!PO6K@5NDTn*0CY5m?Bx>x000nVWkN?oMKUopH#SB? aGc_?YIWj_+eX&yj0000#9c*0x|DSO{5(6_32&>L==an!`xWd4aVDsVY g{r~6r-%rYAVBk{`QfA~_$jSf&p00i_>zopr0KSA9{r~^~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/17.png index f64f63dfd3bb307ac51e3add053a0704672ecfc5..f1c3c193a7c43aceb9aa0de9e3201285c2925e6c 100644 GIT binary patch delta 115 zcmV-(0F3`~kpYk-Z9GXtK~y-6V>s~j-+u-&0VR5=W5BLwZwA)G2;FHpq`AOeO#2?K=j@sZVoFaT}xZ!fVj8ruK>01#wlLPs$*Fg7zrG(<8%K}0w* VMn;W}k9Pn7002ovPDHLkV1k!ED*XTe delta 84 zcmbQpSTsS!&(hPyF{ENn@{jND@7J>#9c*0x|DUlT5KPKG@VvcTa>j|PJj{#PdZY}p m7+4JCe*Aj>A1Hj%jDca}M}a3tFZn{2Gu zPBJra#n_oH>YDqCfq_9FCDqB@)X~)3z{$kez}V8#(cHy3C{O4KP>#XV)z4*}Q$iB} D$SfdP delta 66 zcmZo-U4ae_#Iw1M1@U+@1vZ!bS-#=vmk WFP}if|BE#YK;Y@>=d#Wzp$P!xksR&- diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/19.png index 9692a89db72332befc24aec0a0c9121e3d24023b..d72e9e966f0722791e5f9e64e2e15e3c4a18179f 100644 GIT binary patch delta 104 zcmXSDW1OIpWa#PQ7-G?zZ1Lgi{dzVdM%Aj7$p_Y@=d;~tID0*h|Es}*8{EwK2Qnla zco(RcHZln^SaaEXmFF(WXJB9uNJ({aH#ae|G%+`Kb#yXxGck5{Sz}eY4JgOp>FVdQ I&MBb@0L{1}t^fc4 delta 82 zcmZo;ESR9;WA5qV7*a7O`N#M7_v_h=4mPg;|IgSE2qtA8c-~$vIpf4t9_GbtJyHf) j3|AVM<4>MH#{&cm!hw7y{yDF_7=Xaj)z4*}Q$iB}vR)tD diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/2.png index 6988f5ad8f8d7543a72e62a8e19ccc0c0d006af4..92ff119531fd61124ee289be89ef304e979904fd 100644 GIT binary patch delta 102 zcmV-s0Ga<_gaMEwU@u8TK~y+TWBB*)-+x^A{x1l|C(kenM!_f;EMW7s+y7yB*RwZZ zjLb)tN5>#}0FPF6_^;j0asU7T5M*USM?^R=ML9AvMMg6=K}0k(MKh~mTL1t607*qo IM6N<$g5gFd-2eap delta 66 zcmZo+OqifzqweYA7*a7O`Oo+F_v_h=4laEE}p0zuy0U-d=vvjDf)} Wfk&c5i}@P^5O})!xvX*?YcVsSb-VF828k6-WY4{J!UE>76M;I&D`L!UuFm0Ns{slYD=1_ptY mR3~>wGgD(Tb8{zW7jsJkXCq62b++eq1LeyDj diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/21.png index 26fa3f3c093556f55ab3bc974dd6fb7623f4c330..85cca61931fcd6bab0475fa26b73824bd22e2815 100644 GIT binary patch delta 82 zcmaznoS@<>)DJBHm-m2T9$Qjf(Vb+hM%|I{%3Hu<>r5J|64i( O5O})!xvX}%WV&R``@!{+JdNw0Q)hhRc8WOC{d<+cI-0Z3GUta%aU|#XV)z4*}Q$iB}_#zmG delta 54 zcmc}~ouFbU)DJBHm-m2T9$Qjf(VZl1B0~{`;OXk;vd$@?2>>1084>^h delta 52 zcmc}|o}i*H<>}%WQZXm_$M^U5>)QeixZDmFFtG0nnl_h_)scP8^B=Rt8Gyjk)z4*} HQ$iB}D`OMl diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/24.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/24.png index ce05da71ee789752dd4aad10a35f0332f364e773..25a0e1e090a3d06a11b858636ab1dae508d96bb8 100644 GIT binary patch delta 123 zcmV->0EGW+nE{X_bwo)-K~y-6V>s~j-+u-&0a)*@XKx110I*()4cL6`HrWP%^->%L zl*9tqa!L#Udx2sDCzJL002ovPDHLkV1oInDM$bS delta 78 zcmV-U0I~m>0c?;YNHa-9K~#90WBB*)-+u-&!GW*;{xgxQnSp_U;q$}03=|o_z`!tS kz^DPE2EYtB^qn#T0DoW%H2tk3xBvhE07*qoM6N<$g1_z}lK=n! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/25.png index d7d2c612e48a3d42c0281ef4c38f38a807bc1c41..09cd1fb8eadd4ac42af9a24c6449ee396c2edd48 100644 GIT binary patch delta 98 zcma!UV4R>5qwVS97-G?zZ1Lgi{dzX91MAZB+jcR|UVm3EK|DZ)n>qi0LC3L1e|F}1 z6ByQ{S^Vj#pPRzKz#x#4>f~FVdQ&MBb@0H4hi(f|Me diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/26.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/26.png index 55b8c22f96342710343c2b20d87e4ada218240c6..93141a8a28f1a4341d2fe4cc8077184d33c177be 100644 GIT binary patch delta 71 zcmeZHo1o$(=;`7ZA|aV9!MZp>q=!j^fq_MUfswoELN5aYgFs5Ele@XOtEHo>n~|%T ZiIcI3p@H8ev0p$r22WQ%mvv4FO#oAT5q|&x delta 44 ycmYfEo}i*G5qwVS97-G?zoU(vH=Etx1_KzE+HoU$$o6#)c^VZwWwmcf&4jqs-kYWqr za$%^MVE)bDHS!Px1A{SDg`2CnfrXKitBIk*u4)&c9D}E;pUXO@geCw- C@FD>K delta 66 zcmZo*OqifzqweYA7*a7OIbi{V%#UC1?S)m@YU(PcH!3kpNJzNxN|+{GVaSqXVEA6a V)}$99yPN?CJYD@<);T3K0RYxN6pa7? diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/28.png index e1358bae5c0a8319c476fd561db50cef4badce8d..b576e26b8df8e4e3a6ccdf114a21a63022479a03 100644 GIT binary patch delta 104 zcmYdmW1OIpWa#PQ7-G?zZ1Lgi{dzVd#)$Xp((_N4G4Qb6YdCv7kADNVMrW&I(gA~x zV~zgo%=0ENoMfmdK II;Vst0Q_+y2n-YKX1V0c2Glt@4)DJBE`0ywl??0R1Q8yi4L@(a{m*bV$&L*KYr3qRqi0LC3L1e|F|s z6CA1-w>sFYTiIvm#K6EHkdo@;Zffaf=w@PI>0;_=?B?oXJmIFW7Eq4C)78&qol`;+ E07pn6m;e9( delta 65 zcmZo-jGv%lt>)?C7*a7O`N#M7_v_iX7=%@4x${bxCR}02k}7y%{d1Oi{O-T<3>WTj Un(Q*J3Sa;NPgg&ebxsLQ05FLdEdT%j diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/31.png index e0e267a31f3d55932ce25b24ef1c8f7de5857a77..3d7ee2dd2f9692f4e0a8bb298490e07ed3bfc819 100644 GIT binary patch delta 88 zcmazmpP&+~2n-YKX1V0c2Gk?=fQ#SQ=3#6+Lk%pVn}FP s!N9;Ekdo@;Zf0TNXlU-_gnPbQZXm_&-eHD>)DJBE`0ywl??0R1d$62GC#cP%F+@N5*Qff>vN{f S-DGCN00f?{elF{r5}E*Oml){) diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/32.png index bbb135790848379bf46580250739f1a307a556c0..c23f9774ce7b9f3755116939e975201b964d0ffb 100644 GIT binary patch delta 75 zcmWH@nxNt)>gnPbA|aV9!MZp>q=!kt;=|Yb^$a|(m^UlGE8NJyz#x#4>f~- eY+z{NWbSO{Y~ft@JW38I$KdJe=d#Wzp$PzRw-$>4 delta 49 zcmc}_n4qE~?&;zfQZXkvL4tL0f=CY&Tie;|dH>lNc!Zf#gfC1tWdH(CS3j3^P6gh#sI!R!71c|;f(UM*tYy!g(}2nGfQfs|AycV}ly gV@oGvQwu{23nM2>v&|;Fl0Z2IPgg&ebxsLQ0IPl$zW@LL delta 50 zcmc}^oS>pB;pyTSQZXkvL4tL0f(Vaz!GqWP|4(_r&hTmx^X7WRMK>9Mz|+;wWt~$( F69CwK64C$w diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/34.png index 8dfa45d0c343f47f18615583fb33f8b4b1c8988f..0692abe6a32909fb1c2da4ea1aff2141e7861992 100644 GIT binary patch delta 78 zcmWH}ouJ|=;pyTSV&R``@!{+J`nEs=F1Ldo>}%WQZXm_$M^U5>)QeixZDnUu+Lt9_a8rl+G6%tLs{F!3_#%N>gTe~ HDWM4fEyfdj diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/35.png index 8204a4542ecf470442e08a1fe99db4205786569d..77e6eb65cf887cef3f91eb89b10fb0f20f33fa9c 100644 GIT binary patch delta 81 zcmWG7n4sb#?djqeVsSb-VF828k6-WY4{J!UE>76M;I&zWf!&)u^~$!0E(Qh$fs|Ay kcUKc5XD1gILql^T7gJ+5<6iyRzopr00)N=X#fBK diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/36.png index 1e8f54d0080d529d4b152af6845dd5304eee9fc9..649da33d198839a1cd2123005bf719300f34b29d 100644 GIT binary patch delta 137 zcmV;40CxXyrU8&7e^E(9K~y-6V>s~j-+u-&0a)*@XKx110I*()4cL6`HrWP%^->%L zl*9tqa!L#Ud*R=|0W@IOv$q56g5lx?P&$BNP{IH?3&sX1fYIn|7zO}RrKK*{^620I r000nVWkN?VL_{(s~j-+u;5z^-R+hPnZpuiYMC7f>7v6dUmG->3n@ zzyMG>fMHOo-1Y1&oDE9m_%KKf0Mce~f@Qp<4FCWD5M*USM=(Q0H9RZ9F{ENn@{jND@7J?&F$k;9a_5yWO}N6KC3T?U!R!71=gZ$yz0JVz X;38L*r^=fh3_#%N>gTe~DWM4fiLn}S diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/38.png index 5ee8e7803d703c2889070e8a6fc35748980f6944..40f77edf51cc985c311119d9c3fdfec280098c43 100644 GIT binary patch delta 89 zcmWHon4l7(?CIhdV&R{hAi=sgL4-$q!_Ql9{~PRieN)=N?V0lF#mN(F7(NG?UDP+Y tz{J47Adr&kgwj`WU9`^;|i2x@O1TaS?83{1OT_j9X(^b07*qoM6N<$f}p=C-v9sr delta 76 zcmbQhm^DGg&Ct`uF{ENna>4=znIFI2+Y76*)zno?Z&YHIkdScWl`u`X!l030^Wp3L g|L6JNPs(Lrs5!y&MAfJF9Rm<}y85}Sb4q9e06V=LY5)KL diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/4.png index 4a55725bd94ba13fe34a9d827c08eaf786a6ada9..3eb2676289337870d3578b8750769815d3bd74fa 100644 GIT binary patch delta 110 zcmV-!0FnP{i~*1&Xg5hjK~y-6WBB*)-+z4g{xAG;3?K#rC1BKm!C=6FuM`@v>)D$D zHemC$+XHOCz=r`P(FoED0L3PIA}LqWEC2ui5M*USM>9A?I5#*(G($l$Hbp`)I3{tz Q*#H0l07*qoM6N<$f+c4u-~a#s delta 76 zcmeBS%$lI$X6WhS7*a7O`Oo+F_v_h=4laDp!^1O0;s6M^bUq7YcH@;WWjNX3eE;P2 eJwI=~{m)R{%=h%b1G#7hAnN$GBdp0 yY}G6k^ns6ofk7Z8)ydt-%*ffz#nQ~g)WFr)z{t2>b6E^fj=|H_&t;ucLK6V8pdfkx delta 59 zcmb=8nxJB)=;`7ZQZXm_$M^U5>)QeixZDmJF!ZqR`}h0*&xf&_co`U$By+{JiymlZ O00K`}KbLh*2~7YD@ECsp diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/41.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/41.png index 5c8db16441ddd270f3c33db5893a5c28bf0be881..a042ac6b452215cdce2bd3c67e675a9b2fd6259a 100644 GIT binary patch delta 103 zcmV-t0GR(~g#nNxVK7NVK~y-)V_={F9QgY0Kf{0;u}%WVsSb-VF828k6-WY4{J!UE>76caQ1rM|MrKm=kGNb8p%h>$u>V> z(6rG>MznW>|hp^1U1%Ra?r-9R}8Pgg&ebxsLQ08I=c Axc~qF delta 63 zcmb=Ao1kK)>gnPbQZXkvVF828k6-WYRe!l3)R17k!qUUO@89qLKOe?!;$>i1mdhm` T9LBMP0SG)@{an^LB{Ts5MOhfc diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/43.png index 79d6b3c9382c9b30c37c8b147c90f25b2daeef3f..9b102f75ba64a33ac72fb12ccf957dca30e54e0c 100644 GIT binary patch delta 99 zcmd03WSpQ9tK;e77-G?zZ1Lgi{dzVdM%Aj7$p_Y@=d;~tID0*h|Es}*8{EwK2QnlA zGzAz#GOcGsi7#2pz`!7olIrAcY+>eVVQgq-#XV)z4*}Q$iB} DF}ESr delta 74 zcmZo<%$T6!qVMVA7*a7O`N#M7_v_h=4mPg;|IgSE2qtA8c-~$vIpf4t9_GbtJyHf) c3{!a+7<4vpHF3MetzrNIPgg&ebxsLQ0F!(iKmY&$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/44.png index 2a057f32b992aac5c56db94d414640dcec85f755..0dc2b1e58ee9a7863ea5eca9c757dff86e07c378 100644 GIT binary patch delta 77 zcmWH}nV{k!?&;zfA|aW)fJNrVulM$cH6&OUC+uKgP*}yh`D)&R$qWn(0x79Z?v^Gl h<|f9@=4O^g#?F>51~0FFH3iBsc)I$ztaD0e0s!eW80`Q6 delta 52 zcmc}^o}i*H<>}%WQZXkvVF828k6-WYRe!l3)R16p=3-z_SjD{gS5M;s1|aZs^>bP0 Hl+XkK{Tvd+ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/45.png index 62bbeff4751cf45a2a99e5036155cf61ef2bf57a..191eb6125dad7844980c808c82da305c755f32fd 100644 GIT binary patch delta 72 zcmWH@nV{(`A(?FP;p_eSwm<_ew}To92@DMXl9)I1U$}jofq_9FCDqB@%+$@z+|bq0 b%-PA+%*oWrA$Fo5P>#XV)z4*}Q$iB}k>(c0 delta 44 zcmc}^n4qa%F(>)Q_xJbf+X4-^+zx6aBrq_@EnxnYf3IK(0}yz+`njxgN@xNAtBMg` diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/46.png index cf3711ca801ad4b5a8d24891750a26bf399b836f..79a79be1f712b617d0ff7e28785302b6df08b1c5 100644 GIT binary patch delta 82 zcmazkoS@<>{HUx8MxZ`PRbmvzs)DJBHm-m2T9$Qjf=GaDz$8`k_}zcy88q+l9TbuE Qj$!};Pgg&ebxsLQ02ve)VgLXD diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/5.png index 0e359ce63c07e1999a5d6447be431033f779ee1b..d68787a271b73b9fe6372ab33af617e6bddaa4c0 100644 GIT binary patch delta 118 zcmV-+0Ez!j=AMK(h+LNPKp YIWsjfGo3OU{r~^~07*qoM6N<$f}p`KU;qFB delta 76 zcmbQjm^DGg&Ct`uF{ENn@}KYT@7J>#9bEYS$*Y#8v)A+fr!Ts|(-z3=#w%gUkaeJO f{gd=`HXvYluEg`yM%kp00SG)@{an^LB{Ts5F!~<&bcCrd~P&1A{2n-YKX1V0c2Gk?=fQ#SPn%Ud^cnga+hCi!FbJfiI=Q>LS(sRwTR1ryx|upU8n^{4J^vgi$KdJe=d#Wzp$PzPKOqVL delta 63 zcmb=7o1kK)>gnPbQZXm_&-eHD>)DJBE`0ywl??0R1d$62GC#cP%I?*?{Z`Mg+=%Do TJFl)g3_#%N>gTe~DWM4fv+o>l diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/8.png index 417aceaf8be6d1b2bfd633611da376ec6989da84..938bc56f0d908434892495df66f7a2835046d26b 100644 GIT binary patch delta 80 zcma#ZpP=F`<>}%WV&R``@!{+J`nEs=F1LdP3{z6lC&V$ly~{1mC?#Ocz`!7olIrB{ jW@zZ>Y;0m?;$q_HY+~u!a_Wm0P>#XV)z4*}Q$iB}IH?&L delta 57 zcmd0gn4n@J@9E+gQZXm_$M^U5>)QeixZDmFFtG2NG=Hvn{O-T<47@Jf{6cr-+Zcer M)78&qol`;+0Gf^!9RL6T diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/9.png index fccbb2c9c6593a0d941ecf53e57cd4691900a2c2..c771b1fd6b52b80091d1cfaf96f7162d60f5fff0 100644 GIT binary patch delta 82 zcmWG9oS@<>{HS_85q}ai`(hXJix%fAdr&k lgZ}_Y-DWc=s54~N_C(dgQu&X%Q~loCIAuq7$E=v delta 56 zcmXR6pP*ta=jq}YQZXm_$M^U5>)DJBHm-m2T9$Qjf=GaDz${fp#oOF*FP7WwWdH(C LS3j3^P6zlCS)T>6O0C700b+W w_7lzONB{r;5M*USM>jS%F*rgrMny(6Gd4s-Hksb3y#N3J07*qoM6N<$f@ft&ng9R* delta 133 zcmV;00DAx40ipqrBz|d0L_t(|ob8jb4Zt7_1kc_jO?Jt&ED$jS4WeKM6wyJNkfbD} z-@!AN-32=*$fJxs?v7PG;fLl8A)I>q!@s~1Stl#b&(tJM-wmsz*FUSJwK@d njPu<;(Y(g_D*I9D(B(@f)BG{GU9+{r00000NkvXXu0mjf4@Eli diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/1.png index d499e46842e458e1aef49a71dd47517e011a02dc..ba97fea2863f02477194f99ae2da736456f4cd87 100644 GIT binary patch delta 130 zcmV-|0Db?P0iOYoBzsCpL_t(Ijbr%t@85q)FawwX0vJs)7#uDbH2|XV{x32OfN30f z7YwWcAa5M_`tSeFr*AOu=4-d{Vz|v<4mkkbW|+zNY)6&@0LvLnT`#>O`~Uy|5M*US kM@BX?Lqaz(LP0Y&LoqQpHWPl-#{d8T07*qoM6N<$f*T?*mH+?% delta 126 zcmV-^0D=FX0h*0AsmdX~NY|KS@c>1y%1p>AC~4Lg|_#FfOXdXp3Q7=Xaj L)z4*}Q$iB}+Qu*J diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/11.png index 7830d4f26673f1154700aad8abdd02cb9ddf3e29..b3f3942a5453cc2f8a8987491babb6875a6eaa49 100644 GIT binary patch delta 119 zcmV--0EqvD0h9rdByc}TL_t(IjbmUK1*2dTPzP+jcKbgF?|k~^Ke2iaeEkPj57GxV z047MR0WizJdO;kJ=KDX1Hvs19mFKVg2LND4I1rI(y(a(w01#wlLPs_>H8nRlML{q) ZLpMS(G&5J=KTH4s002ovPDHLkV1jXMDbWA` delta 103 zcmbQj*upqLCBfU%#WAE}PI7_->*55F09J#4zrVk?XJ%$Tyzo5_58oZ1o+BBzYTkaU zmzdqz2n3y-ogY6R-mP-;&FZD6P8-B!3BTNLh0L01FZT01FZU(%pXi0001HNklL_t(|ob8ga4Ztu61Rr)ulU*`xHeiS}5d|~2pu?$5+L*L{ z3DLmmil>O^C`KG$0AOYs`^${mW(ukphy%?OK+&L?;@CGzz@IF@0wf?Jy7=7VdEGq$ iqn(cIL~)XmUze(0;;Ksg3aS3j3^P6bP0l+XkKnZO#I delta 86 zcmXRYouCqE)DJBE_~0!zopr0OM868~so`=VW2MBz8e0mIKN$>>!{`oML&8;Y= z;Dt5w;pgq;Crd4u4?oM^{{L`>+Na*ehCpUF-UTNZBC=F&GsNqLx~rxZpJ0@0 RIhO$lJYD@<);T3K0RV_4EfD|! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/16.png index 3e221bd38b398fa963c2eab9cd00d4e1d70cf718..bb29b275659cec89526d8a0c1b2d1c3c7d98b5b1 100644 GIT binary patch delta 153 zcmV;K0A~N20kr{;B!6H@L_t(Ijbpg~>)(F{Ab`=tfSpg@{6FyZ-~anRfqKX>0Hhg2 z|NBR#0U(<}n#nc*)wEFqAW=aL7r+b}I2R180U&RH(l;oRpySQgZsWypo537%0J_aE zlkwS(EC&GZY58PRf5Dgl000nVWkN?YH!wvrF-AE?F*QR)FcLX8a!P5U00000NkvXX Hu0mjf#Kgq- z`Qcp#Msi$m;OoEtpC8^ubq=yYB)NnfO``^k8h{QMkuwH7d6EKP25i1|o9LtrQ@i=v g?f;A@8G{S}0KgYJ$GxFg)&Kwi07*qoM6N<$g2s0^vj6}9 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/17.png index fd9dd614d7c9f7c79fbdf9b454aacc119529a064..ad9f198c90f80008a45651b03401248bba62a22f 100644 GIT binary patch delta 130 zcmV-|0Db?d0iOYoBzsCpL_t(Ijbpg~^WT3MW*`!5zIOXRoc{L@qLCs4K$vU;$N{4U zj2Zv}JDR7yLqRe@L_|3-GDb2%M(9kAs{jB107*qoM6N<$faM!L_tMGH$y=*H#IgwHu_qDUjP6A07*qoM6N<$f`N4}pa1{> delta 117 zcmV-*0E+*g0g?fbByL$rL_t(|oMZg=@85q0C}3h@Vq_o!!1NsY&cMJ#ibiC>#Kgq- z`Qcp#Msi$m;OoEtpC8^O)y`2c3TOxzkuwHa$rEP4=4-eA6H*HUFtwYn-Tu!=X~qBm XlixGL{9$Rq00000NkvXXu0mjf0(Lg% diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/19.png index e23297d829398af79b7811d9eddeb3f2d4e2f2da..2bff478902693ea82bd573f8a4b3a70dc7c3d3ef 100644 GIT binary patch delta 123 zcmV->0EGXl0hj@hBy>YbL_t(Ijbpg~^WT3MW*`!5zIOXRoc{L@qLCs4K$vU;$N{4U zj2b|F13&}_?|k}(yrc}{9QaCRUI5t)(oAk<0st;=r|CK=0hRy&01#wlLPs-0F+)W) dMK(l2GB7YgGc!hHZ0!I5002ovPDHLkV1mnzEI|MO delta 142 zcmV;90CE4A0jdFzB!6*9L_t(|ob8jb4S+BZ1O48GhFzGJ1rS5fpcI)QLh1Z8git2X za?+Rf`z60ga$Jx!G*C2a2G}EfLef$Uur~>oL!M$N8d{mw?I{LK<6yvb!WVvn-v9t8 w$tC%6)JnH7Z@b?K%476!S9#6V?M;FcJ6AO^Xfo{u00000Ne4wvM6N<$fvt;WPZQ66yM6Kw z;uDxA#BwuSEEL(RugsLlz`!7olIrAcVQggT11kXY3OE>HFsJxP>#XV)z4*} HQ$iB}oj@W3 delta 115 zcmV-(0F3{H0gwTZBy3knL_t(|oMZg=@85q0GQpwm3=B*R3=9lROiYY0nivdI`}yHr z21asRaOgV&!{>*0$#wWB7zH!{@T5$3@`M?%`Pyxw^8`%o=4-eAGamT*?>{9O0|0+I VE(yHXsg(c#002ovPDHLkV1hYnF@XR8 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/20.png index 6907a4adb9ed7cdefed34008f2ffe4a309e4c94d..54159023062de9855c8a4a256d1f767dcc75d604 100644 GIT binary patch delta 140 zcmV;70CWGH0jL3xB!5#$L_t(I%VS_51MGbI=Kq1O|Nh_q`R_kD`WZl)LG-_WWEudn z8KjwP14h9ppg!1q?e>2V24xUZ@&ZUbNFUe$|Jr9r16Nv*LaOB95A3q<)vbhzR z$p85D{{Qp#@{?PuMS7T|7~G!pJUnpLCFIh*nz!HTC1!UvGEOw~VB8nAs)q*%eA@Rd fp5>v_@RE^%rCxbP0l+XkKdX+iB diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/21.png index f82281f751d8958af70af8aa44505c3e14f6605d..fe0f1a35c1055ecfcb014e5fe71f660bbceb2443 100644 GIT binary patch delta 137 zcmV;40CxY50i^+uB!5szL_t(I%VW6z^WT3MW*`#meER19fv-?K|NcQVl41ZzGl&N3 z1rZ=jiUAK{+@%FgG~NgO�#Kgq- z`Qcp#Msi$m;OoEtpC8^O)y`2c3TOyO&I1e#3=EsE-9{vTa&7k2Qe~vb0GKNPmbo55 Tu(AjY00000NkvXXu0mjf-10H_ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/22.png index d644831ce29f69178df030bb05775109e4fd9750..463c27141350be523a45ab4959264a9b19c22c03 100644 GIT binary patch delta 111 zcmV-#0FeK9jRBA(X*fwlK~y-)W4QnG-+vfpAQJ3+`sV+EuTVYz{y{X7VgN`phz9Eg z5g<&80U)(7eGH>u6pRAu005WCJ(rZR{2~AV01#wlLPsz;H8L_WL@+fuMK&=*FhwvW R3v2)Y002ovPDHLkV1n1nCsY6c delta 90 zcmV-g0Hyzp0eFxkR6j{XK~#90WBm8;-+u-uU}9ooWFP{-^c?!mz`#U`Mr6Rm#Kidd w;avtsa$IoW>%ae>AKoR^&QUN5Mgcwm0CyA?*@1C+cmMzZ07*qoM6N<$f|AK70ssI2 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/23.png index 77620a8678a76344e3c332d2135040e868ca12b3..da2df131a1b0855d706463591235e17a5074fa75 100644 GIT binary patch delta 116 zcmV-)0E_>Bk^zt;ZaqmvK~y-)W4QnG-+vfpAP4;W2hm880U%7a0i$3P3=XjQ+U@@! zyz}Xs|705gq7Qr}GcSN_25BZYGXVe(fIEr!jub`!000nVWkN?eIYu=^H8nIrGc+_g WHZ(Uv*JmgI0000AI;!M}h1 z{{Q>;@Be|XI`o}^Ve_@yWM?J-e3l!6Wzdsj00000NkvXXu0mjf D)om?% diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/24.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/24.png index 8008b2aa044b409a0b97ce53fe362557356cc20b..70ecd4a480f0f2cc6eed489033afebc206b21159 100644 GIT binary patch delta 90 zcmZ3;STR8*MA_5DF~q_@dB^|P_v_gd8ZI7bID0+sfBWUdY&}v2SqBOX85n+cJy(2k uTq1{ofk7Z8)ydt$!pYpk)!fy@$jQyf(%C}wumuxPj=|H_&t;ucLK6UyoFJqC delta 131 zcmV-}0DS*=p#hL2eP~HUK~#90?US($fG`XM?carlU6_^yP==sEDKbNZ(!D7lhLVJq z>+kf1tt3q@0I0m6I-!W5MSKE4bBdxp3znUhQ#_rX1vy2T#z8&sg+K5IJV4SyX%pvl lGY{0qXu(f8l)Kim-~gt8FEPs2iqHT6002ovPDHLkV1ny=Ie-8F diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/25.png index d9ef72b5df7235ce52d189c6e80975f910a14e20..53e332ba7e1c283be6aa62f57ad20dedbc1897cb 100644 GIT binary patch delta 84 zcmZoq=!j^fq_MUfswoELN5aYgFs5Ele@XOtEHo>n~|%T ZiIcI3p@H8ev0p$r22WQ%mvv4FO#oAT5q|&x delta 44 ycmYfEo}i*G|Hql>ATnT4g3lYx_=shLw&Py|qp!PC{xWt~$(697LH7@q(D delta 115 zcmXSz$T&eIH^S4!F{ENna*6`;pWol#+cPsWA71#LhsWoM!~qaEa^%R5pATc%+=@)( zfBbs?|9N}4BHP5|13+4`W^0J#Nizn?9w~z?23NM6ePzGxUD*QWOi9#ZV90zdIX63Y R(kuob@O1TaS?83{1ON_KF}nZ& diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/28.png index 0ad81997fe804f789d2a75c90b91423d6971f827..4d7795d8a0c8b03c1567d6c6c51629c0416da96d 100644 GIT binary patch delta 116 zcmV-)0E_>a0g(ZaByBuNL_t(Ijbpg~>)(F{Ab`=tfSpg@{6FyZ-~anRfqKX>0Hhg2 z|NBR#0U(<}n#nc*)wEFqMhzG>00aQ$c$q`71NTAz000nVWkN?aH8@2%IYu)>IYLH8 WFhw&=M1x!a00000EGXM0hj@hBy?X%L_t(|ob8jb4Zt7}1O48An=BA9M4E_#8Bj!LXo5tf6yeiy zy-(NJBvssyG<=|MLIF5493g2rMVO~xzf^OI&zw;-RpJ>f!4kX*B-K!U2>LNxf>40% dI9)#gfCfx&ENS-;NMQf~002ovPDHLkV1hQ5FiQXc diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/29.png index af7baaab9727eadad0032973407f9d1d960621d7..ac7e69d0be1d4aca4258bf088214040e83ed0878 100644 GIT binary patch delta 112 zcmV-$0FVEP0gVBWBxyKFL_t(Ijbr%t@85q)FayP4;9W2ZM!|rA17H9B-}&^-|IOEK zlb4i1nn5(#27okz@XGU7{sRF2KbpKJQNqXo000nVWkN?XLpV4&Gc`3bGeSWzI5jdd SVdS*{0000|~svk{aOY;uumfC;89!_xJ1Bj1De*&%@)x0|Y)kK0OArBzS^<|9lwB=2jF_ z@WPt;@bmWalchg2Bv?%tdY)w5s(EW>^V4`@_U84|w3J=h4#Y4rG>J&Gmw$h}jsXZf MUHx3vIVCg!0EE#i>Hq)$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/3.png index 2f1eacbbdff980006771a55fbe7f95089e7dc4d1..4cff131dd427b6b0a6d0b259c63ad5d32685d206 100644 GIT binary patch delta 162 zcmV;T0A2r>0loo{B!6j1L_t(Ijbr%t@85r7@cmzy`~zSA{bwKtfHZ^XoloEVXCTF9 z5F2Lm=4-eA?|SxzJQsj%Mxx0!0OX2+F#x8KVgtwy1FE@T;0&NzEX+S~?mw6V!XQ&& zY-|{pJoQ{aECy+U(I5-}w+K6Rb}|6`0000GWMx7}GBQCnFdIWeMMOj~H9|8nGaVYb Qh5!Hn07*qoM6N<$g1%-!ApigX delta 123 zcmV->0EGX(0hj@hBy?X%L_t(|ob8jb3BWK61W($3n=BAKM4I5jGnn8`N)bd-8m0Av zP$P~nPGV+GGG%}QsH()CnYit(BAEtdKyNi$9Jb^1*qX;YS%3uqUX{~&1|amD$ya6B dFY`Z-aRYN}G~q9evcmuX002ovPDHLkV1k{;G$#N6 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/30.png index ab428f20b705ee031de29d9c81823d5702474c34..e3c06df5444e75e6e270386787be50f344a34843 100644 GIT binary patch delta 115 zcmV-(0F3{S0gwTZBy2lLL_t(Ijbpg~>)(F{Ab`;%gHZ!U4Hz|md;<=A{r7+8(>MP& zU%UOEECWEAK{VM0fHZ>e%JWzL0|2v4mRu101#wlLPtb7GBqMX(S{iC8a0`8cbX*c$6U}oTrCdgK;rikJJGW zICOx)^Hlpj;q{rHx8CmHIRWC%m%pcaGA&*=)Qt@YmO0-K^i{bk%21&zE9CWI)kFp$ N@O1TaS?83{1OSsbEhYc} diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/31.png index 97efe86b6920690662d7bffd3ee66a841eb80caa..683ee277143cc2e6cd538013d9a1c1dd335cb34d 100644 GIT binary patch delta 111 zcmV-#0FeKX0gM5VBxpBDL_t(I%VYTW@85q)FayP4;9W2ZMgdj8=4-eAgYeF$Z~l{Q z0Ej;DmCSSvvKgfL{!j7@0062Xo0UEwtCau%01#wlLPteLF*ZauIWaXhMnOa~H$%M1 RSa$#b002ovPDHLkV1lRYEKL9a delta 115 zcmV-(0F3{P0gwTZBy3knL_t(|ob8h_3cxT717-jJH~m2IBf69fc|$1Pn9?8;7`>^*H=92oStRRxG^t*h)NOkta9p>n^aODB VB%7S2_*4J@002ovPDHLkV1m0eGok)?C7*a7OIYEMTae_zytHGqjnV+}b{-2nmR+RhgYEbHu6AUx78I-rO UXO>-2dcgn$p00i_>zopr05Rkk-2eap diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/33.png index 7346038fdaf743d0ed0eff259aa6b4f820503112..85493863b496a493992002232673d7f1f9c9fdb8 100644 GIT binary patch delta 101 zcmbteBt@V(;nV7*a7OIYEMTae_zy`=8(6-~ZoV|No!-k6-WYEq~3F0D>7aW=PoE t@A00-JcF+`J>f>pTeHY*#s&rk3=Bfkg=_D;jorln1fH&bF6*2Ung9r!C58Y1 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/34.png index 0789b989b8f442c1172d01bee44a21326d809634..32900803430e5bbf5f589789b0a2ce6dc51e3ee6 100644 GIT binary patch delta 118 zcmV-+0Ez!`lmU<=a6d^zK~y+TW4QnG-+vfpAP4;W2hm880U%7a0i$3P3|(;G>%ady zpT7CO`Pyyrl0Qf@h$hp*Ok6E^lp!U&rzz0DgfX%*;q%tp n9XuZE&hCp^)gvOwP|V8EyM;ebCbo4y0}yz+`njxgN@xNAav&d% diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/35.png index 23e0bbb80c8d0592f3de1e51dc1558108d5f92df..79769875b191188768ee447fab4220aec7f8d25c 100644 GIT binary patch delta 121 zcmV-<0EYjM0hR%fByvGXL_t(I%VS_51MGbI=Kq1O|Nh_q`R_kD`WZl)LG-_WWEudn z8KjwP14h9ppg!1q?e>2V24xVk4M5HybkCXqlX5!ubfh(20000GWMx7}I5j~=L`63< bMl?h)K`=!)Xi_(!00000NkvXXu0mjf^Gq;9 delta 114 zcmV-&0FD2a0gnNYBx_blL_t(|obA)04ZtuEL(zY?|2AD9$`B=0KxT-dFkeAIaZf7C z1hGoKKDn@VF?QQ#mq>vP4J_q^A;XOvGpe{JhE42=A0|o>l UPJw(PUH||907*qoM6N<$g3wGZG5`Po diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/36.png index 17b5569b021a22af25221c1d21d820f36d1d49ad..7149d2402b8f7a1da0aaded94b7da8bf6ee811c7 100644 GIT binary patch delta 146 zcmV;D0B!%I0j>d%B!5{+L_t(Ijbpg~>)(F{Ab`=tfX&x#|A*6~1`G=W{{5qp3t$Ef zoC`=XVCT~})Ct7-C(c0(0D0rU*MI*(CZl7JVh~1VBV)MDFjGl(0lLkEYy@e7(I5-} zLpeDB;BbSG0000GWMx7}G&MCgFf>I(HZ?OrG&x2$$jKw)01E&B07*qoM6N<$f*&+E Av$&fl)dI zTeiO2xgsGEDY#%}!UwctGr&E?7G|at188Kyen?3%)XvC)6a%((pUW;Rv; diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/37.png index d19437832f91881525406d165128832af402c756..f4711990198e999f20f2f3c1786adfb2f69ab958 100644 GIT binary patch delta 124 zcmV-?0E7RF0hs}iBy~hdL_t(Ijbpg~>)(F{Ab`;%gHZ#9g#rKmQON}`g9gq818V@t z8wbAr`@i$)8w|Yp+HJfTZZnue4nVgVW->n8k>vp6jN0N$=PdRB000nVWkN?aLNG=! eHbyc-HZ(OtH8?O?(D{)70000MX(S{iC8a0`8cbX*c$6U}oTrCdgK;rikJJGW z;P5`yzR%d8rmkXoiEsj2&c3qQFa9tD@BVq~?f)M3egA&@PdgjHz;NcXDtG#=Th|$Y Nz|+;wWt~$(696csFi-#h diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/38.png index 5560ab9b729212d1b2a2440ae946ee9aa85986a2..9d2df1a315cedf52d3dd45d34dac7581da3874ad 100644 GIT binary patch delta 92 zcmXS`o}d!0=IP=XV$qwNAi=sgK_r0HAa7sUZ~Kme$MjEpc>VY{V+o@s!_BP>Go5)( wzWsOl1_J|wKuW5UyQ{OSnW=%Pv!kh-tD&)_;XZBm1fU#)r>mdKI;Vst0DHJ0AOHXW delta 87 zcmV-d0I2_ac90}eJxN4CRCt_YU>F6XU=&aVF#h}Z?>_?r1H+;33=E$i-X+}xm;sxw t-TqIk9+=wA*KYr3Jn;43f3j?b0stV}9P9XV^TPlD002ovPDHLkV1k5JCl&wz diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/39.png index 3a87d3a6dc3dc06856f6f92a19c4c85d8482191f..0678cf22be7594eee688244f3b0c86620d3ef843 100644 GIT binary patch delta 113 zcmV-%0FM8i0geHXBx*THL_t(IjbmUS18lx_`#&;0YQU%gL)3tsPv20-1@ljw`w!-T zFvwIG8ym(YPdyh9i$R)TGzbF#yBEs5&FZ;e0000GWMx7}MMN<L_t(|obA)G4S+BVMA2{WLc=ah%L0fY(nKjTLxkvT3KS_N zxX#tSSNViM%*+AK8#Dp{sH(JDkVyHs%v&ul6aiW-Z0jOnV9W$203hQq`g{IL2lkZx iYp37tDZ7lrh~xot(k~v*ukt$p0000*0Asm)DzpFq delta 102 zcmV-s0Ga=c0fPaMBwtENL_t(|oMZg=@85q0C}3h@Vq_o@Fp;Yf#Qmh#1B(CvW|nHnq{#8K$!p066ai|<41Jfvz%xJa0{|w;CHb@+19_Wq mS^a8o4&zI%SDxFgMH=jO2V24xT!n-okv7m$LHT?+tbR*Nr*i-ITs000nVWkN?WK{-S? eK{7ZwMl?7xLp3%ZRhl;d0000+Sy|uNqh0t$F*c-p$LHjX}gidrzzU R#AF5_@O1TaS?83{1OP?IHO~M5 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/43.png index 081677c8aee82f47c8a3bcc68993eb1a75c9d7c6..1ea134737df4c694c0436fb57371430fdc4253f7 100644 GIT binary patch delta 101 zcmbQi*u*$NB~I7V#WBR9H+jeZ&-d#k(iDVp_Lcp%pY!iK|DuUX%nmbhm`^Y+X6unM z$YNN=$gt{mcjDK`cN27#1RCwC)bBSTXQHx~nEb3<24OUwLOYYl;N44$rjF6*2U FngE#lBAoyL delta 123 zcmV->0EGX70hj@hBy?X%L_t(|oMZg=@85q0C}3h@Vq_o!!1NsY&cMJ#ibiC>#Kgq- z`Qcp#Msi$m;OoEtpC8_Z>0x4oVPb9n{O~S=ua+t!0|V3xlz>qKMh&3IfX&x#|EI_R dijy+T1pqEqA-S?C=jH$a002ovPDHLkV1l$II%EI< diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/44.png index 36d3d41ffd869649a55176bf722cc209c135af5e..7fd3e339bf101e87f004df4717f0e8bccdc08e58 100644 GIT binary patch delta 105 zcmV-v0G9uAhXIfzV=_rZK~y+TV_+Zy?0ov>|ADXn{@?%k??1X6Q2?YFMF0CorU4+E zL7K@nU=)mkQGf{m5A7a`;c9%%po delta 64 zcmb=3pP*u`=IP=XQZXm_&-eHD>)A9Cl9G~A6a)<>t`bP0l+XkK1D6$~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/46.png index a6194eff9400ac9afbf75769056aa5e2c4522eb5..c8210098a9746a6f5b9ce11985129c06f15135b2 100644 GIT binary patch delta 147 zcmV;E0BrxA0j~j&B!5~-L_t(I%VW6z^WT3MW*`#meER19fv-?K|NcQVl41ZzGl&N3 z1rZ=jiUA#P#I6^W(H#bB$GC@N_HoFx%Rtx|D002ovPDHLkV1j3g BIjR5v delta 128 zcmV-`0Du3l0i6MmBza^>L_t(|oMZg=@85q0C}3h@Vq_o!!1NsY&cMJ#ibiC>#Kgq- z`Qcp#Msi$m;OoEtpC8^O)y`2c3TOxzku!z^H*raM^R?TE$QYymUoBNe1_lNO irbFLRO(Yh;^Z)>a7AzIXZJ(F`00003{r~^~ delta 133 zcmV;00DAwr0ipqrBz|d0L_t(|ob8jb4S+BZ124Y|4ZAQc3!n@^gHmLM2&Ho)(F{Ab`=tfSpg@{6FyZ-~anRfqKX>0Hhg2 z|NBR#0U(<}n#nc*)wEFqMhzG!13-BJl%Y0XyG>qF25AP-WE%j|2*NARU-=IJzbdre w=^N`H0000GWMx7}H$gElG($x(Lqah@HbXKn9IRf800000Ne4wvM6N<$f>aeY@c;k- delta 134 zcmV;10D1qa0iywsB!6m2L_t(|ob8h_4uBvK1ot+6#m2w*T0dZTgpHx#4aCqL7HR-1 zpl15nOmQcw8u3C>P{HSz0I)^OAt~NjNKe6jY4pyPIr&giNslxJ#=xHmc&^ZddTBe( obpAkkj26~q7670LHq)$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/7.png index 9389a374a849c1b4949ba0432c900bcf21bbc92b..1852675845a79bf2c04102fd0345083b2d9b01c9 100644 GIT binary patch delta 128 zcmV-`0Du3P0i6MmBzZ_lL_t(Ijbr%t@85q)FayP4;9W2ZMgdj8=4-eAgYeF$Z-`Eo z2fqFTs|V==8vqj|)&Q7gV7(v?Nb~)l#2Wx}^~&>C{sRDl)3-3PJ>8-J000nVWkN?X iIYu`^L`5|-G(s{kMK?i-?(Kj80000-`}riGdj5NJr9o$4-okH`1BaelHdvc{qtcgn_E## z!3%5V!_V8xPnQ1BkYF`o_^_k~DALSqt}<7cY4-ZNZR+(EX-cNKzq3|48C_lYeubJ4 bcS03IexX|Qn+>dG3_#%N>gTe~DWM4fdE_y6 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/8.png index f44a165981f45d5207ded1c33ffe7ba7b6104b74..be506103d9e5808846f566c57bad2f3f93ac5f34 100644 GIT binary patch delta 133 zcmV;00DAw60ipqrBz{dvL_t(Ijbpg~^WT3MW*`Ur`v=iTkpUn~wgIDH6bufq`P%LO zAiVSG8={l)fv^9->OuOz2EYV~H2`KASTBeJ(o9Nbg1LI-`78ec=p$Do%MX(S{iC8a0`8cbX*c$6U}yr(J9z=Tm*M^gUR zxdRUl_{Pk;QS;VJiP^}&!RYey_HxfnH^aTBPHY5%mlw)IggaRcY#FKrWt~KvH9s%_ Nfv2mV%Q~loCIG)bWoIywiC|Q#X000|ZS_|Mkty=&901#wl lLPs++GetB;F+w>)Mny9+GDi87I~)K2002ovPDHLkV1kVMF4O=3 delta 119 zcmV--0Eqvf0h9rdByd|vL_t(|obA)Q4Zt7}15ls$-zEznhDZ}pFatt#KAQZ>fRv8c zTfV|)k{l`aRC&p1v~yYhB*`UtsL!NF+|M+-ZN>&{`!UrH Z03C&!Dplz4sT%+Q002ovPDHLkV1nQFGP(c& diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/0.png index 21072b647eb323bac690cda2471f88c58a7aae9a..89b2c45ce65f47d6876ca5b4ce29868312754a46 100644 GIT binary patch delta 174 zcmV;f08#&&0m=c8B!6{DL_t(Ijonj03cw%?%Qt+75AXx^AwH&W?#Q5H4(5>Db_kT3 zrlwW^2oVS~i!nxI+**rT>jdU_Mh>|dBNOg^CQ2zwkV9@Z#PdqMcU$4r0@c5Y?;?{0 z`r8#?%_YDg?Fz8wPXh7~07*qoM6N<$g1reuWdHyG delta 126 zcmX@bIGb^TN_mo}i(^Q|oMaO-vwcS$)G9td<7MV%W@bLTIsJUq3Bw1^&(E**$zXcx zlGU<0*-0!VJ$=23oAD;A9gIgZjxBm8FYGtfr74h^t&!2k*C84zQsT$c=P5B0}BHK1H-dt&w9u;gbA7R^XJcYVl*ME zV?q{WXJ@Y@Ml-THxBC*P!|?Ox&psUL|Do~G!;A?4 Xfg3K^lL$|w00000NkvXXu0mjf^wBh3 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/10.png index 5c7e86d52dfcd748a468820767e3393334886fbf..03c3dd8199cb16e4b856affd5a9997dac002244e 100644 GIT binary patch delta 116 zcmV-)0E_>E0g(ZaByBuNL_t(Ijbrfj_4OeIGcYjxN5SM6keQkJ-^a&?d;@xWd%=c~ zZ2(1Hz%X#sfDvf`Rq_JGNtxozgp2`ZXEu@?lnPk@000nVWkN?qMnN$_H$*`(LNPQk WHZe6$3?4}U0000&s4n2-h8+1V?J(TuE)k&-Y#alxno!^VISm=b^f{5b&tC7ma9ii2l800000NkvXX Hu0mjfW8y7{ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/11.png index f5d442720a61c4d5b3c2a724e7db75ddf2549d72..ff1e5c82df823e2f8542e3fb175c9dbe5042f3ad 100644 GIT binary patch delta 121 zcmV-<0EYj1mjRF@b3#c(K~y-6WAOF$^`Qhaj2bX%z%VfY2>v5uA~gI*!wmm3Gc*79 z_VyBO07xxJ58MDBA0M~?F$RFtg7m-*pu`IRkheCHM6-r-IDiYpK^(@JQ(hsZ3blk5`qPht z5HC+7Cn91GC8ny@S~IUpDVB2{M2|B(c)b>H^xpSIN@*!Pc>O||pHyqrl`dC+em8uE z3@fl-6u`^@;FF>NX1)X9{Q++SqCvtt1SuM2ydLEZO(a18AuAZn*Z=?k5M*USM>j-4 gLNGEiGB`9tG(<5pMdxzUTmS$707*qoM6N<$g0t~LSpWb4 delta 117 zcmV-*0E++40g?fbByL$rL_t(|oMSXLHonC`CV2Da4Fd}U0|UdeXU}@bG2rLVpM6Yd z0_{X00000NkvXXu0mjf)i^DT diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/13.png index 7208cf13d163861384da1b450213439ca38408a4..2a985677a2dd86bf2f7b5f2bad987aac242c01d1 100644 GIT binary patch delta 142 zcmV;90CE3}0jdFzB!5*&L_t(IjbmV7VE9iVX87;p)BV7M1Rrje={ZUD&76d3>tj8Owd4WKw7QIeDadz3uh wsg5!10000GWMx7}FgHdqH$gT-H8n9dHbOEt?7Cy100000Ne4wvM6N<$f*MXYfB*mh delta 111 zcmV-#0FeKx0gM5VBxqAfL_t(|oMSXLHonC`CV2Da4Fd}U0|UdeXU}@bHG~P7^YiD= zc49Okt7AeIWM^luBt|o`I=BJEXvU_F370}*!KeX)&VV7B65qUeLySJ0005KWDqDAc R@ZA6a002ovPDHLkV1o1GEw%sv diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/14.png index 24e7749d34507b3a5206e3aeb53bd5ac2fdef8cc..1220334534d535df5ec55ce7b56810fb2e73da5f 100644 GIT binary patch delta 95 zcmb=fo1hY<>FMGaV$qwNl92G@yaQu`iJ955GYp=do~L*|eEs@W(lp^pLm;z;IRit? zM&V8-+wB1i3=9G(sZQ=DCKi^Cu9l9*&L&RI=H^ZtZa!HAlwbP0l+XkKaN;0X delta 92 zcmb=co}d!$;C<@>DQx{QtES} u>CKxrQ;%f0g}KM-_edG&@JKAw6lD1JSw+9L@y~GvAn4H1+oOf(-#1;Opz_Lkh<50;vYT41s%rTmwL1LXiQWfE_pkK(R4uz+fZ~y=R5M*USM<6#jG($r*MMgP8H8nFh VIX3O8;n)BG002ovPDHLkV1n^ELlOW0 delta 120 zcmV-;0Ehp>0hIxeByn6xL_t(|oMSXLHoo=j*|Q!7G5{MJTL}|68e!nquU|bV2K@Z_ zvz-`?$m*Do1=-ozD~ZvJtPXAfF`BWdqbLkU4H%RL49%3t^5)GOhMzxw_Tfr= aW=sGd#4r+3Ibn$+?n!b9u6fDZ_&NV|fn@=ka_ zL~;cH84{0D3t+b1`;st^fc45M*USM<7KsGBPnWHa0RcI7Bu> VF-7v2$yopZ002ovPDHLkV1l|4JRbl6 delta 129 zcmV-{0Dk|&0iFSnBzk2@L_t(|oMSXLHoo=j*|Q!7G5{MJTL}}nni&`v7(RdgEX9N@ z@bl--c49Olt7AeIWM^luBt|o`I=BJEXvU)M9}`ZMM1oNR27v)gLq8=lFv`oz-}?Od jvlI^X|Iqm8Va5ai*TFHfh(g9>00000NkvXXu0mjfWtcXA diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/18.png index 15ab6d09fbc7cfead98efb0c22f6f873cd193379..2b771bdfb739314bf282f971cb53f202739c3b19 100644 GIT binary patch delta 141 zcmeBUT*){=r9Q;d#WBRfKRF>G;YWW@Ef9Q2Ecwc#aOn8)=k;l6Y8TlWt~7l)z{|k- z<=Z!*Tm}!_Gfr$>dmTKO6>YK(tYA!FR#8>`AKWC_)7uNA3_mfglwfF;u@+kWN^&~` r1A{Q=6MZ3IR;NxHb0kjP6X-TFhEdiWj&1_ptY nR3~>Q6H8}j3u8l969Y4614qNU$-OE-IR;NxKbLh*35-numBlW- delta 121 zcmV-<0EYjh0hR%fBywFzL_t(|oMSXLHoo=j*|Q!7G5{MJTL}}nni&`v7(RdgEX9N@ z@bl--c49Olt7AeIWM^luBt|o`I=BJEXvU)M9}`ZMM1oNR27v)gLq8=lFtM?*l@Oy5 b2VepK-h(X=(J*Tq00000NkvXXu0mjf0JdjDdkcASKnw-PORv$i=|b#nRZw$k^P_Px# delta 112 zcmZo=>}8ywk{ROZ;uumfC)vczY~N7_wTjQrc$pV3S&|~Plg$7G6pQQr{kiGaqn1+Y zbE4_Zn>SOBWVnU7$LjY;8R+mx%+j0~7#H{N+Vk`CmlmA(@BDaiyQDCKK!|2kg7wFj P3_#%N>gTe~DWM4fN_;NA diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/20.png index 939c96b3141238783204af7ddae097975d6a1b6d..117d0fbb5da9449d0adc9097577a284a7a124703 100644 GIT binary patch delta 133 zcmV;00DAw30ipqrBz{dvL_t(I%VY5M_4OeIGcYjxN5SM6keQkJ-^a&?d;@xWd%=c~ zZ2(1Hz%X#sfMH<(dcq(%A;Ho%D0vcV07_B@5ul6#6CgP=QR)Q%c1$=^oTDG(0000G nWMx7}Fh(~wIWk5=HaIpjHA6u{@s~cz00000NkvXXu0mjfSVJ){ delta 107 zcmV-x0F?it0f+&RBxFxXL_t(|oMV)fluTnF6R@$dl`xU3nSp_U;n%NUJtzkJ{Q0w; z7>&s4n2-h8+1V?J(TuE)k&-Y#alxno!^VIiniARA*h?Z}C;DQ_14aM< N002ovPDHLkV1o88Go%0j diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/21.png index 7813b18f05c8198caaadd9a32d54c09f95f23559..c038ed22dec26627fc7b12eb9a72576afec658b3 100644 GIT binary patch delta 136 zcmZodmTKO9hu#EB_^^3%$Z;?$;gszL5iB!UIvD_3Kqd!R&%E_Ffa(D oq&m498X8zwSQwj`o4A-bnz|U7UP`?RlwbP0l)%^o09x@c$p8QV delta 100 zcmV-q0Gt1$0f7OKBwa{JL_t(|oMSXLHoo=j*|Q!7G5{MJTM472q+}X7nqhzmne+4K z&vs%oA**9T7G!5Uv?+fMH?42u+Cqe9k2=*S8Kh00000NkvXXu0mjfgJ~m) diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/23.png index 3a99bb43ee6b8dcd7f4363d9fa9541521767bdcd..0eb4b32513d2876c72bb11a7dc6ecbaad1cb235e 100644 GIT binary patch delta 118 zcmZo08PKvh3r&J@jaK2s_f894TtP3k|A_LYHwK_Dg7$=$@j+0oI=#N5)@+{DDf V!ssOHt`MLcgQu&X%Q~loCIIn3C*uGB delta 100 zcmV-q0Gt1l0f7OKBwa{JL_t(|oMSXLHoo=j*|Q!7G6AEcq+}Yoni&`v7?_YbKY#vg zCq@&pIwoX6c6RnkVl*SGqplZ54Hy;%4AGRx#>Q4ci2(qez9ldHqIuc?0000s_@LNGQp cHbz82K|we}Lrl><6#xJL07*qoM6N<$f-@E_761SM delta 117 zcmV-*0E+*Y0g?fbByL$rL_t(|oMSXLHoo=j*|Q!7G5{MJTL}|68e!n`=g(3o2K@Z_ zvz-`?$m*Do1=-ozD~ZvJtPXAfF`BWc`$th2ptxYvfPpiBY3Qd!2BtS}-Vmb?7hnPa X8hR`c+;2fH00000NkvXXu0mjfueC6S diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/25.png index c8d7b7ead91d5c096556eba0ed86664bf0fe8631..8f1f7a61505f08ff368efb3a6e18ba14d22ab04e 100644 GIT binary patch delta 107 zcmV-x0F?iM0f+&RBxEy5L_t(IPh((UVEFIjIBs#!C-49O01#wlLPs$;LN_!qHa9^*Fg8RqIYU)f+gtzu N002ovPDHLkV1gLECnNv> delta 100 zcmV-q0Gt1a0f7OKBwa{JL_t(|oMSXLHoo=j*|Q!7G65608nGJi^XJcYVl*MEV?q{W zXJ@Y@Ml-THxBFMGaV$qxY;p^A03t5bNqztkStYAERl!4)pps_&F#r+Ey7#IXnQk~q* j9bGIf44h32%njTuos6AMfBE4BlwbP0l+XkKsAn6+ delta 80 zcmd1HpP=Gx=IP=XQZXla%9JTS$qN_^0vAahZkTUhzfE{CXQZs~CIxHjYE{Eo6R#Tb ktuv4?O)!u!a0*sp*q$o?Q&`xghXDvYUHx3vIVCg!0E*=rzW@LL diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/27.png index b45688e3749c4ce78cfee2abb5b293eef871a806..7229c32f495ee062c3d83467f2979cadb67b62b4 100644 GIT binary patch delta 107 zcmV-x0F?iT0f+&RBxEy5L_t(Ijbrfj_4OeYOG--q_wn)h&%nU&pMhKh?CtF-Gr-u` zc+`MV14a#?MrML#X8`b8IBpIfj2Zv{01#wlLPs_+L^nY&s4n2-h8+1V?J(TuDPZU8Zwv8ek;Q5c}OVAOztGk|I6r$oxb002TaB}}YtgI)jt N002ovPDHLkV1ma%F(Lo} diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/28.png index 065eee8d3d21dce78fdc44ecf9ed83c95dfc2f11..08e6e340f7493f68de1c92611b17a5046a176a41 100644 GIT binary patch delta 140 zcmV;70CWF}0jL3xB!5#$L_t(IPh((UVEFIjONW(A(P!HiT>gFuXvD0qA(tfKdaeX8+p delta 109 zcmV-z0FwWx0g3^TBxX@bL_t(|oMSXLHoo=j*|Q!7G5{MJTL}|68e!nquU|bV2K@Z_ zvz-`?$m*Do1=-ozD~ZvJtPXAfF`BWdqbLkU4H%RL4AGSM=FJ;o^x*^mGKwpe)6caV P00000NkvXXu0mjf)(S1h diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/29.png index 9ae683b2faf87ef33b3ef7dbb80cc7972e28c4e5..ab4b6324e9f0b6c012d29b394c5bfe738ba49624 100644 GIT binary patch delta 120 zcmV-;0Ehp7mI06?azRN%K~y-6?b9I<05A+g(b%Yt+DL^&Of_e8cVjIb`1G+40A7`u z-h_zoCR7zSec%Hl;CW#JbhjnV0ZAq~2ks7`V>wajKb1cK000nVWkN?qL^d!(G&MIx aMnN+|LNh|>C*bq|0000c`n*j(Y7T5jzbJMR!Ev3}w zMAMr$Z>Ao}a0_#f)$frq(BYA2)cpAT{Cr^shG6wotna3HF#v(5tDnm{r-UW|k-#Qj diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/3.png index ff0a70775d7244d3202ea8b71931acc886e16f9a..46094883e7d391e1a12c542ade81de35846f94c7 100644 GIT binary patch delta 152 zcmV;J0B8S}0ki>-B!6E?L_t(IjbmV7VE9iFHa0f?PYkxVxBu_s;{(=|nVAV^Ge}BG z{wD>4H1+oOf(-#1;Opz_Lkh<50;vYT41s%rTmwL1LXiQWfF0=uP#lP4M)wV*Ko0000#`CFeqf0n|b{vR42 bJOd@QXjs4{ko8)U&jW#mL3U a%+kcn!qR2yy#Q^X9D}E;pUXO@geCy-2`)bX delta 100 zcmbQv*vL3RCDy~!#WAE}PO^!a*}kI=Y89WK@iH%7vLr=nCz}BXC>GcK`*YK;M=hn) z=S0(+H*cmM$#4sEkJayyGSK0XSfn|zw|8xe5Ho|gh|1QGMX{0$K;Y@>=d#Wzp$P!S CX(gKg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/32.png index 388572ddfff211368784d48c5e16ee5acc4c6c41..1683651f925860bbf1406bff64a0eb5c35a163e8 100644 GIT binary patch delta 105 zcmV-v0G9uBhXIfzV=_rZK~y-6WAOF$^`Qhaj2bX%zz8*ffq~&a3MR*Z-rnB-nVFg7 z8vxSmuOcQSre}s q@~tzFFikL!FklLPbbh|QIs?OjZOSEXcZ4MwfWXt$&t;ucLK6T#s2yzp diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/33.png index 2fb077dec9e23fabc02171819a5351d088ab0c6a..58194e0f4088f8a9365eda4a1338bd4890434d37 100644 GIT binary patch delta 105 zcmV-v0G9uDhXIfzV=_rZK~y-6WAOF$^`Qhaj2bX%z%VfY2>v5uvJA+~%>3Wm+e^Ly zK0ZERL&!FO5-$J%(e^aa=(^#%0000GWMx7}GdMFeLN-A)GD0~rGdDv;$=5F700000 LNkvXXu0mjf3$!Si delta 88 zcmZo?ESsPbWb5hT7*a7OdCHV2KFJFh3<4KP9&VU#U%yRwF=wQ#@FoRo>uOcQSre}s s@~tzFFikL!FmMT0l9rCJxO}tYK7B*2RuL$|A$urNxt8y0NX>d2lf`Xi#C!+<7zAb000nVWkN?n iHaIsoMmR+{LNhcqF*7q4$j&eT0000C84zV+&s4n2-h8+1V?J(TuE)k&-Y#alxno!^VIiniARA*h(ld002B*B!9LZcaH!7002ov JPDHLkV1mZkE-U~5 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/36.png index 81796a4c9b653ecffa2b02217bd644a0684401c3..f7e6973e3f9dbaa9189e111e1f79770dd0ff5331 100644 GIT binary patch delta 177 zcmV;i08am#0nGuBB!75GL_t(IPwkS?3BVu>1+#{8IDiYpK^(@JQ?3xvLW_YyfBNx6 zLheXJ5fM{WODS2cRd+%!46JaJQo;h5A;>w01u(zhOMx@*38Ej#nIVXNWoL$9&JKKu zSZmFC?`MHYoL0000GWMx7}Gc!0s fGeS8tG(|-;G&ng#;jWR|00000NkvXXu0mjf{TxJm delta 126 zcmV-^0D=F_0haU7O#lD@07*qoM6N<$f;|>FHvj+t diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/37.png index 87b19417dc0533bd4392216f933db7cdc893f9ec..ba0935e6235ff35726e84876f583c4f39ba1409b 100644 GIT binary patch delta 134 zcmV;10D1q60jL3xDStSPV_;xl`0wN6^IuX@^1rXIuMer10c3!^y**_H7#kap8Zc@A zPNoG9WWE^M7w|FW3N(OGv?RFMtezu|Z)13Rq$=h8IZ10NNBh-pkF>vH$=8 o5M*USM>aJ=L^3fjF-9>rH#RdvLlwrtmH+?%07*qoM6N<$f)s``qyPW_ delta 106 zcmV-w0G0o!0gM5VDPwq?V>C84zV+C~t>x+B7-G?z{N?M{uZas74Em%DvJR|Z6kt|SRsA2F(y(!(VJaJgp(`5$ z!&Cv`PD$pQ9SjT%0x79Z?uI5t=9bRpW(JPNCZ-lnu8~~#Ie~Hvp00i_>zopr06>); AMF0Q* delta 99 zcmV-p0G$7SfdP;tT}VkpK~#90W0aJXOk;0>TCA%QfKos_|vkTEDkNx>jZy}iBvGcz+G27m&C7!2|=%-JB#a4%pu zi9`$lLx4N7<|H6g0000GWMx7}GDI>(FgY+aH$pHuK|?Y%a1W_+=>Px#07*qoM6N<$ Ef_q*)0ssI2 delta 123 zcmV->0EGXt0hj@hBy?X%L_t(|oMV)fluTnF6R@$dl`xU3nSp_U;q&LuQYZ%e{Q0w; z7>&s4n2-h8+1V?J(TuDPZU8Zwv8ek;Q5c}OVAOztGk|I6r$h!ud3pI;pFe+=!lC{j d8XrB(m;hUcDs{#d`I7(u002ovPDHLkV1kNZInn?C diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/4.png index 37d231375dc6e828a2f4cc9bde551dc8b6b453d1..cca39f87c9ef5ef9544cdf7543e40dea733249bd 100644 GIT binary patch delta 161 zcmV;S0ABx&0lfi`B!6g0L_t(IjqQ`M4ZuJM1HA@wFaQhq2VodycB+3VQHqeSBBiiI z!wE|q0BAE1NoA(y91(K&M*#q3rm9K+WM-}4deRt!ovaFG)?QwKh}Z+T`w#dO;MRpM zpsJQT?MIsKkUZP?w!#5ARX(4g#>52x000nVWkN?rL@+@$IT|uGF+ny$H8(Ow7YcHD P00000NkvXXu0mjfGb}wo delta 113 zcmV-%0FM8?0geHXBx+SjL_t(|oMSXLHonC`CV2Da4Fd}U0|UdeXU}@bHG~P7^YiD= zc49Okt7AeIWM^luBt|o`I=BJEXvU_F370}*!KeX)&VV7B65qUeLySILu9*M;oiZ)f Tv)#zn00000NkvXXu0mjfWw0+B diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/40.png index 6117cd76d0f8f1cbd7f12a8fbed9ebc78a3295f3..f9222f730a8816d177b13539acde24b6d273e1c0 100644 GIT binary patch delta 126 zcmeBWoXt2vrQFTa#WBR9H#s38;YWW@Ef9DdSr8)78&qol`;+0M&jhRR910 delta 112 zcmV-$0FVEh0gVBWBxzJhL_t(|oMSXLHoo=j*|Q!7G6AEcq+}Yoni&`v7?_YbKY#vg zCq@&pIwoX6c6RnkVl*SGqplZ54Hy;%49%3tC@(L6>+|Q&QaI%Qq4Ckfj0pgi{wdV< S9Zd-U0000Klz?Nh49LvP{NLN#OTGc1oCPw36a(OyiCizhvNHexPC74Y85=YJ000nV mWkN?aLo_u-Mlv)wI7TouG(&s4n2-h8+1V?J(TuDPZU8Zwv8ek;Q5c}OVAOztGk|I6r$h!OHa4~rVl?6aOaNj@ VCDK(krIP>v002ovPDHLkV1i*#Gim?; diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/42.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/42.png index 363c0212d912ca7628597664d1a9298cd1f3b779..3c832d3e6dac4675b7e6d3a9988e0b617609ed6d 100644 GIT binary patch delta 126 zcmbQhIGb^TO1Yb-i(`mIZ}Nw)U%x7{8XFk=aXo~AEdz^tW}jzZU=T=2b#gawHgPpD dHE}UFGcy7jYV>K|Og5k#gQu&X%Q~loCIHuDE@c1! delta 115 zcmV-(0F3{e0gwTZBy3knL_t(|oMV)fluTnF6R@$dl`xU3nSp_U;n%NUJtzkJ{Q0w; z7>&s4n2-h8+1V?J(TuE)k&-Y#alxno!^VK2nGzZ0<>haE{`^@Ahx|V@K6;oj0RT0g VDI}r3^y>fs002ovPDHLkV1k@{Hgf;~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/43.png index 835bee1fb80ff51cb59a7df1b47c9d1a6b4f4b56..da5cfb8f8152158aa279e75bed08c6956557f27c 100644 GIT binary patch delta 133 zcmeBWT*Np*rOwyW#WBR9H#s38;YWW@Ef8=ddU~GxZ)ay`V9S%>mzJjH$#&!RZDk&Y z%y)0!s-9#>PEKxNd{V)f$6zSs#w%f(@Ii{Wnf?sNJ({a kH*+&JH!yW^b#ZnvFmy6-TyVlP7bwTz>FVdQ&MBb@0Lx!3fdBvi delta 112 zcmV-$0FVEo0gVBWBxzJhL_t(|oMSXLHoo=j*|Q!7G5{MJTL}}nni&`v7(RdgEX9N@ z@bl--c49Olt7AeIWM^luBt|o`I=BJEXvU)M9}`ZMM1oNR27v)gLq8=_9tHruaV(0u S-&o-Q0000c_nVI?D$H#|!1A2RV!G@4+ z07YKFFmTj>Q3HmD0RX3_G|^=A8yWxr01#wlLPtY4K{YiqF-As2L^n4#H8=LwEU^Fp N002ovPDHLkV1k^MDNFzW delta 95 zcmV-l0HFVg0ez4pSwu-hK~#90W0aJXOk*Guu(7d~Fp;a7fq{YH*RNkaCKVw|9oX6otU7-G?zoRE<4qrayX2s{q*DEQjh+5I;*Ha=<2uw>`C84zV+G;YWW@Ef9Q2Ecwc#aOn8)=k;l6Y8TlWt~7l)z{|k- z<=Z!*Tm}!_Gfr$>dmTKO6>YK(d@yKu)Z#LAiBDnLq9fc4Ygw&Cs{U+z%)r1Pkdo@; kZeeO+;^yMwYGCYQWZ>p#{`_cXJ5Y|n)78&qol`;+0Euoi1poj5 delta 106 zcmV-w0G0ot0fzyQBx6oVL_t(|oMSXLHoo=j*|Q!7G5{MJTM472q+}X7nqhzmne+4K z&vs%oA**9T7G!5RY63H8At>sEy6IOwaj0w9yM4SQc{vlvyzXG1e z*aAqZs`i1*9N(S=#*ua>^ebP)7d>;|K+?hh000nVWkN?cMIJIVK}9(*IXOWxLoq`+ TrONW(A(P!HiT>gFuXvD0ay$iHDCl9KygCCnv^NdOq6720ESmP@Mr5r t8UO$Q5M*USM>jGxGD9*kIW>t%1b+?Za19;AVVwDcDJ)V6wkfWW{{uk* zfGbp$8z3Uw0C%?yU+@K2@ZR>I@csiB5zNf7pt99zftmGSBB*S2TCiE+0I^6r60he) tpa1{>5M*USM>Ik?MMXA6H#RvqLpe1vGc_Gof&c&j07*qoLGcK`*YK;M=hn) z=S0(+H*cmM$#4sEkJayyGSK0XSfn|zw|8wz%vt;Te{&cZ6jC(|WXkWeG5~?6tDnm{ Hr-UW|$VDj% diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/8.png index 8bcf7ceffa56c7d62196a491bab20a475ed26d7d..a8df5c674aba381a45bbc67df5a24e6decaf3951 100644 GIT binary patch delta 128 zcmZo;T*Np*v(lnBIUyn8M}JQ(5O^HqQSi01v-@vsY<$w3Vad+z+o#tsYkXo_Ddom1 zF^_G+tO*ycPM$NxG0PzFVdQ&MBb@0Dy8WsQ>@~ delta 100 zcmV-q0Gt1!0fqsPDP4G+V>C84zV+##TbE=AS=*P5=O>4=AdM68_i#0000T+TQ_r9Q~h#WBR9H#s38;YWW@Ef9Q2Ecwc#aOn8)=k;l6Y8TlWt~7l)z{|k- z<=Z!*Tm}!_Gfr$>dmTKO9hu#ECB)b!%$l%4%E2q>SQdlk%+6PF3=HpFEP{iNERadI@YG&kYu{~Q98WAJqKb75KMl+XkKOQ140 delta 102 zcmV-s0Ga=%0fPaMBwtENL_t(|oMSXLHoo=j*|Q!7G5{MJTM472q+}X7nqhzmne+4K z&vs%oA**9T7G!5n+a07*qo IM6N<$f+$ialK=n! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/0.png index d637114e9e1f9eb2186b0704d012f88562f288e3..b585f9175864fb93267792e824acfb63bc9d5db8 100644 GIT binary patch delta 191 zcmV;w06_nD+yRgze}_p#K~y-)W8mQ6{Z9#IfH73?pj*@j+@) z41g&zQ1K#YBTNlU58MEBoA6;|^$b}3g#+LX1GtF<08A|?oUpop7z1DdjS+~X7=RIo zq#A$`1{51WY9Qit0a?+Ao;(R*K!2p`(ZMh+3_#%N>gTe~DWM4f880G{ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/1.png index ad20bb5b4a44f122d57cf25cd2398298cbb06689..1692d7c59062c10d66ce86887314d69bc050b4a8 100644 GIT binary patch delta 182 zcmV;n07?IK(*ckqe|||sK~y-)W8mQ6{Z9#IfH72=j0W{TJYo z_%9`*0p^3)Ff7O?1u+1o(LlwEJQu)hqsR*=f}{YLCYTEtNCgzx4l@AR{{v$H#a^Il zAd(f0AlpGnne2oFOTsX3Ak(n)58`9X6DVOoPI6|TG&=(TFlXty^z%Vex&QzG5M*US kM=>xrH%2u%I50#+GDI^%G8=!A>Hq)$07*qoM6N<$f}T-FL;wH) delta 87 zcmcc2SUN!^(8klnF{ENnvWbaF%}EEgitq1anL$9=d#Wzp$Pyo1|Bm2 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/11.png index 32683a36ee8499ae90dba07179c912a6be79f534..350d73fbed5e02434505114ca3c5631fa4a77b5a 100644 GIT binary patch delta 122 zcmV-=0EPc+m;sO^bVEr*K~y+TV_+BsqhNRd4i4V`=$It6AVOSF<-d(V7|{lR)PnTD z4N#Y}`VTXRkO43?Fgt<85M*USM>#k*IW$2z cIWaUtMnW<$Ia3w3-T(jq07*qoM6N<$g3J0T*Z=?k delta 77 zcmbQim_0$o-N@6$F{ENn@{}o4V$L`)CM3?pj*@j+@) z41g&zQ1K#YBTNlU58MEBoA6;|^$b}3g#+LX1GtF<08A|?oUpop7z1DdjS+~X7=RK6 zB7AcH1$ZQgHUOj+t{!Fp50?=62Jmr delta 87 zcmZo*DxIJbXyfVP7*a7O*~G-8=A;8##rJoz%pf3aIcp*#chAR1N4sN}Wc>O4Jzpd= o#vtp!3dZKc3}O-MqzuFv82aY&em}9Xp8*6sUHx3vIVCg!0FiVcE&u=k diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/13.png index 6a9006544fb6885337b7c7075f2d5679bac20958..a05b4f40acd27a8f4ef0d68cfa5ace69df7218f4 100644 GIT binary patch delta 188 zcmV;t07L(9*#VFwe}qXyK~y-)W8mQ6{Z9#IfH72=j0W{TJYo z_%9`*0p^3)Ff7O?1u+1o(LlwEJQu)hqsR*=f}{YLCYTEtNCgzx4l@AR|6~~;!Y2og z7K#i2#W&do@NtWQG1&&dQX2@9Yyd1t!jdUj2EZ`IULe~5Hjrj=Qz8Hv@PhKzCuAA` q000nVWkN?VH!?IeGBiOjML0r6I5S2dJ4!+T0000gTe~DWM4fom(4P diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/14.png index 88aa3cfff9d5325271690d01de9bc5abfa355579..d096df52684a4602ea55be891434bd3673b96e25 100644 GIT binary patch delta 112 zcmd1oW1OIpW$EeS7-G?z{NTZZzy6$Q6ND}@7_(HUJdjXfJEUO7KV2ZkCnkW^b*{qv zEA?z$u?`y<7bl4HFc~l~I34r&oM0C+pMilvASKnw-PFb0$<5r{#MIQt+0oR+a_z}0 Qtw1>jPgg&ebxsLQ0F{p<&j0`b delta 75 zcmeBU%$%U&YT)VO7*a7O*~G-8=A;8##rJoz%pf3aIcp;0>27iTvcM#Uqk0mi30E2d bnH3lqtfsQx(o+7L&j19Tu6{1-oD!M#0#*P0MP&|M1rCRj|+kTCjbBtWMx7}HbF2pGcrL$ bH$^l!HA68maOlmy00000NkvXXu0mjfsE$7m delta 79 zcmX@bm^(qm)5O!oF{ENnvWbaF%}EEgitq1anL$9Fe1Cs`U`XM? g6^x77dZZW_8C;~ewcoh2xiJ8Nr>mdKI;Vst0Ar9E!~g&Q diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/16.png index 5c506f6e404a2f677ee81e936397a7fcc76ea698..aa298c7db18270e38a302f6bf23699e47fb11462 100644 GIT binary patch delta 195 zcmV;!06hPJ0p9_TB!7xYL_t(Ijbq^8;Qi0XE%qNogD?Xg08@jE!GeN(QbZddE~xU~ z#vlyU00ABeq76`&v-%G+2yOrmm(YI^J~^Vj0Md+MfRu;^Wnlm}kyHQ+1BwlR1teJp zz-%Ym0F*!>*8qybfFf65OP-`)umJ`tUMSu`ra>4MLm(QI;5=YrAdEG6lI#LXFaXA% xpW_qzBFO*%01#wlLPt0>LqRk_H$g!`ML|VELOEPmR_*`*002ovPDHLkV1m0(MnnJr delta 100 zcmcc5*vL3RCDy~!#WAE}PO^!KNzKUv2M&CAbhJB`M}@)6%*>n(2-Jd15}9?LWc~U2 z`nuk#9SK(&0-4#`8Fk*@+nbyK1V4U%&%e^JgMndI9>4Cv!pW=*K;Y@>=d#Wzp$Py6 C5GZ#5 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/17.png index 86db2d5c1db73f57e8f55baf36179eea12fd221f..d8b7235fb83f7f6820a71fbf03eb1424323ce119 100644 GIT binary patch delta 201 zcmV;)05<=7<^hl-f00QT9_sqgRuYNf+|EC zz{f3yFaV}eUCxRq14Q`b{tNO+p&9@)gct)rYEcXzH4IP;AQiw2fQJD&27tl<9t-3c zfD(=57(i@z(ar#3qnx1aIMV?kjFRj@AqwJvXcz`bNQr2GLou>*k)3a#;zgbdFp@nv zUO>hGvZtTQ?*=_e0000GWMx7}FhoT|MnXhIGeJTyIWRCZf^Jas00000NkvXXu0mjf DW2{V{ delta 93 zcmaFHSUo`{+{x3$F{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnRS-j;$gnO wzg~P{7q=U)glR&7!~v$$p&PdNmWwkmXjSs7E&4sNn*j(sUHx3vIVCg!06wE2X#fBK diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/18.png index a99df87ff1170031e5c11daebe623398d93eb842..d55fdb5cd91649f7fbf473fbb7628ce3b240ac34 100644 GIT binary patch delta 155 zcmV;M0A&ArxB-wPe`85RK~y-)W8mQ6{f~|rZ~&}oVGJ9Cu>azMDg+GxsR5})F#x7f zUCxT20WdXi%U~Rs05M)bR?k3j7>t5p0kFj_DVRZkM*^IxKr{@4B&0+%z!)Y65(Cl5 zVjxVp3n(=J04FAc@1bxYeE9r4LNGQlG%z(n6)-h6F*KE^S{ncW002ov JPDHLkV1nL?G>iZM delta 93 zcmdnNSUo`{+{x3$F{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnR_Npn$)dn v*pMXNBV~|v;DJE{>$KJT>i_E*Dd;gU_^EI%T9_sqgRuYNf+|EC zz{f3yFaV}eUCxRq14Q`b{tNO+p&9@)gct)rYEcXzH4IP;AQiw2fQJF802T)DSRfT( zL?fvHW&j8eoB>iI8mI}0qG*H(fRZvP2B72xSP~{SFQ7ytK+IO; z0J#!{JFVdQ&MBb@0Bj;5{{R30 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/2.png index 0dcadb8d0a3dec3994ab62595db436f682f2d7c4..d9aaa2f3ed4f2b7e9475335a4abd8a20b12f65c6 100644 GIT binary patch delta 133 zcmV;00DAv;qXCd4e@;n6K~y-6W8mQ6{Z9#IkP^`VGX!`f;20zZ!XP#emk?Y`Tu=o? zogkmoe+G(OK(PU%U=)A=#R&>fA( diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/20.png index 5a1218563b7030e0b7e9d6db9b4b97f202410308..fc2bf2c9efc9d8c30587ef1f66948994edbb6df7 100644 GIT binary patch delta 137 zcmV;40CxX(rU8&7e^E(9K~y-)V_+ZwaB%ScN5>4L8XzvH^54cFjC=#s<*fe03?j<_ zm}ZI$AUh030j&TjQG-=2DajKi4^j(HNTeiBWHm57BqdLDbtndq8wLRXUs!%paqp%8 r000nVWkN?rGchzXLpC`zG($5oK{hh?1dY}J0000azMDg+GxsR5})F#x7f zUCxT20WdXi%U~Rs05M)bR?k3j7>t6U1}Kh3Qj$GR1Bgxbcnu&X*%KWG0AyKMettQ` tqW}N^5M*USM=&-tGe$)+LP0n*FflSQG{X3};s5{u07*qo1w^hwV1kVQF#-Sp delta 92 zcmZ3%ST#W<%+b@uF{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnR_Npn$)dn u*pMXNBV~|v;DJFyYfNwb|9`!Uy0{tEsB$j*5MnIL00f?{elF{r5}E*5kRm+* diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/22.png index bf1c0203252ca63fa0d8e556570088d752c66731..5b76e3cd1ca7a564589a0749d159410ba78c0bf7 100644 GIT binary patch delta 121 zcmV-<0EYi@mjRF@b3#c(K~y-)W8mQ6{f~|rZ~&}oVGJ9Cu>azMDg+GxsR5})F#x7f zUCxT20WdXi%U~Rs05M)bR?k3j7>t5ZFgySNIodk^SIdQ|0000GWMx7}Lqa()Ml(1= bIYUJ>GDSr=0YX>X00000NkvXXu0mjf6a^|T delta 83 zcmbQvSU5q&*TU1qF{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnR_Npn$)dn l*pMXNBV~|vUXFC6X=jYG>000nVWkN?oGB!py eL^(7xH#RsnGB_}+3t#L20000D(}W2U j2aX+kb_|Hk67(1tb}ZvG(y|oLU;qM7S3j3^P6H&}>f0ao@K~y-)os&TefFKNoJxZBmNJWQE9s2)&(0Ij$vO{h{Mq_^4 z-b?5GRN}Z6yz#i7g`7F;B@D}#k1fSR4WObN&;W8gx#$}}I|%jywsc9rk#9Qy9|&py zLIVu|<2Eh;Kth^q1W^m%e9@8x06|!k4gef$L_~F>s%^v}N3u}^;E}1aMnqvFjnE6I zFQDm1sxROJxu}$&Dtk^00000GWMx7}MKLx*G%z+fG)6)+Hbpr@A&4mx00000NkvXX Hu0mjf!hcSU delta 89 zcmaFGSUy1|*v`|%F{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnRT9I{rUHI sH%DlULDqp4jLnA`rj@_H$Ge7`;rKaj-GGz3;u(Oz)78&qol`;+06hUB&j0`b diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/25.png index 6a779e5a64af05489081e52467fdf58729c70922..d5cd1ba43fdcf4c66e66fd7a17742068ab91c096 100644 GIT binary patch delta 158 zcmV;P0Ac@Ry8)0Se`ZNUK~y-)W8mQ6{m;iO_8&xpFaxOoq)CuZiZTNPcqAw@fQL)y zzX+ckWd=xzXiydg;({uag#pC|zygvi13&>tu>qifB-;Q`N`$3GvZE0e4kQ}@(gce} zvJId(7GPc&kc0#P<^4)x@W%^N0000GWMx7}MKd%sH$_1;7)C=hMnOYDF~=;|!~g&Q M07*qoM6N<$f}9UGc>n+a delta 70 zcmdnZm@+}dLEF>CF{ENnvWbaF&B+4?4t#iYv^$n3g+Z;zq*uxy>%a=e84XYG?k;D3 a&BV}E%YJLiN*fmjAnq=!j^fq_MUfswoELN5aYgFs5Ele@XOtEHo>n~|%T ZiIcI3p@H8ev0p$r22WQ%mvv4FO#oJj5sCl+ delta 55 zcmYcbo1kJO>*?YcQZXla%9JTFXB-$47P)+0!MK>MN6KIZ4+8@y7bD-Rlz>|dK;Y@> K=d#Wzp$PyPbP^8$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/27.png index 446f3934e323c1956f81cca664a131a59b4922f7..df5c0dddeafb17e243cd1b4796b5c415592a451a 100644 GIT binary patch delta 141 zcmV;80CN9mssWHBe^p6DK~y-)V_+Z=aB%Sc7vPcj&%-73AH-%L*8o0lG4c%%;gkC> z$R|a<0pfxxgTMfa!+_#gpx6Kq9ykM}L^LQ1M5;t1MS)0hG=eZiUVy~}hz0=HtV%yw v6Xml2000nVWkN?qF*QX(Mlv@=K}9h_LpDVpR`!wr0000<2SrXqu0mjf^&2zn delta 74 zcmZ3*m@z@cMc>oKF{ENn@{}o4V$L|QB_t;oCno@blDn}{f@1jN@9*!su6WcG$n3@| cVamY7;1nM3sPf;& zAPm(20UimW4N#Y}`VTV*ZU7IL(0>s=IikG)(u`q%l!yjpVE{LgQ~(PDiVc7TBv}T4 z0+3<@Kmkd%0icu!OO0e10J0qx4kQ}@(gce}vJId(7GPc&G?0V@0C=Wn;mM=xY5)KL o5M*USM@BeALNqrqK`=!_Ha9mzHLrL83GD;*)uz`!fbedmMQR#yff@O1TaS?83{1OP?cA;tgz diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/29.png index 2d1d4bd169effd4eee529076321e7afff5a281a7..80d268c0ecdc176f7f737b108ffb1d0f0c9d30eb 100644 GIT binary patch delta 137 zcmV;40CxX#rU8&7e^E(9K~y-6W8mQ6{Z9#IkP^`VGX!`f;20zZ!XP#emk?Y`Tu=o? zogkmoe+G(OK(PU%V8j86(*aDAjX@YVS(9Y|OryG-75N6h3?bVK$QS@^MP_noWTeFa r000nVWkN?nH#kNyK{!D{G(kp2F+)W}H-q#50000J>0t6e!1;s00K`}KbLh*2~7av<{cUU diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/3.png index cd9d806be3eb4c57148ede6b207f3d5813f44e2a..265a5e4ce8ea15a4a2615d58852089f54f982103 100644 GIT binary patch delta 175 zcmV;g08syZ%mI)je|JelK~y-)W8mQ6{Z9#IkP^`VGX!`f;20zZ!XUP|pbClx5Z}fi z3}FDNHX5jS!3`qI0GMXD0i*z|VL&Q?xj;}*hI|7+m|_FS3IlB6FfaxnCoamPk(`7C zO3Ls+gr#@nya1Ab7xDZ2mw01#wlLPt46H%2is dL^eh=F*Y?YLo+>6y2=0m002ovPDHLkV1j5aKk@(o delta 95 zcmX@ZSUW)_(#6xoF{ENnvWbaF%}EEgitq1anL$9Fe1Cs`U`XM? w6^x77c=(tjZrr$WM*;};)&JKsQqW^yxN68(XZS}rfB^_RUHx3vIVCg!0Ip{ufdBvi diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/30.png index 0a1c5f3b071a0944aa976ec676fa0fe1613e51e5..d466db6d5b502d3fb2e21e24ed96c1f864809541 100644 GIT binary patch delta 186 zcmV;r07d_6*8z|ue}YLwK~y-)W8mQ6{m;iO_8&xpFaxOoq)CuZiZTNPcqAw@fQL)y zzX+ckWd=xzXiydg;({uag#pC|zygvi13&>tu>qifB-;Q`N`$3GvZE0e4usUAV+N2W zSTquAfQ>;IBGzCw6BCFad6-6ZIV*^IWG@hF0L&1$0mLRGG;Co201%63;VI7M1ONa4 o5M*USM=(P}MK&=+Gej^rI5|c}HK`^Tr~m)}07*qoM6N<$f}VOm^Z)<= delta 77 zcmcc4m_0$o-N@6$F{ENnvWbaF&B+4?4t#iYv^$n3g+Z;zq*uxy>%a=e84XYG?k-Qs h{PX*JzDQ^c14G3EZf&miL-!egz|+;wWt~$(695h9AN>FT diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/31.png index 916c1875aafb642ba67678f615a7d0ca7bf19dee..6a1356bce2191ac87ff51e904c4a83d3b8cbcc1a 100644 GIT binary patch delta 139 zcmV;60CfLzr~!~9e^W_BK~y-6W8mQ6{Z9#IkP^`VGX!`f;20zZ!XP#emk?Y`Tu=o? zogkmoe+G(OK(PU%U|0Z(;})a=ltgU|!pJv3UC!!1%pkH1fN7@40CK|s0D$~va_war tp8x;=5M*USM?^F?LPIw~IYmY`Mlv-xK_zIU`~Uy|07*qo1w^hwV1i;&F}nZ& delta 85 zcmZ3%SUf?+-^$a)F{ENnvWbaF%}EEgitq1anL$9)?C7*a7OdCHV2F=reY6BfCAUctDStw*YXLFY-0%+<`v*sAc3DNv5V)78&q Iol`;+0J%dV#Q*>R delta 66 zcmZo;OqifzqweYA7*a7OdCHV2F=reY6BfCAUctDStw*XMg+W?+wlommZrI7d5I2c& U-v(PX4F(|aboFyt=akR{02kL5e*gdg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/34.png index 7ae2161691c4b0bd1ffb000c0e0fa5b31af158f9..b45725e397b0aba23d4d1838191d51ec1653e7e6 100644 GIT binary patch delta 103 zcmV-t0GR)7iUE)*VK|Lr;Nal>kB%8g0WeKA24Vlj1y#s10H#r0&Wd~kV1|(G1+v3n z6bv;mn(VQM0RYjkI{y!nJu(0Q01#wlLPt16G&4pxG(8?S_ELV?5qr*+5n f*Z+45Jj%)tgTe~DWM4ff7l%C diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/35.png index f2cc0827a73378f05b90814595938e2c746ddbf7..bc21c6f7abe0a7dcff354d348ebe977740a788fb 100644 GIT binary patch delta 110 zcmV-!0FnQ3i~*1&Xg5hjK~y-)V_+ZwaB%ScN5>4L8XzvH^54cFjC=#s<*fe03?j<_ zm}ZI$AUh030jEM#POsK|QY_y1dh3_#%N>gTe~DWM4fA0i&_ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/36.png index 13d0f72c47e9ff893c54a4f7fe8a82af3da876a8..eb7ea6b06ed82617a0f662d4862cc3e2245aa6db 100644 GIT binary patch delta 216 zcmV;}04M)}0rUZoB!8btL_t(Ijbq^8;Qi0XE%qNogD?XD08%5sBk`YyO9-MKLdjv z7LddkfDw%_+le&*8Dk2NYXGT%h|>l548f`vW}=Nj7=|P+3{g@GcQJ@CQ1L?X1~QH8 zTx2n(2-Jd15}9?LWc~T~ zcQ;39j6v3c6^zY?8K#xLzh`Iw1b_biHqUa1VPFU~;H!)H6FZjy2s~Z=T-G@yGywq2 C%_g=0 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/37.png index 39fe0e6005b0f3d01062702d6a78abae6b4f271f..a87052bdf67af4fadfee067c9eebd9e5ff569ee2 100644 GIT binary patch delta 174 zcmV;f08#&L%K?xie|AYkK~y-6W8mQ6{m;iO_8&xpFaxOoq)CuZiZTNPcqAw@fQL)y zzX+ckWd=xzXiydg;({uag#pC|zygvi17Nn3Z2&SR+W?BffFf7GY_~B8!!U>#3^u?( z#S6t7$TSGUVhBWo5*$nngi*o(IW|ag0VNm!GzEfW>;VuEC;$Ke5M*USM>sezHa0Xi cGB89qGc`j&HA9Rc5&!@I07*qoM6N<$f-}!KSO5S3 delta 80 zcmX@jm^VSi%hc1wF{ENnvWbaF&B+4?4t#iYv^$n3g+Z;zq*uxy>%a=e84XYG?k?v6 if%^addZh%!85qRxb8B1dczBQj2s~Z=T-G@yGywo6x*pE} diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/38.png index 444c65485d0397b2207ba9f04d6ef4d265abfaba..ef539854ee3a81a51fd94815551c035fda81e780 100644 GIT binary patch delta 110 zcmYf8VVt0nVeaYT7-G?zoFKuvI6sPVN?NPUgnWCQb(CCQi;qMuwXW_Du)M OF?hQAxvX z$R|a<0pfxxgTMfa!+_#gpvVAZJTL};0+B2O&}|1BfK8APwlN5UyMh4}q96{4hGCF| zl!yixBRdz_`35Rp2=j0W{TJYo z_%9`*0p^3)Ff7O?1u+1o(LlwEJQu)hqsR*=f}{YLCYTEtNCgzx4l@AR|6~~;!Y2og z7K#i2#W&do@NtWQG1&&dQX2@965wD9VM!8}Oo=f7IoUHHPN!``UOsHbXE*I5tK$G&nS;)Slb` O00008e^NLPIbyHAFW!BN>tp00000NkvXX1g=70f*RW{r2qf` delta 86 zcmZ3^STaE+z}nNrF{ENnvWbaF&B+4?4t#iYv^$n3g+Z;zM3GsnD0kT`ZZ}>D(}V(v p1BZ?sdv*+@ z$R|a<0pfxxgTMfa!+_#gpx6Kq9ykM}L^KeA2qMriNzn)surUZD$pCmDf(UgvtN$@{7U|^X2m{pMV+^cj3An4L8XzvH^54cFjC=#s<*fe03?j<_ zm}ZI$AUh03!Jq}$;+7Q5AiyI5PE{ZphCvciA{t-}lLLu?Xk;-ErrZUT8UO%;_GWNo vxIORy000nVWkN?qL^v=;GB`m-MnO3?LpC(PTw6K-0000<2SrXqu0mjfOdc`_ delta 84 zcmZ3*STsS!&(hPyF{ENn@{}o4V$L|QB_t;oCno@blDn}{f@1jN_3``50*|sTX6unM mu;58(e7frW{r%lM9o!5u`#F*YWaqLo0D-5gpUXO@geCw?{T^}v diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/43.png index b876f986ef2ca395edc33a15064048534de28996..1c48ba9d4f4e902aadd102c9a43f1f41c852379c 100644 GIT binary patch delta 179 zcmV;k08IaL&;gJne|t$pK~y-6W8mQ6{f~|r@Bom!0FT6f9xfq>T9_sqgRuYNf+|EC zz{f3yFaV}eUCxRq14Q`b{tNO+p&9@)gct)rYEcXzH4IP;AQiw2fQJD&27tl<9t-3c zfD(=58UVrrXMmK524#Urm1v|W5GjsE5T?iru$TbR0D9bKExu9&9XtR401#wlLPt0< hI5$N^LNh}~I5RjzIY#5`F`EDY002ovPDHLkV1n0SUf?+-^$a)F{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnRS-j;$gnO nzg~P{7q=U)glWPR1`Y;>nZewbr6eCHF#v(5tDnm{r-UW|61yAR diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/44.png index 36ab101d0b0df8e47db47541ad9781e1378d0fbc..a993c76b8017ed3e55777d88a643cf36d9bfc25f 100644 GIT binary patch delta 107 zcmV-x0F?h}i2;x#Wi&}dK~y-)V_+ZwaB%ScN5>4L8XzvH^54cFjC=#s<*fe03?j<_ zm}ZI$AUh03!6+EK005S%9e_(l)G#ew;Qj7X~Go- a4hDu~IgTc;cuqD3Ann(2-Jd15}A7@O`6oL zY1oh?-Xmp@b>M+P1M9Tab$@@k2Ic+v{XJhKG=_npmzj6j(py{hF#v(5tDnm{r-UW| DiVh~R diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/5.png index 4e541b128262250c14c2b7faf633ee63c0c87026..fe014b9370e321ad2d5c7fb391c1b9fbef8aa5ae 100644 GIT binary patch delta 193 zcmV;y06zbB-T{y#e~C#%K~y-)W8mQ6{Z9#IkP^`VGX!`f;20zZ!XUP|pbClx5Z}fi z3}FDNHX5jS!3`qI0GMXD0i*z|VL&Q?xj;}*hI|7+m|_FS3Imt{u;?B*13-z4k6R3P zIv^?*_@od9U?fi>4B+7sLKvVfXGL_#g5*W`IYmY?^Ta-y00000NkvXXu0mjfu5m<` delta 89 zcmcb|SUy1|*v`|%F{ENnvWbaF%}EEgitq1anL$9Fe1Cs`U`XM? p6^x77c!Zd5+_-TEgxSupGR$1WefwX+RBr|#@O1TaS?83{1OPWzBwGLg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/6.png index 877b1fefc2bc890ef8e8ddec7822daed6e12df6a..c50fe5e99436cf8a3c0b303091909e93ceeb33f6 100644 GIT binary patch delta 207 zcmV;=05Jc4>;aG@f0s!_K~y-)rISkvfG`Y1U5cM#MO0k45_IWWJcswcNo0g67DZwk z2!+zTkjXSj(^5>{3QlD55qxvc>(ZJ*4e0D7`+E3*s_4~#dEA5`2Pm>y8Z)X#K=A`G zG)tTYj`%mIK{S9u1_2;oGyp;d1K>ouF$jR})ZzCUQN%TBNdd63+ZsD-M7&#=mi9)_ z0toRwlg3DI8l0mgg+GDJo*F+q+8z^ecN002ov JPDHLkV1fnJQyKsO delta 96 zcmaFEST{i>%GJ}wF{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnRT9I{rUR( zy56cC30E2dnc3PIb>83GtL**w{{H&KD;_a1{MP5!)zQ5+p8*IwUHx3vIVCg!0DnU! A^#A|> diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/7.png index 9f28555b4a960f34bf396f4ef09e0c5bdddfc9ea..1468ad5d4e0afd4b3be9d3d3d40a55de7e35a3e2 100644 GIT binary patch delta 156 zcmV;N0Av4txdD(Qe`HBSK~y-6W8mQ6{Z9#IkP^`VGX!`f;20zZ!XP#emk?Y`Tu=o? zogkmoe+G(OK(PU%U|0ZB;udE@0wqx!gD|2E0I3D(fg7MMXZ0Uu5FrC#YG8Wcrh+7h zH2|g#XI>yB3;?TpgYo!woTmT)01#wlLPt3?L^MH0G(j*%7B)dRLP9iw%r0L50000< KMNUMnLSTY1hcwgx delta 96 zcmdnVST{i>%GJ}wF{ENnvWbaF%}EEgitq1anL$9#Ze!s^l;rjpodKYzZGjPq~*Ojl0+|B?5p00i_>zopr064xNn*aa+ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/8.png index 56987a30bb46842d9d03d870838a9b2f6bef5c66..be80d2ebcb3ab29a7fc0a9a28c7637eb32b5e0eb 100644 GIT binary patch delta 137 zcmV;40CxX+rU8&7e^E(9K~y-)W8mQ6{f~|rNC7ZSHU?q;#RXN!GXSPhUCxSp17L=b z?FF*KU=$1nKuR=XRSQcD(}V(v v1BZ?sdv*+@azMDg+GxsR5})F#x7f zUCxT20WdXi%U~Rs05M)bR?k3j7>t6!04R&IbJ|Xp7aa@0C*5sehpI3 ti~s-t5M*USM>Rx5L^(G?HZd?nI5I>7*&6#xJL07*qo1w^hwV1k*4Fj)Wq delta 91 zcmZ3%SUEu@)WOrmF{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnR_Npn$)dn t*pMXNBV~|vK*6w~xA!dXw9RZsSQ&(-vNNl7o|R$%0#8>zmvv4FO#tjd9}EBh diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/0.png index 60bf98cb778921b10b9128b25c40c8d835322b2e..09f2bcaad8c7d03c4156fbb6969d1a30b9b22c72 100644 GIT binary patch delta 185 zcmV;q07n1Z0o4JJB!7TOL_t(Ijir#$4S*mFMA?5G7jO!HoWox$4s4`hS_Yjkz*OdQd0000G nWMx7}G&MpoI5a{yGC4CdLohQiJ+cks00000NkvXXu0mjf0KQ5J delta 192 zcmV;x06+iL0o(zQB!8nxL_t(|oW)Zy3V<*SY=WEb=+amCfxcGU#Yc!x9DIX_TjC%Q zwM`Kn3=~Q)z2vSb5D}Y~(XGaqF9dZT7~fu&I0%S{WwlG(m4;tBKtw=9n5QvaErEZQ zP{^iRcT==P4L=B~65$M-U#A(y2$#r85Y4%q;(nmbg|zRTy*Us@1X4M5DdmAGq3#2F uXTduQIddZd&25$B_rCz`LadGMlh^>a|8UPSynkK*0000g diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/1.png index b58dd056d39d5916aa2dcbc545553f312801e994..32bd32efc9261ceeb4a11254feca92f031a1a73f 100644 GIT binary patch delta 184 zcmV;p07w7I0n`DIB!7QNL_t(I%VYTW@85qIKJXR6hT;3aFvXDN7(fgLN&wXiK=%qZ zby($L9AuYlzIOXRK9{1%BfEei13)eTNx(3=0XXGx1tOs^A<6)JUczYrvdzc_fG}2< zU^4*S-*{bu%K&T|i825=w9&mllmYb53&{Md#u4ixl12F((Ib;E~i`%*Y000nV mWkN?oHZevpGcYwZK{-S@Mlm^4A{Xlb0000 z3^pMtw7vEYFw7kB(R=_f0ssIsQk(%WbCl)oaw;vJO+ZA3h|F~!^=_5;Fa;})55T(Z zs-S9IyM>f<3%E%^IJa`_`#_sWrdZ}F11tcfbFHXL1KFp^;wRSt3Jo;1RUv=>3&!0X cwWr%-57IS&X5D$+>Hq)$07*qoM6N<$g6kwog8%>k diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/10.png index 1599e3396647788e3531771ef755e75e54d1fa3b..e27f889521b9d077add8f307bc3553539cb0468a 100644 GIT binary patch delta 150 zcmV;H0BQfc0kQ#*B!68=L_t(I%VS`m037)G??1!f0ssE}`wzp|oJL3{B_sSN)8`}ZG)u{jNwJQK1aCMG6E zCMG7v&kyfnwFH|y6IPWZ02UbI(02xg&DU<@3{^t%7y#MN_%!160?g0&)Ucon{QHMJ zall;RtEGz9KokQuU%QRse4@etW&k#g*bKl316-j^QVa|ouo?N#YRB@ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/11.png index a17ae21cd57103620fc424b5805cd32981e82153..21271ee0ef9d2f601ab695a4f2863d01dd1a542d 100644 GIT binary patch delta 148 zcmV;F0Bire0k8p(B!62;L_t(I%VS^|KH%TKfB#|lz}J8ONtFjHfU!4UyZxV3dCCm{ zISV8K!=%cS9415=fY-^y*oZ`_#K^?N#Q6E) zU96U1lV`%Jk_5m4V;uUj86>7Gm@&Y>fN;LA zmMUHYQ4H98?KX<@i3$Ul0oXKRGXNtDaD_HWF+g8{E!`6fHW^>L{T~44MshB3Z_Gyk O00004Fg`fw znHeMOpvN*5nD--)zOyeBV6#*J=gyqyTf8&@_7H0|$4kF$96o^x;0Pn}k3jZ~Jt56+ zKyP6UsgA2Z0000GWMx7}H$pT)L@-4&H#0;tMmae)0a`fH00000NkvXXu0mjf$-+(P delta 188 zcmV;t07L)b0oVbMB!8btL_t(|oW)Zy4uBvGq>Y>JVBr;hfY%y#!y}9daqtbsuoVYW zqe2;Eun7s_+H3CsAfl)~h6_rm8iIcE5x*95Tm(cEd5wEIm4rVgKtw=9*w!WAErVA} zXn5noX^NC6;TJ*IBHV%d?F{ph;2cE>thtoaybq*z!Q)$_A2oyt0e8+7uM{oe32W%#8Lz;I000002QE0ESvE;iMskjsO4v o5M*USM>aS!Lo+Z&MMXwNLq#(+F*;zNX8-^I07*qoM6N<$g2Vks8vp(i8cw*)Uih`_vV zrlDrudWBqb3%DskG`DK}^TJ{zET(ZN04o5QtTnyzK+buw#3LF&<$>k4Y2^QZA;dm_ Y8@fGvy|UmOj{pDw07*qoM6N<$g8SG@?EnA( diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/14.png index ad9fe16edfaa2a1ed55e019a084721f3e4e89a5c..1a2d8c2ff868e404a42140bd96aad5521dc8d245 100644 GIT binary patch delta 151 zcmV;I0BHZZ0kZ*+B!6B>L_t(I%VYTW@85r1`2H^l#wX7(cmT4~4t&LQ8XRMwMKm=#M*002ovPDHLk FV1fivI6nXY delta 158 zcmdnYxQlUuN`0fJi(^Q|oa8^>-`}riGdj5N{gYQqIDde65_TU%FGufqGIN5cArKe= zaa~=7_-fS~PiAgdrNX%3fJFN~V}qQ1Wzy+A0+Wt2oTxjtTyVX30+4EBjb#Ww)U@+Z zxVPx~Mh!NQqN6`uS{ctUzmvv4F FO#mBWM2Y|a diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/15.png index 21fa2cb5b56915cb19969cdf8e1be6dcdd9e4d3c..e81dba6b8650e2cd62edb99656298978fb23c0e0 100644 GIT binary patch delta 175 zcmV;g08szd0m}i9B!6~EL_t(I%VYTW@85r1`2H_c{(-NkY!GIk1W;_i=4-bR2B13? zT`@L!38Lum>54lyo=p7Ebq6SgqG=`)4R*KYs!)ly~j)ly}| o7q}P(;0kSghL8=Yn-|Ch03D8Ed%fQ(i2wiq07*qoM6N<$f^IcdApigX diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/16.png index 8ece7aaf86016e8cef2bd89c6266f29161e9ecf9..12188106ce3c7a3e427710c8dca009076f16c5e6 100644 GIT binary patch delta 181 zcmV;m080PL0nq`FB!7HKL_t(I%VRk3_1}L6G67icu4iw^HUJE$X28FH|Ng@;HgDmS z-+b*h+yHbjbOW%;BfEes17OYp(I5#J#unmO<#9zLp)kSfG@_hL$N*%UkqrQ0tS-T3 z0J^{Nx&)U2*fbJl0CH%fdx0neNCp%efE>ceP9+9|QZWE!+b${1)^z8G0000GWMx7} jL^(JzH$pH*Ff}kWIW{vfcQn5C00000NkvXXu0mjf(#S_r delta 174 zcmV;f08#(Z0m=c8B!7`fL_t(|oW)Zy4uBvGJQ}{@;$M8NA0R%$#W?r|L)==YCLoj; z8EisQXnXA)0A?0^v=CX)0{{TjQ=9=Xv*-%3oXU!46A+OjB6l8py;~*TO~I?PT)@0; zrl4lrx`mW;3%E%^Ik$5B^T3)&rb25D+FP5m*6x2 z-QT!0;57i7MxqQr4sCQV5M=-SK+kn4p zVUx@AZA?g6oruPt0{2@xjqmY3UZvv&Qw!pG_GkNj&=yO|_dd=xf}Mb59tDkhpjrqi zvv(G}voLFJC!lqECbEo>GGAUKh?Q7d-GA@_&hKh0y(>>#00000NkvXXu0mjfcBE9j diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/18.png index 65e251c96d90f6cd7a0a74d0325521e2b1dcc7af..b4a629b65117f26e4c52f654806473b90b82f3de 100644 GIT binary patch delta 164 zcmV;V09*gU0l)!}B!6p3L_t(I%VRk3_1}L6G65xeX#oEH`}ZG)u{n*9JXisYz4_Yh z|D?)OZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYaF z{Q$D_c0GFo#>jkRd2|et2LQ=Q^(9_{&u0Jt01#wlLPs%1G95NDF)=koK|(SxFg8Mt SeNyBA0000kg5j9{L`v1cYRpL|Yq&6qJmVkQvV z+wbYVDwOldCn9tbLqtN4^LdQ`LM5JMV+S?>*=102jT3w?ulE{Gb)%l-KE-hSN@ZypAQE%PchG@93b PU;qM7S3j3^P6b25D+FP5m*6x2 z-QT!0U=0J90oXL68-UdX$f1qy1)>Zf1yIKTN^%q^5CQr3_ANSdu6sEE000nVWkN?b iIW<8zGBiOnMma%4H9|u5aSgWs00002{r-}x%a471Jy!I xnS*yWcxOk&Z3MJxk3^;sQ|9Y`p*Q#c-~%vEXMDj4=M(?{002ovPDHLkV1jNSQX&8V diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/2.png index 6e5de6d32bd66c0323e1672aec66472682828fc9..3e7a919442f01bdfa79b39d85edf75894f063739 100644 GIT binary patch delta 166 zcmV;X09pUU0m1>0B!6v5L_t(I%VYTW@85r1`2H^l#wX7(cmT4~4t&LQ8XPEsuQea$Kc0000GWMx7}L?1InFf~L%K}9)2H83zT ULUYNYumAu607*qoM6N<$f~ylj^Z)<= delta 168 zcmX@ac!Y6+N`1Gdi(^Q|oa8^>-`}riGdj5N{gYQqIDde65_TU%FGufqGIN5cArKe= zaa~=7_-fS~PiAgdrNX%3fJFN~V}qQ1Wzy+A0+Wt2oTxjtTyVX30+4EBjb#Ww)U@+Z zxVPx~Mh!NQqN6`uS{ctUNZ?bo PWB>wBS3j3^P6{B_sSN)8`}ZG)u{jNwJQK1aCMG6E zCMG7v&kyfnwFH|y6IPWZ02UbI(02xg&DU<@3{^t%7y#MN_%!160?g0&)Ucon{QHMJ zall;RtEGz9KokQuU%QRse4@etW&k#g*bKl316-j^QVh@+P#lsaH($H`9{>XHb>On@ R4AB4p002ovPDHLkV1l<0NL~N{ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/21.png index aeb098658c415f22c8699aafa3d437ae0e8e6e45..edc3464a849b014ad4fdd5b8bdbdabdb4b0efab3 100644 GIT binary patch delta 152 zcmV;J0B8Ta0ki>-B!6E?L_t(I%VRk3_1}L6G65xeX#oEH`}ZG)u{n*9JXisYz4_Yh z|D?)OZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYcb z&;TIs0s!LD!Ux!>&fx$601#wlLPte0Gej^#Hbgl>H!?*sI1x2ZPkg5j9{L`v1cYRpL|Yq&6qJmVkQvV z+wbYVDwOldCn9tbLqtN4^LdQ`LM5JMV+S?>*=102jT3w?ulcw{$7{=D_}KZDu5GIcw(_XP|<;OXk; Jvd$@?2>@SyNM!&3 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/22.png index 741970de7bd6605145c5b31bc28e65575872cc41..1219ead3a4e9bd855c7b1547a82a3fe5e3d43f1f 100644 GIT binary patch delta 149 zcmV;G0BZlZ0kHv)B!65IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYcb z&;bD1_`X$7$Q~>J000nVWkN?bLP0@7K}1A1Ha0dxH8DBR{|*aC00000NkvXXu0mjf D$Zkg5j9{L`v1cYRpL|Yq&6qJmVkQvV z+wbYVDwOldCn9tbLqtN4^LdQ`LM5JMV+S?>*=102jT3w?ulcyt*=8T4)!9Z9|}+s6O|p00i_>zopr E00l-wrvLx| diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/23.png index af8aa76551fe829619617be46659e7e6c0edbb78..ec91a57eef779d8a1f74b2fbf4c74987930af0d7 100644 GIT binary patch delta 148 zcmV;F0Bira0k8p(B!62;L_t(I%VRk3_1}Mn;Q{{r`}ZG)v3ZM-JXisYz4_Yh|D?)O zZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYaF{Q#xe z833dIzEyB_VN3u301#wlLPs$%F*rCeIXE;qG)6{7K}L#ah7I5V0000B!7QNL_t(|oMZU+@85rh;Q{{r`}ZG)4}8V+7A|=vWJOF&OpHuS zOpKo&-obVmW{illmf>{slZAWX{6*d0+2b=`y+&#B=Y=^uM8fEI&!#J9`0E0EyhX)T)7M zA;eU?v&K7Xdc~~(TD4WkNHc|)#+nHLXgS6JADKpJb<7&AxBvhE07*qoM6N<$f^f7} AivR!s diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/25.png index a851e7f88f9350c91915670d4a7d0360977c938f..8c1268ab4c0b0617151adf91110fa0d4a02ac2b5 100644 GIT binary patch delta 169 zcmV;a09OCJ0mT83B!6&8L_t(I%VRk3_1}L6O2DpXZw840|Ni~^55w5Jg;Rd>wcBt5 z(8bUVz$%aI0`W79-b7{K_*ieYSQ24I8%uF%FAkOQBY4jFx?%m4rnrFINEooQMC O0000;M1&00>D%PDHLkV1i(>IXM6T delta 151 zcmV;I0BHZK0kZ*+B!7BIL_t(|oMT`ZKH%TKfB#|lz}J8OiIrzUR>Z`_#K^?N#Q6E) zU96U1lV`%Jk_5m4V;uUj86>7Gm@&Y>fN;LA zmMUHYQ4H98?KX<@i3$Ul0oXKRGXNtDaD_HWF)*|M0QaJ684#VdB>w;a002ovPDHLk FV1oVjM#2C9 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/27.png index 527506fb9cf514b9da484526a51b4aa3c1394f4d..5bd9f544d2430bb552c0a6f82049640db979e4a3 100644 GIT binary patch delta 176 zcmV;h08jtl0n7oAB!72FL_t(I%VS`m037)G??1zU8nElx8-xM>{{8z8!`Mv5CXZnN zjJ^5VZL9{M%cH0x#{d+Uf;b=v7{(T0=<+CDAjZ$=0GmZbdkLpFvdzc}K^Wa7I1NDe zH!clW!vJOgHjU^8V08gsR_0aK90j0`u*5^psZYmv^?*uIRGnwRBl~r&7f<+ xhnSr;=&Zrfa4SG>+9Sx%;X~AYCV)S@#19mOU&@ehkX8Ty002ovPDHLkV1jAzR)+up diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/28.png index b8b30a050e4f8abce0feb0398a965308f362c92c..32e5795ac9951e6ca121f24c5d0b4c7f01726e82 100644 GIT binary patch delta 177 zcmV;i08anL0nGuBB!75GL_t(I%VRk3_1}L6G67icu4iw^HUJE$X28FH|Ng@;HgDmS z-+b*h+yHbjbOW%;BfEes17OYp(I5#J#unmO<#9zLp)euJ0DNA;2m@?3BO3t1SS`b5 z0J^{Nx&&PiW&k#gL>Yh_+UQ=uYQVtf1xm6r2mkQF(5Cb`_52xd&z`nUic6YF1jlU_eBMh|F~!?P-ntummfCkHEU^ zs-bFLdxczc54bBqH1}%k^Fm`JES7mH04o5Q+-iE|ft>SVi6dJ8l?R&Js*(Ty1s}%% YZanFIwd@^`J^%m!07*qoM6N<$f?g6$NB{r; diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/29.png index 1c50fe0919e55f80060ad5c97388d8557f6ddeb8..1aa93f78791f4fdffdf00cad702d3e14c825eb41 100644 GIT binary patch delta 154 zcmV;L0A>Ha0k#2-`}riGdj5N{gYQqIDde65_TU%FGufqGIN5cArKe= zaa~=7_-fS~PiAgdrNX%3fJFN~V}qQ1Wzy+A0+Wt2oTxjtTyVX30+4EBjb#Ww)U@+Z zxVPx~Mh!NQqN6`uS{ctU`;{600000GWMx7} jMl?h)L_;_=F*QUoG&VLk{0B<^00000NkvXXu0mjf$+$=d delta 191 zcmV;w06_oI0owtPB!8kwL_t(|oUKza3V<*SG{Mbxbm=SnKwm5F;v+;52j3v#mN;lc zZBwLrP$<3hl1oz{BF+-guBkTIU z)2@3{v_OqN1RL}qb diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/30.png index 62d3096bdb1bbf8633711f837fc4f404d8e1571a..5d91aa39ae970ceb40829a9233c34b5df27dd06c 100644 GIT binary patch delta 171 zcmV;c0960M0mlK5B!6;AL_t(I%VRk3_1}L6O2DpXZw840|Ni~^55w5Jg;Rd>wcBt5 z(8bUVz$%aI0I& ZLp3x;L_{OS_PhW9002ovPDHLkV1hc7L>mAA delta 165 zcmV;W09yaY0l@)~B!7rWL_t(|oMZU+@85q03IG!&nyG8RzkmP!!|;KxnBKxAkKzI* zCMHHECML$u5AR~P4U0U*USNSS4t-}}*nI6a&KSWdk1HCH{fy6Gyk3C$8J`*!bOBs0 zg1N$1OBKaH3`W79-b7{K_*ieYSQ24I8%uF%FAkOQBY4jz3cU-RZ`xBmkG7pQq} TK)iED00000NkvXXu0mjfj1))X diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/31.png index 9ec6888bdc92f84d875924a200ede900420054e0..9c18d059486765895ae142fc39a93f9c49b2f3c9 100644 GIT binary patch delta 156 zcmV;N0Av5Y0k{E>B!6Q`L_t(I%VYTW@85r1`2H^l#wX7(cmT4~4t&LQ8XyC002dz`O1Of&ustz01#wlLPsz;L_{}1L^3fmG!;WQH8(>~1AmqP0000< KMNUMnLSTZB4Lhj- delta 162 zcmdnNxQ}syN`0%Ri(^Q|oa8^>-`}riGdj5N{gYQqIDde65_TU%FGufqGIN5cArKe= zaa~=7_-fS~PiAgdrNX%3fJFN~V}qQ1Wzy+A0+Wt2oTxjtTyVX30+4EBjb#Ww)U@+Z zxVPx~Mh!NQqN6`uS{ctUCkTmAnB!7QNL_t(|oMT`ZKH%TKfB#|lz}J8OiIrzUR>Z`_#K^?N#Q6E) zU96U1lV`%Jk_5m4V;uUj86>7Gm@&Y>fN;LA zmMUHYQ4H98?KX<@i3$Ul0oXKRGXNtDaD_HWF)(z%=4-eA0~G-OrEYxf)>iQV0000< KMNUMnLSTZcK}%x* diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/33.png index 988c2f51ca2451c38578adf9c7d005a62b953ef4..153750adf9da1bdf42ea319b7c497f7ad4958ac9 100644 GIT binary patch delta 147 zcmV;E0Brxa0j~j&B!5~-L_t(I%VS^|KH%TKfB#|lz}J8ONtFjHfU!4UyZxV3dCCm{ zISV8K!=%cS9415=fY-^y*o z0I8n3qdAIxjsO4v5M*USM=&u&I5$BZ`_#K^?N#Q6E) zU96U1lV`%Jk_5m4V;uUj86>7Gm@&Y>fN;LA zmMUHYQ4H98?KX<@i3$Ul0oXKRGXNtDaD_HWF+g8{E!~p>02JOsZp#JQkPH9-002ov JPDHLkV1gsZNACat diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/34.png index 0be42a44943208816b46a9131f76cd20c6fe5438..4d1933278200bcdc54e13ab9af4754f9c2e9330d 100644 GIT binary patch delta 148 zcmV;F0Bira0k8p(B!62;L_t(I%VRk3_1}Mn;Q{{r`}ZG)v3ZM-JXisYz4_Yh|D?)O zZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYcb&;TIs z0szK1zEw&dt0n*d01#wlLPs}4ML{z;LOD1xH#jjuMK?@bI1P>f0000GzTb>v)Y?}Wu^T=z~8S_7`Omq}KFm*%1x(`=_ zj%F)#F#;9271{+RG8i+=cFSQ)XklD;K~0mbjqgUy+i&%v3{oydrGhrC(-?rj)78&q Iol`;+07I`s=l}o! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/35.png index bb9ce40e15c011e54857d2641c7cc212e92ffbda..6ff555b7a8fb7f75a7c20dcb9cc1af4e56f32a03 100644 GIT binary patch delta 151 zcmV;I0BHZZ0kZ*+B!6B>L_t(I%VS`m037)G??1!f0ssE}`wzp|oJL3{B_sSN)8`}ZG)u{jNwJQK1aCMG6E zCMG7v&kyfnwFH|y6IPWZ02UbI(02xg&DU<@3{^t%7y#MN_%!160?g0&)Ucon{QHMJ zall;RtEGz9KokQuU%QRse4@etW&k#g*bKl316-j^QVh@+P#2md0s7r?eHH;3mH+?% M07*qoM6N<$f-rhSvH$=8 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/36.png index bd0f23691de5151d63e6b6b865300bad9abc2739..39065196744f0f1dd6ec17cb7d23b7725daf7b66 100644 GIT binary patch delta 191 zcmV;w06_oc0owtPB!7lUL_t(Ijm42M4uBvGMY;cV+?+gxi@Ou6Ycc$!^v9rM}04Aza_nOeK056Zn zd*3*kNi$)!k#Y#YFZ0D3)}#xtefLZr0bXGUz|*!Zga9+^GdKW4I0p$UZB!8?)L_t(|oTXDs3IibweTLcf9Bw>CFW_mVd+8yhATH(%gLD_W zvYn|$hA|+B&%EU217wcBt5 z(8bUVz$%aI00B!7uXL_t(|oMZU+@85q03IG!&nyG8RzkmP!!|;KxnBKxAkKzI* zCMHHECML$u5AR~P4U0U*USNSS4t-}}*nI6a&KSWdk1HCH{fy6Gyk3C$8J`*!bOBs0 zg1N$1OBKaH3`W79-b7{K_*ieYSQ24I8%uF%FAkOQ8X7#|OO{r4YN(j^7}04JS# UwZKM`o&W#<07*qoM6N<$g2kUlvH$=8 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/38.png index a88cc5b4c3d3425a66fb221dff58489341182c5e..e1f47b6269b41823da4b112cc7a45989fb528775 100644 GIT binary patch delta 157 zcmV;O0Al~W0l5K?B!6T{L_t(I%VS^|KH%TKfB#|lz}J8ONtFjHfU!4UyZxV3dCCm{ zISV8K!=%cS9415=fY-^y*o3XIB000nVWkN?XL^d`yF*PtlI2JHCLPJD2-*^*>00000 LNkvXXu0mjfM8iK| delta 161 zcmV;S0AByO0lfi`B!7fSL_t(|oMT`ZKH%TKfB#|lz}J8OiIrzUR>Z`_#K^?N#Q6E) zU96U1lV`%Jk_5m4V;uUj86>7Gm@&Y>fN;LA zmMUHYQ4H98?KX<@i3$Ul0oXKRGXNtDaD_HWF+f+qc;M^5{~EZGE-?TAeROes#oiTZ P00000NkvXXu0mjfFq}+z diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/39.png index 145564073a8f5a536f81db0fa04a9a5785dc80e6..820938dfffcfc4cbb0ce933ab20fb917cb3a5584 100644 GIT binary patch delta 184 zcmV;p07w7i0n`DIB!7QNL_t(I%VS`m037)G??1zU8nElx8-xM>{{8z8!`Mv5CXZnN zjJ^5VZL9{M%cH0x#{d+Uf;b=v7{(T0=<+CDAjZ$=0GmZbdkLpFvdzc}K^Wa7I1NDe zH!cl$4Zx<6C;89)l4*Z^>#B0CS1FhCfYk1UT312F*M7a}R2w@%{#000nV mWkN?mK{horH#9jiF*!6rLoqPTS7d1b0000ZdhzN-Yw>7q_HT>xa zi!7dR0P925`j!6$+;4=X!Mx{uykg~xh7lz5XwP!~QC2P`?Lix@4!{Z^m0O2eGw4RJ zK4ha68m(|N+zQZ}_6YK~tPgXK2><|H;@rEszvu&*#%3%_Kl8Kz0000BZ40sxORF_Y1{OlklC p01#wlLPs(|Loh=(GC46dFh)i-GB{Vx$~OQ2002ovPDHLkV1hM&NM!&3 delta 173 zcmV;e08;nG}mf|_l3nsSj^Ly0Tuu_ft;Vk5+-W^g$I_~rjh^ug%I1D b{ko+a!a#o@(y4x<00000NkvXXu0mjf6j4kT diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/40.png index d9cab30da910ad36d599fa4ef652186ab89c8103..2257c3877c1cad5b88be30a1c552854384863a09 100644 GIT binary patch delta 160 zcmV;R0AK&U0lWc_B!6c~L_t(I%VRk3_1}Mn;Q{{r`}ZG)v3ZM-JXisYz4_Yh|D?)O zZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYaF{Q$D_ zc0GFo#>jkRd2|et2LPGzTb>v)Y?}Wu^T=z~8S_7`Omq}KFm*%1x(`=_ zj%F)#F#;9271{+RG8i+=cFSQ)XklD;K~0nG1(yVW&EN0R^5K_M*%%mRu#}ehh_6s# O00K`}KbLh*2~7ak@{{8z8!`Mv5CXZnN zjJ^5VZL9{M%cH0x#{d+Uf;b=v7{(T0=<+CDAjZ$=0GmZbdkLpFvdzc}K^Wa7I1NDe zH!clW!vJOgHjU^8V08ggP90dwQ0RNWqh%8-rGo%0j01#wlLPs+} hGBY#S?IUGeqFgQj;F*ZdpK{8BW R5Pkpv002ovPDHLkV1f={K@|W1 delta 166 zcmV;X09pUP0m1>0B!7uXL_t(|oMT|1037)G?>{B_sSN)8`}ZG)u{jNwJQK1aCMG6E zCMG7v&kyfnwFH|y6IPWZ02UbI(02xg&DU<@3{^t%7y#MN_%!160?g0&)Ucon{QHMJ zall;RtEGz9KokQuU%QRse4@etW&k#g*bKl316-j^QVh@)FdrWH`tLukq)Q9{0GbYU UFB#$h$p8QV07*qoM6N<$f|K`1UjP6A diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/43.png index 499f82a890fda4488f48c649f18aa7bc04fa1d48..ff3bd35ff1ba0d37fb6b2ccf18b857488afaa661 100644 GIT binary patch delta 178 zcmV;j08Rhh0nP!CB!78HL_t(I%VRk3_1}L6G65xesbj#dXKxS&{QLLsKMZ3t8Jj$Y z0WkLFYqzl)fG&@sjvNC}TngfVBw!d@fT7Eyc!3x{qXTRf5$z?M;>b25D+FP5m*6x2 z-QT!0U=0J90oXL68-UdX$f1qy1)>Zf1q{3apg;rw6J_#<#Vh9RXaE2J5M*USM=?1z gIW#sxL^v}cw-L~~JrbElOqu`p7iRGRNv>nc=#}Rn00000NkvXXu0mjfjC@(B diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/44.png index 799aa7bdf57f92cbd6f9b19f33fdf2ebfb9491c7..9b2102f78b7ddf3cbf8341670d5731426cb098bc 100644 GIT binary patch delta 148 zcmV;F0Bira0k8p(B!62;L_t(I%VS`m037)G??1!f0ssE}`wzp|oJL3 z007^Yx}!B!7QNL_t(|oMT|1037)G?>{B_sSN)8`}ZG)u{jNwJQK1aCMG6E zCMG7v&kyfnwFH|y6IPWZ02UbI(02xg&DU<@3{^t%7y#MN_%!160?g0&)Ucon{QHMJ zall;RtEGz9KokQuU%QRse4@etW&k#g*bKl316-j^QVa|&02KffOK!_>F6f*90000< KMNUMnLSTY}!$TPW diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/45.png index ad9c4132dae448913159d3da9ceb7714a36f2808..71d03b1fcaa8ba75761d0651a09cd59994da6433 100644 GIT binary patch delta 145 zcmV;C0B--Z0j&X$B!5^*L_t(I%VRk3_1}Mn;Q{{r`}ZG)v3ZM-JXisYz4_Yh|D?)O zZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYcb&;bCw zUb>^Z@rNk@000nVWkN?pHAX@+I6*@;I7351MmRXjEjw2L015yANkvXXu0mjf*_}Gd delta 152 zcmZ3>xP@_oN`1Abi(^Q|oa7(h-`}rqd&v0j@9*#OZTvMyzliBos-?L4`1tgI@O=4u zN3%H1D%I9#c{1o299#IFhiCTsyT>GzTb>v)Y?}Wu^T=z~8S_7`Omq}KFm*%1x(`=_ zj%F)#F#;9271{+RG8i+=cFSQ)XklD;K~0mbO^ks-$T43~sEKc)90L$|y85}Sb4q9e E0Pbl&kpKVy diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/46.png index 6f10fe926322b3de3580e0f7f2de600ca1f264c7..3ee382cc1743e9b2ea4d2dcbfd7b254a0c25afa6 100644 GIT binary patch delta 152 zcmV;J0B8Td0ki>-B!6E?L_t(I%VRk3_1}L6G65xeX#oEH`}ZG)u{n*9JXisYz4_Yh z|D?)OZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYaF z{Q#xe834(1#ksc1lv@A*01#wlLPtYHG&MmqIX5ygHbO-;I1w||NX7*K0000kg5j9{L`v1cYRpL|Yq&6qJmVkQvV z+wbYVDwOldCn9tbLqtN4^LdQ`LM5JMV+S?>*=102jT3w?ulE{F%nOj0$E-~CsfLAJi~<~-@cE(}26 M>FVdQ&MBb@03=dKYXATM diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/5.png index ccfcc82f6edbb85d9eecf58eb85746333842e5a7..2093b4610f292bcf750b4bf057173968288482c2 100644 GIT binary patch delta 178 zcmV;j08Rhc0nP!CB!78HL_t(I%VYTW@85r1`2H_c{(-NkY!GIk1W;_i=4-bR2B13? zT`@L!3(GHUIzs5M*USM>jA= gI59*+MKD7{LNrD(M%)O~T>t<807*qoM6N<$f?n=KSO5S3 delta 188 zcmV;t07L)I0oVbMB!8btL_t(|oUKza3V<*SG{Mbxbm=SnKwm5F;v+;52j3v#mO5xe zZBnp$P$<3hl1oz{BA+FqT~lu!sJg-9M~&(?!%|290000Yh_+UQ=uYQVtf1xm9s0Fc)AP`M;10w@3g01#wlLPs$|F+njo dF*!y-Ge$u;FgcnquG#IG3J)~5RU`lZ3;ynJ bw%Z;bMC^eW;w;_U00000NkvXXu0mjfx#>-O diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/7.png index 379b2aae8b6185b86157d944dc41b5c64e102087..d76dc0d5b157b140154d30b52f3836e5b338ec73 100644 GIT binary patch delta 156 zcmV;N0Av5d0k{E>B!6Q`L_t(I%VYTW@85r1`2H^l#wX7(cmT4~4t&LQ8Xy?F91$_{d^^BL2&>801#wlLPsz-GDSu~Ff=tpL=`zOLqkO-`}riGdj5N{gYQqIDde65_TU%FGufqGIN5cArKe= zaa~=7_-fS~PiAgdrNX%3fJFN~V}qQ1Wzy+A0+Wt2oTxjtTyVX30+4EBjb#Ww)U@+Z zxVPx~Mh!NQqN6`uS{ctUIRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYaF{QxD| z8Kf5gtl7c`Oz8$e0000GWMx7}H%2u^L@_x+Mm0l4HbFx{;}591s{jB107*qoM6N<$ Eg6Fh6h5!Hn delta 161 zcmV;S0AByH0lfi`B!7fSL_t(|oMZU+@85rh;Q{{r`}ZG)4}8V+7A|=vWJOF&OpHuS zOpKo&-o-B!6E?L_t(I%VRk3_1}L6G65xeX#oEH`}ZG)u{n*9JXisYz4_Yh z|D?)OZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYaF z{Q#v|5&*!N!UyjDoZ0{Y01#wlLPt3=H8eCfG%+$TH#9~?LlH)Ja&b`r0000F! delta 158 zcmdnOxQlUuN`0fJi(^Q|oa7(h-`}riGdkF~{>kg5j9{L`v1cYRpL|Yq&6qJmVkQvV z+wbYVDwOldCn9tbLqtN4^LdQ`LM5JMV+S?>*=102jT3w?ulE{F$+&r)R+ttl%@_FEOr00f?{elF{r G5}E*?Vnuxb diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/0.png index 0c1ae62e95223129e9c921ac493b0ba49713429d..ac1331691072fe539a57777be7188d8a95928e42 100644 GIT binary patch delta 181 zcmV;m080OD(gBbpe|CqN3Fn)1V z3XI=gkiozp#mE@L00t5P^$Y;{6Xa}i3;=nJYy&|0;0AyhL)QR!U{GQJI66oKpy;RA z0C4OLr~%*i_@%5M*USM?peDI50st88tIRGD1N{K|z(B>*D|b N002ovPDHLkV1k#rJkkIF delta 76 zcmdnPm^DGg&Ct`uF{ENn@}K|Pf7&zed~m;njjf9(0SFekd|tu0n5{>ufuZMrz4u@H e(yx*?*%%nOj`6uMq}RS-00K`}KbLh*2~7amARZ9_ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/10.png index c196168ab8627ce367881c42efb7577feca85289..f83fe7b12d2a60c987179a99638870f9028ed3c8 100644 GIT binary patch delta 104 zcmWG>|6h*%`TxnQbcW2j!jP^SX19YH6099}I1Z&q ze|X=oWnsv;Y7A delta 57 zcmZo;44FVdQ&MBb@0DOWJ+W-In diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/11.png index 33424530f8cf29841cb4583a27083d386361cbe3..302541918a0f161cba96d70c6d66ca1ac8497258 100644 GIT binary patch delta 100 zcmWG-Vw|87r|aqB7-G?zoFKuvI6;I*=)?c|@Bi!TL;g=*%-%V zu)btwSaD6V^j8wY9|i^nfs|AycQY4bBO?<>H#bvbM*}BQgGa@D=|DLKPgg&ebxsLQ E0I($_1^@s6 delta 55 zcmZo-44t52DC6nk7*a7OIYEMTae@es_=o@7uhbWPoww(}2YH6m=B#U^w$H!800f?{ KelF{r5}E)}g%zLx diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/12.png index 795fbecd3dd19fd51b7b654a23b42993820d8535..2df71661eaa7736000aafc71692355bc9dc23f8f 100644 GIT binary patch delta 177 zcmV;i08amB&H<1le|bqnK~y-6WBC8S`#&=N_eT{4|NNkg6MwoZ|DOS*>CqN3Fn)1V z3XI=gkiozp#mE@L00t5P^$Y;{6Xa}i3;=nJYy&|0;0Ayh18M*`Fvv9k9-1TqQ0#%j zj$8w%;sUq<y85}Sb4q9e0DT)BssI20 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/13.png index c622978e5acb53df3dccc18a366755c0932b81e5..314a6093629c8a216fb3eb653125ee7498ad57c4 100644 GIT binary patch delta 151 zcmV;I0BHYZv;mMLe_u&NK~y-6WBC8S`#&=N_eT{4qsyW589Q}vFgZCyHa0LZML0u45kx+`PU8Ro002ovPDHLk FV1mrNH5vc_ delta 71 zcmdnOm^wklQODE8F{ENn@}K|Pf7&zed~m;njjf9(0SFekd|tu0n5{>uf#u)-X^S+> ZnHWl6b00|Z*$~PA1fH&bF6*2UngBm-9E$(| diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/14.png index 058872c9ec759db0a7ee76ccd1365c1d0e810d44..2d3ee08974c41f4995874386bd47d8344904ae28 100644 GIT binary patch delta 118 zcmV-+0Ez!qlmU<=a6d^zK~y+TWBC8S`#%W(`=biSKR+mgF^CP5hp9p5GrYYZ^B;y^ z9F+oN5c|_zc{oOvhsnYC45MHajDkS|0D_ugmyEf94*&oF5M*USM=&xqG&M# K=d#Wzp$PzDe-qCD diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/15.png index 552b195c96b479c4bfd0a62ee7368b70d927c989..72ead9f0f1e41f436c92c3814a6e3ba417bc9833 100644 GIT binary patch delta 145 zcmV;C0B-+gt^trFe_2UHK~y-6WBC8S`#%W(`=biSKR+mgF)|w){&ZLVKf~J#GXG)t z#Zf6R2C+esAPkd(@nINl0J&gr7y$Ab*#>|Dc%&NuN_?O+Gq5fgcrQ?70L3nV82|vO zN3|G@5l40a000nVWkN?bH!(FtMMN|?H$yT+FhVg_2Bhu)3jhEBNkvXXu0mjfg%&eZ delta 72 zcmZ3-m^MMhN!QcGF{ENn@}K|Pf7&zed~m;H(^ew`Aegh~z=!#rM#>TrZoCqv30D}j aBpDbs@UoxGl@AYR00K`}KbLh*2~7Y#4H}66 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/16.png index c21dc7aa5e96e98da6c41a17f7d14d5cda6b5194..94a95d4a3fa691d67378b2c6d26597dcab2ab416 100644 GIT binary patch delta 152 zcmV;J0B8SmwE>VMe_%;OK~y-6WBB(+_5X{bQvVr91pohc|NnGX{y&&OjsYOeV148o zfZ~+57i7pc02BtpzyNS`444akeo&^|0E)aYOboz=L9v63K}jBj(fQz91;e1&K*z}9 z=;}b35CH3r!Lf28&V2v?01#wlLPtYIH$pZrGDAf&GcY(Z5;ijxBFW+a0000RN{7>pV~p#lH@cT;WvIVqUB20Yp#_8-gu1qd<*r7{pk76Yk6$6y0s zxe*i~APi%J(m4pj#9$bt2^j+bsl&ivcgNzj0000GWMx7}AVe`iG&40dGeb5tLo+fo UMhKtcssI2007*qoM6N<$f|3O~W&i*H delta 84 zcmX@iSTsS!&(hPyF{ENn@{j-9f7&z8eDFVCbJJHN10a~Q=fH>gol3$I5)y8_5~c}P o7&sFC{EvS1f92})C(IZaw#f0_-G6(^AqF7uboFyt=akR{073pFg#Z8m diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/18.png index 7be1ecbe5910162874e5bcdd6008cbb616f9420f..1e20316b8f2fb19519bc651c6520607c134fbe04 100644 GIT binary patch delta 135 zcmV;20C@jlqydm5e@{t7K~y+TWB7De{{M@kQvVr91pohc{|D)10BI)20CFuJ1*2ft z0#L5{_eT{4|NNi~#>iqIb;xRAe0XkrdqD<_VQf%tgJGB)Iv=DK0H?fo)sH$$(EtDd p5M*USM>j?^H#0CqLPRq%G%zzaF~?s_KL7v#07*qoM6N<$0fIowGkgF5 delta 67 zcmZ3&m^eYjR>RZ9F{ENn@{j-9f7&z8eDFVCbJN$pra%L(6}%Gv|4;i>|LT?TCSC>x X`zJiwT?fCfVgLe9S3j3^P68e^NRN{7>slS{{QbLEB#Q{1q1H|umK>GKpe7N03ygq(=Y=7ntph>cOnEJ s0000GWMx7}H8MmtL^&`wHbg-*K`=Nl{&^b<00000NkvXX1g=70f`;fY2LJ#7 delta 76 zcmZ3^m^DGg&Ct`uF{ENn@{j-9f7&z8eDFVCbJJHN10a~Q=fH>gol3$I5)y8_5~c}P f7*;S&N%LfozrqvwY5B%o3_#%N>gTe~DWM4f*2W$r diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/2.png index 72a38b1c0ba13eb4f5e007c505c73923ba60e39f..fe45940303a24fb7f316680545958cf3b9b8f09e 100644 GIT binary patch delta 141 zcmV;80CN9essWHBe^p6DK~y+TWBC8S`#%W(`=biSKR+mgF^CP5hp9p5GrYYZ^B;y^ z9F+oN5c|_zc{oOvhsnYC45MHai~>Xq>(UIvB< W2e{Uy%bnQD00f?{elF{r5}E)6?;SG$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/20.png index e85c2cf482a0b6a9ee416e21f3f53b2f0c3bf86e..ccd0f225b6a0b64ae94b36c26a4b8eaebe983471 100644 GIT binary patch delta 113 zcmV-%0FM7zj{%S*YdT3pK~y-)V_+Z?{Quwm|I=Oh|K#dt0BL@4REm59M!_f;ZUB_4 z{{2z?PmVqiW&q_VaY?J00000NkvXXu0mjf>Ax!2 delta 59 zcmeBYjGUlis^ID37*a7OIbi|ApZ~gF=L`K^oFLM}w2H}V)030jJpUOxGdT8lF{Ey1 O00K`}KbLh*2~7aOn-;hL diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/21.png index 7e80b63bb8c2d8dc30f070852b278dc3dfc6aaa2..6fb168e310b0ad8b309fe92b6b55cc65d87d777e 100644 GIT binary patch delta 107 zcmV-x0F?h)i2;x#Wi&}dK~y-)WB7De{{M@kQvVr91pohc{|D)10BI)20CFuJ1*2dT zV9AXjOtu04{-}bpGXOdkB!k#%o=^Y)01#wlLPt3^GdVLeLPj!0Gd4jmI6>w4Xp#T` N002ovPDHLkV1ht!C?fy> delta 60 zcmeBVjGCZgrs(P77*a7O`N#k5Kkb=kKKP%nx#??PQ=kDCo2W%)<3oFf4?j7zcDJ2z PV*mnAS3j3^P6}%WV&R|sqa^&_|L(;>|0O+G{{Juk&;Bx%Aye%*Ly@i=>*55F3tS8g zM#*?YcQZXm_$N%j=?U`pj_@A%2>1$t8paB<~ECa)#pDwifWXt$ K&t;ucLK6UoITaBA diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/23.png index 288ade27c0370ca14a962e4f5b85de4e6a23be69..32cc0b52414266232db59432600ec4ef30a04b66 100644 GIT binary patch delta 102 zcmV-s0Ga<(gaMEwU@u8TK~y-6WB7De{{M@kQvVsq1t857888Y)!6<-$|Np!H|NEm# zS#AVnX>#=g0J*XknXAYJJpcdz5M*USM@2+1F-ABuGczi_@%07*qo IM6N<$f{5iNzW@LL delta 54 zcmZo+44I%}Anobm7*a7O`N#k5KkW}|NU$zWuxR+df2qc)a|~~8uuXa}|9&3>5O})! KxvX_JR!g27sJGt^r_uCWei<+W;Gsz(fJZ;M22jNXa0AGR1r#rk8;xKC zK+dPg1t0^+$xJW<0N8@(IYBTp88k3NF*GnSL^Py?T#o<% N002ovPDHLkV1gb@JOuy% delta 78 zcmdnPm@`4e!`RcsF{ENn@{j-9f7&z8eDFVi<$s?iS!oFg2^OVaC7E5>3=9lq=!j^fq_MUfswoELN5aYgFs5Ele@XOtEHo>n~|%T ZiIcI3p@H8ev0p$r22WQ%mvv4FO#oAT5q|&x delta 44 ycmYfEo}i*Gs15-mYV<%&CO9Kl> X7Z=x^R~eoHRZ9F{ENna>4?JKmT>V&KLU2qpol8Cw WzpN)dCOBSV00K`}KbLh*2~7Y+>=%Rp diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/28.png index 7b93930abbb738b4bd23cd7925664127589fc17e..a6ea0f0769eed4e674df9750b66fdadb761bf677 100644 GIT binary patch delta 132 zcmV-~0DJ#&q5+U3eoaY4K~y-6WBB(+_5X{bQvVr91pohc|NnGX{y&&OjsYOeV148o zfZ~+57i7pc02BtpzyNS`4445wKPV3e11O3GiVXlcpJD?j$xHwgp=>914?mv(000nV mWkN?nGet5oLNzotK}JPIMmaMj_%mYw0000 nJnPeESkTBORk8BYKH~$dCY)UB7^)je8Gyjk)z4*}Q$iB}C*~fM diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/29.png index c4a3b1ae74f4a38084002c2b828c7156e40d41c7..9abf1ab9f6185b7320d4e235ab3fabc05add2a3b 100644 GIT binary patch delta 128 zcmV-`0Du2ko&k^~dPzw{K~y-6WBC8S`#%W(`=biSKR+mgF^CP5hp9p5GrYYZ^B;y^ z9F+oN5c|_zc{oOvhsnYC45MHai~`C4EJu=U04OViawPzYO>eTxp?4+#000nVWkN?V iG%z?sLNzlrLozf*H8?^lu))3n00009XM diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/3.png index 449fa9aa0cf136870a4f318149348add94c30bcf..e191f24a843f5cb3ae8c31d1dd073d5fd428a5ed 100644 GIT binary patch delta 172 zcmV;d08{^P$pMfge{@MiK~y-6WBC8S`#%W(`=biSKR+mgF)|w){&ZLVKf~J#GXG)t z#Zf6R2C+esAPkd(@nINl0J&gr7y$Ab*#>|Dc+>z24FIKHiVXmz+JQCT(H61)4Cpx# zJvYKIEY~7qumQ+95SAm+b0bU*2!k{sV*pjI2`41gQ2zh`CIAp*WkN?pHZn0cI5{>n aI6*NvLqs^ofy3qi0000TrZoCqv30D|6 m68`*;e)WIl>hmYe7#LVNc@rl7UHpLo2s~Z=T-G@yGywqm3?m!> diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/30.png index 8084ded71f23652ca2bcbf96aa08e6364a6aac95..bbd30d9a8d3ec3e511e21a982480a066e48ccf5e 100644 GIT binary patch delta 126 zcmV-^0D=EuoB@y|ct=S@K~y+TWBB(+_5X{bQvVsq1^@qd4*~<;UXUT*08khV0|P$Y zl^;L@etu9M4hB#Z3ltjway~f*fU*DxgAE`jGr^)C00xk48bV($tpET35M*USM@2$G gHAOWuI7BcrIYc)%GN?35od5s;07*qoM6N<$g5onL7XSbN delta 67 zcmbQkm^eYjR>RZ9F{ENn@{j-9f7&y%HgpP|UCh=aWst=n%A4@xe{|QIH#MJ_4%aj2 XzuF9!~gp4^#W?Q8|v#r{@3r){x8qKeVA8<*VQwN rfq_9FCDqB@$<^81!qmyp$lS%m&BD={uXm<2P>#XV)z4*}Q$iB}R7e~L delta 49 zcmXR9n4qE~?&;zfQZXkvL4tL0f=CY&TiaxDiGR!tT#K1zCK|q#X8;0ES3j3^P6!~gp4|Lf~R{!h+5(7ib5zx~~*>bDsf7Ao^Z wN&nh(n1O*oASKnw-NMD(#Kg?S)!EF<*u~k@P@73Y6)4Bx>FVdQ&MBb@0DD9qyZ`_I delta 50 zcmb;poS>pB;pyTSQZXkvL4tL0f(VcJhyUBJ)O&qlW;n8hS!Bm-b~y$h@O1TaS?83{ F1OURF5jg+= diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/34.png index e33a6cd05b15bb07ea94bc5b01ac9a5752c76fea..9f698a757f0ada66e8d8ab61120b1dd1430fa417 100644 GIT binary patch delta 102 zcmV-s0Ga<&gaMEwU@u8TK~y-6WB7De{{M@kQvVsq1t857888Y)!6={%{QuwmAB4#^ z;NKtB|Dd7(03=cvTgSzBsQ>@~5M*USM>0l1Mngk6F)=wbH8({>L*ekTR{#J207*qo IM6N<$f|q|Mt^fc4 delta 53 zcmZo+44$B(FXidt7*a7O`N#k5KkW}|NU$zWSkgRMT;d-ygVA+1@xwnS-)8^faw#@-qb}M^Tb30k-EDf-}R#e*gdg5M*USM>a4tMnX0)GdDy;MKv-;L|0vlDF6Tf M07*qoM6N<$f`!Q_b^rhX delta 55 zcmeBR44t52DC6nk7*a7OIbi|ApZ~gF=L`K^oFLM}w2H}VvkF7gRW^0AtQET%fWXt$ K&t;ucLK6T_JR!g27sJGt^r_uCWei<+qzypI41IY0LJo+gy0Gt2^)PP4@#2^M> z!=OMy#vl#o7;FH@b{GZ)3N{RKDhz`(A!7jTl?h9juWC*JCjbBtWMx7}HAON+IYU81 bFhe#)LNz%yjMg*l00000NkvXXu0mjfgr-13 delta 84 zcmX@bSTsS!&(hPyF{ENn@{j-9f7&z8eDFVi<$s?iS!oFg2^OVaC7E5>3=9l8e^NRZ9F{ENn@{j-9f7&y%HgpP|UCh=aWst=n%A4@#fAp*WD_5UCVaC9) XPm$B4`Hx;I0}yz+`njxgN@xNArsNuZ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/38.png index b220dcccb1ae11b340f577cb8eb13fca130c52af..7560231c91ada7c0178e21284455fd1688119661 100644 GIT binary patch delta 118 zcmV-+0Ez!qlmU<=a6d^zK~y+TV_+BsqhJ&a67c_j_y2!?R8jEH56WPSECy1CtQN*+ zcyUzfKM23QAOprQ_NTk@a14_}=Y!M&0C{O)Zk(aYI{*Lx5M*USM>9n;GdV^$I5|N< YH#s;qG)$+{LI3~&07*qoM6N<$f(QjHSpWb4 delta 55 zcmbQj7&<}4P{z~6F{ENna)Jcw;sg;M;R8SZZ@= K=d#Wzp$Pyf4ii5B diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/39.png index 28378c94cbfd96ff82fb60133d887fb956df5460..3cc37112bc599dbfd6638f79b269d46163fff0aa 100644 GIT binary patch delta 155 zcmV;M0A&AbxB-wPe`85RK~y-6V_+Z?{QRK&|I=Oh|K#dt`1ePZG6N`f0aXlmdqIY> zFc>v}LIeK)@21><7e}QA*nme{#QuXBpa4O}pi~CJ$YLOM=ooAO$Qd9E3J?&6u|eq^ zgkfSZ4AO**0g*JdA<+@wg#Z8m5M*USM>s`6HZwFgGdDp+6*oaSGeX)nXe$5!002ov JPDHLkV1n8eJi`D0 delta 77 zcmdnNm_0$o-N@6$F{ENna>4?JKmT>V&KLU2qpol8CwJ000000 LNkvXXu0mjfYAZLv delta 75 zcmdnRm^nek)xgumF{ENn@}K|Pf7&zed~m;njjf9(0SFekd|tu0n5{>uf#u)-X-d}S e^Y$G0AkR=!#~0zgtFxH_2s~Z=T-G@yGywq8CLZPh diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/40.png index 07edfcbb579d78e7fae34618b6ad0dfb7fe2d380..5a28d1feab90a3aa7aa629b6819a9a8300436bd9 100644 GIT binary patch delta 127 zcmV-_0D%8lodJ*}c}Ph_K~y+TWB7De{{M@kQvVsq1t857888Y)!6<-$|Np!H|NEng zf`5Kc24iF~kUC_wFg`ptzP%s=#xOQ0o5L_n4xJBD3jmS$Y^|*3@?!u101#wlLPt3< hH$*~3K|)0^IW#plLqTh3-8}#R002ovPDHLkV1jSaF#iAm delta 59 zcmbQs7&$@3RKe55F{ENn@{j-9f7&0`kYHV$Ai;3#|Nf=_=I{E|lf%r=xS3Pp&PJ}+ P3_#%N>gTe~DWM4f0@xVg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/41.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/41.png index 60106021433de355b6f6390be0b110f77d704ed7..1971c3500af8d3aedbf425ee9ff57be07bdfd137 100644 GIT binary patch delta 127 zcmV-_0D%8vodJ*}c}Ph_K~y-6V_+Z?{QRK&|I=Oh|K#dt`1ePZG6N`f0aXlmdqIY> zFc|3u{Quwm|HVvo-(#01#wlLPtR} hGD0^)GdD6uGDSo)I722L^uhoD002ovPDHLkV1inYGa&!~ delta 69 zcmbQsm^?wnUdz+PF{ENna>4?JKmT>V&KLU2qpol8Cw4?JKmT>V&KLT-I6gTe~DWM4fU9B18 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/43.png index 122fed8242af464157aed7bb7df91d3283f11a23..a1f470a8d0556322cb8b1b6aa9aac1778bed6cb9 100644 GIT binary patch delta 129 zcmV-{0Dk{yp8=30drC<}K~y-6WB7De{{M@kQvVr91V2A0{|D)10BI)2fPa5fAqJ2O z;4TRN{7>slS{{QbLEB#Q{1q1H|iVUFG1uz2u{akEdInDrZ0000GWMx7} jHAOf=I5;>oHAXZ!H8DXmD`OS200000NkvXXu0mjf$e=BM delta 74 zcmbQwm@z@cMc>oKF{ENn@{j-9f7&z8eDFVCbJJHN10a~Q=fH>gol3$I5)y8_5~c}P c7_=lA7~%~%-CiDzopr0C2?{V*mgE diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/44.png index edd53e5e79f64f6bc6d0a632bebfda997a8e685d..2adc3e238a1ca1994dd4c8f96fa866e7b7e3ff79 100644 GIT binary patch delta 91 zcmV-h0Hps?dXOYmB}qgs(){hkZ-!AY3P!FMGaQZXkvVFAOR|GHo23;kW3Akx$1$jWfYh*_lap6y8nAn|0PebDx4LOG~jYOs3D=kz#uc9+d(Ms_g@AE q27#1RCwFHHM@u&o7gGxhBSRNgLz9kgOWp(J7(8A5T-G@yGywn=@*GM4 delta 49 zcmXR7n4qE~?&;zfQZXm_$N%j=?GI~6ur5vzF)(0Y&~ag|UmTFd%m4(Qu6{1-oD!M< Dwm}d7 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/46.png index 65e2cb1f4dc32febe54847549cb2d9f901340a78..12fa173961ddf12348ec1f01c426227640e5b9cb 100644 GIT binary patch delta 116 zcmV-)0E_=!k^zt;ZaqmvK~y-6WB7De{{M@kQvVr91pohc{|D)10BI)20CFuJ1*2ft z0#L5{_eYhi+z7(p+z8H=Bm$77AbkMWDKOkzjt)Zr000nVWkN?oLPJC_IXE{mI5Idf WHa0hRy};rC0000bP0l+XkKRxlW+ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/5.png index 935cf0bc9b93052458e88cd89db64faac720412f..af7cb7618e5cf5b5f5f39c9854e85397ee224463 100644 GIT binary patch delta 151 zcmV;I0BHYiv;mMLe_u&NK~y-6WBC8S`#%W(`=biSKR+mgF)|w){&ZLVKf~J#GXG)t z#Zf6R2C+esAPkd(@nINl0J&gr7y$Ab*#>|Dc%&NuN_?O+Gq5fgcrSnrfaOH8T>v7; zNz*U`07hxSajS44%m4rY5M*USM@B+HGBHLoH#9LhIWa*r5k|P)qjvxR002ovPDHLk FV1imnI6eRX delta 80 zcmdnOm^VSi%hc1wF{ENn@}K|Pf7&zed~m;H(^ew`Aegh~z=!#rM#>TrZoCqv30D|a jF#fOio;ZK5q=W=R!3M57O9Q%2F#v(5tDnm{r-UW|d(9wp diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/6.png index 624608a6e4075a4784c9cd89e2fb15fa56ad67d4..cabed49d3db7a01f07b9a91c8faaec542ed2a6c6 100644 GIT binary patch delta 140 zcmV;70CWFxsR58Ae^g0CK~y-)WBB(+_5X{bQvVr91pohc|NnGX{y&&OjsYOeV148o zfZ~+57i7pc02BtpzyNS`4445wKPV3e11O3GiVXlcpBw`~Spb9)xr)r_2LK#Yc|r~M uFV6q~01#wlLPt46FgQd+G%-OpLoqf+LNm1P4=4Zt002ov22Mn-LSTaT@G@`! delta 84 zcmZ3|?1AeR6D diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/7.png index 405a4872cece2c61afb37ab2db122b03e6429a10..198c029cb9e4b514bf504a3fbb16d81446d230c2 100644 GIT binary patch delta 138 zcmV;50CoRgrvZ>8e^N71?d9-CvSWU#&R4t s0000GWMx7}GdMRyIX5sdF*iXuMK&@tL~ue@00000NkvXX1g=70f?b+1Z~y=R delta 65 zcmZ3^7(YS9TFukNF{ENn@}K|Pf7&zed~m;H)7HMGKm)E7eEv_YIbjsO4v5M*USM=>)qI6^rvGcrRmMKCosLa7ha QRR91007*qoM6N<$f;Md`G5`Po delta 59 zcmeBSjGUlis^ID37*a7O`N#k5KkW}|NU$zWuxR+df9Z*H=hXEL{;)HA&gRsbA=k5w P0SG)@{an^LB{Ts5@zodo diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/9.png index abc40e192eacfa322b6b8256d907a53b3377558c..b8bc13da2b3a7cf0708aeb35aac7b5c4e222a920 100644 GIT binary patch delta 111 zcmV-#0FeJ!jRBA(X*fwlK~y+TWB7De{{M@kQvVr91pohc{|D)10BI)20CFuJ1*2ft z0#L5{_eYidOaaPK;A}}I007T+Bf;iG1quKF01#wlLPs$+GD0vmHAXl@Mlv}tG&uIV R7WM!D002ovPDHLkV1o1IDU1LB delta 58 zcmeBWjF_NeBJb(q7*a7O`N#k5Kkb=kKKP%nx#??PQ=kFY3OHhCFdH8LsR5}4vB7#l1W3TmDuJM87yzjS>46(SjLq0w0yltxOrRufOql`TKva{p zBHI8^EHS9am{Dc`*cp^~fs!x)yI?>KfO~=BghX*tCO0!liAJjaXHbwZ`VV3tV~`lK zI5ssP3sZby_F8yj02w|V(C!@9qJ8S}IhXWzVODQQFVdQ&MBb@0K{oczW@LL diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/1.png index 4fe01907cb5d2227b65e9f9819f67962dad4afd5..36ddc5cb98954d8c43a812300b7aa63586808ab3 100644 GIT binary patch delta 169 zcmV;a09OCl0mT83B!6&8L_t(I%VSWJvHmY7p^bt;V$z}-U<_hoQv*}S0Aerzfw8*p ze>HhCFqI!^{?zKmTvuT&xsR@bH}3vGx1y4NN&WJOoNQ8yb$(mzDXo@yo{< m7#RS8QaVr2!SnO)OEP41n*ZC9{m6j<2s~Z=T-G@yGywoWaY_gP diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/10.png index 15dfdde5af34b3de258046a8bb6e297192f3e3df..8f16c2e093a2f947d5ffdb945335f7a1e001a85a 100644 GIT binary patch delta 99 zcmbQu*uXeJB}UuR#WBR>;mj78s*PcilaJe1SSP+!f zl$y@)pok|wG?n!O0|SFVN~)8)vzdjHtEIV-qmhAug{iZ1g|gNepd5pztDnm{r-UW| Dbn_yc delta 126 zcmV-^0D=F20h%c07lO7e-y7DXN-9k!RO z3{Lz!`Dv9|uNW8@1X5C++)XWHhCFdH8LsR5}4vB7#l1W3TmDuJM87yzjS>46(SjLq0w0yltxOrRufOql`TKva{p zBHI8^EHS9am{Dc`*cp^~fs!x)yI?>Kpx6r(CnV|^Kxs4r05E~eP`!v>$=Uz_01#wl lLPs${MngnKMnXeHI5#*!HbsNS&c*-$002ovPDHLkV1l`iL>>SD delta 193 zcmcc2c$aa4O8pW~7srr_ImufLIe!0tdRm;V=)mj#?-CL`A$$HA8#rW0NXt8fsVgXa zoG*Cn;lqcC7Db7o%7$j%-C2MB|N6}g2EslQBF^#vfq(pchZU;FZtiGkXgE@@cIecH z=0Ik)UdAU&SQ!~R|7++?5WA{yOTf>sZby_F8yj02w^jKz!$X(M3>)Uoo&4}{yLb=C q7@zg__nNKSMHGP6{(pY{JrBdZBr}~=e5K|LK;Y@>=d#Wzp$PzZf=#Ia diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/13.png index b3a29669e0d0087f44366e358597b80caaaefa91..b1cd52ce125448092119bb9b41a94b0d9a3c7e25 100644 GIT binary patch delta 149 zcmV;G0BZld0kHv)B!65HhCFqkg-9m xdI96M;|vT80x79Z?#51*&ZZVlmIiKSmS!d{F8vF$o&n_;JYD@<);T3K0RXu69iIRI delta 99 zcmV-p0G$7OfdP;tT}VkpK~#90W3({{`~T(37Y1^`>yP&s7z|Xr{xdK@Xc!wGKvpLp zAn~6O#^K@NVK{PO6(cb=ON(m!|N8p_S*{)hqhJ)^003^T7};CxJCy(c002ovPDHLk FV1ghyC~E)! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/15.png index 500208c6f80dbf1ecc1a2cdf6d858821950602f8..590ecaa679b3d9ed5c8bcc0612503fdd41e16547 100644 GIT binary patch delta 143 zcmV;A0C4}Z0jmL!B!5;(L_t(I%VSWJvHmY7p^bt;V$z}-U<_hoQv*}SKq^p^H~Vj_ z?hDokGK7H~;AWKoHiT>gU@oD^01!};Hm1w~vH}qqfMRK24H)$T1xb1E7yt?b05%RY xl^eiaumAu65M*USM>aD!H#9>+LpC%D%PDHLkV1n4+FlGP% delta 150 zcmZ3@xQTIsN`0lLi(^Q|oa8Nr9KZiRJuS{wbl`RWcL@oekUjs54IDBgq~#sL)D;vy z&KErP@ZrNmi=sqPWkWOX?yNumfBj|#gFvYbjEsz&P3u%o38;DTN}48kNHchQq(~k( zd6M716-b{uck;u-!`yD0coPyDDjq&R|DK0I>5Ix%CH@O_ml%M+)78&qol`;+0Ni0a A;s5{u diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/16.png index 55d71201cf52b6cdbd7b88297c2da9f6a190c519..550e1dded69859f0a875a9ed611fb78443444d52 100644 GIT binary patch delta 153 zcmV;K0A~N<0kr{;B!6H@L_t(I%VSWJvHs6M1_0@klhFRp04B%)ZdM8Z!IqP202~Yh z1Jq=#C^JAs#*9K2keLpKQ!IcCP?M)1AVCHgtNZ>3rEQA505XIumncXW{g)C|MZq93 zWN~b2VB!D;RXG0cm=16N000nVWkN?VGciLkMK>}yMK(h+I1)KBdh&5A00000NkvXX Hu0mjfHmf&m delta 198 zcmdnW_=s_WO8rVt7srr_ImufLIe!0tdRm+f2->*Iw;37VII6gxrCXC;!i%J6G8LAydS$hNby64j>b(tfB!bhTsQvn=jU8Th94nT+mh?l%^85e)78&qol`;+0Jh~*)Bpeg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/17.png index d367925522f7c574066986af56d7d6a821166d27..f4e05d54757b625b89c7b0c5b15d5e18606260ae 100644 GIT binary patch delta 155 zcmV;M0A&Bu0k;8=B!6N_L_t(Ijbo6L(EhI`WBs3j3;@;#BHXMJ$T9$AIXU_UkpW85 z#*`UAZs5a#w5Y}a8!*znpeAqjpX`JL$~(sDzT_DIvKgcq#Fi3O{m-BvVe}uwK*k_3 zWN~b2Ko}GT0Nuto_Rlci4FCWD5M*USM>jJ!H!(CfH8(ghITSQSL^Q4eS-=1Q002ov JPDHLkV1ks`J){5t delta 183 zcmV;o07(D00n-7HB!8MoL_t(|ob8jb3c@fHMNfiI0s*rK0apjdet=)#2l%P|j*bqc zn;>LK;T0(z;uP%|?Id{idmaz&Rj2xrL^LJ&cliI_FbW8DhLE l0JYy8(>TX3o`7k3@B}1>IUgKCP#ORL002ovPDHLkV1f?2Pp<#~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/18.png index 54608ca23498fa95a7b8883941465cb8e4c31734..31ae7a59f7684316c01ca28217d638c87547d126 100644 GIT binary patch delta 115 zcmV-(0F3{~0gwTZBy2lLL_t(IPh*gi(EhI`WBs3jL;%tQ(hFv|StXEc07wrx7LS5a zFbZ%11qq}7QlhFT7$k-)j!g|r901(TA`RWZm)-yX01#wlLPsz`FhoK&K}0e+F*GzW VLPX0(Z`l9<002ovPDHLkV1j;SCoup3 delta 171 zcmV;c095~w0mlK5B!7-cL_t(|ob8h_3WGopMc>#g3qrOD2x(KK^Z+@52gp%9hh++} z3k0@VVI+vfqzHoLCXmk8|36dwC)fIBstQ2Yw?YQ>xiNq^4iu`I9o*9OtxQXzSR2c- z%nrwKAcV@kJ-V~=KV&P$Bi^%|@cv-Vd4P`#s~9=^4xuvVJR~VS1wc;6i%m=V>HT?r Z@do&mHGMvT!2n_k92FL&&AQNPOjOsaDrZDaT z0W~uG5KIcWQle7ERUogwcg>wSch{t<01RVqsGvJt5h@)%nX c@o8CJtTvlBqb$TCj{pDw07*qoM6N<$g426URR910 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/2.png index 0eec0d5a2e0afebed1d010665bd1108c7b41f5c5..32950e92af13dd865486b371119469a2d7a22687 100644 GIT binary patch delta 111 zcmX@g*uywMCBxj)#WBRfKRICX#((g4WZXy|6?WbS5aX=LGO?CARD@%_U< OIR;NxKbLh*2~7ZY?Eo)%{-I`F#xyMzQ!$ew@31`Zh#(((>r>Iw=U z=L;Tt`0!z(MNy)tvZ0xGch;Z(zkV}Eu9IV3++fBqZ%Taqp5q_BeC1s<$w*!Oe|=e* z9~%g$0dX65`8LD4zkeGY9UPhx(u4#i{5XH^+{q6Q4|6NI0p;1;yo`>WpMPJHA>*Xc UQLBW|84N(+>FVdQ&MBb@02FRUDgXcg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/20.png index 379a83775df827639f8477d7fadc5c9b581dec11..1d814cd8b77d192433c89174bd050cd5e164c9cb 100644 GIT binary patch delta 107 zcmV-x0F?i-0f+&RBxEy5L_t(I%VS_56R62p|Cf`{{!gxc1~;pO{~$vcM!_f;1&CY) z${1v4CQz0nCs)C;GXN}(5~lrUBKiOT01#wlLPs$(H#s#oMm0h+HA6Q=H#A)Od*J{8 N002ovPDHLkV1jtBC4m3{ delta 150 zcmV;H0BQe-0kQ#*B!78HL_t(|oMU7l0~n}y{byicV0iuU9s?6O1~4!%FkHB^jq&U6 z4-AatXqFb$`2Y3y2XgHm1*3olfDt)kJbitGsHDxw$^W07os)rqfdP`4U>Sp0z|PLe z@ZrM?Mg|532By~^?=c7nNc<690ex{LTOXnUf|)`wvp$EdT%j07*qoM6N<$ Eg0Rp*@c;k- diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/21.png index 95698994e881f1777da37eec9733cdd5d34a8fc7..f0f0a83f9d03a748c8099315a0a25508302ff0e5 100644 GIT binary patch delta 102 zcmV-s0Ga=_0fPaMBwsE`L_t(I%VUs}(EhI`WBs3jL;%tQ(hFv|StXEc07wrx7LS5a zFbb%hnPAx&03{m|ra+S9{{R305M*USM=(S~Ge$%+G%_4>508fwsGOFkB0LHaJ zjRY?Qsx#y8R1pDSUM53C~t>x+B7-Hd{JYn*Mf9utf|ITl8VYtM6i92mar0Rqm1`mEqvHqq&1Fj5K z24hX0e6bfl%^4UN1X5C++zm`zU5(9++>FdzoDEHk&Eg$5>I3B%JYD@<);T3K0RU)F B9y|a5 delta 111 zcmb>LWt^ar8RF^U7*a7Od5a;(@BdFvi?abi8+Z9OLn8r3o{&BNj13G7_WY~pZ+v-r zy1q-c3!C`6oa8^hels%*pK+0slUroEA1LeS;PA+P<+Q%0Km)E13=ID&r6(%XuUW?c N1fH&bF6*2UngGSWEI$AM diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/23.png index 8877cb7ddff9fb4369e33548415efa5254dfbe8a..c7704d6494233ba7471ed5205d5da2f3191b7ca3 100644 GIT binary patch delta 93 zcmbQoSUo`{T+P$PF~s6@@`TA3{;gL_{yV=hhT+niw5bmJ7#Amq^e}0qs(EcTW|*>_ xCttnJT91K&K_Dg7$=$`-(%8}1)!fzG#oXM|&3HCTye3eN!PC{xWt~$(698-s9?Ad! delta 128 zcmV-`0Du2`o&k^~dSyvOK~#90?USJmfG`vVuhkWm4A22O026coMr95pg4CgEX!22r zB1rK43c>k%dFIR*rzRo*EZc18#EOVYd^3?8 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/24.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/24.png index 4b73d1579b38f6dd866949a1ea6989f8f35c1174..97719348f5ee47e7822310c09bafe271719e6bf2 100644 GIT binary patch delta 122 zcmV-=0EPeD0ha-gBy&PZL_t(Ijbl)gvHs6MCIIV|lh7vH0I=SnZGe)rF=YmT15r)Z zifjXI7uMnN<; cH8D9sLP10}Fu=!1fB*mh07*qoM6N<$f?Q%RS^xk5 delta 192 zcmV;x06+hi0o(zQB!8nxL_t(|ob8h_3c@fHhQDMffq+?rfUARJ58w$rfQR$|J%I_ls@0PccRSTwMt=DA&6L;M)cnW6U0$;_6CV zZvi>%MlMC62;m|CEo)%{Vf;R5*ZH7h@IA-jt`RO#xZ3iO{5U^>* z{jaR3IAPw<*x2~+L~H1iorfHbzP68)x)^Jabzp*d!=xK1|aZs^>bP0l)%^o05jq^TmS$7 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/26.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/26.png index 55b8c22f96342710343c2b20d87e4ada218240c6..93141a8a28f1a4341d2fe4cc8077184d33c177be 100644 GIT binary patch delta 71 zcmeZHo1o$(=;`7ZA|aV9!MZp>q=!j^fq_MUfswoELN5aYgFs5Ele@XOtEHo>n~|%T ZiIcI3p@H8ev0p$r22WQ%mvv4FO#oAT5q|&x delta 44 ycmYfEo}i*G5rRWH_I`5=7-0|SFVN~)8)p{bFHo12NVv5~ojiIbV-)u(-?Ksg3aS3j3^ HP6pegFUf07*qoLIt2g# diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/28.png index eb280c73e0ef331aa11e89f3d97a081a26d75e2c..54d3d594418a4a4fb2bfef1d2ea89472a339a378 100644 GIT binary patch delta 119 zcmV--0Eqv(0h9rdByc}TL_t(Ijbl)gvHs6M1_0@klhFRp04B%)ZdM8Z!IqP202~Yh z1Jq=#C^JAs#*9K2keLqPVBiCB)Bwt(5dcS09KFsP7l{A>01#wlLPtVIF+(soMKCc& ZFhw#oG(;8{gVF#1002ovPDHLkV1mKqDUkpG delta 158 zcmbQjxQlUuN`0fJi(^Q|oa8Nr9KZiRJuS`#1Z~{q+YF5a7FN3|*)DA2?{bp={QAwzEPTdAPEKx->3*QBql3dEduAZu_W5w4HPmJIqnEFxIkp=7 zpTIpsT){X&r9R)&#WAE}PVyE*j^F>Eo)%{-I`F#xyMzQ!$ew@31`Zh#(((>r>Iw=U z=L;Tt`0!z(MNy)tvZ0xGch;Z(zkV}Eu9IV3++fzQVo5ijh2_uxn>QC58GyjVWCm+% s^~3G_`VuG28X6fV3D^JobB=-GN4uivmYqv$7=Xaj)sNL>ol`;+08gU@oD^01!};Hm1w~vH}qqfMRK24H)TOpeP|xl$4P(la#3H ze+C5!qyHcVG6snui(^v*!k{n!0M|oL+%7o_%K!iX5M*USM<6gmLq#@5HAOQO8rbv7srr_ImufLIe!0tdRm;V=)mj#?-CL`A$$HA8#rW0NXt8fsVgXa zoG*Cn;lqcC7Db7o%7$j%-C2MB|N6}g27yu=7#SHko7SnG5>WHvl{8K8kY@1q(Alu$ z&#%X}ZOhl^3rsb#wEX#S<%G`0#>R(-=H~Xq*Vij(RdVTbc>GCEf1dK=!$VeOkYUP2 h#}q{W{P{VTkzvYOv-Ed*Ee{!hz|+;wWt~$(69C+`N^<}J diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/30.png index 0941d68901f481665263cc555e40f6da5bd3d5e6..8583910d2758e6a37f802a45707df2dd78f77dcc 100644 GIT binary patch delta 109 zcmV-z0FwX50g3^TBxW^9L_t(IPh(J%vHs6M36PV}9yNec1Jq=#C^JAs#*8upM$^Gi zHo(m);XgPA$&E&kK9J=APQ@I(z=)`|0000GWMx7}I6*^3G%zqjK{7H%K{G`&>oiMi P00000NkvXXu0mjf86qcs delta 171 zcmV;c095~q0mlK5B!7-cL_t(|oMW^x2>bu#%NGU)1_p);ceXJykO-K*eEC9_Mz{eC z3=9kgDqjD2czDP+fPsO5;mCzmbu#%NGW6!0V6q7#Ivxy#6yVKxh~nA3#Gj8Z3<3fY1al!S008qoDH1Xh_J05X002ovP6b4+LSTZ8PdL;7 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/32.png index 7d3e9221fa2c039932412317edd737f22538f420..1daa027044551603890fe64748f371f2dd0b488e 100644 GIT binary patch delta 88 zcmXRcpP&+~F9LE6+0@xI4?+23SqFgfj+@t>XH>t{BL%IxmF s3=9kcDXC8GCI+s?#;%6OuC8XzPOi?*pWGhJ0m?CWy85}Sb4q9e0I*^o8~^|S delta 82 zcmXRfoS@=s;pyTSQZeW48ATxm1rCOThYw9K`St(0WF{Zy{{s>?>)6+B)n6hs^K6JI mgInr?tR3>2{0!G_NfuW2zT~hie${Eq00f?{elF{r5}E*ammrY< diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/33.png index c1d213c656be8e7d3af834ddbce6906d366d6eae..d239de4247279dee01b652de8039e94c3e70bcb7 100644 GIT binary patch delta 90 zcmb=aoS+h_;_2cTV$qwNAi=sgL4-$Wfm-t4`)9Qt+TUb5;hFKDUD9b?9YcUDn}yY} upRXAh7z9#Mo!pI#O-)QpjEvnJ&5Vtmj0|+0KVAgNF?hQAxvX@_4Nv;S$)>q-%Az{nDE1YS{@r48$-te0jm#@^*2`Ew zWU!jUlmEl{hz|n;gFs5Ele>wNv8%I_qoJvznVF-di3w*DixyCh!PC{xWt~$(69C^j BAEp2R delta 124 zcmb=Q#W+EwEYZ`&F{ENn@)kpm-~XSU7H0#3HtzCmhDH-OX6&o^=`_u42O|#r6=F^+GY-@+0D-5gpUXO@geCx=6*Q^< diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/35.png index 37e1a97056d3c1d6dfb4b41029b1e046eff7807b..5ba48646e1c17bf57a4e4415ff77d065a9861e12 100644 GIT binary patch delta 104 zcmV-u0GI!i0fhmOBw;W~L_t(I%VS_56R62p|Cf`{{!gxc1~;pO{~$vcM!_f;1&CY) z${1uD0Lqe-bP0l+XkKi}NmO diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/36.png index b7d15f78966b4799e3452c9b3a78a905702fbaa2..05afcde61ba5fb8bd4e6c647fa3d10d788a0b1e9 100644 GIT binary patch delta 178 zcmV;j08Rhm0nP!CB!78HL_t(IPh(J%vHs6MCIIV|lh7vH0I=SnZGe)rF=YmT15r)Z zifjX8=& gGch+oH8w;zMlm%wG&xJ^%m! delta 198 zcmX@d_=s_WO8rVt7srr_ImufLIe!0tdRm+f2->*Iw;37v?$0f7lW&bvfN)){0SSYX&NXG_CGp{1^-9cC?)C)>-fo7UOLIMFa+nb4-0bLUQe yc(`4>hX)9HE-jM!zyIGqho;AZ51yZY&%+R-VU@5!%5gpe5O})!xvX(8l41sw8WC&Rbu#%NGU)1_p);ceXJykO-K*eEC9_Mz{eC z3=9kgDqjD2czDP+fPsO5;mCzm$h6z&AG00000NkvXXu0mjfAc;*R diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/38.png index b531b2f598c3703abae4e24a5663371558a4afd1..305b817f077e3c557eb4626b5393d5f798eb4a75 100644 GIT binary patch delta 89 zcmbQmSUy1|Sjp4HF~q_@IYEMTae@es_yUE*FY#U>qO8qFCLG)L_t(IjbmV-0I11W|EEMhgPer+P&YtH+L$r}C=NtvQH=pM zV5ECNP2TK3*$K(bD&fDex-WSKfNTb72C=0?RsS<6NErPGF_1Ax3|SnT8W0AB0RWjS yGQV(d^<)4501#wlLPs?;Ml&%uLqjq$H8wIdH8w6=wyOXD00{s|MNUMnLSTZ?X)>w+ delta 160 zcmV;R0AK&C0lWc_B!7cRL_t(|ob8jL3d1lIMb9gR61A8?V0NOi-?0zgcT7%Vv8~}6x0Bc>=cE2F% z4NCrip9U0>+U+qWf3Gsrn8Rve1D|8m=xMFXU1td4DFCuP#u?tE^kxCGV=H7sF;GbW O0000B!6Q`L_t(I%VSWJvHmY7p^bt;V$z}-U<_hoQv*}S0Aerzfw8*p ze>HhCFqI!^{?zKmTvuT&xsR@bH|OTf{9jHq#B8i;Zf2d}x~32m~*`9rBe7Kz^hfK)dYLMYwX*!Tk^)r|oR z&l~sQx~d89_vV}jJ}q>8E90Drv9cvO#>$-YEwh33@c7X{9o>3-#n+~TY$NP=dBq=%o=AuO%Srg zK|~zVDQY))Tfw{EGhEJ92+~w-0ti!&mH+@=pH9tNL`lleN1f&^0>}UW&iN$m{y@YV z*v&XWCEd)^#WBR>;mj4RQ5^e`IBv?b3xP;vP zFLenGH1Obwl$k9x!-8RkiS)JYDY`Zc3=9G(sZQ=Dh9>65MnQR|K;l0k z%>n`v|Jm6&89sb?!N|bCz`#gJ#`yX3I|BfRe<#Al;6~5@015yANkvXXu0mjfXVyVz diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/43.png index c26fd7b55a3da93ecab7a39fc272629b4f73c880..2fbc09e13a9b6c0a9a2e6f6ffd5e25ef6d37e61c 100644 GIT binary patch delta 116 zcmV-)0E_><0g(ZaByBuNL_t(I%VUs}(EhI`WBs3j3;@;#BHXMJ$T9$AIRhnN;0;ic zHm1w~aswX@q(wCb*nm+l42z@;3IhNFN3|*)DA2?{bp={QAwzEPTdAPEKx->3*QBql3dEduAXwX?B?53`18#L&K4JH7{OC z(*zG`25*lP$pa@(^82>}>2v2!et3A8+ieqXLPA4@)WhfJ-}5kR+OM9wLC>X_0SG)@ L{an^LB{Ts5e?36p diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/44.png index 5960b796a4ebf98eb5d91b6191a3e0077a0efdfc..fe79ca008e7b1bec69f453d12d6f96a5761f157f 100644 GIT binary patch delta 92 zcmXS|o}d!0=IP=XA|aWqAim;c#Q*7&FZ?_2pjWWj>&JSv(!F~&Touixb!A%s>43U#R(!kO^!?q9;?_a`u9E6 sV_;wqNJ({aw=lPKwKR0LbaQsIG&FK`>OR&n6)4Bx>FVdQ&MBb@0OHmj`2YX_ delta 84 zcmXRfo}l7y<>}%WQZXlaiy_DF|4&bgvjIUHclkC$qX`@{_SO7!n&!5Hkp~FawBr6( lR#coYO%~~C3UuIQU`RjD$F|Cr&5{8KJYD@<);T3K0RST{9Etz{ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/46.png index 3a1129de301e1767bfbbaee1a8fb6b68724c8d1d..37dc736a8b365d399031461a026db829f372dcee 100644 GIT binary patch delta 103 zcmdnT*upqLB|+cQ#WBRfKY7CB3;))uCI6k@=)!P``4V^9j!4xBISd~BmSX))fd)B@ zM`w0kdc(s|s3CE;{$s2!0|SFVN~)8)k)^q@i=~;ftD&Qtg|VC2Qu7}NfpQFp# delta 162 zcmV;T0A2rt0loo{B!7iTL_t(|obA)G3BxcDM&TzlLLi7r50C*oKqkll8P#*ROkvy^ z0%~Nq5KM|o5ezOb0eAlT|E_xO(%w`=0O*I#VbGqh3Q*<|FCymQRzGy^`L6i&VoJ$8 zF7rsvjsE)daM+LAhB1}9sfid*8bSp4wy=g_6+)!ehXe5ch8vM{qs#K*0}8h^0Uhi% Qga7~l07*qoM6N<$f(rvm5&!@I diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/5.png index 13733e04cf7bfebb05c200b6e623f0534ac1a599..4960302f5efb63148f256cc3bca24a5f71b2c20f 100644 GIT binary patch delta 153 zcmV;K0A~Nv0kr{;B!6H@L_t(I%VSWJvHmY7p^bt;V$z}-U<_hoQv*}SKq^p^H~Vj_ z?hDokGK7H~;AWKoHiT>gU@oD^01!};Hm1w~vH}qqfMRK24H)$T1xXpj0FX04X`5^V z$j+9~FaQ988#&B4q2mSs000nVWkN?oLpC!xGDJi$GDSHvHxe{7F*rt300000NkvXX Hu0mjfVka~^ delta 182 zcmdnWc!_a>O8rbv7srr_ImufLIe!0tdRm;V=)mj#?-CL`A$$HA8#rW0NXt8fsVgXa zoG*Cn;lqcC7Db7o%7$j%-C2MB|N6}g27yu=7#SHko7SnG5>WHvl{8K8kY@1q(Alu$ z&#%X}ZOhl^3rsb#wEX#S<%G`0#>R(-=H~Wn*y78Rkp5gh<;RDItjZu`E(7g7;dPyf hN$7w5zdz>~7?vG0c^$MUCYJ#SJYD@<);T3K0RTKwO!EK$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/6.png index ad2c8a0ba6d3a4e39f6241ab4587109b26914ae2..2d52ef1c5eba68747bf549774dec95e03c252139 100644 GIT binary patch delta 121 zcmV-<0EYkB0hR%fByvGXL_t(I%VSWJvHs6M1_0@klhFRp04B%)ZdM8Z!IqP202~Yh z1Jq=#C^JAs#*9K2keLpKQ!ET!1K^p7((DWXIYc7#ckuJj0000GWMx7}MmRV_G&3_q bG%ztlGeJZ}b9dGl00000NkvXXu0mjfe*G+K delta 189 zcmbQnc$0C0O8o*)7srr_ImufLIe!0tdRm+f2->*Iw;37VII6gxrCXC;!i%J6G83AydRL1+fjAi;Zf2d}x~3 p2n3v#$rG4ZSXBP~|MPP$BLi2trIloMh&clgc)I$ztaD0e0sz6*Pg?*0 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/7.png index ab6211e3f99207abe8880c84d2fe68f4c70ec3e5..f2f52250590fdb90ea3cfb3fa75c0a1e6b71b42e 100644 GIT binary patch delta 112 zcmX@k*vmLUCDX#w#WBRfKRICX#((geQU(SFfs|AycVlxSO9Mx9V{<2SLt_gQgLQEY QjzBpEPgg&ebxsLQ0Dm$gu>b%7 delta 171 zcmeBWJkB^lrM}P8#WAE}PVyE*j^F>Eo)%{-I`F#xyMzQ!$ew@31`Zh#(((>r>Iw=U z=L;Tt`0!z(MNy)tvZ0xGch;Z(zkV}Eu9IV3++fBqZ%Taqp5q_BeC1s<$w*!Oe|=e* z9~%g$0dX65`8LBzleXQwX(?$}Q*rRb0U-GD>#;2xqY5Ku(@p_d4i1k$|9^hAW@f0m WYv?Jyb*eZ65O})!xvXf$rm6t+LnrK{Qq@Dje*r*hS_>f@?YOu&0g{^50P;LC z<>w|RyuX=q9#~!Ihfdz#vU$}xPbn_}sPa4#V{JR16Ju@5@)qF-bN(iFYOu&300000 LNkvXXu0mjfyd*`r diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/9.png index b0ae72f06452bdb26ccbeca105643ad82f17881c..025147bc6e064693204fcb89515967f828e0b888 100644 GIT binary patch delta 106 zcmV-w0G0ot0fzyQBx5p3L_t(IPh*gi(EhI`WBs3jL;%tQ(hFv|StXEc07wrx7LS5a zFl+(2nF$Wa&CW0Y0Dm?Trnp4wN&o-=5M*USM?^(MH8VvxFhMg$FfcEo)%{Vf;R5*ZH7hyj65NG{uvt>80`61(ck#; z^mKifY!^21cR9&_e*I=<7Cz%5CnvYabU#qm(ZS)7{mN;5O@R*92Rh~$&fB-ov1ndG jQi4MYPZ5LgQb}fpW(n<6$9W6#7=Xaj)z4*}Q$iB}(b_YU diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/0.png new file mode 100644 index 0000000000000000000000000000000000000000..cd173832002283b56ce24918ebba891df8ef54e5 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^E_P~Lo9md2JIGXFyKi2UmA1Z z8f%VDj&4q_&Z6%{O&$taJCr$Di$3Ef8k>GhyB@CaW7D pXQ!k(xjQ>rx|o?exmXyOIXf8}7@Q8BX$h2L@O1TaS?83{1ONq!T(1BC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/1.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a85d4f5a8370ee16abb52a8d155ef24d99cd71 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Gd*1#Lo80u4K@^NP~ds||Nckj zb#(`h9=v++>QTnM1zk&*G<;dt&YPRTyzAqK>EGwS-qFHb{A0#8+a|vmJonFKY6|Wk7pJ5; lxtp6>8aWwS8XB6pnz|afy4}6LR}(15;OXk;vd$@?2>^A3Uw{Ar literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/10.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6459130e8363af9fec3067cfd38b0705881a57 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`0C2A>u^pumy*zcl86 z<{pdo>leJA1};pnpEJST>4dYA(kf=3^cON8UM~xaN@rNZD0%Q!wvy8BV3)wd%1xK7 z(z}+d=R5I_!6L~o^?i%vq+OB%oZrkd^RMPeFFiZ0QSLyn(7K;LUl}>PI?Huo`iqIN zJm1fiHHB@cJ1<|uz_s8-A?s8FRglY4Qk~q*jSWnVT})jpO$;2JoE;6%ZsCgr$}xDl L`njxgN@xNA>SRwL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/11.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6459130e8363af9fec3067cfd38b0705881a57 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`0C2A>u^pumy*zcl86 z<{pdo>leJA1};pnpEJST>4dYA(kf=3^cON8UM~xaN@rNZD0%Q!wvy8BV3)wd%1xK7 z(z}+d=R5I_!6L~o^?i%vq+OB%oZrkd^RMPeFFiZ0QSLyn(7K;LUl}>PI?Huo`iqIN zJm1fiHHB@cJ1<|uz_s8-A?s8FRglY4Qk~q*jSWnVT})jpO$;2JoE;6%ZsCgr$}xDl L`njxgN@xNA>SRwL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/12.png new file mode 100644 index 0000000000000000000000000000000000000000..cfea3803538ba0f4c8bc236826ddee8fd6ee8cb7 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>+}rLo9md25sbRFyJ};|NRFB zZT<}g8;mw=G7w2|@t$S1)@zB^jw9=YBabP^DApW*bjv>B;PEYQUj~I_{xMk{b$it$*>1x-7?MK9ZmKq~YlTZ-ub4 zyx!`n2I_h7+J{WT*Ewjnwl=7~P%+w=!>+S!V#-OWX7)zum&w_S{#||h9pv7WR3~>s iM^k5GLq`Kk10xG#Crgv+SXFhP9D}E;pUXO@geCxX>|3Y+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/13.png new file mode 100644 index 0000000000000000000000000000000000000000..9c5ae14b4989b37886d33dd266c92cdf80db07ff GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar`&K79YOe|6l)KKw@sc zzl_Q;hNL+)AKCOyG_XwgnQ-*RlMAMamwS5o%>|}2TI8x6YdCv7FS+AkNV|;1_j*TW zHueKr?WehSFxY%KY03~OAEDpY`D8{*lG0AL0}OW86TBBjm?ji+`ZaT^COWM;w&rmBld!lBB9mCyz8)o;{3%fw>Oi6WecQ$r5cQZ0FH??qc YGBtIyNLkok4U}W>boFyt=akR{0OLSW#Q*>R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/14.png new file mode 100644 index 0000000000000000000000000000000000000000..09b53c4d9ec003a6fa121dbfabf36c68918d1351 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr`%BgB>s3HG22WQ% Jmvv4FO#plKRZRc@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/15.png new file mode 100644 index 0000000000000000000000000000000000000000..2990627939e9e1e19385de510064e2edcff0142b GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Lo9lee|&#`|37p5|G(@P zU*weZ=&?UCZaDBPd;7yC9uJ0@{NX&T-|G`sxikLYX_oA`&QK!lX~ghE)k%-3akBos zKj{Y~4N`V=X*A?;-eB0|)0o9}lqGEW#3T-`_K@odq5bDgZv?4_@!s$`wz_XdNc(l} z7Lx~D(mO16u|1j6an@jp!GUQxiL)-4Dt}J2lwjcOx4*eNLr@*$)|6BycSkdGb5l1% dQx``wLvtrLlUEzd}Q2E4R5D>Q1%hTdKlxOR+`avSdnyZ~fz*r`t7Y|ruX6<-rcN!g(M?4eyFr((b~eiWbxU<7g;{C)$-e!^47#;f!v&u m>g4X~Vq#|D=;~}}VrXn&Xyo)S=ye59j=|H_&t;ucLK6UrYF@km literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/17.png new file mode 100644 index 0000000000000000000000000000000000000000..2106989a1bb8751fd06b65fa090a5051b7ac7791 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>+}rLo80uoovY0pupq0^MC1{ zhSlN)g$1PrrG*)1)f1%tTyUGjru(=5l9Q0&T>Xn7ZGVqReXg&$yi2ob?E&TuKduOG zu4iax*p@8Opj;`rw{U7muc-E{(2N_tMi0c7zCEOo%P;gkd%@K_vu!ti$7UU5={fU= zf%E>Zhk`ba>&^1n)*iTbf~-> iZ0c%Z=44@M;p}4RYUCn#R(%doj=|H_&t;ucLK6VGBV3&T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/18.png new file mode 100644 index 0000000000000000000000000000000000000000..ee97c8d20310636ff201824085973e243b83b3ee GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr`%BgBDxm zN>QdYQ#2ph8T9^LyKv^JARp%-b7rMu|J2s5a&ukcHtQ_2ZNqYvn9rZrpJrHTE~Zew z$bA`)`{%-mUJXw&U!Q2)&6q1Hv?)%{XfDWkDXC8GhK^2#E~X|HW`-tiu4V?tH<-5H Q1;M1& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/19.png new file mode 100644 index 0000000000000000000000000000000000000000..9dbaceef5db476cba45ecd780355997359e01e5e GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr`0S2H)moP~<57Um9~j z^G_jP{pr6lZ52-^8XF2aaR+5Eq~v&1_t!Gt`Tz0jPL_rU2e$){X0xY#yTQqLIzsJ5 zv1i!D&S15@Ya*|%@;a`@sPI1`Pjt~H<4L>Lv97$Fm9yF3i7nwwVod6*L;5KU>&@43 zl?m-twX#h}UcEp%C-?3Hc5gEYoj>#6ft{F=>f~gH%^V&r0G;AClF{GPpad!CGud5)82qowEmpOvq)oNmtc*f9CT zk(k4QH6?|NlVX$Q3P0=l_gdwcFX?#*a$HKPle@Wrv$>m_rG=TJtBbj*lZ&C~mPVi) NgQu&X%Q~loCIE^mQPltd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/20.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6459130e8363af9fec3067cfd38b0705881a57 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`0C2A>u^pumy*zcl86 z<{pdo>leJA1};pnpEJST>4dYA(kf=3^cON8UM~xaN@rNZD0%Q!wvy8BV3)wd%1xK7 z(z}+d=R5I_!6L~o^?i%vq+OB%oZrkd^RMPeFFiZ0QSLyn(7K;LUl}>PI?Huo`iqIN zJm1fiHHB@cJ1<|uz_s8-A?s8FRglY4Qk~q*jSWnVT})jpO$;2JoE;6%ZsCgr$}xDl L`njxgN@xNA>SRwL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/21.png new file mode 100644 index 0000000000000000000000000000000000000000..0beeeedd163c0cc8e7e8c56e123aab5d0e0cbe59 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar`0C1|JkWpukc5zcl86 z<{yjp`xpG5Y6N8DRw}wXok(PK$Za|$X~h0#*UGDQ91NZgZVRe?T~f-sysmucTJX(r zrqa7?;XV7!OoF$Hrg^+db2xJ2{*t$=Ds!fo%x14*@b}#D?D^``3@gp06!b4D@0NHs z_bpTAhMM*AH4Lf-Z?XbsB*cQ;m6Gb@?qqIh>FDHS?rQ2{Z0KlebXIZ`$juC%u6{1- HoD!M<2+vJ4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/22.png new file mode 100644 index 0000000000000000000000000000000000000000..52444ce67d51aaa962304b04b5bae9ad31216933 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr`%BgKqOSIB@L#d%cix z`G@0{e^{NB#Q7$uW$b_F=$$Fya^$zGjogjRe^TE+%(eELmgMcgw9jmTP<8Q?+pjrJ zc$~PnMp$+3efF-Htpc+Sm~byV`S)zp^|MWnO&T!0}Ty*AqbUTNEwEu?LGdgt} z)3aBr_-`wJdRN-{Md7Kh=M+HBN=bEcH*zyKbTKe?aFVdQ I&MBb@0G>!tF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/23.png new file mode 100644 index 0000000000000000000000000000000000000000..52444ce67d51aaa962304b04b5bae9ad31216933 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr`%BgKqOSIB@L#d%cix z`G@0{e^{NB#Q7$uW$b_F=$$Fya^$zGjogjRe^TE+%(eELmgMcgw9jmTP<8Q?+pjrJ zc$~PnMp$+3efF-Htpc+Sm~byV`S)zp^|MWnO&T!0}Ty*AqbUTNEwEu?LGdgt} z)3aBr_-`wJdRN-{Md7Kh=M+HBN=bEcH*zyKbTKe?aFVdQ I&MBb@0G>!tF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/24.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/24.png new file mode 100644 index 0000000000000000000000000000000000000000..7ac77cb9d060d4a5855b420c63ffdd90a313d9d2 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr`0S20QW{P~iCd|Nckj zeTTZ=e~2oRY|CuSRZ;WGSQ)|1kSQGWZbNm$b9qaKpx*)vNsN*QSKW8yIdd*ojb+W_ z?511CCluoMra!U0? zOohN3hSx6dh1VWCvyJQ4!EbBqe=uzcbH1N;{_qNr6H`*1+zl*DoeYgl&5T@3oSlu$ VUDp2luLP81@O1TaS?83{1OTYkR`CD; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/25.png new file mode 100644 index 0000000000000000000000000000000000000000..bcd407525ae4215c838def5afa640f6fcf0ea8fd GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar`0SPP)t6pup2|vtCxb zfGd8^;p<6REnA+RTBy=;|94fZnBdCas$2J*J@=L8?QYw>TV&I(UgVNkFyB>BXmKff zT7$_WE{EWxzF)SgTmL+6HVVHivdN6)C)b8u?x%C~C(3-(PxuvZaNFB}hB-?T!VaAg zW!a!L=YRGJ7nWkjz?)`)BDYH~-)%`2G1gGj{swYkN~)8)iHobFg`uUfk-4Fvk)@>> TN8Y+OKsg3aS3j3^P69`n|xmFy3Do*iiPSvf4-LLFzYPW3*RqC z^ct(Ptrv=3`+icEVe^xUjQ{gbfgF~S>f~TV&I(UgVNkFyB>BXmKff zT7$_WE{EWxzF)SgTmL+6HVVHivdN6)C)b8u?x%C~C(3-(PxuvZaNFB}hB-?T!VaAg zW!a!L=YRGJ7nWkjz?)`)BDYH~-)%`2G1gGj{swYkN~)8)iHobFg`uUfk-4Fvk)@>> TN8Y+OKsg3aS3j3^P64bnb3i?$xs;0V|vp87(!}|J?mrqA_hU=SJa)H`EKR zY@0jfWZ}K|58Ui4M2uaz_i2LMm6Gb@ZfWXfXl`ljVrXJ!ZsB5N7|>p=29#s)boFyt I=akR{0FS9lOaK4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/3.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d3df914faa878772afabebd463963cd2ec6048 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vpiiKLo9md2JPl+P~ds;zy7#< z!B_SenHbraSeY(MrX^Q`yS@DCF`pf;nCw+Jd{!Pw+S8Ji>$1ed?e2=2)4cg+Z`jv` zEzr!~bEkRUO5^nxv{rmw_KT}V$aJGfqL5>o5WmRB(09un-m+KQr?Q^XxgZI0a!RU` kyQ`VGp{uiznUkxNrG=}hu}}4MFQ6QQr>mdKI;Vst0O=!EW&i*H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/30.png new file mode 100644 index 0000000000000000000000000000000000000000..258f4cf4463ecc207475e61e942ddecf664be459 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr`%JCm$4L5ae_saR!3BEd`&Y3vf2r@J_0_VR+zkFki!yAl8NmN0tj)LysKES?9q2AZ!og zlc4Q$cE8WO@Oizs)J`k8gWYRSgg0De{443dZM}!^NBx8&Cwuqi=$>FX)5+ZzWl`kH z7$~0C5Sm~;@!+yWYjWE&L~sB6aZtZ6Ktg9D=a1bWH>RXIxjS39xS6?_I=UJgm>L^ehQ-S~h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/31.png new file mode 100644 index 0000000000000000000000000000000000000000..09b53c4d9ec003a6fa121dbfabf36c68918d1351 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr`%BgB>s3HG22WQ% Jmvv4FO#plKRZRc@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/32.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6459130e8363af9fec3067cfd38b0705881a57 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`0C2A>u^pumy*zcl86 z<{pdo>leJA1};pnpEJST>4dYA(kf=3^cON8UM~xaN@rNZD0%Q!wvy8BV3)wd%1xK7 z(z}+d=R5I_!6L~o^?i%vq+OB%oZrkd^RMPeFFiZ0QSLyn(7K;LUl}>PI?Huo`iqIN zJm1fiHHB@cJ1<|uz_s8-A?s8FRglY4Qk~q*jSWnVT})jpO$;2JoE;6%ZsCgr$}xDl L`njxgN@xNA>SRwL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/33.png new file mode 100644 index 0000000000000000000000000000000000000000..c2437866f1b291e8076b2374ffb767776a7ad28e GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr`0CPC6}kK!L;M<$hV| z4P5%y9+sX|HFDvY!LMFgae5cCpx{-;Wt+c9ez<=&I&&`L1~#L{t=B_T%AR*DYIA2= zT6#{#GhTMWf93}smRt7*r+LguQ&4%6f9>9`n|xmFy3Do*iiPSvf4-LLFzYPW3*RqC z^ct(Ptrv=3`+icEVe^xUjQ{gbfgF~S>f~FDHS?rQ2{Z0KlebXIZ`$juC%u6{1- HoD!M<2+vJ4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/35.png new file mode 100644 index 0000000000000000000000000000000000000000..c2437866f1b291e8076b2374ffb767776a7ad28e GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr`0CPC6}kK!L;M<$hV| z4P5%y9+sX|HFDvY!LMFgae5cCpx{-;Wt+c9ez<=&I&&`L1~#L{t=B_T%AR*DYIA2= zT6#{#GhTMWf93}smRt7*r+LguQ&4%6f9>9`n|xmFy3Do*iiPSvf4-LLFzYPW3*RqC z^ct(Ptrv=3`+icEVe^xUjQ{gbfgF~S>f~QTls%0b$dOIap0P5JiqYjTI-vY%a=d%Wu(_r9#RlJI>!tssk?-{DQR z`m;0d7;>04blhd|IGLc$F{TkzEVaFaGLOI9<4`f!8DI!IJY)@hpvUXC7qS{=qcC r2juRQR3~>c3s*yP6LTjQV>dH1M<=5d0>>8vd}Q2E4R5D>Q1%hTdKlxOR+`avSdnyZ~fz*r`t7Y|ruX6<-rcN!g(M?4eyFr((b~eiWbxU<7g;{C)$-e!^47#;f!v&u m>g4X~Vq#|D=;~}}VrXn&Xyo)S=ye59j=|H_&t;ucLK6UrYF@km literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/38.png new file mode 100644 index 0000000000000000000000000000000000000000..a4efca97dd1eb94540a9e4150138150f47a4c3d8 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr`%BgB-uuz@qLo80uoovY0pupo={r`0Z zW4Qi_=-)~$gz#g5pAA761ct7P+c>+emR5;LDN zKB_A{tR2x5m!HMD)?xpVd;To(ea6dDCTwwDa@{OW<`(;+Fw6K-MfYZqb5l~C+)XUZ hon0+V%uUS=%`D7Z-P~6DZ34 ze;Jiy3`uipKC+GCwMQ6Fij}t^lRo+O>|m!D2riX zNJk>WF19CAI?fu1cyCmVo}pH9_C(DDy9tU6&ui@er0tgs0J$_J)ydu1$<4&s(cIYF a$;I5&*vQqZCRh?E$KdJe=d#Wzp$PzuNm14S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/40.png new file mode 100644 index 0000000000000000000000000000000000000000..ee97c8d20310636ff201824085973e243b83b3ee GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr`%BgBDxm zN>QdYQ#2ph8T9^LyKv^JARp%-b7rMu|J2s5a&ukcHtQ_2ZNqYvn9rZrpJrHTE~Zew z$bA`)`{%-mUJXw&U!Q2)&6q1Hv?)%{XfDWkDXC8GhK^2#E~X|HW`-tiu4V?tH<-5H Q1;M1& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/41.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/41.png new file mode 100644 index 0000000000000000000000000000000000000000..88e5ee98ce970614558c61c074125d21984ef2a3 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr`0S1|Q^QP~=GdUm9~j z^N&UQ{i6AY1=e#|3JWW4QD7Ame95i#{$qZ_Z~J{_%a{WAPjE!+aY;z~K2=~tPim9d zvNX}R7Rj4V&k9|;s-#AU;aC6DkcVMqZb8?#DwIa`=6~}$!O-(lDtzXy*WyMFS7ryW z+IL-uuLv97$Fm9yF3i7nwwVod6*L;5KU>&@43 zl?m-twX#h}UcEp%C-?3Hc5gEYoj>#6ft{F=>f~gH%^V&r0G;AClF9`n|xmFy3Do*iiPSvf4-LLFzYPW3*RqC z^ct(Ptrv=3`+icEVe^xUjQ{gbfgF~S>f~nO&T!0}Ty*AqbUTNEwEu?LGdgt} z)3aBr_-`wJdRN-{Md7Kh=M+HBN=bEcH*zyKbTKe?aFVdQ I&MBb@0G>!tF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/46.png new file mode 100644 index 0000000000000000000000000000000000000000..0beeeedd163c0cc8e7e8c56e123aab5d0e0cbe59 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar`0C1|JkWpukc5zcl86 z<{yjp`xpG5Y6N8DRw}wXok(PK$Za|$X~h0#*UGDQ91NZgZVRe?T~f-sysmucTJX(r zrqa7?;XV7!OoF$Hrg^+db2xJ2{*t$=Ds!fo%x14*@b}#D?D^``3@gp06!b4D@0NHs z_bpTAhMM*AH4Lf-Z?XbsB*cQ;m6Gb@?qqIh>FDHS?rQ2{Z0KlebXIZ`$juC%u6{1- HoD!M<2+vJ4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/5.png new file mode 100644 index 0000000000000000000000000000000000000000..2990627939e9e1e19385de510064e2edcff0142b GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Lo9lee|&#`|37p5|G(@P zU*weZ=&?UCZaDBPd;7yC9uJ0@{NX&T-|G`sxikLYX_oA`&QK!lX~ghE)k%-3akBos zKj{Y~4N`V=X*A?;-eB0|)0o9}lqGEW#3T-`_K@odq5bDgZv?4_@!s$`wz_XdNc(l} z7Lx~D(mO16u|1j6an@jp!GUQxiL)-4Dt}J2lwjcOx4*eNLr@*$)|6BycSkdGb5l1% dQx``wLvtrLlUEz_saR!3BEd`&Y3vf2r@J_0_VR+zkFki!yAl8NmN0tj)LysKES?9q2AZ!og zlc4Q$cE8WO@Oizs)J`k8gWYRSgg0De{443dZM}!^NBx8&Cwuqi=$>FX)5+ZzWl`kH z7$~0C5Sm~;@!+yWYjWE&L~sB6aZtZ6Ktg9D=a1bWH>RXIxjS39xS6?_I=UJgm>L^ehQ-S~h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/7.png new file mode 100644 index 0000000000000000000000000000000000000000..df53195b257c9a618d43c0f139b0f3b2c95538ec GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar`0C20QXKDDd3=zyC3N zO{@6*hov)QBc5f1HJKQmSg_Q@Ib`eHelzLM^?w5HW+hpyyWK4$@O+=-8pn_%j{*kk zjUpSg4c+(Yw+Cwm-!_)uTbL>4bnb3i?$xs;0V|vp87(!}|J?mrqA_hU=SJa)H`EKR zY@0jfWZ}K|58Ui4M2uaz_i2LMm6Gb@ZfWXfXl`ljVrXJ!ZsB5N7|>p=29#s)boFyt I=akR{0FS9lOaK4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/8.png new file mode 100644 index 0000000000000000000000000000000000000000..0beeeedd163c0cc8e7e8c56e123aab5d0e0cbe59 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar`0C1|JkWpukc5zcl86 z<{yjp`xpG5Y6N8DRw}wXok(PK$Za|$X~h0#*UGDQ91NZgZVRe?T~f-sysmucTJX(r zrqa7?;XV7!OoF$Hrg^+db2xJ2{*t$=Ds!fo%x14*@b}#D?D^``3@gp06!b4D@0NHs z_bpTAhMM*AH4Lf-Z?XbsB*cQ;m6Gb@?qqIh>FDHS?rQ2{Z0KlebXIZ`$juC%u6{1- HoD!M<2+vJ4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/9.png new file mode 100644 index 0000000000000000000000000000000000000000..52444ce67d51aaa962304b04b5bae9ad31216933 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr`%BgKqOSIB@L#d%cix z`G@0{e^{NB#Q7$uW$b_F=$$Fya^$zGjogjRe^TE+%(eELmgMcgw9jmTP<8Q?+pjrJ zc$~PnMp$+3efF-Htpc+Sm~byV`S)zp^|MWnO&T!0}Ty*AqbUTNEwEu?LGdgt} z)3aBr_-`wJdRN-{Md7Kh=M+HBN=bEcH*zyKbTKe?aFVdQ I&MBb@0G>!tF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/glass_5.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/glass_5.properties new file mode 100644 index 00000000..d266ee79 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/glass_5.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_glass +metadata=6 +method=ctm +faces=all +tiles=0-46 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/0.png index 001f6c9036d0dc4374525467cc12d1d644111622..110acbd5ad432881d09e95194f705c72a0784c06 100644 GIT binary patch delta 180 zcmV;l089Vc0nh=EB!7EJL_t(IjbnIuF6{s3hk0Q9 z00BrdNRWX5fEfZ}!wn!-GrA#QJ)~;Ja0xk@kqv=|0XYCA5XpAIzUyZ|C#f-qBIG&&m_9{_`x^({s~lSxtl000nVWkN?Y iH#bH^G%z?YMn*w0IW|EQrMuVw0000c#Cm@O8r7l7srr_Imv(i13`TFbE65&H{xWH5`I*so~vhL+eqhgCpW2|5eN^5xRB}@}8 zNI3XKSzLJkP5vnB|L;cxb3698GQ{W#GXsJ7Za=Qa2T$uiSSGY-r@@_`g9{79l|d59 iMaL9GzpS@8%D}*L#?v5);bSTT5O})!xvXL_t(I%VT(XF6{s3hk0Q9sbp!U$YvOzNHfd}18cy*dx2sX47>rbbWM>9C^7`5k!(Zm?{fYR!XV8c3}YjU z!`Rs50Np^ZBfIrpHvj+t5M*USM@B|4I7CA^GdVFaML9JwMi5w{?=}Dc002ovPDHLk FV1kWTIxYYJ delta 184 zcmdnYc!hC-O8sn47srr_Imv(i13`TFbE65&H{xWH5`I*so~vhL+eqhgCpW9&0Hv?WawK1eh8 zcfPUGbWvAfWAiX_D?Iq$w$Mdgqn?{_N0i!(x9s|c`x|C^op^Srz?iN5P;3tm5cHgo gY!11w|C0zaLvf9}v0IzhX$BzhboFyt=akR{0Jb7bPyhe` diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/10.png index 45db0daefe9d45f80dc370148861ce18b5e3f58f..36962f39d3eb255e3ba1d4c3bf5c48d3890e2bab 100644 GIT binary patch delta 82 zcmbQoSTI4wN7~cHF+@T#c>&9v`%nMOPZa5C3N(;8@Hh6{f5y*}tlKN2bmuWJFbJfi mI=Qo3;8k;N0ZCb_O8uboFyt=akR{06x+;)&Kwi diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/11.png index 2377a5d04a373f36ac3b51915c23ff5e88fb6a29..538dc7bede0ac01f153c84069b749d19a8d1ed6a 100644 GIT binary patch delta 79 zcmbQvm^(qmQ^M25F~p)bIYEMTae@esctQR2&-Gqkm>BjRV%?tZG|8WVfk7Z8)ydt_ i!pYg((Zt-+!p+&z(b;U}%d$s6IR;NxKbLh*2~7a_?-?Zk delta 121 zcmd0u&NxA(IL_0>F{ENna)Jcw;sg-`5cs#p=(#;J5bXBjQr48>|FZjUdIAtMasIh4 z{C$4J*?(e81zUX#Zu7_0F`7@EaJKbf8V_IVZV5>V35gju;$)P(l+Budh0jZ3V2HjU VcWPSj_6-a`;OXk;vd$@?2>`foEjs`J diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/12.png index 565d812d7378d37958caa62ca033b1eeb14d2684..d9cf6ee26d6cb5ee1e55ab136e7dbcaa12f669b4 100644 GIT binary patch delta 156 zcmV;N0Av5%0k{E>B!6Q`L_t(IjbnIuF6{s3hk0Q9 z00BrdNRWX5fEfZ}!wn!-GrA#QJ)~;Ja0xk@kqv=|0XYCA5XpAIz+eqhgCpW2|5eN^5xRB}@}8 zNI3XKSzLJkP5vnB|L;cxb3698GQ{W#GXsIuZa=Qa2T$uiSSGY-r@@_`g9{79l|d51 lx4WHPGLNJM{67`U!*Ft!S7|1jel-ISc)I$ztaD0e0s!PTQ?>vA diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/13.png index 2aae726cc5192f8994789a8b097ca999b7b3e263..3c4d1b3b7379c57d1587839f9e4cd9eb637605c6 100644 GIT binary patch delta 130 zcmV-|0Db?z0iOYoBzsCpL_t(I%VT(XF6{s3hk0Q9sbp!U$YvOzNHfd}18cy*dx2sX47>ruAPnyBa;C@t02*9#f+VTPuK)l55M*US kM@Bd`HAOiyGeSm1I7TozMa@f8bN~PV07*qoM6N<$f>_%x?f?J) delta 163 zcmbQwxSw%?N`0HBi(^Q|oa8_MfgnEoxzPmX8*ws82|p@R&(*WBaquQTWY0r|a4}WTN!Re)G4>f8+LERT9TENC=@aPfv2mV J%Q~loCII6ZL}vg1 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/14.png index f108cabe1522376289b03b7295b4c57d95a10ed9..26fab3a2de03913e6f49e83d0e913afbdd178018 100644 GIT binary patch delta 96 zcmbQlST{i>O4HNDF~q_@`NtoF_y129C;oT*($8;vz+{sI&*3KtCO-2LMS7Y74PqD= zVxO4ktoEI+%fP@Okdo@;?quxhYGUea>gH%+;bLNJ7?^rc5Gcps>FVdQ&MBb@03Mei AP5=M^ delta 116 zcmb=M#5h4EFVfS+F{ENn@}K`e5Fh^BXae(%IGLn`AC;-+>e<*hc#|J9pLoUhW%u9o zmckobCQC|4N=kNa{P}<0j{ofX`xC&RiBo9x%tj!%m@0TN%l)8+geC(+vaXtCNoLPJ P1|aZs^>bP0l+XkKX8tlD diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/15.png index fcecd41f985cdfeb9c680e482c5465642077bfa7..011bea62afa7dfd198125b8e110413c8b992c537 100644 GIT binary patch delta 132 zcmdnVxR7yzO0AEli(`mIZ}N{n2Jio$E>8UK_@$rU_<+eK2_tzmw&eTwpZ=NO7{Xx8 zazyPkLyEJ5NhI5X-7QMa8b%Fo3>M7dX1mADEYEiM0BeXL1H;7yd7CmaUr%LVU=T=2 kb#ga%Gjnt`b96Rwbps+tlPLR->OeULPgg&ebxsLQ0PfTY0r|a4}WzV%End=D&IWXL4vC=6Ba(7d}WsyBg40N%h*NFcz!Sdfv2mV%Q~lo FCIISFM->17 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/16.png index ceae2f494912ba755dd35a8531f68365cb8caac0..a35ce85f50e1def06d6372c817dd8532521beca3 100644 GIT binary patch delta 138 zcmV;50CoS`0j2?vB!5v!L_t(IjbnIuF6=)8nc)5|=l=|!ALfy502okgz>g0zC^LYP zFaU#r4}*dC0>v&EcmqITK#?IJ%@i2|(@3@`*PF00000NkvXXt^-0~f?TpO761SM delta 190 zcmZ3+c#Cm@O8r7l7srr_Imv(i13`TFbE5+cyZyM7ndLrwJ~ijRf!XbDXC9yZ>&~gJ z;FM0d?wM#)@spKV`HYL%+Y~l8H@8JRzxJ!Y`+xAXz61!&NN75em6iYmC6O%w-EY*3 z7=#m57qjuyF+b3pc;!jWg8OgnySV?o?^L#O{29%0!2GJw!5n*_nRh~*%*5Mf8(N6G mOG*J5;Bro4Nz=cn%Ox1pJ#9B~pUZS%00K`}KbLh*2~7YSuTk^> diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/17.png index a3c8912817fb5f048156f466a50198998be5eb82..d672a98db7cf93e4932f44611afc29710cb32db2 100644 GIT binary patch delta 127 zcmV-_0D%AD0h|GlBzQ+jL_t(IjbnIuF6=)8nc)5|XR`HD#{f!P4+ftf<_)k520jc1 z-U|aC1{Apfq?v3Nz%-NP0%V)P27m~dAk0)4jn2l#2LPGXY`p%sD0Kh;01#wlLPs}6 hMnO13FgZgtHa9UgFhggeO8p8?7srr_Imv(i13`TFbE5+cyZyM7ndLrwJ~ijRf!XbDXC9yZ>&~gJ z;FM0d?wM#)@spKV`HYL%+Y~l8H@8JRzxJ!Y`+xAXz61!&NN75em6iYmC6O+hx;Hj4 z|IPb9lSBJ3zZqWYYH^rTEXWKDb(V4Q>rB~C#6tA zdbSLMWsAwatB#ii85kG@Qc|7VolFcIO)V|WT%1ka%nhB*cTYa@9Vo}(>FVdQ&MBb@ E02QSo761SM delta 187 zcmZoyb>~!9 za7rg!_e`{@_{qwwe8$D>Z3>&4o7*CuU;EYH{XckGUjhVXBs3k#N=pEOl1P_L-R=iJ zuzi@~kyT`O;r+Myjf|SA|LzNam)~9#@*rQ4A^bGUW|O}Uo{AR)bKZ=R$UF8RU`O}F lMj#NhOrF5?D|}uO1H;CnR@T-U40Q}Z;OXk;vd$@?2>`{yQoH~F diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/19.png index 32fe8c6f25b4433becc1f3ba0e738fbb647f0275..4abdac87756155c4925ccffbbe6acb482fb0f5ba 100644 GIT binary patch delta 109 zcmaFD*u^+OCC${+#WBR9H@Tux?~Oh4%m@GU(l>n#I?mt~!_PKf{u%EEZZuqH5T7_u%AXHau6RoU?@K97NcK_Dg7$=$-)z{t|v%+lQ0$=Srf#3yb>~!9 za7rg!_e`{@_{qwwe8$D>Z3>&4o7*CuU;EYH{XckGUjhVXBs3k#N=pEOl1P_L-5Z;j z|K|Ol$)SCi-;Gy7gze8Bqv!TTztqHJUX=gtf7JB9+VN3`*^&EB4C|(KHZo2$Ojstg xX{W)Ro`VYu#Fd$WKp1GhOXiWZfd8k0c^D?%bNHNSkl@V#1fH&bF6*2UngHVYSC#+( diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/2.png index f2da235e8ded21b6b1d11694dc64154bc90aede3..3ea846635cae2882ffebe0c1c516aa75101795c6 100644 GIT binary patch delta 115 zcmV-(0F3|70gwTZBy2lLL_t(IPh+eqhgCFVdQ&MBb@02TdFNB{r; diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/20.png index 9a081b58c42f6efccb2a32f76f77e5e30c2f5cae..e060d2f5f5451287ae1393a99487bc4d54fa2cd2 100644 GIT binary patch delta 84 zcmdnPSTsS!PuA1LF~s6@a>4?JJNKXdnV%@q(-deB!Jrx`v_za?>1vKisz*OYGB7X* oq@+5zI~ki9n>bk-J6jsK7`hr6g&p~H1SrSg>FVdQ&MBb@01vMmg#Z8m delta 159 zcmV;Q0AT-eyaA9Te}hRxK~#90V`Lx^{Jb*fKa9=x;t&H9sRqCRyG{z@!OJfg7|GH6 ze^1>1gO^`0FfcHX=K@BTMPyk#3WhIWgr#kEofMK1$ANyg{|pRBDe?cFxc|77qXK^m z0k~QwnC%BIzkr)c$mYUuGX{skU5pG23=B+cFAfo<5t~8%87ogQ004BnEqFui!^Qvr N002ovPDHLkV1n7gLWuwX diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/21.png index 3d322cd8841c371eee8dfb54b6a275ce4c2f0090..f64e6a79ebc4fbc9ea47973fd6ac02a47b67fc7c 100644 GIT binary patch delta 86 zcmX@WSTaE+K;F~EF~q_@xuR049o4JLNsguyEt%*Q622WQ%mvv4FO#lIt8$AF3 delta 163 zcmXRpz&JsrzTMNsF{ENn@}K`e5Fh^B=m5iRKQ3ivxeuRD&G~O&cDvh|$7lb#bE+#i zr4z1uCfZc|WMx)9<6`zUh0V>)Z4u9}{p#=jA3Uuu0Rl4;nvP_pB>+K5q|2sm_k$nU zQq((`|K|Odl$a2tq-w7*7#IXn nQk~qL4V^3uot=%%P0cLKOifIG?4P<5D97OG>gTe~DWM4f`3)TL delta 126 zcmXS%!#F{uBH7c$F{ENn@}K`e5Fh^B=m5iRKQ3ivxeuRD&G~O&cDvh|$7lb#bE+#i zr4z1uCfZc|WMx)9<6`zUh0V>)Z4u9}{p#=jA3Uuu0Rl4;nvP_pB>+K5q|2sm_k$V| b?-&@we#vYxKxfwZ|8CV*b8yOnAIvWREII|rn$KdJe=d#Wzp$P!i=Nygz delta 131 zcmXR|$T&fzHpA1!F{ENn@}K`e5Fh^B=m5iRKQ3iv&W4xQukKXIc4F(XUw`K3`2#?( zZ0?x@Cr)^5a`Y*feBy!)mm8zZpFKv;?R88iF+b4!_iNkrz!}aVE_V8S3j3^P6jAyK{+uw cFhN8`MMX43G`lJ;nE(I)07*qoM6N<$fpF delta 196 zcmbQv_<(VOO8s(A7srr_Imv(i13`TFbE5+cyZyM7ndLrwJ~ijRf!XbDXC9yZ>&~gJ z;FM0d?wM#)@spKV`HYL%+Y~l8H@8JRzxJ!Y`+xAXz61!&NN75em6iYmC6O%w-EY)` z4mQ?p|L@Z>^&$IWHXbSF6Q11czwZ89yyLVwaR_b{40INmNfMbd!hP{M<~4jZ}I?lmL| zuzfGL3{GKSC|hXc`28ir69xtbfs|AycSB=S3ujX^BNGcpOJie4lb*$zopr0OErq^Z)<= delta 140 zcmZo=T){X&r9R)&#WAE}PV%4sKoB4P+~@$qZa*$%X3mC}*RSqW$#!Dvv0s1Y=lKIb zux##`11C;+Y;yD|n0(^G8ITY|G2_mL&JB|SncF%Trz~OJ!Ts-jr}Ak5H8wU6KAVc4 qtcM%x%qQ_CCRG=9==2&eFdVB;{Q2-q=!j^fq_MUfswoELN5aYgFs5Ele@XOtEHo>n~|%T ZiIcI3p@H8ev0p$r22WQ%mvv4FO#oAT5q|&x delta 44 ycmYfEo}i*GoH=svp*x9AkI@G!Lvu4&5oz7 zk$XiF1A~pLzVF8O&$SpB7z9#Mo!pJgOr6|J4NV+foD571UCk|C)cyp@F?hQAxvX0f delta 131 zcmV-}0DS+00iXepBz$K{L_t(|oMU7l5&XO|=Rb_i_Tmr&6R8Hk0J}~K7#PXX z{C`i}|AUubFfcGMkmmwMmqlb*i~$bxyZt9S3}9f?fFW(bfqu9DWEBbChVw&n1)yP$6u=6=4p{*j zQyC}_pHLz3swld9iY13cMCP%A5=1%SglQ;6&&GA&d8{r=M+8w$ZSO#8G+_oJx+M~u zO4~aC0PE%5G5}CqZ`u7!KJazq7kotUW*62Mh)umD3~V2xDIJo>5;m^$Dk=-fhA^SK SH@a#70000LpD|U~oV~U!nT>&gK_Dg7$=%G+$;jNu)Y-_;*wDbx+3iBhj^{u*22WQ%mvv4F FO#l_oB^Uqz delta 153 zcmZo-+{!pXrM||~#WAE}PV%4sKoB4P+-L&xjX0U4gddfu=jz$mICzsEGoN_H_ht9r z^p?UKTP90NNJ>g}Zv6Rw-j4t5`uh{Wpovpx^~^>fxR@$dnaVJi`VbqLk1x5boFyt=akR{0Mj@| AJ^%m! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/3.png index aa3f6daa6cb90d58efc6706e781e1f20eb60784a..ffd81246d07af14954cc7e2b7718749fd2079b57 100644 GIT binary patch delta 155 zcmV;M0A&B!0k;8=B!6N_L_t(Ijbr%yFz^4%b7B8M^p6iSz%;TLG9M-eW8dH9{GWkT z05b%{Cd&Y1LqIfH2B5oyB10%Lfb1}!nhOTr3j-ep6uAJTnQRxpG?V25WShYTfC!i% z%v2bS&c?PaGc*;MJ~{vZ002ov JPDHLkV1kOwItl;) delta 189 zcmdnac$0C0O8o*)7srr_Imv(i13`TFbE65&H{xWH5`I*so~vhL+eqhgCb+^D*3)0 PU;qM7S3j3^P6@oIKsg3aS3j3^ HP6g}Zv6Rw-j4t5`uh{Wpovpx^~^>fxR@$gnPbA|aV9!MZp>q=!ji$Ntkl?HRc3neM0>7IHE$FbJfiI=LG-8d*?YcQZXkvL4tL0f`|bKOj`ZXVgK!VHXu+dGWi|N@kjl7QXBK%y#I;Y ngh#rde){KnHZBH+ZIhYqXD_EqB}vRK>vH>FVdQ&MBb@05D7xX#fBK delta 93 zcmd0)nV=Hk?CIhdQZXkvL4tL0f`|bK{Mlpl{Qr6F;(wD@&*wb$W50Tzj`Iu&Ah=N) uB*7n7cd%f={oWMk88_l&l)ROB7#P-63*Y|Fz;uWK2s~Z=T-G@yGywqLLL=n> diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/34.png index 599730e3c8f69c09653117cdbeb923c6fda6d77c..c8c0882712611725a739c13c8736af23153cb47d 100644 GIT binary patch delta 81 zcmZ3;m_I?qTgubLF+@T#xuR00OAAADR|8Ws0|RpxH`Z{*DL^>}Pgg&ebxsLQ04g09)Bpeg delta 131 zcmc~_$T&fzHpA1!F{ENn@}K`e5Fh^B=m5iRKQ3iv&W4xQukKXIc4F(XUw`K3`2#?( zZ0?x@Cr)^5a`Y*feBy!)mm4F`gt--bUv~dZPjK++T*6S#-T41W)R}?>_utx|`NsS= j@BhgnMxWyUr-FGH{MX7&uxwY;VgLe9S3j3^P64?JJNKXdnV%@q(-deB!LT$^h+$q0>-M*0n#&j%7z9#M lo!l**-5ed=T#ZaE4K19E4GgM+6U>2f44$rjF6*2UngGm68pQwr delta 126 zcmV-^0D=E-oB@y|cw1gO^`0FfcHX=K@BTMPyk#3WhQGd1cOjV1r5RhiL3rIBtrWqv+h&2RmGt3Jh0wxGE6-J}8vGDc$aa4O8pW~7srr_Imv(i13`TFbE5+cyZyM7ndLrwJ~ijRf!XbDXC9yZ>&~gJ z;FM0d?wM#)@spKV`HYL%+Y~l8H@8JRzxJ!Y`+xAXz61!&NN75em6iYmC6O%w-EY)` z4mQ?p|L@Z>^&$IWHXbSF6Q11czwZ89yyL zVAFVdQ&MBb@0C=-d8~^|S diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/38.png index 98fd7b610bbc1cf738a6a59f2bb84055d09eb8bb..fe1aa45cf8f679b33088d01329d66d59afef3b67 100644 GIT binary patch delta 90 zcmbQuSTR8*MA_5DF~q_@IYEMTae@esctQR2&-DUzm3llqi8(2S64J9}7{1TeyPo5u td7goRK_Dg7$=%$@(aq7s&DFrj$kNcn)baC$jITgB22WQ%mvv4FO#mP69Gw6F delta 125 zcmb=J%{W1&Jjv6=F{ENna)Jcw;sg-`5cs#p=(#;J5bXBjQr48>|FZjUdIAtMasIh4 z{C$4J*?(e81zUX#Zu7_0F`7@EaJKbf8V_IVZV5>VAo%~j^LPD+PuxK<{Oo_V{S6ry Y=G~TUU6~=XlK}`kUHx3vIVCg!0J1wT#{d8T diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/39.png index 77fb6c976d4a550cf21c71de160f9f2397a6e77d..5cf919af4ab9cdae4f5b57f16752af3619602f33 100644 GIT binary patch delta 124 zcmV-?0E7R%0hs}iBy~hdL_t(I%VS`m0Nmf@{GVY!4S0Djj4}g0Kg=6o7YuwD47?Wx zJ`5;w0Z231E`Vt!%LT|bgAD)?FhQ89FdChWjSm1n000nVWkN?pMKnP{ eH8DmqG&DCeMKeMl|4-Kd0000$d;b(EG7p zy)VQ0k1orDteFxL0+P&WT8gu|51*Bg;VL&Y0vV)~&J!f%`2SQe55uk7hRb*^E!xTe N1fH&bF6*2UngAPXLLmSE diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/4.png index e013452ac9f8543cda0368fe2410001c65c2e0f7..839ccd367518179bc2516206050f931b3579a4dc 100644 GIT binary patch delta 131 zcmV-}0DS-00iXepBz#LrL_t(I%VT(XF6{s3hk0Q9sbp!U$YvOzNHfd}18cy*dx2sX47>ruAPnyBa{f<=UH~DBc3nd0jm-c601#wl lLPs|^H#s#nMmIDtK{zr)IYMtYDmefE002ovPDHLkV1ll3FdYB@ delta 188 zcmZ3$c!P0*O8tCK7srr_Imv(i13`TFbE65&H{xWH5`I*so~vhL+eqhgCpW9&0Hv?WawK1eh8 zcfPUGbWvAfWAiX_D?Iq$w$Mdgqn?{_N0i!(x9s|+`x|C^op^Srz?iN5P;3tm5cuTi k^9e2$obC8m+ux9Z!JyKk;^m9gw;6!I)78&qol`;+0KZ{PBLDyZ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/40.png index 982c5fd1f34449bccc26412b6b7be1883fdab432..3ff9cb38165bfc7edb7be3ab76d30e1e454d78f1 100644 GIT binary patch delta 94 zcmdnZSTjK-LfzBFF~q_@xuR0eG;p(Yb26D`vuPqwj=|H_&t;ucLK6UWPav@X delta 158 zcmb=~%{W1&zRAdXCE3W+#WBR7#PXX z{C`i}|AUubFfcGMkmmwMmqlb*i~$bxyZt9S3}9f?fI(rv&nt8OBd2d-!GV6a|0pi_ zzbB4pL;NiS;A)u|7!Vl)W-1|@3&YJA913?aGB7YOFtNQjL>`nzYzFnOJjDP2m)J7v T@?~p#00000NkvXXu0mjfMXE%u diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/42.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/42.png index aa5d4fecd85a604f676026228fb4c6974b8baf4c..c33678cac1b5203d39b3f997362b17a3f747023d 100644 GIT binary patch delta 95 zcmdnNSUW)_Qp3~5F~s6@a>4?JJNKXdnV%@q(-deB!Jy&Y^x<@IVggUHa`)jIH=Z!u zZ!z3dGF>{Jfq_9FCDqB@)Xl}*(8SWrz|_sa(b&Z)1gO^`0FfcHX=K@BTMPyk#3WhIWgr#kEofMK1$ANyg{|pRBDe?cFxc|77qXK^m z0k~QwnC%BIzkr)c$mYUuGX{skU5pG23=E9O8G}^Nzw#6V6#%!tEHhI&tKt9v002ov JPDHLkV1fd5LWKYT diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/43.png index 877637bf7170a0dd349e12ad4192e3c779e0bb55..e2a8c98301ac255bd85a7ed1dcb48e949a5e7d26 100644 GIT binary patch delta 105 zcmX@Y*v2?PCCSj!#WBR9H@Tux?~Oh4%m@GU(l>n#I?mt~!_PKf{u%EEZZu!a~iFchyd@|>f+dnp40gFs5Ele@X0lbNfbk)f-Fle2}9i#gZfhi*VQ22WQ% Jmvv4FO#o~|Aw2*9 delta 168 zcmZo;Ji<6ZrM}zK#WAE}PV%4sKoB4P+~@$qZa*$%X1NcaPtEynV0OFPna5}Ux^t>4 zIHeP=dnVdc{A6WTKI3BcHiga2&216Sul?%p{vSN8F98BG5}J-=r6mACNuFD2f Si(xv=00f?{elF{r5}E)l0!Zut diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/44.png index ae33a33c58af606d2566f1cd73a2940c4b9283cb..5a5c87ecff321248fe2f71ac9a8cee00afe73442 100644 GIT binary patch delta 77 zcmb=-nV{k!?&;zfA|aW)faT8pr+?-riu5!E8pJR#yne-WXAh@C1p@zopr04R|ervLx| delta 90 zcmd0)oS+iw;OXKRQZXkvMM3b-9;4^>J!ii?5?~fy$##HYw;$KzgQxW+Bu-xZQ}2K0 tfAjQs10b02oXKsvYf7XIm)pStHU^n5eCyxYhR$aI0#8>zmvv4FO#suiB!vI~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/45.png index d879350b4edabcb11497de8c16e71ed311b4e103..4ec14a32aadb72bd3d49cca8d6686c12c614bcf5 100644 GIT binary patch delta 77 zcmb=*nV{k!?&;zfA|aVvQK|RF{;-Aw>*53v0|N$zI7VjPxcXg53=9kcDXC8Gu9mJ& gZZ56{ZWg9a7Usq-#TEPi0Oc4wUHx3vIVCg!08Azox&QzG delta 91 zcmd0)nxGQq=;`7ZQZXm_&wn6@4}WfSfMK^EmohVF!^`VecdBGNvGv%mKlAha0U%g5 t_soG4Cpq)alwYm?VyGO1B37zK7K7H-!29q@O1TaS?83{1ONeiD9!)? diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/46.png index 0f2ed6c80658c77a832bd508fe0ac090de0a7d77..aab9a5ab7fe526dddfb9876ae1bf7a5225c54c23 100644 GIT binary patch delta 88 zcmcb`ST;c=NYT^9F~q_@xuR0~^;^kI(*f=Tuj4 zN+(?ROth)^$;zyJ#>MPy3Y(jo+ajJ{`_lJScArCq!$2$GI5P78C+}t r000nVWkN?rG&n*rLN_x(MKeV*LNYiOQLr)q0000+eqhgCGImpO?hIa8J;y^eg|-#|%K=>FVdQ&MBb@0NUD9KmY&$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/6.png index 2a27e7fa1ceb4203d3a7b97df0f47a915c533cdd..2b3b3936cf922970083e77b6f36c284c22ef94c0 100644 GIT binary patch delta 116 zcmcb|IFWIJO0JEki(`mIZ*oPY-Wz-7nGgQyJ^#-$U;f#|Tn34NoCE#*#u~;AlMEP| z8~K|XzcU@xlc->BbChVzopr0Q6@k#Q*>R delta 194 zcmbQpc#m;{O8rt#7srr_Imv(i13`TFbE5+cyZyM7ndLrwJ~ijRf!XbDXC9yZ>&~gJ z;FM0d?wM#)@spKV`HYL%+Y~l8H@8JRzxJ!Y`+xAXz61!&NN75em6iYmC6O%w-EY*3 z7=#m57qjuyF+b3pc;!jWg8OgnySV?o?^L#O{29%0!1}7u!5n*_nRh~*%*5Mf8(N6G qOG*J5kW^jRq0xJT=T&@V7bC+HbGvW3$2Tls00K`}KbLh*2~7Zcm{jxt diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/7.png index 7b87bc911d72e60d839d95b38cb48f5adbafc955..5209c412e9edca3ecbf288c96c653967fd270906 100644 GIT binary patch delta 104 zcmV-u0GI#L0fhmOBw;W~L_t(I%VYTbFz^4%b7B8M^p6iSz%;TL48!DLG)$gh6pVsV zFj&C-UC#e0(F*_&`rGBQTi(^Q|oa8_MfgnEoxzPmX8*ws82|p@R&(*WBaquQTWY0r|a4}WzVwU^C6AT}woLD#6Dd>^K zh4T(H&U0+?9Tu!fC&Hx0Su6{1-oD!MOCZ-1Fj)oR)F3y&YPELj*mlqoY9~>b&U)R o3<4>sPVUC0macAYmd<8QhGxbzopr07u*%A^-pY delta 157 zcmV;O0Al}ix&e?Re}PFvK~#90?US()KtK>h|6Xv4p$wx83H@k*L>&UOfF7;|k}p~W z1}8LLw6in+%?5vkB$ugz5=6P+f_W^dvvobpGF7*sGlD3WZg3Da+AxENJQA@<*$oZ= zV08I33;+_>-WUIToOvvH?6)sl6WOG%BnH?Yqb(9|iLtJK7Zp@izhy9ys6P#_00000 LNkvXXu0mjf#!5cg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/0.png index 7e1688e16d68f6dec6f71274823ce7af61e56258..507e4f62fb0445565b0036d1ec588cf6260fcdc7 100644 GIT binary patch delta 216 zcmV;}04M*&0rUZoB!8btL_t(Ijbr$K?&E)4_{+hkDEPyMXDIm1f@l93ew}#ppMgw( z)qq!RkN?9kOzeHni~lf;*8pTq$cABP!e#)vLV`|5Hvrvv#25h90}5TL7=Y|ILI4zn zR51V?ZZHn9h9IlQFaTWvKFv4{z-0)`t3(-qZU`t}U{mv|AgaFt8 zP{^ZWUGX000nVWkN?aL@+i)ML{(&L^U!(H$p~) SBVca;00000mT83B!7%aL_t(|oZXT;3V<*WM0Z6HJdQ{4K32I;j*`yaQwS+!tX2}^ z`0bn~VVHSrmMB7mywxNkUjT43>cUKb+BM2NQwBhYNCQ^PJRhNb0fqT;-@% X#rbj}??l*!00000NkvXXu0mjf|ENs! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/1.png index 4b18372624b4c8f1b323f0fe1dd05aac6dfe2d8e..c652578ee9f85fdf90155dd54b17852cec725187 100644 GIT binary patch delta 204 zcmV;-05kuv0q6mcB!81hL_t(I%VYR|?&E)4_{+hk|37Sa2FBRfAe!OVi8uclC;{jO zylQ*=ABJIK?|WYShhe-1AZtQ43|Z{Wf@lA+8i1}4A3!k#W&l>_5n}*2B&lHlhTrf2 zP!v+n0Avm^hM;K1CV-)UkQ_EaY+^945@#x!I4EB*kmM{RTSf6|CS(B7i2@xXXC4p+ zC39pxvN`~k7Yd2(kKM2U000nVWkN?eFfc(lFf>6pL^nk+MMg1RhwC^10000V>TOfxx|jny)@k zg_<*Yu=T1IRAEaX0TcEF1$5yjK~E8f#MrN4K?ZM+ZECnj!3_!k0000^}q5!K=2%|6v#=_P*!Ee;6jH8Jl55 zIU8Le$$ls3JenIoN|b!qKnnwiH3X+-ViXY6j8Ea0gHK6Iw#bJ3KlhQmG!L?sY|V55 zpjZO{+BR-+#M1x30000GWMx7}L^nk+MMgG5I7T!!Mm9Gw9S_SDJOBUy07*qoM6N<$ Ef)1KHDF6Tf delta 130 zcmdnQIG=HXN_Cp2i(^Q|oaBTB41eOkf3{csB`E;{hCa6K22(F~%oUt2QKmlEx%ATi zV*CHe9S@7lb~)8NsQ+xfBT6mF^dZyX0}LV#J`PIk3T3PnLE?^Qe~1XJm7L8s$y7O8 hCE7Ul!2f6Y{~4!$^{8NU4e?_D0#8>zmvv4FO#q1NGe!Ua diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/11.png index 11cdc8b0b35b01245e80d39e83ea5b2dc1a77c82..79d6d467dc365f27d87db1b3a25a77122dc1661f 100644 GIT binary patch delta 152 zcmV;J0B8S}0ki>-B!6E?L_t(I%VS^|bl_FnNS0000i)n6hKTsA_pLL1-PP#7|r+;60I4V29h-+Yb0AU@wVUzG=h4Y bzx@XQkaI|Q$Z8Xz00000NkvXXu0mjfn$j;n diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/12.png index ee7bc32c6ccfb761f1274f330c2b3b697da8149a..50f222c2feaea3f352e0eed7adad945b6da96149 100644 GIT binary patch delta 209 zcmV;?051Q+0qp^hB!8GmL_t(Ijbr$K?&E)4_{+hkDEPyMXDIm1f@l93ew}#ppMgw( z)qq!RkN?9kOzeHni~lf;*8pTq$cABP!e#)vLV`|5Hvrvv#25h90}5TL7=Y|ILI4zn zR51V?ZZHn9h9Ij48vt_wHU;=J!!1NN0GA=y)M0f2HbX%90!o`2j4;4vD=y7o14go-zt9yrK-10000GWMx7}GB`#zG(|%GNm00000 LNkvXXu0mjfXrxmA delta 166 zcmV;X09pU-0m1>0B!7uXL_t(|oZXVa4S*mFMO$KG;y8}tKAhagQJjG(NH~2@HAO6- z-uxHH&;Ku_fw3phTLmKe0>BzE6s7|5JhJ79G641j9gt$?Z3(<6h=iUz1#5(yuD4|A z2Y_sOJ&TkDp7(1Bn+?%r6L1%-de+#*s79vv$|Cj?OOgG=Rv*p;w2C4}p%tm?0Ixr7 Ui}e-4tpET307*qoM6N<$f^aWNX#fBK diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/13.png index e13ddfe6ad8c02b1208ccbd2fd91b77261adc45c..a24cd378c28c1ab94ecd499d4b2c3e5d92d3c489 100644 GIT binary patch delta 194 zcmV;z06qV#0p0_5n}*2B&lHlhTrf2 zP!v+n0Avm^hM;Ihb^%TWgyhf-z@-qII=m9dhJf+~14+(8GCLfvWBL_t(|oZXSZ4Zt7_107U}eY#@z=_t&=6iB?%7ZnOgO3SZ) zT0WBy;#3)5l>saj0NA9_7t$Wd@>D=h!>RJ%onqn^c(V#0<<5p#$kGoA+$*U0?gLe5 yIFkokuWCURwhAO*!d^iGUHGYBMge&R2QFCEXw(fo_L%?x00{s|MNUMnLSTZkMm!V% diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/14.png index 75dc1e091490ce3d37ceb3fe0802f8f5f2d3417f..173979b451892edddef9524eef9f06fa646283b4 100644 GIT binary patch delta 167 zcmV;Y09gN)0mA{1B!6y6L_t(I%VYR|?&JS22cQ1`u;Ce)2JvASCJvKBXM<=4s)JW; zkN?9kOzeHni~lf8P%}2ekj36Cc=n$t&G-OTLkK#L<_6&O8x{bHLh2hptRXlx6Qh8j zW_$`sPPWK~fbs=NnvrcKTQl7N0Id0;HydB!g#Z8m5M*USM<7N)K{+-yMl?k^GC49q VG)Bf+Ka2nX002ovPDHLkV1lG+L+1bh delta 121 zcmX@iIE`_FN>Qw*i(^Q|oa8_C@1EDQ6&+;WRI0?Fyo+H|w?yv^$->S=)))7Fg5-EM zmRjub@rwA9|Bo&Fw96W`m;?!l2Br>9k0%UA)-i;e2ribK@3hD?`Le^Nw3ObI>}Apn Y3?4jgOeWu_JYWC#_1>qpgWHk15or(Yyc@y0*XSa z7=RIO#25n8j5FYo6%dlcX(2X4KuH-}q9e+wpnQQ%4Z*Yn%RpSXVB9kALNSt+9qZX4OA<@9p!Rhg2f_o?Hjt5qE+7@IV$YRjrOgh?8 puBFJF!1X~>DT6`LVd@kPh843@%~Ga`STX>Cr>ma}%Q~loCIBvpJM91f diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/16.png index d8bfa9295a568a3abff080353ed449278bc7a2af..974667ce77124c1781ab715e11a8e512b93257e9 100644 GIT binary patch delta 193 zcmV;y06zb(0o?(RB!7rWL_t(I%VYSk;n{x%GQpb#K)t_Cydm2FFhF;~tG37gVHhU% zzURe%7{=}lB+b|i!=)a@1?UP1`W@W>tj;6GfG-E1QpW%czY!bo6dQodA;u7lgoiGG zFJ)qt!zPGL4CYnhOhps_f9~Ud29lhGWGi0HgbW}$QJ`bw%sK3t?E7VD(g>o`y--^kOw}4!l`~+i_>7UdXB+2;3{E`Qigr zs5z4dTd!(C6}AL5V8WgtgD(6e=&8Uc#C{G7F8;T0E;rE{unYhI002ovPDHLkV1nMU BKWYE~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/17.png index ded5c59b700d928f775231a0e30bc1d37118a4e9..668775009d7e11fe4cb2469f65d9a3fbcd1941e2 100644 GIT binary patch delta 207 zcmV;=05Jcx0qX&fB!8AkL_t(Ijbr$*;n{x%GQpb#J2&bcX0o{4T7=WUO90O2XO-hu&q8`Okaty!-H)0GyPIy=Y9$(5t zm%|xz*bMn{@F|8E-l#`5?-?$l3TvC^LAVI39h&I}fJ&N0 zmYc7B;W2p*X$OXY*@f2AS6u;e;48EQtOOTfzybkmJ4 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/18.png index 0cf51e6396dae8acea7523bb45472642e30b3179..0e5927a4f9f8b445c785fe134dd348e7f3736800 100644 GIT binary patch delta 168 zcmV;Z09XH_0mK22B!6#7L_t(I%VYSk;n{x%GQpb#$rjm=|K~oEm*zpX zlC7DfED6G(goMn7{}^JpoJ~qt{BQmSSIb1KCR|_`7=QwZ2}tAs#I68O>LREapF*NFW79ygW@L?I nYbF*j{$Ka=Kf~3(WE%hgC7(_{8i~=N00000NkvXXu0mjfyXrg> diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/19.png index a7f55c9d2c3a567ccad48d6f330891f570de5d1a..e90edc2fb278d4e510f0c6d514faf1895f724336 100644 GIT binary patch delta 191 zcmV;w06_n<0owtPB!7lUL_t(Ijbr$*;n{x%GQpb#J2&bcX0o{4T7=WUO90O2XO-hu&q8`Okaty!-H)0GyPIy=Y9$(5t zm&0ixHbcG~e2O84H|miM`G4*sR)qx94#-wqn!yH?Jfti$fjC`2NtOf|000}Iq%Eyo tL-7Cr01#wlLPs_H{%002ovPDHLk FV1l!wJ(BS=)))7Fg5-EM zmRjub@rwA9|Bo&Fw96W`m;?!l2Br>9k0%UA)-i;e2ribK@3hD?`Le^Nw3ObIY&9{1 kfAQZx+aJEVKSi2>VOoZFmAIDnLk1x5boFyt=akR{019^}q5!K=2%|6v#=_P*!Ee;6jH8Jl55 zIU8Le$$ls3JenIoN|b!qKnnwiH3X+-ViXY6j8Ea0gHK6Iw#bJ3KlhQmG!L?sY|V7Z zk|4bRu^e&Yg2S1O0000GWMx7}IYBlH10k#2$rjm=|K~oEm*zpX zlC7C802FHg9%*s*b3AdQ0000GWMx7}HaJ5uHbpoxMldxoK@&DbMW0^(CIA2c07*qo IM6N<$f|4dcoB#j- delta 126 zcmV-^0D=Fu0h{}^JpoJ~qt{BQmSSIb1KCR|_`7=QwZ2}tAs#I68O>LREapF*NFW79ygW@L?I gYo-hM-~8=A0N-B!6E?L_t(I%VYSk;n{x%GQpb#$rjm=|K~oEm*zpX zlC7C;000&aZiN#G%fSEu01#wlLPs$+G(kBrI6*{3LqRY&FcCAQEPk8-0000{}^JpoJ~qt{BQmSSIb1KCR|_`7=QwZ2}tAs#I68O>LREapF*NFW79ygW@L?I cYo;3j0M|4~#_ZUTfB*mh07*qoM6N<$f(#xvV*mgE diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/23.png index 762b28722991d2679bc438fc23827377acf68b40..9fa8ac3dda05b8c2c13e64bc29ca0f616c95b443 100644 GIT binary patch delta 157 zcmV;O0Al}^0l5K?B!6T{L_t(Ijbr$*;n{zNK?Pp5J^l~FFtPVNFaEPBrm^! zY$aPW(SVfb!v+AzXl{j6KIxYL000nVWkN?WL_s)4IXEyyG!`&6F)%kan(JDZ00000 LNkvXXu0mjfj5I*b delta 121 zcmV-<0EYj$0hR%fBywFzL_t(|oMZTZ?&p7ofdq``0?006G-7AOC59ECd*}bTpZ_t$ z*5U9nDPi%y`5Rm<6S10bfni_(3LqvRkpmFB0$kBVjAncaiPnrw1Ie0^HIl8Fcw6uU b8ZiI>&$39yT$OSz00000NkvXXu0mjfAJQ|r diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/24.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/24.png index a7409e3b7d0bd48e0ec714e4f5845aa9003c4f61..e9615fd4577cf7f4a1313582c5d15ee511642830 100644 GIT binary patch delta 202 zcmV;*05$){0pHp`;8DlaWy3d zpadeZh9Ij)@d7pl_%y>UL^lAJA=uPmbpbX*{-67ZRSiZMU_-MNmu9d5B@gi%KnP&u z1#%1k046up|J3Y|umAu65M*USM>#`7Gc!0bK{ho;Ff~I)IlC$LcK`qY07*qoM6N<$ Ef;IMoVgLXD diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/25.png index faa3731355047b4e1cf5323cb786155e0960d9f1..8102da8fa2f479a0b41b67a0d83004bcc78d23df 100644 GIT binary patch delta 182 zcmV;n07?I;0n!1GB!7KLL_t(I%VYSk;n{x%O2DrZZzwYW-371O9{-17nArQC7yn@x z!+KK6GH(~>xVgryl#2A8+@L(>$ zseq6ix&gQpVpE4#0@;xN=RW>tAjw%shU3*t$N#PvMl?o3Ge$EsK{Q1;F_0lc-V6W$002ovPDHLkV1k$D BH*^31 delta 112 zcmV-$0FVE#0gVBWBxzJhL_t(|oMT`ZXuyar@c-P;|8Pkoc1B!cSOKy^7#~Ay9V#EE zW_;j(^EbF!CSo<=0>i)n6hKTsA_pLL1-PP#7|r+;60I4V29h-+Yb0AU-2ecjQ9)cw SvbQY&0000^~*?u^aHJ?eTvYhKarJdGQ~H(bZyT z#%35UTT$dNOe4bSC|*E!9x(=>=pn}d6jzfHB_B3maRE67V1yenhQKsqH2_@!Avv5D zVl(8+!KWBvc%vTKkpJgCVpT{m?SO2>r5S8M$wSIA6Dg?|r!oNm0GFLNE|_E?0000G nWMx7}MKd-*LN+%bal)VQfYtc1B!c z*qwx=5XQ$4TZiEPZ~pclMKQ51hiUxZ{EfmeU|?Vv1_q!2VgeF5tj;6GfG-E1QpW%czY!bo6dQodA;u7lga>m0 zP6dSI&<(()5Su!@63B-9KlkxJ14+(8G90gFLI#kYD98W+_b+>+$Rugl8~^|S5M*US kM>aG;I7T@_L^3fpGB`6cL|->4@&Et;07*qoM6N<$g8qR?kN^Mx delta 145 zcmV;C0B--%0j&X$B!6^CL_t(|oZXSj4S*mJL#X<>nqY z^B%h_m<#c-mpN6?m^inr*4ZK-}`*~;MC}hS=)))7Fg5-EM zmRjub@rwA9|Bo&Fw96W`m;?!l2Br>9k0%UA)-i;e2ribK@3hD?`Le^Nw3ObI>}A|P d?*Dmf&k#`KS*f=(D24$DJYD@<);T3K0RV*EH1_}i diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/3.png index 4518ddd80cc565d0965fcff2f05cf34d0b8d2620..cd69bed22e38399d231a356ed1916fbb8f869614 100644 GIT binary patch delta 218 zcmV<0044vk0rmlqB!8hvL_t(I%VYR|?&JS22cQ1`u;Ce)2JvAS#7D*;HOTnQf@l93 zC;?avc-8j!KMcdf-uJxt55ss3K-Pq87%ojH2B0e>#_1>qpgWHk15or(Yyc@y0*XSa z7=RIO#25n8j5FYo6%dlc8FSbS0VQQ@iH<0zg7O76HLpq@;#2oBEOX(KCujg605$*= z@*oU~Q)D(QA0V^A7^n%3lOOyC01`?Ch>6(o8vp8=pG(|;3L_$GDI72}~ UFqzy(%>V!Z07*qoM6N<$g41DDwEzGB delta 151 zcmeyyxS4T+N_~~5i(^Q|oa8_C@1EDQ6&+;WRO)o#|Fiu6kp?UiV~%7TIoILMv%53n z-cOJMo{gm(|3I>VB9kALNSt+9qZX4OA<@9p!Rhg2f_o?Hjt5qE+7@IV$YRjrOgh?8 zuBFJF!1X~>DT6`r!~UPQ>yQ0^UH312$FJ!*&J5p5v(^Zl{48^Z0SG)@{an^LB{Ts5 DAY4d5 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/30.png index d38c626011275b66ae58ccf0c634b0b60c15ea7a..739a8544927755bfcee91e12ee2949bd6b7f9926 100644 GIT binary patch delta 182 zcmV;n07?I=0n!1GB!7KLL_t(I%VYSk;n{x%O2DrZZzwYW-371O9{-17nArQC7yn@x z!+KK6GH(~>xVgryl#2A8+@L(>$ zseq6ix&gQpVpE4#0@;xN=RW>tAjw%shU3*t$Nz8$fA^CY5)KL5M*US kM@2C?L`FtMHbgWqLPa=6Gc1tgZvX%Q07*qoM6N<$f(-ykq5uE@ delta 143 zcmV;A0C4}(0jmL!B!6;AL_t(|oMZTZ?&p673IG!&ni&`v7+BB+kX^)R#LkFI466oo z@BBaa^FM~zIy5iC6p#`Y|C_(T)lwV=!@vN%v4B-QQUGGrgb_{nG~==rn?kIbaT$QF x0jFks2Ea7p)lA3$VgM7v1M)ThZ~pcl0J=P9r-V!NH~;_u00>D%PDHLkV1jeVJuv_P diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/31.png index af130126402082c9479429d357794bd8de54b3e4..a707f66cb1b56c21664344bdf0ea9ef138f2804f 100644 GIT binary patch delta 171 zcmV;c095~*0mlK5B!6;AL_t(I%VYR|?&JS22cQ1`u;Ce)2JvASCJvKBXM<=4s)JW; zkN?9kOzeHni~lf8P%}2ekj36Cc=n$t&G-OTLkK#L<_6&O8x{bHLh2hptRXlx6Qh8j zW_$`sPPWK~fbs=NnvrcKTQkvsl<30-0E6G8s6s$#B>(^b5F}(}LPtVFH#b5xFgP(Z ZMnXk2MMT=~mp%Xh002ovPDHLkV1fgDM#%sG delta 126 zcmX@kIGb^TN_mo}i(^Q|oa8_C@1EDQ6&+;WRI0?Fyo+H|w?yv^$->S=)))7Fg5-EM zmRjub@rwA9|Bo&Fw96W`m;?!l2Br>9k0%UA)-i;e2ribK@3hD?`Le^Nw3ObIY_)r0 eHjQpP3=G=)JeNm5c|VB(2s~Z=T-G@yGywpM&ok=) diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/32.png index a7be25c5f81aeef62e693f1b0cc53e629c88ccb0..16024ba5b39db2b9aa1311c398b9a9b97f8bc4e8 100644 GIT binary patch delta 149 zcmV;G0BZk{0kHv)B!65z0g(ZaByCtpL_t(|oMT`ZXuyar@c-P;|8Pkoc1B!cSOKy^7#~Ay9V#EE zW_;j(^EbF!CSo<=0>i)n6hKTsA_pLL1-PP#7|r+;60I4V29h-+Yb0AUUBLh5Z~p%oSrT{v0000L_t(I%VS^|bl_Fni)n6hKTsA_pLL1-PP#7|r+;60I4V29h-+Yb0AU@wVUzG-3b% Xhyz6d?>%xs00000NkvXXu0mjfrA#Y9 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/34.png index 792b5b8df02c4800478069bece0375990434e42e..9e4e7f8f6164cc663f8e8c243a3232142f579e96 100644 GIT binary patch delta 155 zcmV;M0A&A_0k;8=B!6N_L_t(Ijbr$*;n{zNK?Pp5J^l~FFtPVNFaEPBrm^! zY$aPWT>vQ70Quc+h1X1tumAu65M*USM?yq5L^4D%K}10~G!!#6MM2C`;zs}g002ov JPDHLkV1nX6KbHUi delta 120 zcmV-;0Ehp#0hIxeByn6xL_t(|oMZTZ?&p7ofdq``0?006G-7AOC59ECd*}bTpZ_t$ z*5U9nDPi%y`5Rm<6S10bfni_(3LqvRkpmFB0$kBVjAncaiPnrw1Ie0^HIl8FF5rLj axBme2a7dUTHNk5D0000^}q5!K=2%|6v#=_P*!Ee;6jH8Jl55 zIU8Le$$ls3JenIoN|b!qKnnwiH3X+-ViXY6j8Ea0gHK6Iw#bJ3KlhQmG!L?sY|V7b zk^rc|ZgKrf`)mLJ01#wlLPs$*Lo`D(H8w*qGcY$ZL_`FziVYC}0000!?-i(^Q|oaBTB41eOkf3{csB`E;{hCa6K22(F~%oUt2QKmlEx%ATi zV*CHe9S@7lb~)8NsQ+xfBT6mF^dZyX0}LV#J`PIk3T3PnLE?^Qe~1XJm7L8s$y7O8 gCEEDowtyL`jK$_2%PfD~ZejoePgg&ebxsLQ06y9>cK`qY diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/36.png index 99b2ba70f731ba32f63bb3b2b59e4a614447bfa8..a7758f3aca3664ea372b8455f47d78ab8901a504 100644 GIT binary patch delta 213 zcmV;`04o2+0r3HlB!8SqL_t(Ijbr$*;n{x%GQpb#K)t_CyrIkhbQip8d;A}UVPfxl zUi^n)bhQvukOi<9hG8qRdYB8)6%uqhx);!$M~nerJzow!CEEb7t6>Hp`;8DlaWy3d zpadeZh9IlQFaTWvKFv4{z-0)`t3(-qZpi<0AF--=Rq_zG0ZuSmacL&X073w404U_q zF>>YsVdM-3(gerJ5B>uHps565EaB|K0000GWMx7}H8?~#Loz}_Gc++ZI5#;k=42pRT-5kK)d&2wBLuinP}F z-8q|<@MZ`@z)^{pVpLXd%>aODL0zOK8%fuQH#21c9F-|x#%vaq(kCGXJ?VnOOnbj| z0N@7!S$TJgv;w#P-o)sKq-HnZ2t1v6YZt3JOmWI439Xn>LL)04=LTFEH-=G(X}RKD Ytu0({ec4I99smFU07*qoM6N<$g8$`6Q~&?~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/37.png index f2ad6c6509c1a2033a4e6e11411dd268cd687fb0..cd30bb16504aa0ddc60500e0ec0acec0c5d54053 100644 GIT binary patch delta 192 zcmV;x06+h%0o(zQB!7oVL_t(I%VYSk;n{x%O2DrZZzwYW-371O9{-17nArQC7yn@x z!+KK6GH(~>xVgryl#2A8+@X!VD zrA(}H*aWeO!MsYGsc7Q=&wc#QK$5eNY{jdYkO4#|3UrK|c{xBBl+2O&$m#%^;?pCs u_P1F8000nVWkN?YI7CH8H$gBmLqs-2Gd3{Jg}4U*0000BL_t(|oMZTZ?&p673IG!&ni&`v7+BB+kX^)R#LkFI466oo z@BBaa^FM~zIy5iC6p#`Y|C_(T)lwV=!@vN%v4B-QQUGGrgb_{nG~==rn?kIbaT$QF y0jFks2Ea7p)lA3$VgTd+bwB?zT>VS70RYH`XvTu*?2Z5c00{s|MNUMnLSTa52|qyq diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/38.png index 76b9957e7006748d8d3ef99a538f0c8099d35b98..140bca83306a8e6a6cc8fa1594ce0b7956356afd 100644 GIT binary patch delta 164 zcmV;V09*f<0l)!}B!6p3L_t(I%VS^|bl_Fn)FcH$p}*HaSExGD9~6 ShCU+z00000EGX*0hj@hBy?X%L_t(|oMT`ZXuyar@c-P;|8Pkoc1B!cSOKy^7#~Ay9V#EE zW_;j(^EbF!CSo<=0>i)n6hKTsA_pLL1-PP#7|r+;60I4V29h-+Yb0AUv4HXax}X0U duKp$4008o>M%0D|3_bt=002ovPDHLkV1h7RF;@Tp diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/39.png index e3e3f7475cb5230b6909e16facc0199d5bbb8be8..34ca6ae927569eabcd1ba527ea3ad679e9117db5 100644 GIT binary patch delta 203 zcmV;+05t!y0p|gbB!7}gL_t(IjbmV-0K8f7>^~*?u^aHJ?eTvYhKarJdGQ~H(bZyT z#%35UTT$dNOe4bSC|*E!9x(=>=pn}d6jzfHB_B3maRE67V1yenhQKsqH2_@!Avv5e zhs}^L2cKey;f;D^L;j!ph*jaMl85-c46+rMW}*xr1i%J>LPQ>fL2-)AhUEifHW&jn z!Ey3~{{WTR&j_>U&Y}PS01#wlLPs}7GeR~vGDJi%GB!9tLqW@|C_VrH002ovPDHLk FV1nwqQU?G4 delta 150 zcmV;H0BQf{0kQ#*B!78HL_t(|oZXQ@4uBvG1Q%oCfBYi<=~KM%6%r0)J)s~Vjoj>s zF5Ahb1ty9TxXb|HBG!s}1g5vyH`CMFkuqcID^2d6*0V5clczyiKe+<{KL8Y^S!BNX z;tH22eaLg53Fv)jHGR|(AQ|3FL%^tLJq;xgE`ElbXvAm;8xMwGR{#J207*qoM6N<$ Eg0WXWi~s-t diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/4.png index 4b59f18cf3ef1d0f0be893fdc7a5f060f71b2af8..9d817ad9312106b6a0a52aa4f449fefe778e305c 100644 GIT binary patch delta 195 zcmV;!06hP$0p9_TB!7xYL_t(I%VYR|?&E)4_{+hk|37Sa2FBRfAe!OVi8uclC;{jO zylQ*=ABJIK?|WYShhe-1AZtQ43|Z{Wf@lA+8i1}4A3!k#W&l>_5n}*2B&lHlhTrf2 zP!v+n0Avm^hM;Ihb^%TWgyhf-z@-qII=m9dhJf+~@qR)x96YaPLIw~8NQpjddI8ps x+aGGXd&d9(01#wlLPte5H#RjiHAX`+MKeZ1GB`BI$9(_*002ovPDHLkV1i!TPMrV% delta 146 zcmV;D0B!%@0j>d%B!6{DL_t(|oZXSZ4Zt7_107VU`*cP2=_t&=6iB?%7ZnOgO6jkD zT0WBy;#3){$^bqU0NA9_7t*nl<*9(2hEwIiJH^B;@MaZ`<<5p#$kGoA+$*U0?gLe5 zIFkokuWCURwhAO*!d^iGUHGYBMge&p=2-XwVMT09MkPBrm^! zY$aPW(Et?kAPh=K$ZS|XfU%J?6tX%1)Hk7Cpt@&O0000GWFuulM>j?{Ml&@yGC@N{ YG(|N=K|Mb(#Q*>R07*qoM6N<$g6G*o=Kufz delta 127 zcmV-_0D%9-0h|GlBzR*^~*?u^aHJ?eTvYhKarJdGQ~H(bZyT z#%35UTT$dNOe4bSC|*E!9x(=>=pn}d6jzfHB_B3maRE67V1yenhQKsqH2_@!Avv5D zVl(8+!KWBvc%vTKkpJgCVpT{m?SO2>r5S8M$wSIA6W9fmWHd>T0RY!-pr~`IHYxxB p01#wlLPtS0HZe6dF-1i)H#jy%H#0Y(|F-}D002ovPDHLkV1gJxNf`hD delta 148 zcmV;F0Bir(0k8p(B!72FL_t(|oMT|10Q_I~^FI?M1~6Rx%fNzR>bal)VQfYtc1B!c z*qwx=5XQ$4TZiEPZ~pclMKQ51hiUxZ{EfmeU|?Vv1_q!2VgeF5^}q5!K=2%|6v#=_P*!Ee;6jH8Jl55 zIU8Le$$ls3JenIoN|b!qKnnwiH3X+-ViXY6j8Ea0gHK6Iw#bJ3KlhQmG!L?sY|SKP zNe~7lBxE)$AHdki846h)0JM;yN){2~+yDRo5M*USM?x|+GaN!OIYu`)I5R;rI63-n RHJbnc002ovPDHLkV1fg1K9c|d delta 138 zcmdnbxQuavN`0=Ui(^Q|oaBTB41eOkf3{csB`E;{hCa6K22(F~%oUt2QKmlEx%ATi zV*CHe9S@7lb~)8NsQ+xfBT6mF^dZyX0}LV#J`PIk3T3PnLE?^Qe~1XJm7L8s$y7O8 qCE9pn!^i)-=Kq&m_fPdU1H;{iUX>@JL?Re~z|+;wWgW9qLK6UeA2<*I diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/43.png index b72c0b1849a0c03764f6057f45eadd04581c31d5..cee41bc487817ebbd3429718095a02a4eafc205d 100644 GIT binary patch delta 189 zcmV;u07Cz<0oehNB!7fSL_t(Ijbr$*;n{x%GQpb#J2&bcX0o{4T7=WUO90O2XO-hu&q8`Okaty!-H)0GyPIy=Y9$(5t zm&0ixHbcG~e2O84H|miM`G4*sR)qx94#-wqn!yH?Jfti$kv5WgaT)*sM7yB8(d~+x r0000GWMx7}H8C+nML{q|HbgTvLqjt}7xcg!00000NkvXXu0mjfZ-q?} delta 149 zcmV;G0BZl)0kHv)B!75GL_t(|oMZTZ?&p67GQt0KKmRi^8nH8yYXHO5zYHuGrXslr zW;ix6>`p@S&i`{i|6_=)L-7AMfBTQ3m{^y?H2!b?_MeGZO}M}?FaQM*6OhOuj}i-T z!F9L|LDzuQ09+EpiV^QrLI%JT;8R4<078H&DG>ld-)53ZWDfY600000NkvXXu0mjf DJlsJK diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/44.png index 417f1c3919b54820bf3c7b5fad37349492ee92b1..2d8bdda490e3cdcf914a7625ede7004bfef396de 100644 GIT binary patch delta 147 zcmV;E0Brx80j~j&B!5~-L_t(I%VS`m0K8f7>^}q5!K=2%|6v#=_P*!Ee;6jH8Jl55 zIU8Le$$ls3JenIoN|b!qKnnwiH3X+-ViXY6j8Ea0gHK6Iw#bJ3KlhQmG!L?sY|V57 z0MXlP07j^uEdT%j5M*USM?*wIGBYwnHbq1;Ha0^xHlaLzE(`zw002ovPDHLkV1gP0 BIPm}g delta 126 zcmZ3_IGb^TN_mo}i(^Q|oaBTB41eOkf3{csB`E;{hCa6K22(F~%oUt2QKmlEx%ATi zV*CHe9S@7lb~)8NsQ+xfBT6mF^dZyX0}LV#J`PIk3T3PnLE?^Qe~1XJm7L8s$y7O8 dCEEBd14DnSE8`b;fhP<=;OXk;vd$@?2>^*cFZcie diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/45.png index e827137950640fce434e0ca965388979bf851580..26bd2ee13cf87ffea9e5f4bb5b48cc536d2b8e10 100644 GIT binary patch delta 153 zcmV;K0A~M@0kr{;B!6H@L_t(Ijbr$*;n{zNK?Pp5J^l~FFtPVNFaEPBrm^! zY$aPW-2edbf@>5x`yzM%000nVWkN?YH$*o!K{Q4&MK~}sHxe>N)3tP^00000NkvXX Hu0mjfCT2a( delta 116 zcmV-)0E_>%0g(ZaByCtpL_t(|oMZTZ?&p7ofdq``0?006G-7AOC59ECd*}bTpZ_t$ z*5U9nDPi%y`5Rm<6S10bfni_(3LqvRkpmFB0$kBVjAncaiPnrw1Ie0^HIl8FZU6x6 W07W6&3sC$30000$rjm=|K~oEm*zpX zlC7C8SrVid0QEq1XKx|JZU6uP5M*USM=>!rH#tT(LohHmF%&aJFgJT_eFFdh002ov JPDHLkV1nc0KzslI delta 129 zcmV-{0Dk|s0iFSnBzk2@L_t(|oMZTZ?&p67GQt0K{}^JpoJ~qt{BQmSSIb1KCR|_`7=QwZ2}tAs#I68O>LREapF*NFW79ygW@L?I jYbM?n3bN$?=5PN2!&Xn?;hgzF00000NkvXXu0mjf>1;gQ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/5.png index a84f20ab0a8c98c0e3f7d7a103fef8ea3d339889..7a5e0375308ef6291b439a24173ee7808cc97cf2 100644 GIT binary patch delta 201 zcmV;)05<=w0p$UZB!7@eL_t(I%VYR|?&JS22cQ1`u;Ce)2JvAS#7D*;HOTnQf@l93 zC;?avc-8j!KMcdf-uJxt55ss3K-Pq87%ojH2B0e>#_1>qpgWHk15or(Yyc@y0*XSa z7=RIO#25n8j5FYo6%dlcX(2X4KuH-}q9e+wpnQQ%4Z*Yn%R*eZVB9kALNSt+9qZX4OA<@9p!Rhg2f_o?Hjt5qE+7@IV$YRjrOgh?8 yuBFJF!1X~>DT6`r!~UPQ>(y!+-FO%ndVDi(m${~^GjKC7FnGH9xvXtj;6GfG-E1QpW%czY!bo6dQodA;u7lga>m0 zP6dSI&<(()5Su!@63B-9KlkxJ14+(8G90gFLI#kYD9F$Y05Jd7r#Wy|(PjVu01#wl lLPtYGHZ?&wGBY(qMleJ$F*S>-+!_D?002ovPDHLkV1j=_OF#es delta 146 zcmV;D0B!%%0j>d%B!6{DL_t(|oZXSZ4S*mFML)#EeO!@!7=;;}f`rregdxyY#G5@f z|20AL%ejnEyt(|RJ%Ps3C=^kO%04ZK-}A>Ua)3u*NOfq4Zn-+Z75 z4QH}o?Nuo#!kVB5RM-+!(1f1^Gv#rv!wi`h@NI7ova2qA01E&B07*qoM6N<$g4P#2 AU;qFB diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/7.png index 281317d200e53876f6af1ab2f0065569d57265c9..442a8b89cc4d33a6d4db6a73e62cacded8ee1269 100644 GIT binary patch delta 171 zcmV;c095~;0mlK5B!6;AL_t(I%VYR|?&JS22cQ1`u;Ce)2JvASCJvKBXM<=4s)JW; zkN?9kOzeHni~lf8P%}2ekj36Cc=n$t&G-OTLkK#L<_6&O8x{bHLh2hptRXlx6Qh8j zW_$`sPPWK~fbs=d$r_fq7-$Mei9T$40gO7R8LI5-#Q*>R5F}(}LPteGH#0**F+wpl ZH$yZsGdWUh3H$&6002ovPDHLkV1nXiMY;e0 delta 129 zcmX@kIFE6HN>!?-i(^Q|oa8_C@1EDQ6&+;WRI0?Fyo+H|w?yv^$->S=)))7Fg5-EM zmRjub@rwA9|Bo&Fw96W`m;?!l2Br>9k0%UA)-i;e2ribK@3hD?`Le^Nw3ObIY_)r0 hHjQop`JcD{XE4$8mD_4CaW4Z9c)I$ztaD0e0su*lHMal& diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/8.png index 057408225fac40ff38fbf72295e313a48b92a415..d3063fd2e5c7cdffc601971df0a7e58dd309b9f5 100644 GIT binary patch delta 157 zcmV;O0Al}|0l5K?B!6T{L_t(I%VYSk;n{zNK?Pp5J^l~FFtPVNFaEPBrm^! zY$aPW14W5~1ib*z!*TX+Mr^GB000nVWkN?oHAX`*GBZXsLl!|pIW$2+)w3^A00000 LNkvXXu0mjfdSyTQ delta 125 zcmV-@0D}Ly0h$4jBz9p*L_t(|oMZTZ?&p7ofdq``0?006G-7AOC59ECd*}bTpZ_t$ z*5U9nDPi%y`5Rm<6S10bfni_(3LqvRkpmFB0$kBVjAncaiPnrw1Ie0^HIl8Fcw6uU f8bQ6y-~Iyt*dk0lw8H4v00000NkvXXu0mjfF>p88 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/9.png index b5609ddc1ecb6a2718fc5393af921db24daab6c3..937bcecb244c9b480269971aad7db8d8448939ca 100644 GIT binary patch delta 153 zcmV;K0A~N10kr{;B!6H@L_t(I%VYSk;n{x%GQpb#$rjm=|K~oEm*zpX zlC7C;SrP#3<#G0$nRoO6000nVWkN?rH#s&%H!wCqGDa~oH4-#NmW$!`00000NkvXX Hu0mjf*3v__ delta 125 zcmV-@0D}Lu0h$4jBz9p*L_t(|oMZTZ?&p67GQt0K{}^JpoJ~qt{BQmSSIb1KCR|_`7=QwZ2}tAs#I68O>LREapF*NFW79ygW@L?I fYbM?n3bP~ty5>x4Ue>q400000NkvXXu0mjfy^uJ) diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/0.png new file mode 100644 index 0000000000000000000000000000000000000000..f17ac4cf7e9a3f6f7bcf8dcad27e0eccadbf45c7 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`%BgKl#kFyJ`z?{!I| z-^KaoF2+auSp+0|UF7QIe^jY1sZ^AnzW>vWXCIu`FUr)PFyn^AJmKWtjm!)FC)Mnh zeXeuRsMGi6?aqVJlQoVrhWMy%DGy-$;oJ1vW2&kZrf~-_;bP=!X6a;N;^ty(U})A`cIOmOj=|H_ K&t;ucLK6V-WlgjI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/1.png new file mode 100644 index 0000000000000000000000000000000000000000..b3cab73f17777462546a812f6f1619d954ee0cb0 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr_~Te|&#`zdq;3f$$Ks zo_@V^3~CyT3X>g7&ZJ04tFb3P7HQ6Gx~RfjqOY*KMMZzYTcJ&J`%bemr!(ASu&i4t z)FI-od^2&w&s(`YDcx_Ray;dHf@L}sW;?bWh+#NnVAkPw>_w7-9m7&9h1rre>%gu^ oNp*5JH#agfHMVp#bG5KAH8eI~yX*QUpraT(UHx3vIVCg!0Ddt*1ONa4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/10.png new file mode 100644 index 0000000000000000000000000000000000000000..5a511be28d13e8857ef34f4746ad641c9f0daa87 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`cAhSdAr`&K2?~sVet&;&Z)bOt zZQ>fq7XF&02g){?E@oaOX~M-OG(og?!xWE+YZaKy;&=P*Q%uQryUy{5nW4Jc`Gnu( sV=q9)rldN#ySbP1LgZZ&L)!Q2ckza0Oi#{{~8 p3{6ROayNChG=^9EpPw; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/12.png new file mode 100644 index 0000000000000000000000000000000000000000..569ac06543359387aa0fbce77a80896aca7cd40d GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`d7dtgAr_~Te|&#`zdq;3f$%pu zDRv!c48kc)8{#H-8t@rOyByAO5pUiY$kTA~2*Zq9XRqfaS25mHeKBjp%A*C0cGDMB zvma$BVz|LA($2VRvj(5bq`eI?`$Z}n-%Ro7<4&jw*ke%8=;3L_5Xr}&ZLVk;AzAkx pg7&ZJ04tFb3P7HQ6Gx~RfjqOY*KMMZzYTcJ&J`%bfp9Aye+nwZ0^ z@$JxooeZ`sFWC!d`m!_lC?7ewTH&o1$gY%BCwF6KCpR-Qb7uo1b4OD%3(Ja+JN5wO O7(8A5T-G@yGywqKel_3# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/14.png new file mode 100644 index 0000000000000000000000000000000000000000..7d5d2e7157effcfa5ca22385664b1496b298d76e GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``kpS1Ar}70Kfb@e|DQSj|6lft zCvr**V;=E{Fi-F_kV;cBGfc58*%)ZR<;Ez=z#v+Y{QY0n%Jm>~Qc|7V9UTpg+$@bv coJ|Z(9gPePUn-p20hD9#boFyt=akR{0BaB?rvLx| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/15.png new file mode 100644 index 0000000000000000000000000000000000000000..4f91c8673c78eb642cbc04e27f963fc5268b8050 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`;hrvzAr_~Te|&#`|37p5|G(@P zPvqnz-MC^9z;uAE!H21Eg0G8M^Tvr!6LL1iG8mV9-g^7L=cSfB<&%02-}#OAAm)Zjn-`0Lv3$iaI)ydt`z|h&r#mv&#(#gfr+1YK6 S>l+!M9D}E;pUXO@geCyXlss4f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/16.png new file mode 100644 index 0000000000000000000000000000000000000000..541ea7e045d109b1c6dae6554251e2c4d957ff71 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`1)eUBAr`&KKfb@eU(cq{aPbGj zE-8cm2f`0YeUx(P;!b$wAdzR-C%*RW4<`J;wwVTL?IsHS;v?WN1mu5$Nr?c+{bWL2~1xxAW7Y rBtZ^INp*5JGIKL@b#ZkwHZyZ{v~+WecV3YWlwbP0l+XkK7c)Rx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/17.png new file mode 100644 index 0000000000000000000000000000000000000000..de1385ee92f8035347da8ab383abda0d2ec371c9 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``JOJ0Ar_~Te|&#`zn)E{;oNaH zzM9q*jTc?AkE9CBU^Hroa87t-7Qg$i{81ATb-_gA8w^RN55F?4WLPc!;uX^rg9S$z zybkr-=pSI}*U@hwYxrV&au~`Pd74=YHWnr_q@TOBsNi(_ rS&%zYQk~pgj1A2#oh{7`jm?~#&0NePD%aZrPy3=zXqu?&Z2ufKaNp*ch1*fDm7 yGxCRRdDa{@0U4f>>f~-=X5nID;OJstV(Mb-W zqU#r>giDjzBpE MPgg&ebxsLQ0J6q3c>n+a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/22.png new file mode 100644 index 0000000000000000000000000000000000000000..54a67374cb51dbeed7a8d7239c4e83b73eb144ba GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ww^AIAr`&KKfb@eU(cq}aPGKz z`=R5@1?M~ZC_Fk4-oaqlcHqi^F9#Ss7@PXu#YTx{VESX3_3)8xp;aGJ+~;`R3~>w6B8pRCnsl9OBZKjGXrOzb-ynFQL!Xu$om5fIjHZf0p zl%aB*Rin|v&udAZLeL~3$7#$A0R@Mi-M_ps8Dw8ds*}5+tA&YyshNSJg`=stlZAOo S)87Q39D}E;pUXO@geCyGP&v~8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/25.png new file mode 100644 index 0000000000000000000000000000000000000000..c29bf647488d424edf41f5222a589a858ecd9f1d GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)}AhoAr`&KKfb@eU(cq{a8ae1 zIsW7o4(5ip#0RkkQXK;885k#mv;w!r92wvLk%&E}$HPr>mdKI;Vst0MC;uP5=M^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/28.png new file mode 100644 index 0000000000000000000000000000000000000000..2949abffce4ab96995b2611d678e84fc63fd269d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`fu1goAr_~Te|&#`zn)E@;o=X5 zT~Y@B4}>3*`Y7en#hviVK_btv$8n8!fXU<}V>1S`ju8C>^Hw2;job-RC(AgG#x+Pf zY!qiZ$GT+Mk%QCu7!Gu|YdN0CGXdF@lIrAc=wj?_Z0KTW#XV L)z4*}Q$iB}lBzVb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/29.png new file mode 100644 index 0000000000000000000000000000000000000000..665cafef6d017be01ce808320f800672827d8a36 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr`&KKfb@e|DQSj|6lft zCvr**V;=E{Fi-F_kV;cBGfc58*%)ZRrNNYU8tjzIQ-522WQ%mvv4FO#rtuF_HiP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/3.png new file mode 100644 index 0000000000000000000000000000000000000000..d1673da77bc05b51f0cecb4882d1329088a55661 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr`&KKfb@e|DQSj|6lft zCvtL9o;KNin!PiBsdE>;V2|1f$8H`IlZ@qm)y5a13mE8g4WbSADFZeV8WXk_RUsWBTU$KdJe=d#Wzp$PyAB1QB7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/30.png new file mode 100644 index 0000000000000000000000000000000000000000..b16d818f5f8276cd38c90773dbddb8892d2732ae GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`!JaOTAr_~Te|&#`zn)E@;i5`2 zbNtCG9Lyobj5qZZZ>O!QPJ9rcq zZ~s48wxi(el4Z;yy#aO%xkp=j5!b#gZ}H* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/31.png new file mode 100644 index 0000000000000000000000000000000000000000..888260c1f8e8daf55810e40bb6fab6842ecbf753 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr`&KKfb@e|DQSj|6lft zCvr**V;=E{Fi-F_kV;cBGfc58*%)ZR^`Ns&i)~`AgidANzOvah*C(u%j8$IA#>jAl wqg9gk-0}k;vr|%?+$~%UjV;ZL-7HPa3>{6}Oa=9ujDd0tp00i_>zopr0C$fr2mk;8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/32.png new file mode 100644 index 0000000000000000000000000000000000000000..e20e80bf8d186cda0985448f88194e4f82031daa GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`I-V|$Ar`&K2@a9BUY+MJwFt%UGHYG9)F{$=%r8(7?#j(a6Za Z(Am($!tLOJu%AFV22WQ%mvv4FO#rpjDZ~H( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/33.png new file mode 100644 index 0000000000000000000000000000000000000000..adad6bc580cde503f6dc89db774bc1e24614a06d GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`I-V|$Ar`&K2@+h=F7uaOFIGg1oRkoo142i<(*;%*~sAO>gTe~DWM4fDt0V9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/36.png new file mode 100644 index 0000000000000000000000000000000000000000..e67378b6ce14b4ad37a089e878c06e2e00186c57 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr_~Te|&#`zn)E@;o^}7 z=6J=dgC;%BdQL!dyNLK9?DpM|QBN zwVO*hPP)Ov*x77)K}Wz*=1WLtj<%nn7n5L)KnH^)Q!(Qiwh}3EHina?62~;fR9=8w ok&^1K2VOq)78&qol`;+00}2NF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/37.png new file mode 100644 index 0000000000000000000000000000000000000000..f93976ea75ebd6ec81d248d605dfbbbd54cc1d86 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`QJyZ2Ar`&KKfb@eU(cq{a8ae1 zIsW7o4(5P5C8xG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/38.png new file mode 100644 index 0000000000000000000000000000000000000000..53568b8154b13110e0b79c00dc242417381f6e14 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`x}GkMAr`&K2@xG0hZPuOa$+PH{Ij7Fi*Ar_~Te|&#`zdq;3f$$Ks zo_@V^3~CyT3X>g7&ZJ04tFb3P7HQ6Gx~RfjqOY*KMMZzYTcJ&J`%bfp9Aye+nwZ0^ z@r~)`w8^iSBJ2))VA`0-=$$cp{oQ~5WeSH(C(q&wFmd|Ha4+xal3!=~zkuvdNp*5J ibapZ{F)=r=Ffwp8Ff?*2Wzzd$(#Pgg&ebxsLQ0PHg@IsgCw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/41.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/41.png new file mode 100644 index 0000000000000000000000000000000000000000..c9603894ee0119764f96d8a54156b2c399df48a4 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr_~T6BL+be*AiGZ{%yH zaJ!-Yzk-x`{O-T=m1dtbOL(x?VI#K&AM>ipMk~FBLJdBb364jk+5|fkdKDa#{fq7XF&02g){?E@oaOX~NZJ*PzNK!0Y|kU{-|TsaS@?v)A7}me8CbaqJj7!~E+_ v#^(g=g+V5#q&m49IvbiAn7f%6yBeBXxS2VwxfZnoD97OG>gTe~DWM4f#)~d& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/43.png new file mode 100644 index 0000000000000000000000000000000000000000..f2ce827550a34ff9c270638e065fa2c66f65775f GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`zMd|QAr_~Te|&#`zn)E{;oNaH zzM9q*jTc?AkE9CBU^Hroa87t-7Qg$i{81ATb-_gA8w^RN55F?4WLPc!;uX^r1Bn2A zo;}=d%z}?Z875{m`UwXHtq0kXlIrAcZfb4<#0HiIE{Ar`&K2?~sVet&;&Z)X?D zW;k*6&jaCHIqK2IRtsi1E=~~Pv0-3X@j&j|ob|W3K_;Z6I=Nd|I=fgJJ6Tv5TN*h! W85+82<{Ja$7(8A5T-G@yGywo4O(O3A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/45.png new file mode 100644 index 0000000000000000000000000000000000000000..4efb848802937b53ab1fe73ee3f21155d37e1ebb GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`TAnVBAr_~Te|&#`zn)E{;hehE zgtdY!d^LZ+%cn3LZEG-yl#+Bis3F11AXB2W?4sS-{~#k$Qk~qLTn!9d%#9o!UCdoA XoDCh%?T&r`lwbP0l+XkKk4hz3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/46.png new file mode 100644 index 0000000000000000000000000000000000000000..50e21944df2afddec64658cd031d25982a5effec GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`v7RoDAr_~Te|&#`zn)E{;oNcc z_Cv>)Pn_V$!@lp|Z+;<_V*)d*CdlzP8?Y2gG%V_q@ZG_nTIJ3d%BZO+kZ&?+me9s! z>&{-!`>%d1Y(f>!)*~6mR*A(b+cj@k$;#kV*WUk5f?*rT)|6BycMBsY7iSj}Q%56b Yb4zn)({`_utATP1p00i_>zopr0Njx~F#rGn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/5.png new file mode 100644 index 0000000000000000000000000000000000000000..1db02d4386b7e6af98ac0af1ed4cac43c729fcd0 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr_~Te|&#`|37p5|G(@P zPvqnz-MC^9z;uAE!H21Eg0G8M^Tvr!6LL1iG8mV9-g^6pbi>*6D!Uo(T8pqNdB!cU z;8~HyP`a1l@dW08Bu2}tf~y7Ju|_BSpnnDbVWgb=u7O5Qp pxgsUi$=$%k#MRZ%&Ct})z|q9g!0=?_B@3V&gQu&X%Q~loCIBsnLWckV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/6.png new file mode 100644 index 0000000000000000000000000000000000000000..673cefa7eb2ac3f5fcf24f47f81a8adb95a8b62b GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`X`U{QAr_~Te|&#`zn)E@;o=X5 zT~Y@B4}>3*`Y7en#hviVK_btv$8n8!fXU<}V>1S`ju8C>^Hw2;mE1EDdYtcTa&mAn z2p`?(SZH!+k3*K1inT!EE3^3Bf9Jn(XvtPHm0gh0@`*9Danh-mJ8V5b)~BR8xf{B< hx|ledx*0i|IXSu-860~pa}g-V;OXk;vd$@?2>|LDKFt6C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/7.png new file mode 100644 index 0000000000000000000000000000000000000000..5435a5f29bf8c903f7a0f218fa9c50c997d51bad GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`L7py-Ar`&KKfb@e|DQSj|6lft zCvr**V;=E{Fi-F_kV;cBGfc58*%)ZR^`Ns&reV^AgqO1=xDBryob>!z_I6GwhSNS0 zS)CVqLUnh!)vzT7b2Ee`E&by9;cyYis+3eGcXM+SV+&JrGjnrGCnHA}3#UUy+(0=7 MPgg&ebxsLQ0C_$(+yDRo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/8.png new file mode 100644 index 0000000000000000000000000000000000000000..058a2103edb58d8d8ea40f25b0de80cbca85eae0 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`zMd|QAr_~Te|&#`zn)E{;hehE zgtdY!d^LZ+%cn3LZEG-yl#+Bi7{ES7MQ)0ULyp&xReUN8M!BE2-u~a|`%NON^I}h^ z?k=|)w!~m=hS<22#p`BB)`M(GNp*5}bT)T!bG2|bG&eM|bTn{%Ft;NeD97OG>gTe~ HDWM4foR%}& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/9.png new file mode 100644 index 0000000000000000000000000000000000000000..c033d99f3bedca2c906e31f7c7d8493205fdbbe6 GIT binary patch literal 167 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 literal 9137 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 z zzj*O5(816{_ybvQ@Y)+$JqY&x3N(#M%0Ih%zzNFj&LeVZN&@Q;804rKMXAy)jlCY3 zpj#L49C6tvZAqu={xlMLRB$)6Wj_+RR)6HkkkMFNYhsK4$oE`EFS_JC}qol~Bn8|=*!Usb=o z@yGhRTmkj4FCx~myJqX%^h&f6CZ-zFgwT^Kq~Obz8^9S5BVb&h#;MMav$K_ZBm5kV zjd*|>*`HtjFmHi|fZbym!=?s9w)!1Yn28lhx4N!PhKfrI9%<0f9j*qptM_dht!dS( zdicF#s-5;pRQq$uuhz$&wU$YDF6Q3-}0>Axf5U{z^?`GY~J4>fhJE9Qa-88_1vtK9Z;11 zN4JI*#K9k-=Ty?xC8uM3_wQXJ9z4^4c)d>ZE0JKUMV+!ZFe88D4GJ&&*A^8L&i=id zt!1ma&%Htty9&=}Dq8m5XSCM+et`7FC+%eg5+r_uvcF`_bz)|VRe5jIu?juI8jgUh zY|woj*kvDw`s#VpJ-tsWWxW0qJy#yc&tUwxD<6~Yz>Ges_;1B7ebC#)>8Hr)uS87w zi6GZnOL*14diA!^`MZ0q`Onv3`+Gz*M;&`R;sk&GyAx>spx`G9!0D;W5S4A97o=AE zYXP$LRiEhH$GB0;h7CrE)g!;BAWaHk1+#A@Ni7NkCjieGfIeMJ8^Ow*E3XW_cLf5P znO8C^IVKV-fd{Jk6m*rR!^CNKZNPvf%B<3#kSw}1Hiq7?{i7-=b>1F+Mf3-)-fJm^uV3A6*I;J7|mDsnmLBlb4cC{HO?>>MW zVsv+NGI-+_J_jX?$^2N5bl(^QV)<9PvGiX-l(;G|!}b?t2vBfr5eZTIQOI&i!QA(v zOoNpwKXlEAXYkhAU9}1d9-f-HiSJ!U_ucAL8`M0q-}ow@m%@ZnH=4O(vKDkdKr}2=cESxdKMdjr`Ft92! z3s!K+f&dtk-CMXvcjBTH4{LC!eHLiAs{N9*`Z_p)0Nc z1LpI!>Nz{wa3)THkmu{=B{hiT>B^DU?Q2}}Z>n!-7@kn69(E#D=c1bbY8Pdm>RFv` zBhD+6-*9NGNGGXp*<~TW^o@bM{Fv(g{84!CO~L9wn>o5?Z9}wWENb2dQt|BH`QB|E z9gI90cS=eiYt^h6nw~#py3^L$N|){RbSlqK{7n@WqB_X7f|ZiMsX30;b2A99b1wvo zd|ixMr}n~wg-IO0R^zN$=|gnC$IB59#*|sTp86rm)Rm^ zVE(*g&zF3w;fJPBu9c*tOgat)Yn(@8c!G|&T;NuK&$;w8#bI9=4MxPhHlsOY!Yge1 zDl`Ek-o?|Px~ZhGt`}psPu^NwUiMBwQl2=J4z|Hm-?(uDGCmY;Qr9UT_@5T?OXsL{`33ytv zco_{?(G`0sJNpQ}l`(bjT>x%KrXN3k46g51isgW;*kF)@xHh>Eyvi-5>~;w2dz|I| zZTZM*i$+I@-TpW3TQk54G(5#}ZB&rxJ4IGE8i# zqyiZ#X^}Al(soD&e9xVL9ag23b2TSG*r|GWEqFR?n(l&JoLN7Y*d5To@C5^Np}xaB z;QMHw-7s$N-mj?DJP3q{Ao-(<;+u;xGvYM_>WoDQ;d_!Xd2VjbiUiwnS?m(>Vv6XU z7cDK>$(aU6|7Em@z)WBU=6bVfa+j!ZKtqBH ziG&BlLEX$*lR2^%R!Bu}@f;dA^W!T&Ma)bx($7p84PD{s_@a#2NYsA-5{nC-r}U&r k?R04c_fc*X)$N3Zp*%wv-j~V4S8)*98v5$xs&?W31K}t@2><{9 diff --git a/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium_flow.png b/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium_flow.png index 56df662cb39e4937b359acc8f1ab00dea6fcfc7f..7be9680dac11bfedf25ec45e48967714497e7480 100644 GIT binary patch delta 7449 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 XOU4(%+BE!A8-$^rnQo1?OU(ZP>h;hU diff --git a/src/main/resources/assets/tinker/textures/blocks/liquid_inverted.png b/src/main/resources/assets/tinker/textures/blocks/liquid_inverted.png index 8d5c090d0017718b9cf138f4000cb4e4b1776bb3..5a04a85d853888684771c9eb8555be236dfb1953 100644 GIT binary patch delta 4100 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 ao>H!!F`cM>oEAg@-VAi_=#*(ai2Of0%YI(~ diff --git a/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_fletching.png b/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_fletching.png index e5a51edfd4314b64ec7e280491e36ee0411fd8a7..afe72ee7c6ec27bbd04b84300a11c78752b87795 100644 GIT binary patch delta 123 zcmV->0EGX!0hj@hBy?X%L_t(IjqQ%15x_7E0|k89!YDkzrkTOiD`caLtI}Li%?k2d zuLmxdUy+$qRjMjWLlL2wF(R0m1OPMpE}3(3j6ruN0JwX-Vy#60*n6|J#!|t%r2Kx; dd#8w$1P?JRBRfvEj{*Py002ovPDHLkV1l`#GfV&g delta 157 zcmV;O0Al}`0l5K?B!7TOL_t(|0qsz`2>>Asjfc2}l^bXy;vTNxMo#4vVq+uNSmubw z_1ax=fshaHg_j3^{0@A}fe->pDOa8-yEx~lwZ=IoIOm|0!f4(-!mYJ1#(-KYp{0A3fMCwvXD1=ywXx>Tog1q-gN_y|>jdy=kl~PEaoEDI7SW+-4vCg@h00000 LNkvXXu0mjf(ji9t diff --git a/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_head.png b/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_head.png index 4e821238bbfccf1927c5ebf65a795bd592cba170..add9ad6945e14d85756c193e0c88c4d1cf4c1946 100644 GIT binary patch delta 111 zcmV-#0FeKv0gM5VBxqAfL_t&-8STNL5x^i2MZq&P@eKulK%JxjW-u7)q4Gxy2{94u z+Nl^Lb58875CXMUT5Cwco^p5GoiPS$EppD-iIfth6eMA%dhgg5lCbOgl?`A28XZcw R%LxDg002ovPDHLkV1k?YEb9OO delta 140 zcmV;70CWG00jL3xB!6#7L_t(|0qu~n3BVu_MZXX`ClJ8_EbK&wa8j3X3JaIGM8Q6n zSbA_=bN})90w2d(OEE^U0a8jzDM2ZPS}U%%0wDw%zs4AN?@>xYYfZ2XoOAS8p!Yrj u1Ipf<^R!_HS3qn153oSzo(8rxa08Gz7s3{s?a002ovP6b4+LSTX-d^aip diff --git a/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_shaft.png b/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_shaft.png index abfa704fa23a2291e5a6b267b83f9de3d9feebe1..f502eae640fd92936ed636ec3fb8eae3497bec25 100644 GIT binary patch delta 127 zcmV-_0D%920-OPmBzR*0fboni(Z{t;KT=#~Akor4-INS!=zABSMGWovk(IoHcXrT{i>J;k~!^?TC11 h2A~fGfOhuhc>rSTGWe@zLGb_p002ovPDHLkV1mGjIB);} delta 229 zcmVHKqk_r9~~&qki-oTe$8&wiQ*-@fmA9>G_{cZjQ{eV6B_)W=C00000NkvXXu0mjf$xUd< diff --git a/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_fletching.png b/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_fletching.png index 854c0c0c5c89949507899e605e398b16874528b5..495b580d87f45963ab979176a28fe150dfb62d98 100644 GIT binary patch delta 154 zcmV;L0A>Hd0+a%ff`5HUL_t(I%VYTe|33pIm|@g_Q3I%IKz4c6|Ln@@|Je=A|4A|+ zyRPwnc3s1N>yWTo^MD|*=Iq86q77k)EvfkL7!^}%?CTHKWEK?mA7m&=UWhC%1#2+z z5Bl#A6JJZR0U#V!Q1st6Ji0c!w&6e7vEY}H{Xe_Bnj`}N3lkFQO!Cw`Pyhe`07*qo IM6N<$fJ{1f`6(>L_t(|oMZg||33pIfQ2I6qXvu`fNnreMfHCMCPoGZb`FLq z^)-w{8<11q1We2S87|ztQ}^f3pQaP**D~fbwf>({S51^5ET6u8XL$1LN!^d1Kby{M z+Q4WY9RA-_N1J#rEb4A&j4CPnzi;VcM$>@c|2(|BbwKeZqCgD*5zBhI7{d#T|8sJ1 z)@ds$Hce@)BR&jZjFtVpjQ*K9{~3P$CffNR005G-J4T2M{!IV?002ovPDHLkV1l56 BT#Enz diff --git a/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_head.png b/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_head.png index ee70896e04d21210e89299db717a46ea5e0ea2f8..4ea64ab8385c793efe583a35e796b2ac37c14def 100644 GIT binary patch delta 133 zcmV;00DAwN0)PULf_`a9L_t(Ijbr%#|33pcIIXJwKaZFs=^FiF6aV`}#sAkfx2o+} zu#5y7E9(BIRn-0$RZyT22f`6+?L_t(I%hi+33W87&g?*wRe1WLMC%BLgV47}%RuN-KVSyC5 zkbZ97KOgk84uZP2axu&E4Rg*J2Y~a>IQ;@FFBR6;2RZ>(RgJ-DOq+XS56HNL>-m&R z1?v+sE-;*URO%Mi9_$(gck0vr!{)Dm{3*faF`blwbqa;nU_oI-XVbzu#w{0MVML`i zu{Qd!`pw$LU8WH8~Cd0000xsf`8vhL_t(|oMZg||33pIfQ2I6bT^=|f6{+WPELllj8sOF4Jes3 z?f;6ylGWbuD#_k-q{|g&}|AT0d zAtW0B(*QC6!e%7Z@r+mD!?h=)r60000-v8IXzy9a{#puWR13=)k=GZ%#?f;XM_VB2m zuT3*ZuQ&n}^_g|nKzeuaodw&BjSN6QF#EutTyaTBNeKzNx}S`qKmBKMUx+p0a$^i- ZWO(#cT4=Mg;${XQ@O1TaS?83{1ORy!HEaL? diff --git a/src/main/resources/assets/tinker/textures/items/arrow/magical_wood_arrow_shaft.png b/src/main/resources/assets/tinker/textures/items/arrow/magical_wood_arrow_shaft.png index e2a1eed01451d20fa656c3e82e1a05c4e78615e1..e17fa6bdfd88fd376a81dfb3d5a038695ad672f8 100644 GIT binary patch delta 132 zcmV-~0DJ$t0j>d%F@0!BL_t(I%VS^|1-JntgkWSu@Vj%|{u8MgrjZe14v<{f5d1&U z%iuq;`cYg`lVC@@W`y%01|6EG0oBZikRZwcAilm|7owRFo6`vB2L%|y*^CS%0Tj)Q mIKl=Wzz8r#M6`|qOaK5|6&<1P+W83p0000cEpf8sg5wqF1JbswF&&xG?baPRYN9DIX XYaSz3wjZM-00000NkvXXu0mjfC>St) delta 152 zcmV;J0B8S_0ki>-B!7EJL_t(|0qv173cw%?MGbXuaq$A##1lAsB#-Xonl?j0hzbpK zC{z%{IM$udS{9-@w3tG($id zK$^Y0yucV_2*^N^Y&SA80^1DI+}POozoevuH1B{60U5x?#`fRI$qDQdb#-;pTmthB n2!jj(xrCxXCE4~-Fd_f|YyUWOT-Hh900000NkvXXu0mjfkBvOn delta 205 zcmV;;05bog0qFsdB!93;L_t(|0qsyh3d0}}oZfN{A*cKxmpmYlPlUW6Ps%fL_9KEf zLBS7*coMX1NClxSq0mz+tgh_L?Cj#}r|Y^j&vW{y5s|lTOMTy`VHlo@++HaYVO>`+ z#tw+q8rE7EV+v03IgsZ?-P^WBj1eIOEXxAt9F$Vn_dWA+az^rsheVpDfe-@YIHIa5 zNGajH&raS7Jk)3$%ImtuG)>@~7cQuFDaaAUCGa2gQyaJgLE}Ca$jte^00000NkvXX Hu0mjf^BZ1i diff --git a/src/main/resources/assets/tinker/textures/items/axe/bedrockium_uie_axe_head_broken.png b/src/main/resources/assets/tinker/textures/items/axe/bedrockium_uie_axe_head_broken.png index 0130f6f2bd73bd4787f72f485be351b54969a208..a06afd38a1f6e29d7d8ea08e971198590efe8c2e 100644 GIT binary patch delta 123 zcmV->0EGY40hj@hBy?X%L_t(I%k7Y>5ydbJ1cO|K_yLovK~UJGxB*qZslmz2BQMME zdtJX^t;H*`By96YTvcQyb50`S%p@YPjU>98y*I~mY%|6nGpQ;hoj0+KZ8DSY=JBZ! dai0G17u-$sFQ*BL0x|#q002ovPDHLkV1k^GHxd8< delta 184 zcmV;p07w6r0n`DIB!8PpL_t(|0qu~n3d0}}hW~cT9J0mT)dvuK2`8V?w-MX~2j4){ z!6D@W4U{$^bm-CuCx_nmc^-bUwARbl4-w2cUxW}JCHEsU!L?S*^Nij*7-Mge+mV2P zX`0YlgE0mi>rL?l^wlN1k&q+f0IF3+C!8!NR m1>Kzr`Vz&d;;ZPdCh!15KQtFOlTvX20000TJR2O_*Bu3F4;4#Ug{0OA*kKcFXom*vpR9c0~r4LGO_^P@|ud4iq5jwQy%iqgk> z^GAS_NKCdCMO6)U2X>NTv@j?vE3ix4Tw>^!L+7Fddxho6$1sp)6x{A$&$tdF474eE l*8*StV6SrcEn|23#1|*F^x7X_oznmS002ovPDHLkV1ktCRLB4T delta 231 zcmVEr=BqD9b hFd#ELlq8KX003*qMcUS*zv2J@002ovPDHLkV1hdzbpHSV diff --git a/src/main/resources/assets/tinker/textures/items/axe/inverted_axe_head.png b/src/main/resources/assets/tinker/textures/items/axe/inverted_axe_head.png index cd9dd3a80f21afe319a10b1fd5d063913d80fdbc..46149fccd329eb8eba599e572b9da05964e91489 100644 GIT binary patch delta 175 zcmV;g08sz@0oVbMF@KUtL_t(I%VS`mHJHAA*Z*liOqS+3yY~K9x3RCa@(-+?zI``o zhRol0;J=Q8Q>}%sf33BD5ZI9U`wkLs$cp19|LZ%u)*86F*IEZa4DgIisGYTAFY$(e zYy@HJfZ$s9n7CToz>r#x*m$5JBzkA=-UI*V?B4g^D=wkd1}JFQd?25!KwSWI%_365 dVHAuQ008w)NKd*WF{=Oo002ovPDHLkV1ioASaJXW delta 211 zcmV;^04)F50sH}wF@Ls6L_t(IjbmV-HJHAA*Z*nTcl{?z^PF9K|Et^B*IM}p)=uBP z8>=BqxHQk-ci{how$?g9K>-Fv21bU(Gp5ze-**th5S#{Za&j^-Gcz;%`0;~*fe|9M zYX1DXSv&Tk7{Z9p3osk!Oqx{3!^6$+?dvxNZXRxipy-&UG)xayMg|531{QnXxLVu5kXnz}c%UI9dS~w5 z1OMmj-uK@tE}_;2XxMxppR52~0CdeFQo~^sj0gY#pZ7s`a1ZU}D*ylh07*qoM6N<$ Ef-Yc4C;$Ke delta 183 zcmV;o07(D80pJ0UF@Ks#L_t(IjbmV-2bi{f*MEvMTlojpPT#&8t07E;G%uPqwT_X2 zkzw(SX?64W9mFsMuK^4U3=BVh{9s^Ugs@l5pI>o68Cs{8cmGXpCtDI-EF!cXa>&002ovPDHLkV1m=2Q!fAj diff --git a/src/main/resources/assets/tinker/textures/items/axe/magical_wood_axe_handle.png b/src/main/resources/assets/tinker/textures/items/axe/magical_wood_axe_handle.png index 30d912c228f15f590bcc8a8ab1cf69865765fc7e..8071a2993607e706addc2f1a51de061b50aeca69 100644 GIT binary patch delta 84 zcmbQq@{4)HIz}IJPZ!4!i{9h}307wol`6?U_9p(1?K_t3fA&ts{FAAE4u_n=SrNmdKI;Vst04{viI%qeO~X|B>S>WA^Y9ALgl*x6COE# zHaQ@X!f>;#!N5bAr#Z%TT6sbo)6R}X4yw_gH6*SvFkDD+O^hmtlwbe?Pgg&ebxsLQ E092SK#{d8T delta 148 zcmV;F0Biq_0lfi`F@JYSL_t(IjbmV-HAwU__@C%y@E?~v6Cuq7Ie!?W#rPO-8G_RQ znC8{1gc$gFIB*(**99M6{9$mjd&R)Oz<|>b7F?R=Z@a+AzyMJ!E%pO0UXb&Lfq}u` zKSUmn0SH4F;Iyj#*WuW7Di5Sg^AwO^$LeKyP1_p+c=j0fq z#rUuqg4Y0;?F1k^zt;Zdpl0K~#7F?NG4|z%U4-O0S5RxPY&?iG%on50H3+Zc)0l&D<~< z$+m36&yI)+5o@k}&d(DTk?OreW`e2?>L-KNT15o7JDAxq)GL6QZ_!t@o4XfyUEl(C WSrg3smi+1f0000(9^@;0?jCD(-D!E? zz(P_?HXp`X!rdv-B!+Fbi0~ce&zn&OzYb%pTWhd~T5CAxz&QuyNA__vD5q~5V<3cp_a3!YJT&nqg9gy+>$;+~hEfWa pWf?XTdnp=1x&-dRy@9{lzz4U`FD+8W(Qp6&002ovPDHLkV1jlm8 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_binding.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_binding.png index c4466571e12ab2f4652aa0d24dc05fa40cd2cbac..f1f86254e631c7417ec7db875678bef243564434 100644 GIT binary patch delta 87 zcmV-d0I2_x0d1k^zt;Zdpl0K~#7F?NG4|z%U4-O0S5RxPY&?iG%on50H3+Zc)0l&D<~< z$+m36&yI)+5o@k}&d(DTk?OreW`e2?>L-KNT15o7JDAxq)GL6QZ_!t@o4XfyUEl(C WSrg3smi+1f0000BdOZ2Uic`t<+I%*>=2AR{C5Ut3!njKjmjNpk_n&mfy&wv!wNAlpFL*x2|# h$R+d-{ZW7$006HsF|Mq02yOrX002ovPDHLkV1ivRJ3RmZ delta 179 zcmV;k08Ia!0nY)DB!8AkL_t(|0qu}I3dA4~gi{_dL>N{At1)M44BdOZ2Uic`t<+I%*>=2AR{C5Ut3!njKjmjNpk_n&mfy&wv!wNAlpFL*x2|# h$R+d-{ZW7$006HsF|Mq02yOrX002ovPDHLkV1ivRJ3RmZ delta 179 zcmV;k08Ia!0nY)DB!8AkL_t(|0qu}I3dA4~gi{_dL>N{At1)M44>6T5Q{foHM-l2j<>`>Dx*vaL(bJ!?G+0AvhqVbbyKdGRUOq^E{*0 tic$)uY3jn1JrzAdIt^TnYXg6^ffw!REF2cpP+R~2002ovPDHLkV1gkeTbcj> diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_handle.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_handle.png index 572202286687d709613a1a01f5ed45e54cd140fc..ae70310768df4629f59f2d929eb50adcfcf7a471 100644 GIT binary patch delta 116 zcmV-)0E_?V0g(ZaByCtpL_t(I%k7S#4ZtuA1TA?DgK(2a86q$W_AZ|MOS(Y6s8Wxg z?#zBZz?_q7ElTnjg8=C6l*<4pmu0!TdCt+cUzIbH5%FBEDgw~A_uksJnOQ_=+cy_I Wm@PWLU7?o%0000YjFkzty(|la5I&k2NrUbCUeSi&jn50yO*JCT&#(pn0000(9^@;0?jCD(-D!E? zz(P_?HXp`X!rdv-B!+Fbi0~ce&zn&OzYb%pTWhd~T5CAxz&QuyNA__vD5q~5V<3cp_a3!YJT&nqg9gy+>$;+~hEfWa pWf?XTdnp=1x&-dRy@9{lzz4U`FD+8W(Qp6&002ovPDHLkV1jlm8 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_head_broken.png index 3e3f72621521b74d9d7d125faf821e36bfd4335b..e496ccb9e932a24bd45e56105128a1f0afd01745 100644 GIT binary patch delta 125 zcmV-@0D}M90h$4jBz9p*L_t(I%VS_50GOGX|A&Nx{5LQ#_|HHp0BJNbGWtJ#`gAY` z@rl+fBO~)4gc}>6T5Q{foHM-l2j<>`>Dx*vaL(bJ!?G+0AvhqVbbyKdGRUOq^E{*0 tic$)uY3jn1JrzAdIt^TnYXg6^ffw!REF2cpP+R~2002ovPDHLkV1gkeTbcj> diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_back.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_back.png index cea1c937fd083f80119b3dcfdfac49d171c7e6eb..2db0e2db61775be63eba4b1f120aa56968130420 100644 GIT binary patch delta 101 zcmV-r0Gj{&0pJ0Uf?i2UL_t(I%VYTe|33pIm|Tde8AtGd?00000NkvXX Hu0mjfs*Exs delta 129 zcmV-{0Dk}A0sH}wf_i01L_t(|oMZg||33pIfQ2I6bT^=5<(mI8e0&Tso^FgJ8_>6A z{r?N+FV+3g)oCKx1*`V#|9|P)%{ntvqo$(Z07hgvq6`Rgab#p-V)`HAWY35$N3<8P jX(q`4Twv6IVPOCOJ(C*FIG7eM00000NkvXXu0mjfE3!J_ diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_backhead.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_backhead.png index 9d21b13349397ff4d54ef3fca0374555c0530332..0c94d5f111b053450253d184e7e644579739e6bb 100644 GIT binary patch delta 157 zcmV;O0Al~f0+#}if`5QXL_t(Ijbr%#|33ph+%ad)|E3wU!5Eu7Ud`=5&AQI6wOaO0 zwQ5$jwN2AzVHko_bIUAbTsv`Ndssn#(%w$>pswl*Lq zAB2hb0?4UGKpX8NqH95Z$EBH|7n-JH4>+O&kr+H`z^DOKF%|#-WQO95yfLZP00000 LNkvXXu0mjfz#m8j delta 204 zcmV;-05kuW0>%Q6f`6|`L_t(|oMZg||33ph&^dSR|6hL~YHHI{7}4cf@M-PLDe;NM#{>{Mf@BjbW%v2OZa2n7$d+z_0D_7PDi;6QaGBGlIdjF1rnT-iU9aaOH zrqBMra@C4DacOCW|Nj^m_=SW(xTz{RnK&=}GW`4dk43@R!J+Bgl`9PECr`l8 zjMD&+KbcsV{{Q>?A8Wu7GynvuQ!$-Ok^#hmQ3FN|0096!t~?E zucec813DKh`R|>WT3guO{hw?vbj)A;e;CBVr~!l3004X7_o-FXRcr1OSUY1Ci3UtqwCulId`hinVp^@Cr(f;dHET%I?3 M07*qoM6N<$f(WxmqW}N^ delta 193 zcmV;y06zbi0=oi`f`6n*L_t(|oMZg||33pIfQ2I6L)U;=tJi`9E-f^ekz@l>Ya0LG zyL-3p=Z_x@|Nb-lC&_^L;!2Rsb=*9>3}3%|VPIq=(F;ZfdJNn4?qgtPVq*C9_b&r0 z6A1=PT)h1M-or=hKi`aZ!xuVnZ|~Qq=$ep?Nsz`duF^00000NkvXXu0mjfjN(-0 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_fronthead.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_fronthead.png index cfa203be2f47ea6767f0234d65439432feb13f27..f58ffb7cb9b80b824690a3c15587ed9180f20aa0 100644 GIT binary patch delta 155 zcmV;M0A&BN0+j-gf`5KVL_t(I%VYTe|33pIm|=t(Fmd7H|C1Ii{!f+xNwp3C9iroE z&4WT~L57g5IkC2(HmtCu)-EcxcE(~74VVhl5K&TI3&M`E3AHm9FCkv@B%tP?yu#Y3 zvdUWL_@vrdi-f`6MyL_t(|oMZg||33pIfQ2I6L)U;wi*?{D_ z#{c*3-K+cl{X2;JpCki7nt^dvCnhGw@Z#l51~x_#yKR^8GX zj5FH1F$}?}IkCR!e`ZH_tyN%1t#wdHt-h0MZDK<+aR#I`H2v4HbEvfgYRvBJsdbM} zs`W`pC*BKbjV=F;UEOQ#L&Iv*TRQ%GC#7Q5jMobpO|AbkTO`_XY9uNUiNT`=j2b`{ Z0{}jy-vw(Jdn*6{002ovPDHLkV1ienPVWE! delta 210 zcmV;@04@Ke0?Y!Cf`7G1L_t(|oMZg||33ph5L;UL{~r^Cy|lBP5nY}IpXP+RrvImp z9j#;d{}0U1?CAMFy`lug5S#`iH8lU{;^wLo78hq=1Zw&6;UmM(pFc3vVKpGNvHAb$ z{rl>KL_`=2Ei4%BT)V~~C?wo8ufB#jFEBAOF|f0=_uE zaT+kQu9`8kx$QqA6BEO<>T;|a@frXE(`&2nY9wd?v0&7IQ3F5#03bgz_(5q0LjV8( M07*qoM6N<$f;M1& diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_handle.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_handle.png index 57b359206c5fe4398fdabf1d2e801e4f539e5a1a..feafc4ce1978e430ccc92d42751e019208ef92b0 100644 GIT binary patch delta 182 zcmV;n07?Ja0Sfe{}!8I*$OqCX!uHGIi$v8<#KDc?bG6H6DcRkP>)KeBIMotw8iUd>ny z0BOE*{z9EQP;(;z%@_vc_DlfUytghWIH0MP2+b%4WOw)fzgd0lYMq;pZ&Ph@GEti0 z2ITfk{D1twfjVa|ucpqdG@>U+iMJVU06)ur27f>ArWz8Q ajSK+oJWa67Xe^BY0000^e|cL)uy4M@+a4b0B3 zO>AnbjcaHj-V3#}=KOaIi>UQYNv{PN7T?s0RWn{M)X$##za|D~5TQWED@hCk diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_head_broken.png index ac073c4b939868fedde1182bca852f6a9a6c2c39..0ef4fdde6d5da3f9ec4e12954d7f79c0c3b28bf3 100644 GIT binary patch delta 173 zcmV;e08;eMi??V^@z_RSWCdC}ItWEwB17Z)93);^tKwQ&w5) z92QyY92!Bq7gDP0{%hMh)S7$x)FxHc{&$Ov!KxXr7t(9$|0bsaF`+=lD@hCuK5f`6__L_t(|oMZg||33ph;Gb9gpOuA)frW{gVMR{|Bf2~bA|C}OLo-eT zX16plX4E!-gLh_g16GZA4FG`|1T+#ffLJhUz^DNr004wTE5gCLVNL)5002ovPDHLk FV1i{+QC$E4 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_back.png b/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_back.png index 0d51742f9f5598c065dcd22d5f93724ed1934fad..7321bae866a46dde907aff2570dba2519c89cc7f 100644 GIT binary patch delta 74 zcmV-Q0JZ;s1n&c|tpP$UNklX@-Cl zADXA}|N4GiuptW@f{8Z(q!6S5WHZPRknJEgNw$MD!E6Pw$?`v00XGUp!GHh&O1jGcetpR_6NklX z7>Z#84M_Ad_@5Z^gMp2cks&nf9fOz%FIIKTxHLPMDKnhD$jBhc|C!;?AsL2euRbwM zT78muFT8s5nL$-SlwtlF4h9AW28NaehcGnb1&Lk;|FQXb6pR>x!3h8d10_V%FcPQ$ O0000~yK~(B*Cg1HZU{{C z#cewOL2Qx@0BJZhPvigf{kmX7NHPGV802h_3qXdDWjn~(WI3HGp+5?60{{i?I+8Zv RA-Mnm002ovPDHLkV1l}+F5LhC delta 165 zcmbQja*}1kTE_ZzPZ!4!i{9h}3D%TG7yah{opEgcB_)8s^Xi@ria-9ZHlHtPSNHSa zhc8#v+0=?mc30Xa2ZRcwCL|;%oNZuU{?2HIv~5zta;=gU&JvvKvFg$znGuuMqS^jQ^BH14cTmES*P-0*>aY<|8w8Ea9 P3_#%N>gTe~DWM4fj{ix? diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_fronthead.png b/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_fronthead.png index 9b7452e3891953a2bbc40265140781d74297a78b..a347b21055a82a7aecc71694cc5e1aaf087386b7 100644 GIT binary patch delta 111 zcmV-#0FeL51e64@tpR6JNkl~yK~(B*Cg1HZU{{C z#cewOL2Qx@0BJZhPvigf{kmX7NHPGV802h_3qXdDWjn~(WI3HGp+5?60{{i?I+8Zv RA-Mnm002ovPDHLkV1l}+F5LhC delta 165 zcmbQja*}1kTE_ZzPZ!4!i{9h}3D%TG7yah{opEgcB_)8s^Xi@ria-9ZHlHtPSNHSa zhc8#v+0=?mc30Xa2ZRcwCL|;%oNZuU{?2HIv~5zta;=gU&JvvKvFg$znGuuMqS^jQ^BH14cTmES*P-0*>aY<|8w8Ea9 P3_#%N>gTe~DWM4fj{ix? diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_fronthead_broken.png b/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_fronthead_broken.png index 6a38d37ee0bb04e48897b28eaba59ab5294619e5..f36980ab1a4c5caf23848d40d139fddee47deaa4 100644 GIT binary patch delta 108 zcmV-y0F(c_1d#-=tpQ|DNklX@jJc94@{wu0DX`Jb$S8wI0aKmY(|B{+m-rx}s} O0000HxPscD?oipb$qBP$&rFfbv#&V&;mcKZwoF4iHXvx5#@gQT{m^Rj z`H~@`E|L;J@T1aVL)I~FkOj$~KWj*^HVZQ_Jl9jWsLB7=?l=Pwc)I$ztaD0e0s#Fl BI!gcm diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_handle.png b/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_handle.png index b47f63c76bf97a7f0312bc04060a9823af8493df..7b7be9c4c961f7917f4cea5af317efdf8c6dc4a0 100644 GIT binary patch delta 83 zcmdnY@`HK9T1Ia(PZ!4!i{9h}307wYl`6?U_9p(1?OkU%n*24@&*4yuFD~!9&2ZDE n;GCNE7RLv_>S8~cGBYw*wOX+xE&F+l0SG)@{an^LB{Ts5`THJo delta 143 zcmeytyqRUgTE_Z9PZ!4!i{9h}307wYl`6?U_9p(1?e!|voMs6-*BP9NKkT^gY-b#s zMQ(Zm5FA;0^PtbnhX+>f=J~um_P{E(<%~ed|68XVkyv-P+BLwKxk}^D vSsUXLD`{2%>01^Dzy96zBs(o3fq~(?r){t74kmL3An;^&^>bP0l+XkKev3Hz diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_head.png b/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_head.png index e8eb69fdb4e5bd1088094ea2d1f7765207cd71cc..b9142d1c7f4ad538b9bcb13a1b94de34bd3c2e29 100644 GIT binary patch delta 113 zcmV-%0FM8}1eOG_tpRCNNklX@-Cl zADXA}|N4GiuptW@f{8Z(q!6S5WHZPRknJEgNw$MD!E6Pw$?`v00XGUp!GHh&O1jGcetpR_6NklX z7>Z#84M_Ad_@5Z^gMp2cks&nf9fOz%FIIKTxHLPMDKnhD$jBhc|C!;?AsL2euRbwM zT78muFT8s5nL$-SlwtlF4h9AW28NaehcGnb1&Lk;|FQXb6pR>x!3h8d10_V%FcPQ$ O0000X@jJc94@{wu0DX`Jb$S8wI0aKmY(|B{+m-rx}s} O0000HxPscD?oipb$qBP$&rFfbv#&V&;mcKZwoF4iHXvx5#@gQT{m^Rj z`H~@`E|L;J@T1aVL)I~FkOj$~KWj*^HVZQ_Jl9jWsLB7=?l=Pwc)I$ztaD0e0s#Fl BI!gcm diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_handle.png b/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_handle.png index 65533928673a4599d0fd8d89f407fc87178c2187..6723b29bf87716a23396b40c99a9ecaf96d14423 100644 GIT binary patch delta 99 zcmV-p0G$7!0e}IJBwR;HL_t(IjqS`a4FEw11i(wMu|4eu31|R8DBrX2q59%Rz?}0u zzcw=>DKpb5$V_#&s%jUwyCPyAWTr?8z%BqF03x{yzPj2?7`XNS-&g3e9TiTM zA_cB|lKkfr&YTAR-9RaYDJ44R`1a{#nK@^A??Do^Rx@{7fH^0|7?!* zQkK<_j}Gt)L^xr7*jEQo1`!z~yfy)~8Jhzro`8w?5t=^t*gt+KK9!!+fiuK&;Q#;t M07*qoM6N<$g0qmehFxrhE}VEN~Iz$g(JuneBWm>(FgT?v99aF zFbtf}XL8>pS5By^DyGvZdc7XT<1wP) my4`MKC}9V5p6Z`B@ChdRk`{iiPmBNn002ovPDHLkU;%>d0=8NJ diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_head_broken.png b/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_head_broken.png index 806cee72cade4a3e9fa4ea983d7e9216be55749f..abd569990af0547e67d4e9c35752cebc8f0c4421 100644 GIT binary patch delta 212 zcmV;_04x8G1MdNlBYyz4NklLHSzVDS>YrUDp7-gC!-EM6ovLTrmUsByafiTd8!VOWHbCHkME=ONjiLL`56ufH`M!aN$$-lM O0000-4@$yVD7#1I5THX@Y}EPQ-kaETC4c| ze#h~6R4&fvGe)BkG))t%94b4T&1%Ciq=2!aC@`5!pzAuu<9{)dBtf&;M7!O_!@q9iB5tA-_k@oF&1E&%Yh9P>r z9#dk6!$IyW%VdCJAPq=;I2;PaPNyT&Se@s&G~x91dM$b1_mQS4JkJxXtU!?*#{mHf z$ldq*Jzd$K`EEFlvD@viSS%#YL%MMPD2l*>SL*bGAovotEX!{U-q~fjT!IZQmkTzV zjfgazPMJc#-^YADm%Yh~LH?Cb4fsTZ=U_0XdA}M(WU&I0jjB-^DF6TdO9egv#y6vJ TlHD%G00000NkvXXu0mjftsb=U diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/inverted_battlesign_handle.png b/src/main/resources/assets/tinker/textures/items/battlesign/inverted_battlesign_handle.png index 9e3a6e00368832d15b2635a8c256944feef86fda..7ad1082442dbdc72ec11b758d2f38eb8c211c41d 100644 GIT binary patch delta 118 zcmV-+0Ez#F0`UQmf^S+$L_t(I%VYTe|33pIm|@g_Q3GgdfVHpxe_aQs|7n%g|H(4I zEi&f6nuS$uT16F^21LdFSGTgMO(oX_&f!u2wd@>gQ!B_cAg!wIe_~1b|KzfY|1^yS Y0PhLyWs}v>Y5)KL07*qoM6N<$f{xcYhyVZp delta 139 zcmV;60CfNH0fhpPf`4vFL_t(|oMZg||33pIfQ2I6qXvu`K*#_azkvUrK7VGgw6tWH z+1A2HvH{#YybP~jzpi8W|G$YW7cej~GB7eRG5lx5X*qra{{H>Tz|6wRz(63c;WR*5 tS%pDPR<`NizrW-eFtfE0zuTbz0FLt;1q8kCk^lez07*qoLXr<7_%ZxKRWjf;>%LdE5E-fnx zEV@1TUwW#Spr@ipkRoaR$ZnrWf}Gc&mo_Z+x$&K~&Y7C}jmmWoX#Mbr%wCW5c8An* zg(Bvc#8@`BNZu^dTD?gsuRU89{Q#ufT`KMFV-0#EKuEMLRC^TA- zQW?BV0#XdP(kzrR#HVK;g!MVL>fzgjb@7Oz3l}r&#v{qLgLlU- zbh@N%n1~fiQ1V4cd?;X~vCLZ14J;;f1oad`JP-3PyiNkF4~s-DvGK%uVBL-^x_KMX p^j`tmp_+NiqpZ7EOzx&!fTL1t607*qoL_OH@%5$A9O(I}Rh`rWpweXVUk=QLt?h?!=&$ zeTi0WT1N}<`v{6cR3Z$xZrdFLoljtDI?lW2o)&Kkt!0}Q{WfQD4*&DxaNsWyfL9xv zR?9N{l;_*|1(z3>q*M(!2bvO?F+JVj`fAMEH?LXgbOgWyXn#!9lf4^+FN{VbVi|vJ zc)q?y_YqWaj@~T?*I%a?zVaM_L zK~$yF?ckiF@qed*@nZEU3WN|?n!85{hzPy;E)F;v40tr(rT_U9{XJl+ma*4AB&y;> z*xo;&EK8hogb=`t%sI9`exluKS7tW@M1(u77M2pKiY6t-hyi8^ONMt25h1GHG7x~_ z$+#AQ($P(G7%CCc-q&fUzHt>-J@2J%b9} z!hli-up3PT84!)5*y=z{3KYndQ7pst12XNNw%1iM$?-#OB`VkhM$?;Q%=q%r;Wk8=&pDQv5kauV!)(J zlQRB+G=iNb;7>^7&j>^m#3Tp@)~WXlIj>47k>Gi|^G%BL!YOuXEb=xpyu-Xa3Xo}Ljek~zV+S_NRkBT*JO4U2XH4%QwlR`^%|;5 z`8I)>^Wxc441dV7jD_hbazI3A%+yifwAEs1rcU$QId(f>q!e+`JfSc{Mfmjfm^{x> zRkADtcOq3je*VHlb)ru;93Ub*s8;b1Ff%L|MN!~@d%%Met0E#4W;X}~pmWx71g?Nf zz<^%{Zbq-yqf#jo0i)MP8wKXC|KPvwgZ=>P42ifvI}Sfu00000NkvXXu0mjfg&n?l diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/magical_wood_battlesign_handle.png b/src/main/resources/assets/tinker/textures/items/battlesign/magical_wood_battlesign_handle.png index a069820edeeff435edb146c398fcb268d5f12f10..836426d2cf8b51e85c7a6fa87a69a81883bda525 100644 GIT binary patch delta 76 zcmeBRET3TLX6WhS7-DfcIYEMTaY8_|i+=NeZt14~%^90`Uz{ske5S$qvx$cBgI{&A fr+69?XR($^ZnOu6{1-oD!MS3*fdK~y-6V_+BsqhK%qMqCn!UIzai%#;}poVv>}f7=C|>X`7E z{_4$Vf-b;ofVt5l$_x-yWTni2u5M<622czD!fOn1r2XW$00000NkvXXu0mjf{8A?4 diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/magical_wood_battlesign_head.png b/src/main/resources/assets/tinker/textures/items/battlesign/magical_wood_battlesign_head.png index 67ea01929a2745a7920546755cfa16e7e1a7dc95..12eca2520f99609e1216a09bd039cc8ce38d32eb 100644 GIT binary patch delta 128 zcmV-`0Du3M0;&O!F?nQ3L_t(I%VS`m2B?m*{Z9%`^fLI5VZinMy8jQ&)A-+;>wy!4 zcYv6*G*2K?DF~)Ci^XI6GVb0000Qm1Y^hw#-68<8i3tt^tU{ z6whzdao5CQO0{mVoV5zj0^o5d|NGBVJx8?GFe?K2K0b{`!7h z>;}LzFKh_LiD8CdHGq(2WJ53v0Qn1Mz{PDkU<|Se#s{%MG*JeS?E+XB%&hjuiE)Mj o$N*62k{t^m0a7u;C>TTl08`xeT?W_MFaQ7m07*qoM6N<$f_~07DF6Tf delta 240 zcmdnMIFo6DVf|%K7sn8b-sFS@0tQLKYx*|*?f1XDnSZ|Iv;5r$P8a|X1J`Qbf))m15i%FM^etfz(9c~!D-r&72}XJ)YbB*>@_ACJnn{qEl)$#W*psHWy)dt+vNQ|rS+nx#C>kr!Amh#vge zzhO7mJJ#UC>^%AR>QaAv{LSz8=h@qEHlWCjSdi5Tr#>(o?mxjG#x22S^ZSFOl<65B n9v=Myse-3^?0!1~4JI%!_+1b7PULyg$N&VMu6{1-oD!M<(%fww diff --git a/src/main/resources/assets/tinker/textures/items/bolt/bedrockium_uie_bolt_fletching.png b/src/main/resources/assets/tinker/textures/items/bolt/bedrockium_uie_bolt_fletching.png index 8ab8093984906a46375bc2ffe8d76d6314d637a7..d9834d79b15fd37c8a38d18648ec2f038c728ac1 100644 GIT binary patch delta 100 zcmV-q0Gt1&0f7OKBwa{JL_t(IjbmUK1;ZK0%F6yHOJjI=_C} z;tb2k$iUD{wl_e)&(H6_k&zL327p{bk?l4%Hssq*cK`sSq!_FKD7E+i0000!Ji09UCezlJd>} sYjZl(T5s#%FN|lz7$N68mR=lh^7tE48P45700000NkvXXt^-0~f?YB@+yDRo diff --git a/src/main/resources/assets/tinker/textures/items/bolt/bedrockium_uie_bolt_head.png b/src/main/resources/assets/tinker/textures/items/bolt/bedrockium_uie_bolt_head.png index f28f9a0701c21ced4816cea6687b98c98b138647..bb02b44299e2bdc161af3db759b1ed8c7d275533 100644 GIT binary patch delta 84 zcmeBUESjL=XX)wU7$PD0_Mjs#g8~op0j?-x)y)Bxn+72ZqJEx1|@$Yq87+p00i_>zopr04if3UH||9 delta 112 zcmV-$0FVE2jscJ)YE?-@K~#7F?U1_(06_>uy{*PTOR)tDu@MWiA3YE@*v#+_*1#XU zQ3n1OB2w;N`}1cvlgiAs)`HB0h-kLc1Xk6)iilulWA4x=umY@0y@-SeXlaL%W-cJAu$WG zl$27U-unaM9oUXUGx*jTg%B>y(7Xh|?3|-926^w_nh~%Fa4UALm5$^1*bFnU`~c=s g3dIh0M0D{}XpoU;tec5&$f~^~nAU!ubFI002ovPDHLkU;%b|AL_t(I%VS^|av(A%@4tOez<;tdho)!#_l}LP4N1!+-GEtZ x*8iWnd}VD|X7+!woxg40zW)rPU=$2W003^i6pcP^?^*x=002ovPDHLkV1k{vD5?Me delta 123 zcmV->0EGY60rmlqf^=U=L_t(|oMU955U|kQfXJM@|IeO1VmP>N10%@>gr;Zy|Mc-= zov4Up6Ui=^wPyYQ-@kv=9XxcXY1QxPh+zN#002ovPDHLkV1hYtIu!r_ diff --git a/src/main/resources/assets/tinker/textures/items/bolt/inverted_bolt_shaft.png b/src/main/resources/assets/tinker/textures/items/bolt/inverted_bolt_shaft.png index 6552e25ed9ebf09b46dfab73d7f5a2330c00a27e..384f58f12f07248811d24782af5d4da2a6c086c3 100644 GIT binary patch delta 139 zcmV;60CfMo0)+yQf`4vFL_t(IjqT9O3P4~GhG7@XPKlZ=In^I>NLGsE_%rwSxdyXP z%DaE2uQ80jcZ#M3PT4?&lX-(%w^V8U{6NJFGl(cZ1h`{{<%gssxMzkPr_@Vkk9@*a t8LbjL@C7d`Xg@aD$32xpOYwKR0bw^giO82@RR91007*qoLg8*7>YD0Jng0G5w&OKmE>QD@OIPbuv^1J>1F&nxX~1Hj=8M;F z)|qK*G{xeu8K(iuw`}@<>CU}6OEs0IU;>&k3|O{h^Z(2D9z52WDabSh5}_HxfGc+% xFqkVyH~9wy5v3W!fVP5MqBUYQfE+-v0Ra1uJS;M-od*B_002ovPDHLkV1kK+S}*_r diff --git a/src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_head.png b/src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_head.png index 3b0302a0f0247fca5ababd8702146cdfec90754c..8d162e00ff6efea91d4ea7fca2defbc86b997c07 100644 GIT binary patch delta 71 zcmeyz{Em6UdPaLKPZ!4!i_^&o5=9CZPd~8dn7sDque#VzJPespHw1k4y)|%di(Am& bG?9_v^-Uq2tEW#WFaUw4tDnm{r-UW|Ti6}d delta 87 zcmV-d0I2`&1O5ZBuK`awNklam%)D+pNUk>Wu<>n#287@>|mzM taNyKkhWXnr5Umfx5VACmf>A(o008(u5L7Wu{(}Gj002ovPDHLkV1nOnCBXmy diff --git a/src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_shaft.png b/src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_shaft.png index e9e0caae15607d7556c0eb5e655c0bd24ef45e2e..cbaf17aaf6aae461c5d4fd6642786327bccb5bbc 100644 GIT binary patch delta 82 zcmZ3*@{@VPdPXl(PZ!4!i_^&o60BbsJLA~?^Pj!^!+&C$fbX2 zNl6L$hJZAxtE*Gy3Xo=yD?&m-$TtWS9!^e9|IN(Izy^`+5)h7yi^FdS$ToZmU*Vi3llpg}@Z zKuh>3tV9Myq)K7Lmw@~C?sU+#{%Hb?vAnKp?(OORo?xw|d7ir=2V)q9EQH8CklT@6 z4oDowkz$NwjQNO_aCM(dfN;)9YfVb2ub>kEWmp;LG))vjphsm{NJ?4t!P^X=6BxE_ zqm)t`f@=G|HzyAe1XxY4Z}i?1Ks5t~3DshFdpPF^!sQn|0sq-RZ{ne$umAu607*qo IM6N<$f~Fx{&;S4c diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/bedrockium_uie_sword_blade.png b/src/main/resources/assets/tinker/textures/items/broadsword/bedrockium_uie_sword_blade.png index 9706abb96e2bd73582a10caa30bf615b40d08804..513da17d3f3adb9627a0f2da9909f71cb4af9cb5 100644 GIT binary patch delta 145 zcmV;C0B-+>0<8g%B!6^CL_t(I%k7cD2>>As1O>q=?7&Y*8F_0#_K<#aY(Tj0-hJ+I z3zARP+0{}WsP`T?A`-N@)*5TAFtfabGJ^>7-a99i05nyNF-A^`j%9aGGUl8!sMxKw z?2OnH8Km=IuR0?E-T6+YIv;@yGyc8&`nWFTZA?f%z{l+X015yANkvXXu0mjfTu?y| delta 235 zcmVLrfq|*1 zksz1|8qM(p!C>#ui!N|sU|8n;W)yySVHgTwp6B7k=1ys?B~4Q-%Yv@!pznZ_B#|u3 z5XUj*dB(b~xEz7Dec#8nZLn<{<2Yg%26ZU{!BtgZnkKlei)5y0(6;S0aoV;lOY%II zvMhyU=h$Bz6h$FQDFi_P$8pg2{cihA@X-d9j?4tIXXZ1Qy^(<6<5W}@5!7{UoF$2| lqA1!k^X|rh=kt#?@CM!pF;eS5ncU9>0%LZI*a55mXM=;Rpex-NX*hhwlSn*01;Uf=~`y-9PW-VOi&0000{y`*B2Ub35DJd)bSX+{!*oKB6B*L08~}00000 LNkvXXu0mjfc(g7t delta 165 zcmV;W09yZs0l@)~B!7rWL_t(|0qsyL4!|G`?PhUk1i@hu9EXJaaTpH41yC45mm(In zOt2+$kd*ZEUSC^SZ(ZQG3rH!^7=tqc`yE7N?>#7`?xn|g8?)A0thGXG4PuO!+K3zd z6GY04F~~VXO6kmx;3vPY;G9FwIcTk4k*VQMW0z9;*dc^zWga4T6G9+a4?cVcwlXM( T;vV4D00000NkvXXu0mjfiG)Tm diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_accessory.png b/src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_accessory.png index 467962ac841e441d8843d71489381a780a91e37e..f35c6518535515005d7f492f8697a5bf59403108 100644 GIT binary patch delta 196 zcmV;#06YJO1HJ-~f`6w;L_t(I%k7fE3W7isMdw3X1n&BPb`K)LRWgQ-O$34qiL_Cl zI?m_aKATf`9NyL_t(|oMZg||33pIfQ2I6qXwWFFk#)M|Nnq=QIH=aSq5;j zurR#%@}+L#y3POdgM5iL1a3gOpBLkV^_%}+e)hC(+Qx1Fv;4h?G6W?IIGI6QMuuO1 z{}Af{R0GoeJQ*1_ZU2Ad-u=4XwVVDk{$pe)3dQdoj935}@_%#V*8k@pKdMs_5oKs! zz5ah?Xdq5QutsB^zc=Hw&D;L}{`-&N*{4r+eZUyP6+0}8w(a=;>(4)i6hG8J%kqWr z+t+OT{~b@5urL5KZWbj`adhc8^e~$5P$q(@E2%+iGp0y*WZ8fsly2X-mYKt UhqW!M00000Ne4wvM6N<$f`uNA!2kdN diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_blade.png b/src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_blade.png index cd5935449ee1313320d15254d434ea656fbe2774..5a5586e15cdaf126c9882cf7405334de5730fc5f 100644 GIT binary patch delta 254 zcmVfQG{=e(mMBAwP*p3by7U+8vfhGz`<%T);70b~}@1dsLy z@)QA~KSV@qVtdgb(AsRtk=X%wTdj((@ZdxU<`nDVBhXOEbsfm>y3ru%bYZ z+qT5haC2;Hik%hUj|sfh2H7(?8o!CHx&t-y7x;m|73+fG+3dTQ-T(jq07*qoM6N<$ Ef}xju2LJ#7 delta 296 zcmV+@0oVTb0-ytsfqwxBNkl@-xHNHSo~&Rzcx9y(GdDJ#S9`Q1APpd*NPLI0+$|BoCvP^YA<%<%E`8wPJH zizaU;Cq|+S=-sg8|MtzB>eRKg7+$@2!QgFg+vMl$#0ZijXn#Q4inagu@7+@;Ei1?H z_SGwfU{~j+P#0%Lm^@wsdN*$Qzjyb}IzeG!hL0aUFa&$KqiDu!z@!~Jftq*MiAqQ? zeE#@>A@dk7)UH-p!*@{}%)STMJISXs+=PV@N3sY9E z`fn8)RqK_OQ)}uMT-yS*nJ5D$tyuYg+N#yHp+yz7eLxogT~_g*=vbHvwK=q)tkyOx zrgq};mH&y3#wkFXfw(p}zqEGtsx`G!R;>C@ayszOD*SIA5c+@m%GLj=nvg~fpn(AZ X3%}rIeFQRq00000NkvXXu0mjfJR)rX delta 275 zcmV+u0qp+Q0*nKYf`9c%L_t(|oMZg||33pIfQ3{Iol95z|MTxZLv?H+(E9(RW1sOiPeZ%ng?>`2jUC_O3#eY^N#yTlEc?KJE zQwE^crkaFk;=C|*)$0EnHf*jF5ENqg@bWnWGc$8j9aJ+x1Aiv3T=k!YiK$LnR*u2a z#DD=908K@a;f%;?a2hZTX!DA-8|$Q{Wf)#Od&aro`Y7g0`a=&^~ka|5Fz()FnnoHzkG! z6Qvn$07&z?O`Gddlj54vf{E7*HlS_#tpDpaZ>md-iv?;X&L-I?1_+A?F{C6UG-ZU5 bt{DUX#jZ5e3#eJ$00000NkvXXu0mjf1;bFb diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_accessory.png b/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_accessory.png index 33fd3eed1a1a51093e63c0da1687a81dd292efd1..8f50755a2209091a0e4da62b62db00e55c99a224 100644 GIT binary patch delta 94 zcmX@X(#o=7J!6=or;B5VMQ?I~1Zy*gN|odv_QWop7v~BW-?0(?&)E=XLL| y|Md@?aUjNNV|fQxgp;4@3(>B{{AtWP*%%n^&3EkmY2P2u00f?{elF{r5}E+;jwI0l delta 162 zcmV;T0A2ru1jq!iuK|CANklzzvwc z?E>Sqd#@NA%#=wogoy|>cmWGCXa2Sej0_A6|I14MGB7YeTmcm$&H#i4gZ~a@$}pk- z_zb}*0SgB$B{7C;_g>+438CmCB+r=WW$>S%EqDME0|NuYwR;+`NYw`i0K{@MwSvZ_ QYXATM07*qoM6N<$f}r6)_5c6? diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_blade.png b/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_blade.png index ff346fb6ca5cf3fa1c6f0890bc8a0d4568f82c3b..0254c60f3ae5d5bc9ceb0988639f9fb87288bf4a 100644 GIT binary patch delta 84 zcmdnM@|$_XdPW~}PZ!4!i{9h}1!k2h$v^Fhn@q}|@A$iaU;OkE=7d@NXD>5cR*^I~ oVyd6RA?GzKu|etV;)Zh!44sMb#dEJF&SL-qPgg&ebxsLQ0Iu>ONB{r; delta 138 zcmey(yn$uIddB)3PZ!4!i{9iE1!k2h$v^EIXP&sYW~s`tfUsZFOPCX8o$Zw~%!$-K zc>n}F`kqaG{zPKk-Rh$T^|x8w7V#WdI#WaZ!DXKd3^URU1>@Sn^X-x|j%70#&MK60 oSd+#UbI}5%Fv+C9=^zsWTSvfmja~nbGXR07tDnm{C#HlZ06FYDGynhq diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_blade_broken.png b/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_blade_broken.png index ec050816be58db3e4eac238a1af94f021fb74f63..1393ea8235f25ac601b2448c0e6c0d7273f7bda7 100644 GIT binary patch delta 95 zcmV-l0HFWS1cn5#uK`y=Nklfzopr0PvU`f&c&j delta 109 zcmV-z0FwXw1EmD8uK@vJldu66Ut-iUVbknjrp$2d-YcRkW5lNUz^S_o^S51K#H|gB z0f}A)|Fx9F7_QxWMYLuVn-9&?_@C%yK$O2RG+*DZOP*$!0c2}tU|;|Mm2oGLuEoXY P00000NkvXXu0mjfl(I8o diff --git a/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_handle.png b/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_handle.png index 24004fb3b5dac922de0aba79b0a0a5ad68fbeb33..fecab16bf2dfeea8df37eeb70548741d3c0a2bb1 100644 GIT binary patch delta 92 zcmV-i0Hgn&0eX-mRzXQbK~y-)V_+BsqhQd2xVX6gQ>IM$PnKo{1%>}!US9tV3=IC0 yrP;{H=)a7N40)PC&Sqw2CeP_0CzE9}r2qhb78UEC{E5HLOf diff --git a/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head.png b/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head.png index 86a03474e2695b521eec44144cddf350b6ae82c8..f82f0ac8bada670cb1be5eed1536d563e290be2c 100644 GIT binary patch delta 122 zcmV-=0EPeF0ha-gBy(O#L_t(I%VS^|2w-4f@Sh^hQ>IM$PnIDvGBW>-jEw$kYiomP zk_`z73HjgH*a&t3h)uH7y}Z2sgIoc^WN9Yb-)wAbq}z&YGs*si*$mRm%*;%FoRj73 cQ9wEX04H%V-Xy;6#Q*>R07*qoM6N<$f=-Ax{{R30 delta 194 zcmV;z06qVg0p0TBGwksrOEAE*W*s zIWoqO5Q0)l6l2`j3Lsf2MLB2mqEgD_vJ@*!TVZb2fPuqREQ?_{A6a0QCVbq3AU_*Z=?k07*qoM6N<$f`N2iK>z>% diff --git a/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head_broken.png b/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head_broken.png index 728c4fcf1fe2367504b4b776a6d00cb06927d78e..1b007ec20619bd7fba486cbe584c8055c66c9646 100644 GIT binary patch delta 92 zcmV-i0Hgn`0eX-mRzXQbK~y-)V_+BsB!Q5SkpE}gK8TQ@-B0{b8T7^t?Nwn6o{4;|}dy}1W xP)bp~16&eQN^Fd2b{>qHAP}v8dYdlr04+}(Lle!HQvd(}2>?k&PDHLkV1iZ3I5+?R diff --git a/src/main/resources/assets/tinker/textures/items/chisel/inverted_chisel_handle.png b/src/main/resources/assets/tinker/textures/items/chisel/inverted_chisel_handle.png index db8aa262c5771ce0941afee7bd9f61e875503f0a..e7f7d6faba3f143a2a495b507148a181ae5b1fe3 100644 GIT binary patch delta 104 zcmV-u0GI!W0^uNRSM@0~{9mRm&#Y_I5x^<_{L0h{iD-_H= z8B?24*GRg*%ewmh`=?~omUMKJp&6(t2&lQNvyXJmC2bx511FQyYAd?>$dB{VrdIMb cj{@QW01r<-E^2Z?EC2ui07*qoM6N<$f?Kv$HUIzs delta 247 zcmVfV|J=3~MzRb@sjB^d;lla4)SCML zvs)S&Nira*qWb^oGiT}q`1u(wUA|nG+t&4;Bm2{E_!++c_{CsiV$w9Zs*HFS zWHmJZzk2<8ow~Ya6Du1l!_?X;;=`bzt@Hn7pp!M#)thEC)o?Q+%Mmo7tgG+;&0DwX z4E6P!dMZj8(dF?PP}b4?{|->Ix~f`JS9uYJX1oTJv~~Qyefu`h&l*h~W!N?2HK3=e xg0Zxz^*=t%cntu7?z(Ecnh6>}3>XFm004ZxO)mnBmBau5002ovPDHLkV1hS5eWCyW diff --git a/src/main/resources/assets/tinker/textures/items/chisel/inverted_chisel_head_broken.png b/src/main/resources/assets/tinker/textures/items/chisel/inverted_chisel_head_broken.png index 904746ebb31c524076f56ccf1abec9605bae3ad6..dbe6ddd1e181f718798e6ba56b0d1b21b3a00712 100644 GIT binary patch delta 119 zcmV--0Eqvm0`dWnf^b_&L_t(IjbmUK1tftfOBVkpTl0jaOaBL^rqxa*$B>@I%l`W% zr`FC`w2*Yo?eiD?cZrOy?OI5N&5bi>|91!tuLaR0Yi^k{@4tNrQ1gsA4QZWRCk002ovPDHLkV1gX7H4*>- delta 173 zcmV;e08;<*0jC0xf`5=nL_t(|oMU955U`9e1Ewrl{68lqmXRz2CM;e0fA4{VbyINQs!vbBsu`~VH7QAqjWg!_uO`pHtr@QYAV5enK?8^Z b!@vLlp&&F5Q2yBE00000NkvXXu0mjf-poys diff --git a/src/main/resources/assets/tinker/textures/items/chisel/magical_wood_chisel_handle.png b/src/main/resources/assets/tinker/textures/items/chisel/magical_wood_chisel_handle.png index 9222a3fc584999341a1f19c3be72aad4230e9679..92a7fb0eb6649bb9dbb07c96e79c7d79a1d13258 100644 GIT binary patch delta 64 zcmZo<`Nq6qEhD4Jv_AgUzC+FX^TJB0C)xY<#ZR|6YruTsnhz%fgKMDF UVwq)gO&EZ{)78&qol`;+09_Xts{jB1 delta 75 zcmV-R0JQ)11AzpvtpNc)ldb_4Jrkpr37cjuB{7Brr|yzx^Pzbf{}a6oh_W3+^Y#6@ hRO&4=b`{3pv0nC9#Ib;&aXq+wx0 rFlCxSG)0=p^7jzbOqB#P3Wx^)xn@4U_Z;4700000NkvXXu0mjfZ_gx$ delta 147 zcmV;E0BryI1GfaQtpR^^NklmdKI;Vst02(S7E&u=k delta 92 zcmaFH+{m(FEn|qir;B5VMQ?I~1glD;i+=O}7fC)#GRh2sj~TQ~6gkW8cQi@j&1hEKN*0))78&qol`;+0FwVBB>(^b diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_guard.png b/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_guard.png index 10f2639a37ecf5387f0adb6b44d3885bc582c4d0..dee0483c2f25c60bb4edb998b5bb356fb3ba63fd 100644 GIT binary patch delta 89 zcmV-f0H*(o0e6rjQ$9&VK~y-)V_+BsqhQbgYisNO>FMeJDKfyz%j>^^fx&-@Tmmvc vMn;A*L)h5Z{)1dZwgE~?O8-HaZV>XAne;ZfQ~%!?cihO#!%juJ?Nd+$9jrkVv(* P00000NkvXXu0mjfTCXRG diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_handle.png b/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_handle.png index 336192f56fcc5b80b65c5a65dec7b82ae150eaca..52c528472296bd89f806ca756a503126175500c5 100644 GIT binary patch delta 101 zcmV-r0Gj`_0fGULBwk5LL_t(I%VS^|1*2e40wpD-|9yRZ|H;y9ZEgKuTU-0Tfq}t) zvTO!vl#!7kU2}SRI@sorkdXgmIXfsQh&*S50LaN?IU5Q9(B2xJGPM^?00000NkvXX Hu0mjfp-w5> delta 152 zcmV;J0B8S#0ki>-B!7EJL_t(|0qu~%3BVu>MZax5xPvEg3kPx=M{)*-Z~zrNr=(D@ zH``MW1`-mIM?N1bmIMEEz!*az1e#SR#zW^El~N$3L`vzg8}G*cxCj2+dq=GmIp-;u z*^P_$o|ICs*1m$7-C4E}06v0JYzy)j_H%9^i zn}gU~a{)V_FF#SKFRQf%T5E_g(s9m#7)GG?4z*U8b3)FU9udPSB?3YS;JugI@gl-& zEi#WW0HcUuY};B3r4(vgY(~r8n=&&j&dhCdW@F5q8R64>l`Q!*BaC|&@0wwr_SHw> hVzYQ)Z&B2L>H!hpX+tnyv~d6c002ovPDHLkV1jQ5O8Ni* delta 292 zcmV+<0o(r00lor|BYyz}NklRj$n*|T_GUwmokpyz_xAJ_Z`c!U>FAW)B)Mlbsc3{!hdyL*tQKtQP8&Sb8!L} zMZslR=4qPpIF32J{dE11g%*}13F^AWx~{jFrU_lwoiL|DFq4XDn%^_`eGjT>X3-<^ z-3~~Z7Ueh&G);r5stCjI;mjuozm-X~X&Q2J>J#deKj;!c0Q#yd%P`L~s;c@IOt?E{ q-}gBY{k1RxTpbD;uH4B!7%aL_t(I%jJ@>3BVu_MFXN!*jv~*gQcZ7iVL`aD_{5rA5w+0 zNt1&^1fS2ZUe}j3#t`S6lv1=~jADif_1pqfO(<7YMe{r>48uT8(|1^D8n=E zUDWPYZ3ZA0MWLo$*EJo-p>=sJq#eSu@B8YJ;O?)<#(No}G2y=x-_xLTH5^Dp82|tP M07*qoM6N<$f*Fl-00000 diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_shield.png b/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_shield.png index d2f4cefa0839a3d46b25ae6c623c80df40b41d92..7828cd71bbfaeeca8bc71d1bd402a7cf166b3bb8 100644 GIT binary patch delta 129 zcmV-{0Dk|40-gboBzk2@L_t(Ijn$H&4FE9=11nYCB0L}@GZ+?klrE6T{ip-f4_LQ{eg&}yKD5S;@+EUt$XvFlK?dGG0U0981KkZ=7=Bw_TKfj jrMC}RD(py}=s)!UY~45@5uyXd00000NkvXXu0mjfJH$Ez delta 233 zcmV<`!nVAV8 z7KFr*$W?-ZQqe?(PR)>f#r}S_@#|rC3*>oD(=>tKDNt1vjpGQ$7}(VUS(cFy0_(bB z7zTE!14T~L6k!;mZCef3*Ee01Wl7t%q3?T5HlBwOzSo%Nd18Ju`#eWX%^U;)B}qcZ zrzN~27;+RvXqv{GYt`JPA{RwLob!+5JqvgmVZUnI%d()ZYe*@*wW*^Ey5W5oPv00000NkvXXu0mjfxkzWO diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_guard.png b/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_guard.png index acfe757fb4fbb6f58d0650307c265753c6fb1561..db75275119e928d709df42b63a27ab0c0dba6530 100644 GIT binary patch delta 101 zcmV-r0Gj`b0^k9Vf?i2UL_t(I%VS^|1*2flfQqi3|5e>R|H(F>s=M!hXm;NJIZGD( zr^qD^;gSDmEn7mFA&~{e|LZ1BA>WX?NmKqePMb-YD@XwVB5oVMPdX#)00000NkvXX Hu0mjfecmjK delta 144 zcmV;B0B`@`0g3{Uf`4;KL_t(|oMU955U`9IFlqqR45;Yp`On12z|dA&!bp|@OpHtn zw;w!Un6qTj|CE?Gk_-VG&{kRm*7W*KwG(2u2{PDk(BBv#=8D089g#@`$q;1^_uk9H>Q>1n2+&00{s|MNUMnLSTYCl|TUi diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_handle.png b/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_handle.png index a52c42ffd181ade015d379b6b9e23723a3d295e6..e81dbf46c704742e3e16562fe6078a07edfd0181 100644 GIT binary patch delta 114 zcmV-&0FD2R0__2if@@YuL_t(IjbmUK1*2e4g0_WA|GUN}{wGUw!;CrqBT6c2m+#(9 zx&h6z=lyq&Pp(}tGbN@%?7uBvHOY`jc{~g1lYL}9u83Y#X+Wmhaxtf6h0CE~A Uz^Oewxc~qF07*qoM6N<$f;yZvI{*Lx delta 147 zcmV;E0Bry50gVEXf`4{NL_t(|oMU955U`9IFlqoz3}{=p^#A@ndl+^vp3g|K0SzE|#zZuQxVjQ$JKTVlS#$qiy>g{4kwnd416pR! z|G#(7?z)te#HI)mHG>V1lb2yg0BVjVLo)~f0IBCIj@_@xKnwr?002ovPDHLkV1j%1 BL0kX; diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_head.png b/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_head.png index b37d55a83345c64006f54190ef71bc451e60025d..4a082e883dfdbc75882b535dbf493e6aefa239d2 100644 GIT binary patch delta 261 zcmV+g0s8*X1O5V#fqww!Nklwkm_ z6OY&w>3ms}_<^s9;(Ll9>_8rWIX5?z%008^f^s1!6`X$gA zgXslZDX8we!SX`{(Fh}Kp{FpyYbojR)j2o!Co@cU3@I;xYkn^_TAr`)6q8-5nuQr& z9VJzpZM1qG-oK-BbH)wvMo4zbtZr_5 z0sLW%Wwyt$_%r|OhU1ccv&MRCSrq2@8igrVI2XJ;z9#24;QyBs_{MyBN%XO;00000 LNkvXXu0mjfnS6aV delta 344 zcmV-e0jK`{0?-4HfqwxxNkl@%%5V3}nrLe3P5JG`+2Gm7z;0MM=!GCQWtK~cqHnM?xZD5=O z*YLfDH=dBg*>oma4$`o@0u!unrn=dKwu|NH7hEa0i(-|I zXM$1!$i=`I2T!j(3jV^Sg8ac&i$o9&ADtY7qt`z`jvNF*0WJt+6sqZDE)c?iunQQu zaBiEjR{<9UX;GSi?btvVUH|o&ZOLB0UkMikpOX*c;_^x{%EW1x%WJ>7xm1wn?e)cY q3PUxl0hbE$4F9>gmY_+t7JLJHVOJ}=Od*>90000&+?d<>ChKAJ!=NHvB&09d6=G=~+|7lHawL12W z|E&W>jSYHh`o>BMQSnKb=B(0_nh14oztHbJ4ap2?}T zd0l10OFBn9s`2PP_qW%^m;$ z{rg*Yc-LMAK~XUVaT#d_Jw5#-ayTs)AA5&i=oUxOkm_hzNs*x_VPZbOa+o z19Cfh{{Q^-t4_z>@jt(iaGj8t1cSc5UQ=CC0wYKsuK|VKeSiP^ON)RuJN)P3<*nlt z5MHoj}{9b3^=<=UOP_T|yP=G;IU9+hpCzBCb9aaNsCQbX_l9$P7 z?Be!cSX8u*UqqNeMnSP@Qdtorx>^ha+UCsr|NYyKI&(MA|9nD1b%LTI3~ImtYstyN z(2QX~*Mdd=%Xbpu7_Gc~{tE(a76jU?siEFfmzjZ8Go}mv|7WoG^Z(ByAXq0TB*dVs zq=Hv7h5==X@r*w4iT^>GRn^phn$z)W#&iJ?Y*{#;v19K1{}suJ1T|wd00fBDjMD&8 c0L2CX06eB;1BZyNLI3~&07*qoM6N<$f&pK;;s5{u diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_shield.png b/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_shield.png index d769b9ab838cd062104f3701f243cdda53bc7251..73bbf6799277a54b105216948f4e877d4deb24b6 100644 GIT binary patch delta 172 zcmV;d08{_v0;U3xf`5-mL_t(Ijn$Ds3WG2ZMZLF<6h-JFrIH%N3Tj#@Q7Pg=jb3hy zf(OWKN#@yTN;xg}c&oxPYND=M1#OiOvy a|7HW$j#<4k5iPp_0000deYSYFF$^&lN1zaBH4hZ znX~_Mad6bhh>12uczQ6BWI!`WGbd-Aw1@~;Gf0eR13;R2xw-2kg@u~Jp_+*{pkeCt z|2#mOrGPevdAKnm%Mmo7VG2+)7bndgrnB)HP%~lDe?Fkipm-*v8LI&;1$m6Cw(t0l&)Ikl l0D&;1cqYpLQUJvU003#MJk!(DF~a}=002ovPDHLkV1neMYpVbN diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_guard.png b/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_guard.png index e688c1239fbfbe3569b97e01abe43cff16347db6..c19e5098f09936f9ecf1ebf861ade51b8abb356f 100644 GIT binary patch delta 72 zcmZo>dC$CIJ)?uRr;B5VMQ?I~1nc623k@#%&HojACNkc&%$p*~#B}}p>!3W2qk0Q1 cY&=*QCaf0Y_L}_lHUkiNy85}Sb4q9e0MsiQSO5S3 delta 92 zcmV-i0Hgo!1A_#xuK`p)Nkl*xuOPG*3nvRzlNp%Smy1=!2uSjtKcDPLbR~}1H(>3 Vg;RIeTYqH$0#8>zmvv4FO#qxz8ub7G delta 100 zcmV-q0Gt2$1Dph~uK@vAldu66Ruik930<>;nKHwHQ+J8BkP%t4mXa95wR^7^=5M>e zh+i8TNc1xJe`ub@|3ohXqMeSS`TBlc@-)K?AX_s70|NjfBp{Gg0;YQa0000W$-GqNFMYerA53?l~s0A>`4cxUYfumAu607*qoM6N<$f*b85>;M1& delta 149 zcmZo<+0C+HJ!5^jr;B5VMQ?J#0s(_bi!3gleqeu-O{Gfm&-EaohE z+{U;h%gwMs=4?c)g6=W*Eoo~MK*n!VvF>4H=&*`qH;;zopr03f72 ArvLx| diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_head_broken.png b/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_head_broken.png index 363caf3059e146ddb599deb78407fa2db2e0bd67..09f6ce9ebfe1997d55d699b7731b930e0650bde3 100644 GIT binary patch delta 99 zcmV-p0G$8U1d0T(uK`;|NklO@bZyHiI-TYzQXbW|B3JG@FqPAzL%LHyB0^000*uh8EDcw-f*X002ovPDHLk FV1jvrCvX4& delta 176 zcmV;h08jsl1l9zwuK|CONklsT~z+mv7iBy|mn!CE0iE{z6%^$z~K+(*=z`%gl1;{pk{PKfARY4R*GXuUr zM7LR0L6qUZskDT&DbsOAJLkzfRvTVC{lK0X2!t(X@t?i?BR=fcbeq{AR($)~(#s*5GfhKN*J55E zc|V@*6A^7$l!%gyh>0a3GwUP(Xd=@0sn9?6a*EH<-P4ts6U$XpwHAHUt?WD!y7yx~ Z@B&)I7`rNj%n$$o002ovPDHLkV1h_JG5r7l diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_body.png b/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_body.png index 7f2058ed0a9fd8b80784bb9f1b0575125a864c5e..2146e4eefaa1c2164a08b9928053353d5827f236 100644 GIT binary patch delta 144 zcmV;B0B`?~0;~a$B!6>BL_t(I%k7b|3BWK61P#JlXaIu?8@z%h&@gU2y22aMq|2Lh z5eQZP+`m%#=ew!3#*ui=8Sc)TsA`l_0#`&hqt;rOS**1<8W`l9w-^hW*CxR4y>AM- y7l;rAoq&oi6^jp1QJ%#fzj%zn$GJ(+$pwR1K8EY|K4$;`00{s|MNUMnLSTYmz(6Me delta 243 zcmVn^ZMvYDNo48ec>(19dL#2xyF4#ei7C{R_Ek;Kvwuogv;a9tPk zJYyV3?E9|8YKtUbWLYMHAV8ky=(-MdU4P)81YSkcH1Ir6LTspN7zTwzIY`u7vTa+W zX^OHeu`CPvzE_kO74YqG9E-MXaZHEfILZj4f)h>o-21+dX_`nTdu8Iq-8hY(^b delta 277 zcmV+w0qXwB0k8s)B!BlwL_t(|0iBYu4n#l@hUYHVdIAlFL=>W-(Wn$^ty1khyoAKN zcmNs_4Tb153WZ`XGl^~7ZFWg!Gduoo{$=(B5>HVStZiFZmW8XwaU}N5D}NHpvY4*x zkR%DDX$tc^gX1_51OY>Yx?u7v5YF=)s;UA_)40U8ZK&&7$bXW!EK3&0F}vKTD6^n5 z>Ri`lhGEcAaW5576sZAHT?HckBhY!FX&Q1Kh5`4=@d?8a)^&w_-<4qm=o7Lm!~A(DU)ASU bck&D7v{WY_2oBO$00000NkvXXu0mjfu5^93 diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_1.png b/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_1.png index 0e19f9d341d1b92cf26787b8d677723fa6069284..b6ca7ef1660981038fc58fe4b83110ad8c91e916 100644 GIT binary patch delta 161 zcmV;S0AByF0=)r{B!7fSL_t(I%f(Y64getxo8ccA3_+u@d}3eN5BT~n6+@5{8_DIG z)X{acK;(dk=omvwDVyX44zIN~Q%XAL)Yh81#kE%Ly>BwJZv%+o1`$PIcZ74!IVMI} z^b6pOmBFwWJzGWYgx{RQf!P356?Qh*%L;dWUg2te8-M_>2O0pbkMR{A@|sqps~HpZ P00000NkvXXu0mjfag;_% delta 277 zcmV+w0qXv}0k8s)B!BlwL_t(|0i{zr3WPum%`RIC9zhEQ5lcHkJcNy>@CF{n+H2To zWg~)(7B+&d?W`}b!+ynag=Avpy(Gh%xzK?xO;gb{4NcP|(S6@D_bM|#0^7EQuIm(r zAtgyd!!VF#S>$=10EMd{_+}u3R1^hinkFHR<4~UG%w;Ec-hYBD%S2t*v@8o%Rke$K zp`tSquImcZGpEUl-7N?L8pn|^zA71bK0+MFh|k;OVVtk< b2lEbs+)-suM-Dp900000NkvXXu0mjfu3dlS diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_2.png b/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_2.png index 6cca867bb4038158fc0718af729e19ac018d67a8..b7fdca011a010b1f2cb2c1bcd63aa075da324fd4 100644 GIT binary patch delta 163 zcmV;U09^mM0=@x|BYyyeNkl%JfdUwClP9r~SLQ(_xln%=djf{}ztp z5F{L2iJB%!61Hs<@ANKlC+mh`AW4!Px|p8IEQ%uLy6&~_+I1eD=V2U2ZhyxvCEmo3 l?Z2dK+y2P@s~G;P{0|qYQ|ZzQT~`1A002ovPDHLkV1nouhZz6> diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_3.png b/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_3.png index 5590fdece3c6140a300bcf302ded7d264680a188..ca1905e1bd51ca000ce707287f33046d69b050b2 100644 GIT binary patch delta 165 zcmV;W09yaC0>J^0B!7rWL_t(I%f*wi4Zt7_1Zh};iiU;(sA*Y(71)5)9la$-ZW0WN zl$Tzv&VCu=+=fz0q-}=A80h6uM#W?^ zB&xOU0iOwz5gFcw^%G&k+YPX^qlM}CNO06ZUzX`Oo|gAdd>(0V9AC8jRWG^#nFL=K TQ)O9S00000NkvXXu0mjf*Y!x7 delta 278 zcmV+x0qOq10kHy*B!BoxL_t(|0i9B@4n$B89CxQs=@b++8ns#!Dz(N}_yesU@)vrM zXe1JaL`f&_ZZ~)0k~{Z~WM%E!nc3M#!5@$7x?^L}J@E`o2fgG|HicJkLc{RezYK3FA1jOxJaX7;YkE zN<7aKj^n)frut!oVfY{5kWJ!n^FzunpLJbt^DoF<`(b7~^ z#j-4r+VYN`C$KCFNs{c!^6BNFEHq66-M3*F^2leW@><@R@ri>ioE?87I6FQOaG0if c`tQ2~(GXY)PY=(SX#fBK07*qoM6N<$f>siRJpcdz diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_binding.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_binding.png index 06fd213f0d5fe17bb8816bdd0c2089cb3c90a0e0..db347a65b9e1a63c19d599eb642d20bbd8fda8e0 100644 GIT binary patch delta 127 zcmV-_0D%9;0{Q`vf_P&|L_t(IjbmV-Hkftf$bYgmr*`&(HBa2Jk90%gY8v61?EM4( zcdy<^ydgcCcEAvnz3aD<=8CTMTmCzQMuIgt_yvLKeo_tT*|`1x#GQx84@4N4 hyqAKQ7zHB|001J`Dz}QZ2V(#L002ovPDHLkV1ipsJ(d6f delta 205 zcmV;;05bpj0mlN6f`70{L_t(|oMU955U`*N%sO)9f0~UABUuKdcJ_lcPu#KZf4+wk zQHH<`h^uM*KfAmTtZCi!$qe1AH~udT^(SZu*npl*JN}pWd4LtiRn`4p)Yio4myq(G zXcvGqcdg&@f7`O93?R)8enJ0>1HBph*Khq_2&9SfLRp{>V@A)$?f(N)GXLkh+krI^ z(u`sN*d_j+U=5S^9{Hc^Ok7N0L?Z|gs~M*Oq<~Qa27>_r^ujz7il~P%00000NkvXX Hu0mjfwGLv} diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_body.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_body.png index 677ea66b01823778b537d936f00e0e0d39390f70..a15c39907859b975c9207282763600069742e3c5 100644 GIT binary patch delta 197 zcmV;$06PDd1HJ-~fqwv}NklHgyb0jA%ouLEUUtxZVk&!k-ygujx;u?9S&GslCPf^U` z#b+pH^LL1A*`*m2*XD>~mhNbb^2y&J)$1)Enb%NQL%IOb00000NkvXXu0mjf%@kgh delta 287 zcmV+)0pR|=0+$1jfqwx2Nklv7))<|E-6Q>b`#Y z#*o+8@PAT$1BM}Z1Cf=9k>S^`Uko2UzGpam;7DCTL(~5W4S#hghTt`z8R&|t=GOoF z-n_1pkd|b4^5R8Z1(4rSTg^z60U*#;3o+!*v*&fX^0Exy|NJ4|3&@5vwzdEN&+wn& z&a-EAO&uNo>nbW3i8cTP>Z>Zj8k##g|KEG}9%x7>(2#OQl2c+WP!q@nyN({KYi#fM lPgYU}IUi&Q6BrW<0{|NtZ?mQ2{UZPX002ovPDHLkV1i)Zj$Hr% diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow.png index bfe2428374c9a5aa701ecb21fd9b5ad2f5218944..19bde67046a02e8f713a88bfbfa6d6f5b3af2b7a 100644 GIT binary patch delta 248 zcmVISo5@sGDd7_uo~c-n(=@0?0*@I|Nj1AkW*H{sTr#Q z-btxo%^>!LeR~;!7@s3C4cIzwHcs2{8W5aQ@c;hxtKa}SyJr{ChJX!7Y3cZX``p<& zNd-j)ITht5paI0Y0Hpc;l}mMEataJGGEz8>lmGw# diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_1.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_1.png index 316648d290640fa4f477d9a5850090c38496180f..738dc19bed62383f4cfb292ce7dd2d35c1d9d9d9 100644 GIT binary patch delta 250 zcmVoqfqwwpNkld}2qymf?hy_s<)&K3o zBWkUK!)h%9f@`e;L%{6Kn>Q0SB)qudzYS0^2$xQt@xNr^wEv}3X8tdqHHSDC*anCF zw+7l+K6MuHP6mOH{Nn!*1493ktT`wrpEM0r1O6E~|IK~;|8rXaF&Ub(ftvklEqw!O z%lapgW`JLM)_)^6&ssBY-`bL%e$s9CN=p52;Obsm*xpTE;Ms>q{nvMPt1W2hAm0ET zN9WqSh8FS+aEglguj}LrbU`Qi@xO?ej6o{^03QQm@v|E^kN^Mx07*qoM6N<$g6sx& Ax&QzG delta 328 zcmV-O0k{710>A^1fqwxhNklqlzt-QV&Hj zhdrs(L%}By5yU?r@$AJ*-ys;J5%C3b>So8?wKrp$WMG$J$@gUvev43`wvSIqP9{K# z01)lj-QdhN&MbJVe?swl=u4?UrK#o-kTD2?fIQE`T)}3qPk-Yu^i4nCbOk8|$T_e% z4hEh%!PiFw25Ky?i1XGiW<8TB*y!}=VR)$l%7rrp>+Q}I26%hCN4@ff{40368vgsX zT*2CYo4!9|F!boJ2CwzS*qLU#w7_gt aVN*Y;LUbzds||4g00004(|$cp8FEX&wh%}0?UA2qaT9u!H6 z7Lg5Sa^gqcw&d8mrQG!#Ue|N?J}<{HM(r9XTQ=1G07|KfJ+=nCBqQN(9XSUWJBPh?#dVtEEhu5Q+p~i~G{Xu9 z{49;h9D<@FDQn>yR80$MRVSgO(RhCfFQ}Pg2(n5u*Np-P+cioRiew+p;RXHm1{u9V zE6 delta 341 zcmV-b0jmD>0?h-EfqwxuNkl26jd!l5GbYzyNhMGb72CLkyTwTfw+& n_3Hmop`m1%0FDK6HG=>E2BdGoy#EQ$00000NkvXXu0mjfCpV}p diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_3.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_3.png index c2b4069916169d0ae83954064edded5c9f2f859a..296c85d763e6fe9d6cfed5b8f34287c90565a5e6 100644 GIT binary patch delta 312 zcmV-80muG?1hE5`JaKAiJ8G8 zB&Z2wz>gol8EWF9@w?#G#fuD#KqtEe1vUNs`;P(S-IDMyMt@{ASPe)lt@uB`yMyuH z-@gnF0f9}GF_Dbe)L}Isp{Vr#(#aDTfd()f+Oi3!Myv)TBqT5_UAmM}K|z6`u&|J! zzrUZ5euM#O)ph?LynWAL?di>6sI16HjApn2rIV)rfBg7y9Sa91gM+Vc6EJj%(hN2L zlt_#N!xgNCe002ovP6b4+LSTZWaKowq diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_binding.png b/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_binding.png index 4aa176e161b9622a53ac037c7f24120722bab189..3de2025670f48a31ab29d43f9c05ccfe797da5e8 100644 GIT binary patch delta 82 zcmV-Y0ImQ11Nj56uK`LmNklb%707*qoM6N<$f((Zv1poj5 delta 86 zcmV-c0IC1^1N{TAuK`XuNklK}I6JUNr6U{Rd^wOM@mDY24aPu;W0d%GoI0^=b}+|I zu8Ne$^ELGm)B&HrV5%YoFjDC#Sg;UHlHdqSY@|1e_&g)ytRyG^0000k?-OOfyI$SuQ}<%s>i&X#g2Owr2VR(830P26d6Et e+8%s~2M7SA0B0%WtKkv=0000-Q=gjx^ zlIHG?G9zK;sEqjC-@8o27r2XhGPcQZKgnp5R!}>n>AlJ>gc)ddP#S|uZZN}(c@+~F Y8Ptl*r=DKG!_EK%p00i_>zopr02X^eQUCw| diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_1.png b/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_1.png index 16e69e424b0c5e20edc4707133b9f11618055a73..4fa8c9fb542706960a11c84a6f634bdff741941f 100644 GIT binary patch delta 124 zcmV-?0E7S61fvA7uK{#lNklk?-OOfyI$SuQ}<%s>i&X#g2Owr2VR(830P26d6Et e+8%s~2M7SA0B0%WtKkv=0000-Q=gjx^ zlIHG?G9zK;sEqjC-@8o27r2XhGPcQZKgnp5R!}>n>AlJ>gc)ddP#S|uZZN}(c@+~F Y8Ptl*r=DKG!_EK%p00i_>zopr02X^eQUCw| diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_2.png b/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_2.png index 80652ef93b8c2df89b221c94a31293435e589a4e..9a17deb82d3f40d5ab6854657fc9b18f33c8f055 100644 GIT binary patch delta 119 zcmV--0EqwH1fB%2uK{mbNkl5q002ovPDHLkV1f^gFMt35 delta 183 zcmbQoa+hVpddB*ho-U3d7QM+S3PLJXl7HNvoxfk!II$53S|fU+ypnj5l=kp+6@^Q> zh(=0ENbvjv%TJt;Hp7jLjjfG&`MXKam}UTZGt`;$_+kqhroAQsd^1d ga=94p3iBH=Ffaz2%j$ePWX=Etp00i_>zopr07D%|%>V!Z diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_3.png b/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_3.png index 5a7bedd483f78bba0501fff40cfb31ea211eee82..2564b905a353ef95107f89322068cfa7d09285ad 100644 GIT binary patch delta 123 zcmV->0EGYL1fm46uK{yjNkld!oDDO8Xieyv=?{E^z zq=W>|KVzXwYnG}UI{*XlB3BYyykNklsj zX91-~2tn6d4Dj7rOWu1OC@=;?R~V@JKE+q{y)%&UK79vlj3U`jfVI*8ReZVa=s&&_ XsiR}@Zk)0f00000NkvXXu0mjfP4G^^ delta 300 zcmV+{0n`4(0mcH5BYy!6Nklwc; z2alkMAQ}iFA_ih$s5@2QFgrRjlaJ6{-Bta)`auC7e5$H$kIyAZ!dn7C5HM)lHsUyj z=XtD?=Q)1)bg>a!6a{2i#xzYZO%uNFBTZA3Whq=%K=86G41d>k&1r^VVB5AWvm)P4 zHtLr$Q=b&pb)5{lu0!AV43p!f00n6ohJhqWP*oM?dA@@bqjfq1${s}#T-Qa@G!R9R z>;Wc$Qzr>1iUKO1dfxjb;Ca1lLDMuI-ny>12|RQ6`=Nrz>;z|7hHcvp?{wigkgwr93?N|ojJ9R_a*-+m$#99!2P z2rhk1sxb#qEr@!8RRo! zjJgF#cg|4=K@M_#nD17>NG_%5Z@w4Yzy6#K*jlS^fZO-pZyWVl>gqq%2Rq$csMCn~ QB>(^b07*qoM6N<$g83av9smFU delta 276 zcmV+v0qg$00j~m(B!BivL_t(|0p(FK3WGopoQr~mpkSemAlO+5KEfyH2mFhFv(-|t z5X3?(tSr5_3kFF}N$LphE_*w(b8`Yee7^6?^SEIc_=+IQG6u$RjIu0|rYZ9@O#_Xq zn?T^Is^B;dmSusaY4AJ`ecz*PTXCy^!0WogG);6}$7`l(!hbLfFPzTZi$I%Q*X7eN z3^|YE$oZ>4rsa7qciGaiEcW3YcgbDwRjEoX|Hl;B$GhZ?dbp8CmpdpBX!M20z U-fF?wrx}32)78&qol`;+0Qe&o&Hw-a delta 87 zcmV-d0I2_9c90}eJxN4CRCodHkiiWAFbD#h&cP52!~UyS+oS^+K0Y+^JRq#OS)kVf tk^;a}xf#hQLm#lG2gHEJz)1iA002ovPDHLkV1fY?BJBVG diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/bedrockium_uie_cutlass_handle.png b/src/main/resources/assets/tinker/textures/items/cutlass/bedrockium_uie_cutlass_handle.png index 939996cb2bbbaaffeb44ee8cbc3ae6f2fb610b9f..45b5e99d8e74e51b04abee0f3e215a9aab13d108 100644 GIT binary patch delta 83 zcmV-Z0IdI#0dbHdO*lzJK~y-6V_+BsqhNRf85x=X1_lQI$=0l(pzt3=lcl+&q~t#{ pGc)O$K~6R^Gb7JtnC;|h1^_Xc633%Qqfr0=002ovPDHLkV1imTAc6n@ delta 116 zcmV-)0E_=|k^zt;Zdpl0K~#7F?NGr9z%U53jbsXka5zU6U+!SJLLpE44G|PMJUx$2 z90xXaKtxJatNY%)4uZ_gl$k5s>p?cN8e_DtWAlXq$#YJM2y*uq1Kvr-&?osX8Qcf_ W9~d-nF&)DI0000V+45QR+-18SgLpi&?K3f;Gg%1?k>z~Y&| z8~_PQ9Q#~3&vb05Qq@fy);#GgKfgCK7NUlB%FwS*#*k8qyueHwlDC2;izTez(={gP z3YpgAk*aC%HN$wmL?<4hJ9=}ra9NfWFsBZu3$(%rK|e-28h?PRTUWz}!q9k@I_QOy zWv;O=9N6%hTe|c)x(uJR0fSH8+m_$TRS$Yxo2zGBS=2gLt|?BYF5RB2a^C;io-fq< zNYH!@u{mGsr62ih(Px6^u+Q)X-b?$deO^$&56GJ$aj)zL5)XOl2Z>&Pp5Lse>Hq)$ M07*qoM6N<$f@pAlF8}}l delta 343 zcmV-d0jU1}0?z}GfqwxwNklxTl3&bIuc$Q@+_V@Gqo{jK_h|^r{=ZpdzN(ros z@OG4|&9;X3Ss~0fA_1jaug8;L0dYD~)9H&~l)<7bfl%E2kAK3G#P>XG1;me;n!Ub> zk3|WTpgtKPjQVCN@i|A=b?p|0S+3?4_0H?QH}gAyAtuq7?in+WEb*WZDSWRF$?M zVXen%U4bc{5_4^niCC>ZA<%_8Jw77$R(S(JT%6(HDO1nmv2dINtM^t5gUfR? p4``@iZDK3HL>F-@plkd;;0s_HaOccW%;Nw6002ovPDHLkV1mM>qGbR8 diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_blade_broken.png b/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_blade_broken.png index 06ad0b1ed0bdfde2a5c99463c922a2c1d9184bfb..b763046f70d8e5ad38016160d79ed48d6b1bab52 100644 GIT binary patch delta 267 zcmV+m0rdXX1A_yQfqww(NklX- zLGbO}_c8I*8+)(kS67g(J~uAwrAG=?tX?N*6mpTb16i;7{@>gr8lz(UW2EWvNV;JPS RQ~&?~07*qoL z;hghbzi$pd-oZYDq`LyL9KA}tUJt6OCPnb!d7c~GjUJ}00mPy z>e~7ScC{^AicT*L{Z~gMpw>KN-xsEsieT$jAP(yb1svN=et3K}$KxRig}k++l_(fH zHGt)JaBsOcC|C02KY3FD8l5iR_V1?2jW`yNw*DXR4R?HhU0>F#$N&HU07*qoM6N<$g4}1Hn*aa+ diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_guard.png b/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_guard.png index bae7e5b1f8cc0e54ea136bb964b95da15ec6cae7..1ee93ef1625b98ef2d3d5da68f880a61e3be6428 100644 GIT binary patch delta 93 zcmV-j0HXit0oVbMf>uFEL_t(I%VYTe|33pIm|@g_Q3I%IK;6V?|Lgju{BM{t<3Gs; z)bvjJPqqtc`=|V;$P0B7rc!1=(~KGa2Q(G{?B@Ee1%b6V00000NkvXXu0mjfl~ycn delta 110 zcmV-!0FnRL0qFsdf@e}mL_t(|oMZg||33pIfQ2I6qXvu`fNntjr0M?|{{CZNVq;;b z&rW9~$$;9v$^V;+a*5W2VnE%5sbp&g8^Fj&wqA$~8Bm)}e1KsC0K@STo?Q{1 QfdBvi07*qoM6N<$f~Z9@O8@`> diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_handle.png b/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_handle.png index 8105eee3516582e0304aca42efacd1bc6195952d..0096e8a654ced30e3dae6d2e62c799141b762fd4 100644 GIT binary patch delta 112 zcmV-$0FVFw0qX&ff@xGqL_t(I%VYTe|33pIm|@g_Q3D320rd-({Rd&P3}{-i;(um) zcP&{4v@Bco-zhYrwqeoo|0H{%b;a8MxjhqrnwR}2D-1f;ZusB6YTbWw0ucbhZTH4W SyhJVl0000GyO delta 132 zcmV-~0DJ%I0sjGzf_-R7L_t(|oMZg||33pIfQ2I6qXvu`Kr;gx7A^;;?S}YBMv@I^ zUb^!CtLIPa#3ZGgNOnQ%^40$jY}`<1=j-289~(iG?QjFyR<8U1^4T+>WaRcK+^ECcn->*xYA;=mR zHUyKW8Ke=0iFQ7^X0rSZGk_$GxNIle0FpIRYyic!!wjLw0GJ_UYaU?$0G@|-)_`~$ Q%K!iX07*qoM6N<$g3d)N^Z)<= delta 179 zcmbQta-C(vTE_aRo-U3d7QM+S3XCdMl7HNvoxfk!II&fvH_9uC2LztE^-H*jMoLOZ z@cc6tS}eIN(5Gd(W8gcj<`qiX&f(_9hyUb?OMH}KxU8dgh+Evc;FaE;pCFAEybjlU z)(Nt8a5Xb8f0vZe!l;%sw~sr)v?1blr%{8z0RzdKKebzOj=yU9d0WpQZuj@Dp!P(y d+kp+z3=C7G%#G^nJ{)BL0#8>zmvv4FO#rt5M3(>n diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_blade_broken.png b/src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_blade_broken.png index a46581a2e81f8582ddda387102193e4cf89204fb..6e5543dd382bbc5b7322a31063b9ef0995602336 100644 GIT binary patch delta 110 zcmV-!0FnRC1d{}?tpR3HNklaRcK+^ECcn->*xYA;=mR zHUxt;6YT<+W{^f0CfVsQ14#BavH>J(#AZAFG!MM(FheLZ0A>i;nnxG_032LwyJ)FL QWdHyG07*qoM6N<$f^M=YTmS$7 delta 171 zcmV;c095~z1kVJptpR_HNkl!lH2|hrOoSIMcHq=qhWXnr!1WR31(-&d zt;pg;8GvppGGM}`37hk=0j#DXYsP0gUKbDxFia-JcC0R#zwILe44$7%y(%2^fWE)!z| i1B1XtGqu482s~Z=T-G@yGywobXd0aW diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_handle.png b/src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_handle.png index 681d96dabbeb2ca1a92af2d104c16436754b3ad5..4962c0fe020ad7d2064edf904f65ca031210004a 100644 GIT binary patch delta 68 zcmZo>dC9zCEu)RPr;B5VMQ?I~1nc62iY6ER=Kl&l+n&9XG5^G~Ama1azq_Vb&W$FVdQ&MBb@0K+RA?f?J) delta 94 zcmaFK+|06JEn}FYr;B5VMQ?I~1nc62iY6ER=Kq~>Z2vn$&$q0L^!Dsg;g-B;8o&E{ xSK_~I+&w?GE^GuTx&Hn2q$edj%qOn$Fxbr$m%Fp|%OeIL@O1TaS?83{1OSqsDSrR} diff --git a/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_accessory.png b/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_accessory.png index c3c9e5d5f0c7c91b538c2ad3cc33e1eed8fa055e..d10d8e37d27de7c204dacd1f2f0eb05b6920b6c3 100644 GIT binary patch delta 93 zcmV-j0HXh{0eg@nS3*fdK~y-)V_+Bs!wtyD$ovOkvJGHnX8s=+7e|>PAkFIP>XaE0 z5)$&iq@;v0LktWI{+pSZ{RbIFk#{IEU}yjUWtSOO9LHBL00000NkvXXu0mjf&Fdor delta 145 zcmV;C0B-+#t^trFe|1SjK~#7F?NGr9z#tHdefV(&aRb2_oWda;#vw!}@ZFM!V6lbz zl?uT-E(y8A|F*k;*7_t?7CT0AtrgyTteA+=fHlQRDYVv*bDrkpjJPG>fFf%xLI|Id z2#TKIoI9nIFvcLp_{y6SbhDI_D5dmv=l=poARRC4InlcS3jhEBNkvXXu0mjfCCx(b diff --git a/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade.png b/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade.png index f93e5a70f9f94767096dddee7add58e5f43d5527..04d240a9426df4b5dd57801a6a6064180b93d362 100644 GIT binary patch delta 128 zcmV-`0Du4W0i6MmBza^>L_t(I%k7Y{4Ztu61T9%&3N~=_@)*=Gkau9;PZcXIt`aHN zAOBBlp8@~@(A`;bsxG iM_<2>^xoNiUd{!Si#YNNbk?8%0000KDjFh1`i}pzEeE$B@y`Tp+Yl$6x!8wO@UEdeTk>atlETg{fX&gu5Vn-Hu#Ztjp55qu02$W@sJkPOh z8}@w{vF|I06WpmN3K(NN$odSk|7QUnS8MG%6H(YYL&=wmD5d<@B}0$#h7EiG{RTSp T7RY@=00000NkvXXu0mjf7!6+d diff --git a/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade_broken.png b/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade_broken.png index ebc7b22a70d18a728579070052896e04afee5d55..9a709798e92feb7dc16790caa750de9c1d0de41b 100644 GIT binary patch delta 119 zcmV--0EqwA0h9rdByd|vL_t(I%VS^|Qoz8#;6DhHrCCNs=06B)YiomPk~L46GUb0` zV Z0|1mYHG}fLdL{q>002ovPDHLkV1gB7Gfe;h delta 186 zcmV;r07d_l0oDPKB!8VrL_t(|0qsz+4Fe$zG$9=&9by9-=AedM7>Xenh7w9D3P(ml z|HVIP6X}s`&e&(4f&V(zS|mHGew~9I)>>n&6~-7qc-6ia*xf{kF+yt%q?C|zhLqBd za^y%d=Nz4LQ$962vH)8J-g{(>fl>;D5R+F*VH13FG>Oa@gEORn@D=B_TL=Mr?{hLD o($2TFSB>Y}+J6R*`{5t>0K_ge4D!$e2><{907*qoM6N<$f?j1!Q~&?~ diff --git a/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_handle.png b/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_handle.png index 41b66336a33298410c02de333b3329431227d32d..518c7537f94503b794746b3f031439784f8a7495 100644 GIT binary patch delta 99 zcmV-p0G$7+0e}IJBwR;HL_t&-8STNL6~HhEMNtMp;4%LoG6_0UW#88ssA)y+wd?w) zh~S((oF delta 141 zcmV;80CN9;0jU9yB!6&8L_t(|0qs!13BVu>OiNwB3B(C}If-wlaxjN*0U!AVQX&-6 zpZydc26E)c9SH}!b^>cA;GE-93a6BK=EFmaVvLN4V2puU>uaZVdcGbamx%~^@6cMC vGK=>V$T_pM7QFYL%;Fs#LSX4Z{)QX3QXg>22QiKS0000H6d91(*jiiAKbd?(3i>Af z_ew~v&FStV-;ms%ey|}Wlc$kyNYR8T|1(?LYa8b+B;SydNmKuKE?NG6n5P{8ZJs7v TTRgL;00000NkvXXu0mjf5~nmt delta 180 zcmV;l089Vu0j>g&f`6AuL_t(|oMU955U`9IFxU(zn>zFVzyJRkdU7%t$#%iVw{PnT z`X~RNP?$@UAt(lPWv4S1^iBGI>*9sFobJB=Q%Z{n8iL`12}OB~xjp^=?_Rl5S2B6p z|DN0|yoO*6#K|Rvj71Zs{QvstV_oCCh5zf5;&B>+GZy*^axEB3CQbd%!N!Kq0r;b_ iCoh}yFd!9BYybf700002PYKwaMYFBL7NSeP>YBTEpm-S7mE$r^CUAd7& o%`lMD-uZvQnziI<9tCs+03xkVX0lE#KmY&$07*qoM6N<$f+470sQ>@~ delta 248 zcmVOL_u{4h zkDoYECn+J$psA|TM3M`ptz7y4(1}xZ0s;aIuiw07P*zcf%MmnS?&{V5&s@J*CnPAu z@b%kQ25U?6ru+zq^9dR-d)4ayr?1}vY8GVp^yw3Wi>XOdY;kZ9BeEKt2FwC#zHsw) zorJhJ!>7-m7;Ln)nj!-H8PV0@G~m>wD-1$H!VDijePpmuQ)vqK$JC71fH^IVj5+O{ y|4md?7;tIEYXAsLsVv8-kthR*0iy;mFaQ8q;zUeZIWrvE2Pb7}8{{}ug{YQqYPYg=c` zBF&JJp8o%i(Q&oGxdpZE$!WC>Q>PJcKz?`c|B~+B+Tfi0+KRr3wdFvU5Un|IY+V2}dPEZq^JM?nRDmrgoK0`zI^+}@cZu{xEw(P^1FNgGyMNoCnPAy zpsJ|I@c;k+riSb+;=GX4(f$AYnX`3#eEbZbzkX&=Qjl-zE^8@bL{@{-fYJ$*{{Q~< z8?0GbNf9K3p&73M=PzDnU;--t^63+UGJ`_X#L99E&3FyiGk-Q?S^uQ}KY#vYm{?JY sRWn`#K%lEI52r?=3?K%K8oHq)$07*qoM6N<$f-8r6aR2}S diff --git a/src/main/resources/assets/tinker/textures/items/dagger/inverted_dagger_handle.png b/src/main/resources/assets/tinker/textures/items/dagger/inverted_dagger_handle.png index eab91d9d9b267156291a653ffc2c13a5f8fab024..2ca6d08abcdbbc48f49cbbcc7532d2ac548916fd 100644 GIT binary patch delta 102 zcmV-s0Ga=T0^tFWf?rBWL_t(IjbmUK1*2e4g6g>o{=38`{GYsf&402q$CX#rlBKzJ z{^I|(VUe}nt5%V&xdy1&IwZWdVi=!zYNiwb07kwd!0Je?od5s;07*qo IM6N<$f;ML{kN^Mx delta 137 zcmV;40CxZ30fPdNf`4pDL_t(|oMU955U`9IFlqoz45*&F;Qz@32N?YQd>C>=Ll{Xi z0Hpcxty^_K%}vB;Mlqmv{^I`!wr{KR3kf7zGu(h0pyqvBx77KD1~-+4g%Pb8ZU8SA r2ZJ|Ib4565n&AeNhli4^5e5KWVLr;B5VMQ?I~1nXg5l`6?U?1^1G7AF49Mb5j5@33_$hJ566W#i#x ZUv;Y7A diff --git a/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade.png b/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade.png index 0d9042c0338e66d1e68ffcb7fd8da72bcd6b7451..8c0494d4e1234e7ffd49f373af8057d2fb98a016 100644 GIT binary patch delta 86 zcmZ3*@|$_XT1G!hPZ!4!i_^&o5BPLu&K&0-?F3}*JXP~-@D0a>%6+*OA8YdGM}Cujh&W(EcZh6AVWqG-lz05O_z n8bGXOf-ZouacLd}g9QKp?+z-WZ?tIH00000NkvXXu0mjf$dNV% diff --git a/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade_broken.png b/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade_broken.png index 10b5fd31ce5a89459d95ece09f1f4435cab72a11..b7debe4509621600034c18dc573d645c1d279e5b 100644 GIT binary patch delta 90 zcmV-g0Hyz|1pfoDtpQR!Nkl1xeLon%vfHZXHxPdia->*xW w0q8c9tQlrA$xf%pW)L9TW~xQoD4-(%0C1&37qrLUC;$Ke07*qoM6N<$g2_!J+W-In delta 135 zcmV;20C@lZ1FQtFtpR^(Nklam%)EzF(y(pGcYhPIG8CjAR9uI z0f}A)|Fx9F7#z%$8O-c&p~x|kV)KDhcNrKM7#QYny8ze6LX6E~BD`=hWX*UDfY~f2 p!i&{rf(8(>nJ9oQ+D5@(1OT2=B;j$y$k_k@002ovPDHLkV1m~BH^Tq` diff --git a/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_handle.png b/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_handle.png index 24d238d2c13d723c80a7185ed7a9aaf0ca3c8f37..cf3d19f58c55a51c1a9ef921992d405a3d63f21a 100644 GIT binary patch delta 80 zcmbQp@|AhRT1F3JPZ!4!i{9h}3D(640ZlIY&HuTjoBlUvY%(c-zGLG0pBHR+Kbgkg kU++CHZ3bgX_A(I$h5$pE+SpIxtqefm>FVdQ&MBb@03@^@Q~&?~ delta 108 zcmV-y0F(dq1Ca!07*qo IM6N<$fIAxf<4oKDo^Pj0@Th3d=g_|I2rtb;R%QECGN^idl-Pg)78&qol`;+07W_t=Sb5K(Ria-!(Yb_IzFwETINUX=R=N#z0!`|E6XY>+LQ&pRD0wQL*cXo_nuKWA% YK30_$O9Zbbg#Z8m07*qoM6N<$g3T5)AOHXW diff --git a/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_handle.png b/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_handle.png index fe26fb03e20be51d3efee32c27e3d87664c25784..ebe3df10dd2021b7ec92f7b0af973d107e728685 100644 GIT binary patch delta 118 zcmV-+0Ez$J0h0lcByUx zUhCi2r>ZbBhzQznL?AQa?iicLa8=>nJIijH3DL@T&cWUrZ7Y)rkFq%?^T*rv_Xtl8 YJfh++0yMA|qyPW_07*qoM6N<$f;MtDRR910 delta 194 zcmV;z06qVc0p0NJhd|*F z7y_Biptea7tlTWgAm+{Y<_G@o=P$7DJ6_j?<2Yh#*;h;8oFiil=6Qxv%FwEN6sYsE zEETraKGw7hfncQ+3L%$<{m w99=MZPR5uarG)2sg4UXH-^I3VNYP8b0k9f3fOC&S6951J07*qoM6N<$f@eKha{vGU diff --git a/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_head.png b/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_head.png index c20c8089ed0c4066e210047e7e2bcb2ab1158d3f..608217efecf3079ceac26f9f287997f36f2fd627 100644 GIT binary patch delta 157 zcmV;O0Al}(0=WT@B!7TOL_t(I%k5FQ2>>Aw6a=fV0~5gx3=KuF5gV`pQ_G!W7A|+q z4sJju*?D#~Mgi|V%q?1L*n7iTt2beC?;W*PVVWI_V~ipqhY;kYlyJNb2PvL&VvHfY z);e2IMYUXv9X>U#U+0@fIaKJnKtvee;P&00000 LNkvXXu0mjf6gfcY delta 239 zcmVw``(S5h=KERb9N+hq4*$e0ibB>A!Lk|R}a045`4J<81a1j@93dhZn55GM4 zHdh=MkW??mcwKL)_YS&q4##i^0b>lLl*Bd6B!%cPMmafWFw}fI;k6d#oZ{vNgj;Ly z-lLR)TC0Syfq4r83Nvi)eYSxv&mcB3zy0YOe|=In9=bw#_7CdC;{X5v07*qoM6N<$ Ef@AnS@&Et; delta 228 zcmV35?>snLH_kGz}Gu}*B5y!DMK;(I@(=>%rO1Ew6 z5hsa-D=cUnM;yl?Z9x!VU02NW>|Hw8woO1)Rbk(Egkgwb7+ui!y@-D$p!K3C&~+W6 zC<2w2WdX-Aq0K1XOXwYm7N==KS(XAOLDMuyl7#Od4kS77=P}i?EQ1|~#OLMR!hYl3 e{-^J+Uf=`XuS3^CHs;p=0000ZPj Y0Ak7@zC2gF;s5{u07*qoM6N<$g3l8)#Q*>R delta 163 zcmV;U09^m^0i6Pnf`5idL_t(|oMU955U`8@1G*P3`afspYzARbQHEn1*D;c0z@)`X z{?A*ms7_K=hCy6Pior2F>i_?4(Mh&2X0RU>0Er-Xw Rz83%h002ovPDHLkV1ghDNmT#< diff --git a/src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_grip.png b/src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_grip.png index 07e71f09e5d7145dcebac04ad9265bdaff18afe5..143810a31b134e508476998050808f0b87b04acc 100644 GIT binary patch delta 98 zcmV-o0G7uf5DvI`dUVk4fyx( zAH$w=7wSNC^Tf&jYx8qSGK8h4u7B@pcJUlDkdzdw!D85c?N($#e~WK b$#DSyV|YGuD;dEN00000NkvXXu0mjfCB9Yh delta 229 zcmVz5Dm;?5r%CCe>6C)C@KtwZ8E`Gb0lNBNG$DnO^hf>ufD7n)=F1h|&x; zfQ6Zr;ndkPb*!wc434(8OAOTEUzT!W+7|~$riWUED{ex@!mMtgUkRG5W zOW%N6uh_&|3oqZ=iOWeaq#LN&#NDgbB`mTwDmTA2Hovge(#xlIGO>n$Yk6{j!@G7Ssj)E!Xoz=geC<@A#wofBEv&b$!d0 z|1XM)gd0MX0X;xXOO~#v6BH0+ShZwX-Nfa~|K~?S3?XPhH&FA6g^TM1`1u(G1o#+) zg#;K@EM8hS8E8l@&=7(KfUM!;<6{sJ6=4t+7iW0;>Jg;5cVGl7Bk@ac=XM-Lw|ym|ea z;q%8&3`y~EP3h3sAn1kkhzQ0xKtnEGIA0eK;NSG0;XgwVUEnA1$PGSw|06N*y#}BMIwY;j!daO(Uy|FaWQ7`qlM{9l$3&q$I1Q|8b8 zKWovlx(SOG{GT&-L0!kfh5sw!A%+k%0Hk=vyajav0s;&N4j!#jQc`AEG-rNYCs4c` zXb52!{AXa`<>h4%5fNb!6%l24@$v;jbaG--IWaD1S+L;$`hQic>%_&y8AL_J7@j|W z&hYy6YlamI7S?qwT=c&zJ`TSNY7!C{+kt_0|K_c_moHy3ynOYN;mhYQ49TfUO(j6h zM1?^mFvL56hFrLCu`VDyw26U%k)b4>#8{{R8qy1lf#SFXMszu%(*ZWkBpHAUj2b`% a0|58oV2?d`G7ZN70000VpMQz=V#00000NkvXXu0mjfaHk-t delta 125 zcmeytyo6=LddAWOPZ!4!i{9h}3D%w#5tS;*Khwn?CqH=pFhOJPCT?fjIOYkahZ%M$ z`uyOTvHva8zopr0IXp%i2wiq diff --git a/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_grip.png b/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_grip.png index 5d7c36a9605f1db25f90b521a5f069afe668dd8c..3b46aaadf7b06f51bd46b5c987a27114633f7d93 100644 GIT binary patch delta 70 zcmbQp@|JnSdPX}D*ol&F@{KDv?t2s~Z=T-G@yGywppOBsOx delta 106 zcmaFMJdtI?dd4JQPZ!4!i{9h}3D(64A_gF!RwenTz3^H7?gJjH7$HRf28Nr<1egA2Nbz6*0#8>zmvv4F FO#pvWBe4Jg diff --git a/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_handle.png b/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_handle.png index 4843a672d01420394430b7427fc1edaac8eecb60..7aafb77a473e213c964430f618abc7d2827026f0 100644 GIT binary patch delta 88 zcmV-e0H^=J1pfoDuK`dyNklRUZHWR69jLsNFRH0000`nY1*DsoWuzpr%+L5J^-kv=VZ|x1| z`Mf>$z$!Mj85=Uo41(3XjN7;qX7SJ2867-RKyjsRXmM1DH`;qxU0HmCW!EqF)-+O#HwFyv2|kr0#8>zmvv4FO#myv9)$n^ delta 159 zcmbQia-C(vdPc^{lQ%Gm*Dsbn@kJcrFGB zHD|kAI|EefaDiclB464m9(KRGsR;=Q4cTg(0aMuA4koZO@I{#mnuYyYah?GPJYD@< J);T3K0RY?MKcxTw diff --git a/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_head_broken.png b/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_head_broken.png index 6dee37c90fa84fa4407e6bf96e8ba7c7a6ca63bd..b9b9334986b67ea4e4fd925b1c0fbb11acbad01c 100644 GIT binary patch delta 108 zcmV-y0F(dQ1d{}?uK{FFNkl00zttvYe*2qRaK#@`-?sTzS9q& zt81wsRdo#>oD?+M%W3V`cvPkVV#l#Ou)^mUa1Bn*%+0I)^b7~^w79EmMT09181Zr}`PBt0Ie j>JDI(KjQuS{`?dJg3>UJuOThf00000NkvXXu0mjfaivd5 diff --git a/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_handle.png b/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_handle.png index d5d2edf22385cc13a1b54d254f92b2b3e88e16ce..a20de6fdf2aa8b164f111d4c1e95b6009673dd1f 100644 GIT binary patch delta 132 zcmV-~0DJ$J0-*trBzK;SVbia;{x>xBkrIebbWFJ657 zk{q)k{3|(Uq?91R?vA}T=A8Er#27KgK&|y2ZmpsBuED&SpqYKtEW>Lp?YBAmRdXpt m6NQqnRh}(N!f>+e_mcyXPCUmx(q~Zs0000bh9C)x1eaw=(=<_4Ri^|h^G9g_ls%54a@m*_Xi-}NFngXy!!S_Wwwryy7^k{K zd=m5=MbV{TWELpfbzSQF{;!@9qzV2uL^EDEya7F5Nbg1qzOMiP002ovPDHLkV1nNK BZ3_SZ diff --git a/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head.png b/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head.png index cc7af35ee9748ac1849d29612c3f09ee80daf097..dacd6ba2c36b0fd0c53784eba2f3f3dc62d7632e 100644 GIT binary patch delta 240 zcmVMCvMkaxjl>uw zrKCXUl1$VPf;K`n5@HBZ2bkQt(`+fgwrvVT`JSdg8Ml(mo@qqmI4bC&&cDN8hhf+S zY;Z=L=UGvvI1KbXzMU7hzVG)vbxU)4eUO>Dx#yfen?acZbwtYZm$z_xl@xKI(R;5% qbGHAFkI9^jWM}^QNnbvk|6ecv3fb+22ToZ40000%T7BYy#nNkl zzY;8LEk(pi3$;=aBvnWo2ubed44b%FUAEuA+$MjFT(4J{rit6_2F8aFwA*c!&1S&@!{Ja8 z4u^wqZyUn9-G4586tme3p#neQ$K!EH;v5={23*$_oe1jnx}XWQz@c(cnr4Sy$PD|A?LS)D5}*eMxzl} zL@5O(mdj;Kr&F;r{MUCtCy5g#XCZQKfg7Mq=;WlA7A9yU`9U63`3H8poje@+{uzA& XLinmd)y>l`00000NkvXXu0mjfa#+IH diff --git a/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head_broken.png b/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head_broken.png index 6fe6db112ec7dee499adf9218be360deb005f7e4..e61ed3c8679e74a11b0564f13940ac91ca8ceaf8 100644 GIT binary patch delta 246 zcmV|5QGKMQ`lSBNE&-fOVOKn0WV;c`|jgg z7>PXd1iKd)qRGz8{-h`#R#}#|EQ|GhZ%?t81qpOrXZyZ8_($-O+%$~=$lJDA+qO22 zqfOJ~KqyNlRk;u-5@HB(4=~8O6P#uNj^i+urSDsJ+;9?+vv0bteV^yqckXp|5g3Ny z6j0+tTG!QqJAGmQYN%3H2CA395W@M-y@YSa2br!bD8}fHse5)3$^s%H)QS*Dr|@%> w>NJ5>RXI`4I?s~Ri2#vQ&g&8zAOHXW delta 437 zcmV;m0ZRUn0?q@FBYy#vNkl-Cyit!7H4lKJH8`(&hz zL6oc23WY*JluoBjuh+xl@$m4D^ip_mD49&ES|k!dwOU2L-+xCUkw7pQluI}qMz`Bl zteC7nj8NzExvCJw<#N%@Znwkzen%)2()oBiV!z*e-V(4nE1%D2IZ~(6Y&J0(jli!` zsYoXZR{~a#$KzP9*YNr5@%a6IESF22z?r-4yIp=RBs&C9Ng)2;!*t%1_SAf#p1OE>rKe^CH{*M zMK+rSdu0-13>e4(wpuOO>CO#Mx@JIwL)-{;CZZe;hc0S|I-ygN-ddoMlQ5e?;e*}+q`7?|NsAqbOcOu!{U|yV@t|wYvwNe4-+HWfX2lu|9d8+ zplBxAfR-hz{(HnH)wV&MO{xKmoy%AJ|M%}dLq${sBZed+h8PeA002h3ZM*7WoO}QP N002ovPDHLkV1m)!PBj1k diff --git a/src/main/resources/assets/tinker/textures/items/frypan/inverted_frypan_head.png b/src/main/resources/assets/tinker/textures/items/frypan/inverted_frypan_head.png index 870b008f4dcdb403d0f2fb0c712d95f5f697b1c2..812d120b3ee090d78708d5ceafa9a1eb6f800ed4 100644 GIT binary patch delta 387 zcmV-}0et?41gis(F@I%AL_t(I%hi(GYQjJehJBb`ShZM1qe<1+XiQ8RTf|e+Sm}fO z@3W;vQ6fskf={-cUFgA6#mg=XOD?`Y-^@-dcH*$foU{3gi#vACVe1V+5m%ZXL=~MD z*lfvJv^pKcrVFk(9ty69S}%Y(2;mN&p}H-oB53-D4I9sR-hZaQQh?F(q1bm+9>Mo8 z`vI~>1L@m3gx%qQmkH094yv62a<+?{<;svmsVb}9^^v&IA?C6VzfK8mLT~q>dJkmL zLV^1Kf@Kl>9YVI-0c^~(6kr7-*+P-DlNEzN9dWIU3q{)wSnOB`{XFTKeuzrDgR5#C zN!^g3gegc^*nGj0yxDSnppEwr3USf!he#VHQhMzdtfST)AWgx0`aiD_aWS~KMyfRR zlx}PdFs_!U$`JE9{*-SK7y1HfK91moBhn7#_oY@j{`cKw5}S8TZ77z54Beu=^H*9x hVy#!3^T7XeJ^@-R(Z7<}nzaA`002ovPDHLkV1iabyvP6m delta 480 zcmV<60U!RW1BV2VF@M2HL_t(Ijn$G*YZGx0hM(E(ZZ^%f2TQ=@l8@p+3W7zc7xx?V zrjiu2mlYNSJ+$;7QsWm0D3%nZA}IJ#49R-Xw&u?&+0AdqLnRW^+Ou<+!^}MM&hQEs zL~H-8;<}Kg1nbx3@A|^IgC9OAgCRT3y%4|>p>^<1v2231)qg2yjtJ0dAL`EYXQ2rA zr6nxO!gU;ukB>m%?#4zG+&on?2WY)M(Cy}nP%Q9$pV43l2)1qE`z4OPe#2bpWm}&#_rm3+WzuYnF*%~j za5((aq)N3~C4Y`%!bT&SRbUJPc%Fwb21|rdk^oAc8`3nLRa-1F3lPD!ZE`huUV$V@ zKp;&sCKH3}Iv~P=bD9xr77*NCmqxuFeLp$DD-^LTL4IH9x()!9%4NR9F=4$P1=p^g z@x;*&RH5^^L%CcA6xVeDp<1cZ>vkEB$6)jyK6v#;A6Y%!4b5aityV(>^4!qrbkRKL z;pS!(+`4hL52ldzp(4WL-R;nI9I`Cq{)4TE{QG4LJm>S1#=T591fn WIkrXSn9TzK0000{VB(WqXX?U;f???-H+OZ;d}n52u|G;Y52YARB>%BxN=)BLG?0pJ zVq?FA?XnB;GL~X6iHxLN;3xVc>7QK6P1DAX+d#hILkmJ=Dt}cZO$VaCfJQvMNUw7$ zxq}~Gkcoq2sf@H!MbT?vT{Ey&(7|-S8{9w3wLJ|7M{Rk~>VPR&tQZ!8n;s5(cVtKu z!^uwr@z9rv;y%*014TEGDC+RqArjP;#Vkx)6_mm&WSkn9_Pc?2lB!X{PPGQrv?7Ce zHU~dE#cH7lg@25;>mp@Ylvg962ETiW1jSg6h-#9);rrbn| zhe-39zskpfjPK^Lk}Hsjhe9)eeng$^8a;P@_t|6O%PM0Ul~$N0e2%yLNwbL0dh))U b@c+~YG;i15bWGDF5g@Oy0E~FqR zg^FnYLgTtvBaAW>ECxRoE`@F+1{7;biy|nvcO~s21*@fth_xDP5@RMauPX~_8oKsu z?>!Iq9*(es3N!PDSPYs?(xc~P>)h&UeDlt*@eBW6&Jz(F$A6(P`^um+=?lYRj6p=U z2Na4g&67vdd@QeeyLx)Cw1s8I$vwR91h(I+>JMCZ4?!#7=G2r|n3*%%0tiA%t1I5frOPI2H9RmVt!M@T1A|G9ojQ%tkwa;+S+$| zd;2Jr7EoG)68aN^)GHMt(}2))hPWB#vpJK!GwCT25{Uss6qd7_YGoZTT)Ud_(-%ji zE8t(55W&yg_O#Myt(lm(?o<2SR_U&QP0;JN2CX52^zfM-_y0rv1^0BY&AJf^!2kdN N07*qoLNklR7zW`q1la(P##OEAa11jDrvd1;gESqQr}6*dHXSex;^TD%Hrqj(ukY6d w(*#{Xu?r{;1FFOV#p!@5DUm99Vdww=o=ybDab_@e00000Nks-uM6N<$f=?1QZU6uP delta 237 zcmVFlIv(CcmL`hMo9)iC?;XK5uA)V!9mIGzJ zqR1G|rkyU&mkvY_2S8@s7%k^0kCg!;h(Fl;!x)VB007Q_`nF{@Ku!gAcFuCd%tILa zkfMPo6!L-_Rg7L`2Y@j4F$r3Tu2T#Gs8lH$Tx$g>8bj}G!EQsJ0q~r`$3twhaqSl> n=gsf;K!@PlP3!~N#y^TX7{7D_hDbRA00000NkvXXu0mjf_x5J( diff --git a/src/main/resources/assets/tinker/textures/items/frypan/magical_wood_frypan_head_broken.png b/src/main/resources/assets/tinker/textures/items/frypan/magical_wood_frypan_head_broken.png index 0ca1cdcbcc4ea24e8af807592a1721be306e1bc1..435b15982084691ac00e091a866e0e040b7be8a0 100644 GIT binary patch delta 169 zcmV;a09OCT1Qak+xzSU^t)Fhe1TP6t#;iB!o8Lk9o= XTm$ntU__V45J1-`Eyf2Id;01V zhCx^jNc1xJ57Wrc!vPon_~i%OAebRcxHPvcIK&9EQA~svZWuog2ZOX2AKZm3guEax z`H%rZGcasF%E^H4Ek<-r(qepYXUj`IWY~U`lc6Bz55t5hEDV31*54T(K9`4k=jp3Y zm|lPZn6qJ;3v<h{FI*0}hIkNTr>{OSXeo)o oZDv4A2ee6v*bEv%*Eoy-01X>{o=`~iHUIzs07*qoM6N<$f((3xtpET3 diff --git a/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_back.png b/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_back.png index 8625ca1913500b97f6f90869dc9968070d551535..b106e355490738ba70655bb1fad977ab739fd304 100644 GIT binary patch delta 115 zcmV-(0F3{%0gwTZBy3knL_t(I%VS^|1!RMekdXh(%*_AE(yXqo{-2eV^}m6E0qF+x z_4WO4Y;62Lefo6LT>!FKTU-0Tv9U4fwuAg!Qc?o88N?>p=^z_rWMsg2Gzkqh007N! VBXKgYU)2Br002ovPDHLkV1izHHst^S delta 152 zcmV;J0B8S@0ki>-B!7EJL_t(|0qu}64FDk&Lwf-d6kvgs4GRcB23nAW21GEDFffyU z0R};)ta}KRFq?A_pk{!nETWejfrIc;oGFHNEbc&fVGw5zq6;`pT!rjkeGsDavB9NK8=^_FVIgj51tEXMpFCH5jBdx7> RF)RQ8002ovPDHLkV1gNBEYSb} delta 149 zcmV;G0BZk?0kHv)B!75GL_t(|0qu}64!|G?MQPK`D|iDJM`v|%G~Ug#xqAg?8XRdb z-CSfK0saH>;ZKxO&{~UHYvlTyH+W4@2mxY@;GE;*bxm-s6^$|Iz5iTa()2RHDJ9G~ zi|{3Fq3cSiIc}|qx@RhcG{%75y9f)|X&(nRIPd~^EFpr52o7)o00000NkvXXu0mjf DwW~gs diff --git a/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_handle.png b/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_handle.png index 56fc0d24e5aa834beabfda45564ef2ce69653c0f..d3698065d4031ce32bc1d0d6be43095968fc9590 100644 GIT binary patch delta 131 zcmV-}0DS*|0-ynqBz$K{L_t(I%VS^|1;ZVvtE>MvFfjPf#>VzvMn>j8Nt&IUoc;#| z1^xH(^7y&L-K< l$e~TL%^(2M1jFQ{6#y?pIl+mD&Hw-a002ovPDHLkV1iaiJ(>Uj delta 228 zcmV#uvyY&p-z*BeuZ{robfM;;$ zN?f}W1aT8cLdq{hN}CqDEe0lm$$v9H6P)YsCy=J8$+FD&zHgEwF|G%Dt|W7Lo|`z1 zA%s8_MQEDFsl8GB8tl9*3xXg(+qTeJJ7IEf1qhdAiEZ0Z*Io5jm<6ufY|yq+3iCXp z>pG0%__4EPb^$wwVF)QD)^)`+P5Ye{yUq)fRaF_nMNwcFhQlyfkGAc!`@a7PeiV5A e-=nq(+PDM1yiG;f2gvUL0000MvFfjPf#>VzvMn>j8Nt&IUoc;#| z1^xH(^7pE4Y9*P%jEeO=k#ux}8K&|zfas%GYoqbe~F*)}78R5r*a}M`?2Wu^) ul+G|;@5?xC@|<(NtWHeJ_`i3-MDPYC<}x0ifs5Aw0000Now<3dLNHWoCGS0Htw}r;OlvLby%U0dGCSuer9?5t-GpVvAj~;u zDy8fYYb_aLcqkZx0SD$eCyg;SN^5Q7NGa(y00*^|QeRE*jXQ;dA%tKD2surFciZ49 w41)dOgb?`4yuJnS?->!}8okXtd z!t*>hj&psD+qcd`gT!$hBS{h{ih_BbF-;Tdx;}O1;X%iaWPdpfL*#i5Q54ZM4YqB= zx~^E31zp!MEd!>w0DWDOB-Z6P4nYuL9LKYUVL+B;;27fvAiJ8Tp{gnrMe)T++qN)G z^LYj|msTMsf*`N~6ec;5Wf@Tvy&gbA?)UpaPI#UNtwWjY`_96Ax&n!*KFBxQwhvv` zVHgI=vP7DuEGRz)M0!=UO5gX4_W1|c{|Qv%NK^%FJ3VG{r``FnKYY|YFSuV8D779$xz+Z-V|kP&B#Qo<`u_|{byle zWqA4gIYU`zTT_UY6(a*Ffw<+^vH!mr7#RLCFfhP0kAlGh02FvHEE=|Yt~USx002ov JPDHLkV1iifNRt2n diff --git a/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_front.png b/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_front.png index c3b252be26696a5ee8adddcdd4ce5eb2b243a83a..a4f1047d1bd73aba314c60afdc4a3d0f2e041e60 100644 GIT binary patch delta 130 zcmV-|0Db?_0jvR#F?(i7L_t(IjbmUS0<1Z9?EkVO$Nn!peC$6l>QTUIpk^am``X}? zwA%H@NHhSX!O+&a)-5!+HY6pzmL$!aK$@*>!I~{x+(^?50vmw_1Scie1|}qvt{DWj k01a3}s-H)}C>SsR0I#+#6{UST;{X5v07*qoM6N<$f)_$IXaE2J delta 168 zcmV;Z09XI40nq`FF@K9mL_t(IjbmgW0<1Z9?EkNS3=IGOGcZKkS}`KaF%iHTMh6MJ?wV^fFI1^*cs7?jl27`V9waB9X2wj4Y5e<97WWB*CkI0{C=fB*nK WwkxRn2`Kph000005AXR0?GoAf`79~L_t(I%VYTe|33pIm|@g_!ES(CeDZ%iH_!i$Q8EAPX3zdl zk^!!9iT~B?9BZutLu!lrC;unO1>Pwc|5dGRYb^spY72V$|C8i}fUMmAYPJrw=Keth zHDeeMQCRw4&&9pgHZ&aQ>`DJg3dESQ%KxU`ezndqakaPt3`wT}vE|i3&AzoRK+W|e zXa*Y)mYe_I)YG@tE+o9RW;$t_!3NY!oAJML(zO4j{S*I_laK(^$=IN#A73;80000< KMNUMnLSTYo8*739 delta 241 zcmV(04<9_J6A>0>Ffui7!loIg0Y0gj{~z4FQzs%S&R}M3-PBW%gHD_x~ado0H@3Xlk<+$mU$Uno$ghEwB22 z_twoiQJ`jPdt01-#%e%ZMa}=4SFhCZ3krfYHxQ{AY(RKk!T95Ot4Q8Q{h{15yC+8dmP(F$B2YwweT#xo}gk~>@s+?MYzIJJJRT)@wNzyBCH<)dG z0A;e;&>8D;E(_kCVDCcgz~cdVM7N6Xowy87IEN#q1k?sBe>P9E*B8xl%&;` delta 242 zcmV zDjKV139Yx|NQ&M z@aNYrhUrc9L}`W_kloPy|LWySb>b2d46YWYO~h&j8<190_y6{dn{^^0A`C8;W=$zE su|(SrHb7rXjX_^ay$PfXUufe30NV9HJmw;m>;M1&07*qoM6N<$f)Z|W#{d8T diff --git a/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_head.png b/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_head.png index 82b5fd927c0a4e80a3f34d9bc249589c5e880911..05ce1da2353527aad008137d6ef3e0eea5938a2b 100644 GIT binary patch delta 273 zcmV+s0q*|q0=NQ@Fn<8@Nkl0_;6V`B7Xb4HrPDw<& z`6m{FL;?zO$8`syB&-n=RHZvpaZ3BmrxeQlu3ED=jNi^0P!X` z(wqQcD9ANvCc)5~!d|QpT{A*{g}ElD=4x9*vu~s+tYC@ol7Bph{BQtqTo|?sr8huX zZ9(blAg+he%*W;&v-SV!G3bv2M0vKqNFgFYNl~F1Bz^bBHnx`x-w`ER^8mW#K-CRY zS{-P^FBIwxo+8QCM;Ir}@&i8ELD&37QC4usyOD?+Ouh**IifGzgXrXV??w9P&2$4b XVuR<~!V81|015yANkvXXu0mjf5T|{~ delta 328 zcmV-O0k{6R0`CHlFn<9lNkl&K@kAU8i&N)Bm4EKEgc6)-E!k9BEhZ9} zR)>dXlg?9{%W_Q>ZyO(ySdc(~rIlrTA9}9?yskkI5T7f@QH7hj4Ep`x22o%qxtE=t zpJRR@&eZe_U1MlHw(yL>$>-Jh*hFxHP5b@YWv%7>xT3@ttO$6<5R1mRcU^|!V+9FD zDb^cuU9GB4t3l0+_e|4uIXuc`w`@DqJOCxFWjnc_SzX)6l=SB(LK`l$mOd~9ezp0Z aKi~~As)MUP<6qnW0000vYE1Mp_)oS0H3@eA85kHCp1%6Tz(lI% z?i{!OZg#I2-0WVFZu7#1;Qxo_Y5c#wU-v)E3q-pBrh$QhfuXCLnPL963ych;gaNVv eFwLW2umAuz6dr<(a(yNM0000qZmMrX1D?5YKGf-%;8CwdwDCt4#EurM$% lFw9@W!N9=4K$^`^003smJ%Z5$t4;s_002ovPDHLkV1ieZIxGMH diff --git a/src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_handle_broken.png b/src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_handle_broken.png index b8b77395c4c6d44882f9cc7a123e0354b8a4f66e..693a494df2720b750f35f5ccec26eb32aaaad3ca 100644 GIT binary patch delta 95 zcmV-l0HFW41cn5#uK`y=Nkl!8 z29WG*iUW*nTd@Tg(FTDO9-61||N4Gi@@=OizyR$_K87)aB4Ypm002ovPDHLkV1lwA BC^i59 delta 146 zcmV;D0B!$<1h@pSuK|B_Nkl*BddAWOPZ!4!i{9h}1tyg$$v^FhNmr6H>`eS0*ZVffzGQ1KiMhX?+q^-= zIl-*CpuA67VsZ+H$HhZ!2^PoFIO3WUxGwN6=<-g8Q`WRe0IF_cnzlxwQPQETO2OK& cmr075p~tcH{=wO69x(ucr>mdKI;Vst0H)C`*Z=?k delta 204 zcmZ3&@`+``ddB*7o-U3d7QM+S3QQ_hl7HGaKF{BMphM@lOV6_-6Xba=CDlYc{U|lz zMe2wBYrg2u(bqlJ{z!@q2;6d{Cg!FkBqUf=`t>ye!NbSm9RFXg_Aglf!1TaDAIWp| zU!NJbDYEP>cyJ|_$FNS0Z%6ruT@3TR&-BU}8UVqW_`{Aa7Glpp7QPWGUhK}ZsA~<+ z=j#OqXYQ9ZPF%ovgXiU|G&Pxy8+)2^6gK{HW3**p;3#lyos)9lFar>Hy85}Sb4q9e E0P5ddI{*Lx diff --git a/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_accessory.png b/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_accessory.png index 78d2e79b334064a662399b2f2e5ee6ed8e9b6829..539be6e1c911cf849d1fde1cf02e8115c4fd13fc 100644 GIT binary patch delta 92 zcmZ3-ST#W<%+b@uF~p)bIYEMTae_zVzJ2@t_xASwKWTR0zopr0A^4n>;M1& delta 145 zcmV;C0B-+!t^trFe|1SjK~#7F?NG4|z#t4W-PjN#5AX+{@c`%W2?L)XF{A~l2q6$% zE0HO2V#_g3odo`sfOC$lwKTeBBe0r{F(iaQN(tWk#%s-r*yCDj;+!Mrj1WTQUj4zY zk1;YSB_1KX@30+dwtobw6Q$H_{S7Obl*=3N&K!*Gl$Nsq3jhEBNkvXXu0mjfp(j5$ diff --git a/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_handle.png b/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_handle.png index b64411339ff948c5df1202ec706171f1b5b2a538..59ba75129ad9b0314e42ec53bfdc2d9c3951ca6f 100644 GIT binary patch delta 97 zcmV-n0G|J|0e_GrTSiGlK~y-)V_+BsSb?^-_J6W9J2^T1H!v{xPmv+&>gxad`uhGi zHa1db2*oY|c_%0+h%%S3va*5=@$&Mb%sZoLlZF5Q5jq|RU^rQ500000NkvXXu0mjf DHn}LQ delta 150 zcmV;H0BQe!vjLDKe|kwoK~#7F?NG4|z#t5BD>1P01Os0%GV&1*@ErrUFr-C-g;3EB z-CzlFV#_x6n>S#Lq4|cR=LlJANeF>2BBKVh))Zr;5W>>Q!PpI`B2r3}Qjk)5ykij> zA35hkDOKIzjg!t}^X`MZ_vD;g#$n_R)HwaW=MN2Bct{?G5DK7&C;$Ke07*qoM6N<$ Eg2CfJegFUf diff --git a/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_head.png b/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_head.png index 796729ea5e91d02702fa017ecba1ed9a2ef31bb1..10cb8dbb41e6327d1e941694b9d3b3275c13ad21 100644 GIT binary patch delta 116 zcmV-)0E_><0g(ZaByCtpL_t(I%VRJwF!(PcBLl|_qymruK|w+P`}+F+hlGTHG06t7 zv9bNv*474NW@cv6TmmuxWUH5#*MBD`Col#XLXsneHx delta 161 zcmV;S0ABx*0lfi`B!7fSL_t(|0qsyL4h10$>^@!)oB@f$pimr{OJLAwG&nTD5O!&T zuia#uOg~9~GnX-DwbtNRDdjpjCH{AlwHBOn5M$is^4`;znCAn|`O;b=7-LIHx%MUs zkb+VQdhamCz?l#N%sEM4{8CETD1?AoE99KX!+7nuO=aWMUmE-rc$WeOA75LVoQ zWoe&L)&7^6TSR&_*@H$i8=$*WRZTzip?>j*2+GW57}=|D1BW;80i-z;=RkUPz5oCK M07*qoM6N<$f>yLFssI20 diff --git a/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_accessory.png b/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_accessory.png index 8af2030ced1977314169afb3892234403ec5bda2..ce0e3eafd5cfc87e1b11a0875a1a03751636c99f 100644 GIT binary patch delta 129 zcmV-{0Dk|a0{j7xf_i01L_t(I%VYTe|33pIm|@g_Q3L2|Kwwq<|C}i^{*!G$(~@QX z!y8*`%Vy2~Pqr6YmM;IF(A8U8IeX53vcq8Vs@4B<`X|)(FIf1W>_D8qZvFqJsncs` jELlo^=r3Hm9_#`DFlhFz&Xt5|00000NkvXXu0mjf6aGQm delta 171 zcmV;c0960{0i^Xhw_v^}M&-ve(ngTb3Xaj1aBN9e}3IdlKFr6e?MM@2AB zS-s}}&8JW6CM;a^zaT!2k>o(k2@PRfuzth;$IoBX&0MnW1G<+i{$Cms%Se_1+t#o9f8hQ5y1qq= z{ujl?5i|tD0I$Fx#w|cY_P>5#*SUD{|MFP;F2U*rAD|(tHm?7F=;^znav6``-~8h1C$eu@L3&&$wvwrak`$Z$GK4S+eYZOAMwV y1fwy|*N<@l(2xWmO|lDM0GDQ>4ZsJ6fdK$(|3H0N8a7A(00007S@AY`_Mr0{j8? WlI*bPb*zm50000c83f`6<@L_t(|oMUX9JO4ii3k$`0K>>NOg|1t3M^D$h%c9lV0L!+*3{=)xNiSa}k!U9s| zY;VhO{>n85P7V%+7tfwCNJvQ%?}gl`2*ydvR{U2{Q>_DO7DAPjXsS+3Al?fgA`fUt z&yuD8rKF@7Dih*J3q%;BB!;xm$1s3gFlxZ40U!VXw5u=={X1C=00000NkvXXu0mjf D6a`b@ diff --git a/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_head_broken.png b/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_head_broken.png index bf099b0bd34860a0f571c355f5c66e611d87764f..389b7eee109256b25dea1170ebed23033f840925 100644 GIT binary patch delta 86 zcmV-c0IC1;0nq`Ff=@b0L_t(IjbmUKG$15B^M62c>i_z_{{Qv;{r|}_B%!S0KM>b8 s^iL$ufW*q0|4oyokf(VRjDn#J0D6iQC2uosdH?_b07*qoM6N<$f-J`;&;S4c delta 120 zcmV-;0Ehq40rLTnf^l3)L_t(|oMU955U^0qfROae|9}4cVbIssVqjooU}!8XWF*Oe zH8ZC(CX`kDfB52Mor0uf6Ui)n{ delta 104 zcmey&Jdb6=T1Lj0$?F)!qAnht*4o}?=q2}wftj!fyAZ_iWL(iF3o-Hwo`F& c=Hxa8h7HC_nagM0NMZm2Pgg&ebxsLQ04Zf0pa1{> delta 123 zcmV->0EGYT1E2)3tpRghNklry<))U5`u=1 drEwGx2LO!qBvRz*hmZgO002ovPDHLkV1fdlG>`xQ diff --git a/src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_head.png b/src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_head.png index 290fbbfa0a571f95a5d695a6677e2251939613df..0272dad522857f3f2e8046d6c38d87b5ebd0b324 100644 GIT binary patch delta 93 zcmdnY(!{c1En}#Ir;B5V#pz^^FNQz*dn7$r6@0IMfBnzi#J}0b*+I%-*6!jv2WF%= wCjgn^W-QHyk?R-|H<>J!K4iemdKI;Vst0MtGsIRF3v delta 143 zcmZo-+03$GEn|J5r;B5VMQ^gt7sDUt8(5y@?>unAfhi#=At6CS``_sa5?`7dfq?O@ z!y=xF+W+Q&9uQzZ scSqGyMnYo2Ikl_*7bl4D$T2XuE|ZU(y_|C&0}yz!yZX7Tb4q9e0NqYEfB*mh diff --git a/src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_head_broken.png b/src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_head_broken.png index 76bad6b0a7b8a3d995c7ff7aaf1713adaff6ff09..2a481aa4040437e6d357e50c1d3964f56f354317 100644 GIT binary patch delta 72 zcmeBSdCRtyvcW$c{>1j%2VTkA9zq6k=#)JU~JYD@<);T3K F0RU1ICZ+%Y diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom.png index 3e4e3eddec191259c2dc226f90cf75de4341e54d..a5cfe3999c94fc7b698c828fa8c4a2bfd0fba464 100644 GIT binary patch delta 110 zcmV-!0FnQ=0gC~UBxh1dL_t(I%VS^|1;YuLnVJ1JGBWy4wgGW*asS!a*#3uvgph8C zf`S6rb{QF&|71JAv9Xad142VX{~H(>{3ko`2G;prUS8xm9~J{3Om6f80KoGp5feyx Q!TkmtVgLXD delta 156 zcmV;N0Av4)0k{E>B!7QNL_t(|0qv174ge7pL}&L1B5I{t;Tjs3);ogA86-CIlig+; zl$(`|F!{#w;UAysKnP)Y@5kz+&ijCK4y6>Nl$Jsc23Tu{QVOj#)LO-(KO-S9#vsNx zQ~#=w0J_B2T64LigU#!`Z{hPMA=t%#0&>pS!Dj&Y1C(qwrWFf?4kKGM4}q}&0000< KMNUMnLSTY9wM5_m diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_1.png index 122df71ec9b41995cc9329d067cee9d62a81ae3a..0720c9f64772d16daed914bb59cabdedf3efc684 100644 GIT binary patch delta 122 zcmV-=0EPeN0ha-gBy(O#L_t(I%VS^|1=I&-W@i75jEw%1rPQjQ{`u07*qoM6N<$f-;RVNdN!< delta 202 zcmV;*05$)Y0pwE zk3^XukDr?;r8x~n0Vt(#90#P7L(NU`x~^Rxr)dK41{YO0=k1j$&j0`b07*qoM6N<$ Ef|(>;VgLXD diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_2.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_2.png index 990a8c1504116eb88a97a467a22a593abeae0725..aad55af77142f91ee006e6f0004461bda4ca6bb5 100644 GIT binary patch delta 119 zcmV--0EqwC0h9rdByd|vL_t(IjqQ-36+kfv1FM*#0*^x=nF1{PZ;`J$K%w%VPjWA7 z{k+G_psHwv-5r?;5kW-UmoPI#1bgrMa8-ebdduVWV=yW(Gh}A3fSIAHbN%*#BmF}+ Z`~mtWG4LaOczFN-002ovPDHLkV1gtzG&leN delta 188 zcmV;t07L(j0oVbMB!8btL_t(|0qv484ula9g=e?W=+qKwr9xCrp>|$JZ~&D~sj?v< zBwMh_cE3bOy!qyNz%%}kfKsYTDeEcvy$X#nl`#gT6tLDFL0&6>b6zpVkaLC@<94>{ zzV4lK6(LklI}gb0@@w~*fiY%4uht0&A%GC#sn y9Hf+HO1{g)xj?;ln4Nq)LX=~Sk(LMXGd=>D=ULBSvJEogA5``v!$iw qe`{-Nu;%daaPquBmd&GJ!~+0hB^3KZ5)D=W00003m`BpZX}UQ{VxKg%SDZm_WJ!0000-0g(ZaByCtpL_t(I%VS_55hy4q{D)yPGqe9hX^M-B`wzoxY;6C%yu82| zWC%gqK$?tcH@Wd^b|je=1y^Z)?= WA1YOVdi0L~0000J8Cw7V N002ovPDHLkV1m45L1+K~ diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top_1.png index a71227df55f7aa736e468ff6c5ead1eeb145ae4d..7ce8a07caa551b739ebec32d6738c0bae41d0821 100644 GIT binary patch delta 120 zcmV-;0Ehp@0hIxeByn6xL_t(I%VS`mCy0xS`_IC{^54wN42+4^q@bVx)({#R`rpgT z>wjZoBbaSqV1U~YkOq)um?k45qyI88GAJ0QW{`~_4cgk;aK#}ZA^%D8FHAGTC>RAp a0ssK|k1xn8N!}X(000074V~!+aU=tA|KyjdfkI?>kB<5JJE?2k$*@9}E{t zDQc}#6k|k6>EabaSjdI>F2`~7)*6g4$T?3|N(pQ2t>HX610rLrZ`;<-+&jMsJU4+4 XS+_H9BE18z00000NkvXXu0mjfW!y>} diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top_2.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top_2.png index 09662f282db8ebfd5d4e88469847f8ca73f4b03b..77202cb64f89922de3527942b6c0dc7b909e3510 100644 GIT binary patch delta 123 zcmV->0EGY10hj@hBy?X%L_t(I%VS`mH(+65`EO=s2F65bh>MH+ub`j+*AyBW`oFQU z5lkBx7~nPpq!^?bq|nRD>%X?P_J1QIqyI88GH{GjGss4eVvr`7;*gLKFecisFwG33 dU=$1q007K=FPmwzE}#Ga002ovPDHLkV1oRyGj;#~ delta 181 zcmV;m080Ou0nq`FB!8GmL_t(|0qsyR3dA4~oPdxYqzWWuAgNLWU*lsf1+DymU}a|^ zf(Uy=NOw6nuDK#x%@fJXx^D#-W3=ykJ5x$^tW6(42tiUx48zb^(==h*Hdt#> zN}*c^$8pfIEXX+{r3B|3`o2d9p$VPfy?^guo@c7HLTil}<1Wbs=e%`e%}Ncl(=~4%HhQ8(Xk-HfHRRO5}2OcK%;oS^3x8 z$cQO9H#gUSZ6hxa&jx9xO@hlJ+}zlDoSmEu4C2HOm>Bmo1sbR@Feua+oDF=uZwCVq Nc)I$ztaD0e0svz7C3^q> delta 157 zcmV;O0Al}&0l5K?B!7TOL_t(|0qu|>4g?_(1bY=8fkGfj@Pya!LSBL71v~+ZAOyo) zcEshxUQXVM9Wk9rsyma$-{<)CL5z`d&QMCdQEM$~tth1&Ujw}Nbb@nEj4{w!i>E!?zK7f&E(mhR@e03 zD>1dUq;~>&24pt2{P#>us;!tXiF^ZcTieKve*o2TG!j$yTMhI80000cZ zAAenbN6-I>6(vL)0yZEjzxe;zQ>W`392}cS(TwDR{|x*B{0#s9|0P8)vH^??AK$-c zU}R(_-GGFO>i_4?oT;<7wQrhSTS=1h!3MCgu`|fX$}w>8@iUTaJJ`>Hq)$ diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_1.png index aea5079ecc1a525cd1f6342734df5553a132fa62..5f7f2a1a321c1fe0655cb30c78e657136aeda597 100644 GIT binary patch delta 193 zcmV;y06zcX0=oi`f`6n*L_t(I%VYTe|33pIm|@faOalUnEB@;^xcn!}fato$|E3;Z zwf12VwISuz|4B9=rmp$FM{GiENNE-6E(ir`GIDjVji{*oPgWR2Rn`1=j)<&{swC5Z zg!;z+*1iF?$xUsf8&KBS`QI@lv^J-`<3Cx^SlZF~KO#4`wmPV@n>+(RE(l0Xtu5~A vBF})#me&8a0fDud?d|``PKjA$Xa->bR5sv7-pVAY00000NkvXXu0mjf6$fA_ delta 232 zcmV7G`XUj zBsYK!0A&YpNeKovCT5asha12MwDZT0A3&P)j0HB}^Y1?lZ(qM*kW^A4&wy#wRgBpk i9sj3RRFD`43=9A&_dEC{%N&~k00006x$|8lwpwf;GUL~BMdz$ZQPznZ0Otv8WQ z$7w)lX*GEUc%^3nLtnQxvZ{`B16<>i|I2FY)y7sekfa%5Kr?L8e^pb9+Mv85@(l1y oO8GCTu1UTDARL-UTJ*s%0NUKw6m7)ldjJ3c07*qoM6N<$g5)AuoB#j- delta 221 zcmV<303!di0@nhNf`7nCL_t(|oMZg||33pIfQ2I6!_)xpw2c23j~-!oa`g%$$p!@F z75%?->{uN)A3uX{PX7PRQzjBL1jPVQgtBpPGH97uHLai6O_~e*Gjso6IC`Yc(B6?~ z%_s)^`~R1LgNK*l50EAWU<4u;7cY4R{9|Bb`15HL;f@=Ys$M X01H1woz>6w00000NkvXXu0mjfA(3Qm diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_3.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_3.png index eb77e2441dcd148b318a28097c153b4f92eb505b..77960fda107de926c5eb8b1cae58c1d9e8f59f32 100644 GIT binary patch delta 179 zcmV;k08IbR0<8j&f`67tL_t(I%VYTe|33pIm|@faOatmCO#W{d7Wtnn1L}Gw{I~EA zs`XFLs+~Av#(%O5@J>oj{~!6ayM3P5EyLw4D^qCzeeJZ0*Ci-2JAT>$bzU}g?5^kYDB-0D+Q>Xp+h)=4W hPHq^0FsYhB7yw|1=Yi{dU`_x4002ovPDHLkV1ml5Q!D@g delta 212 zcmV;_04x8k0?q=Ef`7M3L_t(|oMZg||33pIfQ2I6!_0As8+Y6%}Q0G}LP%Ml*^5O_Qho-wm`q+|#WopGeIp z1~4))Fo*%2{*RHggatPMr0vc127tWq{@r^967?etsL0A>6kwhGKO;4jBqIO;Ix<(8aer?B O0000HQ7|F_05<$4KnoM| Q^#A|>07*qoM6N<$f}jsKM*si- delta 155 zcmV;M0A&B^0hI!ff`5KVL_t(|oMU955U>nh16J?Z_dnFdiIFS=*6ly||M-PVbtQe1 z{`VB+;WY%qfK7*v{6BT=MjbO7D}#ZW8X*Uu8nEHuq5r3^UaMnZWMVMZRBsA(awN?Q z0rqx`jkD(dH_*~x@VBuhs2Rfm5U5W}CQ2ht14sp<1`GxR02B-|BPTco4(9*>002ov JPDHLkV1hbZLBs$6 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top.png index 7615c22d4d6d621a41b32f077e3b41ab0a956b01..dda1fd2225a31ab541f8a0dfb1aafba54146b40b 100644 GIT binary patch delta 147 zcmV;E0BrxW0*wNYf`4{NL_t(I%VS_55rmgi{0HH%!jk`C#by7A(^OgaKdh|se;81s zs-tVIRd`gbX+TJAI8Y3)#@L4D|B=;o|214ZYRy6-YE>LuYEx<&|EITf{?F{}BW$~t zo9BP)h-jdu`v0l*EnrNlml@I<$8`~yk4h{w; zR#t}TCYQU%gR51Vm&L1y$!H_{|00000NkvXXu0mjfgi}yF diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_1.png index 1c6a5a6c8dbae51a5858d317117834f5ab8503d3..d643f6d86a562989b8da3ae33ff89ae6199a31d2 100644 GIT binary patch delta 175 zcmV;g08szO0;vL!f`5`pL_t(I%VYTe|33pIm?Xt1wGIE1YwG_eSJ(YdZ)*8ZlmYo2 z-TyON+W)6DHvhK>i>P%=POEiEN~v{9NUAOE?8dDztG)9-2)m}F*9I4s)H=o{)|NK6 z{V!>1hT!H_+%Cvy>G=W7f`70{L_t(|oMZg||33pIfQ1yrsdbJ2!4?8B3p*RbjM{2Of(8_H z_Wb|#=MTf*zke96+`Li8$IHj?@BcrBfB*h5ly&v|$7w)zM;F*{x9{EqYT{*h_vS5w zt*&0v|Nnm>3K*Ffy2?thyCAc*^Z%{8ck6g~xEKu7RGWZqW=2qw5Cdu`Wkgqt)qv^M z<%~XAdH>ZVBpA9%i!n42Gynv)Oq+yPBS8a*1)~Ox8UO+Sonk*9_dsK=00000NkvXX Hu0mjf?Y&|+ diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_2.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_2.png index e92946b196f2be94df3621d0386b34665932bdbc..b792a64fe6c055fc9d467ab089aea50578e46ba7 100644 GIT binary patch delta 169 zcmV;a09OCS0;2+uf`5!jL_t(I%VYTe|33pIm}Cu^ZN2|9+aZ`J1Cqi=svIMrGOht^sHv7VbpZP}E`|H~#%{$Dv| zDsC5Kws!v4bM>foh={H&?w$BQAILB4>;__pvxy1=hw!NXMIzn(|EV5`qXvu`KobK1 XLZRbmoOm8j00000NkvXXu0mjf7oJmr delta 203 zcmV;+05t!j0>uK5f`6__L_t(|oMZg||33pIfQ3{IS?zuQ85kk#X%$6`1Pw?juZB30 zk%@tokB8y(@#A$u0s;*0KYU;)nZWuVrvd5pE&u=j`@?Yb)QLJFVPUYPpFe+Q@bL3) zVgMS+3^cGUI}5uDvf8@-pE!OLtkK)ozv<799}G+^Oh6eXhD6Tn97bfdSPhs~RmSLe z>EeGQV-tp+qC7@yYVaBW0{d4i#jBB^0mOn)14a!10RT2XG+*wnb$tK;002ovPDHLk FV1kG%TnGRF diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_3.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_3.png index 1b3a9894f79817261d48066194f1d78e88559a14..cc8268680bfba44faff388cbf7bc2d2767143361 100644 GIT binary patch delta 167 zcmV;Y09gOQ0-*wsf`5uhL_t(I%VYTe|33pIn1SX7Q{jcio0pn^QuITK>?*jkS%>U(W?I8aLJ`hI@7&U+x3;^K~ V<%h;W>I47)002ovPDHLkV1hhhQCa{1 delta 199 zcmV;&0671l0>J{1f`6(>L_t(|oMZg||33pIfQ2I6#2Ap@((<2~fsuiUiHYI=zkdwB z{{Ch7_4^M4BalC%seuuv0i|v2|9}1c$8h=D^*R9o0fx_?K7qx#xwsgB<}ti`_l}{m zv->|*0}5JN|6jO#wN6k-kilGEuL)>911k#)!(X5aKme#8$Uy$j&|X%8-31eBsu=^) zvi_^f$uhK8lrxeQ1{-Eg!>f^?0mOn)14a!10RYybHoRDoZB76H002ovPDHLkV1g4* BUSt3O diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom.png index 10d2bf1bbd11e63a0627aa3f5f181f98a7249c2e..e51921173504757bab995b83b422275c4a4b2313 100644 GIT binary patch delta 73 zcmZ3>(!jD|JtL#d(!jD|JtL#dlKXA=$M2fylKPw^;(8#Aoo WG@4asa><+l2s~Z=T-G@yGywo4U>7<7 delta 95 zcmV-l0HFW*1C|7^uK@v4ldu65QK~*BYz9$e07Whk6X7M<07eF=v$d4O7_QxW#V~){ z1xB)5K#uJw1}Ms1rOW_PMOLy5U|@iT0jbdk0|1rJ5^rEIKWYE~002ovPDHLkV1l$= BBE|p! diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom_3.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom_3.png index e93117e3f0f05e2e6192007fdef819ebdd0e6d9e..34659603fbf6db1b439daa30c073fea77524a75e 100644 GIT binary patch delta 62 zcmZo>`O3UuJtL#x7>?>KIKf~jc#pBHanYU7Q#=BpDXRB1JLA~? ed-gi90Rh7fZf?sZd;5eKfWXt$&t;ucLK6V?j2RRF diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_grip.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_grip.png index d9fb675cbee8cc23052f88904baa364119fba94a..fdd45e2b00b7976c5a8f12b73574f575a880ba81 100644 GIT binary patch delta 71 zcmeBVdB?nAJ)^yrr;B5V#p&b(iG2zePd~7Cowd98&OiMej(`3W(o7=Xaj)z4*}Q$iB}GR7Pt delta 98 zcmV-o0GX>k8)>0Bb8T?1aBx_pO5d8npJdOX?_v;ci0H&!s r#|?}@nn|*qEKS&4!7vI&!SDwFaJ(|n=7*qU00000NkvXXu0mjfHD)AP delta 118 zcmeyvJeOs|dd9p+PZ!4!i{9iE1woZ6$v^JTj3=!+dC+I3W8gcj<`qiX&f(_9b<7D; zTc;e60D&Ve6_R{&c5zRizyB?hGPfP`mMKR9Ok#I`?@Ii)joW3X)auXf2Q?&)F))aG Wi$_gyo3ft)2s~Z=T-G@yGywq0S}kM% diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_1.png index e56f2ba1214b8d02e48e0bea8992c72c05ac67c3..4093981811dd7045bacfe85750cccbee996a0812 100644 GIT binary patch delta 85 zcmV-b0IL6;1pEWAuK`UsNklb8T?1aBx_pO5d8npJdOX?_v;ci0H&!s r#|?}@nn|*qEKS&4!7vI&!SDwFaJ(|n=7*qU00000NkvXXu0mjfHD)AP delta 118 zcmeyvJeOs|dd9p+PZ!4!i{9iE1woZ6$v^JTj3=!+dC+I3W8gcj<`qiX&f(_9b<7D; zTc;e60D&Ve6_R{&c5zRizyB?hGPfP`mMKR9Ok#I`?@Ii)joW3X)auXf2Q?&)F))aG Wi$_gyo3ft)2s~Z=T-G@yGywq0S}kM% diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_2.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_2.png index be523a70f409f93cd9540c73189b98210a24d926..d1c8e9d045102b56ef5a7a682c41da38db7cde9f 100644 GIT binary patch delta 84 zcmV-a0IUC$1p5Q9uK`RqNkl*y9 q0FVY425BV8c5JR-7zLwX_yPd;Su&bDD_*An0000w&5YlG?i@F`0b(M&3O{gs1oi{4uK`CgNkl7}Oxq%iupDjMsqf9Jl|-cws{@7$2Ia@&EdM lUBU){0NJ*Wf>AKE006p}GMXs7$bYez|e*5R12cdgFOF^u*@c;k-07*qoM6N<$g2GxlWdHyG delta 228 zcmV6qnpwMRHx&NRk9fDKt%USzQ>k?fbqiibC`JF81-I zs;aaQ!ZeJT+qOO64;Q-vZSR?fVZgR+R;+ajBy&_z6v6YnQ!>R)|3TmPhHSGe1nk*@c_ht zSTjaxuc%VhrVUgb8_Cfn_W8~h_~OKIY)A{k5GR5oA*D1VW?6=HU2#4_&hy+PNrE&@ z(Y7t7X%f3fpzSD%uq?|>lVk$P%M~OSMS-fS;QKzhuG=jP+F-ttOkLN8_*v}Z4w|Mh zLTqC5JfrXX?eWm%<>Q{CZQ>vZFpeX%*4A391Cq{y`*B2Ub35DJd)bSX+{!*oKB6B*L08~}00000 LNkvXXu0mjfc(g7t delta 165 zcmV;W09yZs0l@)~B!7rWL_t(|0qsyL4!|G`?PhUk1i@hu9EXJaaTpH41yC45mm(In zOt2+$kd*ZEUSC^SZ(ZQG3rH!^7=tqc`yE7N?>#7`?xn|g8?)A0thGXG4PuO!+K3zd z6GY04F~~VXO6kmx;3vPY;G9FwIcTk4k*VQMW0z9;*dc^zWga4T6G9+a4?cVcwlXM( T;vV4D00000NkvXXu0mjfiG)Tm diff --git a/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_accessory.png b/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_accessory.png index e57061d2182a407f17701f134c1f55fe7cd6ed12..f9a51223f1a6312561b8168e7b079a77ee161c3b 100644 GIT binary patch delta 151 zcmV;I0BHZX0+9lcf`58RL_t(I%VYTe|33pIm|@g_Q3H?-=$JF_f6L6-|J!HJ{ZFz1 zla{UcU)|eZ8=jh0YwO`v+dO^7f0A9$vtZHxhDlTZ`^Uu9TDiK_)=!-LpR6#bpEUV@ zKx}+%ZT}?l45;p%@V~IJskXLn;(xMZp<&XL|8$E+0HuQOjt~Xef_(r0002ovPDHLk FV1mEoQRn~w delta 190 zcmV;v073te0=NQ@f`6e&L_t(|oMZg||33pIfQ2I6qXrB+13Kr<|NrOjUj}9-CWeZX zBu0`9n7n-D|IZ&k*4?>ro#ENzCk%i7{Qh5)kxrB$U;}a^!x?)QF8;5ntIzP``;WTq z>(i+#BE{|XY;y0h)e;E{2lo=R^%w!k_ sv=rqtHcp=Uzdkpc_%J{R#A*fs0Av+F)8O24RR91007*qoM6N<$f=41==O&+mPf;lV3_~_002ovPDHLkV1kPqYF+>U delta 277 zcmV+w0qXwM0*(Waf`9i(L_t(|oMZg||33q%V99}l|9}7c&%n;a$iPCX=K1>%{GT;- zTAiGnJcFN~PZLQ7%-Xr{|NPlA>*N&_7~H+QnxY--8HqMv)~V6&%91AjZ)%g?(h!2zL}paDA$ z9s0j|$48c=+)Dg{xNA>Fa1SI2su>IoR1^XvS&40ifn- zD^}IXD=IQL85=d(+hW&@*9EeQKtG$A;?<1P00*F^zrZBwh{M@Lxxm@Zj-Y0|1`rE| bfdK$CpHX;xE)E9x00000NkvXXu0mjf!BH%!`13ycxN3;wL1Ef z86qbn8T^bxCoDIbI58eFq|(COUCEjSA3L|m0eaBf}U{8(!00008vTs^-r53;r`R zG1u+extqbq*`bLf1KMWK|G#YhoH`jk?Cw8U8ae zG!-NyF@nU2GGM~IS^rrX80zHZ6&P6l|8L4qOlE}15j3EG-hZ6`ix;h|lao_m@U^pQ zN=rg$CTPHUT538Yx*D7YOaw+1%fEkhva<3F{}>pXvao2z zX~2Yev;QwzvI4Bx!`iGVBRvDFW}F86VPIqs6PI9cv9oB(Oi9D38K(gyNhyrqe=+{g tO-aV98K(gtP#~K@STkM&hy}yI006UeQ}PI!b6NlZ002ovPDHLkV1klyiqil9 diff --git a/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_handle.png b/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_handle.png index 299f41ec2528e47fdbd91513bd126fa57f2cc6d1..f15137cdb02773e3a6cd633ba9aecfa2b8e77631 100644 GIT binary patch delta 151 zcmV;I0BHZM0+9lcf`58RL_t(I%VYTe|33pIm|@g_Q3G%pFlpK9|1M$C|H(3-XW_E{ z(fK8{OLuK2-GKJFi~l=^Mc1y|y#7DQUg(&&_n; rUzdDCU?>&Js6c o;a5GY;4m>wV1dVH4Fy>S29=W`G7}ya`Z554r>mdKI;Vst0DEK~9RL6T delta 130 zcmey(ypmA%-Lsd{SwdC zKTMdh|1Fd9MYe>?K3lj8GSyBo)Xd_PVz{iMcIb4$gDbH-XDfIW+>HI0JFcE-(3TZg iExDZWNR}LH2onQ)mBV+*osl67K;Y@>=d#Wzp$P!E9yKcf diff --git a/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_blade_broken.png b/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_blade_broken.png index 4bcddaf746467b5293bbff15028de55161437fce..0ed840ea68324d1248e03a66bdfbe702f28888c0 100644 GIT binary patch delta 95 zcmX@g(#Eo3J!80&r;B5VMQ?I~0<%h$}7>`<4C{u z%ta@jH5Pw6)RyomSIyg)BVdUni^e4zE)RAFU;e-i!JR@03_#%N>gTe~DWM4f{=g$) delta 159 zcmZo;Im)tOJ!5^Nr;B5VMQ?J70<%h$s z!-N_8-!ds*WIJFIzx#U^NIvo3HtrstBUOyga*7wbYs~8W#AKGPeEP8|!}QG)8U6GR z%+Xal)E#W>Cw?GDO!#4{MZqgQzq1yx4r|ipunDZL6bTULWMFvs-bV8N%tKuaK;Y@> K=d#Wzp$Pz86hsIB diff --git a/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_handle.png b/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_handle.png index c79cb7ca7ecdbe4b42b69878c41cdad6a7645000..4afc9e1a0b6da7cf00066d7d5cdd6f6e4ec6c8f0 100644 GIT binary patch delta 82 zcmV-Y0ImO_1o;E7uK`LmNklG!2_h3B4;0( or$N5v>-%-d(+o3!Y|TIb07v{NlvT2|)Bpeg07*qoM6N<$g1>_!B>(^b delta 122 zcmV-=0EPeg1EB=4uK{vhNklW6M3?RkX7$DKh;Qyg{8vhf$4E~d(5vKY2eqHi3!weu> cGXnzy0A%efqFp91KL7v#07*qoM6N<$f^7vdB>(^b diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_binding.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_binding.png index 61d670bb02e946c396fda1e65da00523110f6239..0bc7acc5f4fa402e4aaaa7c077d03869ac42d4c4 100644 GIT binary patch delta 86 zcmbQiSTaE+z}nNrF~p)bIYEMTae_z!Luu*P|00=rIXQpMA3NqYPtniM?>{dO&%f;K q?EljzPE@=rFhNZqEiFyW)0iP)vOu8hx_$c@fWXt$&t;ucLK6VBjv&JT delta 122 zcmV-=0EPc_m;sO^bYDqCK~#7F?T|4Fz%U3!ZHJs9d+w2AKB*bk{|A z{{Mv!IoUuqur|7{_p2yEbd1piU+sQ85UCd9lmGw#07*qoM6N<$g18?z!~g&Q delta 223 zcmV<503iRP0s8@vB!9w5L_t(|0qu}63WP8aMgQ)ipp~^)*;v?k21}3N6>L402k{m* zf?Xh8ASBrxAz_tBtd|Xhfyuo8Cm;Xw3kf{#d?Jb>Q`a@5l;E6WU027wLIQ2unqe4F zmL;^-nCIESAr=J3acsJ-GfmT&An-jfj^hrIKv5Kzuy-AD&RDVxLI|X3ifNj>b7XjU zsH$prN|MAI7y;+|v<-s$zQ?jG$nzYZQ=2aki9pIF^DnZ%A8U{?;WKS)LLcO@c^dL976cwy+5nM zM@*+_ttHGkg`+Jvfa&bb^>faW?wo_x8pjm~&18%rT>ZoIgd49<`PWbD15o==fQai5 QXdC_uk?p2HY}wo`3I;5<*^Wm#m3kDLO5 zqYuM?aU7ww#=h^c)?!^(=?YH33R)m%Sw;fwFgcDxCipABVuE(aH|YP)Uw(h!3)TKh U19{O%GXMYp07*qoM6N<$f(Z9x*Z=?k diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_head_broken.png index 3683487500181f473462a09f586181a1af8c3505..dc361810566239e35733603d8ede624bcf0e07e8 100644 GIT binary patch delta 155 zcmV;M0A&C70k;8=B!7NML_t(I%k5FS2?QY&6a=dfVCE?2^5oSEurckzEAk-lz;pzE)>m+M_ku!h&KQL002ov JPDHLkV1nr6Li_*# delta 219 zcmV<103`pn0rvrrB!9k1L_t(|0qsyR3WP8a9OV!@!NNiW1+lR6F+R;_*!UB{4=C7L z1`-m;xeG}dvAzq*&Mv#N%mi;vRaKVW8;+kH$I(vHWRoPZ!!TIah+Oi7L@LV?X__LA zW6bl+Tn-^J5vjkfYee$1EQ2uyLI|Aa83h**p(qL{rO@|1?NmY2G>rScvx*N_fzY-s zmSsU**N{?T+cs#eaU2J;f(mHDS;+I8N_1VvcwHAOcwE5KcOW}A_)GqM@lSsK2fpiA VKGgegRyY6v002ovPDHLkV1hq5VL<=@ diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_shield.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_shield.png index f3bed20bcbaa7dbecc5fec74da05c477d5107169..ccdb9f591b3bf20e99c5d9c05ef4418926a2e47e 100644 GIT binary patch delta 96 zcmV-m0H6P$0e+AqT181jK~y-)V_+DWKwVw^zl@B`f3h@}l$87j;gFCJ(hYEOa{3Rl zT}eslKQlA)f08wWaC&+=7?bP*ke`t;!zdU9NB{tFp&nQgf%Pu{0000{paGC1d}m2SK~#7F?NGT5z#t4fq>Mp}*n^oEi=jY*k_jx!!AR*%o5b?d z`0jkhMHgz?@SruoFC< kH+r?+yIFj#|M~I{+=lfb&X`WFA^-pY07*qoM6N<$f|^A<%OGL_t(IjbmUK1*2dTV1UGm>i=YGPOq*1A6-;Z>z|QDo*`L{ z&Huym3Ts1wIIq2vbVI5pPWfLoY3lz9AWe!s0Na)ry!S7y9{>OV07*qoM6N<$g5Z`Z A9smFU delta 122 zcmV-=0EPeA0rdfpf^%L;L_t(|oMU955U`9IFlxXsG$65}`v3fnRz|W6NUyE`|K;n~ zI{%EU{~KpaBiazS0n98c41fOoWng1tugh!i{6DF(oG3%!1_%fUG6)C?HU0blpP?f^ chiDf709wHs)450B2mk;807*qoM6N<$f(WKIw*UYD diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/inverted_lumberaxe_handle.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/inverted_lumberaxe_handle.png index 448015180fc40e74558f7941a6f9c42eef882aa9..96bca1a70e4b284daa539f6964f5c6f649696f92 100644 GIT binary patch delta 208 zcmV;>05AXk0?GoAf`79~L_t&-8STMa3&C(02jKT};l`Dc!-ZoMIV_unl0~a`NzN%k z(?W_%%xrwVpReG5&GXRT&uGpT2<8jOwly5QCrE@knIn+Oa-z{<>+OL=$ioSIi8RM$ zm3Q6?B%(f=!k5f&M3Q-JKS3gt;TZm8hNCrwS63VKEyLPFH%TpoN)^s^x@@{H(6@T) zEu{W{W3tL+?(_L^2Z_*@8-%MhF6stf>>Ehb!ES0{#M!f`8{pL_t(|oMU955U`9IFjNf4>+Jb|`O+l@adB}57e^b06kmTv zq7BGy@A`l4%$YiI32_ETXS=2pZ(l}adAtT>w6y;}57aCwD$3yE=Gv6*?Zb$!2B!g8 ztsVa_oIhVDBqYS(?B>>#>5HiurvaHQZT~L^5T8|pO01_l$ zF?;`!Q&*wrB6JYJ!R4(6UHnK)^1hFQSe#5;#WUW^^KkBkUog$AE}x$Deb#OgoS0M# zi%aZptS8P|&P}S_)xc|1aA6*GxHCwE=tU6^vl(w?HQ)Pn1%KJ=3zDN3^^p_HLBQzb zI2qsEsn%d(QXOp%l71XxtwRz)*g~;VVgdynjj2{j5;>a6c z-wNMjbUI9IWm)O2;i{4{&jIl2e(=TF)l`0~jo0$AMZv+=X5;KXf1eM9wq$Pp+D_&G P0000X$F@NPrL_t(IjqQ*MwMSyn9%*mf^{9GP-|Oz9J zOkk{nj^}qYTIVbCCz|lpoZp|bN;u_nfJeA?tJq6KMIB| Z006iODAKuO3TFTS002ovPDHLkV1m+hIS&8; delta 147 zcmV;E0BryA0gVEXf`4{NL_t(|oMU955U>nQ1N`#}|C{S*GgPIeFp_M5UvA<5KY#wz z{r&f^iDVZ96_x#G`1h}lgOdX;MzjIG`NjW#{`ytN&Be*U#K_3N%*0HZ0cP4-3=IGO zH?c4?F)#uRs7Ov^B*}o=n-LBunyJKIxcn(LT g9%E)xV$c^xhQ=l0%!PXliy45x)78&qol`;+09k+=egFUf delta 90 zcmeyu+{m(FJ!6oqr;B5VMQ?I~1nc4ik%R^p{pSBmUL`tRnJm**6&fosl16h;myz6dIpcKG_o;pPvB>k`0Q@Y00f?{elF{r5}E*w3?py= diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_handle.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_handle.png index 20051bb1ace9048b85660f6ea0277580beef4a34..5149876a219d84f3b66bbb95026c2b8602aded27 100644 GIT binary patch delta 82 zcmV-Y0ImPM1o;E7uK`LmNklbYybcN delta 151 zcmV;I0BHaD1HA;WuK|B~Nkl=5obOXGff+a@a2U4`+yh&Yz(D6Ggl851ib(N002ovPDHLk FV1h4NK4Aa= diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_head.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_head.png index 94df4c9522624a2383a5cd86d30cfbf5b99dd571..46aa4883f0358a38f802b6919e40060adf873edc 100644 GIT binary patch delta 108 zcmV-y0F(dL1d{}?uK{FFNkl=ImtN{QZ#$&3Z+63JI O0000|CZ_T+V)-w1yfpZ`^pGK}7gOoABy# c5uSPmhOLv0CW@N*o@W38Pgg&ebxsLQ0QllbZ~y=R diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_head_broken.png index 50e7dc7702cbd2a4cf0fe7a0936935381d2cf4a4..b0f8695e3c934f3f1035d3ed7d9a0371ea22d695 100644 GIT binary patch delta 113 zcmV-%0FM8@1egS{uK{UPNkl-n$N-`ZL3cLHfQ1dg#2Wx}HVlI_6Kw#p7mziRWB|HB6h-AI7`6ZaJkeO2 T*zYB100000NkvXXu0mjfk{Bu1 delta 152 zcmbQivX5oMddB)HPZ!4!i{9h}1xA%B$v^&IjDGa%9CMlUY=S(`rKB336Kw*y49v{T zhu1kL@%*uo(MV$9ZLqBVw~f2UKfX380SGPx2{rF#TFNGYWaC6dYVEpo8_Wrj_7pvS4eqd*K-LE-G;I1@p0Rs?ty85}Sb4q9e E0NL3)H2?qr diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_shield.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_shield.png index 3d6775683288654d09dab5bb6d49af9c064de1a9..5fec760d0ae82922b007f972050782d339fed376 100644 GIT binary patch delta 76 zcmeBV`OLgwJ)?`hr;B5VMQ?I~#LNZO$KTd3ntrf;lc|0VhuV3D8EKn%9Ip9HV^rWh gF+=6-;)EN_3~Nl(ieCtBsb&BIPgg&ebxsLQ0GKNsTmS$7 delta 98 zcmey&+{vPN)78&qol`;+0QRgX ALjV8( diff --git a/src/main/resources/assets/tinker/textures/items/materials/bucket_fiery_metal.png b/src/main/resources/assets/tinker/textures/items/materials/bucket_fiery_metal.png index 8461f9b5e3b246be4e92581c1a10cce62237e51b..19dc384c277e766e85f9a9e3110ca1ac3f409d5b 100644 GIT binary patch delta 231 zcmVn&)=_3L)wM2n%LoOcYv3Da(Kqf`wfv6;+*HYC#Z8Zcc9jx*Ft=yg@Te0GJ6t h;ch_w7gGJ?<1L|K8HcgQ(vScE002ovPDHLkV1i21VCw(? delta 395 zcmV;60d)S8BB~>>0}u}eVoOIv0Qdms0Au+PRwR-TDt`f3NklZ&b{Zm=N!(3|CY2bXj#@evvpn11~E;O_s0i@llwg0yS}1p4{-2(e?MR|*|lxk0NlDBp6BHklSttE zKC{^@AK=amGA$MhOw***Y5@=g0bP5rcah{{H*R>-J8ly@olf2cfaiGxK>)yLG}tU&+( diff --git a/src/main/resources/assets/tinker/textures/items/materials/bucket_knightmetal.png b/src/main/resources/assets/tinker/textures/items/materials/bucket_knightmetal.png index 685aae983a64b022b2c27b99a550c4e5c00aa964..d73767ce3fc3c1dba79846474c55f9d2b796b4a0 100644 GIT binary patch delta 230 zcmVxTI*Iaz*-w1 zDTs7=i~%Twr~@Dj%*L1~w2)Gk0VxE7Qz;cy-Ck-z5NvL4Zvna*ADP>I(ll3nu1EZ!sD#I{*Lx07*qoM6N<$f{u7(2LJ#7 delta 387 zcmV-}0et?EBA_F%0uT=dVoOIv0Qdms0Au+PRwR@E4=R5FPf0{UR5;7UlQB=iKorM+ zB{pnLOFB3-Bo5k@LHq;`E;1T6Cl?)DSjxl%OBWNv7jR)~(htDGB4J_07zZ_m#CkpI zYQzD!6e!U|6aUl8yLZ3$zjt@=-_o*@<#Ktth#kjK`5*|^>bJ5sp4Y1sYy$uhB@}D} z5hVcARgiy{-h5uKB85cH>zI~_HHXAef{Z0jahv$o zvJK){S1jAWv`n5K$F!TB%|{5skV>TjK;!xX8B4Wx)wltmR;%Irel}n-nGl8{fC4S# z`DeU5jp_IMn;k45uIqAodCbAyk;>n_-jYjfKxStH=98VaS}gz$_fHrOhpJG1NFMGb zyl})@t`Z(HA8~e`)?eH^=}0002ovPDHLkV1mFgvrhm3 diff --git a/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_back.png b/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_back.png index dc4634a871238ba58b16e2b528d4376c0ab77514..7296b7166308eb8a218abe3e68d0d237fee7a0d8 100644 GIT binary patch delta 94 zcmV-k0HOb~0ep}oSVKufK~y-)V_+Bs^atwd>i=bAWd4(-*}%Zye`90g|GvJy{~;kE z3iqW~2E08XMExxxCI2><{907*qoM6N<$f>yXH AGynhq delta 149 zcmV;G0BZkyvH_4Je|bqnK~#7F?NBiaz#t5arMS5{Its3i;xGKC?+`~H;OOWd(mDiJ zr9&43A(!JWfrC>&Bw&m|r4-U@Mqp)HYcYfXLI_AHL5z{zD@M|kQdsXDrIbX$)`8(_ ztuf~udhbDNjn^P|JLe3XbEviMTBqK=dCcvgPYFD8tsOmG52w|A00000NkvXXu0mjf Dq&Yxh diff --git a/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_handle.png b/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_handle.png index dfe32a3bcd0f9c65278d36c835e11f46b69022ec..b95261a8b544e9d47343ba0861b95e2cf703adec 100644 GIT binary patch delta 134 zcmV;10D1qA0;2(tB!6m2L_t(I%jJ@>4FDkw1CfxJf`XogDnn2rYIey2tZd}s2f&n{ z{&I2T5dJr%6y%&C!D}t-y)oy!Utne!V`z55y?3DWC0dn1@=H< z0165!7GMB$;YG6Lh{Und#*%#}>ps2v!yg{4wd8p&rgUYT5Zg43R8<8L!8A>GG8aA} zw=7F4V;o1U>uR}cD4b;(mSuT?Ls;me<|vA&ZtHeIn~M8sd~K#po1HJwMf1I-y1n>Zt_(_R_X)U_|0000>AsMFrQePhk@r!7_D5ae*vg<-R$-aOH8t z+6N)kfBYn+A9Bu~PEl2FtvPl$TuRwtGxJ)jGjmLWz*@^iWDg{ehFd^{Fq(`p;^#ns tNA})#6C#Q?c|{mBnRA{!_Hy~+0f(hHVk>4HE5b9YOOJjBczn* z`~GK=tU+DZSl1PtbF^)X5CX{boaA->NZ$mI5y8u{z&QtF3`e$YJGi4r!L+96LI@1Q zfU+#1l!Esj*4mxjj}*w&WJKCDO{l60jIpmIq&@qY!0icq05PdI;lZ+=B>(^b07*qo IM6N<$g3$kC3;+NC diff --git a/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_head_broken.png b/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_head_broken.png index 1eb9bad4b2a98a382cabab729444463ca7a48abe..bcf4be79f41c69f474ea3a90356aa7977e81d26a 100644 GIT binary patch delta 127 zcmV-_0D%A50h|GlBzR*D4C007bXF$p-!Mo$0$002ovPDHLkV1ihFHf8_- delta 189 zcmV;u07Czq0oehNB!8euL_t(|0qsyb3d1lAeeIMbTgDtBH^>ICMTLn(!2S-z4yXt3wBIi-YB z3Y>HB-oskkV4CDiL<**9Le3eCF@z9cjDZlM;%aaPzjKmKCpN6>ieVU_wMLAwD)~w9 rNks9sZ5YQ9Qp!dN^=`jE@b?E^P;ffm!n4oC00000NkvXXu0mjfT4q^- diff --git a/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_back.png b/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_back.png index f9dae3d66a0a12b0dcd096fce17e74e9cea18683..5785e1f4bb19002b3aca5aa21f9d58c239f1a469 100644 GIT binary patch delta 133 zcmV;00DAwU0)PULf_`a9L_t(IjbmUK1@s3oO)dZHXU_S5_Uu`P|NsA!rnz?7tp7f_ zrL_(T>9w^}r~N0{0FZ{d8MFVx3@9ilAl(44A=795w~a}tZ2%fZmI1ZXrv0~zkE?B+ nJ(oNKz^<4!lk_kc1=s-qf3--+%O2 zowJSgf3gDc|NlP>jLiQSSeco~i-o4lOvZW!=KobGNu-4VBO)Us3b!dMeJCa*sv7_R XGaxJ5yBDWK00000NkvXXu0mjf^E*v% diff --git a/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_handle.png b/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_handle.png index bb109e9f92a12d4f710e0d2c9855fefc7e5a58ff..6f63290067d5c225734eeac0f8d9d27363be35ba 100644 GIT binary patch delta 208 zcmV;>05AW81IhxBf`79~L_t(I%hl7(3W7ishGFlsf*@MB@CJmFAT}nNHBjhM!5>be zc8OoRAo6c))nbxWJ>q8gZ2n^R>PDD z1*(De4xECqK1RLqB;XVbQ>KIQC}8I$HX@{OBpw9ptibjZlSz0eXy3shFR^k3`7`1# zz^fVi@Ir#;#UFsrj9n1ZbzLvgxqoGra(L{O*cZd#{%O0000< KMNUMnLSTYYoMG<( delta 266 zcmV+l0rmdM0)qpPf`9BuL_t(|oMZg||33pIfQ2I617bk$s#X7aSlJlT0|OXIHlTI+ zs{c=4yspz%kZvN`1C-x0HHD_KkYGl1dAtUIG{1WL9;ar!22?Lv_W$wIXMc5is)|h|I5gulpnBob z|Ic2$s?$_az^fUn0rfzeA3l0ir=y|TR1q42S2KnItt(djfBx!Kowho0no$hs0H(0} zkAR`AB-fNrz}XlEbOAL#d-1ML52!hh1kG>*SeRHCRHVh5@`3|N(hLFs?J;1W#$@mq Q00000NkvXXt^-0~f|^WzasU7T diff --git a/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_head.png b/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_head.png index 41e9dc7ca5458ecdbbff6cd3747b50bd15cfc04f..16af9baed004b43dacb24c1cb789acf0bfd9f38c 100644 GIT binary patch delta 191 zcmV;w06_or0=WW^f`6h(L_t(I%VYTe|33phJb&rp|M=wbYMuww>=YGSJ7@XQ|0El* zVDX~=F0t{o(Iw@zQH3S7^KiHXx6{D}B!CS7;h55j+8L`>{3po^bCxan?~#~N8(Cad z8!E;u1*01Qt9+B|E;(*L0a tMgN^*;{VTFx%@v#29OnvqXvu^0|1sm=AL4^hJOG6002ovPDHLkV1m60U-|$5 delta 250 zcmVrsEU;E7}sjP;H)*QMf{CPKiwn0Fo}35@-TThRg4QgfLAA_UZY0Ue3aXujmJ zcpPlog7x9d9nz_pPT@!3ky18?g!nA8I$ikHG+}!@^A--M?l%bq9x3~eXAgCXkPY+I z2K4b1*!}yeX&FBPuQdGHm5dTt{~8eG5Bvmh1Np*KYR&?f(M` p%lmW(Fa)mw%zu9}FtIQ*{QUcuVZ+w#b^reU`yXm$ied;}1O72G zGCY6&ib0r{m*LOf-wa1jpQ`))@8AC@8*@gY4DdIzX8it(8E6>H{~3P&`CIqq-Ft?M zSFY4?u(JLSGB;u*XaERA*jRuS0%PkxD+?>b);)U}7Oz~%@a_B8|1l1>j06pUfhb!m putA}grYPb>8-NRp8Zayj003IAO``D*V%`7%002ovPDHLkV1hs%b1?t_ diff --git a/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_back.png b/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_back.png index 0a012b38e960b5527635bd03757f95980ee63741..a97cf6b40e357c5c6178fa75b07e66a66c81c358 100644 GIT binary patch delta 83 zcmV-Z0IdI<1o{K8uK`OoNkl2gCd|9HhAb8Hg&flB*Tr3d&3v1#kcW XonaH_^l}}300000NkvXXu0mjfeeEwx diff --git a/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_handle.png b/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_handle.png index 56cc2507cf77f42f04c70c2f27e689a072c505fe..27720da2e37bb99e96bd4ffe76baf770ebd4eb63 100644 GIT binary patch delta 83 zcmV-Z0IdJJ1o{K8uK`OoNkl*RrF#VT*=)rns-l+^g;OXk;vd$@?2>{ey BKr8?N diff --git a/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_head.png b/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_head.png index 1e1de1eacebcfcfff1e01ad91c2c8c70b264c310..36ac2a55e33c1c307c5bdd0045e7cd29797d9d7d 100644 GIT binary patch delta 82 zcmdnT(#^7AJtL$0sxmi@e7!)u^+Q(ywyjA!p;w*NQfEPEokX@jCfkERhz mn!wGr1=23t6c;CmJYZtrZ*lR~?UsAY00f?{elF{r5}E)bAs!0= delta 133 zcmeBX*~hYBJtJe)+A3kVMf18!(tIv-ZhRZdd z=EyW}k&q92|Dc5Nj3{5)DIO45f3GI($B(D%hcAcE4~S{H&cL?Bp~N8gSQdvP^9IS1 k-v_gKruQ@jItVf_l>V`KmFKhnDFYCAy85}Sb4q9e09QdcjsO4v diff --git a/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_head_broken.png b/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_head_broken.png index 27db81def3103c79de6336b70dcae5d2bc9a1891..a15cb56dcb5e0884c48aaff6d0b34b3f6b28964c 100644 GIT binary patch delta 91 zcmdnU(!{c1J!7z)r;B5VMQ?J#0#lDKMnCuurDWTg_%rvMG-63}DDS)de-?}NC0@qN vh#LYt$3!HVj5~6iFYqeeo)BojRlvx=v(hSUrKA1<1|aZs^>bP0l+XkK39ld7 delta 139 zcmV;60CfL?1hE9LuK|B;Nkl6` tPYf{c5HtXrLAM{gMloa*i~@=Q0J5Pe$Tju2mjD0&07*qoM6LruV1oL9J5T@s diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_arrow_shaft.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_arrow_shaft.png index 617e320ab9efef806b520aaf86c590fdaed9b8e9..2644d1560bb86ce7d096f401af187aeccbfe08df 100644 GIT binary patch delta 114 zcmV-&0FD3r0gnNYBx_blL_t(I%VS^|UckV>;J=xf*?+PPkdcx3Z)9ZjUqM0PKSi#f z*btCQrc9agKQ1nA5O~MS%ZoCXFf%iQ4WT%88XFraa|z5l6uU%QTbnuoJ9zRB01b;X U4L?E2=>Px#07*qoM6N<$f?fnJH2?qr delta 224 zcmV<603ZL40sH}wB!9z6L_t(|0o_tN4ul{O9W~Y_78b_B+RDm9=p8&2r=sKp6qJOH zj?V@X2%EsF)h1HROeQlg@4W$D_SSW^+qT&!vg&l0a}G)=nCJO6$QJ-(tTM(x-}jF| zQWCzNrpY3N?0KG-Oe(*T2@Yf!1`t93rL;I#XLfxn$XS*J?pZMLOS#ZAjotUXc%34H z0H(FB2qADBN0v!ZTL1{z{gH7T!JQgo9QR@o27hH|Y}a)lrHsa2N=N~nv2ELeGdAu2 axBdX(@^&%4hjkaV~{w}UVz!Gt*s5lB)I@)2*_41FR%YjPEP+rLPAJ40OSIg|3QX;*dzri qvaKMEB_$=Ky9C)Vq62XR0swSVLc~XPJ=p*N002ovPDHLkU;%>seKOGi delta 223 zcmV<503iRQ0s8@vB!9w5L_t(|0qsyR3WP8a9FKc}XlErpz)F08Pq6ieenRj8f{j>M ziDl|Q2zzc23`q{`?*a?ElbK<6@PCNh46-aE8{7BYF7nAyAejv9Zey8gTMOQGjpe@YZ!j(=@2-+SNas+qNa%;2Hb( ZSRdVnNf(`uSpNV3002ovPDHLkV1hV#W{dy; diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_axe_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_axe_head.png index d7b3b114ade0e113330d4c77912d031264de0a8f..b33b646bdcedd209b213c043f701c399439d6c3b 100644 GIT binary patch delta 133 zcmV;00DAxE0ipqrBz|d0L_t(I%VS^|1+)V)GBW=`m~72crcC+Y*x2~rz`)=?$(oIf zjQ(qDYr`=!Gc)mqgoK2E4G0Pf`tRlC1;!;MCI3ONwvnU$3lOglL_ksc->4It;M ntE+>tgJoH;ZQCu!Y+^86 zmL;5X^iS>k4)1-!(oBlOFhnUO>bi!tmJFJvfl>$;-v`}4Bn zIH0xu$UF&N^#;Wd0)!A4#}P$Qu!}36Kl58%*Tp>fo5TwT?m)hFXjygu0000clzwOV zgc0+{-j^MCjPv*Asl)Iab{vP~oExmQ)%W>%o*SHVawAyRRYC|i(CodJecx-(wr#R3 z%b5UH9Y`s)AS<&nAnx&~fICvutxWh{fib4#UlqWLRJPK< zfXb#u9{=?XdZ3CQQTeZLz!hMo2smpDL7xK8W*-Li(x5qmR*V1u N002ovPDHLkV1li4W;Fl+ delta 351 zcmV-l0igcw0r>)uBYy!vNklhKoL_L9xZ}QgJHFX{`1{WnTX;U7ooSj(B~(?# z`FzIlctppJ&8BFi#NCKEg!4}T;{g6VV$$8qp_y+kXp z-|xG&ZAG|PEMVKVh{ofwa1_u@p696R8bwhI9T&?RMzk zdcAf{)4+9I@YJfRq@Fnw^6T{)4M_fY{qRFC>?D!8{BR; z91aKJ34{x^I&@>IF(@7|{_In26V7Xl4a=FNWSiqd&d7cRQW$)zZU_PG^Vql<@xg!~6#f(95E82s1P)2P*Bi+kQ~vj=~8jGn+6l(pbmH zu?Yr{#fVP{G91G#dwU=7t#|@uSsGgS()Ycgh4?=N@;rx>lCZh1>&Hu$Wkzd_^E~N# z<_I2Q9ab=oBj$O=aU7`Y8vDLuUDt>o0XE)kim)0X1h#F1Qdug=6^@-a7+e$us;WZQ zbqU4`B?XwBbGYvt(=>tow{2_Q5dVw>7(5IEnx=6*v-D+ITotKb@a3#WfmAkPG)wt* aFo6dsA4@+OctS$}0000=umY@0y@-SeXlaL%W-cJAu$WG zl$27U-unaM9oUXUGx*jTg%B>y(7Xh|?3|-926^w_nh~%Fa4UALm5$^1*bFnU`~c=s g3dI72ZqJEx1|@$Yq87+p00i_>zopr04if3UH||9 delta 112 zcmV-$0FVE2jscJ)YE?-@K~#7F?U1_(06_>uy{*PTOR)tDu@MWiA3YE@*v#+_*1#XU zQ3n1OB2w;N`}1cvlgiAs)`HB0h-kLc1Xk6)iilulWA4xdv&Q>IM$9}*G*$9Qdp*#xr1z`)=?Gcz-oCfctc f&3J7Y1=I%su%|D@h$2g>00000NkvXXu0mjfIGZ$j delta 191 zcmV;w06_nm0owtPB!8kwL_t(|0qsyR3dA4~oU77@JRoHtBwc)jwY874_7UO>1ixTq zXJKLG-3ljnkm8CfQeQzqthJXg%s&xaT#BbXc!!W=(_uc`E zqbQfhUTp|gI#GIyS?qsg0^0r0p;e0+9I0d7M+-|o)fy?Eh`|Wna{eI7Rc7K_a*{xP9^*j%+*GnPC zap1Zxw%aWQ6yx$yfQOAn1I%EtSYWf+;B-21=FuTv!4O*qqtEAaT(4KGRx8-Ht(gQt zpk)Y_^YR~M%0lvRIE3%}>MRfrhXV$K0ir0v^Z8^6InO9zG#Y8Ne!s5*jOx7Ae>@&@ zGQ|yn^?F@n7Jimxq1)|Zxm0k8p(B!72FL_t(|0qu}63cw%?MSp9-(M8a~LwF81!7F%Q#nr1wihCo4 z(#=31_0EIc&Z6-jfi5LI^bHHN8;hJ1HevAY1y9zzrKa9%s#H2n`Vc00006jg5`}gRq8%2Kk1#xVXR#A=@C3 z#_7|igE7cJvJ8NE2ZUK!S^tye6;ObJFvun4<>llV!p_eAUt3$7Jg+HGrES}y9Dry721QXI@7KQXX#L?U%TRF)-KYf~kE;9f4gNrvK|`eOh9002ovPDHLkV1gt8Y32X` diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_crossbow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_crossbow_limb.png index e5bb9b699a433e20fe6904a7e887f7adf28326a3..27bf689f3e33a7c875ecfb24c9e3db1e8a23d94a 100644 GIT binary patch delta 162 zcmV;T0A2s70=@x|B!7iTL_t(I%iU5t3cw%?6$DS=;O-(0j-EnS@8TW2Z^{c~DA*R_ z*1#hmzK@B<{JX{&R7zol5N>!S%B7q$#TXfDEykRaduwek0yiOg?`fW&VVhs z)=Is1COmxvxW#T+fChq%AzVB1lb$^tmDF;~BmF+Z5%w@%% zOXYbkf*_#2?XimCjr_ zI;}NnW@^q^DoIGhvuy$<)6DcE{3nUl`tB8|SAXC~TH}>R>=2(JDm4HA002ovPDHLk FV1m?UL*4)Y delta 234 zcmV72M5Cn+h7|XK2 z zfSP4l%D(Ri!w`<+!1sOBb&WjFv92q+uKU3%r`2?jB#9J7A+~KxRaIj80}WIgIwAD6 kEfiE|w`&UAUViZ62g`*-)Uc0Q0000007*qoM6N<$f@=0_{{R30 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_frypan_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_frypan_head.png index 6d02d35bf3dbe960396d862b33569f6b51167179..f633f02a504f41f11e460c926747b930de90e295 100644 GIT binary patch delta 240 zcmVYJvifDl5tMRd*?scl=svMjdmy6$%&l2S^guImzGEb~0u z${EE@-C$R$P19_#_UpPD$U9X>aZet{adSj`=z^+{hhf<4a%p!IAqf;YbRqSkHodwzW9yXOr4y1qUER4NsNzR_re z?RNVyPGOK;R8=)1k%+NaEI?^A8sI&f%?hABmbwFgLB(Pb`+xl&p->2=QVIQjADK)B z_xoLdm}D1=8Y#0Potmb><#JIK;l0^xias0;(Qdb`JXNgb=J9yGqtPh5UN5fKt7&IK&x~^lh*`Qjj!teKEFc{#qPNx&f0kw~E1?FwzuKOT>c>Ws0*n9t{V2a^kh z0_ycTmdmBs=JUCL(DsTGhq+k{Odae6Pts>a>bYD_XhO4@>-8Gb>C}-UJzyY(PCkWA z3I>BTNiyHeQNH`79cYsA+{lJNyuM4M{eQ?WLO{1a^ev>200000NkvXXu0mjfw)ot6 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_full_guard.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_full_guard.png index 66e3070a52d8f530a710ac5e30eb34aaa1e33d10..df97dfefec49a4598e8af1f1d25114fd23ab7a21 100644 GIT binary patch delta 157 zcmV;O0Al~G0=WT@B!7TOL_t(I%iWT(2>>Aw1O>q=t^)(bGRy=m$O6plcb_$qkIw(- zU)XTY*;8Zwe`1VaLyz@CJ2&P$&L>h7=m?-twvhj0LE99it||9F|Z4RidFz7}&X-IH74Hk0cc00000 LNkvXXu0mjfp7BS- delta 274 zcmV+t0qy>|0j&a%B!BctL_t(|0o_qMiiJQBtn~v1f)@}31;NZruOWzM@mgNMPz*Iy z6H$!3fygX1tnk>GW#jh-dOqFNHPzjC|Mm4>32B-NV$So#zV8a&U{Ghi?+e;>T@XT` zu4|NKDal^(=Ii6RGtu)rIF5rjj?r};wrxY(wu%CUfRb(7Mt@aR$g&K_alkZ948x!# z^Fzh?{LY|dSu%MXN8IYhB6~1Rlgu#;LpuQmwRJI&{>-29UDpMb&GU@k&HR&qB(!JtB%nI_KFq!W YY*A6&W&t9O01E&B07*qoM6N<$g4#xcPyhe` diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_hammer_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_hammer_head.png index 18fd571cba3be2682046a4c6e141cc54f8cf4cd0..e1f79ffdae61d34109b17a1fe0de4fbab4f983cc 100644 GIT binary patch delta 196 zcmV;#06YKH0^b3UBYyy-5Pl$f3X{cP5ex>K@kJ55h!^kzR*yT& zH}J}aMYrt^3<~=Fjb7LPmiL}&t%UU$thJ^P0$FPb`(tH*opVf(QX(P59!ZRmT5AlR zbJ7@ta?VV$6$N&oiUtWlSf!L?jNv#RBf%;Lhs#jD@0&^~>^-FS&W-aeCl85Iib+6* y*=!H>aRU2@vDVsCe}56!2Kej$0M%pV->MhIvuKGr7#-380000gykT{`2*236^Cs!!Xb^4e~sHtCK_q zkH>?ZPA3#afoYmVl4I=q$o>-Qe81l@&oduU6a~L#jQF8YK_sFR*mWQN{Q-{oalaY%IL-h7 N002ovPDHLkV1lCMjGX`g diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_knife_blade.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_knife_blade.png index d6f0eab5fb926ffad2d9a2bdfaeffd5a386e8472..fc5ee0945727c55886e8b9f394bc86235b6c9867 100644 GIT binary patch delta 110 zcmaFJ*v&XWB|XT~#WBR9H#tFq)rC<~a^`Z0_yp`InuY{Xab|O)b_qG)FDEI5}ClQjyQNC1tj|1p`B0n!egnj#bwf OfWXt$&t;ucLK6TbLMbW$ delta 197 zcmV;$06PDR0pS6VB!8$$L_t(|0qu~z4Z|Q1g&&E$g5| z0HU)*K_Dmt7>OU>qc3*eP^%h z%8W5M=U|M1l(Nw`fnq{!&-08B0+dpSF?O}xFA#hj2bN{QG(Jr~VJg00000NkvXXu0mjfp=nys diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_large_guard.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_large_guard.png index 86a1141b5325e30bfc89977eb8d37cfe6b3dc78a..00ea35d259e0dc042710d8a42394d7118c944fc2 100644 GIT binary patch delta 117 zcmV-*0E++J0g?fbByL$rL_t(I%VS^|1sFg^M&>^VlWl;3fx&+T1qI3s0ckENDfu4~ z67rvH1Ju>kDffz#lhc0?O}0xwnps&{|C^bafej+d5N2j(uvg;Z;>dRi%r#`YVweK} Xxo9TiAfe!V00000NkvXXu0mjfnItcV delta 193 zcmV;y06zbc0o?(RB!8qyL_t(|0qsyR4ul{O98aw5jE#w<53u3^yn%v8@)*J!sOg}B zaJQWSjMv|hOtL#W%x(t%*Cw#1>Soc#{sSNt(J_sAd_jD3OeV!P~8(fx{l*mwrztD v0x`zs64rCQayjSWlLM@^kAYtQ{Zjn~U;r?i@6b4W00000NkvXXu0mjfG1yu} diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_large_sword_blade.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_large_sword_blade.png index 6185967ea87ae1e9b3004b68aa97d639dd74af61..3a83d2f79b44646a5e0b41b0fee9cd13d031de7b 100644 GIT binary patch delta 177 zcmV;i08anM0?YxBBYyysNklo+Te0JLkZ`xL=3#tnJz!8r%kTHXVA5#c!}j4`11z7w$F)*2XN zAm$>d7bsPsx)1WL%?kxfW^E{7j z+psJP)^)`+O=#Pe;}6!mzhM|mQ52+U3fs0}nkGb1L{Sv4#eWH$BncA)frVkneBWpE z_AGYG62~zMf&f{TVV>tbhGE!!za$_PUDr>~bzOt*$v;! z+hn}m<-LkzvaI=L=KHKDdgEG_#hmB)h_-FL=RD61{J!taCBP=crfE!;Wp)*gB%cU}Ubks$!p5c(%504^_jTt+UJ!)~`jzu*6o1Xin64TVB@y0wGoaJyAe~Ml8jWH&916Z%E@gi{pLjeTxZm$styaGYE|-hEM5jdl zTk`q5Ag9v_w8PUBdkcHtS2xi zSS%Kt&u0nBW`DD=+wDTZNX!J(=dA*Efmx^1sl03~u@+kM1?3@ zNDU}nrBXq&*@VmGqD#!Eh8Mn0qXt?RAZ?@u8Xr-YK{USP^ZCGb#p7|4KYgqq91e?! zQi0#^mzLG*b^2i_&PoVuw_9W~8FM}cg8^o<8C`k>hJOYWi|SH&@oEcafhCVdBkcy< zZZ~k~NP%sX3Yd))r~{+eD(*C@&V9XJn-n*jjSLd;Z!Vm5{!B6Xv(xDWja=L9HfY2d z>vp?Ai^XER>J(C`lzKcKvET0n{JSs_@6?Gqt2N>{%EUghA3UQS`#W%#Pyhe`07*qo IM6N<$g0)lnM*si- diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_lumberaxe_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_lumberaxe_head.png index 92c0509f33cb290d017d04ae0c673ca8f55f4287..396143755da03cf84462bb0c392b45ed14f25b95 100644 GIT binary patch delta 155 zcmV;M0A&A+0=EH>B!7NML_t(I%k7Y@4Zt82glk|56b6AISR4{bUxduI2^15&PWL^jJPQB-002ov JPDHLkV1ljbK<@wm delta 240 zcmV$Q;1sumYXm`x#9Y7H+NfIo}f+&iPEAHc}NMV*` z0u@C8!!XeIJ?gqX@lOS+*uXSR?EB6XP1C@2U99VhX__>RmT8ckrs=_HmSr&&3xYuY zVHl9-xu$suqPVK6!0Gcm!?tadWr=OuWSemu73L>A9g!<~o(JFe(RH1$I5`YM#BnUS q>a=xKfH5!6MvU9Gy*whZU$-|H;!Jc33n>c#0000ZSO3q(#s+4SARV|G+egu-2~JX{`}s9C8bxt7!J#!x)2{GuP`VWSGnlI+ao=rR-s~ z)*C+)>WMHVr9=n;&bc0j?g?iyr34`aT5IR=yZ$)mo$IF`e->Z^g5e>J7R=pM00000 LNkvXXu0mjf1e8W^ diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_pickaxe_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_pickaxe_head.png index 5550e7751b1983d91ef33c1a1ee91d51a8556ec2..6613b7613ff9e353761702b2eb38cdea4997c7f7 100644 GIT binary patch delta 142 zcmV;90CE3<0;&O!B!6*9L_t(I%VS^|1t>s9M&>^@Op+l61_u9)jEw$kYis{kS6Bb< z<>mFCnVI=NNSq{>goK2Ev6GV%7=sKV$q;12*x1;>t|8ewFaUB%NlD57#>PgltH?40 wb%7 delta 230 zcmVWL65BERj2e0jyC*Muv3F zadC0~8yg${hlGTXu9<~}<$q965P8l9`Ps|Mi!whmGcym6&17pPJG5abjQ)uP1V9?e ca`u1&04za0Czfz66#xJL07*qoM6N<$f*r*(1^@s6 delta 242 zcmVA;ZPKX%d(7=Qnaos zb43D=Lxy2+ZQGJDhUR%@G6N}2O6j_;^L2-uXeQL0=Q(ZLMr+HmMB~HcgqqQ9Aq02) z0KPAmzX0W`syNJAd#QX1KpEWzJNE3aUjTU=NAC7CO{W4#{INp-o~^ZJET+ssyOX=| shBCd%B!6{DL_t(IjqQ&i3IHJxMJ;*?yTKwD>_(#qUc?J{0jtOT%M1t` z$FOZ5yy%;+Qa|6|oWn8a46QXp4^v7AA;5c&IVaXysI{W^&LL71vets65NV7-jFF{P z;;+ye@~qi=vttZ-nn!$nHh$Mx1N6>y0WP2djIXqvc$41aL!$FgJsusyS4TtV;o0h zS%!685yvrk~i`I6y^pYmPZJD>}=+Jzo?|BiB!}c zf8FViL_t(IjbmUK1@r-ojEw)q#l^vxWX&K=At51POtb;KyuANm zSX*2BKPxNie?vnww+|ZgKUe4hyXho6o4c- i9R`qXCE58S3;+Q0r79B_x1$&U0000|!R zhBnZ#6_Vh~d-+rU_x%MxQUUxKC7-Li^MbYTJceVFcgi~H*G(papyVDvX(IJHpuqU;~Bhvw?*vX0Gb5|-T c7XBdd0V>Zbo}lLb9smFU07*qoM6N<$f+$N)`Tzg` diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_sword_blade.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_sword_blade.png index e3e8af367f3878aee55e12843d6d19a13339a436..be202ddccf2ee5e1fae94dc5eccb802ae3adcec4 100644 GIT binary patch delta 141 zcmV;80CNA50;vIzB!6&8L_t(I%jJ{14FoX=L|3vz6?EWa3WG2hg7c!cR={zW4tx`2A0O8zG7!skPHI9o$VH+E&74St5>OIF5t9 z?;l$K(I8DzIgTUteaAe{XxkRcvK$6??POYuqL4xegkcERb#E~Y1J2`Wv13vn<29uBx+?5_Mf0wUMQqSo3K6Jw;DGnG=7O&|bV2!Wh)R}3EU2@t^Y52|Af z>b+B~b?uTBWD_`oGdP?o&zwLBikO+nXnISYjbp8SrYuV;!$-+9`Bib+AZx9U?VN*M zk~wX*Ei>6Vfo)bk2PW@i+T`{~)c#Jsg#*FNyAeVDX`O$s4?werE45uO0000007*qo IM6N<$g3=~gxc~qF delta 356 zcmV-q0h|8m0saDzBYy!!NklO=G`RWtt{)T~}fb z0&Extdp@6ZKA$N~Q(Bfq`UD09_xqjZd8WSascD+S4)l7x*njPIqtod`UDr`v*U}Hx zm4t?2pt39}NfPekLNMT7K@1GrBxuXFZ5qdsilX4mz~X!)fDx5=o=4Z~mEt(2Rp-HN z+fttAyO^DVU~$$U*-lke^msgW%mVi%e$*QS)peb42SGrVWvLLZYg{S<)1Ib@mz`x9 z_u_S6-wqazk6ji3@_nCAI}Af!Hrf$0S!X~|6v;UGgKSt5Fr#dBV0azaQOV_Ukx66% zFsn;~q}zi^e%cd`a~y{qk4L$t+^7gtf}@!KQ2ho}?w33C2T`B^0000&0&XszjHb~ae9B44XlyedFYNe82y<+?Geek9Hh+;Ds8Lhwa}QdnTL1t607*qoM6N<$ Ef)C$7!TXm)1awBuPXRMesZi$8n&lDrv4iBcSWLnCBT~S%1ptbUwL<0<76_94yO% zzVBu16Mnd|<{$`!VHo05M5q8+hw9+FvuT>h^IUmXSpuEcb(OJ;qQJiIN|?rf1PG^T zifNjVW!WW6fgj3@O=sJ-<%6+Nc3DEg>lU#x4*&8=(62fsDqix$;UnLXpt0*)K f!!4N1zvl`l;0zC~ zKrAiJW$f$d`#)p%wz`7$zW);{i*Oo(GZu;}iWs}QC;ne_aDPA0B|t+eup5Fm8cR#_ z8N2$X{9n3nPhI}xng1u|rehdFFddW?gs6m6nVZJg zvS{i5y*qc-6-}A>zb^;j5~5RLO05AWI1IhxBf`79~L_t(I%VS^|1sGt*<*WZUo;m-2^|6!xR~$a}pJW5JoWJnj z(#yBj!po=D)ZMFg@qxqtXKvj=yg}nG19n`#`v2$8Uktx~{bKn0_b)?)tra6l z2K@Q+o1vqwuI@j>f1m;X7#1Hm{Quk6uMFwl9#{>+FyQy^zYHMF42+Bn%q+|d6Fb`L ze*XBuFm22B|5-ks7=~bR!5^^G8JU>mCzVYa19+>k%6dG=xO&%-wt7|D4_X{(HqG)F|2j4Vw?-lNG27fUa3Y dN;r%#006{YNKf4v2JZj>002ovPDHLkV1oYJQ@j8G delta 239 zcmVV$=bfClaUpXup}(+~^;=I=Z3zZa-kP*8w@5eOI0m{vD`-@*ThPWD(0!7zZ6laqm& znVI3oj~@)&+}sQdK!2>7Kfi9)j=lfWJe)BM!7w1g(wq@wBWTzwlP1;i^71fz`SOKf z-O@!sLv{lVLG=#SFn~FC?%o6c|Nr~Pux|09x=)`zGqAF<67~WzNOpDr8?*rEA|@am phb0_{N(Tuz0+46}@PUCh006?HMuo0v1R($b002ovPDHLkV1lgCa)kf@ diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_battlesign_head.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_battlesign_head.png index b0c3cb4a0a485e4723b491c1e57c133bedd54df6..4374dc36d47ead167dfe1798b24a63a7fc1e5feb 100644 GIT binary patch delta 393 zcmV;40e1eP1c3yQf`4jBL_t(IPvw!@N&-<7hJ7(Jv{LBcVa6GqG7sYs%fvE||5#QO zSaiDZUAn59psS)tkRoYbWVQArK{Ibq8-CV4@$LU#+vWNjqtHL3jiY0#4hEDqdZgCs z6s>+s%;oAf$y+sAZ*@rJy%*D@Ux2L9r^?;|7LzIX)EGPw`F}?z!yz&|4fqrlrFIvR zp2Mphpfli#FJ7{IO3bSIZWA+M$pW0R%IM*mtDMbaWCx@=1_iVP7PK`>bE*c96tw{E zPy}9Cfj_3f&-(%}b^y9P3alnj;#UNq&;~N~2HXM=3?tuc!xvSNV^>PP2-6Nov_@WcR-nyp+BG0000u3M9EZo`XYPySTzSZMwaGgzx)WH0MmgwntFTPvGVG z8OHAxIA=JjUqcYev@9H4))BK<3l5J@kfb%`f#)NWNyF?LqCrf0oM{JP7{YNJ#Bl^a z2z2kR>+1FCQhy1rjRx%g3MAH+7Qrd@JP)&zdBmD)pj;}do)J(x3l!IH8d}!_7)qMD z1;#lNw5fJ}NfpF&0tpRNRhSg-pPnI?&FPu-092;YY!;G^ixY$k4#t=kN=cIu5*7iJ zP9^E9pt8B4W>D==+)^!(ztKyQIEo^q)3zSmu(}uI;v+YpP%QjBnLpV-`4a^?divR!s07*qoM6N<$g6%NJasU7T diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_binding.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_binding.png index d6428c64f637543c47026f1d742e4c48421121c4..0517d5ad3fe31b223bcac238124fc3c6965ea494 100644 GIT binary patch delta 207 zcmV;=05JcO1IYrAf`76}L_t&-8STN%3W87&2GDt-2x=#U{S(nbY!N-oJWH3v@KUrE zFC!yYjGpRiKCXZQ;)l^LBC|`u{)jl*}Oq5s~*Arz^Rm=KCF5K z`vX6lH*8g794^>a9yEk01k?4FN3)PKRnSl-7lcvFlhuY3S4e_}xa1D=DCR^ICU=;w zHhe7v)JH0cFpAj}0&1mYg=Ku?R2=9RlRG4$ppHyEZla*SFCUf%XLBx{LhAqk002ov JPDHLkV1k;7Te1KE delta 281 zcmV+!0p|Y60+Iuef`9u-L_t(|oMU955U>nG16Ce9_Me%Vks-v!k`Y;a#eu_M@labE z6mbj#{{R2WFlX|#x^>4+{tvP;2P<9))I71Pvo5>1sEMEpA{=ZPK^l5mn!$$r{{5Sw zt**ANs;Q|d+}@UvpaCEd4m4!JuD$I5%g)URb*K!2em3C)FipWjDn- zJAgGT-FNW++$odlmhRpCKib(9e=L9k4P-M+GYCXG*)xKo@!#LSguRg9;fgh|K(T{O fd=MsOQUL%M5)y1Y=o&ZK00000NkvXXu0mjf*KLOd diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_bolt.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_bolt.png index cf8cb9aaa5807c65ccc76389d6151ff52ddb6bac..b71b2d2453b99d5d2992ca576b5781867b38ee71 100644 GIT binary patch delta 147 zcmV;E0Brxq0*wNYf`4{NL_t(IjbmUK1@r+m)93t8tZDpDp5~cz{yPMR)^;shNxA_o z3l{&k@b;_iUa^LB%^i!E{WtgWsqJ04j&#k_)^Gf8>mOJ5VP_R~|k_p5~zo0Po#3dpJ!>OAG)2002ovPDHLkV1kf+ BNLl~@ delta 205 zcmV;;05boL0>=W7f`70{L_t(|oMU955U`9IK%4x7c8iYNzG`=4fMgO8LI)4*R1=$0;oAQEv+fd+Y_&53`PTHZrb{P`TTixaX`%} zL}S<8L_t(I%VS^|av;32{=Y+F`hT)C2NqTQH*oW+4JxW2-GHXW wtN({)=hyn>m;NW)`O|mo`_C{6M!}#207Zrqz#R#=6aWAK07*qoM6N<$g1xaR*Z=?k delta 123 zcmV->0EGY50rmlqf^=U=L_t(|oMU955U|kQfbh!t|1V#>U^p;;CL_rP1Qu2Nzj^j_ zosy1T6Ui=UTD6ifDMcq dFlqn@007|P8}CAW-)sN?002ovPDHLkV1jiZH}3!d diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_bow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_bow_limb.png index 47a77c5678bbdf6258e9d2781b9515e97cf9f89f..0b4a3fa0ca1fd6c9d4f0f03f465fc5d7d29f79d0 100644 GIT binary patch delta 170 zcmV;b09F6g0;B?vf`5%kL_t(IjbmUK1w#n*t>5y$YxVm7?JL&&CrZPF^_%`r-njMu zw5>b-PuRHSzn+U*tyMr!t){(G?ey)taU0UOVDbNs6|4X2IlI<6gof8Tg+`8CP3&;S4c07*qoM6N<$f=)+UfdBvi delta 218 zcmV<0044vV0@MPKf`7e9L_t(|oMU955U`9IKt}`m)^GX$=g)73zkmNSR7Qj_5;S1K z`c40tnV1=vS(q7q{rST%Z}Ox%9v&Ws_wPS2Oy9oyf2OA^BUS?%7cBnI&cVSjZ_4C4 zAt50KCPpTP*Kgi1z1R&P6$}Fd0PBx9 UAs^AEMgRZ+07*qoM6N<$f(&hAIsgCw diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_chisel_head.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_chisel_head.png index 22911cf10c6778a97aa38b884b621ce16d942e2d..ff22b5e171ac13a2ca28d50c064dd2798aca5bff 100644 GIT binary patch delta 144 zcmV;B0B`@<0*V5Vf`4;KL_t(IjbmUKIbh4)z5glDy!*erwodJ8atv7y)Fi8^Rcq?( zS}UWWRl9N@iH3kQm;g0Ps;bp4-n)-9%`1Sm8#_7IE(RL1cpr(H*X)JZyo^*QgTQL2 y=B4BW+A^r07n5T%$e%_aKT{ItWchh$0{~s;N44g@g(m<200{s|MNUMnLSTY=azY{i delta 223 zcmV<503iR00@(tPf`7tEL_t(|oMU955U>m#1Genl``^denUO35w(Q;gKRYkKZZ*)5 zP&7jb8n7OyDKjUxPC`nWp)fnQZsoqc|HGXSh7dI17f`7V4;i{<%xDUCaw6UZ zD}c6lwY1e0)KoPwFfcO2qG`r!z#5?Dj<$}vVxZj_sm%oT)c1V%bu_J{UL>umo@B1I+NcD1ea!lFrVfw>X*Ap=hEof3 zFDMU@g=5==#e*Ece`O?keVbr-#wZfq!nzG0+)!6eBri-yub3 zws2t5&J%Z)clQV&&KEq(0POV-j3tNZhwu}T@1Gn_YWo}1*<5i1n-qeM_fUDE1h9n- zFW%7jv6{I64A>X}jh|*0wE)TD27Q3p4nnc5mcCHzu-@*mzuv0nzmWFddIM8hzh_C4 Ss<;3E002ovP6b4+LSTY~$APN= delta 334 zcmV-U0kQss1I7c8fqwxnNklfHcc%Xn_Nbjgy1n|L@-nqT*r-xcCRw0YeYOXAlGi-gGSf$LRtP`19vCgNT?o!(X5wAkA!8G~+ek z>({RgVn99oKu0gI;!=do0Fd+LKrx`I%D~9P%rLtT)87PLU}4B*>Hq)$ diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_crossbar.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_crossbar.png index 43ccfe28a5056b47ee2aa0267cc665ef0017d97e..cda16718c1f61019497a3a17339ad4b1df11ff89 100644 GIT binary patch delta 125 zcmV-@0D}Lh0{8)tf_7m^L_t(I%VS^|1+)Px4<7ly;=tkmWE-&N$npQ~;SseUgVr25 z`JZf8xP?X38aunzt_B)NvH`1)9Qz-Vl2+>)8d1CY@Uj17dj+J~Jv_2@$s}8*`inVKpGc#*z`FdG6FHb#LFkWmtXW`2SF#7|{lR024D410NqB1JEZ7 z5P}33fIz5?72_J9&7iQDGi7q!##3ki`fuwX=jd9S-rD`2Y_I4!xz*}A zxYTBL^^tB!ZujK>Chp#~x%DlzneDygg$F1gvpV|z>p8pCraO`26-2m9{;%f*3=eW$ w0s^IzXZ<&D@u18lMSWBLpTBXFd;_Qs06C*gJ6i#hkN^Mx07*qoM6N<$f@~ delta 297 zcmV+^0oMMz0-*ztfqwxCNkl>xP z^8X3NxkMR)V!+-7a~VOJ5AE1iS2}s-|6jj;F-#<25QY~(HW&0x`M+n=`Z^FlrLp7x zocao!hF}fE|Ns5~iT?~NEUXNt4(zQMSiR8UFnJPrMgkU~*|LV?NL&zkmN`IJ$dBT^i6U zv(UUkFd@NWAs^_P{o6OyrMLI~pIKQ9H-zYvI1%WY(#f;_@7}l$#U&&q?=a>Db7p)_Dgk?C8sCx00000NkvXXu0mjfP}h!Y diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_crossbow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_crossbow_limb.png index 917f22f26dc2498cec2630b7546d3da916beb202..7ce6da700fcff11afc31e591e015c335494f8938 100644 GIT binary patch delta 262 zcmV+h0r~#21OEb$fqww#Nkl+_!Gi|7lxy{GYq~;QytEj{)fe z|M6;^ylMOYzBTLr>pHsB+6IQy+6RZ#8o7DaTKWam2BfCfntJ)wt~h=MyCEIRR{qy> zb^~jgwSCwB=^MBHpS5Mj|HTK6{av*a1D z8t8YYu!!0nS8tGSKv-sW?eW(*hf zu37(o{?sXT!a~9f(J3iSX`XJ3B!_{BhzLVcc1}~AgDpYLC4V32|`-9&RpT^`aU817E*>A{iG0z;fE1DJpi7()zP+}z|D z00JVy!VLfa{xc=d07jq#-oJlOl4cYGLd;DVw_LdV-&0SU=qLmM0E_=iqjyC2dH?_b M07*qoM6N<$f+w<&RWmfI6_Jy#Ncw*gkbg@W5@PC#R<8Nq7aqch z(}0Ovcl>Y3%B&ND+Wh*}ONMuE-!gpp@`a&l?);{@KtKF0$oKYOTmTIDIsM&rZ(hD) zc>nG_!`H9h7#ij;YO3(}CN2yTfYG)H81f}aiFI|;XEd=fGBc!kIFl9&almMsziaRR rL^tdj2^s(bgdQ{#G=LZ|@CEh~ZvU2w(mP;foedI8Kq2zU4h)ono)LDL^>*m%bCHh=w<0*syy#lE5P2)>2c z50Et)NMF|>><$M!O?bw1Q0)wmvt8sYSB4}?Ray0}kHnP@F_(S#c}j2-dbDcW|xV#h-0=SkP}LsZ%wTvY2w z>V^a*OhLlJ4tpNt&6eu}ZM?owh>M0lMA|Ts(re#f9kuQNX$s!c|9XXpi^0V;Ql+V< zbYp9PakWHMhM3p!r+kUH&=*kiegr2Rk#;D*&$Y_&zwa)S*t|<>L$MrW=oamrzS05` gYrWc>2LAhb2c#X*zd7mLD*ylh07*qoM6N<$g7Ip%EC2ui delta 503 zcmVg9|E#f# z8hUlpz;%I>6Zo||Vq^mS@v}iMLgU>V#cL@9^!m1ebl_KKGk-*92=v;PX#~#|VNfU( zAf<$x%i-nQB?ZI%P2p8F?-iia0(#BIyo?A1YP z5+WJLub+EtpT1yh+pe3ld5kd$C(J>eCh+gqg#Pf!1dTvVOolb|qu5EFE?e>mUfpElRL$oU9t3oetm`AUgD%=fG zsZ^}mG)>TIwdq~r!Qx{5Pk31cOmdG%XqXuJv>7N4E{#aHA4UZ002ovPDHLkV1m`O?pgo< diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_full_guard.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_full_guard.png index 0cec292f326381de1ff25eae0cd9c4754512f6c6..c4059720ac37e297cbe3aadd49436d130272fc79 100644 GIT binary patch delta 241 zcmV$~(rQ}sUD=yVW3=9i33&Ud zhK7(*fG;IsyxEBhvaL2Eg%Sc88I%1{>;fE+nIOYPi4|2Os&%X`H!+EBS~O#uR|mtl rh^O&*lJFxf**~n^D;f7M;NOTBHm`H5PjZ)800000NkvXXu0mjf@6&MI delta 310 zcmV-60m=UA0rIsTuCiHYIw@81m3_BM<}8?X|n z@z<|E4D%*WuKV=)6T{y>e;Ae?IQ&1_!IqJr0V@t4`9Ej!q`LqA|1*63`i zwRKJCnz0(N;_z{x=81J6_JD%PDHLkV1j_`d29dx delta 355 zcmV-p0i6Da1KR_Tfqwx+NklYU7{$+RqAsq5;HHCl21AP=xOG%fD=0Pi z1|^7ag$xS5Lq&%|B~9x;6gQa z%8nyC0U!jBO>1l@fJNp5W0y~>DmHRk=1>W$WHyaFPbvx+&3}b`&P$JuSe=Vc5dmD1 zc|ULPtaToML@fEKDubXyWaqa0JpZyPws1? z>v_-@7g#JnqO+!No7a}j!#86IwA?o&Bng2pU>6E}Mc;{Z5&>kipFP78ug=O`1OmiB z+jSvJGG3ZZ_*|5xZ;7Fn2~@1r#a*SsL%{gh1fI#fcXVhjY0)x!{)22f#Y&XKK0f77 zjRuSub6-HHNjmGfP1C14&ip4J)5A0{U=WQA_yQc`f^A0KEqnj~002ovPDHLkV1lmz Bpc?=H diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_knife_blade.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_knife_blade.png index 586d30df8d5791da35fe5f4b9dc479b588046ea6..f2cdccb38914cb723c115f48e58b39c4bf1a64b3 100644 GIT binary patch delta 163 zcmV;U09^mo0-XYof`5idL_t(IjbmUK1w?_ZTX+56zGcV%Ej#x9Ct35B9lQVQyL!|* zheg$H+O>}~1GaD3_21CV6RdgT?gJ!h20B~M*`wAaG`e=(zQd$x2Km*<-K*9$Ji2!M z?t`Rh207K(!@JfkGNyLT!DFOp25B(!@~icXj;~#F;0Wm<4jeOtY|SGS0016tMhB30 R?-l?6002ovPDHLkV1hafP>TQn delta 219 zcmV<103`pN0@VVLf`7hAL_t(|oMU955U`981GaA6^`GhgKZd_7tPDOL&Wt1(uw}>Y z|5d%cbs~a74EZT3O(eNs`<7k*tNQxDn)6cAn*3ZH7}3?>G+;Z>+2ugZVnV_USs58k z{!X?SnsFMiWyjwC)&0G7;vzuJDQQiCI5cB5VB_us|Lc3Z>r_O9gc#B?vYGk6l002ovPDHLkV1mNUWibE% diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_large_guard.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_large_guard.png index 5522e4592cc094c4fdaa0193fd17c2964f9b5fb2..d9c3d6d2526c979e0adf0569b9d00e4e1698cedc 100644 GIT binary patch delta 143 zcmV;A0C4}#0*L~Uf`4*JL_t(I%VS^|1sI@y*8Kl<(`NoB+km=hv;I4H`_wkhnNPkU z)f1=vS5#968nTEyL#iiC{;#O2UfZ%@DfzAdc>&^z1^+>qyzrPl=f8rAYORB}Z*ASQ xIpiAxiWNs6zuNklWEui9sD35|F*A$-0LTwGKExxU*#H0l00>D%PDHLkV1ktZK@$J~ delta 212 zcmV;_04x8A0?q=Ef`7M3L_t(|oMU955U>nG1L|kZ|NsBbFNUV9bVjla`2XiO!=bI4 z>l)|G|6iYyNYD@r1DdkZ7^^2v`@f*818B%1pdoR14Z$7;|NjCp0|PS)Ga(0HH=wm3 zml5QJxou5AS1kAs601*1!0Hm5u>kUa-Sj#C=XbQ$DX42O)J;vB^S>!81;Y@$(b$xk z0yYHXrNi4c)z#0O^S?12)ewT|0AvV=1{=hH874$0B$z>D8-NQ8ya518BSg%xe2;Vh O0000k|`tW5NB+R@^^F@R&?NDVCt=4U8xW3;vodgn#ELgojuhk%Ef+dkx+7 zh6jHy*TU@&LXs88s)iiFoz)N1c{+DsFTr7QF4XFLXFImztRx&bPw-%C^58Z_ytAEY z=P1Q~sp}Y;dmh}SwmsCgkJ^rv%24$thTK#2D59jq5y<9{C|991KhWpKzG!kfi)8f; pTB8Ny@cTdbq8t%@Pxj7NqdzR=h1VI3!Epcp002ovPDHLkV1h2Uk@Nrn delta 357 zcmV-r0h<1t1KtCWf`3OzL_t(|oMU955U|kAfYk>M{|C{Gj0_CS%n)sXHkOP;8L;N? zvHy*g<#ik!oD2f|{0w|R9G#fdM3f7b?%wymwyd;{i<6Uqi;Ihai-(&bEH1t&$kvLH zpaC;CZu#F-Q&q>#&cVO|G=Q6%n;|$dx+&bjmJy}~rvY=e?tl2-US9{cnIGt69v&XB z&2b*CjL7P+8ZdMHCa`8spk`h^J_bG@4v&q)(2Ugpkh8m*o9eiL&gBK#Dj*=h5S^UT z6y;=(p&7$~`P+B>Z?3JW0|gd8&{mMno$f`1Ptxgy4pHEsFOkdjs|Il zhBjUU7VkUwzh0}c9;}%M=yXs#hXMUeNHg4kSfKybojUV>N>^7M$ltN4X-y$k<^(mP zcp=ElgmLAO00000NkvXXu0mjf DcrmQe diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_largeplate.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_largeplate.png index c99412ba64c3ef17d65f4897825d74a0956932b9..2edd46db7a2e42b51945280983ea920cfe2aef76 100644 GIT binary patch delta 468 zcmV;_0W1FS1k41Gf`7G1L_t&-8Lh!jYLihE#^K+4&P|4GC$&kwG{$a0`~!lb;3~8r zI1pTf19#&_9JmINB*uv=kmTNT{61-_ovP2nzY@LYFJ2|R$iO%-#^W)&wxj*n5gC91 z0T{2}zTxuO6BT-Gx8wVE^X};61b4^Wh?eZ#K|o6)g2+a+#(&+1k9hg?@%u}l(9@`J zbbO4vlM$TFI(#(3%n%@VVqb}D%;s~ZlQRyCo|O?oL~TsFb7Te*gLKH+7?=!6jLV1v zqc=8TCZ=6SMCEKcAi!(^T-02qQ6nAQ^OlBQ}Qbw2= z#&1T?5RpkrWG0Yg!0PiCzOGhCkU%$`Ac;R212YC@2AO0g-!^LolGv`+%on!-v9FCx zt{J}sCXo?HLK2d2cQTT0xx@u6lEr)i;##5S<1zBWolT1iYOB;*k&I}83`|L6vg~HG z;D$mkTI1e>`%EWO+>FSewu&KI1n!0b613WgFmCwp@l*Z{{)eAOuGuGvDE+bk0000< KMNUMnLSTXfp5NO5 delta 504 zcmVlqf`8dbL_t(|oTXCBYTQ5&tm)C}X#2J+X)SiwpAhW4ASQwQf_+F9 z0(%JLBXaO}hTs))2zlI%G>=q|yk2DAoPp7!yQjLUdJO(^W%_vk;ZxLihyik+66AS~ z&Uf&)UCJS4hxg{oXRP0yn*`vy4!_#w>%q|xthEp;2tK0cH-C&4M1&9s;u-gN_Tn`@ zzI}7G-Z3zf32PG>w5(t!6NpGUZx|1~O9173j$$?)OOR~BLWAH~a9qRiAdE=` zktD!)sxt&+JZJp~AQyvM?rBkyszWhfq~zZ}zaddj)g@w#Xqy%p*<>~w1B5^i&Cu0E z?WD8?-t`D#;eRPh7&N;LGX_ZXNIT1h-*&sDkrvgWMn-_PX;R$MtDN0suV4>gGdpNj zFg;u!C%TU2&1mY+A2)0;7`q?!&O|kk8Y3m>6ck3se*Nt`wFlJ8Wdg2>Su*j_MS{q^ z49_{MVK>co@Pxa)-l9G^(Sf3OntvpLCf#)(It*PTNpa{gUoBx7@-%x<&k!Fnu)MN{ z<}6n$j@-dHMMd6PoJOhh83`sq4!>a)Egb4wS#d=&Qn4N uG6q<0Hn@0sdW9#f1aSH4%v?U@G}k{Ut+M!a5N^@{0000?|=WFefRl4$r?{RfBpaJm!JQ|6%=bl zW#wv*1NlU2KJ)zTe=%8kutpbzT5Zzy9WYo_7AL$$;z#bO3SF-diDZov9aUQ)&IM$ l-u%D&#_j(g_GqHU4gg1BWryI*wg~_L002ovPDHLkV1g_Hd%FMt delta 281 zcmV+!0p|YY0+Iuef`9u-L_t(|oMU955U`8@1FnAm`~S!HZw$slyo@9naO(N%|J=NM z3{ILVb^reUWjGGxTS|&z7=qP+Gtb}t_cAl8`_J&7K~_$V;nj;54BvkLA>Iq$zkXr( z|NkF@th@rl|9}4&L_|dyI`ebu_T7H;-$_-D5w8Itr+b?k)qlw=Dl+{2`wwW)e+E$r zDX@Wme*Yruf}cOWgEhT;{v2$xgtQdcAW;bk28REb-oP-xR#A>|-_3jf8JHLuI?GDx z{{H#PATBM#@bAxWhTlJa5Elkc>PldL?znXIKNB+x10ypN!{1-O7(Dc}iHijoz@~vD f1Bd|wZvX(;vJz$x?X_VA00000NkvXXu0mjf3n7Xc diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_medium_guard.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_medium_guard.png index 37d11e8a29837f795a85b70fd9df5fbf968d94e4..541984d52c472d6e2a4f2d27177e0cbce4e06011 100644 GIT binary patch delta 122 zcmV-=0EPdl0`&oqf^%L;L_t(I%VS^|1+)Y6x9|Qxck8bIGdFJePqOA^`wsq3DlVz@ zijJwZ@$su&w0ke8PwPai)qEZV*If1Il`Rzt8F5andgxOn%z{|pTO8J5qVUpH&w#5xc^ z*3}8a5S(6sDP9b;ebu5xb*#+H#Cri1FfxdXi{X?dXaLA1AShQv0KG+~3qXco4?v;~ dzz2qb0RYknGoBWMgdqR`002ovPDHLkV1i*IPx1f& diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_pickaxe_head.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_pickaxe_head.png index bfda96f8daeec65d7d1fc9c142b43fe3b545c8d7..bcd80c174eff17a04afd652f4782f4c10cd517a2 100644 GIT binary patch delta 204 zcmV;-05kuI1I7Z7f`6|`L_t(IjbmUK1t_3n*4+PHa~J&YUa%O5m;Uctw(|dkm23W! zWJv3@ng10{&1;R^J!|cQLu;-50&6F(UjKjM>UG2$)HHGO|JErp|91dg;}Q{F>lPJL zYwZs*hy+7m0OS=b-+)^8=veX$0D;~`%ll`qcI=UPVT}As}yb&s{{G0p0T# z{WoxSqs#zR3+vi0U{sT30L+k%IrGUk00gFN+De%LR0jYF*;{?7*}HWB0000n013G5S{m;bA%)ki53=B*R%xo+SAbvr3 z2qRGjRHP*{woaS*f6n}Qb%H`d47@x%41a$AVVJmj{eK3A{|xz|K^O*Mc%eEgov~@+ zVICa^#A&`tLu3AcnNy} z8z@bPX6#+G?EjX{o9dR%n^)Jnc-jBr*eJLKM8!gJTol-lbwHQ=`}K!37r?;3zke9M ze))f`6V#L_t(I%VS^|2(aSR`Tsj^-}_It=Fpt{TCxmSeC*VJ-<0&) ztvBwFu6fSB!(f}YT)RoS=2?3W{P&1YtX*;PEIFDF|MyExuU!gsKFOLVY~TIgB{sfx z!Qo@1Ywp{!6OQO^E9{fKYh#7_)002JEVzNy#e#8I(002ovPDHLkV1njOVm<%> delta 281 zcmV+!0p|X-0+Iuef`9u-L_t(|oMU955U`M=X~n7Y{{;m389Y>#7)dq&qEwfDgPH4Ep} zC1m9^`Dm##BFhmpVAkHl|F^7IQWu+^*%V=J%!n?J*MJGzcYpt1wO~$NOj>$Vw3Qi# zX1oUUZQ1dE&$_jBVacgY3AR>PHRCj(Z`1bw8<#Aui_XYwN^`KmsTr#Qy+F;|SFfxK zNk}578N&dOv$w2RUKf#)N|a_413)%!TnY^BjI5>-n#z`j0~=xUQIB~1Py?J z2sdZOrQ5gvKXLjTLvM8j?l8ayqCGtc#{xNE7#IKmCPYybsSi#800000NkvXXu0mjf D3`~GV diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_shovel_head.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_shovel_head.png index 539037a37f8b7b2e1c2cbdefe012836d3493e4bc..5c08f8c375d0c38530fc3c1ad40dc51d7e5ce342 100644 GIT binary patch delta 161 zcmV;S0AByy0-FMmf`5cbL_t(IjbmUK1+)co_a6Me`0%m+3l1FnPrBxPhyUxEo7d`@ zThu!E`qwTvaD;e679TnJU(ehUsL`+1H#V+T&%&~H>9Lc<8L;Bi+5ZMs*0qlQ0YJ_1 zVB7V91}r;vig*`*4DnA$0viHy$x>1@!@U7?GRP%MkCUMp1{#R=_Xr07qbxwpQr|(_ P00000NkvXXu0mjf0bxxd delta 227 zcmV<90383D0^I_Tf`7(IL_t(|oMU955U`9IfZu?*dk_9+V`F9b`Vzf48F={k89smbzyPwAkpZg@Fb#+>GiC%CvRr)H)Vfda-!Z&<^@^dq ze_~UVl^OA205W9pv6KIMON#2sCroULw#2R(rvV@kYh}*36le%O&3Fv}foPy1_~Z#1 dKnxgo0{{-LJy8WEJO2Ox002ovPDHLkV1njxWFP_5aehKVa-0pH%CeoK|ZCG=yjaK;Y8%KmUWWa%%%Jb85YkQfqJgA<_9D zr)M-a*9K?j)?WDhoixp7KY#n5)!bTp4QT7tpMU?K2lB}Zc^?@2^0!~48!&n+a07*qoM6N<$g3AI?z5oCK delta 223 zcmV<503iRM0@(tPf`7tEL_t(|oMU955U`9IK%4?TZX(JB=fC{=&&e;Oysb|EG4g z)#X*!H2wekkKxy^pSbM7Zh$c_7b7U-HJBl`UjFv$KS>6F08BFo=yI`Pbv|ALhy??0 Z005#;JD6h5r3?T7002ovPDHLkV1fypZO;Gz diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_sword_blade.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_sword_blade.png index cb3292153fd4579f79dbfe385a6160bce08b7f7f..0adb13de2e2b30f92834be1bb7e3a0792985d060 100644 GIT binary patch delta 212 zcmV;_04x8K1I_}Ff`7M3L_t(I%jJ{N3W7ioMf(;_Dx)aWO|!H}i~1mG(J>TZ7X?Z3 z#eQ~DzrgL)c|Yeemzl|AJo79o4Bj6Msv3o1%5zi?4v_l;!saU`h%$zXX~E{=!OA%S zt()P3ILT1fNe@nq9Z+5jhr^7cY!Fx;U63>b;v^jo)4af$xlM<)dj?5w;g@^t?pPzrx(IA!Ho?IvC1wj8cXp`jH<*a!zmY-J$yc O0000`!L zc_y4I2iKiW*r>r{6zjK-nP7}zsTSC-^xpiaKs-l!YG6t!27VGHxKgnDc9CU*I_#&m*RF?4 z0^h)&=G&B-+KVN6UAMA!t-xAuVB0N7DdC!%$0y*DAn_jvk5hfI+92Y=Nw_4~CFcI0 gz*<4moGthU1rsn{dwvy$-v9sr07*qoM6N<$g7~kA6aWAK diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_toughbind.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_toughbind.png index d6d38ddeb6f3c0b883ade46cb7952bc0b052e638..d3eb534c16c30062279e9ea38d250269da1cbb30 100644 GIT binary patch delta 338 zcmV-Y0j>VW1j_@Ef`2qgL_t(I%gvMBPQpMCg?S$QBVbf$OMf*Y(AN4q^9qek3`F9E ziGfVhhNcaKrb!6~<7G?Gob|DQrSr z)8XkG$DR0eBuF6iOu#Is(kyV1lDrWyn3IrBBpI3v4;LBj9Vlm1Z3oU6bF142j`y#P z45OIpstyvf&DnVddpD2bgc{7gY}y-Uk%{mO+_y=&$cRlo*A3wIf6~TzO3h9esx6U; zjCYH?Ok=t*Zc9MBcfen5@0p8S-FBeb6pC?PlNnta*I+mg5UoE7r*IsORZ~>(ie4;l kjMkr2wjIoubT}XI3!WUVnO)=#t^fc407*qoM6N<$f{go|F8}}l delta 463 zcmV;=0Wki{1IGlAf`70{L_t(|oUM|siYWD6r)Ijf~aR{SLvo!bvkzn!5o9AyT1Q-{`3DwfkAYbO-!r~L$XdC%YXSCpO^@Mb90Lh*>arDW`L-R>$=ES|5@*anKgx$w^40c2yxBTET_1&(W;d{KztSp6n)Roy=(s z%SPT6CzX`SLUVoaP>5`KNpdbbSTs#uDHg~{!<{S#0-)?9RW=_QSk1Eqwh)%Yj+UD*7^cv4aG<+uL7(ITsz&C&@x<2<=63)n2)_8b!jzzL6#5;R?YIJ6Lz^V(mx=6+%IXOPCxVXqPRon+`MV6%2 z-8}+~L3C!y^OQw}q8-3DV4>jfA$_0f3HiFfksgfqwwfNklhM)h!W+c#=ktlu=4GHGvCxW9Df&UIAUu!W?Jv~3p{3LBnEHBfOvp4nX)UE z{9t<{#4}=dQiCsF1TAeLo-f&>>F^iIpxsf3RaLKUAXKV=_Gu>}R#gLriD#x;>cgPhNb3f6W_Pr*QZ(JuNB#00000>J~2fqwxiNkl6S#s69J=hpG@^D~sj#x_L+ z`7y%e2pZ70Z1w+n^XJv^^6@bgr=~YWc)Kwo%i}emZ{4QM z?v#mjydcfVDR?zw7%*kaj{l2hPOB3T5MW4+jA@E+bHb|`#elwb8~-nxJ+qFVUw|PI zWV3?}LCtUjCPDx;uK-0AFE2x4R#sDlr5RD0;RZ+ui!v0HS2Qs)Gc$yfpc!sJguN9> bnvekiQxabO9(lii00000NkvXXu0mjf7c`%k diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_arrow_shaft.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_arrow_shaft.png index 2eb605c10c5e56ca6fb61e38f49e078de15074c7..be7a4330041f98d84fa130e8dcc3cd5342ee812a 100644 GIT binary patch delta 82 zcmV-Y0ImPS1o;E7uK`LmNklE!x;UCIri$N;JX0EN#=#p0t0asU7T07*qoM6N<$f|Xby<^TWy delta 157 zcmV;O0Am071H%NcuK|C5NklRIy-aXJLVhriYY5yGhvsRJ z>=H(FL$s8{7_QxW#V~){1xDQ35P%7pGk@C!#%uRpF*ukh6YU+WwvgfyCTxPFxCF21 z#JGfDKoK$os~3;~IRT5)CFG-%;8U)-ki|Ij=Q(hUMB zhH0)zu!Ccw4FM^HY3|N(17niC0@6Sg17QA#8A5VcAhXGG39 fKBm!vOG1KyOV#GsUmnKE3_#%N>gTe~DWM4fTW(3X diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_axe_head.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_axe_head.png index 197b5bb399baf95474210a23bdccbb8285ecb0fc..c676d9bccf646944f59c4f4689668f12c76c277f 100644 GIT binary patch delta 101 zcmV-r0Gj{01dIf*uK`_1NklHYhllOI z;-?B82Z=)r+qWt_=RbU0yuLtFou{LB;zTZn>F0EdZ2W|{co=}d)78&qol`;+0DE#X AuK)l5 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_battlesign_head.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_battlesign_head.png index 93539882411c1f145b45410f6b714f0c29baacdf..844457b427b70b590b147e3c9f6841d8fbc54a7e 100644 GIT binary patch delta 129 zcmV-{0Dk|H1*inDuK{^vNkl|SU z43Y<_!)gFb^TLK;oET;ZRs#rWMm7Ym0T;LFfHBA>7$3w2(L@b%7 M07*qoM6N<$f}Ij77XSbN delta 163 zcmV;U09^l(1jz)juK|CBNklam%)D+pNUk>Wu<>n#287@>|mzM taNyKkhWXnr5Umfx5VACmf>A(o008(u5L7Wu{(}Gj002ovPDHLkV1nOnCBXmy diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_bow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_bow_limb.png index d5291df8231a95a1e6b070008685aaf03bf220e1..6ab3096b284b95d89d3a2c42da7af67c5363cee1 100644 GIT binary patch delta 91 zcmZ3&(#W!59b>Sar;B5V#p&b(307wgl`6?U?TM328w$$%ZvS`wZ1OMu{`&6w0x7%( vdp0Qkun*L0$aJ~xuw}C&!?H?~YcDw%bj_{)_Bg!T%m4(Qu6{1-oD!MPYL}%!X7pWiQkImcvmMKP_+fYgZ2)0Z)B5|fy z&agvklaYae#GiJ_riV;3+;mk9cg&c}x?nhc7g&_)nH0FwNKZ>yl>(NW;R0 qV9GRuXo@tG pl_AI^S;Ape+8T!NCdp$A49?P)%Q_ayc{2ckr>mdKI;RB2CIH?IG-3b% diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_chunk.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_chunk.png index eb8d5562f994cbeebe6b7b78e373b5a7d19bd37d..532c37a93062f9d3b8e18f48d917abfa07bcb397 100644 GIT binary patch delta 119 zcmV--0EqwV1fB%2uK{mbNklhF!HzTo&^41~08Asv2EYsfVX`!%8$^)-6enq# Z0|3GOdj6;A$%g;{002ovPDHLkV1jJ%FSY;x delta 197 zcmV;$06PDk1nUH_uK|CjNkl>7v^ufz&L-~1;(eZJ`r>UK|oBB9ykC1E`mFDhNoWb00000NkvXXu0mjfl{-#+ diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbar.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbar.png index 51caecd3a12f38380f856b69c3ed77bf9613f466..e4e713d42e19bcf0cc6d5fb0cb346383d3455bd6 100644 GIT binary patch delta 88 zcmZ3(@}GIbdd2{2PZ!4!i_^&o60BPoJLA~?JI+vI7Bge{zx;&4gk$eyw*SBW{q>}D s4v)(VE2R>gHHug_m9yyuxHHxzopr00|%V3=9VUaT&sd&w1uXj~KSBmBgn6w-+Eb8vJKqcm?+k nHdo*@fC1I-LxFPl8X!o@ut=00000NkvXX Hu0mjfUVJG2 delta 197 zcmeBSdCjt6J!AcHPZ!4!i{9h}iMoVD=MVKkSBw)c&v}vRutl-w1yg4n+yAXoj!3M# zTYdBZ5E#_oX5}%h;B_!-X>4qKcx!KX1#jZP^j$kIDzg93f*Ri zyNE_gZkckVppDy4+##o>!qulmTu$u;Lq3C{!qJZAnMSsU8-vRY4>9LU7%Vt;sGi+8 v6=cYi4+gTe~DWM4fjayEs diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbow_limb.png index 365c1792ab9acad6eaf81a917ef9d403d052fdf2..2c86e7582cf0cf31f2c3e6fa9507bf07a24a7d99 100644 GIT binary patch delta 105 zcmV-v0G9vG1djx;t^r|8NklMl;#!CZi$`OrL#|JV2H{>SHhWWa(h zaQ~4u!~8XOvD<(Jz!fEW8T{8$5@Wb_?-kLS85kHCn21$4L<}K7j^}}K0mXpW#Dfd~ Xn7K0pWe~=H00000NkvXXu0mjfiSGA3cjpR~fec24vj#p}6mOX5 x=WwtkPl{<+Gg0O2iM9hKlVqogENv8IVVGnXtNwj+`a1?7@O1TaS?83{1OSu?BZ2?` delta 145 zcmbQja-3zudPc_P$r~6&>-*0OsMX9`dh~}x-2MM&1HyiZFZbRc#c=t|fddB$KFyJd zb1vA`&!!mW9zZGl7MXVOpS7N9l>cZU!LmboFyt$Ly5Q1OR7bIsgCw diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_frypan_head.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_frypan_head.png index 13657b4683af1cf022c407381a552f17aeec2106..cc9565952ad7487a4ed425dd1e194459f41ca632 100644 GIT binary patch delta 140 zcmV;70CWG91+oONuK|B@_+B;Pk=AQd>gCfd{pc8X6rrovZ0KX$aQVEKYBsT zH7g@eV_omg7Y%YD%r%=vQDoR3P8P_8gw(x6ks*m106<*={cUGvflLKd_atf{ONQwp zf-ISa@iayyax36~>J9*0hL|J_T!vPioWPVCwQC1l`w?9`Sanxqh-L=BGlRE7d~~ag pSD?G&r~kl&;M1Q-fqcgQ(H+zBY9};;Jgx qX@^3EOKMUZC66>HEAlckFf2{5Yi*pkg_8jYJYD@*UDi1zGywq0mpHTl diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_hammer_head.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_hammer_head.png index 1f3d096b7ee32cf60178cf25e1308e01e930b117..8d30a931de6c6f947b8a7fbb664bde444eb1a25a 100644 GIT binary patch delta 122 zcmV-=0EPeg1fc}5uK{vhNkl^_48q+xZeUE3As|Hy8-n2&n<01&f+;{ZfGRG5d5xs-fEfVN2ntxTVgzOY+3A7o c#58mO0Mze=-)s-abN~PV07*qoM6N<$f>XsYzyJUM delta 211 zcmV;^04)EZ1o;H8uK|CxNklHkHZcux005#)NmG`;4{`ti N002ovPDHLkV1m9mSpWb4 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_knife_blade.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_knife_blade.png index b02c89377eedd2194b9c4bce29a99c6271e8d8d8..de9506b8da267f5bcd5070a20db7d5c1d7bf6a9d 100644 GIT binary patch delta 80 zcmbQw@|}6ZdPWapPZ!4!i{9h}309Xz7yah{20qiCy_4Dg|N8gWlkymRJ}<14dXgP? kL%=4mdKI;Vst0AC{^0ssI2 delta 120 zcmV-;0Ehqg1D^!2uK{pdNklPC`$A)_zz>x-*y2-4-+w(wUopd%1Zx| z?gE%*bE8KL^Ve`-*pAl#m}W5%UWNmw?qb!9(*R;MV>N&j%@_udsu?Rt^fLI59Bre3 aFaQ9vCobXrsr^#`0000oQRQ diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_large_guard.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_large_guard.png index 55a25776dfb845bfa223d9b95897c094dd3a207e..e2060a739332c513f43d31cd1fd2647943dd3b86 100644 GIT binary patch delta 85 zcmdnS@`riDdPZLhPZ!4!i{9h}304V(i>Dvha|EY2l=n$LZPUr&P`fYC#oHiRRJ;FO peb*tDXF^?jowqhDJ<*WJ!@xM-D0*!(voQk@c)I$ztaD0e0swkRAISg! delta 144 zcmV;B0B`^N1GWUPuK|B@NklMC*#H0l07*qoM6N<$f`_mpssI20 delta 156 zcmV;N0Av4w1i}QcuK|C4NklNklpa!Upvi(mgPV_SPk7B^}{ks1T&C~ebo#TcV zgVcc3Vi*9^JhR##FNPU{VF0q`g$==2F|r{z4FD+w*?_JYCPtJ2AbfF~4puhN2H^7s weGH(;3ls$++0jUGLZT=sgE-`125JBRYz4n>fj77500000Nks-uM6N<$f&@T2EdT%j delta 278 zcmV+x0qOp<1iJ;WuK|DeNklxF7AF~EupwO%(b{KYlOF^+N&m;)>EKR{0G7{Bm!ZZiKk@Oo z8F{yZm)D$qTC!TJPNRt}Gwt*CJ_f)6Zsu@0=>)9S3WEh|fWLp{!1qLRQC5W0$u-Lz z01x#?f$yPJ(lBe4h~NeQAhi+m#n#31#g^1YVpbvmVDt4T?t26JsufT#VGuy8q)~#@ zSP@W^mDsSe-K`u+(z c?+5D_^W|avuAdG~9{>OV07*qoM6N<$f;-2A(EtDd diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_lumberaxe_head.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_lumberaxe_head.png index d2954e757daf521038c2fee91576c54ea2f02a70..8e5e9716fbc49091f09120d940102fb44dbcc487 100644 GIT binary patch delta 106 zcmV-w0G0pL1d#-=uK{9BNkl8npzEn>pu0%Xk$3=9lfN@5Jy zyn76Uc_+ cHEo0f0Je-Wk%(@zZ~y=R07*qoM6N<$f;Hw(WB>pF diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_medium_guard.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_medium_guard.png index 7574b22a7a0aebb5630460751e093dc3dfad6db2..97cdd50788a3bb03f5bc144b5adb74466682464b 100644 GIT binary patch delta 85 zcmZ3$@`riDdPZLhPZ!4!i_^&o60BR8JLA~?C(h70d)G4WzqlDov*FFQh7Vu=?s_84 pWZaR&>~K%zmvv4FO#s&kArt@r delta 121 zcmV-<0EYkk1E2)3uK{sfNklNO63*xWA?Pjw8A7s4uz8Ct17L;>ya6C@kZk~R>`ToJ22!|F{&+-*$l!n>dDGqL;ycEhRAq zF%e$4*nv}baTSo3;1ginqTx4$ah++O34h)wt5i(%@ zwhN5c?!96-c}|YO!Au!Lo}dB9hF}9k8GsLvWWcL8pUF1>pEn#x0{9Z!zyJUiX)a8N S+aRU@0000qIkZ(Uzf5ZO19nyAja7^0k(K1N%Qsny5wnQKuh043jhGJM^9Cn#KH~M00000NkvXXu0mjf DHi1C^ diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_scythe_head.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_scythe_head.png index ed79b3d295568f4acdc943810f7171624293464d..024ade262d53a9fada83857e4acd431a378cef54 100644 GIT binary patch delta 97 zcmV-n0G|KA1c(H%uK`&^NklG(1i%EauK|C2NklC!Y|Z~~@FX5uKC`j0@!=Co%eL#^>mQe>wlSWV^|R7K;)qLyQ$>G z|6C6eN)`})n3@0t76q^L&KVqd)e1D(Aa3{ft_5jL43=VU5{!8a49tBRjtmdKI;Vst06Q%rtpET3 delta 135 zcmey*ypCnVddB)JPZ!4!i{9h}304tiw$#%jhUI54{xnrZ!o9-GPgl%lG2_E)5l+!&fI7B nyLnzKO?k=}G5~?6tDnm{r-UW|dD1jX diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_sword_blade.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_sword_blade.png index 2c9e0d6ed86175c473c2588aa7d99d0def656d51..5f3bf145902915f9642f0f7f8bac6b99d60e3dc3 100644 GIT binary patch delta 87 zcmV-d0I2`81pWiCuK`awNklED delta 142 zcmV;90CE5R1GEINuK|B>NklT zh8#fyV4BU19x-fLD~TbG*9*v+Po9%wxOVRqiu3UrK#XRb1`w+ms{t_0Vj{c@uikvd ws~N)pQZ+MRiv?0NV+Dy`2LF*0%?JPhD0fP#UC!|j00000Nks-uM6N<$f|2?am%)Eh)UY5+IG8EJxc}#GyTFJ| zGrAhM0Zpx87qrU`=e~B;|nz0I+Y1PjK!ZU6uP diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_toughrod.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_toughrod.png index 52962c2410d3d05cbe44981b3ffa37b2eb89f6c8..97e798b8470f57d945398bdce7d80b0d86bf4e83 100644 GIT binary patch delta 83 zcmV-Z0IdJY1o{K8uK`OoNklpTe&1*CjuRlAXRO1prcBXjh{SAV2^B002ovPDHLkV1mYijGeH9gX~t^+F`982 zK&)o029Tl|!vIn>qZmMrW)zzb&C~dQeZTI1PTk* diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_accessory.png b/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_accessory.png index 309dac5ddfc4ca3275307bbec01fb3d97ec04e9f..cc14a0af2a59a1f8356adc5a7d9926667340ee5e 100644 GIT binary patch delta 76 zcmZo-%$lI$X6WhS7-G?zoFEbD;O6$so?~*ZLvr%t|C+(e{_t~hDxMcmS6}}B)~#Dp gb|#7RFwJ6M*t?0ZoVVimZU!LmboFyt=akR{07gFoiWC`viXkWwH6yX|ef0z6(#E}I zIFZK@RfX;bC7T)C9cwL6azsE?&*i;0=A3us%;d`Mjxh%4wW+iJGCi28^5yR4eijj- a%eQ zJiyJroP`i|+qU{TV36LROG?}5=a!ie0?xT*Y|ouGX4YC)N=WJ3%xBPSXw{y{?m5~o z(8kRBzJvE3VvHYU4*>`t#{s33d)3BIa_i10T}nB9D)j%XKLI+GI*1B)zFGhP002ov JPDHLkV1mJBV0{1p diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head.png b/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head.png index a7c5f674aca3553d3f130544918c7839bd9daf04..861254972df197bf66e267a79d7570122f5270ed 100644 GIT binary patch delta 143 zcmeBUTFp2?rM}41#WBR6`a2BHr*7?00bPKu6{1-oD!Mz0+l{NdE&em%3x69$Z+3M+(*OVf07*qoM6N<$g2I<+N&o-= diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head_broken.png index 027ee6b62b96c86c40d554151ab680e41b944045..16de8a52e78613f5b2dd80d0cb6abd222be59f89 100644 GIT binary patch delta 128 zcmV-`0Du4J0i6MmBza^>L_t(I%VS^|)Idf?=6^^?$bS%RU|{f{WCK8&y}Z2sJ2^T1 z*Vfhs8wA26y8?tuN=m>OW-!UF0eJ!B8g+Gb(p`aU2*?$Ujg9}was|vwAXktTs4)Li i delta 204 zcmV;-05kuc0q6mcB!90-L_t(|0qsyR3WP8a9FJ>6{D4@BwWSa6308SWo|VT0Qm0Fq zHfd7in1FDI9I-gK;sUcvc6Wx|!Ee8D9P_^KnR!{3e6{W4s(94abw!L3^E@M^1PT#H zzbcbJNGUTx61QR|8ipG1gkcz9twjg{&bh)Zp+VNbr4!i)y%r*t(#9gES0000d* diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_accessory.png b/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_accessory.png index 2784693cb673e66c4f6de7cdaa656214e8596a86..57ce34647d7687455b41a6f492c71bab61474536 100644 GIT binary patch delta 91 zcmV-h0Hpuv0oDPKf>b|AL_t(I%VYTe|33pIm|b4l002ovPDHLkV1njID2@OC delta 110 zcmV-!0FnRJ0qFsdf@e}mL_t(|oMZg||33pIfQ2I6bT?qxmM#Aofpnyg4MTMA;|zSF)@aJ|Nb@oLlPs&fXQ{$jOb!REEYx$7_0^W0A@%Px##AY Q@&Et;07*qoM6N<$g1&Dr9smFU diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_handle.png b/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_handle.png index efc671a20b730efef24221bf7a7825325f0f0764..4f298015d97b55f29aaaa5bf75e079f579be562f 100644 GIT binary patch delta 155 zcmV;M0A&B;0+j-gf`5KVL_t(IjbmUK1tftV6$;hsqx10>kvlh(zpWD-E?=~e96vAmA6Hyj zyAo&!$(mUAkCNWKB)6D(rb#0jl-%LrvXzIFZzG{!eZq*Z$0g%@VI!Knz0%% z6X@qF_a8wt$0y*`j9~yMwD+GnU*~UXNYG{s13>Y7{LJ|}Uo#`Te#U8l@c;h|Ud9GZ j(IjX_F(8ISjW7TJ22NDcuG&-x00000NkvXXu0mjfep79U diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head.png b/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head.png index 6a75ea54e8e7c7643725d0f1922f93797716ac95..036e71b91bc86751913c0d4a6e06c342f95971a7 100644 GIT binary patch delta 204 zcmV;-05kuu0`&oqF@LW~L_t(IjbmUKl%QkQ-2Yv37yR#Duo#G!{_k71^8bXDYyOjD zNb9tj{}oNmYmMAJYwd$WYpwkPYbUN=|9|4@b;KLgG;#9()+sapcK}`E5)obN78O$q z5+}(J7yx<2$~U0aJvz3QECWEGchR!{j-e5?W}ZH^y^EKTZ$*f;e_(C*+(qOW&^>?A ze*b!=nfa>xI=@1c#tS`&iv2pB{%Wf`ocD1pT*rxaT(<`0LD~Ve9%vtq4X0u!y&U z6`_8x_vQaW0O0KMO1sf*b0e2yJ)0#NC+t^i0VpSxUGpsf5PyW{D&iq)tGtXxO=}Iq z_~A6{5A-wgquO_mx>ers3&&MI><={6^1Mzj)_mpA-z=8=&V8%^HVx3I9hp*jJIHt$ zrf&(U0f6Zw!M(bVcWMB@IfqWh%dEcFj(XbaM#~*?-o?}N?|^^Q41;|}xo?$ch5!Hn M07*qoM6N<$f{{~y`v3p{ diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head_broken.png index e933f9b372aea73ef527581eab7cae11a76458be..2a9a1f10a6ab24256ed7fa434d2736f4e3b0c34d 100644 GIT binary patch delta 172 zcmV;d08{^y0@VSKF@KLqL_t(I%VS^|)S!F8;{V+Xmj3Tsw(|dkm23W!Y(Uqnx&Mva zJ!|cQLu;-50&6F(UjKjM>UE?U)H-G6|Bkr}{<}m(*SbZ;)PlrFHU#3GrT?vb18Uu) zV{6GW00ep$E&J~n8c}QJ=~LUgcp3SISo;UocF$czo&nwS7bX2SaCRf#09fpRFvBPq aBme-g2}f9GFRq&a00003Hlh#^GSC24jZp(6i(t#)~zjm4cS7 zH#Ea`C{p=>zO*P)u4<{Atm&pj0KlRMI%YuN12a(%A*Z(Y$H~;_u07*qoM6N<$f(g`du>b%7 diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_accessory.png b/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_accessory.png index c8c6bdc3937ccf9d1bfb34cb8ae7b5473c71b672..c66b26ab68d3ba6810fdacdfbe08ae52c9923cd3 100644 GIT binary patch delta 73 zcmZo+`M|tkJ)@(Jr;B5VMQ?I~M5MyS(+})9Cg(bo_uc;g`giF`^OQvA5A_oiMRq2M d^f1k0U|o<1fH&bF6*2Ung9@CB$@yK diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_handle.png b/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_handle.png index 9fb281bef7e60b3e5322edff66d97a7b3629998a..e616f2397fbc0d581b42e136698e30fbd861204c 100644 GIT binary patch delta 66 zcmZ3*@`HK9dPYW*$r~6&OxQ1exxQzEVnu^V`STsU7U{tvq1V5^p0r#tjp61jO-2U3 WO^y++x0MnYfWXt$&t;ucLK6V2d>SAC delta 116 zcmeytyozPRdPc^y$r~6&()_;|{qQ$E+jAtV%pf?;qTrR@;Xk?J0bc}680M!nv8hx^ z{<$6`l)R(ty=d539w6{($vL)Mayd7LrSy8nBNo!?3oPcXe}7%o-}nr}CevUhhEwO= UrBuCVG%)~yr>mdKI;Vst0NJ4|!TE1dRl+uK`|3NklFbco`0B5IC#p1IAWdHyG07*qo IM6N<$g4QZ3rT_o{ delta 163 zcmV;U09^l#1jz)juK|CBNklLfUIVbX$lT}=!~8WIaF;L_T_!8Sl0|3?}FihsT RJf;8u002ovPDHLkV1lU5M0)@L diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_head_broken.png index 64e284149959caac64ce6381e24a79e64055c8a7..4355f230ee75852c3844adf169107043a12ca882 100644 GIT binary patch delta 87 zcmV-d0I2`81pWiCuK`awNkl)A$eL tQ)CFmE`fQ6>_DZ+0OXiq7zM)x00047Hscx;$dCX4002ovPDHLkV1j%FBV7Oh delta 142 zcmeyzyoF`MddB(!PZ!4!i{9h}iHrjt9*&EqAFNOL_a|38;ERD^a(DAgqh=ruWA0?? zjAQ%1yZFvO`B}?9%HI`eigPe?@%HRFc;|)S;XkG_JUjvK1)j3bc$ED;&Tx*6I{SA% u=8cIBc^pOwibomPTy!SLO<0^@z|6oRr`la7Ru#Yi1fH&JelF{r5}E+{OgEwc diff --git a/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_accessory.png b/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_accessory.png index 687ddf4c4657ee108fef38faa4361e7567ffddd3..54358494550eb1b194fb4d734e009e0b68b9eb41 100644 GIT binary patch delta 105 zcmV-v0G9v10fqsPBw|fTL_t(IjqQ#x4FEw11WyPKXwX1OjUhbXcR%|Mpt$NLAyku{ za~_WcnF-!lG&6_@RQ3NOnL>A?s&?y?A_DFXmW*XCvtpc1*5WljXeJ{pvhtQ>00000 LNkvXXu0mjfF#0I7 delta 163 zcmV;U09^lu0lxu|B!7lUL_t(|0qsz+4a6V}yw_(87N9_)WDw?HA@*PfHedltghWRL z5lE(rk|%Y|HV!SW2_rvz&S^2 z4c_}7$!|@dl!9{(wN~Vu$vbg%n$QXCrNkD&T}xC6S2C_BWy RA`$=q002ovPDHLkV1oL*MTP(X diff --git a/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_blade.png b/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_blade.png index a0767f1e7e644d94a987ad1b9513d778d87d9237..b92e71fb0de8697655da85276409ef49484c6d8c 100644 GIT binary patch delta 116 zcmV-)0E_?L0g(ZaByCtpL_t(I%k7b|4FDkw1Cdz61wD;Lks;Ej%`Qyt-+@5)H^Av+ zH$KM3oSSX}>$*0j)D%f4D5Wg5RzMPC%q5Zq zC5&KpQv7Ldey-@Y;SEjuPQA%sBA`JfY^`lqr-Kkjpq%6I-~8TzC+Pn;AW8blFaQ7m07*qoM6N<$f(A5IuK)l5 diff --git a/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_blade_broken.png b/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_blade_broken.png index eed6f8aadf93b58a8cf3fe98ad0b6c1c189f9fe7..ad50e6b23d0b0e321a87eb33079b311dc4e2a596 100644 GIT binary patch delta 93 zcmZ3*SUo`{+{x3$F~s6@a)Jcw7RFn*Zv7V(5&1Vcx1p!!%>QG@j{PqzESw_gw9%V~ whv#2)Wo6(qp|rHL4T?ZwN@co9=0yPph8qth;!ItAxEX-J)78&qol`;+0CHs|*#H0l delta 141 zcmV;80CN9(ssWHBe{o4fK~#7F?T|4FfFTHl?T_Xz(9m3ahv*PNH*e?y4$l6#8@040 zh#>m$-h)?{6397ojFC_9pLT?Z(0hm0+7@Cofb2pD?7asff-%POPE{a)Ij3>XK}zXJ viTtQ-t>s!Pmr}NNRDdkSj?CAW68Hh}78@YbId&5O0000<2SrXqu0mjfQ-we< diff --git a/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_handle.png b/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_handle.png index 3f62937c602fffea8a123364308e0a5ed9a86663..dcf73b5c4dbf8e120cd0f806b89451d61e8f5a28 100644 GIT binary patch delta 97 zcmV-n0G|KI0e_GrTSiGlK~y-6V_+Bsqkvu@G&JmW6ci|T2}Rxkxx~oGh%)bhTmr%XP>>)ypr*a400000NkvXXu0mjf DAm1sd delta 171 zcmV;c095~f$N`Wfe~(E-K~#7F?NBie!ypX2RAFXgVr6H6PcXCcT_j!s5?^3pfGUwd zRhmfY(kWhSpM2-D@x=3izkR@3+qKsHY~kw+JYwE^7-Qg^`x04>!&kkOvI`-QQbGt} z@@8>G{KPruol=TY3Sx{q_tptRB3h nchQpnBnKkM0BjluPdWeqNtE;1bt(8b00000NkvXXu0mjf@l8ER delta 169 zcmV;a09OBi0;2+uf`5!jL_t(|oMZg||33pIfQ2I6qXrCB112t8@&Et7{|p5&k&Gl6 zFm=VM|Ns8|W4LtjQk{W;UK2?!n7Cy5|6Tj`)rpG;Gw2%_H04G{Fp^}zUxxn-qQXK9 ze7w92e}S$*1_TY5ynMy~ix)1`fox^~=9{9JC`M#?qFkV_uOi=su90X1ko`-R0fYbm XB7rW^+^*#H00000NkvXXu0mjfz9~+> diff --git a/src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_blade.png b/src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_blade.png index ad36ed3cbc2a7afe64183fd934c38f64dd05ff62..66623a96b0fae49ba107b06735a37fb5d068511a 100644 GIT binary patch delta 195 zcmV;!06hPV1HA%}f`6t-L_t(IjbkWpZ2g~BTJ;|Y7|6j4Wev^$wf#bBQwz$-G6YPN zR@MC14-BhKEi5J35ICc>s_wsze@JawNhL{!pm0iS8vYvwN7QBj4I|3{5H722{O_2M zO0*$Z1-(l8^3_NtqZQ%TF;%V-kOe1ir-e(=%`FDvVEE zV?;WANC-k)PBUch0OOOi5hC*?jUy6)#>M>uZ@0S`4UTFfa(}f+V?!b|xSBq)mtn*F z+yp3)NRwiVoB3;PME<^TmdUq$+%4YO(*{GME0HxIPr@DYb%e=m#yft1^Q8QXHv$D> zLQ*}8$;+HQ&YIZGO-g}0uJ<#}?c0J|$pB}5dkv`siYD1O9e0er+Hc-qm9odRfvWri a;2W@bZ{gK{mJNmg0000;@z>w)~&Aeb;}o4On~b(*Nk1 z`r4^mcl;;Y3#(6``yX4|P&;?;f&XNO!K#yI|0gxI*3R0w|3BG*xcbz&|1mX9wR3hK m{7-f)tT=J{|7c32p#cCA^!ceE?akW&0000r{3Rs(_zbs7Kt{quj*rcHGm9320Xoa}KLf-?+4Obi+S|NH-c z$IcyfK(qd*x;bDq1aBaQni(+y!T*h$w$w2(G5t?=vBNNgU@$C%m>M$v{rC5OxVZ`G lE`R}Cnu#_59~cG(004!QF^#F3wekP}002ovPDHLkV1mNRS<(Oi diff --git a/src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_handle.png b/src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_handle.png index 7e630906ebd067409f598b7e0e655f5dc8945013..1c6839d5c084e74c1a931e9c876ed29252407a3c 100644 GIT binary patch delta 149 zcmV;G0BZlb0*?Zaf`52PL_t(I%VYTe|33pIm|@g_Q3HrIz$`TKf5)n||H(FB(v}_n z1M^F2+m^5XPqr5(ZQ1_cBrvqLcg@ECWQRfDx=sH>3QKDzZ`|^q>_D8kYv+H5==j=2 z8`u9QI~L~e-1a{xuc&tQx;5lS-=?*z|L<72>^}gC|MbV0#|~~A00000NkvXXu0mjf D`n*o1 delta 192 zcmV;x06+ha0=fc_f`6k)L_t(|oMZg||33pIfQ2I6qXvv91I)vs{s)DIFqDS|F_L9K zOnf}U{@r`(+W-FhUl|dCVhB+N6kMZtb>Lx>K8TyGD?Kfiwe zKX&+V-4s^l|2cl%j3gNV0)>ITjNClz|CcXZR>#lq`+uxo068Pcv5@BK#>n>n@Ba;3 u_tbIz{rjJ+XiRYPWEB4L^*`J1Ukm^$NjRc{gYAg`0000n% diff --git a/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_blade.png b/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_blade.png index ec09a2a417e32e9745af9036ed6b5c9663de47b5..7907f9b1a7c766a9b7ace00250a9a1199341b165 100644 GIT binary patch delta 77 zcmdnP@`ZWBdPY|RPZ!4!i_^&-UyOe6AL4n!G~wCn-=&)7PcGQ>IwpCP_uVcqN=bD7 hP+-)OC~|?1fx&W_&4K3Nnu82L;OXk;vd$@?2>>3dAF2QV delta 150 zcmV;H0BQg91H1&VuK|B}Nklz znx{dLOUO2a5#10iB{7C;_g*o~-*$l!w>BIGkYfl|1*90lgiUb%whN5c?!97gFjFQN zJ1n>)pf>+^FjHn=U|{%<%OyAsAjJ@ZfTHv<3J3!LiWooBJ)REjYXATM07*qoM6N<$ Eg7ttu1poj5 diff --git a/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_blade_broken.png b/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_blade_broken.png index 55a9f5e93b36f6b28ce3cc26b1d5142e9c555fd1..57eb3fc2129e44ed9991c3797f91553f9d37b912 100644 GIT binary patch delta 67 zcmZ3=@``!GdPZwCPZ!4!i_^&o608ym7f(O1=Lk-5DDS(iV3?BV{Gq@o#iaI<00RTZ W7Ud_EE812v0D-5gpUXO@geCw&7Z?@* delta 126 zcmV-^0D=GN1EmD8uK{*pNkl?_j3Pz`(%pAD2sT8bFF6 g1OX|rG78850G{U~)eGGEkN^Mx07*qoM6N<$f=vK8r~m)} diff --git a/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_handle.png b/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_handle.png index 92f089d5ec804adf570743613151c30ccf5ce172..bec6d18088846155ce1aa1998a127a4ef8e28a4c 100644 GIT binary patch delta 78 zcmdnV@|AhRdPX-xPZ!4!i{9h}3D(68ataquKd3M7yIn8fJ5iBax{1A0G34X9g_TlM iq>F0z>pg92FkrZNO=F7ViP_BzK;Y@>=d#Wzp$P!admi8b delta 147 zcmey$ypv_addB)vPZ!4!i{9h}3D(68Tn!T^G`Z+E|Bv!Y;<^5AZ_y!oI$@?|_58(Z`LCzi~wgn%qIhMjR*D^I$=S;oN4z`)??>gTe~DWM4f9dkd! diff --git a/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_accessory.png b/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_accessory.png index 218de2882300ceffeb453332e2ca1236b15f4abd..4e8958172e76b19f385fe58fbc1ae06f89eadf8f 100644 GIT binary patch delta 114 zcmV-&0FD380gnNYBx_blL_t(IjqQ)25x_tQ1iugj{tSaaQUIR*OS!1{47|+xUAS|8 z?h_Fl%bCgUrmD^(s!Dg?N4lGz>% delta 179 zcmV;k08Ian0nY)DB!8AkL_t(|0qv173&bD{h0}x1g0rBzATB!k|3`mp!ZH=3{pz5APb<@x-9McPR=F5tgSfc3|IEzH|H;yHZd6)nI002ovPDHLkV1kmrCEWl3 delta 90 zcmXS_oS+iw;OXKRQo;Ckf;BIL1BbJ|q9ZG_P(X{g&6WJ~&gyKtzJI^xsea+EiLn>w uOwaQ4&`d@K3*%o+9T#pdJ)eHd?*Vho7Xgp(!`?3#fWXt$&t;ucLK6VWX(Cqu diff --git a/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_handle.png b/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_handle.png index ac7091a5da2ab92240646c2e51b513aa9fa73771..11b503c5133bcd8b00dc609b5fe317b76264eba4 100644 GIT binary patch delta 183 zcmV;o07(DJ0@4AHBYyyyNklOhv~S*SVQwjA=`dHH6TJAaBL6$Rr4mb1Ou_Du^I2^Dyn`pkc`owf`E3`GMd7 lxsR8?{wR3m0K=~YUES}VWbHNMfIR>J002ovPDHLkV1lI9Q$hd$ delta 304 zcmV-00nh%@0m=f9BYy!ANkljStM9>!)85{c;-{435 zfiDmvGr>R%LK=N3uWz6z3MR`kdr84@9Hy!&3&W5} zA_V}(aTM0jIY|=QwvEcNqzedSUDs*fcX|{-9?ei&mW2$%pntCGq)#LtoXfWM?Z?inm*7zR3ygU<7$zq;NzxVZqH2HSOA zm(K_XK@dDGf+-ENEX(-JP(?iJ09fAXUj)wjKE43f2xBL_t(I%k9sx3BVu_h2d-5!rsD0a05$A5nRLtT)@_GUw8*; zgGrUb9}chj@I)T!y~7v-z9}U*=O8=PTEQ7(z?5F^Ar#;EfOxliL+JV(C9pUCO-yDkd}K5I_b>J1SO*)8K6V}0000P1 z#$ck-SwO-40or5*?Hd3g326pl0Ly3d U;*mNM*#H0l07*qoM6N<$f(9&E?f?J) delta 235 zcmVu z9{^KRDSU-EIF422dCb&aCgiKaLf1$T1UL*rM3^ewR7mWIQDpM%e$O-~0wQfU>--x; znk-jP>NRfA$xe?2NMeKY{EG$RFq8^ZFq$o90z5xp5W=V}=O58%ic|?hoP(>yvs-mJ l`Od@<$1RD3$1~L&=?&FpO1~kr3snFB002ovPDHLkV1lQ)X+Hn} diff --git a/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_binding.png b/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_binding.png index ce63294b2783ddbdb2fe5703949b48a73443b93c..3f9178effdd6bf79b08d691035070d0a49eab769 100644 GIT binary patch delta 90 zcmV-g0Hy!w0o4JJf>S<8L_t(I%VYTe|33pIm|+APFl+6G|EqTHBv13y6|4T+`Ulpo wB-a2-Z{PpXx%uQ9upFonghzTbjv9c#0Lst#cE;%`-T(jq07*qoM6N<$g5wS=fB*mh delta 110 zcmV-!0FnRI0qFsdf@e}mL_t(|oMZg||33pIfQ2I6L)(Da>o)!u;Nc|CfN3jN|6j3u zd0kFcMiW^EELpsmK}kso%qGi#yu2I`)fDFD#z>X{5kQSF_7IN7Q3DVF05LWbSctFc QrvLx|07*qoM6N<$g67XITL1t6 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_handle.png b/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_handle.png index 89dde9a62683316fb7bc8f9f994080beb0b92624..2feacbc82ca12e03e52560e2db853996c973234e 100644 GIT binary patch delta 286 zcmV+(0pb4e1C|4jfqwx1Nkl`HjwV8^=9{>S&vwvY^T z2o{xc5S8+vSy$%nZUn+~4vBIFsFO%qf@DR8wzz>% delta 376 zcmV-;0f+vU1MmZofqwy6Nkl)8;w}ad9vo!+^Ru^Zy?>aG?N+(bI z&&0&UaOmKHIu}>BCN_3`7(g;(JVL;c)HUB?<`cx+dbmH;j$Lp9FnHa>y#TcBNU7A=~SQyG8LQ%Yi zVgM*`4jedG_wD<421iH7CI&{3?My(K{|wbJkyyio1zGdaBS-241q2uz9PFBk!$PoX zz-a(8(4ybJesMAA>+3e1J9DnCW66sD6)_P64FMZ4b?w^!`wkwdb9HfS$_oi$oU~@m z|8wUr*Y&Ml{l6$Q6t5w07l@0A!v#Tx%mx~g8ba6`U<3I7|7S4QP-%)s(m;%65C8y? W$$m>8rAD#<00007>0Q>GAS(8j~Z{%<^X?7wqBU@ZunI5^d6Sy%uK zvZ}4@CDJt@u=>E^|10+H{cq>xQ>$-dTdQVlQmbNQR15MV134*R#jd^oZ9Kec^=#~F ui(5NL(+mSkw{QQS+tf;)=20*TXa)eMW=RU9=?YE&0000=Ns!% z`2Dk$-9BdQ58SksCJaLWj4^!rzSvsRtk)HQx^$43Z?=Ml;aykH1qglv%%8zZr6`sw zUZ>%xs|ShMdLxHJ%&0$bgD@b9B93yTRIPcp^e5BhN^*s_RyLP!HQHUdD^5%n3wih2 ekHs%9PxB82GDkzeE`{L$0000`{F t!~Um{V~ATq(tn@f`6Y$L_t(|oMU7l0E#-h{{Q*&pW)yCzYM>A{b88ZRL6)c&w@{L zU`E#en>X(;FfcOK{r&d`Xb1yCMq|r=AfI7IT{R;?1J=)&23F)86aODXGchsM-Mx3W zj**FpAsuMY%=#KeyavF)-X#m+2C=fT)cpgp@7=x2kOnk_C^Z9+4RT9J0()WiqWOfq qfDP0000PZ!4!i_^&o60BF)JLA~?YhJ3U-T$t>i`UY`zq!bHSMePUW0sTy q2aYfu^;_Qcf2Ejkh^KJN6$S?02l}3j44XFVdQ&MBb@08ULW2mk;8 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/magical_wood_scythe_binding.png b/src/main/resources/assets/tinker/textures/items/scythe/magical_wood_scythe_binding.png index a870a6601a3240a0803972716ca64eac779c616f..a9cad3e2616f546e7cf4f46597dd7f1687be8c3a 100644 GIT binary patch delta 74 zcmeBS`N+IsJ)@JZr;B5VMQ?I~1ZzsOi+=Ne1)pipUjHurU;cc@#C!&i&xhI)KJhL% e@pExP1QWwfJCRdnPSf}qfWXt$&t;ucLK6U~WFFH1 delta 101 zcmey!+{3bAJ!7ngr;B5VMQ?I~1Z&TeET1n%Kh7Tj0++sLuYZ^R&(`cToRE89+SW-t zNlJToKtSh-M8Vs8+HKk2;|$N-FKc|GAi;W=n}K1X44?GhIVXApQFm?k# zg4g%!Vo1WA4AY3$`5?(d^EBWJ3EGOyi7*V(M3k-A{D+K*4q2j{iOT?(W|;rUj#peU hL6q&pqy?%bO8|uxe#%}s_f-G@002ovPDHLkV1j5wIR^j$ delta 206 zcmV;<05Sij1oQ;3uK|CsNklQ2dXfcx!2(^~prq^dg=7AK2000twNu}=KRMY?f002ovPDHLk FV1nk{C-DFP delta 159 zcmV;Q0AT-$1jPifuK|C7Nkl8GvL9ia{{oX7`GLfx+Pa{B0K)vAO`CixlOqGKea& zGQ7V3n_>PM4(u+#?;>pm28OE)^Ve`-ga=U|(aYdJw!j?)qhJ?c0RU@;EVmXa6)0|NuY z$1gt^p1%5oVh~;fuo?96%MS)OyH^bJ*Kjb*-*$nKCQjQ{`u07*qoM6N<$f-;RVNdN!< delta 202 zcmV;*05$)Y0pwE zk3^XukDr?;r8x~n0Vt(#90#P7L(NU`x~^Rxr)dK41{YO0=k1j$&j0`b07*qoM6N<$ Ef|(>;VgLXD diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_1.png index 122df71ec9b41995cc9329d067cee9d62a81ae3a..0720c9f64772d16daed914bb59cabdedf3efc684 100644 GIT binary patch delta 122 zcmV-=0EPeN0ha-gBy(O#L_t(I%VS^|1=I&-W@i75jEw%1rPQjQ{`u07*qoM6N<$f-;RVNdN!< delta 202 zcmV;*05$)Y0pwE zk3^XukDr?;r8x~n0Vt(#90#P7L(NU`x~^Rxr)dK41{YO0=k1j$&j0`b07*qoM6N<$ Ef|(>;VgLXD diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_2.png b/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_2.png index 990a8c1504116eb88a97a467a22a593abeae0725..aad55af77142f91ee006e6f0004461bda4ca6bb5 100644 GIT binary patch delta 119 zcmV--0EqwC0h9rdByd|vL_t(IjqQ-36+kfv1FM*#0*^x=nF1{PZ;`J$K%w%VPjWA7 z{k+G_psHwv-5r?;5kW-UmoPI#1bgrMa8-ebdduVWV=yW(Gh}A3fSIAHbN%*#BmF}+ Z`~mtWG4LaOczFN-002ovPDHLkV1gtzG&leN delta 188 zcmV;t07L(j0oVbMB!8btL_t(|0qv484ula9g=e?W=+qKwr9xCrp>|$JZ~&D~sj?v< zBwMh_cE3bOy!qyNz%%}kfKsYTDeEcvy$X#nl`#gT6tLDFL0&6>b6zpVkaLC@<94>{ zzV4lK6(LklI}gb0@@w~*fiY%4uht0&A%GC#sn y9Hf+HO1{g)xj?;ln4Nq)LX=~Sk(LMXGd=wjZoBbaSqV1U~YkOq)um?k45qyI88GAJ0QW{`~_4cgk;aK#}ZA^%D8FHAGTC>RAp a0ssK|k1xn8N!}X(000074V~!+aU=tA|KyjdfkI?>kB<5JJE?2k$*@9}E{t zDQc}#6k|k6>EabaSjdI>F2`~7)*6g4$T?3|N(pQ2t>HX610rLrZ`;<-+&jMsJU4+4 XS+_H9BE18z00000NkvXXu0mjfW!y>} diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top_1.png index a71227df55f7aa736e468ff6c5ead1eeb145ae4d..7ce8a07caa551b739ebec32d6738c0bae41d0821 100644 GIT binary patch delta 120 zcmV-;0Ehp@0hIxeByn6xL_t(I%VS`mCy0xS`_IC{^54wN42+4^q@bVx)({#R`rpgT z>wjZoBbaSqV1U~YkOq)um?k45qyI88GAJ0QW{`~_4cgk;aK#}ZA^%D8FHAGTC>RAp a0ssK|k1xn8N!}X(000074V~!+aU=tA|KyjdfkI?>kB<5JJE?2k$*@9}E{t zDQc}#6k|k6>EabaSjdI>F2`~7)*6g4$T?3|N(pQ2t>HX610rLrZ`;<-+&jMsJU4+4 XS+_H9BE18z00000NkvXXu0mjfW!y>} diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top_2.png b/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top_2.png index 09662f282db8ebfd5d4e88469847f8ca73f4b03b..77202cb64f89922de3527942b6c0dc7b909e3510 100644 GIT binary patch delta 123 zcmV->0EGY10hj@hBy?X%L_t(I%VS`mH(+65`EO=s2F65bh>MH+ub`j+*AyBW`oFQU z5lkBx7~nPpq!^?bq|nRD>%X?P_J1QIqyI88GH{GjGss4eVvr`7;*gLKFecisFwG33 dU=$1q007K=FPmwzE}#Ga002ovPDHLkV1oRyGj;#~ delta 181 zcmV;m080Ou0nq`FB!8GmL_t(|0qsyR3dA4~oPdxYqzWWuAgNLWU*lsf1+DymU}a|^ zf(Uy=NOw6nuDK#x%@fJXx^D#-W3=ykJ5x$^tW6(42tiUx48zb^(==h*Hdt#> zN}*c^$8pfIEXX+{r3B|3`o2d9p$VPfy?^guo@c7HLTil}<1Wbs=e%`e%}Ncl(=~4%HhQ8(Xk-HfHRRO5}2OcK%;oS^3x8 z$cQO9H#gUSZ6hxa&jx9xO@hlJ+}zlDoSmEu4C2HOm>Bmo1sbR@Feua+oDF=uZwCVq Nc)I$ztaD0e0svz7C3^q> delta 157 zcmV;O0Al}&0l5K?B!7TOL_t(|0qu|>4g?_(1bY=8fkGfj@Pya!LSBL71v~+ZAOyo) zcEshxUQXVM9Wk9rsyma$-{<)CL5z`d&QMCdQEM$~tth1&Ujw}Nbb@nEj4{w!0<=N(G>i00000NkvXXu0mjf%F$KP delta 222 zcmV<403rXk0@wnOf`7qDL_t(|oMZg||33pIfQ2I6!_j1Cei{BZa`~(E~B`Z`2XC95R%;h Y01i($V*c@0`v3p{07*qoM6N<$f^NiY-v9sr diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_1.png index e17d6b710f9064767e1bcd2b218c50f84fd92bb0..aa451868429229afdcefc8446531d5624fb0b9a5 100644 GIT binary patch delta 186 zcmV;r07d`U0<;2$qZ zQR^BSUORR1;{PNY&^&qSf48uR+KCGnk?w+)DbxOISXk9gTD15-Sz*vUW5$24s2Iu& z(6O$0*k zn{s1`(~M#OI|~zol9Cd!`Y;Uufk%%XF)$KsHsyzT~T^kQ!)Vd_;!*Py?C@^B4sM1^?%h5PdKJ Y0C+({Ew3ft%K!iX07*qoM6N<$g29ku>Hq)$ diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_2.png b/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_2.png index eb34e92f1c98f661d7da6c43183144b4c8fca657..0eb41d0b72c9bc48250b19df783eb1b3540c521c 100644 GIT binary patch delta 166 zcmV;X09pUT0-yqrf`5rgL_t(Ijbr%#|33pIm?F)?)qv%D_x|@zNd8Zj0qcR915-0< zvm2UgcN{rFlp!dbjX(nm+d7EWjAFnRpytr5oZ4+9Xhtz$Gthv%rdE<{M==28|NQ3G z+U?{T0P=reN?Pq6atzoF)Er+_TziB>&2R(u0u5-LK9e#7vL9;d$Tt9l$c83f`6<@L_t(|oMZg||33pIfQ2I6!_+M1vtCXa7&C^FaUr`++jkcyVNl00000NkvXXu0mjf DLy=iJ diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_3.png b/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_3.png index 93e931a40c32ff28d12c20f43cb5df52d7da66d2..fd8ae40f99edeb056593d589c16c3522dbf5293f 100644 GIT binary patch delta 162 zcmV;T0A2sV0-OSnf`5fcL_t(I%VYTe|33pIm|@faOata^-SOW(JnBDL1}xdJUuZYry<%J193Gy`i~wGr0zUVj!!zt#%W+1}p%@LVObWu^Rxwq-q9X0LKsUluZC8 Qvj6}907*qoM6N<$g2g0EH2?qr delta 199 zcmV;&0671g0>J{1f`6(>L_t(|oMZg||33pIfQ2I6!_ffY*`Nj6~V z&Yl04En8Nnq@>8O>cD~jVGa%i4M8#B9}p`lDKU6B**66dp&7-1RY2R9EL~BTofO~X zN2F#H1AYUsyqp}vUt)El8}Q@LKZg4c9xyPGYXCD7sanwt06+m{RaFLN@?8ML%*+g= zW-Yh@peVd^=MKYv8%y#Ghr%q#j&lmSsi zrT^o~tNzDV*8JD7vaNLp4X-ux@UE59)vt{$DZ{NX5ol9PY59LObIV$DZ{J!q3#;19 z=C=PCjjjI^friDER^oO+P-gCbEn5emM!(vW+J^rr^^O0NYAx#jlN1J~UOxY0O3MFJ iH4sM)7&U-q1^@s!v)i0?`7Hf`7V6L_t(|oMZg||33pIfQ1yrsdWwi|NZ^P@Z;-O29UkWCiXHC zG$6XT>^}=DD+41F6T``a2kRuHr5L__{=)F$=@W*y((?Z}4M?i4`~Um*FNQNmkJJf@ zh%mf=`#K-`0 z`m~x#Mxw%C?X*dZX5PO4RW&skW;fMiXd-9;2%Orw8Lviy1`rEI4Hz{51ON>1L?PSL RYGD8X002ovPDHLkV1lN~Y`Opd diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top_1.png index 5ffed3dc783a8f5e8150d2d0b9662904113d059f..e657984bfe930d92d0377951788e50b778bc7609 100644 GIT binary patch delta 162 zcmV;T0A2sZ0-OSnf`5fcL_t(Ijbr%#|33pIm?Xtz{r&&T`zQRb1mfBW6aEurKm|}? z1yDmdP_uJlYHfH)MQwO#WvzQ^Ms54lX}C3(05z5YHM*vx12t6Cf;6{Ho%$by+ow(a z-wD)=(*;F9jaHE{wSGB;wXHx6El^BS82Du6{cpyhiR?feH5*{m0Gb&90KO6F6bWdr Q5dZ)H07*qoM6N<$g0n3~XaE2J delta 203 zcmV;+05t!c0>uK5f`6__L_t(|oMZg||33pIfQ1yr43$|~jOc2y8qiyi z&*+<-|KC(og`opF002ovPDHLk FV1j^0TFn3e diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top_2.png b/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top_2.png index 69877f364fb5432294aab2404367840214dcc32f..a4b3614194da3e7a181e2b63256c5c7200c54020 100644 GIT binary patch delta 173 zcmV;e08;wfFU}RWdND?VdUN zfA5@m|0m3wkJ|;!lcxMvH8HDo2@0w0ojn(*VebDvBuzwxfhK!c`2T(^8Ym9LQ3FN| bposwhcYEdrYPd?+00000NkvXXu0mjfW4u`Z delta 205 zcmV;;05bol0>=W7f`70{L_t(|oMZg||33pIfQ3{Ity8A{|M&MF10y3NLrq=|BS8ad zx_kbE6#xJCAFOHl@?~`j3W^Mm9zJ9c=HvN~(}1Q4lm7qy^P6GuqQ!LziV6&jK=}Ca zV}{Jk%qAvgW(H;^MuyCU1ne$onLPFXlBG-QzkTMM|J`%u|L>a*!QFG` z|8JQ#<3C;lK$<{U)7rk)J0_u4$Ih|V(AljvFgdL@Fe$ZG)7q|f^3oN!G|&AH(%=)9 zSUYw3%Ky_>to%P?<;wqap?Dq;&jMn+F7S;{{twbT@PRmLz!|6k#9#mt!s;YJR!RW? O0000qr6ciX3fZo1w^Ckm7zrcU2 z26W7t_kZcqrF9_1IXPKPKnE}|0x>I89>`?yba!D$4GY8Wf;ft_B*tUMj{W!WaAU}d t2xBBG3^py8gI6O#1BeBq28;nKGPBvH>t~?cOVf`P(iq5@P^dQKFZ@ ze=Q|3k~HIV0Vx2*05K6>k_}*FpuqVkE+EHt6ay6Hu2N=zs3I#_2EYNa2?rej087{& U&%RAq;s5{u07*qoM6N<$g2m=3%m4rY diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_1.png index 4f6addc6817dfaa33e6b7403fa494beb4f6059f5..5a82507b20f45d3246ca73294f207c23623e745c 100644 GIT binary patch delta 78 zcmV-U0I~n51cU^zuK@u-ldu64K$ER`VM8$301%sO1IX4)w#`&CU|^k3w(T$j4$ae` k%z*3rb;&mXW(Ya@0Bux1N{gWi)c^nh07*qoM6N<$g6E4LKmY&$ delta 114 zcmV-&0FD2I1gHeCuK@vMldu64WD~2N30<>;nKGPBvH>t~?cOVf`P(iq5@P^dQKFZ@ ze=Q|3k~HIV0Vx2*05K6>k_}*FpuqVkE+EHt6ay6Hu2N=zs3I#_2EYNa2?rej087{& U&%RAq;s5{u07*qoM6N<$g2m=3%m4rY diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_2.png b/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_2.png index 797648eb64580f6628edb4e931535e2348948d40..1488d36545db7360a1cf8de651f3ae01b6cf3b46 100644 GIT binary patch delta 78 zcmZ3@(!#P~JtL#T4wKhbCORA3U=Wy{!+heJ&$hG8#~Hf*_-{*_!Px#RGa&82 i*T1`-NHZ9>$kZ~p&$ahj+Hau100f?{elF{r5}E)3vL9Oj delta 117 zcmV-*0E+*F1giwFuK@vPldu64XA`TQ30<>;nKGPBvH>t~?cOVf`P(iq5@P^dQKFZ@ ze=Q|3k~HIV0V#mG28fC9l57AY15)T8ICYmK|D(7-QSK_qwxbvzs>n)~0dPQU!a)ZB XLLnZQKZ(v;00000NkvXXu0mjf-mWdl diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_3.png b/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_3.png index 63536d0f55992563e69f03f3c0ea1175f531327c..a51b6bb8f7b6a43b24dd0c550d347cc0d3f5095d 100644 GIT binary patch delta 76 zcmV-S0JHy_1cC&xuK@u*ldu64K9j9^VM8$301%sO1IX4)w#|db0J8m0H3JUK)1b_N i>-%-dHvnb`sd@nP#y?71at`MJ0000;nKGPBvH>t~?cOVf`P(iq5@P^dQKFZ@ ze=Q|3k~HIV0V#mG28fC94zLRp<*rg@fT$uXWzHcs@gM^Lb$l0@LA-IP00000NkvXX Hu0mjf?R+N1 diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_top.png b/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_top.png index 350a266428e44eb477946573ed298b06eb3945ab..4e25f9de2f463bb7c17860db11a6882fd37b57f8 100644 GIT binary patch delta 91 zcmV-h0Hpt|1cC&xuK`m&Nkl*SBz%-(3BFVoX14!013P!-|` w5M)g-jYPWu**21$3Ted1E%ag zrLgM6sRIWRKFBZUPLSF<<%k3b9C4|T~56#o~e|^6$enVgy zx^vv%7^Imf7r->4YarU$AOJFeBn_ir6bvW;0ANQt{T7)I=Kufz07*qoM6N<$f;)dC Ai~s-t delta 134 zcmZo=Sb0jd}UILq9)nk4-p|<*;b_!FpX)LmplO-81x{~%iupQOq9m%95*;#*bofHhvsSgzrJ4= rw;?c%AjM?60Av6`MWbL83>p9c9?ClXS@od300000NkvXXu0mjf;)EfC delta 122 zcmeyvypUzXdd8wyPZ!4!i{9h}iHrjt9*&EqAFPil`n)|hAw_XXptmQFo|@XB(+7ZH zfkydM$B>Cr8ygQkun!YgsgnG2JxC~7K=@&*MZqgQzw2l3moaYV-&K6)-{azc8WOC{ a+zbq6(N~t6B zZaf7!XOvQ2%D&F1Yr>e!#u#a>N$>qu_HN)H0j#w$=aezVz9wV+)(Ak^AML!*`Bk)) bf5krmzdb5W90fcc00000NkvXXu0mjf=;cdD diff --git a/src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_head.png b/src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_head.png index 5230c15b366db6c82159743e26acb7701c89010f..b804ea2e87d6895b9b2c5d38d241ed42a040fdc7 100644 GIT binary patch delta 129 zcmV-{0Dk}L0iFSnBzk2@L_t(I%VS^|Qoz8#;6Dh5goOMjS+k6c%zq;zBQVz1*8UIT zlcagdlqvrk8yo+Zl$3zkM7sjyWHvUo|6X2R|DBwiz_x>2!OYD3pCrG7G=mHw$#!gE jK$73l0a-SWf}sEaoo6(M$|_8900000NkvXXu0mjfzFs@O delta 207 zcmV;=05Jca0qX&fB!99=L_t(|0qv2o4TLZZMSo5w!30zk2vJcn1S7Bn8!!|@Fal{Z zL7GHL5v56rh?BiQlrd1qSeE4>|1?cF&y!hhB$lf0`={$VwxyKd zy@%FXyjdwUf{){Xa}FT{48wryx+n#T2`IKw3hTNe#t35!nnM{10O7XK8?%aS&jez002ov JPDHLkV1hGTTBra3 diff --git a/src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_head_broken.png b/src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_head_broken.png index dc4df45c54a3181a691db76c7c18b621d0da14a4..5e14e7be6bdb7e6d2748d2be1868a4a72521c61b 100644 GIT binary patch delta 131 zcmV-}0DS-40iXepBz$K{L_t(I%k7Y>4FoX^1y_ocD$ET+ESF$t>{8r7Dxc+tE_Z09 z9X@)W>v|MshM7@S9LpktyQ8YCwGa`GD33EUeQGJ5?^2?B*6 zAq0Z!?r;H?HM^oDjF_4C^JfM>e?yN0&iPIK$8kUiQP~bTQaMV}#z!NN$hxj5rC^@t u3Vyu<=Ukn=s`Q5Iy6P2rxu^f{H}C?Awl?n$DT6Qo0000rl!5;q^3l{vRYeE75-xcoR Tp1hVq00000NkvXXu0mjf{IgO! delta 202 zcmV;*05$)g0>lE4f`6?^L_t(|oMZg||33pIfQ2I6qXy8)fSM^Y{+~a4n!(E2mZ3T& zfsrHw>ZZ;9zkBDdx`5z-rpkmk49$2AsGmOT|JBQv@oL6tK-J{w|M%?LSr-%>)Kq~- zGgbp?rcVEV{pyvvKq54w7|=U^{{LT$j0}ek9HMRBSWki#Q>1%eY^M7h4}h3 z<;BGkr5VM5qQpc-9%d$B=KM#jUQ`1>AT2JQXq#aG0IDZHzKptO@&Et;07*qoM6N<$ Ef)CVW)Bpeg diff --git a/src/main/resources/assets/tinker/textures/items/shovel/inverted_shovel_head.png b/src/main/resources/assets/tinker/textures/items/shovel/inverted_shovel_head.png index 055ff8230154bbe2f6715b7b8e1a385ddd043ce8..441515a1f4dd73fc892fbdefca0a8c9c32909998 100644 GIT binary patch delta 162 zcmV;T0A2t20m}i9F@J?gL_t(IjbmUKQef`hgZ~#FKK6gXfn)zk*SzoWe_eC)T0L`% zS_fbM+64!W5O2uhBPajsnOg!i`qlcz#?|UsSk^8*c9J*)R-8Kf-@wYc*3mxzs5u^N zyFSo>Wyekt?*fn^{s~E7LqINBN{VKg(Hs6A1w#!00Q7S}&Fn~C QWB>pF07*qoM6N<$g89Kok^lez delta 208 zcmV;>05AW`0r>%tF@Lj3L_t(IjbmUKXuwE{;<6QAS5Qvu;9Rv{|OE@j6@l*_{hos-NglU!eZhKyaECY4{zUQU}a-v zAj$YGCrKkRSbFRv`I<+;UUkyJ$8~f16G_m`(NMDxz-)1+0H)@ z=z`c-%b-11}jdT{XeCprH-42 zhe29OlEFDBq$%3UjHK{mSbXf{e|-n1+NH-&{U=EyGFW=-B>9?0!C(de$;vzvZ@Tr6 P00000NkvXXu0mjfn%QO= diff --git a/src/main/resources/assets/tinker/textures/items/shovel/magical_wood_shovel_handle.png b/src/main/resources/assets/tinker/textures/items/shovel/magical_wood_shovel_handle.png index ad264915367fb0316c842b542b579c076c11650e..c45f6ba5f481285917784836161de3daf0849e27 100644 GIT binary patch delta 85 zcmZ3@@`riDdPZLhPZ!4!i_^&o60FLMDpity>`nY1+jppW7nk=*|C}Xm#=<`#ZPOgy pOAdt%vG><|&r2%_zhF9-fg!rmV5REASzj1{z|+;wWt~$(697>9AOQdX delta 132 zcmV-~0DJ%Z1FHnEuK|2#Nkl$Gfo%4G#@y17q4cl1`y+HtOmdWDKX>+!~8WIL}|vb`TBlc moS}^iu)r7)8%fhl6#xJ+UNcBcs%Z@X0000G5SV5V z?#^)o8$z@J=$aQc1cNcjE+AVovLR$^MmB_D6bwfI08{QiEfxO`AOHXW07*qoM6N<$ Ef(LIU$p8QV delta 163 zcmeBVImxnNJ!5^Vr;B5VMQ?I~M8*M+u17BV&HoL){mB)Vkd%;+i14_mqkHW5gS78m zjv*7LHZ~r7@E;^M)8pcq0|yQie3~P3`1SAo4~tlM9j=`@fB2w++M&}0|0kNo%v)jL z@x|!J`lTwzKw?0}2MQisiLH0o7Igi>2SioZQMQA-|ang j!N=%;=!C@yCzu%~%~5==Uv*TO0SG)@{an^LB{Ts59Lznk diff --git a/src/main/resources/assets/tinker/textures/items/shuriken/bedrockium_uie_shuriken.png b/src/main/resources/assets/tinker/textures/items/shuriken/bedrockium_uie_shuriken.png index d83d26c322c4f51d00a9f3f5ff1ef4176230b6b8..be8d160cc1f7668d168506913ded701178a30ee3 100644 GIT binary patch delta 130 zcmV-|0Db@40iOYoBztB_L_t(I%VS`m1`rn)|F5B;0mft*z{tq>-_Xzyj6rOY4FK63 z5)$&?)6)}-L56@_MY18<+S>os)YQP3mzNieNe&A~N5}tia&n|=1_3E4DX`N)nj<12 k$O}}M&1AV?6pUB^04KjG@@Gy->i_@%07*qoM6N<$f(T7G9RL6T delta 191 zcmV;w06_nr0owtPB!8kwL_t(|0qsyR3d1lAJU3H@44D$hm?3#e!2dV?fx#F&crkcz zIYB*isYA!sAjvvT$4U71DGDshQs;T*7uH(Ar0GZxa=iB#$5BElRf+Y62pq?Oec!RJ zE3WGTMd+$Wq}e^svkt?6Qi{wu=cJ~T8b^S)Bo2si_YeZMZ8$^DnGik=lhg#*(19@q tF-B;uL080Y#WYQF#8ueDB0 ztLVF*2fZV?R+G#*nkmVJitw5WX|IhC3tDOW48#-bgkk50000tFI=qS;9zGsb?bJWxtc1&lw~Xa=S1N*gayV(3u_N$oVH@s{}VTF*75Ul zGXQlpWfRbhVgLw$!oW;b6~t<~`s8Wdq@~OM=S4>n=K`2lrYu_ybao`;gr&;}YQ``C s1VEZWbU}0!Q89sG0I6WqfWcq@06LsX)KnPBT>t<807*qoM6N<$f+bFI5C8xG diff --git a/src/main/resources/assets/tinker/textures/items/shuriken/magical_wood_shuriken.png b/src/main/resources/assets/tinker/textures/items/shuriken/magical_wood_shuriken.png index bac61bdb7ee64a8bc63e7e217245542db8653f26..0ceab423eafee7665b2352e5840264b9b585749b 100644 GIT binary patch delta 86 zcmZ3+@|StTdPYA>PZ!4!i{9jf1#BK)jDGMRPLVFC-T&_YI~ns&JdBx4nQe)iVw^*r q#mrbHzZaEQreQPTWuO692P4DhM>Y+P3maV-fWXt$&t;ucLK6Vr;vm-m delta 127 zcmV-_0D%Af1EvJ9uK{;rNklu(!UH^ zN@6I6k>mm`B{8_*wR^9Kb`4wsxrV^KFn`+xMwlis5niHQz=SSv?cOVf1E=ni6&?%> hNHIc|=20+W0RT3DC`1683+n&?002ovPDHLkV1l-nFrEMa diff --git a/src/main/resources/assets/tinker/textures/items/throwingknife/bedrockium_uie_knife_blade.png b/src/main/resources/assets/tinker/textures/items/throwingknife/bedrockium_uie_knife_blade.png index 495006116a2a3b3260ce7827aeb5521f2ba4f2f2..212349332e70924456dcda4a034c9116801a5910 100644 GIT binary patch delta 147 zcmV;E0Brw*0>AsMFqhr(puSw6Ifg89M0el?)xQyz?J5@ zgZmItJ^zc&eJ(j?^xk0xi3mKU6xn8Qt%be!eY=9SR)i2R#z1TBzMY%qoB}D#_nXvH zN^&zB#2D|}Rb89eIDfS+cYg$*P#lgxYbW`f^abzPgT>x@(WcFvQ{^W1`hAiy+Dd-@}R1NME7 zG)*xK1Lk>tIfhFD2dt_J<2ZtI4y6>5!0EK5t!wk@J4qTzYfebhu`58TvZfCn@(= hq~t#1|N4~)d;qA7Jg8L*^G5&x002ovPDHLkV1lMuV&nh- diff --git a/src/main/resources/assets/tinker/textures/items/throwingknife/bedrockium_uie_knife_handle.png b/src/main/resources/assets/tinker/textures/items/throwingknife/bedrockium_uie_knife_handle.png index 26e2fa674b044c0197497e5d8a200296fe2f0383..e8dc4282e113b12b7ac9007b8ccfbabb46d94315 100644 GIT binary patch delta 92 zcmV-i0Hgn{0eX-mRzXQbK~y-)V_+BsqkvXGMn>kpl9JMYvNflqr2G#G3L@PAeSLkf y%^;d=XM<>xHG`ZB(oB}KLBPPkfIMeY0{{TwmKh$G=JO^10000nrgmH~_9~8`*5mwB`T+3IG5}MNUMnLSTaAQ9p

    94^i~+g&Z2zp$IRaH5OBwtdq}SSHy!bXe%V z-nLzM?z-3a=1Dx=&Nxp_p@G5mT|*=z>j|j^<;9FF1?(I^AtsK1Z~6hXZLOVIX{;W? sK@5y65<(9?zpuHK&cy%&4~{X;@jqxN_(t~u0|QXl)78&qol`;+0HAv{F8}}l delta 202 zcmdnR_?dBnVf|W97srr_Id5-7a~(1eV7(BwiDUa>?(1)NaQ_XQ;Pk@ztjRgc`Hhzz zmd((VY+wHQYnlAL7{B9%5edIyvb|rgv8-7?#ct{?@tV2yvp(Eg`o7@{C>2PpxY-x70^UKoQY1j1UaBnM} z@G`xD0jTENXUPp^GxGM%y_fYpd&Bj&Objq^q?%#EUoF;H&!m?iAx~F7mvv4FO#mDg BT}%J~ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/drum.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/drum.png new file mode 100644 index 0000000000000000000000000000000000000000..9c714b17e121dd0df1ad14f3ca5a1aaf48984293 GIT binary patch literal 672 zcmV;R0$=@!P)m4;%XY_%strLfB$&bCIw(0r6Q3h!g;0UNj zK*?F4sZOxQEYM62s0B;&wORt2$N?S!l?k9Ea8HXo0z3jbH16Me){50t0_($-)kTYC zZFkoTSiLK~`)e*LQoUgHu0(>=^INa6i1Aj>LS*0w3BU3CzZ?WCHYIXii$wt?0K9=c z!-XqH6gDKBQ)OLiH-$kzaMHX01md^698oxws}dmH6eWOu3#1W%qbTKGf_`xVEUeQn zKD2Y``fZi~%SE}bzBB?tq{N6i)frVHfF?)nT$;(7CBRZnxGz3a2uQs~m5$GHQEX7G z7IWot6$DtH*fu}RSX#8K7dop4*!zC~00002@7>U)+a5zTrVHJ^}lLh+7fAo zOChr}IL#PbCg&X3xzp)CzX|uh`YqOcK9iraPSAERiPU4r?D>9)O`7Qw+ex;D99BsN rZuU)w8QdnnWu5R=VOFBZ1RjPN3yWsgAK}{#bQ6Q8tDnm{r-UW|Vd6x5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/gold_spike.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/gold_spike.png index 1fe13b67c841e4e6fc6e0fac34f8ee2c2045500c..f5baeee99018444f7db01a443799b887265bebb6 100644 GIT binary patch delta 144 zcmeywxRY^$VSTZui(^Q|t+&?=`5F{>94^i~{kvM-JXWToTcv5^*S$-WC;VY_I+7VZ zeec{CC9&VX9nsj&`{4@%Ba226`x!0`hieRbXLBnwSUUiP1RNSR)i=H}*6|53)^?aR qfr&%mzyyZ*_0KQc1v9{bIUkqm>u6)=zy_cYCxfS}pUXO@geCwWe>DdH delta 201 zcmdnV_=$0XVf`9U7srr_Id594_AbzhGAtbF559w@TB-uX~p$Px!;=bR;u! z``)=PN@Bl%JEF0l_rn(kMiz}C_A^`>4%Zm=&gNEVuyz0n2{<%ts&9N{tm6}6tnDys r0uzVAfe8%r>z`k?3ub@=bG~K5_O~9tW@-cqaWZ(i`njxgN@xNAeNs0B delta 202 zcmdnV_?dBnVf|W97srr_Id5#wAaS8&iD)x@^tlcS?83{1OQ~@ BTn+#L diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/trash_can_energy.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/trash_can_energy.png index da2524b7601ec3892b9ee23cb8d501aeeab8d269..288ca43858f5d0f00f3f23568c51cc247971df6e 100644 GIT binary patch delta 761 zcmVf`z4yN%Dw7 z>m@({FhhYhn1AbDK48$60HC3+RRD7ZYK8(@1xDsek|5W7s}$-r-0Pd zczT{sh}W>LH9eIU@aq0nJ=St&(L|#O_c8#dYk>#=n%r>Os1iyY)eS7PPS*k>ncqrY z%Ku)XRO!qho~{L~B&a3P13+s(PE22|VNDZZ3N0`KfcMJG13;sp2f*oCpqJzo$dk9D}@>XX|#alq}AeaciOs^ zMhkdiN7bL#8Ae*+bXuTS>b3yb%jHyBzyn}Z9!I#GN()5W;F*z53(N?j2$xf70S|<& zu%F>_YAvwmg-DdkX|%v>1Vp)QAj0J|T5{ls2#9bwjTV@VfGC$|_e~Q4Q7+H! zdl&$Uw0_h r%F4>h%F4>h%F4>h%F4>h%F@{n{}@PNerY4a00000NkvXXu0mjf=ca2= delta 1300 zcmV+v1?&2q2D1u~Fn0D7=A1k)T};cr9&Vq1Y;k#IJg5Fw{el` z;F|jf`DNE#nKIQCzTz5lfeWMv*dYkX1|eCSNNQB&3hA9ZJ3F(I*Q;oYc|dq(JUcV* z_xsN7!K)W9zXCultU?f}I&7H6GXTJRvD9OuFP{Mbokmmlvwzw$Um#>IW z+_2YH38}yR_z7pnN2rBW{CV{cemg%0fW-LKyAL=!K1yj%5eQiIf4{s){Ifq8YZZL{ z><2ym`s!LUfPW8_Mf`pIfUas`IEnR|yf>p3R&gIc;0#Cl*~{=0qc1tB%s>TebruOu z;~DycG5UjXVq$+V);<7a0-Z(^!%4hR@*oC@^dnWref)r0SVg4j=&F`xinQ4u3FC@H z#dLT!AK>y2E@!z3Oh{L?bXyoCjIqrr8Wrw{gll0{|9=GBW{36^yPU=|O(<)ZiEXqi zFDhHi!F;jQ(l-y9M=gbEvZnm)sut#pWg^^8R=C>+9Op&7d9V3m zX&v816i8@**fdKVWD+(!^-yQWM~`Y3jX)a1NsNo^xq!v-NfhX+)<#?Hsup@}rJ45j z<0oLPeSbEsGINolk|{=D+H@_frc_`0rWVMvLO>Q1*prJ1a8hI@I&3DpAY7m`K|!SI zh!hfe04G6mAbCa(xlN`fgt+E$hUlsViiS3UUR&Y%{f#yC+CQ71qr3)g+z?F^M%RK3;S0wSY9{i+`o|_M6IK8(2e3Et39l5-04r47EUz zRJWB>=8JLSa9Ocfq{yC}y|?MWWQ=Qp%kXq>wSd+Db8%M^WL|1;`|{`0#DO`iPU9J_ z-hD`|x9?gY;Ev5s1sont=O&VmR9#08Gn|@{1ZAoPgrF=HbD4q5F-5AL${@uYWS=tB z0)GK}_xWO(ioXIgNr7Pwl1bX{7H8JAI*sPuYk@=*V7Q#%Hef%%s%=YmOH&I79^+|O zOll^){fb#Dq9aw;%!^by=PyMqV9Wh&V0GtbY-;&!J-cHoT`eHsC}3ksr_ppKFT+WU zlX#Z$_R;$6Yzn2U1q7Vxx*Vc_nbd15+<)GUfV&Z3QCl_>CUD=iK!u55LR}l1mn9$@ z=AVH3!USflT$7(1c5r=ji%z4N8t1F@qLI=77dE{)5*s!%MceBzb4}a$cY7~js-P+1 zEY4@yG7REHvOK2@?**K-fGIil`ZlTNwdH-+0u?!&?SM9pyT&2AzUJJM`MBu0gY!@PUf-Ud87AQgk z^4fAKYJnm&fNi-JR>@}hlbWW!_hAq@O?gF|nuA6|7aS8mmuw{`mW^ zLOzu_`1P0buRLI52r@Lld}bSLT7P4keT({5D7g6P8`r1tEOnWYeo5L%%(;GllgpM* z4wLKj2V-4k^PWXX+J%6Lj#M3HU;F{c#)UB=sXVs4A~g9K&aPs876LiQww#vF>aad= z(Vwk-Z)|-dB-ph|dU$wvczAetczAetczAetczAetczEm%{{xjFU9QKbPz{Ix0000< KMNUMnLSTY8jczRf diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/trash_can_fluid.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/trash_can_fluid.png index c2ea066baf01536cce289c89eeb46f341ed6527e..fdfc868d029f697df3d73cf3b82d2cf4c8345320 100644 GIT binary patch delta 773 zcmV+g1N!`i3Y-RzBYyw^b5ch_0Itp)=>Px%)=5M`RCwC$TCq;WFbw1e5DOa%J4oyd z3S(CK8SsnbvowiGEZ?R%*&KHFEgczXQ!ZsX-0PdczT{sh}W>LH9eIU@aq0nJ=St&(L|#O_c8#dYk>#=n%r>Os1iyY z)eS7PPS*k>ncqrY%Ku)XRO!qho~{L~B&a3P13+s(PE22|VNDZZ3N0`KfcMJG13;sp z2f*oCpnsR-ELEt0Y0Xw~rP1K^_@`o$dk9D}@>XX|#al zq}AeaciOs^MhkdiN7bL#8Ae*+bXuTS>b3yb%jHyBzyn}Z9!I#GN()5W;F*z5 z3(N?j2$xf70S|<&u%F>_YAvwmg-DdkX|%v>1b#%hoKg!!BOt=%G+N+@2#9bwjTV@V zfGC$|_e~Q4Q7+H!dl&$Uw0_h%F4>h%F4>h%F4>h%F4>h%F@{n_^!s(04=T(q`_UhF>Eed3eXnIy(pH<&!IyEC)%^?uI#PLk|AeR1K2 zxHo&>5fAzgoe$@O-|6qaKYz2f)3f9BcYba$s~45opI}?4pMSOkU-sV2xQLjs3{c{H zu>F*v)4@@2+13g+}7jWw4b(r+y9uBt@gw~qN@Mo*>3L7lV3-f3N9>PO7Qc$*BJwJQ$@t% zzy91($|%mMYkw=yj{YldGaI`;yY1YWi;f>PySqd=WLfMbAEn!~YWk_Xs_ z(uc1>8wf@j3?frlR)0js#YE3KJf9B;`G=6REQ1mPLJ2a6jPdn}jYKPyu&O4BMq4Iz zacDQOORPsiRl6*zXjfhIs&oS3B;Ibcj#`pwoRhzhG=Iu^+@j3(Ng!i@@0bcLT6El1 zfu8eJZ(R#zU;89Zft&`=rd8qq)Ia30Z@MWQZ`UcuM&<)XQY~M|IzFBPkXV_mq7O8U zOv729&e31;YL$&eVg*x*#M-nvJ3<|yf@4WQ5fjvtXMvCeMK;jMg~R;`p8{9%fZ<2u z01bk;A%BkHCaXkhnM4EqG(rsJ0~oT|*P^6I!Fn#I2$Uy* zghXVqec)KL;j1NH39-c5j8EsBdM>~M2%@(yONV_>4Y69pdYT7_JvSj2NOD{~8%gD4 z%nYLFET$CIldJc(4vcM@3xK$3z`0SL( zPCm|TDa6{%Rr3_^|x%&-w8&4KGQAs0y0yQlX8=KLjWkiy^0 z`;Q|@-`(Q5Syb1Ub}o=R1r#ACSOw|_RJDEKZewx*;yRudOiJ$r#oMQ9JN_Sx$e1@Q z+kcq95xIab_V+>6UB~#;GP^q{nX56m0HLRVk16;sm=+IkXSjOR+tUxIDKs$`AT-ns zIYdI41S#Qa{rGTHFA9os&U4DSKrcsx5E@$8UY4Ze#x|^Px%)Ja4^RCwC$S}{%pF$|=Ih8odQ(@*v?s__*E7f$R8A8?SGd z-@%`IbKKA0>)ogO+#PKS0G!p0+hCBa>rc-w?oh|0V+jCoN`F!J9M*Mq{{G?791H}X zbX&t-?LO?o>zFSAfSqrfaHw09P!Ra^J?9k!{tXKNYmU8^0RZPQH1zZufWm2QInN+4 z*l@1R+ci87=6p~4&fx&SAqIe{z$eX4b42U~0AbEfD;O3qO98-Um~*D*WXIQVe-r=? zZ=QQ#EC&E5jepI02@n9xP@oOwx|a_av?Ty&sB0C#T!EUQfL4K#`I02aHQy?QdJTC1 z^C$(ZJ+{U&05}Si63l-sg&YB+WzcGzye7)J?{EOv>CrN%^oTY>+7wwW^72m5YJ{}+ z=Z45@gcOL;cKCEHzz&YI!5%$EgphZtr)vRqSWk!}qkkucyzuRX`RQ6fGyRAhwgBjb zzDI);TEIFzj{=^a=M&;JtZPkAr3JjYzg3U5oLMx{Xu`b=!0B2b0)QqroHnY2Qb%59T0k8d9f%4%+*T6QcYw|ep(fZTaD3?d0WjO$QH~RMn zTy4u*%(Akwva+(Wva+(Wva+(Wva+(Wva+&t_5-WNwS(B4aQpxO002ovPDHLkV1h_@ BZ|492 delta 1209 zcmV;q1V;Os2FwYNBYy;eNkl5}Hv``B65Iu=MD2O=-p2Yvx z;z{vPFCrEZ)Cv_us8U4JLa()7!nb^RzS-SwC(Y8`50cEj%^NejZ817VKq%M4I0}T(9UC)n2(IA zby-xguDa+|=>*2fyj^G=v!u{?PyRyFXzO;1HtDlKE`I=Tn~F_ZwB1#K?(;NnoeOP` zK9gNQFW`HsZK5bgIPapcy`80<8o2roKlzBR5UD4Q=0hv^lk4-Bw{eFlCEI)qet>pAxz~+Tcdb>+WHWn4|$ zOLrSn3lL|Cv=ov?dleRoE4FRU--uek%l$p5x$79uEX(fKxLSbFUBF`k|HYCQXld)FaiS5m zzF)nr5!o)}*mW3Wl1h diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/wood_spike.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/wood_spike.png index ab6a2fb223621103bf3c64047546d8de3173110a..1702f55604104010dc4e3bda96e282374d57c054 100644 GIT binary patch delta 459 zcmV;+0W|*i1@QxrFn+L2-a`JU~*z(9SW&g-HDxXG?ANKinzm=_5 zP8&`u61jFnzFYC9yQ}T}`Q~rr<2+s-uYa~)!Tk1ySmzx4QskOq|lN9&vUBUp?T3*jro#ka{_sB1q1H2{d zXbU`aDJ**c-3!R3$m$cU4pQDHuj%VW)_SIXzV+@}7i+yszE9sXq`WN=iZfP%k@7X7 zcUa1hwU)JZKAJQ1lD8cHdjsfYu0CGI0J=nJh4uM}VMJSP@KO;F`Frd6)R^0i~eG zE2N~%3#33iLW(><#4Dh*&~iGE4m45M@5;rKL7tw&JR$0u%6PNgW3%0(XF3(7(yD8XC?9y+Hbjd2&54IT2a?j7RHT5W4@p|@>1FX&s>BS0n2?U zmbtozhip*R|!EkeA@~fNOVH{EN7f7k|O)e3SBZ5hp>ywQ0$YIeMn! ztn>C4mCDyeY=BEO-3}uj_lNw1sB6UXQW`0Pa2SG;8ZT$AXQlE|8VLb%Ral!M9Z$qu4@1Q002ovPDHLk FV1m;EYM=lB diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/pacifists_bench.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/pacifists_bench.png index a681dade59e0c0b51807e00d2af779b044c715cc..43f90478cb42dfd4c3eca32c3d95cc135a06ba6d 100644 GIT binary patch delta 130 zcmV-|0Db?{0jvR#F?(i7L_t(IjbrdP(f>~gX22zJ^^PnGCfWdWjf4zhAVo7aLm04W zW@TXpV_bY>Lof`0DaK|1vKWd1*lZ_c0L%~!14zNtHvpGY@r484K*WX##sWS=@J1uH ku)yUV+9hSGWF}HE0A@-OgH2M1ssI2007*qoM6N<$f~~zUZ~y=R delta 170 zcmV;b09F620n-7HF@KFoL_t(IjbrpT(f`jt0bs!;(YE3p3co5s2&+0qbQhp&LOqXU>8j99pELkdGNHZc?zPy$d~ zfb2(fTXD(3(*ev+_yQ4GGb}w|cmbb(vB{yNMD*BzxdvS$awBS_I4NTofXg7FGZU!* Y0N36{8{ihXWdHyG07*qoM6N<$f=~iMdH?_b diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/pure_love.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/pure_love.png index 37856789cec82faea92b79aa33938b8d96dad8e0..b831d68acf67b73480e840e9652c9a859207c7c7 100644 GIT binary patch delta 759 zcmVAL_t&-83n=5iUoOd^SbAXw-h@KTpLb+B87(XmTMPti39!i)DPJ46(9 zvWr?eCJ3AEj=MVR&g{;Q?|a{#C)~PnK2>E)US#rajgXA@cFcB$ay5ThC=^GUVm(vK zYpO|94MvJtE`)tWHr(?4M?KxtwVIYKsQc434`k{gS4p1LR*E{BY6??_jf`FRcA&7- zF-&7aV@Gsd?)_xou~{g+++VYop7^Q4p*&^2JN1K0 zyQ?~R)9(j!mwFqjRQZ2w`=~dYg&=pK_nQy;?;3clw$@e@t-4Hb_te1U(Q%8PyeDrT z_Re3|ge$*_qPLngNs>h0jM_f#{pkGdw-t+Z8NoScWO4ve5=CbknX`==f=nS-lPOHh z#E=BJB1{?BRw}{4)nBA~CJuHS3Yj36L`jkHaZurK+6E7GGGAp;UU~&P%>t*|SyVW+_KN zGD~dElTW(?uiSrGvtiSgZHp&YWLYcsC_FJv2e#AD>vvB3V)=oa)46%dO%pdJrHkE7 zC;Lwu8C%xT(hypOELNpxE=dl;L=vs{&$_g_ZDXGNHxIr#vgu_1s7`3wvoEG(&pt6K z%7=5$c*@j$J89^Ke|19JYyB5p?ENj_M1NIVQ#W)Rq?v0{REXwVQ&~A$Fjr}ZmX)xi ztp%DEtoL7aw*S1bvEx?#5wB~gE0sDHmE)#x@9KwXZ&=9=QLNO+NTbsH{zR%uRW`Bk pT$@HgNW!=<-P}=(O08o{{s+DNRURjCS}Onm002ovPDHLkV1mOZZzli% delta 764 zcmVRUuB1Kq?WULLea_MdBam0t-wGWhM{-MjZ=X!|YS{C#rw#$~O16YC7N6M-n%WJEC6(kZU6h@9Ze_<-*}?$gl@JzZvj8h^6Q0}M5>R4C8W#uJEX5aGyKWJ<=B zZ&MsgF=Ndbld(dF>;0cdc|;+eSCUmGdd$!LZLC=8)c7FTu!&QRj1e2Hnj*u?-I&zrk1^L2N^ zfwvTD0RfakVNfccc2Zv5U1g5}2MlSgbuoXYX*rZ*GMzEhF>mZ%;EUx4+{sHywd4x7 z=bmew0c**#OvzX#rb!)XI!vfMff7ZT$s8rHnQXAt8?sj_|CPd5D+AV&)5OwX!U;i@ z2`3N&&Oa=9j%Uc(XQX3p^DnWqc|CcFYyH1b;9Sz9O@ofa%(TE0a0JSO9OI`8lvH4} zrAb$oXww9s!2+AfYiuOv$;dcMk3YgK>eTRfVp{mDf!x3Okxs@H<`lSY1O{~KDfj1S u<*Ce^g%{dTcOZ&nj(jk}O+C#sOZ*SL{Z$@Ll*j_3?&Rq|swK zo#J>r;&eLU`v;gzCRi?)Xti3fZ5y-MjMux}4nYubO~2ny0jt#t@1G7XmkWPG_WQl; z8HR!Re9orx`7ALE!xTVNGRASt1+`iY<#HLCrm;$;5=_(NT#_UV*lac_fD-h2&1Mt2 zu8Z+eg+c+271*a&0!{H!_Znw)l(qt4M3x3xEE$DWUI-Sm+ zFP;Ubwgo`V#~_}Bmd000O{MNUMnLSTaE CHNZ0f delta 599 zcmV-d0;v6=CDSIb;}8!9VoOIv0RI600RN!9r<0T55GsEHAxT6*R5;6}lRs+{0T{-A zcjn3!OmasuBv{&S&=d7h`iV4%~} zQ=Ofi$@hPK4F&@RL7;ZKtx8pDwOT5d9GL)?Wl?zi1=BQn`+Pz=oyIT>wqM@E_k9e* z;MKc4%gf8W`LIgu#gu$Lzevz-w-rT^Mx&7`Rq5#HNcDPMfB+pF9O(G?Se2?Y9*;Gd zOf(!0RW3QATyj*YN+64OY}@AP>kOMQ;G$l{G)>a!G+`JfJ+Afj-{IcJ`#jqO6CjEr`u#rR@fgdpFijKJ zbrV1gHw+``)9G}vLN1qMHk%QKA)QW#*=$BGmrDTsejm%SSXx?2;Q2?N+2lup2Txkq zwoNvhMG_ku8?3CXB!GBor_WXf+%SAiAxJdBz{VG8aFrUv^TU-0-*?PSmk}yq^ lVzG!M=JR>7g7Lra{2f|SP@ne~x@G_X002ovPDHLkV1lmGDz^Xt diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock.png deleted file mode 100644 index a9727705f69ad2eb4a172b703f6b726fe841a4f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv=}#LT=BJwMkF1yemk zJqzi~S1W*OwxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHO@Lq;aB>!N_{ z%yt&AcovWi0*fazFuVXNg3)M}G61C}ursg#RT>x>8!#?_m$Nv;eZ8x(p2rK(f2!Eu4S$=yd{_dpunnLoEE0O$-cvoOfVkkQNXSV0b!-%`E4} zfdee5lX(MpR^(?iY?6@Rld))MN@R%Stsbp`ncVu`{viby<20vrO0uz}A5mTp| zCm5bFu`S@9z<5;8!I0sJ`3CLPx$R7pfZR5*=&lR=7uPz;89gC3xVm4v-~62dam}4&p3`@o@dkl2{FSk zh&BKY9*>7Ouh*+c6h+~5I+^bKUi`$|?{@(a0O;WK$;i+5S7@5XG(Hc4P=)}&Kod3S zcfU6c01W*F?$h1`NoB5Wv$o-E5EuVE$7 zEDi~3+cxBRF81?q2w9dHI6%a17=Q+<(gYw)Q%ME{CL}8Z0JziuK=TX$fp%Gz0)*}R zz-8oE3ED($7|rufrwzW{Zf0*@;q@66$Ui0iuIub24B*oskw8hR-wl%Vpss5fOUCol zC?o3kqbv*n@C%|#LzBFIw@g-ot|(x-rmt)3*Be{)ADob1;}+H7uK)l507*qoM6N<$ Eg8O){hX4Qo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock_inactive.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..64683cd595c936ccd3cf6b3e134935b623e41a87 GIT binary patch literal 419 zcmV;U0bKrxP)Px$T}ebiR5(w4lfP<&KoG|75d!IwhsX=077j#H_>Th{!6&c~QXL`)DX!Aa&c@!_ zXWQgAVTLu_r5L~2apv1^XLn9v7&@#hOF`eSs>-ElDr*d1|EquEGtaYI*VXVpBWIc> zK_lSDIF1s$Uaw;3^VvmFWH=0i#L2ncZbBji$RX$#V;}Etu4x)WVm=ARF@yjGTBu2% zPcMRBKL`N|{SBxQ0%R=9VugOz@|n3n<~)eA^UQ< z2ob*D2R5U|j-XA{hS5C#>a@Xq-LRL`VivMZD`eS@Yir9z7%qIFh2qK+TsP z)O9V-lIQv8DPtPcZa_ziNWT-{D6P3Zst N002ovPDHLkV1n1QxGn$y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_side.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_side.png index 8fdb9046c05841204abad402291ac050da81879a..b33408e57e71a03d09e038ee0b003339eeaa0f65 100644 GIT binary patch delta 409 zcmV;K0cQT32bc%2v;mXG0Zfy#0TO=!a7jc#R2Ufr!Lh2GRTKu$_3d+J2*fmsosCVp z^y$+1%r*g^K?vdl1i?lK$aU`gXK&ZaFCX6z000000001N`0&#k-`$T95&@iUuiap! z+*c%J@a<)M`TDTo=N~TLzrBp;;p)~srWvC$RwHzZU_q`+mFOOHdVx^4u>z~W#KbH-H#3YU}RaOE3?zb&~)8jdfr2qh+hFv8I z`1ijj004juDrzqggOvb)H}`*~k+4!$s2s52R^^sK490kz%Su^QdfE&UC&%e=y0L7y zSGiTA3{H<^!1KDyv=VzSl~UnW4K|!46v;hwWVoOIv0RI600RN!9r<0Sh0Z)GcbV)=(R5;6}lf8-+Q4oZ` z>T_mTP!q+>#AGvbGc%vrMDQ7eMSOroFcB8yI(JTY8O(V1>Rt@AlXIYp>Z<V#q`f=H8JuP0n%I!qH~20V9dkCL(CkZ{S3PL;-6h&^Cg19}_qS z$JxLBsG0lQ9w7gH3U98>^Cv5kn4*ywDVTdZ`9Ca2dWfdLh%es;??3Mr5FlZR#Q1{$ zdFp55HLD9~mo0>$N1UpE|FQnv0wJO|gfKj)el>qLY70*B$#;?ts0r&~}m#p4* T#rzHA00000NkvXXu0mjfDlf+m diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_top.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_top.png index aa78499b9add0cff4b42a9e215b150fcb8ccb0cc..c4ccf4a9010773ab2792e9dcb7161a41ef16e184 100644 GIT binary patch delta 444 zcmV;t0Ym=J2fGKbv;mXG0Zfy#0TO=!lSxEDR2Ufr!9i|hMGytRcv;om2npDMW)H{U z3f!J6pkZf?G#2*%l}W_@>(4(1000000000seEI2~pMQ*1<+&HaFvgj2oz~c)aE7;c zzJ5zK{Qg_z*I!Di>?#8@PV;%%=~m%ci;BDX_pN>X#)e9)ieUPfZf8csv*>>?6Twc| ziyasn-tXi69!We`S!=oP+Zd&^I5T$IN;wlB-G~jZRbG2ZN)l&UCr-CadsKNoiZCL0 ztisqJqY{I2j!L}NcB)0hxX*F05)o~{hL6wVN%9>Fbu%S>hV1~)K2ElN5n;EN$YST;)V#A~2Q87~*ryIjy#?Gj)ilm&3 z7_i|Mmq=(_Mt56P)>>xT48&eVP%t*UeZTCABwmk)SpK`lnWHjR#Y!v`Qtdj&+xJ1) m@b^DY01O6&0sufG2>2hoQsm@AkoC&|0000ISp~ z&cmGNKr)i3G%ZoxD9vVb+I+QUk!-`S1SnV{KviLh^O%$yAw)Q;C}3z+dO5WOo}P=R zXO@XFn@y(?U_mD|VMZ^Fl$$j+u&1CJjY+dM(FuRg$AN9eoQx}eBc>bZC2*SN%{H#l z5KmQf!jL%4jVA2f6v2oiV!t&pXoUw6!LT?>NFssmW(cG;;z+P=JTTy_LIP3PbJYwS z-6Uby;3f^}yb^2{n?+(8sBW%VhJ>kL!SJFe1>J7pKG+lCnY-b1CZ!mt<;2IOY1;_?u{OW?=P)6ECX_4;p{e@?#`4)6!CBIMy- SEUobX00006TfDrQIY3@!}Mj}oB6)aeBU%SP@2YnBE~<1D~mXI zzWVjr7vPVD)fyJpb|fr+1Xjw2>A1+2=HQP`z)eR;(w<=^B!7oRz7d4uWkkh!DOQdH zr4+nO4qh}WVe@_v!bn=MM*^LI1yqoR@={Q~k0hFPdxYIa8;y1crt1oUTtcfx;AFCL803q%Kda%A1g=_}s5Z{A)i^|T zzazdFi6mW;(0>UG!w_s%_p${s?y+0P+U|`|F*+MqTwWIwH3Ht0{>UH|rV$oOcs-a! zdE>TcV3d>F{jq7u(>>t+$ZhG7Md zJjguA^X4byj9)_|7`E(QAtio_ylh7(?>)g(POmkh<4ZP{D)pZykq1dAY#UaPlfGGu z1$uK5_GjhCNtC4Q7>0(;egWf$g{iM|7NGVtg1`Ks`U3xn4{bwy-&crQJpcdz07*qo IM6N<$f;Z^jhX4Qo delta 174 zcmV;f08#(=1J(hMFn<7$NklJZa zy0F>Kz`(%3bnET|jO2-K2sX_yeT>WI%|giw$lwWc3Px$Wl2OqR5*>LQ@c*XKoCp=vE$fxmzSN`P7n|h35k#b2}Fk|prJt&NJxAGAHp{; zJ7atZT^dNS-rIZ3&d#no2dlO0V;y`BZ?^LG`SEA(0T68No@IOgLd(Vz$wp&|(~NO( zd@h4&DXH#7NuPTF`NaU2%H;(gTj#`DE4NSY+=m(L=Y>QHY9@Ke0GDh&6+0Z!Qh0q} zjA_=&Ahv@BteAxiEGWC7#7RQxQ9q>z2+PR~*G!^5VBlsI4_h5tGnzeCFlqx00IWI$ z45BFVw8x7zsk-u1h6)T;h#}ze`jKD(gH~+_EqJH_>MQ3>jS7Oe zI@>5ptPYb1;u20k4~CcyAd$xeX9%r52C&uCPP+JmT~p) zx_c5aNMxbC&+@uyUmWwS(WCIQvU3u7sai<4m-q)@P_Hh3&Hy{D4^00HAkL_t(IPlb~?i(*j_ zh5ZLTf5TAcU-US!kwO21$ps?~1%(a-6HPRd7C}ToL2+MkZFk!Zca6lr;0&k0_gY5A z;5;7p-umiR)w!DAKY!qve(7KEs(XRq!JdYn>2!+o`7A1z%c#|A7z}>~==FLi6bgt& zqX-6rm`o-}r_;!0v#3_9Dqu7kp;#u_Z#J7~wOaW4`ceVM<58}g%jJ+tr4WzD;rIJtGMSWM ziZ{AkE?6#?_azL6LyUjNV|Y9sXti4CbUNtudI|dT4RAOdu-olq?ep_f1#q$5Zo}bl z+-1D!1_^~i^3NNx9E1K_6WJ8E+x-x5gHTSVQ^ck#fc<`tQmF*H-ToBd^?KoQx#08p zQ~*2665ik6|62m5#s63=hCm>o0vJs5kZd#>MFxZ6pC)n&*Xw^(*4R*`iTQk9X3H|@ zgG3@BHCil|yPIscTWR=gHp6PQQURyaNsQ6&_vH|EbD`C0RRHt~GxIDht^k;w)Wu?f zZnrDG;G8*`a5xN`%_acu6U?{3vK0XR%~5tb9pzE2*J}wNgszK3B9e#+D4tgU&%|!? dNk7{A3(){>l5P)fZv6lN002ovPDHLkV1juB1?T_( delta 647 zcmV;20(kwnB&H>>1`rPhVoOIv0RI600RN!9r<0Qd5GsEHQAtEWR5;6xlTAw-Q51%s zd!2DUa$zEvMNp84B8m_)`3K#bU2*BEbXy8tmV%gqxKZfd{(>yTt=(lMSSm_T#6?ge zQ74x%B96mM7n+2&f<4>!o`?6G^Iow~&ZfLlNt%+TAf-V3r5OOQc7&w=F7V`Pk=a%IXpZ>N{N(`BuNOv5W_HNwOZ`% z?ozE*+27x1dU~2DiiqQQ;NbG|k~B?m9EYo`D{R|FDaGmODO+1xY;JA>(CKs#LLh`d zDFuK8n4O&^m&*}F5su>!$1%sp$JA=IeltKen`M7$YKoDO5rQBXI0%9O(=<6cI%0Ko z72CEELa?{D#|L2j88ALRPPf}-ZETG9jm7}rc^>U{8?7~sXQ5Z?(1+CPb$(PTEbQ#i zZnvK<0}zHGuIrM?WL`XD5Avf@p|G*R!NCEJ;|zA-c^=o-*MwpCS|rG3vsjkJ$;rt8 z&}x6Ra9tP6vR-WJjqtW!=jYNAlarJEw+4Wek|>HW41>kRMF8&Z?%3Ym{$q(sDb^kz z`DB`WzPaK1*Jr@(?JY_v%H=YJLIKk>QA*+aKFiC?eJA;R9<4PWn@yr98jLVAGlNnJ z&+{miO3csCV_6oy@3XS9(g$=poqkfA&E{(W(95^$x&%Q$7={cF4^u1_DV0i8t5pCp znG9!VXIxxd^pj`+-7XIg4@^u<&>Jg`W9H`O$mjF;zK_-#%d)U63)3_K5dZU? h(-cxtq!9mTzX8}<>V~ag6d?cr002ovPDHLkV1lKqHfI0; diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate.png deleted file mode 100644 index c7d6c477083277fdf501d3053d0b269711148d85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|R(QHNhFJ6_ zn`|rjqp!F2#DX;|&N^^el%;St@7SWmyg1zBQhmu;yST~-)7+b8oUQfW|An$0yL0K@ z{~IQYwU4QuYw;J{fRhK~wg#13 z3`u)h1-Xwf^h6vGJ^sVw@Rx)mOm@y2T+O|79vHKPMbVz^s{joF@G< jHZYhlb*`j@gam`BLXf$GKJQJSn;AS^{an^LB{Ts5NNHJT diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_bottom.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..9af50008709b95f9c06116690ac97871eb445f39 GIT binary patch literal 335 zcmV-V0kHmwP);SdNsM?i50 z6u~373~I@1@-=VUMNGCco%gjfvyJcf)jc1Vu4$TNqv@=&p|~{C#^-(Q?zdwKP9}>U zXf|GEQ%qmwXipkx1EMxaUd=ZdqBT}R1}RsI?ML+jE8jVNVB; zt9Vc=C%bUJza+yK7|34$r%4zQ$sFRPRe&M!5ClyR;LU8?Lj_RGC({FXlZGHJE*qK0 zNDq7h5+e2j50 hhUil%V-Dgu{{V{Jj@A~~+)e-h002ovPDHLkV1g~{gRKAn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_east.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_east.png new file mode 100644 index 0000000000000000000000000000000000000000..a79c6da784fd23decf07485546ab370c858d82c5 GIT binary patch literal 337 zcmV-X0j~auP)-*R6e6&MZmO-;cJyC959(nEa?uOg-6c(#$ zH3HT1brkE$(LZ_QHHi8_@@Bb<5XDka6hR)M*a#%d`|U9Zh++T~p~T5c4ptVv-4xq^qybOVXo^st;MSSTO~U*(AxJi&iC6n9cr45 z1GUR-+Upl*;DZKQ(_5;lO5ff3kRb%prV#v_9wOklKc%HME&v!&0z@N(m+tDI3T7mX z(D+t3c&m!d%tfL5B0%#2@i;!RNTXry96-ecFaj0x*$xnsNwGq-A`TF5#=h@|Vg&Rv z=@xr{70_qIQfeM7Hjq|AZv;5@Mh296K>-TYCd!Qj653OpS~_jzI5T;eA|#eg#cr55 h&RUI_gA$D6`~&VwY^Gvtpwj>V002ovPDHLkV1g9lhSC54 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_south.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_south.png new file mode 100644 index 0000000000000000000000000000000000000000..b27220bb86e1a6d280c8c52acce995534093b562 GIT binary patch literal 338 zcmV-Y0j>UtP)}5fk$&8;Sq@Q_XHG< z2cQTZ!Dmh#%#vxQr3A#JX}dF>-R@f7--hd@9m=wFj3)I5a_8WHYma+3oQ^v`tg2ZM z0_yQRfP0F81FlgKWCkb}(^UY^ilPXs(V`MG2>0vd)}aDs_683K4bqpeQbgn3LC!kV zo2HEf_M1cG#N#Lc>$qe}!Qu<*i~_7(B%t-sJkwOji3GlpvG2Nb$Qf~3XwzoV{PcAt zr-d~AK3<}DS_3Vb3iw0Xb+q=YfZFyhz%B&Tvi?7S2N(xV5XiN1+E_WV3#7xOgG1;K kksOAJMu;tpET3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_top.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_top.png new file mode 100644 index 0000000000000000000000000000000000000000..9af50008709b95f9c06116690ac97871eb445f39 GIT binary patch literal 335 zcmV-V0kHmwP);SdNsM?i50 z6u~373~I@1@-=VUMNGCco%gjfvyJcf)jc1Vu4$TNqv@=&p|~{C#^-(Q?zdwKP9}>U zXf|GEQ%qmwXipkx1EMxaUd=ZdqBT}R1}RsI?ML+jE8jVNVB; zt9Vc=C%bUJza+yK7|34$r%4zQ$sFRPRe&M!5ClyR;LU8?Lj_RGC({FXlZGHJE*qK0 zNDq7h5+e2j50 hhUil%V-Dgu{{V{Jj@A~~+)e-h002ovPDHLkV1g~{gRKAn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_west.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_west.png new file mode 100644 index 0000000000000000000000000000000000000000..ed67fa04bc5fe2744edefcd4e389fb43f5a10705 GIT binary patch literal 338 zcmV-Y0j>UtP)_N2i7X^rJ;S|4uumAu607*qoM6N<$f+9wb%m4rY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/trading_post_bottom.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/trading_post_bottom.png index db2e6e2e130f0c43ace69afb3f47ad19b605a817..4841228acfe89b0d5bb83129f9eb184e0ff942bb 100644 GIT binary patch delta 366 zcmey&(#bqQrJk`k$lZzY=1HA;1_lO}bVpxD28NCO+YCXYAmIsbo zrvEg!J!Q7jqSc1%>3Ur34uz&#>dt%&3r-ZI>228(DK68wE^XSu>OYOA4Q6%gr1HhA z{r_yC&!SE1|DLZ;vMk8`b=1A!L75}tiracSzFrMIr@dyM{w*D|i>-Yt_X2&!;OXk; Jvd$@?2>{-2hok@i delta 602 zcmV-g0;TusB!3BTNLh0L01FZT01FZU(%pXi0006dNklrr&s_U8*0`Bgne1AP9-}m^!A;-b8Nh!ra zAMzgrx4houtSn0|n9_Q^CWXpcf2AZzs3;0@U01$A(C11uh2iju=81!ds~QAh7zzpn z*f8Jk(|kUo;V`6LuP0Suv)O?1JeSI-itoe2z1*Qqg-bZsbtb`p*YEc!id=C*H6(-| zzA&_@bx-^h2!F!?3=ZS5M~A~39gn^wzFaO{qRC{!L=UBn)|7!6&|pAPwS~S~twa^m zqD!02hJ7N5i=ruWghUS6lZh_~u$IfEIB2aU@N_!y%H<4+)AYtK=s$xKSCfJF)*?mkrIlHjWB1@m->1ZotFS?>hp?&r_V9SL9v0r2haY-}8p3jEbPp zGx8e|U6M4*i^s*} zLnVp=l~MwsD6tbeCUNZE-4hlkJv~3ayYIgH?w(e7XT~`r4}Z3}qRGxys+MJ+3k=!2 z-c51`FT&KB$XS~!y^n3XgwF0~1(J(_VhZU@CJC5@q56Il*yuHJdio2gFjUA(U*9Uk z39%r@8D-$W$H5PXuZABIa7{P%;zFT-R4Rr0`+I1bhH&pIvhz9RL~Iz4ZSBh&%w{vh zF|i~YjYbfj3x5mq$Y!%}-687rC78Fn_=Zmj2-o}kbRSVBf^FLfiCGYgaeh7m!7Jec%DaR9Z?j?eWJng za-A*=G#U*YA0Ol3-~fk*hvLL*Yimn_rc>2>7CQ(6oSpqvB6^-r8K$_nXiKJ6>nAca z2b`T1cU^}7VsyJ*Y-~IwtsDZIDhppcBt`*qQb$4o*~u(_00004XF*Lt006O%3;baP0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmwks%j<00(qQO+^Rk3<4G^0t=|O zrT_o{24YJ`L;x@VFaR)G(ALEO00E^*L_t(IPi<38O9D|8oppiz1E8z!tS>)qlHrZrth3=;HXs%Q@$s_uhTlR3$*bbjzUG zy$H=5M;XR{<+2A-XU?HXqSNp*S1@V58l{DU_(ZXOk^RG2hB*Kv3b41 zP>sL=mz#}}Xow`8gQYkH_7h|_(-djiq_>h3XpTBoEQ*yg6e*?{;6ekfrtUdVi%~9@ zquyhlKKd29Z*S4lgG1epL+!gwT3ugb1Edn2rp69`)e|iK`P`+Os|^~ymU)%`{pSKF zk*%?Tx?iK7}z1KV|OumN=j{$U=dRS&FMT2h1?I>bNf;CaijvKfM8cKq<{{)>| zhfQIiCICDJW+P4gmm){?$CuS8EP4~jAxZ)q;w15)SK>od4cuD*P_Sw?UloWF8NfGc zxMHhgZ2PY9$aDwEc2Z>R*c5au(hH-3DkUkr9cP5{F|MhD#0KgphfdNHM_KkOoxz2M zC(-|y^z$Xgr1yY2IN(C#8pv}7{Lfj$QkN$UK=%vPp5%7i>fA2?0000Ix> zAqoM#{zlYB>n M07*qoM6N<$f|`vo{{R30 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_energy.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_energy.png index 27e252f1533db44f02397055c862273e63100aea..2f04b208d9ca4cb6a3310047137a7ddab025bc3f 100644 GIT binary patch delta 47 zcmX@bbeM61A*1U=BTv4zbvxY{7#MUsT^vIs!Y2zbY6*N)pZF9g#Ng@b=d#Wzp$Pz0 C1P%ZI delta 182 zcmX@ic#3I)A>)LJMxOO2`-|iag*B2?4V mL&%4Ev`OYW}z>do2c2@W-@z$?V4R) zdruT-3F-UGIalabEVY|*D1PO&DHlWa6e`^GW@TBQn4NcNeb0k~>k1z4EN5U~FenM~ t3ugFF91w#kJ9U13EKswKr;B5V#MFtMS^}@KV(Nh+44$rjF6*2UngFwpV@Lo1 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_fluid.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_fluid.png index e7bd60ed26af99d23c6807525ad7ddd927bb4960..55fbe64a7141b619bfc7b1e78c9d7e2322d8ae2b 100644 GIT binary patch delta 75 zcmeBUZegAv!O6(Xz`&qto2#@@QJ2w7(bL5-ghMttB_UzW`t%ZuBNFz~Ee$c^eFPTrT=FNHodbNpbc+xWxT9Lu1MLOZoF-?yp$2 z=GtA!(5bI2rh73lAb|wy3wM7OJ)Zve!Mx&?-IU5WFS|64trR{PJvTi8dcA`P)oWeoQq*UD)sfqvP zA6W1BG;?=3>uJl=clOS|EyvWiI}%WV&R`0v!mc)J)0JTn$`?Pv!p8uhZHTP+!iOgSg>%cmhg3NIn2SJ Xwvw6cf6bO~1|aZs^>bP0l+XkK{C*Xv diff --git a/src/main/resources/assets/utilitiesinexcess/textures/gui/vanilla_search.png b/src/main/resources/assets/utilitiesinexcess/textures/gui/vanilla_search.png index 774e84bb025ea4bf4e1ef2c04518944eb107b1e1..20f18e2c753da8352184b83ed05300ff5192736a 100644 GIT binary patch delta 67 zcmeBXESq3ytKsS57-G?z%)!h1*I)D9yLbQ2Gb9HzIVN0L5ZLU-D`nad)SSTM#mJBl Wn6*OV;jE(!K;Y@>=d#Wzp$Pz6m>8M> delta 88 zcmXTxW}ILdWb5hT7-Hd{%)`t3_q>Cmfw6IN0^>}^qyQ!_FE5E18iov!?^igsI2W1p rxE<~&;1CEi{BcRpxxD;)eHH`5B_VIQg&U8DFaUw4tDnm{r-UW|{jwda diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/anti_particulate_shovel.png b/src/main/resources/assets/utilitiesinexcess/textures/items/anti_particulate_shovel.png index 55651ffee807420b7bb401c99e01ca01c527688e..fa89721d87665b055cc75c97affffdefbd3b0008 100644 GIT binary patch delta 305 zcmbQwc!p_$NG(&67Iy3=9k`>5jgR3=A9lx&I`x0{IHb9znhg3{`3j3=J&| z48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!CBxDSDRGs}D)Rygu_bxCyD+#j`D{xoy4f1pttDH{G78)OhW&kE-m@r&AsZ6 zdgSH_3(nNrnx=0^n^E3TZWb_k->ld56SzJ4j3%h%s#@mV_JnsOUW^Q$?J3$bZ9@Hlj$`n2^>bP0l+XkKDKcjv delta 130 zcmV-|0Db?=0-phpBztB_L_t(|USnVwQefGi+y7x0U5+3CX_|Cr7Z@A0q>yF^Ompn| zUa)2mn`i^jHG^o93;+R@`S&Q(ymSBW{~9qzDANq$ldQRA_7k{fk^s8RBmuH*25F$! kX0kQI0LT!E3?K&p02-K?Dwdm{rvLx|07*qoM6N<$f-Mg<{r~^~ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/architects_wand.png b/src/main/resources/assets/utilitiesinexcess/textures/items/architects_wand.png index 57a08208342a5159d7d9c2625776b0cfe4684897..0eed9c5c5c6c312fc1473f3db5be4f0729c51105 100644 GIT binary patch delta 346 zcmV-g0j2(s0{Q}wDSrXk$t-^W000DMK}|sb0I`n?{9y$E001CkNK#Dz0D2|>0Dy!5 z0Qvv`0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2kHR}6gdU-t4?eH000JJOGiWin*g=|w!B0+WdHyGzJEzXK~y-)V_+Zx%-*(* zfouTOycdeu(fE6bHlS?w^vy6$AU2Fol+%HV;f6#vH*7YGh$hYekY;3CVVXfSv9`mV zi>#Sw=OYIgx@I7~g(yRWh2;LrOX>bc4oGO293p6dkf6+eJvHb5;({vw(PDzI(?Oc_ z)m;Az2ulA)^HUBZLCpdJ692W8?EZ@jY5XTS)q!kQmACvaA|y|mW}vMMAWd=-+W$c= sAj@WBO>govg8;~ONns6;(;4Uv0A`b^!kIWHlK=n!07*qoM6N<$f;#Dg!T|A(=oSX5E;5Hw)f zpWFZ6Jh%_%izp~EM6swcN=QgBy?F8B9}6j(PhY;waCOBhhGl@B)o>KQV2mPr3l-QRcfsXlt8Uj?!_4AkZT}Sun1^L zUwiMnbFN!!WeiUOum}@eh$=u!Am=QFI6noTEhJ-t63&n)5J0|{5ujfXB`s1|83Ak; z0jRtar?zkIUEl&fh8DNdZvPoD+Iy3pKBE8pWG7L%>9)}WUg`h<002ovPDHLkV1n?6 BQG);g delta 331 zcmV-R0kr<_0rCQnFn<9oNkl<9OWNHJ0!hr9`6CVd8wnwt5W>CQ2cMv2UsV+V zUDsi)^<4M~dORKg?Du;g({-I&k_7LdvMd1@hQUL--Hs@VIDef^Y&IM3BoIP4Yb{BV z&@>GI(=>T#eLfzK7-N{{nK+Ia$ML&`^Z86&*FNxiy#kP?sfPd#hXeQf9VsQiPXd5E z&uQD1JkL=|VT?g3MV4h~tpU(lBc)^_IcDs>fnFqAiPr$3f#d4aa02pI@ z#WlFt?)!et2SlN@Hn?0a{ukzXeuAZx^nH&~%0q9h2q9ci6mGlSx+F;)uwK9FDcgD; d*3qT+L_t(I%VS`mHs~}k`Hv41rTL_xF;+~_5PX`E4IyX%4~H8V zGngvF*&s}k0Wi(TG|>j2+YI9qZ2-k#0K!K4reI9A0mvBHFtS`gmH`771{5V_iZc^A Z0023)2dI4`k9Yt8002ovPDHLkV1m`CD`@}# delta 121 zcmV-<0EYje0iywsF>+l=L_t(IjbmV-5HO+(80nk-$EV@k#nUKyP&hEnYncCH)g1Dd z8N(1JbVax{004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009a7bBm000XU000XU0RWnu z7ytkO2XskIMF;8u3lcjrdad+q~pXh&4VTJ!By8vd8s=VcYkRc>{Nr+$O zKg>lWc?SeQHtMN4{}&Zf{EzG%qBM&LDEwEGH~%jpp!gr=HKJVsvRPlv6~)g)8^Fse z0@f_ZFZ~}qa8L<)L4Z%{zqXPc*3gDUF-`+Ong~S|Q1bztn&l+4{|g96lOE3?%|;rY p|3w9*NY@Mk931@rL748D4ghMCfjsZ$R&oFU002ovPDHLkV1hnLeGLEr delta 168 zcmV;Z09XI=0>lB3B!7!ZL_t(|USnVwv|!nv+yBuqx*D7Sqf0000~1L>mIL znN>v|jFDYJlxC2vAdPYJrh;i6BONd%&Jds?kYbodQEO8$M)nHPUVv#P$qUGV2yz8k hfrxAf=`k?!008B9J}H8SRzv^*002ovPDHLkV1f?&FGK(U delta 200 zcmV;(05|`s0r3HlF@LK`L_t(IjqQ=m3W87&g}>_$mkSmxGz1m&v3ijfJ#8eZ6+%=S zX)!I#KoqIgp5DvhKYyq?a~MTxR)$Sd_%6H^V$YV`tn#yn#W004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009a7bBm000XU000XU0RWnu z7ytkO2XskIMF;8u3l$0yg3-jR00006VoOIv0Gj}|0JgkDIe%pU007QOL_t(I%VS_5 z1I*sG?GzO6B};SJ?CG1Mn;SNhYye0DRP#z8eUKyrkTkCX(&tIl40kq=-U#GxCROta zpyq=>dKHL|RiU_u(ti*}(|i@lX8eIBARzHyS;qLkh>+ZWsOCLDO{$b5$Tc8? zh|(+~B>!JdLL06DM1wFvLqN_1DbQ7Q#_D8{94Kt?`k5rB;aXsA&KI N002ovPDHLkV1gvEiP``F delta 173 zcmV;e08;;o1IYo9B!7@eL_t(|USnV&11$S<`#%h$%Mk=1O_T2I`X9T#mvjS=HG^o9 z3>X5MmDBzHgD|of(V9U3q}iw?1#SpQnqdH>*>_?dH2AVZMDgdhNE-nswxe~p+UU=1)A5Htj)5M(n5j?Eh|%{SK@lV<=-Gt2-O#y{$R1_uWgWCLJ|L7H#f zXuxU+K?7i#VFn-@g4GLJT3T%C>gv2?C8D7Z080l7Jzwo)ng9R*07*qoM6N<$f`C3r A2><{9 delta 287 zcmV+)0pR}b0mcH5Fn<96NklSmUsF?A8(a zcjRZWpfWRMM5^)+n2dxP)Wi(MArFVg+B4mI>~roz7yf`GNzRl~qp$d+_oGs36nmkG zz0kDZ`uL-IvUz;|xW1J(HR~)DR_x*ds=(#`6Rb&9;r?>3-+z{FL0+?eE8*c?u+CC3 zu;jMvif54~H(hZZ0$|B<`08zT{~005(qRIn-GPX`uw0#gm&y(JQUmbvbm43tz>d&Z zpcPN$suiCG(^ t97G$=y5;CeSTJ+^nlEv7i)lg&6N7&K8ODv9k{2@ofv2mV%Q~loCIBLhA;|y$ delta 121 zcmZo>T+BGZuqf8k#WBR9H#tFqwa4Jt@5$=_jSUP8Y%2cAtUi<;zV5)y_3!Q^dcrbC$>GY|+b)l)dhkn>Od7DG&<`$lm$MrLM) X=a!0wQ$8Nw$^ZnOu6{1-oD!M8RXczNI5@BjumM1z lrKQEDuCC5YRw5eu005-EX~#-;0xbXl002ovPDHLkV1manE#d$G delta 185 zcmZ3>_=s_WVf`FW7sn8b-sA)YCKD5rf~8BBZgjdSV$gt9q{!<=e_M=~~-Fpt} z%;M_zE8~Bq@fp1P|F>M<;E+kOaC$;QLWA*!nSJ~U(oUPwQfz&eWVx{G@Bo2Qd1$1} zR7sDb*1vbT&-|YFqi0D4bENJWZk2Y%U5qKrYHaN6VoF9=E}moU0jZCQipr_~|1Wj= kufsn(C44nHGhQ$=G@Uej>)dqv1_Kayy85}Sb4q9e04(rH?f?J) diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_1.png b/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_1.png index eacf588206c7a86b67279e96b85620a342ed9f8d..ec31f0d5398de5e3887422d7fe1f7c2e29a6db00 100644 GIT binary patch delta 146 zcmV;D0B!&A0lNW^F@JSQL_t(I%VS_50yH!8RXczNI5@E2GT`QV zaI0b~Ov1_uWgTtSjI*BcXb8BQ16TyOlJ zQPY>83m6#~7#Os)wAlXs{mU-(hw~Fb9q5T@=mP)_G&k6afZpo>00008RZ9~C_T?-7Cv1R& z0}Cz#Zmu`}kIfLG3;=1qb)(@wh$iS-EiElJb#--KvJ%nI2NeKrCwagDI00(_0000< KMNUMnLSTaUJvO2M delta 210 zcmV;@04@K;0s8@vF@Lp5L_t(IjbmUS0yH!aI0a(Gld_{r=GfOczII!T7ly(pzXb4Uh z++1(`pHb77LE1qGuL~F%7#J9|w6xg%{{71?^@sBlAty7SC!(Pb08yYil18ztp#T5? M07*qoM6N<$g5d^MfdBvi diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_3.png b/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_3.png index 6b46595b3776f1041f8dd7d9199eb09c907ff6aa..23707ea9d7562b4a6bb1f3c31111725b56abbc32 100644 GIT binary patch delta 160 zcmV;R0AK%!0?7f8F@J+eL_t(I%VS_50yH!8Rf|nP>8i(`mIZ*qbHlZlB*!P2EmH#*&vu@GGbWLRlQ|0xeK`_Zr0?mdTf zW^wiVmGQsQ_zd3t|68taaL6QCI6WaDp}}~=%szevX{SwTDYiaKvRv48cz{5uJTy{f zs-#Cz>)*TFXMRuo(X*t2Ia2owcZBKt)8Q%^8V3y&QaB=oo12-r%{ps;cKu%}+rlyP zd_(YNpEMh0AZRu@oYq#$!}EWx+P(B6%cf0iY;1J&_U?ZB{{H?qLG>2)f?I@a1$k>3 Y82D-(HfeUdMlt|_r>mdKI;Vst08b8Cp8x;= diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_4.png b/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_4.png index 3b94fdbaeb851fccf405fd2ed7378d03e9fe51ed..93eba59d3fc09ef921dd4d41a34c0b50b56a3b58 100644 GIT binary patch delta 167 zcmV;Y09gNk0?+}FF@K6lL_t(IjbmUS0yH!U0mcyqlm5e7Iou%HXVG~c?>fYlJZ1|VyO8GvpGh8MK7v>@2j)zx{)N<>2+001-- Vm}{kx-*W%}002ovPDHLkV1j~sJu(0Q delta 215 zcmV;|04V>^0e}LKF@L&AL_t(IjbmUS0yH!p~z}sUchNPEM4lL+` zFwKmbz6{b1LU>();R0mMFo4exMg|531}!Zuw!eS>vP=Ep{6x^r=!t0P0|1MrMHi8M R*~b6?002ovPDHLkV1f{LTOj}d diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_5.png b/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_5.png index 90f8c5d7c0ffd96a8585f7e966bc3c322d12dd41..fb5cec7d7f4c9aadf88e1d9d81dcab7a3ef921d3 100644 GIT binary patch delta 178 zcmV;j08Rgl0^0$QF@KdwL_t(I%VS_50yH!=3E7=nx!3t2)YDo7@%v$ zqoywk9~WR`U|?X-($Zr4`}Z%q)E~}II8`D6 dlteW20RVZpOM|H`BIW=9002ovPDHLkV1h1?U)KNt diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/glove.png b/src/main/resources/assets/utilitiesinexcess/textures/items/glove.png index bb0824e5fb21b8fc9be740f22541557a10a062a3..2ed89625a8efba1b781427014758fb7480700837 100644 GIT binary patch delta 193 zcmV;y06zcT0n!1G8Gi-<001BJ|6u?C00DDSM?wIu&K&6g004|hL_t(I%dL|^4uBvG z1hE`Uj6dgz-2DRKq}JG^tOX_5WYYt?Lm}W?e@&<8?!!fIh9!isYr(oVQ)1+vb1noB zGQ(ozo>ICbfEc5O)B$W1fbIZrp8$;s>~KvSt^$4u*B}t4$2#TdAVQ3t%@;VIh7BRj vv5oRLNl&;qPVdgTNFXY_s!PL{H~u3JAE{*Y=@m5B00000NkvXXu0mjf^v6+2 delta 205 zcmV;;05bp50p0Z(PHg5C@Xo)c;9E^FF#MEMn(Hy_o+6x$E_^8B;zSj{=|@w!5h00000NkvXX Hu0mjfUQ$%h diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/glove_bottom.png b/src/main/resources/assets/utilitiesinexcess/textures/items/glove_bottom.png index 2b5a16dcb0b63475029022a96537a4cf2764556b..83169a21125b49367ed1e6dd4de227a50e1c692e 100644 GIT binary patch delta 109 zcmbEak-aXL9cf^{(iXGwYa|K%Q^ z&(F92KRK7<41*U>B70Vi+e*cdLe3i#Zg00Xdh2cUBz~0Gh(! M>FVdQ&MBb@020I}<^TWy delta 101 zcmZo*te7Af&%(gKu=SVuD;He`8@zhq%tN|^xJ`6JlO0DBp^!>a zAS@KNx36Yhh#QxQ?EWdn;nOzTpcE>V;&Q7RFP5R)12UDFnQD2)_0~t`9*~$$k_>Mg z-o_FD-sc5Dzatb}cTn>?6!ZuM-uDGTk5J%!UJz7g>YIoth8au#@j)E)RN8G#H>uD7 O0000cF8$xy)%Dl4SEIvg}yttTM!GjTa7nl9xS9|~p88>%^ SbseYx0000(WNa%>0poK-a8| zl8NY%0&1--WDJl-1+>`!$`W8QLEk)*n5Tf0c?L0NaNpm#c_wWGLt~G&Dq{XEz&W?| b{ExfnRFiF*Ge{O5%~1-=Fm0QpAA>BHNlIYBB~WO}$l zp56bwzxekHOQ`&t;ucLK6TsadOoF diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/golden_bag.png b/src/main/resources/assets/utilitiesinexcess/textures/items/golden_bag.png index 04944aa4a41443caada9f64ba56c1eba338a96ca..b11a5966ad5046cd1a6dd6ec4d43ee4139094354 100644 GIT binary patch delta 141 zcmV;80CNAv1GWK>F@JDLL_t(I%VS^|lwegq!+#LQ#V4rw%XtWfX+-7|Wx&n7>Tpdk z3=$*B75f&VVzRsd(unK|qP+mq48uelfUX&xP0$dKy)37&w3&Rt70XRt82O%L|C5p=^+AG#Ht|;!HrcAtMvmbx}Ze zW;+X5JPXJMfdn81>4(v1mNGCiFic=)U;(NyFfuk^TmUf@q=R(<#H1-eHV7~Q&0zwo z46?KUvY@&Q4GciCKIad3sPUpR z!RgJbzyqu5+W!B~PdL7V=NQ+vb1oTotR}Pc@>s+)o-R`>VXS%ZpI7Nh@@Coj+8nbz z7y@z_!Wzy>2N?2jZ&d5~Z!WPTEI<86myX!0lM07c9Q+^_nKOfd;cr4>rB{BfC&)3L Lu6{1-oD!MeK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD*S%nA4~ckazmZMG z`C5*c;NHm4d!Ov(=f9|*#O&|j@M!;@DevkhC|=lb!)J@)o;^bUzh0U1-@9YgA9pUF zM?4Ic;lB6&>~CneQoo|R<2ui!CF`Gg&6+B-GE qBQDRjneEun-2C63!}x+U1H&x!BF2t3(O95^89ZJ6T-G@yGywq8*LvIl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.0.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.0.png index 91d6d7163838432767798bd89562fa1a80d08bc9..35adc9896a831afe40d69cb24ef848a76b68b909 100644 GIT binary patch delta 249 zcmV3z5hc(GB6AQiGk!mYCvi+3~6nh{vQNhy?OKx*(B08)re5k5Io7i`o9D@=7~2Vn*%hPVJIht~iQ04WA3 z{QuYhW(b%K5(BY`3P`viNSJ8N$c7+ehCvGerUBiK7dtxT00000NkvXXu0mjflm=sr delta 201 zcmV;)05<=X0_6daB!2;OQb$4nuFf3k0001=Nkllz{@-U&)mq zWgx+C?RA<}v|&HUs3oi=mw*~%w;OqXGwH=uTTtY`iJ0_%5KW34TtS1Z-2VtZf&aKH0Lg*W zU>E|^yu{G(e-%4B*bpE_)(F-Nk^`y1Fa*SzuB!U~fVuhqeFg?#g&^lT**kzShz$}0 z$$`{>)S?)W&du|GgNDZcOU}+FMeJ<>chRav(JzwIDqx zegl~f(|q;9rT-vcpr;Sk80a7H-_OqvZU{&%N?5_11Jb-^$@2fNU%v)B9VV|JFaN)$ zqUyhsqvL-80fDG<^fO3I$u*}ljp_!S{51Zsd=1^1I zs2${#9Kv##3~Nq5WQdE&aIqXRxtR+^X*Z*}BsVU;Ja26^o9&WsJ@xi{Ki{Y4eP4m# zU#Mp*4650|8}Q{W{Kk<-OoWdbE%tlhEeD@xLcFf!Vo1^(H-viR5ko9xVgTJ-BLhzL z9#;J#OBA4Uq)!a7aqCsjq`}{M&LFp%hpNtihBg!QZB}S%n^=!LVu($6$G*H{xOLAg z91MTJ>wm)5p$`tH7up&l^N30MpcH-xy@SMY9ILU>WsDDRg41>-56gPA~~0M0DViLq7?l41r}F5F&h}oQ}Evf zF*A99ESV<$3rQsw2S%g=kccZ`v+ct+??Q)V8lC0|oLoP`w&Htb|mghFGLTc0pC@z@O<0nJyEh7&?lF P00000NkvXXu0mjf4=v4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.3.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.3.png new file mode 100644 index 0000000000000000000000000000000000000000..f981cf80a34364c6cb0bfa25aa40fbb934e8ddc6 GIT binary patch literal 430 zcmV;f0a5;mP)F4q3nI+_?@zOaV-O#Nfq(%S!^F|mGJqKW&*uZx z9R2_QYV`kq8$$no=ym$vWW)ErK9cQ!eFW?O4okNG|5v&G|Nm|_SPh8%y2%l22-p>1 zL!g@fPjmS{)m!-gkNYkE&u;MkzkZVO|JgMf|MS(E{{KIdjj0*gi5D`M!J1#)mHn>jssCf#)i4x!yIB73>S+3JVyKPV0Bjy6ZwD7_ErD;C-nc_%0N4-}hX3mll==z^Wxh>YcdjH>l(zE{#3`xxf7uybq zG@CTf;S)ZeoAs;y<4xlYiV9|N%nn=|e@dot02zKUTkGp>cPSd2Rj}N{rXXGP=w0lF uBmuUKotJv@IE>Vyj5lqb_|d@c6GP6vMN^J@b({k_gTd3)&t;ucLK6Uaf=P@3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.0.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.0.png new file mode 100644 index 0000000000000000000000000000000000000000..10f84099c4bee12f883a9c48471b3802aee919d8 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5he4R}c>anMpx`o3 z7sn6_|FaXkxmXl=Tz||RU&q?BtX~%G znEUDRe9`n9O<$&o&1mvh6?m|;el1In|J>qp-|wwuc)uXve4bOj=7OtlvY9XLkGapq pkz^#Wvo(F9yKwo(tVi)j*lW&i@wj8990PPQgQu&X%Q~loCIH|=VDbO} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.1.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.1.png index 00ebd68f4ca64661c42e77fef3b93e23dd341bf2..8433404c1782f152fedb4f16bdd2be9c82dac6bb 100644 GIT binary patch literal 585 zcmV-P0=E5$P)pG`$}00)C{Y-|+a_s5vTFv{dZ8h3Z!Ip?2x1$cQm302)iD)koA(@`eKW-Ihv zN3(guB&AYwlti>vtF^fD>}-q)bloO`2tD^;Sq+vUazr7^td0`M@@v*CfHN}^SJkvV zYQ2Po1qHTUN3rPA|1Iu9kc@N@2xtrvF+U%}&dxEJXOd|yRn`gY;PmtgtE;buUHn0y zBAGO?zwgk%=yYW7$wZryJ`q8JjC0|-9V)Q>ONRBEj8I62Y1ZI49YmuqiKv0Y!w)z= z?~@1H1n%PcdO%%ency!OiejK#Zc!Ho4h|Z8-u3z=(&;=UeMGPKl|$DJZvs^{aB*>q z%}oofR*y8Fpxyq=@BRKa28svl}Dx0q@&e5M_1g=#YNqFtjETlajdMYdnQay`Y|!_V)*YT X)pn_914WoW00000NkvXXu0mjfjSme- literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9F3${@^GvDCf{D0tJ; z#WBRg`)t@j!Da)VZtt>}b+HS44(wlCIzz~y{8>-uL9>VJ_9$3PTI|B)(e^rgp6j&I z53Gl;ltdh9sPhGAQoA1)~SHqU}6f>^(7z5 zbY6dsJ>c?X$E}Aq{|GS3UN$bMkyqMKrQq`5;K&qIHkfukIy#Pf=PIE>W7nmTk7wmAabC|P rtoPw;4(qOod%hh{@I1MHgTe~DWM4fe|UB* diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.2.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.2.png new file mode 100644 index 0000000000000000000000000000000000000000..4b4a9acc9bec911fbe361939b3afd093f351516e GIT binary patch literal 314 zcmV-A0mc4_P)pF>`6pHR7l6QmAwrDF$_jC05v@mP*72^6(g_$9RsihbFjc|5%5V* z`V={bVuwf;xfJg+{w?Ll*&Q#{vohltXn(!e!|l1+`SGf!_p;v8A_f2mly5}CB6zL> z_RX7FSOB;Jxf|4eP0-$l1zNc0by%PW2S^@50$Xr356)Hkvy)oSihC`(yt=Fl&;FYTG zg>*mk#Y`dj>;_ygyh z(q2ZhgfAPmnymK9?Pc89`^0?0eV2>9PqwGe-jo~vE;Z`!);764e#=eyue7o6{q!KI zF#fYcZbbw8O}RaHW1m-kFs!aW^Z5W%)uV%tiswCV$NA_Za8>S zZUrwtPzM4nn8EJ(oIgo!%fEX!o;WUl-@E$zgYVyuos&DV&%ErD`GNWN2bgUh*a$tJ kXwl!o4s;v}nowWM7`$|rYSY2B9~pqa)78&qol`;+0PoV;+5i9m delta 774 zcmV+h1Nr>q1F8m)FnaaSy&PIkrffBojL5Q6sI&}3Q zSzs4gs6zyutcxfA1nH26h@yjm7cnTKgO|>oqR@+oKhRK0Bz1qx>|$$&-5FC=U_;qDUdH}M^6G+7h4I|))xZyk*^uQh(;p$#=Zf-^4=bq))=~x za!ggR4aT2_2Gr&-(V)Tm{SW|Za~OcW2rPO`r=j>j-~JW=ca^l~{2Oz*qZ6pjVP=&! z0IPy*Isw3}(tl>%i;@+Xof~sG$7tC*Sh8hFbR2-OchllQt;5eATpjFnB&yhhXK%iM?fF1FI7<)Ac=he8 zcu=eGs|RDfZD>86jzkrCp!Ia}s9F!kOSSTzDceE2zqY;mJ9d2ll^s z$pl^=nC-_Cx2yBu<%5p^JikBVI$yR2Q=6-v1AmAIrx4VJnLs=c4-gN;gF=W0;sN4;cu)xO;9vCMF9wnaRpHh#o&W#<07*qoM6N<$ Ef;j($_y7O^ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_inactive.png b/src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_inactive.png index f2d12dd308e09438098bd402229bf445667488b2..bca5005fb895e3ecdc5bb902326b83e4708036e6 100644 GIT binary patch delta 196 zcmV;#06YKQ0_*{hFn<81Nkl08v=73P6LRE yMyv*4OGwBG2ssg9O-RVelNbz3_SDNvlmGzlxA8i5g`Ug+0000k$B+>jN--e(JPiwhMw7zt1`wth(+W;JH3gIBqQM6jVhDKopMU zUF=mL$W~oz+YYu+u5*nX_-FDwnLXkRg8vn$Nb_&*M-Nh28`>*WMT)h1ve(6nPPClP z1zMEVAgKXD2`~{rvRXnr%4$3t?O(mNMC>&SqWO@|R48hW#xKkAaeE#wm-_$!002ov JPDHLkV1j|Oj)DLH diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/inverted_ingot.png b/src/main/resources/assets/utilitiesinexcess/textures/items/inverted_ingot.png index 5192097e5d4c0c7c7d81035a5461e654233632ae..89d66ff2a944f6be79cbaae9ebf79fb44229d2e0 100644 GIT binary patch delta 403 zcmV;E0c`&40=ff`F@JPPL_t(Ijn$HGO9DX<#xMGoAt54ih#VqE97iJ@$8j7YA`&Jc z;)@X1@DwVQ^Y58y+K1^IOf#FN1qr>Yg@;*|eSR}Lvx@R>mKaU2HJRbBOwHjK{cw(t zt2Jt-2}#3%yJ>hFa@!A(vo(StW-JS0sT9Q1X^3eWM3X7d41W{++58O=Po#l256c(q z&KKAWMyTpKL{wGkTul-{gG*;&*<4OWzIP};d_tv1@8dH0z_1;-ux*kf&8F*qF>wV3SFnwKxIpFpd4+n`k_HLc z#=YsoaHvwX27gzzIt(_i1XwIFvjuRc*~CDd8psu~7*eWMp-{Pz<{hBVfG)j*o5H1Y zhZ(>?hVWUTQh_3w8Bng*p+on1tiAPSKTa_mAvev+=Ow@^mt{6Kv)c55+S3`fXuLnp xzcC1K2gs92&?jOYHGN+`&332HkMif&I~g5LOxQP;`V0U7002ovPDHLkV1k4{w=Mtx delta 324 zcmV-K0lWUX1MC8jF@GjWL_t(Ijn$H&j>1q7MbFS0YDg85kd&ZsJ_Cv78<6Pg z{z6Sf1+9G_fkR;W2W1eXZ~HbI*6xnFx$oY&GnohfrmVGUt<~>*_?v0Km&?U*#uyoR z`DDuToZIb&$d_zBpL05$7@EjWNsq?^fWGeuf`IjUO%MbCsDHkthr9)&WA5TmZQke`K9v?$WRpB6=0aZ7^ z_9j0$^F+Yjx8;kQV1dqLhF84-Dw+m+iXybHq`83#uk(4X0vNeG7*%z|!N0zNGiM5J?@vd2@D+PpqWlQ#6M1+TJME=#~hF82VU z40Ot1747j1rKUee?bH;2Fj>WW=r^#b^U4Lhy{JN$MciN(;K|B>I!zE6YP^Az5s6IB zD-}2^zZdY@phE@@uY;OGsZ)o^fDFlm_Rh*>c*9{bD1TL}aLv!tv$jKq{`b42$w&K3e*vGVmizK1 S3P%6{00{s|MNUMnLSTZ?js&Lw delta 355 zcmV-p0i6D}1d9WZF@Hr#L_t(IjlGhgj>13?hQFmXUx!kDP$$tMovpeu#VT=)DjI`_OH>l35sscc3O%Mc@ z`yucN0yrEF0PJ=^OB}#q!jK^a~L>XhG?R3B20e^TtpLm|fd_KqXJOD)A zUYpGZtu=m86g(aek|c3PX+kv^$FV(ME*Aj&;c&=)zh}GMl4Thp;iT=OeW-cP8`Q%S>`x3MSHy-B0?C3*2HhNou(=4^_o1-5fM8tz-%_N`Rnzv zxeqWH44k%WM_i>8VHnz4zu#xESlD}7YwRx^k4HwM5m6LzyWOmah_GBP9jJ~V2$bD} zs;W4hPDD|}^?L1unq%8Tdmp->j{>wdvJ3jt_yX#gYMv!I@ vCMzI8-sqb-vkPPZN&ZJSglx?t2mk=?nOG;0)ppqc0000;GiHX4->3g$Q-{+4WU%|(ew=c6!(hwl6$}=l z<_zED1sO>80s{jBgN3L$g8-`tUe^)j1+u}iKezwm3cOK(02Kh3swlGjl&RzZ0000< KMNUMnLSTY5FG*tn diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/mob_jar.png b/src/main/resources/assets/utilitiesinexcess/textures/items/mob_jar.png index fba3bfe4de5d98271371f73d8dd01dfc25a969d5..925630d3bf9d7a9eacead1eb279bfa1ff20f0187 100644 GIT binary patch delta 95 zcmV-l0HFVz0f_;SF<3)ML_t(I%VS`mCV24R!GB^fPR*oPM7ALW)gUWCS4@;EVT!OR zCdqcP)C{Zv6h|Xn48Rvd1P#EKKB$|N$<9pV0ssxWt6*yL_t(IjbmV-5HKQh9z1yPpBPOF3JQ!Eg2ZaZtCko;2&zF= zfUX#uW+r?FVf8CT&cmVxrwfP$6dM2s5ueBW)t|FX3n)mZAEeZSr(j+AWQbQHi z^j-l>P)RiTFaf$Bv8z07rZtLrpl=&wq&4i^Us`r{wZfE8J^ML;Y{tuW3ALqdX?AdoxCAH9P00000NkvXXu0mjfogz{y delta 310 zcmV-60m=U90o?+SFn<9TNklGBSwQ1if$2PPwFPk1N~EOr(NLQM3vm;(SVN0orf zK+ewIdzX(fm6*G>arlvbv9pSjZ{RLFOEF*b;63snH`3ql2O%a}_j^^v^X$yQ@^}7) z6lYu-neqUz#+vJXQ1^o(g4fN1GXv;)xC$J)!~g&Q07*qo IM6N<$f>;}o%>V!Z diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/precision_shears.png b/src/main/resources/assets/utilitiesinexcess/textures/items/precision_shears.png index b60a37c4fd80bcd0bff55e79cc1d166f9272e261..a190ef2ba7674a30c1dd093fb486cc700b43c83f 100644 GIT binary patch delta 352 zcmV-m0iXWJ0s8`wB!2;OQb$4o*~u(_00004XF*Lt006O%3;baP0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009a7bBm000XU000XU0RWnu z7ytkO2XskIMF;8u3l#+p5lDnA00006VoOIv0CoVI0GAN_|9|EH006&9L_t(I%hi!R z3c@fLhI@pH)=F(P)LL3pI;dS7#KBA0dpHXo!og!?@^r7fLf{+H*lzklh6JAH`-$iM ze4Pn-G^puuum$ y=VsWZ6s7U@15@<1GQ%0AfS??uQz((5|HvC?-Fp7F?t^^*00004(% delta 172 zcmV;d08{__0>}Z7B!7=dL_t(|USnVw^gw0)z5gJr5p(1}x*S0O(kRw<>c3G-%KzB) zz5gfO*+sk|xHJ=G2tLgqK3?yDH1FL18>|SMW{{yo8vqkS*4#4t32p004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009a7bBm000XU000XU0RWnu z7ytkO2XskIMF;8u3l#(`-81xw00006VoOIv0CoVI0GAN_|9|EH0081iL_t(I%hi!f z3c@fHMN_fh2c+VsQd4lIFIrqMo z2=Vjs+6e{SDY?yvzJ>t}y*X`;sg+*N*6DWjzk+9@J>ar}YdGgQDg;Nt3UEWgmV!}< z-FGKsgeP)GoqU!gzFcCcs$ju;!KU?IXKXf*{(>CGBQ3dxN*J!d7~?G*4>qJHsAQYr zW*DsB!}*ut;gFu6!3_IFd@#c*EyKVX5FQI)BDZAh8{#rE-6-^zFBnE2lOgU=H+TTl hTPY+qx$8#%p(h2YYSfL%Z&3gM002ovPDHLkV1mY%m9_u? delta 148 zcmV;F0BirA1F!**B!72FL_t(|USnVw^gw0)z5gJr5p(1}x*S0O(kRwS<+s(+?QL_t(Y$F0{vZ`v>z24MIHu%g}f6RHTBaGUVjxYuYC9IHub z!WB*8ZW4SCiDa&52ma-p`2AuCEt(YPP<>J*^61U$*clAy8jkC~W^VOF`JL^$Q?Z4 z>gdW-q0bi#8h=jYY4b6|JL~2nGxRy^>j{ugt_sv9INjva@wEB8@6hK^u8>dG(^JC3 z6)}pU+vg8Frq4-;d|qS*kKfP3(I2Lccuc8%Ud1PUPVDo_(4VdRjs9f4JO_BVULXx) zR&_mh`kb)PGoHN^@GSdyIIS;rM1KP6^XzV)J?gVSe}A@;)>rOgz1J_;hM_9&)WXa* zap9R#KEm{wg%X~0ekF@)&$`2&yXbIOs=t196M`guayzv#RgB=&iUPx_qN=T!_1x)m%DC4(ude!dLRw#PFEqvV_r>gPpS|nv3;p_1w7x1g=T+H$ l=GYG(+P_-Ql=3nA`&xf-!1KT7)qgy`<%|^_8=jM11ER>+cryS1 delta 708 zcmV;#0z3Wt2Y?8Ws(-6VL_t(Y$F0{vYvMo{24MXMx|O}}Pbfi~cw3xpGrfjg^jH?s z#H%cL9~0*u6Bw_u2mj?xGVeFh*vdjChw?!|AKtw2n+yhY4afE0@n|soHrCgJ9wv-U zf4z+cgUO4On>YRMuYT-_W{|ljzU$$^j~CNs@YtekhLo+;qkkEG6!kE9RqCV%{ejb; zvHrl}WBnChM(vm0UUxmA+#ALdc{D6)zFp>E_>8M&h*?yS=hS%kSrv{w+m=DF0{MU; zcYq}g?FF&02qQnzC)iwxk5f!PfrOC zSHviaZl6E!m_8>V@_CUNJbph9M}L?);x?u2{VG1`bJE_g4E@>4-{?=)%X5H->j$J^ z%&M;EPM;GNdd9Pt0-j|b52xo#9nqhF`aHYaXOH?U(0`w;q~|Ml@x0eRunj|1-pRtu znz-;xDIa0_%t8szp7L??`%^EV>wGlKc!G=lmBF)=*ZI`zw~pXcNWXn&~+j6kPB z`%92#Lw$CekL`0n`%A+F@&Q8~083f4q5UPgeRkwIs)#%SgKrq~*ygkN0~qp2$@8q& zv0Kl%Y=0RRM*T62IcxJV9(90+FP-%{N1rbkG;GLY^D)Dkb@Ndr`po-!eB@I}f!g?+ zn|wMRo6q`yK6AB1K4ni&22Uu7Aw;*&A9zfkQ;vLIRS8ef&lA%AqVsBywD(JV(&x0j zU!|b)D($bbmuJ^Kug>zW=T4tf#=Y)&b=Aic(mC@b_tKu91?{gpefF;3FZ9osqUWn} qb6%D9HK%>?q5Wk&Q_9Ee_qBfGfaibDtN#EzzU7P?#XvffSp%Y-Xn2tT diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/reversing_hoe.png b/src/main/resources/assets/utilitiesinexcess/textures/items/reversing_hoe.png index 4e69482726fcb9c2a90c135c2bdc0024df33543e..28270b89db9a0545b3881b88f5b66906482d8a62 100644 GIT binary patch delta 331 zcmbQs_>5_SNG(&67Iy3=9k`>5jgR3=A9lx&I`x0{IHb9znhg3{`3j3=J&| z48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!CBxDSXEXGi-1uds7cIo?(@zi(`nz>Ewh3sx$WH-ma5S^De&m z=B4za+0tgrAK5nXGCs0R6TIl1*v7$q>aVzH*bo0rjtb5W5ux`!*~`y=Q9mhGS#i}T z`6pZx6kV#>S4n90JT^6#|w%YW<_RoYqg*B`03HGTeHL43lSoC)z)pPX$p^Pad) za*3x){Mo5{7??9Jg>6!fH@+Fj%9U!#nY&>A(vzESMqK`FFTda7L_t(|USnXOC0O?7_J0^gmm>&3nkL=Z^*?rfFBp?;2nZXs zq`(bPnSbwp%j_ql83r>1gm>=${a+*I2x$g@0LW&LD?o;j>>Zf1K{k`6nIdPyY(|$O i2u5ut1CVVqr2qii9gvKgaACIq0000E)e-c@Ne1&9>AYTTCDm4a%h86~fUqGRT z7Yq!g1`G_Z5*Qe)W-u^_7tGleXakhsEbxddW?v!UEG7dvkC5Dcs{d@+RP4oW?!J zHH_7#)BNxAT;@nR{KG|Z!J<|?~(CT@;&G5N@*aGUEg&!Wz2JjHsO(q_C>m@b&i z;qlS0Pfc765#{S;1Rb`9mgS&nAP*=k&OcDLV6TXe9syDR<# o&^oJ|vl1DWNOnj{zTjjqIC$iwDSycxpjQ|?UHx3vIVCg!037Uu!vFvP delta 233 zcmVhIy0R%U0l{tvefEVee zYoR?vaqktnb6+pv+Ntyi@dVRN9V$X&XrZ$TBwyy`2l#iHEsKaq<}oubOtb}CYhkTL z(=@tSnx>IA0TD@6Rfyvl0MNEAm>JVFX_Ai#nAy~I4dA4MH~zYwWlMI@XSiC~00000NkvXXu0mjf9gkz@ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/watering_can_advanced.png b/src/main/resources/assets/utilitiesinexcess/textures/items/watering_can_advanced.png index d8b91dd3941d1270f41dcbc18b88176c7ba62304..6eb4d3f5d7baf9948c178875e508ad9d42ec5846 100644 GIT binary patch delta 177 zcmV;i08anf0{;P!R)3U9L_t(I%VS_?V`HEMGtk9=$8Y}q2Vt@dK-P%O5IDm*rTsq$ zqbpdv=fQt$Y!m}P8Y64x|Hq~PB#w=ZVF1h!WJ#Df$Y7A1ZA`^~c@qaP#u^47#V~&& zy9y)*GX$m?Mq>mT%n)<~K$s{4kPRW*0GI+?2H*?>d^&jVe+c zj3A875V!$0agF~$7|Ml%0~a1aS*UCn02=_(C?+YvkPs0G7DNWy4(^AtP}wj5cfqUY zFEA8<3>xHQ2EUNPwwAjkkGUG55iC-5Ce`Zs%HdYkbh#BKapMKU?9ifW$(x! zqo@v&Vt8@s7$eLOlt2U-l2FkJHv}1g48aCa3;+R`AqzUnp(6MJh5;Y|GQ`Hi3ChC+ zAm@X;0b*k{02@G#LYQU{z-s^~)Il)=(hQ}Ga*M83?SPM0t1~J85jW9nQ=U^ TYD|X!0000y{D4^005auL_t(I%f*w?3BVu> zL|w{V{Bj7Vavs0jCglnT8WStD(2s-kl01?~gNTGT3ZDR4Yg_f+1=9X9f!A!s696AM zXMr@J)+$y!0nk`V5nTYmx8emr$e5%LFmfp+i80_AaFa5kStMxBUj*LKez|M0r$ZLzma9lj(2CqBqI2vzVKmv13--NEvTw0 z0f15p?eCfSIRP_+nQxm*DO5_KmFToWj1k5d8OQMinCJQOd>|OdQR=!z+qQovKnUUT ze9!;@a?S`LplO?AT;Yuu})ZaN^W_a((Ifr2wZf)H=b{Qn^J#}4oOQ5xuX`1Ln@Gek$ z3)kj@3s;p=+N@h$cr6luqn|y~e{2ds;@H?22EYtKmV}9e3aMV47hxMxenAK{o(|i827$5V8$`DZpg_&M?4d0D2e@WhnqC)M17o#{$tQ5$0TE eJTRFF9|iyeJkca?J@000055s>DhAM#=@Z=2xBM5^O!+-pV?5Z$ZKL#z&QU*?L zh<$IqFfhUlfx7?%K!#KlTEh)N1|UPQ0Tcs30A@%>|52z2et=;B2!ISJ$h3y?FagN< zAa8)!SPj4ikfRW$83b_V1&}T5Yz*Ll0|g)`hCs3K^B0i@fB?$YjK20Gc}N3W#+nF55}+ zDp{H_3;_{JGE)E9*f>xyNDQVJmps@2NfBYNK!Tw3|9W>nFb1(?$uoc$b8-sc y5-^1zF_>-mlH>XqoDscZ&(CunACHnKIw_%)RZOv>?^Ci-x2YJo&?2F1Sevq@?DPkHNve_h&xj zT4$GZ{DYcarJAInV%y30`NyTr*oH za^J~`g**J4b({M(ul-tis<`COY4OB;0`qkae5$k3dn4R1-vMqKoN;5Ly2`b=nQN+E Qz5SLsO+?*%?h$rU2zM)f4ExJx^AyS zIDev?lXFuSU!uCJ@Zk`yN52yirr&?}=G+^e|Go@xpx_ymYPc@!`}3&PI>%N&`!n~{ zGTAMslI~R3oGQKOH7RD!UUkoN`SL;Y(NrV!Z From 6edd5d764a9bce9fdf5a709bd4c643f96ca077c4 Mon Sep 17 00:00:00 2001 From: rjnasers Date: Fri, 15 May 2026 02:37:37 +0200 Subject: [PATCH 04/21] Pretty major refactor to allow stuff for FMP. Still a lot to be done, but the bitch work is finished I think --- dependencies.gradle | 2 +- .../utilitiesinexcess/ModBlocks.java | 8 +- .../utilitiesinexcess/UtilitiesInExcess.java | 14 +- .../blocks/transfer/BlockRetrievalNode.java | 54 +-- .../transfer/BlockTransferNodeBase.java | 25 +- .../transfer/BlockTransferNodeFluid.java | 48 +-- .../blocks/transfer/BlockTransferPipe.java | 62 ++- .../transfer/TransferNodeRenderer.java | 4 +- .../transfer/TransferPipeRenderer.java | 31 +- .../transfer/ITransferNetworkComponent.java | 24 +- .../TileEntityNetworkComponentBase.java | 91 +++++ .../transfer/TileEntityRetrievalNode.java | 346 +++++++++-------- .../transfer/TileEntityTransferNode.java | 286 ++++---------- .../transfer/TileEntityTransferNodeBase.java | 64 +--- .../transfer/TileEntityTransferNodeFluid.java | 183 ++++----- .../transfer/TileEntityTransferPipe.java | 76 +--- .../compat/mui/tradingpost/SearchBar.java | 2 +- .../SharedNodeLogic/INodeLogicHost.java | 15 + .../ITransferNetworkLogic.java | 19 + .../ItemTransferNodeLogic.java | 247 ++++++++++++ .../SharedNodeLogic/NetworkLogic.java | 96 +++++ .../transfer/upgrade/TransferUpgrade.java | 16 +- .../transfer/upgrade/UpgradeInventory.java | 356 +++++++++--------- .../transfer/walk/BFSWalker.java | 58 +++ .../transfer/walk/BreadthWalker.java | 61 --- .../transfer/walk/DFSWalker.java | 58 +++ .../transfer/walk/DepthWalker.java | 64 ---- .../transfer/walk/ITransferWalker.java | 105 ------ .../transfer/walk/RandomWalker.java | 35 ++ .../transfer/walk/StandardWalker.java | 62 --- .../transfer/walk/WalkerBase.java | 42 +++ .../utils/MaskedArrayView.java | 54 +++ 32 files changed, 1403 insertions(+), 1205 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/INodeLogicHost.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BFSWalker.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DFSWalker.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ITransferWalker.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RandomWalker.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MaskedArrayView.java diff --git a/dependencies.gradle b/dependencies.gradle index 3d1caadf..bdc75955 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -38,7 +38,7 @@ dependencies { // TODO: remove MUI1 dep when the implicit dependency // TODO: in IItemHandlerModifiable is removed api("com.github.GTNewHorizons:ModularUI:1.3.1:dev") - api("com.github.GTNewHorizons:ModularUI2:2.3.23-1.7.10:dev") + api("com.github.GTNewHorizons:ModularUI2:2.3.63-1.7.10:dev") api("com.github.GTNewHorizons:CraftTweaker:3.4.2:dev") api('curse.maven:cofh-lib-220333:2388748') compileOnly('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev') diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 8e9eab1a..a81b0b7b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -53,11 +53,11 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockRedstoneGenerator; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockSolarGenerator; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockTNTGenerator; -import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockRetrievalNode; +//import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockRetrievalNode; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockRetrievalNodeFluid; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNode; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeEnergy; -import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeFluid; +//import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeFluid; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeHyperEnergy; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferPipe; import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; @@ -167,10 +167,10 @@ public enum ModBlocks { //TODO: Config TRANSFER_PIPE(true, new BlockTransferPipe(), "transfer_pipe"), TRANSFER_NODE(true, new BlockTransferNode(), "transfer_node"), - TRANSFER_NODE_FLUID(true, new BlockTransferNodeFluid(), "transfer_node_fluid"), +// TRANSFER_NODE_FLUID(true, new BlockTransferNodeFluid(), "transfer_node_fluid"), TRANSFER_NODE_ENERGY(true, new BlockTransferNodeEnergy(), "transfer_node_energy"), TRANSFER_NODE_HYPER_ENERGY(true, new BlockTransferNodeHyperEnergy(), "transfer_node_hyper_energy"), - RETRIEVAL_NODE(true, new BlockRetrievalNode(), "retrieval_node"), +// RETRIEVAL_NODE(true, new BlockRetrievalNode(), "retrieval_node"), RETRIEVAL_NODE_FLUID(true, new BlockRetrievalNodeFluid(), "retrieval_node_fluid"), CHANDELIER(BlockConfig.chandelier.enableChandelier, new BlockChandelier(), BlockChandelier.ItemBlockChandelier.class, "chandelier"), GIGA_TORCH(BlockConfig.gigaTorch.enableGigaTorch, new BlockGigaTorch(), BlockGigaTorch.ItemBlockGigaTorch.class, "giga_torch"), diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index 5a1ab471..a818ee8c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -1,6 +1,8 @@ package com.fouristhenumber.utilitiesinexcess; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityRetrievalNode; +//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityRetrievalNode; +import codechicken.lib.world.TileChunkLoadHook; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -52,8 +54,8 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntitySolarGenerator; import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityTNTGenerator; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeFluid; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; +//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeFluid; +//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; import com.fouristhenumber.utilitiesinexcess.common.worldgen.WorldGenEnderLotus; import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPRecipeLoader; import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.Content; @@ -114,7 +116,7 @@ public void preInit(FMLPreInitializationEvent event) { @Mod.EventHandler public void init(FMLInitializationEvent event) { proxy.init(event); - + TileChunkLoadHook.init(); RecipeLoader.run(); MinecraftForge.EVENT_BUS.register(new ForgeEventHandler()); @@ -165,9 +167,9 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityPacifistsBench.class, "TileEntityPacifistsBenchUIE"); GameRegistry.registerTileEntity(TileEntityTradingPost.class, "TileEntityTradingPostUIE"); GameRegistry.registerTileEntity(TileEntityTransferPipe.class, "TileEntityTransferPipeUIE"); - GameRegistry.registerTileEntity(TileEntityRetrievalNode.class,"TileEntityRetrievalNodeUIE"); // not sure if i did the naming correctly +// GameRegistry.registerTileEntity(TileEntityRetrievalNode.class,"TileEntityRetrievalNodeUIE"); // not sure if i did the naming correctly GameRegistry.registerTileEntity(TileEntityTransferNode.class, "TileEntityTransferNodeUIE"); - GameRegistry.registerTileEntity(TileEntityTransferNodeFluid.class, "TileEntityTransferNodeFluidUIE"); +// GameRegistry.registerTileEntity(TileEntityTransferNodeFluid.class, "TileEntityTransferNodeFluidUIE"); lapisAetheriusRenderID = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new LapisAetheriusRenderer()); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNode.java index 39fa7383..78369c9d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNode.java @@ -1,27 +1,27 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; - -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityRetrievalNode; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; - -public class BlockRetrievalNode extends BlockTransferNodeBase { - - public BlockRetrievalNode() { - super(); - setBlockName("retrieval_node"); - } - - @Override - public String getTopIcon() { - return "utilitiesinexcess:retrieval_node_top"; - } - - // TODO: new TE - // yes zir! - @Override - public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityRetrievalNode(); - } -} +//package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; +// +//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityRetrievalNode; +//import net.minecraft.tileentity.TileEntity; +//import net.minecraft.world.World; +// +//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; +// +//public class BlockRetrievalNode extends BlockTransferNodeBase { +// +// public BlockRetrievalNode() { +// super(); +// setBlockName("retrieval_node"); +// } +// +// @Override +// public String getTopIcon() { +// return "utilitiesinexcess:retrieval_node_top"; +// } +// +// // TODO: new TE +// // yes zir! +// @Override +// public TileEntity createNewTileEntity(World world, int metadata) { +// return new TileEntityRetrievalNode(); +// } +//} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java index 6a96b2be..c5d3284b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java @@ -21,18 +21,13 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class BlockTransferNodeBase extends BlockContainer { +public abstract class BlockTransferNodeBase extends BlockContainer { protected BlockTransferNodeBase() { super(Material.iron); setBlockTextureName(getTopIcon()); } - @Override - public TileEntity createNewTileEntity(World worldIn, int meta) { - return null; - } - @Override public boolean renderAsNormalBlock() { return false; @@ -56,18 +51,6 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer return true; } - protected void updateConnections(World world, int x, int y, int z) { - if (!world.isRemote) { - TileEntityTransferNodeBase te = (TileEntityTransferNodeBase) world.getTileEntity(x, y, z); - if (te != null) { - boolean changed = te.updateConnections(world, x, y, z); - if (changed) { - world.markBlockForUpdate(x, y, z); - } - } - } - } - @Override public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int meta) { return ForgeDirection.getOrientation(side) @@ -80,12 +63,6 @@ public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase p super.onBlockPlacedBy(world, x, y, z, placer, stack); int meta = world.getBlockMetadata(x, y, z); world.setBlockMetadataWithNotify(x, y, z, meta, 2); - updateConnections(world, x, y, z); - } - - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { - updateConnections(world, x, y, z); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeFluid.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeFluid.java index df147a79..28690297 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeFluid.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeFluid.java @@ -1,24 +1,24 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeFluid; - -public class BlockTransferNodeFluid extends BlockTransferNodeBase { - - public BlockTransferNodeFluid() { - super(); - setBlockName("transfer_node_fluid"); - } - - @Override - public String getTopIcon() { - return "utilitiesinexcess:transfer_node_fluid_top"; - } - - @Override - public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityTransferNodeFluid(); - } -} +//package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; +// +//import net.minecraft.tileentity.TileEntity; +//import net.minecraft.world.World; +// +//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeFluid; +// +//public class BlockTransferNodeFluid extends BlockTransferNodeBase { +// +// public BlockTransferNodeFluid() { +// super(); +// setBlockName("transfer_node_fluid"); +// } +// +// @Override +// public String getTopIcon() { +// return "utilitiesinexcess:transfer_node_fluid_top"; +// } +// +// @Override +// public TileEntity createNewTileEntity(World world, int metadata) { +// return new TileEntityTransferNodeFluid(); +// } +//} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java index c3c9b919..f04a2cb8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java @@ -2,18 +2,16 @@ import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; -import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; -public class BlockTransferPipe extends BlockContainer { +public class BlockTransferPipe extends BlockContainer +{ public BlockTransferPipe() { super(Material.iron); @@ -22,64 +20,52 @@ public BlockTransferPipe() { } @Override - public boolean renderAsNormalBlock() { + public boolean renderAsNormalBlock() + { return false; } @Override - public boolean isOpaqueCube() { + public boolean isOpaqueCube() + { return false; } @Override - public boolean hasTileEntity(int metadata) { + public boolean hasTileEntity(int metadata) + { return true; } @Override - public TileEntity createNewTileEntity(World world, int metadata) { + public TileEntity createNewTileEntity(World world, int metadata) + { return new TileEntityTransferPipe(); } @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { - updateConnections(world, x, y, z); - } - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase placer, ItemStack itemIn) { - updateConnections(world, x, y, z); - } - - protected void updateConnections(World world, int x, int y, int z) { - if (!world.isRemote) { - TileEntityTransferPipe te = (TileEntityTransferPipe) world.getTileEntity(x, y, z); - if (te != null) { - boolean changed = te.updateConnections(world, x, y, z); - if (changed) { - world.markBlockForUpdate(x, y, z); - } - } - } - } - - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) + { TileEntityTransferPipe te = (TileEntityTransferPipe) world.getTileEntity(x, y, z); if (te == null) return; + int mask = te.getConnectionsMask(); - float minX = (mask & 1 << 1) != 0 ? 0F : 0.375F; - float maxX = (mask & 1) != 0 ? 1F : 0.625F; - float minY = (mask & 1 << 3) != 0 ? 0F : 0.375F; - float maxY = (mask & 1 << 2) != 0 ? 1F : 0.625F; - float minZ = (mask & 1 << 5) != 0 ? 0F : 0.375F; - float maxZ = (mask & 1 << 4) != 0 ? 1F : 0.625F; + float minY = (mask & (1 << 0)) != 0 ? 0F : 0.375F; // DOWN (-Y) + float maxY = (mask & (1 << 1)) != 0 ? 1F : 0.625F; // UP (+Y) + + float minZ = (mask & (1 << 2)) != 0 ? 0F : 0.375F; // NORTH (-Z) + float maxZ = (mask & (1 << 3)) != 0 ? 1F : 0.625F; // SOUTH (+Z) + + float minX = (mask & (1 << 4)) != 0 ? 0F : 0.375F; // WEST (-X) + float maxX = (mask & (1 << 5)) != 0 ? 1F : 0.625F; // EAST (+X) + this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ); } @Override - public int getRenderType() { + public int getRenderType() + { return transferPipeRenderID; } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java index 166c50ec..a410a248 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java @@ -126,9 +126,9 @@ public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block b TileEntityTransferNodeBase te = (TileEntityTransferNodeBase) world.getTileEntity(x, y, z); if (te == null) return false; - int mask = te.getConnectionsMask(); + int mask = te.getRawConnectionMask(); - RenderPipes(mask, x, y, z, renderer, mask != 0); + RenderPipes(mask, x, y, z, renderer, mask != 0); return true; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java index 8ee5a40d..96781a57 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java @@ -3,13 +3,13 @@ import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; import static com.fouristhenumber.utilitiesinexcess.utils.RenderUtils.renderInventoryCube; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; import com.fouristhenumber.utilitiesinexcess.ModBlocks; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; import com.gtnewhorizons.angelica.api.ThreadSafeISBRH; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; @@ -26,34 +26,39 @@ public static void RenderPipes(int mask, int x, int y, int z, RenderBlocks rende renderer.renderStandardBlock(block, x, y, z); } - // +X + // -Y (down) if ((mask & (1)) != 0) { - renderer.setRenderBounds(0.625, 0.375, 0.375, 1.0, 0.625, 0.625); + renderer.setRenderBounds(0.375, 0.0, 0.375, 0.625, 0.375, 0.625); renderer.renderStandardBlock(block, x, y, z); } - // -X + + // +Y (up) if ((mask & (1 << 1)) != 0) { - renderer.setRenderBounds(0.0, 0.375, 0.375, 0.375, 0.625, 0.625); + renderer.setRenderBounds(0.375, 0.625, 0.375, 0.625, 1.0, 0.625); renderer.renderStandardBlock(block, x, y, z); } - // +Y + + // -Z (north) if ((mask & (1 << 2)) != 0) { - renderer.setRenderBounds(0.375, 0.625, 0.375, 0.625, 1.0, 0.625); + renderer.setRenderBounds(0.375, 0.375, 0.0, 0.625, 0.625, 0.375); renderer.renderStandardBlock(block, x, y, z); } - // -Y + + // +Z (south) if ((mask & (1 << 3)) != 0) { - renderer.setRenderBounds(0.375, 0.0, 0.375, 0.625, 0.375, 0.625); + renderer.setRenderBounds(0.375, 0.375, 0.625, 0.625, 0.625, 1.0); renderer.renderStandardBlock(block, x, y, z); } - // +Z + + // -X (west) if ((mask & (1 << 4)) != 0) { - renderer.setRenderBounds(0.375, 0.375, 0.625, 0.625, 0.625, 1.0); + renderer.setRenderBounds(0.0, 0.375, 0.375, 0.375, 0.625, 0.625); renderer.renderStandardBlock(block, x, y, z); } - // -Z + + // +X (east) if ((mask & (1 << 5)) != 0) { - renderer.setRenderBounds(0.375, 0.375, 0.0, 0.625, 0.625, 0.375); + renderer.setRenderBounds(0.625, 0.375, 0.375, 1.0, 0.625, 0.625); renderer.renderStandardBlock(block, x, y, z); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java index 87c468c4..dc27c287 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java @@ -1,11 +1,29 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public interface ITransferNetworkComponent { +import java.util.List; - boolean canConnectFrom(ForgeDirection side); - boolean canConnectTo(World world, int x, int y, int z, int side); +public interface ITransferNetworkComponent +{ + void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor); + void removeNeighbor(ForgeDirection direction); + + List getNeighbors(); + + // We need to have the walking component because it's likely that this will be relevant to the walkability + MaskedArrayView getWalkableDirs(ITransferNetworkComponent walkingComponent, ForgeDirection fromDirection); + + int getRawConnectionMask(); + + World getWorld(); + + int getX(); + int getY(); + int getZ(); + + boolean canConnectToSide(ForgeDirection side); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java new file mode 100644 index 00000000..f70df602 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java @@ -0,0 +1,91 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; + +import codechicken.lib.world.IChunkLoadTile; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ITransferNetworkLogic; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.List; + +public abstract class TileEntityNetworkComponentBase extends TileEntity implements ITransferNetworkComponent, IChunkLoadTile +{ + protected abstract ITransferNetworkLogic getNetworkLogic(); + + /// See implemented class IChunkLoadTile for why we need to implement all of these. + @Override + public void invalidate() + { + super.invalidate(); + getNetworkLogic().separateWorld(this); + } + + @Override + public void onChunkUnload() + { + getNetworkLogic().separateWorld(this); + } + + @Override + public void validate() + { + super.validate(); + getNetworkLogic().tryJoinWorld(this); + } + + @Override + public void onChunkLoad() { + getNetworkLogic().tryJoinWorld(this); + } + + @Override + public World getWorld() { + return this.worldObj; + } + + @Override + public int getX() { + return this.xCoord; + } + + @Override + public int getY() { + return this.yCoord; + } + + @Override + public int getZ() { + return this.zCoord; + } + + @Override + public void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor) + { + getNetworkLogic().addNeighbor(direction, neighbor); + } + + @Override + public void removeNeighbor(ForgeDirection direction) + { + getNetworkLogic().removeNeighbor(direction); + } + + @Override + public List getNeighbors() { + return null; + } + + // TODO make better + @Override + public MaskedArrayView getWalkableDirs(ITransferNetworkComponent walkingComponent, ForgeDirection fromDirection) + { + return getNetworkLogic().getNeighborsExcluding(fromDirection); + } + + @Override + public int getRawConnectionMask() + { + return getNetworkLogic().getNeighborMask(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java index 33ec2949..0f8adfc3 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java @@ -1,165 +1,181 @@ -package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; - -import com.cleanroommc.modularui.api.IGuiHolder; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.factory.PosGuiData; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.screen.UISettings; -import com.cleanroommc.modularui.utils.item.IItemHandler; -import com.cleanroommc.modularui.utils.item.InvWrapper; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.ParentWidget; -import com.cleanroommc.modularui.widgets.layout.Grid; -import com.cleanroommc.modularui.widgets.slot.ItemSlot; -import com.cleanroommc.modularui.widgets.slot.ModularSlot; -import com.cleanroommc.modularui.widgets.slot.SlotGroup; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import java.util.ArrayList; - -public class TileEntityRetrievalNode extends TileEntityTransferNode - implements ISidedInventory, IGuiHolder { - - ItemStack buffer; - IInventory connectedInventory; - - public TileEntityRetrievalNode() - { - System.out.println("CALLED"); - Walker.setOriginal(this); - } - - boolean foundEntity=false; - @Override - public void updateEntity() { - //tick+=2+(2*0); //0 is speedupgrade - //if (tick<=20) {return;} - //tick=0; - if (this.worldObj.isRemote || this.worldObj.getTotalWorldTime() % 20 != 0) return; - if (buffer != null && buffer.stackSize >= 64) return; - if (connectedInventory == null) { - ForgeDirection facing = ForgeDirection.getOrientation(getBlockMetadata()); - TileEntity neighbor = worldObj - .getTileEntity(xCoord + facing.offsetX, yCoord + facing.offsetY, zCoord + facing.offsetZ); - if (neighbor instanceof IInventory inventory) { - connectedInventory = inventory; - } - } - - if (connectedInventory != null) exportItems(); - - if (!foundEntity) - { - Walker.step(); - } - TileEntity pipe=Walker.getCurrentTileEntity(); - ArrayList ents=Walker.getItemEntities(); - foundEntity=false; - for (TileEntity entity : ents) - { - boolean side=true; - - if (pipe instanceof TileEntityTransferNodeBase node) { - side = node.canConnectFrom(Walker.getDirectionFromCurrent(entity)); - } - - - if (side) - { - IInventory iEntity=(IInventory)entity; - ArrayList validSlots=new ArrayList<>(0); - for (int i = 0; i < iEntity.getSizeInventory(); i++) { - ItemStack slot = iEntity.getStackInSlot(i); - if (slot==null || (buffer!=null && !buffer.isItemEqual(slot))) {continue;} - if (buffer==null) { buffer=new ItemStack(slot.getItem(),0);} - foundEntity=true; - slot.stackSize-=1; - buffer.stackSize+=1; - this.setInventorySlotContents(0,buffer); - if (slot.stackSize==0) - { - slot=null; - iEntity.setInventorySlotContents(i,null); - } - break; - } - - if (true) //TODO: LINK WITH Round Robin - { - if (!foundEntity) - { - Walker.reset(); - } - } else - { - break; - } - - - } - } - - - } - // TODO: Swap to ExportItems 🤤 - Should be done now - public void exportItems() { - ArrayList validSlots=new ArrayList<>(0); - for (int i = 0; i < connectedInventory.getSizeInventory(); i++) { - ItemStack slot = connectedInventory.getStackInSlot(i); - if (buffer==null || slot==null || (slot.isItemEqual(buffer) && slot.getMaxStackSize()-slot.stackSize==0)) {continue;} - validSlots.add(i); - } - for (int i = 0; i < connectedInventory.getSizeInventory(); i++) { // could compress into another array and do .addall - ItemStack slot = connectedInventory.getStackInSlot(i); - if (slot!=null) {continue;} - validSlots.add(i); - } - - for (int slot: validSlots) { - ItemStack stackInSlot = connectedInventory.getStackInSlot(slot); - if (buffer!=null) { - if (stackInSlot == null) { - stackInSlot = buffer.splitStack(1); - if (buffer.stackSize <= 0) { - buffer=null; - } - connectedInventory.setInventorySlotContents(slot,stackInSlot); - break; - } else if (buffer.isItemEqual(stackInSlot)) { - //if (stackInSlot.stackSize==stackInSlot.getMaxStackSize()) {continue;} - buffer.splitStack(1); - stackInSlot.stackSize += 1; - if (buffer.stackSize <= 0) { - buffer=null; - this.setInventorySlotContents(0,null); - } - connectedInventory.setInventorySlotContents(slot,stackInSlot); - break; - } - } - } - } - - @Override - public String getInventoryName() { - return "gui.title.transfer_node.name"; - } - - @Override - public boolean canInsertItem(int slot, ItemStack stack, int side) { - return false; - } - - @Override - public boolean canExtractItem(int slot, ItemStack stack, int side) { - return side != blockMetadata; - } - -} +//package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; +// +//import com.cleanroommc.modularui.api.IGuiHolder; +//import com.cleanroommc.modularui.api.drawable.IKey; +//import com.cleanroommc.modularui.factory.PosGuiData; +//import com.cleanroommc.modularui.screen.ModularPanel; +//import com.cleanroommc.modularui.screen.UISettings; +//import com.cleanroommc.modularui.utils.item.IItemHandler; +//import com.cleanroommc.modularui.utils.item.InvWrapper; +//import com.cleanroommc.modularui.value.sync.PanelSyncManager; +//import com.cleanroommc.modularui.widget.ParentWidget; +//import com.cleanroommc.modularui.widgets.layout.Grid; +//import com.cleanroommc.modularui.widgets.slot.ItemSlot; +//import com.cleanroommc.modularui.widgets.slot.ModularSlot; +//import com.cleanroommc.modularui.widgets.slot.SlotGroup; +//import net.minecraft.entity.player.EntityPlayer; +//import net.minecraft.inventory.IInventory; +//import net.minecraft.inventory.ISidedInventory; +//import net.minecraft.item.ItemStack; +//import net.minecraft.tileentity.TileEntity; +//import net.minecraft.util.StatCollector; +//import net.minecraft.world.World; +//import net.minecraftforge.common.util.ForgeDirection; +// +//import java.util.ArrayList; +// +//public class TileEntityRetrievalNode extends TileEntityTransferNode +// implements ISidedInventory, IGuiHolder { +// +// ItemStack buffer; +// IInventory connectedInventory; +// +// public TileEntityRetrievalNode() +// { +// System.out.println("CALLED"); +// } +// +// boolean foundEntity = false; +// +// @Override +// public void updateEntity() { +// //tick+=2+(2*0); //0 is speedupgrade +// //if (tick<=20) {return;} +// //tick=0; +// +//// if (this.worldObj.isRemote || this.worldObj.getTotalWorldTime() % 20 != 0) +//// { +//// return; +//// } +//// if (buffer != null && buffer.stackSize >= 64) +//// { +//// return; +//// } +//// if (connectedInventory == null) +//// { +//// ForgeDirection facing = ForgeDirection.getOrientation(getBlockMetadata()); +//// TileEntity neighbor = worldObj +//// .getTileEntity(xCoord + facing.offsetX, yCoord + facing.offsetY, zCoord + facing.offsetZ); +//// if (neighbor instanceof IInventory inventory) { +//// connectedInventory = inventory; +//// } +//// } +//// +//// if (connectedInventory != null) +//// { +//// exportItems(); +//// } +//// +//// if (!foundEntity) +//// { +//// Walker.step(); +//// } +//// +//// TileEntity pipe = Walker.getCurrentTileEntity(); +//// +//// ArrayList ents = Walker.getItemEntities(); +//// +//// foundEntity = false; +//// +//// for (TileEntity entity : ents) +//// { +//// boolean side = true; +//// +//// if (pipe instanceof TileEntityTransferNodeBase node) { +//// side = node.canConnectFrom(Walker.getDirectionFromCurrent(entity)); +//// } +//// +//// +//// if (side) +//// { +//// IInventory iEntity=(IInventory)entity; +//// ArrayList validSlots=new ArrayList<>(0); +//// for (int i = 0; i < iEntity.getSizeInventory(); i++) { +//// ItemStack slot = iEntity.getStackInSlot(i); +//// if (slot==null || (buffer!=null && !buffer.isItemEqual(slot))) {continue;} +//// if (buffer==null) { buffer=new ItemStack(slot.getItem(),0);} +//// foundEntity=true; +//// slot.stackSize-=1; +//// buffer.stackSize+=1; +//// this.setInventorySlotContents(0,buffer); +//// if (slot.stackSize==0) +//// { +//// slot=null; +//// iEntity.setInventorySlotContents(i,null); +//// } +//// break; +//// } +//// +//// if (true) //TODO: LINK WITH Round Robin +//// { +//// if (!foundEntity) +//// { +//// Walker.reset(); +//// } +//// } else +//// { +//// break; +//// } +//// +//// +//// } +//// } +// } +// // TODO: Swap to ExportItems 🤤 - Should be done now +// public void exportItems() { +// ArrayList validSlots=new ArrayList<>(0); +// for (int i = 0; i < connectedInventory.getSizeInventory(); i++) { +// ItemStack slot = connectedInventory.getStackInSlot(i); +// if (buffer==null || slot==null || (slot.isItemEqual(buffer) && slot.getMaxStackSize()-slot.stackSize==0)) {continue;} +// validSlots.add(i); +// } +// for (int i = 0; i < connectedInventory.getSizeInventory(); i++) { // could compress into another array and do .addall +// ItemStack slot = connectedInventory.getStackInSlot(i); +// if (slot!=null) {continue;} +// validSlots.add(i); +// } +// +// for (int slot: validSlots) { +// ItemStack stackInSlot = connectedInventory.getStackInSlot(slot); +// if (buffer!=null) { +// if (stackInSlot == null) { +// stackInSlot = buffer.splitStack(1); +// if (buffer.stackSize <= 0) { +// buffer=null; +// } +// connectedInventory.setInventorySlotContents(slot,stackInSlot); +// break; +// } else if (buffer.isItemEqual(stackInSlot)) { +// //if (stackInSlot.stackSize==stackInSlot.getMaxStackSize()) {continue;} +// buffer.splitStack(1); +// stackInSlot.stackSize += 1; +// if (buffer.stackSize <= 0) { +// buffer=null; +// this.setInventorySlotContents(0,null); +// } +// connectedInventory.setInventorySlotContents(slot,stackInSlot); +// break; +// } +// } +// } +// } +// +// @Override +// public String getInventoryName() +// { +// return "gui.title.transfer_node.name"; +// } +// +// @Override +// public boolean canInsertItem(int slot, ItemStack stack, int side) +// { +// return false; +// } +// +// @Override +// public boolean canExtractItem(int slot, ItemStack stack, int side) +// { +// return side != blockMetadata; +// } +// +//} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java index 95fd7a6a..26ada0ca 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java @@ -1,300 +1,160 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; -import com.cleanroommc.modularui.widgets.layout.Flow; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.INodeLogicHost; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ITransferNetworkLogic; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ItemTransferNodeLogic; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import com.cleanroommc.modularui.api.IGuiHolder; -import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.UISettings; -import com.cleanroommc.modularui.utils.item.IItemHandler; -import com.cleanroommc.modularui.utils.item.InvWrapper; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.ParentWidget; -import com.cleanroommc.modularui.widgets.layout.Grid; -import com.cleanroommc.modularui.widgets.slot.ItemSlot; -import com.cleanroommc.modularui.widgets.slot.ModularSlot; -import com.cleanroommc.modularui.widgets.slot.SlotGroup; -import java.util.ArrayList; public class TileEntityTransferNode extends TileEntityTransferNodeBase - implements ISidedInventory, IGuiHolder { - - ItemStack[] buffer=new ItemStack[getSizeInventory()]; - IInventory connectedInventory; - - @Override - public boolean canConnectTo(World world, int x, int y, int z, int side) { - if (side == blockMetadata) return false; - - TileEntity te = world.getTileEntity(x, y, z); - - if (te instanceof ITransferNetworkComponent transfer) { - return transfer.canConnectFrom(ForgeDirection.getOrientation(side)); - } - - if (te instanceof ISidedInventory sided) { - int[] slots = sided.getAccessibleSlotsFromSide(side); - return slots != null && slots.length > 0; - } else return te instanceof IInventory; - } + implements IGuiHolder +{ + ItemTransferNodeLogic logic; public TileEntityTransferNode() { + logic = new ItemTransferNodeLogic(this); System.out.println("CALLED"); - Walker.setOriginal(this); } - //int tick=0; @Override - public void updateEntity() { - //tick+=2+(2*0); - //if (tick<=20) {return;} - //tick=0; - if (this.worldObj.isRemote || this.worldObj.getTotalWorldTime() % 20 != 0) return; - if (buffer[0] != null && buffer[0].stackSize >= 64) return; - if (connectedInventory == null) { - ForgeDirection facing = ForgeDirection.getOrientation(getBlockMetadata()); - TileEntity neighbor = worldObj - .getTileEntity(xCoord + facing.offsetX, yCoord + facing.offsetY, zCoord + facing.offsetZ); - if (neighbor instanceof IInventory inventory) { - connectedInventory = inventory; - } - } - if (connectedInventory != null) importItems(); - - - Walker.step(); - - TileEntity pipe=Walker.getCurrentTileEntity(); - - ArrayList ents=Walker.getItemEntities(); - - for (TileEntity entity : ents) - { - boolean side=true; - if (pipe instanceof TileEntityTransferNodeBase node) { - side = node.canConnectFrom(Walker.getDirectionFromCurrent(entity)); - } - if (side) - { - IInventory iEntity=(IInventory)entity; - ArrayList validSlots=new ArrayList<>(0); - for (int i = 0; i < iEntity.getSizeInventory(); i++) { - ItemStack slot = iEntity.getStackInSlot(i); - if (buffer[0]==null || slot==null || (slot.isItemEqual(buffer[0]) && slot.getMaxStackSize()-slot.stackSize==0)) {continue;} - validSlots.add(i); - - - } - for (int i : validSlots) - { - ItemStack slot = iEntity.getStackInSlot(i); - int remaining=slot.getMaxStackSize()-slot.stackSize; - if (buffer[0].stackSize <= remaining) - { - slot.stackSize+=buffer[0].stackSize; - buffer[0]=null; - iEntity.setInventorySlotContents(i,slot); - break; - } - slot.stackSize+=remaining; - buffer[0].stackSize-=remaining; - iEntity.setInventorySlotContents(i,slot); - } - for (int i = 0; i < iEntity.getSizeInventory(); i++) { - ItemStack slot = iEntity.getStackInSlot(i); - if (buffer[0]==null || (slot!=null && !buffer[0].isItemEqual(buffer[0]))) {continue;} - if (slot==null) { slot=new ItemStack(buffer[0].getItem(),0);} - slot.stackSize+=buffer[0].stackSize; - buffer[0]=null; - iEntity.setInventorySlotContents(i,slot); - } - - - if (true) //TODO: LINK WITH Round Robin - { - Walker.reset(); - break; - } - - } - } - - - - - - - + public void updateEntity() + { + this.logic.updateEntity(this); } public void importItems() { - for (int slot = 0; slot < connectedInventory.getSizeInventory(); slot++) { - ItemStack stackInSlot = connectedInventory.getStackInSlot(slot); - if (stackInSlot != null) { - if (buffer[0] == null) { - buffer[0] = stackInSlot.splitStack(1); - if (stackInSlot.stackSize <= 0) { - connectedInventory.setInventorySlotContents(slot, null); - } - break; - } else if (buffer[0].isItemEqual(stackInSlot)) { - stackInSlot.splitStack(1); - buffer[0].stackSize += 1; - if (stackInSlot.stackSize <= 0) { - connectedInventory.setInventorySlotContents(slot, null); - } - break; - } - } - } + this.logic.importItems(); } - //TODO: SWITCH ALL CODE TO BASENODE SO EVERY FILE HAS THIS SAVING AND UPGRADES + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - for (int i = 0; i < getSizeInventory(); i++) { - if (buffer[i]==null) {continue;} - nbt.setTag(String.valueOf(i),buffer[i].writeToNBT(new NBTTagCompound())); - } + this.logic.writeToNBT(nbt); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - for (int i = 0; i < getSizeInventory(); i++) { - if (!nbt.hasKey(String.valueOf(i))) {continue;} - buffer[i]= ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(String.valueOf(i))); - this.setInventorySlotContents(i,buffer[i]); - } + this.logic.readFromNBT(nbt); } @Override - public int getSizeInventory() { // 1(buffer[0])+6(upgrade slots) - return 7; + public int getSizeInventory() + { + return logic.getSizeInventory(); } @Override - public ItemStack getStackInSlot(int slotIn) { - return buffer[slotIn]; + public ItemStack getStackInSlot(int slotIn) + { + return logic.getStackInSlot(slotIn); } @Override - public ItemStack decrStackSize(int index, int count) { - if (buffer[index] == null) return null; - return buffer[index].splitStack(count); + public ItemStack decrStackSize(int index, int count) + { + return logic.decrStackSize(index, count); } @Override - public ItemStack getStackInSlotOnClosing(int index) { - return buffer[index]; + public ItemStack getStackInSlotOnClosing(int index) + { + return logic.getStackInSlotOnClosing(index); } @Override - public void setInventorySlotContents(int index, ItemStack stack) { - buffer[index] = stack; - this.markDirty(); + public void setInventorySlotContents(int index, ItemStack stack) + { + logic.setInventorySlotContents(index, stack, this); } @Override - public String getInventoryName() { - return "gui.title.transfer_node.name"; + public String getInventoryName() + { + return logic.getInventoryName(); } @Override - public boolean hasCustomInventoryName() { - return false; + public boolean hasCustomInventoryName() + { + return logic.hasCustomInventoryName(); } @Override - public int getInventoryStackLimit() { - return 64; + public int getInventoryStackLimit() + { + return logic.getInventoryStackLimit(); } @Override - public boolean isUseableByPlayer(EntityPlayer player) { - return true; + public boolean isUseableByPlayer(EntityPlayer player) + { + return logic.isUseableByPlayer(player); } @Override - public void openInventory() {} + public void openInventory() + { + logic.openInventory(); + } @Override - public void closeInventory() {} + public void closeInventory() + { + logic.closeInventory(); + } @Override - public boolean isItemValidForSlot(int index, ItemStack stack) { - return true; + public boolean isItemValidForSlot(int index, ItemStack stack) + { + return logic.isItemValidForSlot(index, stack); } @Override - public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { - - SlotGroup slotGroup = new SlotGroup("transfer_node_buffer[0]", 1); - SlotGroup slotGroup1 = new SlotGroup("transfer_node_upgrades", 1); - - ModularPanel panel = new ModularPanel("panel"); - panel.bindPlayerInventory(); - - panel.child( - new ParentWidget<>().coverChildren() - .topRelAnchor(0, 1) - .child( - IKey.str(StatCollector.translateToLocal(getInventoryName())) - .asWidget() - .marginLeft(5) - .marginRight(5) - .marginTop(5) - .marginBottom(-15))); - - IItemHandler itemHandler = new InvWrapper(this); - - - Flow flow=Flow.row(); - flow.pos(34,60).size(108,18); - for (int i = 0; i < 6; i++) { - flow.child(new ItemSlot().slot(new ModularSlot(itemHandler,i+1).slotGroup(slotGroup1))); - } - panel.child(flow); - ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); - - panel.child( - new Grid().coverChildren() - .pos(79, 34) - .mapTo(1, 1, index -> new ItemSlot().slot(slot))); - - return panel; + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) + { + return logic.buildUI(data, syncManager, settings, this); } @Override - public int[] getAccessibleSlotsFromSide(int side) { - if (ForgeDirection.getOrientation(side) - .getOpposite() - .ordinal() == blockMetadata) return null; - return new int[] { 0 }; + public int[] getAccessibleSlotsFromSide(int side) + { + if (ForgeDirection.getOrientation(side).getOpposite().ordinal() == blockMetadata) + { + return null; + } + return new int[] + { + 0 + }; } @Override - public boolean canInsertItem(int slot, ItemStack stack, int side) { + public boolean canInsertItem(int slot, ItemStack stack, int side) + { return side != blockMetadata; } @Override - public boolean canExtractItem(int slot, ItemStack stack, int side) { + public boolean canExtractItem(int slot, ItemStack stack, int side) + { return false; } + @Override + protected ITransferNetworkLogic getNetworkLogic() { + return logic; + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java index 02b45af2..fb5d9269 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java @@ -1,59 +1,18 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; -import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.TransferUpgrade; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.ITransferWalker; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.INodeLogicHost; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityTransferNodeBase extends TileEntity implements ITransferNetworkComponent { - - private int connectionsMask = 0; - - public int getConnectionsMask() { - return connectionsMask; - } - - public boolean updateConnections(World world, int x, int y, int z) { - int old = connectionsMask; - int mask = 0; - if (canConnectTo(world, x + 1, y, z, 5)) mask |= 1; - if (canConnectTo(world, x - 1, y, z, 4)) mask |= 1 << 1; - if (canConnectTo(world, x, y + 1, z, 1)) mask |= 1 << 2; - if (canConnectTo(world, x, y - 1, z, 0)) mask |= 1 << 3; - if (canConnectTo(world, x, y, z + 1, 3)) mask |= 1 << 4; - if (canConnectTo(world, x, y, z - 1, 2)) mask |= 1 << 5; - - connectionsMask = mask; - if (old != mask) { - markDirty(); - return true; - } - return false; - } - - @Override - public boolean canConnectTo(World world, int x, int y, int z, int side) { - return false; - } +public abstract class TileEntityTransferNodeBase extends TileEntityNetworkComponentBase + implements INodeLogicHost +{ @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setInteger("connectionsMask", connectionsMask); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - connectionsMask = nbt.getInteger("connectionsMask"); - } - - @Override - public Packet getDescriptionPacket() { + public Packet getDescriptionPacket() + { NBTTagCompound nbt = new NBTTagCompound(); writeToNBT(nbt); return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbt); @@ -68,10 +27,13 @@ public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { } @Override - public boolean canConnectFrom(ForgeDirection side) { - return side.getOpposite() - .ordinal() != blockMetadata; + public boolean canConnectToSide(ForgeDirection side) + { + return worldObj.getBlockMetadata(xCoord, yCoord, zCoord) != side.ordinal(); } - public ITransferWalker Walker=TransferUpgrade.SEARCH_BREADTH.getWalker(); + @Override + public ForgeDirection getFacing() { + return ForgeDirection.getOrientation(worldObj.getBlockMetadata(xCoord, yCoord, zCoord)); + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeFluid.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeFluid.java index 37c5ff43..54570e34 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeFluid.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeFluid.java @@ -1,91 +1,92 @@ -package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTank; -import net.minecraftforge.fluids.IFluidHandler; - -import com.cleanroommc.modularui.api.IGuiHolder; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.factory.PosGuiData; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.screen.UISettings; -import com.cleanroommc.modularui.value.sync.FluidSlotSyncHandler; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.ParentWidget; -import com.cleanroommc.modularui.widgets.layout.Grid; -import com.cleanroommc.modularui.widgets.slot.FluidSlot; - -public class TileEntityTransferNodeFluid extends TileEntityTransferNodeBase implements IGuiHolder { - - FluidTank buffer = new FluidTank(8000); - IFluidHandler connectedInventory; - - @Override - public boolean canConnectTo(World world, int x, int y, int z, int side) { - if (side == blockMetadata) return false; - - TileEntity te = world.getTileEntity(x, y, z); - - if (te instanceof ITransferNetworkComponent transfer) { - return transfer.canConnectFrom(ForgeDirection.getOrientation(side)); - } - - return te instanceof IFluidHandler; - } - - @Override - public void updateEntity() { - if (this.worldObj.isRemote || this.worldObj.getTotalWorldTime() % 20 != 0) return; - if (buffer != null && buffer.getFluidAmount() >= buffer.getCapacity()) return; - if (connectedInventory == null) { - ForgeDirection facing = ForgeDirection.getOrientation(getBlockMetadata()); - TileEntity neighbor = worldObj - .getTileEntity(xCoord + facing.offsetX, yCoord + facing.offsetY, zCoord + facing.offsetZ); - if (neighbor instanceof IFluidHandler inventory) { - connectedInventory = inventory; - } - } - if (connectedInventory != null) importFluids(); - } - - public void importFluids() { - FluidStack canDrain = connectedInventory.drain(ForgeDirection.UP, 200, false); - if (canDrain != null && canDrain.amount > 0) { - int filled = buffer.fill(canDrain, true); - if (filled > 0) { - connectedInventory.drain(ForgeDirection.UP, filled, true); - } - } - } - - @Override - public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { - - ModularPanel panel = new ModularPanel("panel"); - panel.bindPlayerInventory(); - - panel.child( - new ParentWidget<>().coverChildren() - .topRelAnchor(0, 1) - .child( - IKey.str(StatCollector.translateToLocal("gui.title.transfer_node_fluid.name")) - .asWidget() - .marginLeft(5) - .marginRight(5) - .marginTop(5) - .marginBottom(-15))); - - FluidSlotSyncHandler fluidSync = new FluidSlotSyncHandler(buffer); - - panel.child( - new Grid().coverChildren() - .pos(79, 34) - .mapTo(1, 1, index -> new FluidSlot().syncHandler(fluidSync))); - - return panel; - } -} +//package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; +// +//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +//import net.minecraft.tileentity.TileEntity; +//import net.minecraft.util.StatCollector; +//import net.minecraft.world.World; +//import net.minecraftforge.common.util.ForgeDirection; +//import net.minecraftforge.fluids.FluidStack; +//import net.minecraftforge.fluids.FluidTank; +//import net.minecraftforge.fluids.IFluidHandler; +// +//import com.cleanroommc.modularui.api.IGuiHolder; +//import com.cleanroommc.modularui.api.drawable.IKey; +//import com.cleanroommc.modularui.factory.PosGuiData; +//import com.cleanroommc.modularui.screen.ModularPanel; +//import com.cleanroommc.modularui.screen.UISettings; +//import com.cleanroommc.modularui.value.sync.FluidSlotSyncHandler; +//import com.cleanroommc.modularui.value.sync.PanelSyncManager; +//import com.cleanroommc.modularui.widget.ParentWidget; +//import com.cleanroommc.modularui.widgets.layout.Grid; +//import com.cleanroommc.modularui.widgets.slot.FluidSlot; +// +//public class TileEntityTransferNodeFluid extends TileEntityTransferNodeBase implements IGuiHolder { +// +// FluidTank buffer = new FluidTank(8000); +// IFluidHandler connectedInventory; +// +// @Override +// public boolean canConnectTo(World world, int x, int y, int z, int side) { +// if (side == blockMetadata) return false; +// +// TileEntity te = world.getTileEntity(x, y, z); +// +// if (te instanceof ITransferNetworkComponent transfer) { +// return transfer.canConnectFrom(ForgeDirection.getOrientation(side)); +// } +// +// return te instanceof IFluidHandler; +// } +// +// @Override +// public void updateEntity() { +// if (this.worldObj.isRemote || this.worldObj.getTotalWorldTime() % 20 != 0) return; +// if (buffer != null && buffer.getFluidAmount() >= buffer.getCapacity()) return; +// if (connectedInventory == null) { +// ForgeDirection facing = ForgeDirection.getOrientation(getBlockMetadata()); +// TileEntity neighbor = worldObj +// .getTileEntity(xCoord + facing.offsetX, yCoord + facing.offsetY, zCoord + facing.offsetZ); +// if (neighbor instanceof IFluidHandler inventory) { +// connectedInventory = inventory; +// } +// } +// if (connectedInventory != null) importFluids(); +// } +// +// public void importFluids() { +// FluidStack canDrain = connectedInventory.drain(ForgeDirection.UP, 200, false); +// if (canDrain != null && canDrain.amount > 0) { +// int filled = buffer.fill(canDrain, true); +// if (filled > 0) { +// connectedInventory.drain(ForgeDirection.UP, filled, true); +// } +// } +// } +// +// @Override +// public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { +// +// ModularPanel panel = new ModularPanel("panel"); +// panel.bindPlayerInventory(); +// +// panel.child( +// new ParentWidget<>().coverChildren() +// .topRelAnchor(0, 1) +// .child( +// IKey.str(StatCollector.translateToLocal("gui.title.transfer_node_fluid.name")) +// .asWidget() +// .marginLeft(5) +// .marginRight(5) +// .marginTop(5) +// .marginBottom(-15))); +// +// FluidSlotSyncHandler fluidSync = new FluidSlotSyncHandler(buffer); +// +// panel.child( +// new Grid().coverChildren() +// .pos(79, 34) +// .mapTo(1, 1, index -> new FluidSlot().syncHandler(fluidSync))); +// +// return panel; +// } +//} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java index 6e72ffca..ed95a1e4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java @@ -1,74 +1,25 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ITransferNetworkLogic; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.IFluidHandler; -import cofh.api.energy.IEnergyReceiver; -public class TileEntityTransferPipe extends TileEntity implements ITransferNetworkComponent { +public class TileEntityTransferPipe extends TileEntityNetworkComponentBase +{ + private final NetworkLogic logic; - private int connectionsMask = 0; - - public int getConnectionsMask() { - return connectionsMask; - } - - public boolean updateConnections(World world, int x, int y, int z) { - int old = connectionsMask; - int mask = 0; - if (canConnectTo(world, x + 1, y, z, 5)) mask |= 1; - if (canConnectTo(world, x - 1, y, z, 4)) mask |= 1 << 1; - if (canConnectTo(world, x, y + 1, z, 1)) mask |= 1 << 2; - if (canConnectTo(world, x, y - 1, z, 0)) mask |= 1 << 3; - if (canConnectTo(world, x, y, z + 1, 3)) mask |= 1 << 4; - if (canConnectTo(world, x, y, z - 1, 2)) mask |= 1 << 5; - - connectionsMask = mask; - if (old != mask) { - markDirty(); - return true; - } - return false; + public TileEntityTransferPipe() + { + logic = new NetworkLogic(this); } - @Override - public boolean canConnectTo(World world, int x, int y, int z, int side) { - TileEntity te = world.getTileEntity(x, y, z); - - if (te instanceof ITransferNetworkComponent transfer) { - return transfer.canConnectFrom(ForgeDirection.getOrientation(side)); - } - - if (te instanceof ISidedInventory sided) { - int[] slots = sided.getAccessibleSlotsFromSide(side); - if (slots != null && slots.length > 0) return true; - } else if (te instanceof IInventory) return true; - - if (te instanceof IEnergyReceiver energy && energy.canConnectEnergy(ForgeDirection.getOrientation(side))) { - return true; - } - - return te instanceof IFluidHandler; - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setInteger("connectionsMask", connectionsMask); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - connectionsMask = nbt.getInteger("connectionsMask"); + public int getConnectionsMask() { + return logic.getNeighborMask(); } @Override @@ -87,7 +38,12 @@ public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { } @Override - public boolean canConnectFrom(ForgeDirection side) { + public boolean canConnectToSide(ForgeDirection side) { return true; } + + @Override + protected ITransferNetworkLogic getNetworkLogic() { + return logic; + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/SearchBar.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/SearchBar.java index 61f3f8ba..6198bd71 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/SearchBar.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/SearchBar.java @@ -36,7 +36,7 @@ public SearchBar() { @Override public void drawBackground(ModularGuiContext context, WidgetThemeEntry widgetTheme) { - IDrawable bg = getCurrentBackground(context.getTheme(), widgetTheme); + IDrawable bg = getCurrentBackground(widgetTheme); if (bg != null) { bg.draw(context, 2, -1, getArea().width - 4, getArea().height + 1, widgetTheme.getTheme()); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/INodeLogicHost.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/INodeLogicHost.java new file mode 100644 index 00000000..92f1e8bd --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/INodeLogicHost.java @@ -0,0 +1,15 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +// Class that is implemented by +public interface INodeLogicHost extends ISidedInventory, ITransferNetworkComponent +{ + + World getWorld(); + + ForgeDirection getFacing(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java new file mode 100644 index 00000000..a4fe2aa0 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java @@ -0,0 +1,19 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraftforge.common.util.ForgeDirection; + +public interface ITransferNetworkLogic +{ + void separateWorld(ITransferNetworkComponent host); + + void tryJoinWorld(ITransferNetworkComponent host); + + void removeNeighbor(ForgeDirection direction); + void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor); + + MaskedArrayView getNeighborsExcluding(ForgeDirection direction); + + int getNeighborMask(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java new file mode 100644 index 00000000..bc52d96b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java @@ -0,0 +1,247 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.StringSyncValue; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +public class ItemTransferNodeLogic extends NetworkLogic +{ + + ItemStack[] buffer = new ItemStack[getSizeInventory()]; + + IInventory connectedInventory; + + public ItemTransferNodeLogic(INodeLogicHost host) + { + super(host); + } + + public void updateEntity(INodeLogicHost host) { + if (host.getWorld().isRemote || host.getWorld().getTotalWorldTime() % 20 != 0) { + return; + } + + if (connectedInventory == null) { + ForgeDirection facing = host.getFacing(); + TileEntity neighbor = host.getWorld().getTileEntity(host.getX() + facing.offsetX, host.getY() + facing.offsetY, host.getZ() + facing.offsetZ); + if (neighbor instanceof IInventory inventory) { + connectedInventory = inventory; + } + } + + if (connectedInventory != null) { + importItems(); + } + + if (buffer[0] == null) + { + walker.reset(); + return; + } + walker.step(); + + walker.getValidTarget(); + if () + { + + } + } + + public void importItems() { + for (int slot = 0; slot < connectedInventory.getSizeInventory(); slot++) + { + ItemStack stackInSlot = connectedInventory.getStackInSlot(slot); + if (stackInSlot != null) + { + if (buffer[0] == null) + { + buffer[0] = stackInSlot.splitStack(1); + if (stackInSlot.stackSize <= 0) + { + connectedInventory.setInventorySlotContents(slot, null); + } + break; + } + else if (buffer[0].isItemEqual(stackInSlot)) + { + stackInSlot.splitStack(1); + buffer[0].stackSize += 1; + if (stackInSlot.stackSize <= 0) + { + connectedInventory.setInventorySlotContents(slot, null); + } + break; + } + } + } + } + + public void exportItems() + { + + } + + + public void writeToNBT(NBTTagCompound nbt) + { + NBTTagList nbttaglist = new NBTTagList(); + + for (int i = 0; i < this.buffer.length; ++i) + { + if (this.buffer[i] != null) + { + NBTTagCompound nbttagcompound1 = new NBTTagCompound(); + nbttagcompound1.setByte("Slot", (byte)i); + this.buffer[i].writeToNBT(nbttagcompound1); + nbttaglist.appendTag(nbttagcompound1); + } + } + + nbt.setTag("Items", nbttaglist); + } + + public void readFromNBT(NBTTagCompound nbt) + { + NBTTagList nbttaglist = nbt.getTagList("Items", 10); + this.buffer = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < nbttaglist.tagCount(); ++i) + { + NBTTagCompound compound = nbttaglist.getCompoundTagAt(i); + int slot = compound.getByte("Slot") & 255; + + if (slot < this.buffer.length) + { + this.buffer[slot] = ItemStack.loadItemStackFromNBT(compound); + } + } + } + + public int getSizeInventory() + { + return 7; + } + + public ItemStack getStackInSlot(int slotIn) + { + return buffer[slotIn]; + } + + public ItemStack decrStackSize(int index, int count) + { + if (buffer[index] == null) + { + return null; + } + return buffer[index].splitStack(count); + } + + public ItemStack getStackInSlotOnClosing(int index) + { + return buffer[index]; + } + + public void setInventorySlotContents(int index, ItemStack stack, INodeLogicHost host) + { + buffer[index] = stack; + host.markDirty(); + } + + public String getInventoryName() + { + return "gui.title.transfer_node.name"; + } + + public boolean hasCustomInventoryName() + { + return false; + } + + public int getInventoryStackLimit() + { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) + { + return true; + } + + public void openInventory() + {} + + public void closeInventory() + {} + + public boolean isItemValidForSlot(int index, ItemStack stack) + { + return true; + } + + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings, INodeLogicHost host) + { + StringSyncValue searchLocationSyncer = new StringSyncValue(() -> walker.getLocationString()); + syncManager.syncValue("searchLocationSyncer", searchLocationSyncer); + + SlotGroup slotGroup = new SlotGroup("transfer_node_buffer[0]", 1); + SlotGroup slotGroup1 = new SlotGroup("transfer_node_upgrades", 1); + + ModularPanel panel = new ModularPanel("panel"); + panel.bindPlayerInventory(); + + panel.child( + new ParentWidget<>().coverChildren() + .topRelAnchor(0, 1) + .child( + IKey.str(StatCollector.translateToLocal(getInventoryName())) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15))); + + IItemHandler itemHandler = new InvWrapper(host); + + panel.child( + IKey.dynamic(() -> "Search Location: " + searchLocationSyncer.getStringValue()) + .asWidget() + .marginTop(20) + .horizontalCenter() + ); + + Flow flow = Flow.row(); + flow.pos(34,60).size(108,18); + for (int i = 0; i < 6; i++) + { + flow.child(new ItemSlot().slot(new ModularSlot(itemHandler,i + 1).slotGroup(slotGroup1))); + } + panel.child(flow); + ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); + + panel.child( + new Grid().coverChildren() + .pos(79, 34) + .mapTo(1, 1, index -> new ItemSlot().slot(slot))); + + return panel; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java new file mode 100644 index 00000000..8d9fc5d7 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java @@ -0,0 +1,96 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.RandomWalker; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.WalkerBase; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class NetworkLogic implements ITransferNetworkLogic +{ + private ITransferNetworkComponent[] connectedNeighbors = new ITransferNetworkComponent[6]; + private int neighborMask = 0; + public WalkerBase walker; + + private boolean joined = false; + public NetworkLogic(ITransferNetworkComponent logicHost) + { + walker = new RandomWalker(logicHost); + } + + @Override + public void tryJoinWorld(ITransferNetworkComponent host) + { + World world = host.getWorld(); + int x = host.getX(); + int y = host.getY(); + int z = host.getZ(); + if (!joined && world != null && world.blockExists(x, y, z)) + { + joined = true; + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + { + int xOffset = x + dir.offsetX; + int yOffset = y + dir.offsetY; + int zOffset = z + dir.offsetZ; + if (world.blockExists(xOffset, yOffset, zOffset) && + world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15) + instanceof ITransferNetworkComponent component) + { + if (component.canConnectToSide(dir.getOpposite())) + { + component.addNeighbor(dir.getOpposite(), host); + addNeighbor(dir, component); + } + } + } + } + } + + @Override + public void separateWorld(ITransferNetworkComponent host) + { + for(int i = 0; i < connectedNeighbors.length; i++) + { + if (connectedNeighbors[i] != null) + { + connectedNeighbors[i].removeNeighbor(ForgeDirection.getOrientation(i).getOpposite()); + } + } + } + + @Override + public void removeNeighbor(ForgeDirection direction) + { + connectedNeighbors[direction.ordinal()] = null; + neighborMask &= ~(1 << direction.ordinal()); + } + + @Override + public void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor) + { + connectedNeighbors[direction.ordinal()] = neighbor; + neighborMask |= (1 << direction.ordinal()); + } + + @Override + public MaskedArrayView getNeighborsExcluding(ForgeDirection direction) + { + int mask; + if (direction != null) + { + mask = neighborMask & ~(1 << direction.ordinal()); + } + else + { + mask = neighborMask; + } + return new MaskedArrayView<>(mask, connectedNeighbors); + } + + @Override + public int getNeighborMask() { + return neighborMask; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java index d49cefc4..b7a5a373 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java @@ -1,14 +1,14 @@ package com.fouristhenumber.utilitiesinexcess.transfer.upgrade; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.StandardWalker; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.WalkerBase; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.RandomWalker; import net.minecraft.item.ItemStack; import com.fouristhenumber.utilitiesinexcess.ModItems; import com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade; import com.fouristhenumber.utilitiesinexcess.common.recipe.DisableableItemStack; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.BreadthWalker; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.DepthWalker; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.ITransferWalker; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.BFSWalker; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.DFSWalker; public enum TransferUpgrade { @@ -51,14 +51,6 @@ public boolean isWalkerUpgrade() { return this.type == UpgradeType.WALKER; } - public ITransferWalker getWalker() { - return switch (this) { - case SEARCH_DEPTH -> new DepthWalker(); - case SEARCH_BREADTH -> new BreadthWalker(); - default -> new StandardWalker(); - }; - } - public boolean isFilterUpgrade() { return this.type == UpgradeType.FILTER; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java index 0d7ade98..f0f4d1c1 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java @@ -1,178 +1,178 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.upgrade; - -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; - -import org.jetbrains.annotations.Nullable; - -import com.fouristhenumber.utilitiesinexcess.transfer.filter.ITransferFilter; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.ITransferWalker; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.StandardWalker; - -public class UpgradeInventory implements IInventory { - - private final List inv; - - public UpgradeInventory(int slots) { - this.inv = Stream.generate(UpgradeData::new) - .limit(slots) - .collect(Collectors.toList()); - } - - public ITransferWalker getWalker() { - TransferUpgrade upgrade = getWalkerUpgrade(); - return upgrade == null ? new StandardWalker() : upgrade.getWalker(); - } - - private TransferUpgrade getWalkerUpgrade() { - return inv.stream() - .map(UpgradeData::getUpgrade) - .filter(TransferUpgrade::isWalkerUpgrade) - .findAny() - .orElse(null); - } - - @Nullable - public ITransferFilter getFilter() { - return null; // todo - } - - // IInventory - - @Override - public int getSizeInventory() { - return this.inv.size(); - } - - @Override - public ItemStack getStackInSlot(int index) { - if (index < 0) return null; - if (index > this.inv.size()) return null; - - return this.inv.get(index) - .getStack(); - } - - @Override - public ItemStack decrStackSize(int index, int count) { - if (index < 0) return null; - if (index > this.inv.size()) return null; - - UpgradeData data = this.inv.get(index); - if (data == null) return null; - - ItemStack stack = data.getStack(); - int toMove = Math.min(stack.stackSize, count); - ItemStack newStack = stack.copy(); - newStack.stackSize = toMove; - stack.stackSize -= toMove; - if (stack.stackSize == 0) { - data.clear(); - } - markDirty(); - return newStack; - } - - @Override - public void setInventorySlotContents(int index, ItemStack stack) { - if (index < 0) return; - if (index > this.inv.size()) return; - - UpgradeData data = this.inv.get(index); - data.set(stack); - markDirty(); - } - - @Override - public boolean isItemValidForSlot(int index, ItemStack stack) { - if (stack == null) return true; // allow stuff to be removed - TransferUpgrade upgrade = TransferUpgrade.getUpgrade(stack); - if (upgrade == null) return false; - - // Handle special cases - int walkerIndex = -1; - int filterIndex = -1; - for (int i = 0; i < this.inv.size(); i++) { - UpgradeData data = this.inv.get(i); - if (data.isEmpty()) continue; - - if (data.upgrade.isWalkerUpgrade()) walkerIndex = i; - if (data.upgrade.isFilterUpgrade()) filterIndex = i; - } - - if (upgrade.isWalkerUpgrade()) return walkerIndex == -1 || walkerIndex == index; - if (upgrade.isFilterUpgrade()) return walkerIndex == -1 || filterIndex == index; - return true; - } - - @Override - public void markDirty() { - // todo - } - - @Override - public String getInventoryName() { - return ""; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - return true; - } - - // IInventory - Unused for this inventory - - @Override - public ItemStack getStackInSlotOnClosing(int index) { - return null; - } - - @Override - public void openInventory() {} - - @Override - public void closeInventory() {} - - private static class UpgradeData { - - private ItemStack stack; - private TransferUpgrade upgrade; - - public void set(ItemStack stack) { - this.stack = stack; - this.upgrade = TransferUpgrade.getUpgrade(stack); - } - - public ItemStack getStack() { - return this.stack; - } - - public TransferUpgrade getUpgrade() { - return this.upgrade; - } - - public boolean isEmpty() { - return this.stack == null; - } - - public void clear() { - this.stack = null; - this.upgrade = null; - } - } -} +//package com.fouristhenumber.utilitiesinexcess.transfer.upgrade; +// +//import java.util.List; +//import java.util.stream.Collectors; +//import java.util.stream.Stream; +// +//import net.minecraft.entity.player.EntityPlayer; +//import net.minecraft.inventory.IInventory; +//import net.minecraft.item.ItemStack; +// +//import org.jetbrains.annotations.Nullable; +// +//import com.fouristhenumber.utilitiesinexcess.transfer.filter.ITransferFilter; +//import com.fouristhenumber.utilitiesinexcess.transfer.walk.ITransferWalker; +//import com.fouristhenumber.utilitiesinexcess.transfer.walk.RandomWalker; +// +//public class UpgradeInventory implements IInventory { +// +// private final List inv; +// +// public UpgradeInventory(int slots) { +// this.inv = Stream.generate(UpgradeData::new) +// .limit(slots) +// .collect(Collectors.toList()); +// } +// +// public ITransferWalker getWalker() { +// TransferUpgrade upgrade = getWalkerUpgrade(); +// return upgrade == null ? new RandomWalker() : upgrade.getWalker(); +// } +// +// private TransferUpgrade getWalkerUpgrade() { +// return inv.stream() +// .map(UpgradeData::getUpgrade) +// .filter(TransferUpgrade::isWalkerUpgrade) +// .findAny() +// .orElse(null); +// } +// +// @Nullable +// public ITransferFilter getFilter() { +// return null; // todo +// } +// +// // IInventory +// +// @Override +// public int getSizeInventory() { +// return this.inv.size(); +// } +// +// @Override +// public ItemStack getStackInSlot(int index) { +// if (index < 0) return null; +// if (index > this.inv.size()) return null; +// +// return this.inv.get(index) +// .getStack(); +// } +// +// @Override +// public ItemStack decrStackSize(int index, int count) { +// if (index < 0) return null; +// if (index > this.inv.size()) return null; +// +// UpgradeData data = this.inv.get(index); +// if (data == null) return null; +// +// ItemStack stack = data.getStack(); +// int toMove = Math.min(stack.stackSize, count); +// ItemStack newStack = stack.copy(); +// newStack.stackSize = toMove; +// stack.stackSize -= toMove; +// if (stack.stackSize == 0) { +// data.clear(); +// } +// markDirty(); +// return newStack; +// } +// +// @Override +// public void setInventorySlotContents(int index, ItemStack stack) { +// if (index < 0) return; +// if (index > this.inv.size()) return; +// +// UpgradeData data = this.inv.get(index); +// data.set(stack); +// markDirty(); +// } +// +// @Override +// public boolean isItemValidForSlot(int index, ItemStack stack) { +// if (stack == null) return true; // allow stuff to be removed +// TransferUpgrade upgrade = TransferUpgrade.getUpgrade(stack); +// if (upgrade == null) return false; +// +// // Handle special cases +// int walkerIndex = -1; +// int filterIndex = -1; +// for (int i = 0; i < this.inv.size(); i++) { +// UpgradeData data = this.inv.get(i); +// if (data.isEmpty()) continue; +// +// if (data.upgrade.isWalkerUpgrade()) walkerIndex = i; +// if (data.upgrade.isFilterUpgrade()) filterIndex = i; +// } +// +// if (upgrade.isWalkerUpgrade()) return walkerIndex == -1 || walkerIndex == index; +// if (upgrade.isFilterUpgrade()) return walkerIndex == -1 || filterIndex == index; +// return true; +// } +// +// @Override +// public void markDirty() { +// // todo +// } +// +// @Override +// public String getInventoryName() { +// return ""; +// } +// +// @Override +// public boolean hasCustomInventoryName() { +// return false; +// } +// +// @Override +// public int getInventoryStackLimit() { +// return 64; +// } +// +// @Override +// public boolean isUseableByPlayer(EntityPlayer player) { +// return true; +// } +// +// // IInventory - Unused for this inventory +// +// @Override +// public ItemStack getStackInSlotOnClosing(int index) { +// return null; +// } +// +// @Override +// public void openInventory() {} +// +// @Override +// public void closeInventory() {} +// +// private static class UpgradeData { +// +// private ItemStack stack; +// private TransferUpgrade upgrade; +// +// public void set(ItemStack stack) { +// this.stack = stack; +// this.upgrade = TransferUpgrade.getUpgrade(stack); +// } +// +// public ItemStack getStack() { +// return this.stack; +// } +// +// public TransferUpgrade getUpgrade() { +// return this.upgrade; +// } +// +// public boolean isEmpty() { +// return this.stack == null; +// } +// +// public void clear() { +// this.stack = null; +// this.upgrade = null; +// } +// } +//} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BFSWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BFSWalker.java new file mode 100644 index 00000000..98c3edf1 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BFSWalker.java @@ -0,0 +1,58 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; + +public class BFSWalker extends WalkerBase { + + public BFSWalker(ITransferNetworkComponent originComponent) { + super(originComponent); + } + + @Override + public void step() { +// for (TileEntity tile : ignore) { +// if (tile == null || tile.isInvalid()) { +// reset(); +// break; +// } +// } +// +// tanks.clear(); +// chests.clear(); +// +// +// currentTE = lastChoice.get(0); +// lastChoice.remove(0); +// ignore.add(currentTE); +// ArrayList extend=new ArrayList(0); +// +// +// action="Searching for inventories at\n"+ Arrays.toString(getRelative(originTE, currentTE)); +// +// ArrayList tiles = getAdjacentEntities(currentTE); +// +// for (TileEntity tile : tiles) { +// if (tile == null || ignore.contains(tile)) { +// continue; +// } +// +// if (tile instanceof ITransferNetworkComponent) //should.. work +// { +// extend.add(tile); // they i think used a bias random.. +// continue; +// } +// +// if (tile instanceof IInventory) { +// chests.add(tile); +// } +// +// if (tile instanceof IFluidHandler) { +// tanks.add(tile); +// } +// } +// +// Collections.shuffle(extend); +// lastChoice.addAll(extend); +// if (lastChoice.isEmpty()) {reset();} + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java deleted file mode 100644 index c85f38d8..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.walk; - -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; -import net.minecraft.inventory.IInventory; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.fluids.IFluidHandler; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; - -public class BreadthWalker extends ITransferWalker { - - @Override - public void step() { - for (TileEntity tile : ignore) { - if (tile == null || tile.isInvalid()) { - reset(); - break; - } - } - - tanks.clear(); - chests.clear(); - - - current = lastChoice.get(0); - lastChoice.remove(0); - ignore.add(current); - ArrayList extend=new ArrayList(0); - - - action="Searching for inventories at\n"+ Arrays.toString(getRelative(original,current)); - - ArrayList tiles = getAdjacentEntities(current); - - for (TileEntity tile : tiles) { - if (tile == null || ignore.contains(tile)) { - continue; - } - - if (tile instanceof ITransferNetworkComponent) //should.. work - { - extend.add(tile); // they i think used a bias random.. - continue; - } - - if (tile instanceof IInventory) { - chests.add(tile); - } - - if (tile instanceof IFluidHandler) { - tanks.add(tile); - } - } - - Collections.shuffle(extend); - lastChoice.addAll(extend); - if (lastChoice.isEmpty()) {reset();} - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DFSWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DFSWalker.java new file mode 100644 index 00000000..201230bb --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DFSWalker.java @@ -0,0 +1,58 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; + +public class DFSWalker extends WalkerBase { + + public DFSWalker(ITransferNetworkComponent originComponent) { + super(originComponent); + } + + @Override + public void step() + { +// for (TileEntity tile : ignore) +// { +// if (tile == null || tile.isInvalid()) //not sure why it would be null +// { +// reset(); +// break; +// // optional return here (Not sure if it returns WHEN dead) +// } +// } +// +// chests.clear(); +// tanks.clear(); +// +// currentTE = lastChoice.get(0); +// lastChoice.remove(0); +// ignore.add(current); +// +// action="Searching for inventories at\n"+ Arrays.toString(getRelative(original,current)); +// ArrayList tiles=getAdjacentEntities(current); +// ArrayList extend=new ArrayList(0); +// +// for (TileEntity tile: tiles) +// { +// if (tile==null || ignore.contains(tile)) {continue;} +// +// if (tile instanceof ITransferNetworkComponent) //should.. work +// { +// extend.add(tile); // they i think used a bias random.. +// continue; +// } +// if (tile instanceof IInventory) +// { +// chests.add(tile); +// } +// +// if (tile instanceof IFluidHandler) { +// tanks.add(tile); +// } +// } +// +// Collections.shuffle(extend); +// lastChoice.addAll(0,extend); +// if (lastChoice.isEmpty()) {reset();} + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java deleted file mode 100644 index 3314a43f..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.walk; - -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; -import net.minecraft.inventory.IInventory; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.fluids.IFluidHandler; -import org.lwjgl.Sys; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; - -public class DepthWalker extends ITransferWalker { - - @Override - public void step() - { - for (TileEntity tile : ignore) - { - if (tile == null || tile.isInvalid()) //not sure why it would be null - { - reset(); - break; - // optional return here (Not sure if it returns WHEN dead) - } - } - - chests.clear(); - tanks.clear(); - - current = lastChoice.get(0); - lastChoice.remove(0); - ignore.add(current); - - action="Searching for inventories at\n"+ Arrays.toString(getRelative(original,current)); - ArrayList tiles=getAdjacentEntities(current); - ArrayList extend=new ArrayList(0); - - for (TileEntity tile: tiles) - { - if (tile==null || ignore.contains(tile)) {continue;} - - if (tile instanceof ITransferNetworkComponent) //should.. work - { - extend.add(tile); // they i think used a bias random.. - continue; - } - if (tile instanceof IInventory) - { - chests.add(tile); - } - - if (tile instanceof IFluidHandler) { - tanks.add(tile); - } - } - - Collections.shuffle(extend); - lastChoice.addAll(0,extend); - if (lastChoice.isEmpty()) {reset();} - } - - -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ITransferWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ITransferWalker.java deleted file mode 100644 index 5968c3ce..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ITransferWalker.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.walk; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import org.lwjgl.Sys; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; - -//TODO: implent into code -//MAYBE: Make the tile entity search in beginning of search ONLY reset if it is currently a path it is using - -// Template class I guess.. - -public class ITransferWalker { - TileEntity original; - TileEntity current; - String action; - - ArrayList chests=new ArrayList(); - ArrayList tanks=new ArrayList(); - ArrayList ignore=new ArrayList(); // may want to use Map - ArrayList lastChoice=new ArrayList(); - - public ArrayList getAdjacentEntities(TileEntity scan) - { - ArrayList tiles=new ArrayList(); - World world=scan.getWorldObj(); - tiles.add(world.getTileEntity(scan.xCoord,scan.yCoord-1, scan.zCoord)); - tiles.add(world.getTileEntity(scan.xCoord,scan.yCoord+1, scan.zCoord)); - tiles.add(world.getTileEntity(scan.xCoord,scan.yCoord, scan.zCoord-1)); - tiles.add(world.getTileEntity(scan.xCoord,scan.yCoord, scan.zCoord+1)); - tiles.add(world.getTileEntity(scan.xCoord-1,scan.yCoord, scan.zCoord)); - tiles.add(world.getTileEntity(scan.xCoord+1,scan.yCoord, scan.zCoord)); - - return tiles; - } - public int[] getRelative(TileEntity main, TileEntity sub) - { - return new int[] {main.xCoord-sub.xCoord,main.yCoord-sub.yCoord,main.zCoord-sub.zCoord}; - } - - /** - * SHOULD BE CALLED FIRST (basically the constructor of the code) - * The TileEntity of the placed Transfer/Recv - * @param main TileEntity - */ - public void setOriginal(TileEntity main) { - original=main; - current=original; - lastChoice.add(main); - } - - public void step() - { - } - - public ArrayList getItemEntities() - { - Collections.shuffle(chests); - return chests; - } - - public ArrayList getFluidEntities() - { - Collections.shuffle(tanks); - return tanks; - } - public TileEntity getCurrentTileEntity() - { - return current; - } - - public ForgeDirection getDirectionFromCurrent(TileEntity chest) - { - int relX=current.xCoord-chest.xCoord; - int relY=current.yCoord-chest.yCoord; - int relZ=current.zCoord-chest.zCoord; - if (relX>0) {return ForgeDirection.EAST;} - if (relX<0) {return ForgeDirection.WEST;} - if (relY>0) {return ForgeDirection.UP;} - if (relY<0) {return ForgeDirection.DOWN;} - if (relZ>0) {return ForgeDirection.SOUTH;} - if (relZ<0) {return ForgeDirection.NORTH;} - return ForgeDirection.UNKNOWN; - } - - public String getAction() - { - return action; - } - - public void reset() - { - //tanks.clear(); - //chests.clear(); - lastChoice.clear(); - ignore.clear(); - lastChoice.add(original); - //current=original; - } - -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RandomWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RandomWalker.java new file mode 100644 index 00000000..03c88d9d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RandomWalker.java @@ -0,0 +1,35 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.List; +import java.util.Random; + +public class RandomWalker extends WalkerBase +{ + + Random rand = new Random(); + public RandomWalker(ITransferNetworkComponent originComponent) + { + super(originComponent); + } + + @Override + public void step() + { + MaskedArrayView options = currentComponent.getWalkableDirs(walkingComponent, fromDirection); + if (options.size() != 0) + { + int direction = rand.nextInt(options.size()); + currentComponent = options.get(direction); + fromDirection = ForgeDirection.getOrientation(options.actualLocation(direction)).getOpposite(); + } + else + { + currentComponent = walkingComponent; + fromDirection = null; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java deleted file mode 100644 index 6eef41e9..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.walk; - -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; -import net.minecraft.inventory.IInventory; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.fluids.IFluidHandler; -import org.antlr.v4.runtime.LexerNoViableAltException; -import org.lwjgl.Sys; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; - -public class StandardWalker extends ITransferWalker { - - @Override - public void step() - { - for (TileEntity tile : ignore) - { - if (tile == null || tile.isInvalid()) //not sure why it would be null - { - reset(); - break; - // optional return here (Not sure if it returns WHEN dead) - } - } - - chests.clear(); - tanks.clear(); - - current = lastChoice.get(0); - lastChoice.remove(0); - ignore.add(current); - - action="Searching for inventories at\n"+ Arrays.toString(getRelative(original,current)); - ArrayList tiles=getAdjacentEntities(current); - ArrayList extend=new ArrayList(0); - - for (TileEntity tile: tiles) - { - if (tile==null || ignore.contains(tile)) {continue;} - - if (tile instanceof ITransferNetworkComponent) //should.. work - { - extend.add(tile); // they i think used a bias random.. - continue; - } - if (tile instanceof IInventory) - { - chests.add(tile); - } - - if (tile instanceof IFluidHandler) { - tanks.add(tile); - } - } - - if (extend.isEmpty()) {reset();} else {Collections.shuffle(extend); lastChoice.add(0,extend.get(0));} - } - -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java new file mode 100644 index 00000000..5e1db88b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java @@ -0,0 +1,42 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class WalkerBase +{ + protected ITransferNetworkComponent walkingComponent; + protected ITransferNetworkComponent currentComponent; + + protected ForgeDirection fromDirection; + + WalkerBase(ITransferNetworkComponent originComponent) + { + this.walkingComponent = originComponent; + this.currentComponent = originComponent; + } + + public abstract void step(); + + public ITransferNetworkComponent getCurrentComponent() + { + return currentComponent; + } + + public String getLocationString() + { + StringBuilder location = new StringBuilder(); + location.append("x: "); + location.append(currentComponent.getX() - walkingComponent.getX()); + location.append(" y: "); + location.append(currentComponent.getY() - walkingComponent.getY()); + location.append(" z: "); + location.append(currentComponent.getZ() - walkingComponent.getZ()); + return location.toString(); + } + + public void reset() + { + currentComponent = walkingComponent; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MaskedArrayView.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MaskedArrayView.java new file mode 100644 index 00000000..45de2506 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MaskedArrayView.java @@ -0,0 +1,54 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +public class MaskedArrayView +{ + private int mask = 0; + private final T[] array; + + public MaskedArrayView(int mask, T[] array) + { + this.mask = mask; + this.array = array; + } + + public int size() + { + return Integer.bitCount(mask); + } + + public T get(int i) + { + int count = 0; + + for (int bit = 0; bit < array.length; bit++) + { + if ((mask & (1 << bit)) != 0) + { + if (count == i) + { + return array[bit]; + } + count++; + } + } + + throw new IndexOutOfBoundsException(); + } + + public int actualLocation(int index) + { + int location = 0; + for (int bit = 0; bit < array.length; bit++) + { + if ((mask & (1 << bit)) != 0) + { + if (location == index) + { + return bit; + } + location++; + } + } + throw new IndexOutOfBoundsException(); + } +} From d9b0ddc428df455b5ecc723e0223bd465bfd8963 Mon Sep 17 00:00:00 2001 From: rjnasers Date: Fri, 15 May 2026 22:03:49 +0200 Subject: [PATCH 05/21] Collision, external connections, and client syncing done I think. I kinda feel like I have no fucking idea what I'm doing but it works so far --- .../blocks/transfer/BlockTransferBase.java | 28 ++++ .../transfer/BlockTransferNodeBase.java | 2 +- .../transfer/BlockTransferNodeEnergy.java | 3 +- .../blocks/transfer/BlockTransferPipe.java | 61 ++++++- .../transfer/TransferPipeRenderer.java | 2 +- .../transfer/ITransferNetworkComponent.java | 14 +- .../TileEntityNetworkComponentBase.java | 38 ++++- .../transfer/TileEntityTransferPipe.java | 27 +--- .../transfer/SharedNodeLogic/Connection.java | 7 + .../ITransferNetworkLogic.java | 19 ++- .../ItemTransferNodeLogic.java | 39 ++++- .../SharedNodeLogic/NetworkLogic.java | 151 +++++++++++++++--- .../transfer/SharedNodeLogic/PipeLogic.java | 21 +++ .../transfer/collision/PipeCollision.java | 72 +++++++++ .../transfer/upgrade/TransferUpgrade.java | 4 - .../transfer/walk/BFSWalker.java | 58 ------- .../transfer/walk/DFSWalker.java | 58 ------- .../transfer/walk/ItemWalker.java | 43 +++++ .../transfer/walk/RandomWalker.java | 35 ---- .../transfer/walk/TransportType.java | 8 + .../transfer/walk/WalkerBase.java | 25 +-- .../transfer/walk/stepper/BFSStepper.java | 24 +++ .../transfer/walk/stepper/DFSStepper.java | 22 +++ .../walk/stepper/ItemTargetResolver.java | 27 ++++ .../transfer/walk/stepper/RandomStepper.java | 41 +++++ .../walk/stepper/RoundRobinStepper.java | 21 +++ .../transfer/walk/stepper/StepStrategy.java | 27 ++++ .../transfer/walk/stepper/TargetResolver.java | 12 ++ 28 files changed, 647 insertions(+), 242 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferBase.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/PipeLogic.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/collision/PipeCollision.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BFSWalker.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DFSWalker.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RandomWalker.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/TransportType.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/BFSStepper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/DFSStepper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RandomStepper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RoundRobinStepper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferBase.java new file mode 100644 index 00000000..6325c5c5 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferBase.java @@ -0,0 +1,28 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public abstract class BlockTransferBase extends BlockContainer +{ + protected BlockTransferBase(Material mat) + { + super(mat); + } + + @Override + public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) + { + TileEntity te = worldIn.getTileEntity(x, y, z); + + if (!(te instanceof ITransferNetworkComponent component)) + { + return; + } + component.updateExternalConnections(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java index c5d3284b..46eb4835 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java @@ -21,7 +21,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public abstract class BlockTransferNodeBase extends BlockContainer { +public abstract class BlockTransferNodeBase extends BlockTransferBase { protected BlockTransferNodeBase() { super(Material.iron); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java index cda3940b..291468fb 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java @@ -19,7 +19,8 @@ public String getTopIcon() { // TODO: new TE @Override - public TileEntity createNewTileEntity(World world, int metadata) { + public TileEntity createNewTileEntity(World world, int metadata) + { return new TileEntityTransferNode(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java index f04a2cb8..a107cf6d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java @@ -2,15 +2,19 @@ import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; -import net.minecraft.block.BlockContainer; +import com.fouristhenumber.utilitiesinexcess.transfer.collision.PipeCollision; import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; -public class BlockTransferPipe extends BlockContainer +import java.util.List; + +public class BlockTransferPipe extends BlockTransferBase { public BlockTransferPipe() { @@ -49,7 +53,7 @@ public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) TileEntityTransferPipe te = (TileEntityTransferPipe) world.getTileEntity(x, y, z); if (te == null) return; - int mask = te.getConnectionsMask(); + int mask = te.getRawConnectionMask(); float minY = (mask & (1 << 0)) != 0 ? 0F : 0.375F; // DOWN (-Y) float maxY = (mask & (1 << 1)) != 0 ? 1F : 0.625F; // UP (+Y) @@ -63,6 +67,57 @@ public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ); } + @Override + public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, List list, Entity collider) + { + TileEntityTransferPipe te = (TileEntityTransferPipe) worldIn.getTileEntity(x, y, z); + if (te == null) return; + + int connectionMask = te.getRawConnectionMask(); + + AxisAlignedBB boundingBox = PipeCollision.MIDDLE.getBoundingBox().copy().offset(x, y, z); + if (boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.DOWN.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 0)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.UP.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 1)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.NORTH.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 2)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.SOUTH.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 3)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.WEST.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 4)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.EAST.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 5)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + } + @Override public int getRenderType() { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java index 96781a57..c1a007a8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java @@ -94,7 +94,7 @@ public boolean renderWorldBlock(IBlockAccess worldAccess, int x, int y, int z, B TileEntityTransferPipe te = (TileEntityTransferPipe) worldAccess.getTileEntity(x, y, z); if (te == null) return false; - RenderPipes(te.getConnectionsMask(), x, y, z, renderer, true); + RenderPipes(te.getRawConnectionMask(), x, y, z, renderer, true); return true; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java index dc27c287..7e180d71 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java @@ -1,6 +1,9 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -12,10 +15,13 @@ public interface ITransferNetworkComponent void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor); void removeNeighbor(ForgeDirection direction); - List getNeighbors(); + void addExternal(ForgeDirection direction, Connection neighbor); + void removeExternal(ForgeDirection direction); - // We need to have the walking component because it's likely that this will be relevant to the walkability - MaskedArrayView getWalkableDirs(ITransferNetworkComponent walkingComponent, ForgeDirection fromDirection); + Connection[] getExternalNeighbors(); + ITransferNetworkComponent[] getNetworkNeighbors(); + + MaskedArrayView getWalkableDirs(TransportType targetType, ForgeDirection fromDirection); int getRawConnectionMask(); @@ -26,4 +32,6 @@ public interface ITransferNetworkComponent int getZ(); boolean canConnectToSide(ForgeDirection side); + + void updateExternalConnections(); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java index f70df602..c88afbf0 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java @@ -1,13 +1,14 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; import codechicken.lib.world.IChunkLoadTile; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ITransferNetworkLogic; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import java.util.List; public abstract class TileEntityNetworkComponentBase extends TileEntity implements ITransferNetworkComponent, IChunkLoadTile { @@ -65,6 +66,18 @@ public void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neig getNetworkLogic().addNeighbor(direction, neighbor); } + @Override + public void addExternal(ForgeDirection direction, Connection neighbor) + { + getNetworkLogic().addExternal(direction, neighbor); + } + + @Override + public void removeExternal(ForgeDirection direction) + { + getNetworkLogic().removeExternal(direction); + } + @Override public void removeNeighbor(ForgeDirection direction) { @@ -72,13 +85,26 @@ public void removeNeighbor(ForgeDirection direction) } @Override - public List getNeighbors() { - return null; + public void updateExternalConnections() + { + getNetworkLogic().updateExternalConnections(this); + } + + @Override + public Connection[] getExternalNeighbors() + { + return getNetworkLogic().getExternalConnections(); + } + + @Override + public ITransferNetworkComponent[] getNetworkNeighbors() + { + return getNetworkLogic().getNetworkConnections(); } // TODO make better @Override - public MaskedArrayView getWalkableDirs(ITransferNetworkComponent walkingComponent, ForgeDirection fromDirection) + public MaskedArrayView getWalkableDirs(TransportType targetType, ForgeDirection fromDirection) { return getNetworkLogic().getNeighborsExcluding(fromDirection); } @@ -86,6 +112,8 @@ public MaskedArrayView getWalkableDirs(ITransferNetwo @Override public int getRawConnectionMask() { - return getNetworkLogic().getNeighborMask(); + ITransferNetworkLogic logic = getNetworkLogic(); + logic.updateExternalConnections(this); + return logic.getNetworkMask() | logic.getExternalMask(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java index ed95a1e4..b50611d4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java @@ -2,39 +2,16 @@ import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ITransferNetworkLogic; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.Packet; -import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.PipeLogic; import net.minecraftforge.common.util.ForgeDirection; - public class TileEntityTransferPipe extends TileEntityNetworkComponentBase { private final NetworkLogic logic; public TileEntityTransferPipe() { - logic = new NetworkLogic(this); - } - - public int getConnectionsMask() { - return logic.getNeighborMask(); - } - - @Override - public Packet getDescriptionPacket() { - NBTTagCompound nbt = new NBTTagCompound(); - writeToNBT(nbt); - return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbt); - } - - @Override - public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { - readFromNBT(pkt.func_148857_g()); - if (worldObj != null) { - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } + logic = new PipeLogic(); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java new file mode 100644 index 00000000..13e736ef --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java @@ -0,0 +1,7 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + +import com.github.bsideup.jabel.Desugar; +import net.minecraft.tileentity.TileEntity; + +@Desugar +public record Connection(TileEntity target, int flags) {} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java index a4fe2aa0..2f79fbac 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java @@ -2,6 +2,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; public interface ITransferNetworkLogic @@ -9,11 +10,27 @@ public interface ITransferNetworkLogic void separateWorld(ITransferNetworkComponent host); void tryJoinWorld(ITransferNetworkComponent host); + void updateExternalConnections(ITransferNetworkComponent host); + + void addExternal(ForgeDirection direction, Connection neighbor); + void removeExternal(ForgeDirection direction); void removeNeighbor(ForgeDirection direction); void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor); MaskedArrayView getNeighborsExcluding(ForgeDirection direction); - int getNeighborMask(); + int getNetworkMask(); + int getExternalMask(); + void setNetworkMask(int mask); + void setExternalMask(int mask); + + boolean canConnectEnergy(); + boolean canConnectFluid(); + boolean canConnectItem(); + + Connection[] getExternalConnections(); + ITransferNetworkComponent[] getNetworkConnections(); + + } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java index bc52d96b..a5e3f9da 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java @@ -14,8 +14,11 @@ import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; import com.cleanroommc.modularui.widgets.slot.SlotGroup; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.ItemWalker; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.StepStrategy; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -23,16 +26,19 @@ import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class ItemTransferNodeLogic extends NetworkLogic { ItemStack[] buffer = new ItemStack[getSizeInventory()]; IInventory connectedInventory; + public ItemWalker walker; public ItemTransferNodeLogic(INodeLogicHost host) { - super(host); + walker = new ItemWalker(host); } public void updateEntity(INodeLogicHost host) { @@ -48,6 +54,16 @@ public void updateEntity(INodeLogicHost host) { } } + List target = walker.getValidTargets(); + if (target instanceof ISidedInventory) // Sided logic + { + + } + else // Basic logic + { + + } + if (connectedInventory != null) { importItems(); } @@ -58,12 +74,6 @@ public void updateEntity(INodeLogicHost host) { return; } walker.step(); - - walker.getValidTarget(); - if () - { - - } } public void importItems() { @@ -244,4 +254,19 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet return panel; } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java index 8d9fc5d7..5ed612b0 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java @@ -1,23 +1,26 @@ package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; +import cofh.api.energy.IEnergyReceiver; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.RandomWalker; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.WalkerBase; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.IFluidHandler; -public class NetworkLogic implements ITransferNetworkLogic +public abstract class NetworkLogic implements ITransferNetworkLogic { - private ITransferNetworkComponent[] connectedNeighbors = new ITransferNetworkComponent[6]; - private int neighborMask = 0; - public WalkerBase walker; + private ITransferNetworkComponent[] networkNeighbors = new ITransferNetworkComponent[6]; + private int networkMask = 0; + + private Connection[] externalConnections = new Connection[6]; + private int externalConnectionMask; + private boolean joined = false; - public NetworkLogic(ITransferNetworkComponent logicHost) - { - walker = new RandomWalker(logicHost); - } + public NetworkLogic() + {} @Override public void tryJoinWorld(ITransferNetworkComponent host) @@ -46,32 +49,105 @@ public void tryJoinWorld(ITransferNetworkComponent host) } } } + + updateExternalConnections(host); + } + + public void updateExternalConnections(ITransferNetworkComponent host) + { + for (int i = 0; i < 6; i++) + { + ForgeDirection dir = ForgeDirection.getOrientation(i); + + int xOffset = host.getX() + dir.offsetX; + int yOffset = host.getY() + dir.offsetY; + int zOffset = host.getZ() + dir.offsetZ; + + TileEntity neighborTE = null; + World world = host.getWorld(); + if (world.blockExists(xOffset, yOffset, zOffset)) + { + neighborTE = world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15); + } + + if (neighborTE instanceof ITransferNetworkComponent) + { + continue; + } + + // Just update the externals because it's way more painful to check if everything is the same. + // Just assume we're just now getting placed. + boolean setExternal = false; + if (neighborTE != null) + { + int flags = 0; + if (neighborTE instanceof IInventory) + { + flags |= 1; + setExternal = true; + } + if (neighborTE instanceof IFluidHandler) + { + flags |= 2; + setExternal = true; + } + if (neighborTE instanceof IEnergyReceiver) + { + flags |= 4; + setExternal = true; + } + if (setExternal) + { + host.addExternal(dir, new Connection(neighborTE, flags)); + } + } + + if (!setExternal) + { + host.removeExternal(dir); + } + } } + @Override public void separateWorld(ITransferNetworkComponent host) { - for(int i = 0; i < connectedNeighbors.length; i++) + for(int i = 0; i < networkNeighbors.length; i++) { - if (connectedNeighbors[i] != null) + if (networkNeighbors[i] != null) { - connectedNeighbors[i].removeNeighbor(ForgeDirection.getOrientation(i).getOpposite()); + networkNeighbors[i].removeNeighbor(ForgeDirection.getOrientation(i).getOpposite()); } } } + @Override + public void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor) + { + networkNeighbors[direction.ordinal()] = neighbor; + networkMask |= (1 << direction.ordinal()); + } + @Override public void removeNeighbor(ForgeDirection direction) { - connectedNeighbors[direction.ordinal()] = null; - neighborMask &= ~(1 << direction.ordinal()); + networkNeighbors[direction.ordinal()] = null; + networkMask &= ~(1 << direction.ordinal()); } @Override - public void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor) + public void addExternal(ForgeDirection direction, Connection neighbor) { - connectedNeighbors[direction.ordinal()] = neighbor; - neighborMask |= (1 << direction.ordinal()); + externalConnections[direction.ordinal()] = neighbor; + externalConnectionMask |= (1 << direction.ordinal()); + } + + @Override + public void removeExternal(ForgeDirection direction) + { + externalConnections[direction.ordinal()] = null; + externalConnectionMask &= ~(1 << direction.ordinal()); } @Override @@ -80,17 +156,46 @@ public MaskedArrayView getNeighborsExcluding(ForgeDir int mask; if (direction != null) { - mask = neighborMask & ~(1 << direction.ordinal()); + mask = networkMask & ~(1 << direction.ordinal()); } else { - mask = neighborMask; + mask = networkMask; } - return new MaskedArrayView<>(mask, connectedNeighbors); + return new MaskedArrayView<>(mask, networkNeighbors); + } + + @Override + public int getNetworkMask() { + return networkMask; + } + + @Override + public int getExternalMask() { + return externalConnectionMask; + } + + @Override + public void setNetworkMask(int mask) + { + networkMask = mask; } @Override - public int getNeighborMask() { - return neighborMask; + public void setExternalMask(int mask) + { + externalConnectionMask = mask; + } + + @Override + public Connection[] getExternalConnections() + { + return externalConnections; + } + + @Override + public ITransferNetworkComponent[] getNetworkConnections() + { + return networkNeighbors; } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/PipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/PipeLogic.java new file mode 100644 index 00000000..eac12307 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/PipeLogic.java @@ -0,0 +1,21 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + + +public class PipeLogic extends NetworkLogic +{ + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/collision/PipeCollision.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/collision/PipeCollision.java new file mode 100644 index 00000000..900a386c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/collision/PipeCollision.java @@ -0,0 +1,72 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.collision; + +import net.minecraft.util.AxisAlignedBB; + +public enum PipeCollision +{ + MIDDLE { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.375, 0.375, 0.375, 0.625, 0.625, 0.625); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }, + NORTH { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.375, 0.375, 0.0, 0.625, 0.625, 0.375); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }, + SOUTH { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.375, 0.375, 0.625, 0.625, 0.625, 1.0); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }, + EAST { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.625, 0.375, 0.375, 1.0, 0.625, 0.625); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }, + WEST { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.0, 0.375, 0.375, 0.375, 0.625, 0.625); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }, + UP { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.375, 0.625, 0.375, 0.625, 1.0, 0.625); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }, + DOWN { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.375, 0.0, 0.375, 0.625, 0.375, 0.625); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }; + + public abstract AxisAlignedBB getBoundingBox(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java index b7a5a373..de9e4437 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java @@ -1,14 +1,10 @@ package com.fouristhenumber.utilitiesinexcess.transfer.upgrade; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.WalkerBase; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.RandomWalker; import net.minecraft.item.ItemStack; import com.fouristhenumber.utilitiesinexcess.ModItems; import com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade; import com.fouristhenumber.utilitiesinexcess.common.recipe.DisableableItemStack; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.BFSWalker; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.DFSWalker; public enum TransferUpgrade { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BFSWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BFSWalker.java deleted file mode 100644 index 98c3edf1..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BFSWalker.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.walk; - -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; - -public class BFSWalker extends WalkerBase { - - public BFSWalker(ITransferNetworkComponent originComponent) { - super(originComponent); - } - - @Override - public void step() { -// for (TileEntity tile : ignore) { -// if (tile == null || tile.isInvalid()) { -// reset(); -// break; -// } -// } -// -// tanks.clear(); -// chests.clear(); -// -// -// currentTE = lastChoice.get(0); -// lastChoice.remove(0); -// ignore.add(currentTE); -// ArrayList extend=new ArrayList(0); -// -// -// action="Searching for inventories at\n"+ Arrays.toString(getRelative(originTE, currentTE)); -// -// ArrayList tiles = getAdjacentEntities(currentTE); -// -// for (TileEntity tile : tiles) { -// if (tile == null || ignore.contains(tile)) { -// continue; -// } -// -// if (tile instanceof ITransferNetworkComponent) //should.. work -// { -// extend.add(tile); // they i think used a bias random.. -// continue; -// } -// -// if (tile instanceof IInventory) { -// chests.add(tile); -// } -// -// if (tile instanceof IFluidHandler) { -// tanks.add(tile); -// } -// } -// -// Collections.shuffle(extend); -// lastChoice.addAll(extend); -// if (lastChoice.isEmpty()) {reset();} - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DFSWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DFSWalker.java deleted file mode 100644 index 201230bb..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DFSWalker.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.walk; - -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; - -public class DFSWalker extends WalkerBase { - - public DFSWalker(ITransferNetworkComponent originComponent) { - super(originComponent); - } - - @Override - public void step() - { -// for (TileEntity tile : ignore) -// { -// if (tile == null || tile.isInvalid()) //not sure why it would be null -// { -// reset(); -// break; -// // optional return here (Not sure if it returns WHEN dead) -// } -// } -// -// chests.clear(); -// tanks.clear(); -// -// currentTE = lastChoice.get(0); -// lastChoice.remove(0); -// ignore.add(current); -// -// action="Searching for inventories at\n"+ Arrays.toString(getRelative(original,current)); -// ArrayList tiles=getAdjacentEntities(current); -// ArrayList extend=new ArrayList(0); -// -// for (TileEntity tile: tiles) -// { -// if (tile==null || ignore.contains(tile)) {continue;} -// -// if (tile instanceof ITransferNetworkComponent) //should.. work -// { -// extend.add(tile); // they i think used a bias random.. -// continue; -// } -// if (tile instanceof IInventory) -// { -// chests.add(tile); -// } -// -// if (tile instanceof IFluidHandler) { -// tanks.add(tile); -// } -// } -// -// Collections.shuffle(extend); -// lastChoice.addAll(0,extend); -// if (lastChoice.isEmpty()) {reset();} - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java new file mode 100644 index 00000000..e0839ff6 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java @@ -0,0 +1,43 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.BFSStepper; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.DFSStepper; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.ItemTargetResolver; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.RandomStepper; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.RoundRobinStepper; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.StepStrategy; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.TargetResolver; +import net.minecraft.inventory.IInventory; + +import java.util.List; + +public class ItemWalker extends WalkerBase +{ + StepStrategy stepper; + TargetResolver targeter = new ItemTargetResolver(); + + public ItemWalker(ITransferNetworkComponent originComponent) + { + super(originComponent); + stepper = new RandomStepper(TransportType.ITEM); + } + + @Override + public void step() + { + currentComponent = stepper.step(currentComponent, walkingComponent); + } + + @Override + public List getValidTargets() + { + return targeter.getValidTargets(currentComponent); + } + + @Override + public void reset() + { + currentComponent = stepper.reset(currentComponent, walkingComponent); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RandomWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RandomWalker.java deleted file mode 100644 index 03c88d9d..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RandomWalker.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.walk; - -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; -import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; -import net.minecraftforge.common.util.ForgeDirection; - -import java.util.List; -import java.util.Random; - -public class RandomWalker extends WalkerBase -{ - - Random rand = new Random(); - public RandomWalker(ITransferNetworkComponent originComponent) - { - super(originComponent); - } - - @Override - public void step() - { - MaskedArrayView options = currentComponent.getWalkableDirs(walkingComponent, fromDirection); - if (options.size() != 0) - { - int direction = rand.nextInt(options.size()); - currentComponent = options.get(direction); - fromDirection = ForgeDirection.getOrientation(options.actualLocation(direction)).getOpposite(); - } - else - { - currentComponent = walkingComponent; - fromDirection = null; - } - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/TransportType.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/TransportType.java new file mode 100644 index 00000000..a4c798c7 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/TransportType.java @@ -0,0 +1,8 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk; + +public enum TransportType { + + ITEM, + FLUID, + ENERGY +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java index 5e1db88b..e9dfac76 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java @@ -1,28 +1,20 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; -import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; -public abstract class WalkerBase +public abstract class WalkerBase { protected ITransferNetworkComponent walkingComponent; protected ITransferNetworkComponent currentComponent; - protected ForgeDirection fromDirection; - - WalkerBase(ITransferNetworkComponent originComponent) + WalkerBase(ITransferNetworkComponent walkingComponent) { - this.walkingComponent = originComponent; - this.currentComponent = originComponent; + this.walkingComponent = walkingComponent; + this.currentComponent = walkingComponent; } - public abstract void step(); - public ITransferNetworkComponent getCurrentComponent() - { - return currentComponent; - } - public String getLocationString() { StringBuilder location = new StringBuilder(); @@ -35,8 +27,7 @@ public String getLocationString() return location.toString(); } - public void reset() - { - currentComponent = walkingComponent; - } + public abstract void reset(); + + public abstract List getValidTargets(); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/BFSStepper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/BFSStepper.java new file mode 100644 index 00000000..7a57a09a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/BFSStepper.java @@ -0,0 +1,24 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; + +public class BFSStepper extends StepStrategy +{ + + public BFSStepper(TransportType transporting) { + super(transporting); + } + + @Override + public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) + { + return null; + } + + @Override + public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) + { + return null; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/DFSStepper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/DFSStepper.java new file mode 100644 index 00000000..3b614ac2 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/DFSStepper.java @@ -0,0 +1,22 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; + +public class DFSStepper extends StepStrategy +{ + + public DFSStepper(TransportType transporting) { + super(transporting); + } + + @Override + public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) { + return null; + } + + @Override + public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) { + return null; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java new file mode 100644 index 00000000..04d10a37 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java @@ -0,0 +1,27 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import net.minecraft.inventory.IInventory; + +import java.util.ArrayList; +import java.util.List; + +public class ItemTargetResolver implements TargetResolver { + + @Override + public List getValidTargets(ITransferNetworkComponent from) + { + Connection[] conns = from.getExternalNeighbors(); + + List validTargets = new ArrayList<>(); + for (Connection conn : conns) + { + if (conn != null && (conn.flags() & 1) != 0) + { + validTargets.add((IInventory) conn.target()); + } + } + return validTargets; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RandomStepper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RandomStepper.java new file mode 100644 index 00000000..7d2e2101 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RandomStepper.java @@ -0,0 +1,41 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.Random; + +public class RandomStepper extends StepStrategy +{ + Random rand = new Random(); + + public RandomStepper(TransportType transporting) { + super(transporting); + } + + @Override + public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) + { + ITransferNetworkComponent newComponent; + MaskedArrayView options = currentComponent.getWalkableDirs(transporting, fromDirection); + if (options.size() != 0) + { + int direction = rand.nextInt(options.size()); + newComponent = options.get(direction); + fromDirection = ForgeDirection.getOrientation(options.actualLocation(direction)).getOpposite(); + } + else + { + newComponent = walkingComponent; + fromDirection = null; + } + return newComponent; + } + + @Override + public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) { + return currentComponent; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RoundRobinStepper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RoundRobinStepper.java new file mode 100644 index 00000000..8ee33658 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RoundRobinStepper.java @@ -0,0 +1,21 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; + +public class RoundRobinStepper extends StepStrategy +{ + public RoundRobinStepper(TransportType transporting) { + super(transporting); + } + + @Override + public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) { + return null; + } + + @Override + public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) { + return null; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java new file mode 100644 index 00000000..49f42ca9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java @@ -0,0 +1,27 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class StepStrategy +{ + protected ForgeDirection fromDirection; + protected TransportType transporting; + + public enum Strategy + { + RANDOM, + BFS, + DFS, + ROUND_ROBIN + } + + StepStrategy(TransportType type) + { + this.transporting = type; + } + + public abstract ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent); + public abstract ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java new file mode 100644 index 00000000..86899244 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java @@ -0,0 +1,12 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; + +import java.util.List; + +public interface TargetResolver +{ + List getValidTargets( + ITransferNetworkComponent from); +} From 1cd08daeb1d553f05235ee6f9574465c16d77b01 Mon Sep 17 00:00:00 2001 From: rjnasers Date: Sun, 17 May 2026 22:46:16 +0200 Subject: [PATCH 06/21] First node transfer logic done. --- .../transfer/SharedNodeLogic/Connection.java | 2 +- .../ItemTransferNodeLogic.java | 136 ++++++++++++++++-- .../SharedNodeLogic/NetworkLogic.java | 71 ++++----- .../transfer/walk/ItemWalker.java | 9 +- .../transfer/walk/WalkerBase.java | 6 +- .../walk/stepper/ItemTargetResolver.java | 6 +- .../transfer/walk/stepper/TargetResolver.java | 15 +- 7 files changed, 188 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java index 13e736ef..8a32088e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java @@ -4,4 +4,4 @@ import net.minecraft.tileentity.TileEntity; @Desugar -public record Connection(TileEntity target, int flags) {} +public record Connection(TileEntity target, int flags, int side) {} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java index a5e3f9da..1ee6aa62 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java @@ -16,12 +16,14 @@ import com.cleanroommc.modularui.widgets.slot.SlotGroup; import com.fouristhenumber.utilitiesinexcess.transfer.walk.ItemWalker; import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.StepStrategy; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.TargetResolver; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; @@ -46,6 +48,7 @@ public void updateEntity(INodeLogicHost host) { return; } + // TODO perhaps this can be moved to NetworkLogic if (connectedInventory == null) { ForgeDirection facing = host.getFacing(); TileEntity neighbor = host.getWorld().getTileEntity(host.getX() + facing.offsetX, host.getY() + facing.offsetY, host.getZ() + facing.offsetZ); @@ -54,14 +57,17 @@ public void updateEntity(INodeLogicHost host) { } } - List target = walker.getValidTargets(); - if (target instanceof ISidedInventory) // Sided logic + TargetResolver.Target target = walker.getValidTarget(); + if (target != null) { - - } - else // Basic logic - { - + if (target.handler instanceof ISidedInventory sidedInventory) // Sided logic + { + buffer[0] = TryInsertItemSided(sidedInventory, buffer[0], target.side); + } + else // Basic logic + { + buffer[0] = TryInsertItem(target.handler, buffer[0], target.side); + } } if (connectedInventory != null) { @@ -105,11 +111,125 @@ else if (buffer[0].isItemEqual(stackInSlot)) } } - public void exportItems() + public ItemStack TryInsertItemSided(ISidedInventory inventory, ItemStack stack, int side) + { + int[] slots = inventory.getAccessibleSlotsFromSide(side); + + for (int slot : slots) + { + if (stack == null || stack.stackSize <= 0) + { + return null; + } + + + if (!inventory.canInsertItem(slot, stack, side)) + { + continue; + } + ItemStack existing = inventory.getStackInSlot(slot); + + if (existing == null) + { + int max = Math.min(stack.getMaxStackSize(), inventory.getInventoryStackLimit()); + + ItemStack toInsert = stack.copy(); + toInsert.stackSize = Math.min(stack.stackSize, max); + + inventory.setInventorySlotContents(slot, toInsert); + stack.stackSize -= toInsert.stackSize; + + inventory.markDirty(); + } + else if (canStacksMerge(existing, stack)) + { + int max = Math.min(existing.getMaxStackSize(), inventory.getInventoryStackLimit()); + int space = max - existing.stackSize; + + if (space > 0) + { + int toMove = Math.min(space, stack.stackSize); + + existing.stackSize += toMove; + stack.stackSize -= toMove; + + inventory.markDirty(); + } + } + } + + return stack.stackSize <= 0 ? null : stack; + } + + public ItemStack TryInsertItem(IInventory inventory, ItemStack stack, int side) { + if (stack == null || stack.stackSize <= 0) + { + return null; + } + + int size = inventory.getSizeInventory(); + + // First pass: try to merge into existing stacks + for (int slot = 0; slot < size; slot++) + { + if (stack.stackSize <= 0) + { + return null; + } + ItemStack existing = inventory.getStackInSlot(slot); + + if (existing != null && canStacksMerge(existing, stack)) + { + int max = Math.min(existing.getMaxStackSize(), inventory.getInventoryStackLimit()); + int space = max - existing.stackSize; + + if (space > 0) + { + int toMove = Math.min(space, stack.stackSize); + + existing.stackSize += toMove; + stack.stackSize -= toMove; + + inventory.markDirty(); + } + } + } + + // Second pass: fill empty slots + for (int slot = 0; slot < size; slot++) + { + if (stack.stackSize <= 0) + { + return null; + } + + ItemStack existing = inventory.getStackInSlot(slot); + + if (existing == null) + { + int max = Math.min(stack.getMaxStackSize(), inventory.getInventoryStackLimit()); + + ItemStack toInsert = stack.copy(); + toInsert.stackSize = Math.min(stack.stackSize, max); + + inventory.setInventorySlotContents(slot, toInsert); + stack.stackSize -= toInsert.stackSize; + + inventory.markDirty(); + } + } + + return stack.stackSize <= 0 ? null : stack; } + private static boolean canStacksMerge(ItemStack a, ItemStack b) + { + return a.getItem() == b.getItem() + && a.getItemDamage() == b.getItemDamage() + && ItemStack.areItemStackTagsEqual(a, b); + } public void writeToNBT(NBTTagCompound nbt) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java index 5ed612b0..11a8f4b8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java @@ -55,56 +55,47 @@ public void tryJoinWorld(ITransferNetworkComponent host) public void updateExternalConnections(ITransferNetworkComponent host) { - for (int i = 0; i < 6; i++) - { + for (int i = 0; i < 6; i++) { ForgeDirection dir = ForgeDirection.getOrientation(i); - int xOffset = host.getX() + dir.offsetX; int yOffset = host.getY() + dir.offsetY; int zOffset = host.getZ() + dir.offsetZ; - - TileEntity neighborTE = null; World world = host.getWorld(); - if (world.blockExists(xOffset, yOffset, zOffset)) - { - neighborTE = world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15); - } - if (neighborTE instanceof ITransferNetworkComponent) - { - continue; - } + if (world.blockExists(xOffset, yOffset, zOffset) && host.canConnectToSide(dir)) { - // Just update the externals because it's way more painful to check if everything is the same. - // Just assume we're just now getting placed. - boolean setExternal = false; - if (neighborTE != null) - { - int flags = 0; - if (neighborTE instanceof IInventory) - { - flags |= 1; - setExternal = true; - } - if (neighborTE instanceof IFluidHandler) - { - flags |= 2; - setExternal = true; - } - if (neighborTE instanceof IEnergyReceiver) - { - flags |= 4; - setExternal = true; + + TileEntity neighborTE = world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15); + + if (neighborTE instanceof ITransferNetworkComponent) { + continue; } - if (setExternal) - { - host.addExternal(dir, new Connection(neighborTE, flags)); + + // Just update the externals because it's way more painful to check if everything is the same. + // Just assume we're just now getting placed. + boolean setExternal = false; + if (neighborTE != null) { + int flags = 0; + if (neighborTE instanceof IInventory) { + flags |= 1; + setExternal = true; + } + if (neighborTE instanceof IFluidHandler) { + flags |= 2; + setExternal = true; + } + if (neighborTE instanceof IEnergyReceiver) { + flags |= 4; + setExternal = true; + } + if (setExternal) { + host.addExternal(dir, new Connection(neighborTE, flags, i)); + } } - } - if (!setExternal) - { - host.removeExternal(dir); + if (!setExternal) { + host.removeExternal(dir); + } } } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java index e0839ff6..dd7493cb 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java @@ -30,9 +30,14 @@ public void step() } @Override - public List getValidTargets() + public TargetResolver.Target getValidTarget() { - return targeter.getValidTargets(currentComponent); + List> validTargets = targeter.getValidTargets(currentComponent); + if (validTargets.isEmpty()) + { + return null; + } + return validTargets.get(rand.nextInt(validTargets.size())); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java index e9dfac76..1d1f0e7e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java @@ -1,13 +1,17 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.TargetResolver; + import java.util.List; +import java.util.Random; public abstract class WalkerBase { protected ITransferNetworkComponent walkingComponent; protected ITransferNetworkComponent currentComponent; + Random rand = new Random(); WalkerBase(ITransferNetworkComponent walkingComponent) { this.walkingComponent = walkingComponent; @@ -29,5 +33,5 @@ public String getLocationString() public abstract void reset(); - public abstract List getValidTargets(); + public abstract TargetResolver.Target getValidTarget(); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java index 04d10a37..1b097dd5 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java @@ -10,16 +10,16 @@ public class ItemTargetResolver implements TargetResolver { @Override - public List getValidTargets(ITransferNetworkComponent from) + public List> getValidTargets(ITransferNetworkComponent from) { Connection[] conns = from.getExternalNeighbors(); - List validTargets = new ArrayList<>(); + List> validTargets = new ArrayList<>(); for (Connection conn : conns) { if (conn != null && (conn.flags() & 1) != 0) { - validTargets.add((IInventory) conn.target()); + validTargets.add(new Target<>((IInventory) conn.target(), conn.side())); } } return validTargets; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java index 86899244..d7c4263b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java @@ -1,12 +1,23 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; import java.util.List; public interface TargetResolver { - List getValidTargets( + List> getValidTargets( ITransferNetworkComponent from); + + class Target + { + public final T handler; + public final int side; + + public Target(T handler, int side) + { + this.handler = handler; + this.side = side; + } + } } From e119714f65ef0c0b8e13257f5038e34c4ea10f6d Mon Sep 17 00:00:00 2001 From: rjnasers Date: Mon, 25 May 2026 11:54:46 +0200 Subject: [PATCH 07/21] Finished Crossover pipes --- .../utilitiesinexcess/ModBlocks.java | 4 +- .../utilitiesinexcess/UtilitiesInExcess.java | 6 +- .../blocks/transfer/BlockTransferBase.java | 10 +- .../transfer/BlockTransferNodeBase.java | 1 + .../transfer/pipe/BlockCrossoverPipe.java | 124 ++++++++++ .../{ => pipe}/BlockTransferPipe.java | 5 +- .../transfer/TransferNodeRenderer.java | 3 +- .../transfer/TransferPipeRenderer.java | 39 ++-- .../transfer/ITransferNetworkComponent.java | 2 +- .../TileEntityNetworkComponentBase.java | 33 ++- .../transfer/TileEntityTransferNode.java | 8 +- .../transfer/TileEntityTransferNodeBase.java | 5 +- .../transfer/TileEntityTransferPipe.java | 26 --- .../pipe/TileEntityCrossoverPipe.java | 37 +++ .../transfer/pipe/TileEntityTransferPipe.java | 20 ++ .../SharedNodeLogic/CrossOverPipeLogic.java | 211 ++++++++++++++++++ .../ITransferNetworkLogic.java | 12 +- .../ItemTransferNodeLogic.java | 17 +- .../SharedNodeLogic/NetworkLogic.java | 143 +++++++----- .../transfer/SharedNodeLogic/PipeLogic.java | 6 + .../transfer/walk/ItemWalker.java | 2 +- .../walk/stepper/ItemTargetResolver.java | 5 +- .../transfer/walk/stepper/StepStrategy.java | 4 +- .../transfer/walk/stepper/TargetResolver.java | 3 +- .../textures/blocks/mod_sorting_pipe.png | Bin 0 -> 163 bytes .../textures/blocks/sorting_pipe.png | Bin 0 -> 170 bytes .../textures/blocks/transfer_pipe.png | Bin 167 -> 650 bytes 27 files changed, 580 insertions(+), 146 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockCrossoverPipe.java rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/{ => pipe}/BlockTransferPipe.java (96%) delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/CrossOverPipeLogic.java create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/mod_sorting_pipe.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/sorting_pipe.png diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index a81b0b7b..7861b14f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -1,5 +1,6 @@ package com.fouristhenumber.utilitiesinexcess; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockCrossoverPipe; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.item.Item; @@ -59,7 +60,7 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeEnergy; //import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeFluid; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeHyperEnergy; -import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferPipe; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockTransferPipe; import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderLotusConfig; @@ -166,6 +167,7 @@ public enum ModBlocks { DECORATIVE_BLOCKS(BlockConfig.enableDecorativeBlocks, new BlockDecorative(), BlockDecorative.ItemBlockDecorative.class, "decorative_block"), //TODO: Config TRANSFER_PIPE(true, new BlockTransferPipe(), "transfer_pipe"), + CROSSOVER_PIPE(true, new BlockCrossoverPipe(), "crossover_pipe"), TRANSFER_NODE(true, new BlockTransferNode(), "transfer_node"), // TRANSFER_NODE_FLUID(true, new BlockTransferNodeFluid(), "transfer_node_fluid"), TRANSFER_NODE_ENERGY(true, new BlockTransferNodeEnergy(), "transfer_node_energy"), diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index a818ee8c..63add249 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -2,7 +2,8 @@ //import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityRetrievalNode; import codechicken.lib.world.TileChunkLoadHook; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityCrossoverPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -55,7 +56,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityTNTGenerator; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; //import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeFluid; -//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; +//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; import com.fouristhenumber.utilitiesinexcess.common.worldgen.WorldGenEnderLotus; import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPRecipeLoader; import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.Content; @@ -167,6 +168,7 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityPacifistsBench.class, "TileEntityPacifistsBenchUIE"); GameRegistry.registerTileEntity(TileEntityTradingPost.class, "TileEntityTradingPostUIE"); GameRegistry.registerTileEntity(TileEntityTransferPipe.class, "TileEntityTransferPipeUIE"); + GameRegistry.registerTileEntity(TileEntityCrossoverPipe.class, "TileEntityCrossoverPipeUIE"); // GameRegistry.registerTileEntity(TileEntityRetrievalNode.class,"TileEntityRetrievalNodeUIE"); // not sure if i did the naming correctly GameRegistry.registerTileEntity(TileEntityTransferNode.class, "TileEntityTransferNodeUIE"); // GameRegistry.registerTileEntity(TileEntityTransferNodeFluid.class, "TileEntityTransferNodeFluidUIE"); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferBase.java index 6325c5c5..46b47701 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferBase.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeBase; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -19,10 +20,13 @@ public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neig { TileEntity te = worldIn.getTileEntity(x, y, z); - if (!(te instanceof ITransferNetworkComponent component)) + if (te instanceof ITransferNetworkComponent component) { - return; + component.updateExternalConnections(); + if (component instanceof TileEntityTransferNodeBase nodeComponent) + { + nodeComponent.updateSourceInventory(); + } } - component.updateExternalConnections(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java index 46eb4835..b5f50ea7 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java @@ -2,6 +2,7 @@ import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferNodeRenderID; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockCrossoverPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockCrossoverPipe.java new file mode 100644 index 00000000..3292be89 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockCrossoverPipe.java @@ -0,0 +1,124 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferBase; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityCrossoverPipe; +import com.fouristhenumber.utilitiesinexcess.transfer.collision.PipeCollision; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import java.util.List; + +import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; + +public class BlockCrossoverPipe extends BlockTransferBase +{ + public BlockCrossoverPipe() { + super(Material.iron); + this.setBlockName("crossover_pipe"); + this.setBlockTextureName("utilitiesinexcess:transfer_pipe"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityCrossoverPipe(); + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean hasTileEntity(int metadata) + { + return true; + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) + { + TileEntityCrossoverPipe te = (TileEntityCrossoverPipe) world.getTileEntity(x, y, z); + if (te == null) return; + + int mask = te.getRawConnectionMask(); + + float minY = (mask & (1 << 0)) != 0 ? 0F : 0.375F; // DOWN (-Y) + float maxY = (mask & (1 << 1)) != 0 ? 1F : 0.625F; // UP (+Y) + + float minZ = (mask & (1 << 2)) != 0 ? 0F : 0.375F; // NORTH (-Z) + float maxZ = (mask & (1 << 3)) != 0 ? 1F : 0.625F; // SOUTH (+Z) + + float minX = (mask & (1 << 4)) != 0 ? 0F : 0.375F; // WEST (-X) + float maxX = (mask & (1 << 5)) != 0 ? 1F : 0.625F; // EAST (+X) + + this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ); + } + + @Override + public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, List list, Entity collider) + { + TileEntityCrossoverPipe te = (TileEntityCrossoverPipe) worldIn.getTileEntity(x, y, z); + if (te == null) return; + + int connectionMask = te.getRawConnectionMask(); + + AxisAlignedBB boundingBox = PipeCollision.MIDDLE.getBoundingBox().copy().offset(x, y, z); + if (boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.DOWN.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 0)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.UP.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 1)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.NORTH.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 2)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.SOUTH.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 3)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.WEST.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 4)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.EAST.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 5)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + } + + @Override + public int getRenderType() + { + return transferPipeRenderID; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockTransferPipe.java similarity index 96% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockTransferPipe.java index a107cf6d..1db628c8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockTransferPipe.java @@ -1,7 +1,8 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferBase; import com.fouristhenumber.utilitiesinexcess.transfer.collision.PipeCollision; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; @@ -10,7 +11,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; import java.util.List; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java index a410a248..c659fbb8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java @@ -4,6 +4,7 @@ import static com.fouristhenumber.utilitiesinexcess.common.renderers.transfer.TransferPipeRenderer.RenderPipes; import static com.fouristhenumber.utilitiesinexcess.utils.RenderUtils.renderInventoryCube; +import com.fouristhenumber.utilitiesinexcess.ModBlocks; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; @@ -128,7 +129,7 @@ public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block b int mask = te.getRawConnectionMask(); - RenderPipes(mask, x, y, z, renderer, mask != 0); + RenderPipes(mask, x, y, z, ModBlocks.TRANSFER_PIPE.get(), renderer, mask != 0); return true; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java index c1a007a8..4a41d2a4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java @@ -3,13 +3,13 @@ import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; import static com.fouristhenumber.utilitiesinexcess.utils.RenderUtils.renderInventoryCube; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockCrossoverPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; -import com.fouristhenumber.utilitiesinexcess.ModBlocks; import com.gtnewhorizons.angelica.api.ThreadSafeISBRH; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; @@ -17,13 +17,20 @@ @ThreadSafeISBRH(perThread = false) public class TransferPipeRenderer implements ISimpleBlockRenderingHandler { - public static void RenderPipes(int mask, int x, int y, int z, RenderBlocks renderer, boolean renderCenter) { - - Block block = ModBlocks.TRANSFER_PIPE.get(); + public static void RenderPipes(int mask, int x, int y, int z, Block block, RenderBlocks renderer, boolean renderCenter) { if (renderCenter) { - renderer.setRenderBounds(0.375, 0.375, 0.375, 0.625, 0.625, 0.625); - renderer.renderStandardBlock(block, x, y, z); + if (block instanceof BlockCrossoverPipe) + { + renderer.setRenderBounds(0.3125, 0.3125, 0.3125, 0.6875, 0.6875, 0.6875); + renderer.renderStandardBlock(block, x, y, z); + } + else + { + renderer.setRenderBounds(0.375, 0.375, 0.375, 0.625, 0.625, 0.625); + renderer.renderStandardBlock(block, x, y, z); + } + } // -Y (down) @@ -70,10 +77,16 @@ public void renderInventoryBlock(Block block, int metadata, int modelId, RenderB tess.startDrawingQuads(); tess.setNormal(0, 1, 0); - renderer.setRenderBounds(0.375, 0.375, 0.375, 0.625, 0.625, 0.625); - renderInventoryCube(renderer, block, metadata); - renderer.setRenderBounds(0.625, 0.375, 0.375, 1.0, 0.625, 0.625); - renderInventoryCube(renderer, block, metadata); + if (block instanceof BlockCrossoverPipe) + { + renderer.setRenderBounds(0.3125, 0.3125, 0.3125, 0.6875, 0.6875, 0.6875); + renderInventoryCube(renderer, block, metadata); + } + else + { + renderer.setRenderBounds(0.625, 0.375, 0.375, 1.0, 0.625, 0.625); + renderInventoryCube(renderer, block, metadata); + } renderer.setRenderBounds(0.0, 0.375, 0.375, 0.375, 0.625, 0.625); renderInventoryCube(renderer, block, metadata); renderer.setRenderBounds(0.375, 0.625, 0.375, 0.625, 1.0, 0.625); @@ -91,10 +104,10 @@ public void renderInventoryBlock(Block block, int metadata, int modelId, RenderB @Override public boolean renderWorldBlock(IBlockAccess worldAccess, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - TileEntityTransferPipe te = (TileEntityTransferPipe) worldAccess.getTileEntity(x, y, z); + TileEntityNetworkComponentBase te = (TileEntityNetworkComponentBase) worldAccess.getTileEntity(x, y, z); if (te == null) return false; - RenderPipes(te.getRawConnectionMask(), x, y, z, renderer, true); + RenderPipes(te.getRawConnectionMask(), x, y, z, block, renderer, true); return true; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java index 7e180d71..73c3a8ed 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java @@ -18,7 +18,7 @@ public interface ITransferNetworkComponent void addExternal(ForgeDirection direction, Connection neighbor); void removeExternal(ForgeDirection direction); - Connection[] getExternalNeighbors(); + Connection[] getValidExternalNeighbors(ForgeDirection fromDirection); ITransferNetworkComponent[] getNetworkNeighbors(); MaskedArrayView getWalkableDirs(TransportType targetType, ForgeDirection fromDirection); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java index c88afbf0..32a75c19 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java @@ -10,34 +10,34 @@ import net.minecraftforge.common.util.ForgeDirection; -public abstract class TileEntityNetworkComponentBase extends TileEntity implements ITransferNetworkComponent, IChunkLoadTile +public abstract class TileEntityNetworkComponentBase extends TileEntity implements ITransferNetworkComponent, IChunkLoadTile { - protected abstract ITransferNetworkLogic getNetworkLogic(); + protected T logic; /// See implemented class IChunkLoadTile for why we need to implement all of these. @Override public void invalidate() { super.invalidate(); - getNetworkLogic().separateWorld(this); + logic.separateWorld(); } @Override public void onChunkUnload() { - getNetworkLogic().separateWorld(this); + logic.separateWorld(); } @Override public void validate() { super.validate(); - getNetworkLogic().tryJoinWorld(this); + logic.tryJoinWorld(); } @Override public void onChunkLoad() { - getNetworkLogic().tryJoinWorld(this); + logic.tryJoinWorld(); } @Override @@ -63,57 +63,56 @@ public int getZ() { @Override public void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor) { - getNetworkLogic().addNeighbor(direction, neighbor); + logic.addNeighbor(direction, neighbor); } @Override public void addExternal(ForgeDirection direction, Connection neighbor) { - getNetworkLogic().addExternal(direction, neighbor); + logic.addExternal(direction, neighbor); } @Override public void removeExternal(ForgeDirection direction) { - getNetworkLogic().removeExternal(direction); + logic.removeExternal(direction); } @Override public void removeNeighbor(ForgeDirection direction) { - getNetworkLogic().removeNeighbor(direction); + logic.removeNeighbor(direction); } @Override public void updateExternalConnections() { - getNetworkLogic().updateExternalConnections(this); + logic.updateExternalConnections(); } @Override - public Connection[] getExternalNeighbors() + public Connection[] getValidExternalNeighbors(ForgeDirection fromDirection) { - return getNetworkLogic().getExternalConnections(); + return logic.getValidExternalConnections(fromDirection); } @Override public ITransferNetworkComponent[] getNetworkNeighbors() { - return getNetworkLogic().getNetworkConnections(); + return logic.getNetworkConnections(); } // TODO make better @Override public MaskedArrayView getWalkableDirs(TransportType targetType, ForgeDirection fromDirection) { - return getNetworkLogic().getNeighborsExcluding(fromDirection); + return logic.getWalkableDirs(fromDirection); } @Override public int getRawConnectionMask() { - ITransferNetworkLogic logic = getNetworkLogic(); - logic.updateExternalConnections(this); + logic.updateExternalConnections(); return logic.getNetworkMask() | logic.getExternalMask(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java index 26ada0ca..c18d4a5c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java @@ -15,10 +15,9 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; -public class TileEntityTransferNode extends TileEntityTransferNodeBase +public class TileEntityTransferNode extends TileEntityTransferNodeBase implements IGuiHolder { - ItemTransferNodeLogic logic; public TileEntityTransferNode() { @@ -154,7 +153,8 @@ public boolean canExtractItem(int slot, ItemStack stack, int side) } @Override - protected ITransferNetworkLogic getNetworkLogic() { - return logic; + public void updateSourceInventory() + { + logic.updateSourceInventory(this); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java index fb5d9269..2c8577e9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java @@ -1,12 +1,13 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.INodeLogicHost; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ITransferNetworkLogic; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraftforge.common.util.ForgeDirection; -public abstract class TileEntityTransferNodeBase extends TileEntityNetworkComponentBase +public abstract class TileEntityTransferNodeBase extends TileEntityNetworkComponentBase implements INodeLogicHost { @@ -36,4 +37,6 @@ public boolean canConnectToSide(ForgeDirection side) public ForgeDirection getFacing() { return ForgeDirection.getOrientation(worldObj.getBlockMetadata(xCoord, yCoord, zCoord)); } + + public abstract void updateSourceInventory(); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java deleted file mode 100644 index b50611d4..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; - -import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ITransferNetworkLogic; -import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; -import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.PipeLogic; -import net.minecraftforge.common.util.ForgeDirection; - -public class TileEntityTransferPipe extends TileEntityNetworkComponentBase -{ - private final NetworkLogic logic; - - public TileEntityTransferPipe() - { - logic = new PipeLogic(); - } - - @Override - public boolean canConnectToSide(ForgeDirection side) { - return true; - } - - @Override - protected ITransferNetworkLogic getNetworkLogic() { - return logic; - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java new file mode 100644 index 00000000..88f5bd91 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java @@ -0,0 +1,37 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; + +import cofh.api.energy.IEnergyReceiver; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.CrossOverPipeLogic; +import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.IFluidHandler; + +public class TileEntityCrossoverPipe extends TileEntityNetworkComponentBase +{ + public TileEntityCrossoverPipe() + { + logic = new CrossOverPipeLogic(this); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) + { + ForgeDirection oppositeSide = side.getOpposite(); + + int xOffset = xCoord + oppositeSide.offsetX; + int yOffset = yCoord + oppositeSide.offsetY; + int zOffset = zCoord + oppositeSide.offsetZ; + if (worldObj.blockExists(xOffset, yOffset, zOffset)) + { + TileEntity candidateTE = worldObj.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15); + if (candidateTE instanceof TileEntityNetworkComponentBase networkableTE) + { + return networkableTE.canConnectToSide(side); + } + return candidateTE instanceof IInventory || candidateTE instanceof IFluidHandler || candidateTE instanceof IEnergyReceiver; + } + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java new file mode 100644 index 00000000..283955bb --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java @@ -0,0 +1,20 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.PipeLogic; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityTransferPipe extends TileEntityNetworkComponentBase +{ + + public TileEntityTransferPipe() + { + logic = new PipeLogic(this); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) + { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/CrossOverPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/CrossOverPipeLogic.java new file mode 100644 index 00000000..bb2f80a1 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/CrossOverPipeLogic.java @@ -0,0 +1,211 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + +import cofh.api.energy.IEnergyReceiver; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.IFluidHandler; + +// Crossover pipes are unique in that they are the only pipe that when they are updated they will affect neighbor status +// of blocks that are not directly adjacent, thus they must have special neighbor logic. +public class CrossOverPipeLogic extends NetworkLogic +{ + public CrossOverPipeLogic(ITransferNetworkComponent host) { + super(host); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } + + @Override + public void addNeighbor(ForgeDirection dir, ITransferNetworkComponent neighbor) + { + ForgeDirection opp = dir.getOpposite(); + + // Add our original neighbor + networkNeighbors[dir.ordinal()] = neighbor; + networkMask |= (1 << dir.ordinal()); + + World world = host.getWorld(); + + // Gets the block on the opposite side of the crossover pipe. + int x = host.getX(); + int y = host.getY(); + int z = host.getZ(); + + int xOffset = x + opp.offsetX; + int yOffset = y + opp.offsetY; + int zOffset = z + opp.offsetZ; + + // Since we know that the only time this is called is when the opposite item is valid to connect too. + // So we should add that item. + // What we don't know is if that item is a network connection or an external connection. So we need to check for it. + if (world.blockExists(xOffset, yOffset, zOffset)) + { + TileEntity candidate = world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15); + + if (candidate instanceof ITransferNetworkComponent component) + { + if (component.canConnectToSide(dir)) + { + component.addNeighbor(dir, host); + networkNeighbors[opp.ordinal()] = component; + networkMask |= (1 << opp.ordinal()); + } + } + else + { + int connectionFlags = resolveExternalConnection(candidate); + if (connectionFlags != 0) // Pretty sure this should never happen but might as well check. + { + externalConnections[opp.ordinal()] = new Connection(candidate, connectionFlags, opp.ordinal()); + externalConnectionMask |= (1 << opp.ordinal()); + } + } + } + world.markBlockForUpdate(x, y, z); + } + + @Override + public void removeNeighbor(ForgeDirection dir) + { + ForgeDirection opp = dir.getOpposite(); + + networkNeighbors[dir.ordinal()] = null; + networkMask &= ~(1 << dir.ordinal()); + + World world = host.getWorld(); + + // Gets the block on the opposite side of the crossover pipe. + int x = host.getX(); + int y = host.getY(); + int z = host.getZ(); + + int xOffset = x + opp.offsetX; + int yOffset = y + opp.offsetY; + int zOffset = z + opp.offsetZ; + + // Since we know that the only time this is called is when the opposite neighbor is no longer valid to connect to + // So we should remove that + if (world.blockExists(xOffset, yOffset, zOffset) && + world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15) + instanceof ITransferNetworkComponent component) + { + component.removeNeighbor(dir); + networkNeighbors[opp.ordinal()] = null; + networkMask &= ~(1 << opp.ordinal()); + } + else // We can just blindly remove this because even if it's there (which it should certainly be) It needs to be null no matter what. + { + externalConnections[opp.ordinal()] = null; + externalConnectionMask &= ~(1 << opp.ordinal()); + } + world.markBlockForUpdate(x, y, z); + } + + @Override + public void addExternal(ForgeDirection dir, Connection neighbor) + { + ForgeDirection opp = dir.getOpposite(); + + // Gets the block on the opposite side of the crossover pipe. + + World world = host.getWorld(); + + int x = host.getX(); + int y = host.getY(); + int z = host.getZ(); + + int xOffset = x + opp.offsetX; + int yOffset = y + opp.offsetY; + int zOffset = z + opp.offsetZ; + + // Same deal as with network neighbors. We need to check if there's an opposing network neighbor that needs to be added (which there should be) + // when we add this external connection. + // I see no reason to support external to external connections with a crossover pipe. + if (world.blockExists(xOffset, yOffset, zOffset)) + { + TileEntity candidate = world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15); + if (candidate instanceof ITransferNetworkComponent component) + { + if (component.canConnectToSide(dir) && host.canConnectToSide(opp)) + { + component.addNeighbor(dir, host); + + // Only add the connection if the connection is not external to external + externalConnections[dir.ordinal()] = neighbor; + externalConnectionMask |= (1 << dir.ordinal()); + + networkNeighbors[opp.ordinal()] = component; + networkMask |= (1 << opp.ordinal()); + } + } + } + host.getWorld().markBlockForUpdate(host.getX(), host.getY(), host.getZ()); + } + + @Override + public void removeExternal(ForgeDirection dir) + { + ForgeDirection opp = dir.getOpposite(); + + // Same deal as with network neighbors. We need to check if there's an opposing network neighbor that needs to be removed + // when we remove this external connection + externalConnections[dir.ordinal()] = null; + externalConnectionMask &= ~(1 << dir.ordinal()); + + World world = host.getWorld(); + + // Gets the block on the opposite side of the crossover pipe. + int x = host.getX(); + int y = host.getY(); + int z = host.getZ(); + + int xOffset = x + opp.offsetX; + int yOffset = y + opp.offsetY; + int zOffset = z + opp.offsetZ; + + if (world.blockExists(xOffset, yOffset, zOffset) && + world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15) + instanceof ITransferNetworkComponent component) + { + component.removeNeighbor(dir); + networkNeighbors[opp.ordinal()] = null; + networkMask &= ~(1 << opp.ordinal()); + } + + host.getWorld().markBlockForUpdate(host.getX(), host.getY(), host.getZ()); + } + + // Only valid walkable neighbor is across from the fromDirection + @Override + public MaskedArrayView getWalkableDirs(ForgeDirection incomingDirection) + { + int mask = 0; + mask |= (1 << incomingDirection.getOpposite().ordinal()); + return new MaskedArrayView<>(mask, networkNeighbors); + } + + // Only valid external connection is across from the fromDirection + @Override + public Connection[] getValidExternalConnections(ForgeDirection fromDirection) + { + return new Connection[]{externalConnections[fromDirection.getOpposite().ordinal()]}; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java index 2f79fbac..e4df8b12 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java @@ -2,15 +2,14 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; -import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; public interface ITransferNetworkLogic { - void separateWorld(ITransferNetworkComponent host); + void separateWorld(); - void tryJoinWorld(ITransferNetworkComponent host); - void updateExternalConnections(ITransferNetworkComponent host); + void tryJoinWorld(); + void updateExternalConnections(); void addExternal(ForgeDirection direction, Connection neighbor); void removeExternal(ForgeDirection direction); @@ -18,10 +17,11 @@ public interface ITransferNetworkLogic void removeNeighbor(ForgeDirection direction); void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor); - MaskedArrayView getNeighborsExcluding(ForgeDirection direction); + MaskedArrayView getWalkableDirs(ForgeDirection direction); int getNetworkMask(); int getExternalMask(); + void setNetworkMask(int mask); void setExternalMask(int mask); @@ -29,7 +29,7 @@ public interface ITransferNetworkLogic boolean canConnectFluid(); boolean canConnectItem(); - Connection[] getExternalConnections(); + Connection[] getValidExternalConnections(ForgeDirection fromDirection); ITransferNetworkComponent[] getNetworkConnections(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java index 1ee6aa62..40022af1 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java @@ -40,6 +40,7 @@ public class ItemTransferNodeLogic extends NetworkLogic public ItemTransferNodeLogic(INodeLogicHost host) { + super(host); walker = new ItemWalker(host); } @@ -50,11 +51,7 @@ public void updateEntity(INodeLogicHost host) { // TODO perhaps this can be moved to NetworkLogic if (connectedInventory == null) { - ForgeDirection facing = host.getFacing(); - TileEntity neighbor = host.getWorld().getTileEntity(host.getX() + facing.offsetX, host.getY() + facing.offsetY, host.getZ() + facing.offsetZ); - if (neighbor instanceof IInventory inventory) { - connectedInventory = inventory; - } + updateSourceInventory(host); } TargetResolver.Target target = walker.getValidTarget(); @@ -122,7 +119,6 @@ public ItemStack TryInsertItemSided(ISidedInventory inventory, ItemStack stack, return null; } - if (!inventory.canInsertItem(slot, stack, side)) { continue; @@ -389,4 +385,13 @@ public boolean canConnectFluid() { public boolean canConnectItem() { return true; } + + public void updateSourceInventory(INodeLogicHost host) + { + ForgeDirection facing = host.getFacing(); + TileEntity neighbor = host.getWorld().getTileEntity(host.getX() + facing.offsetX, host.getY() + facing.offsetY, host.getZ() + facing.offsetZ); + if (neighbor instanceof IInventory inventory) { + connectedInventory = inventory; + } + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java index 11a8f4b8..0f1d83bc 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java @@ -9,21 +9,26 @@ import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.IFluidHandler; +// TODO is it really safe to be doing all of this stuff on world join/separation??? public abstract class NetworkLogic implements ITransferNetworkLogic { - private ITransferNetworkComponent[] networkNeighbors = new ITransferNetworkComponent[6]; - private int networkMask = 0; + ITransferNetworkComponent host; - private Connection[] externalConnections = new Connection[6]; - private int externalConnectionMask; + protected ITransferNetworkComponent[] networkNeighbors = new ITransferNetworkComponent[6]; + protected int networkMask = 0; + + protected Connection[] externalConnections = new Connection[6]; + protected int externalConnectionMask = 0; private boolean joined = false; - public NetworkLogic() - {} + public NetworkLogic(ITransferNetworkComponent host) + { + this.host = host; + } @Override - public void tryJoinWorld(ITransferNetworkComponent host) + public void tryJoinWorld() { World world = host.getWorld(); int x = host.getX(); @@ -32,28 +37,12 @@ public void tryJoinWorld(ITransferNetworkComponent host) if (!joined && world != null && world.blockExists(x, y, z)) { joined = true; - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - { - int xOffset = x + dir.offsetX; - int yOffset = y + dir.offsetY; - int zOffset = z + dir.offsetZ; - if (world.blockExists(xOffset, yOffset, zOffset) && - world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15) - instanceof ITransferNetworkComponent component) - { - if (component.canConnectToSide(dir.getOpposite())) - { - component.addNeighbor(dir.getOpposite(), host); - addNeighbor(dir, component); - } - } - } + updateNetworkConnections(world, x, y, z); + updateExternalConnections(); } - - updateExternalConnections(host); } - public void updateExternalConnections(ITransferNetworkComponent host) + public void updateExternalConnections() { for (int i = 0; i < 6; i++) { ForgeDirection dir = ForgeDirection.getOrientation(i); @@ -62,47 +51,68 @@ public void updateExternalConnections(ITransferNetworkComponent host) int zOffset = host.getZ() + dir.offsetZ; World world = host.getWorld(); - if (world.blockExists(xOffset, yOffset, zOffset) && host.canConnectToSide(dir)) { - - + if (world.blockExists(xOffset, yOffset, zOffset) && host.canConnectToSide(dir)) + { TileEntity neighborTE = world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15); - - if (neighborTE instanceof ITransferNetworkComponent) { + if (neighborTE instanceof ITransferNetworkComponent) + { continue; } // Just update the externals because it's way more painful to check if everything is the same. // Just assume we're just now getting placed. - boolean setExternal = false; - if (neighborTE != null) { - int flags = 0; - if (neighborTE instanceof IInventory) { - flags |= 1; - setExternal = true; - } - if (neighborTE instanceof IFluidHandler) { - flags |= 2; - setExternal = true; - } - if (neighborTE instanceof IEnergyReceiver) { - flags |= 4; - setExternal = true; - } - if (setExternal) { - host.addExternal(dir, new Connection(neighborTE, flags, i)); - } + int flags = resolveExternalConnection(neighborTE); + if (flags != 0) + { + addExternal(dir, new Connection(neighborTE, flags, i)); } - - if (!setExternal) { - host.removeExternal(dir); + else + { + removeExternal(dir); } } } } + protected int resolveExternalConnection(TileEntity neighborTE) + { + int flags = 0; + if (neighborTE != null) { + if (neighborTE instanceof IInventory) { + flags |= 1; + } + if (neighborTE instanceof IFluidHandler) { + flags |= 2; + } + if (neighborTE instanceof IEnergyReceiver) { + flags |= 4; + } + } + return flags; + } + + public void updateNetworkConnections(World world, int x, int y, int z) + { + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + { + int xOffset = x + dir.offsetX; + int yOffset = y + dir.offsetY; + int zOffset = z + dir.offsetZ; + if (world.blockExists(xOffset, yOffset, zOffset) && + world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15) + instanceof ITransferNetworkComponent component) + { + if (component.canConnectToSide(dir.getOpposite()) && host.canConnectToSide(dir)) + { + component.addNeighbor(dir.getOpposite(), host); + addNeighbor(dir, component); + } + } + } + } @Override - public void separateWorld(ITransferNetworkComponent host) + public void separateWorld() { for(int i = 0; i < networkNeighbors.length; i++) { @@ -118,6 +128,7 @@ public void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neig { networkNeighbors[direction.ordinal()] = neighbor; networkMask |= (1 << direction.ordinal()); + host.getWorld().markBlockForUpdate(host.getX(), host.getY(), host.getZ()); } @Override @@ -125,6 +136,7 @@ public void removeNeighbor(ForgeDirection direction) { networkNeighbors[direction.ordinal()] = null; networkMask &= ~(1 << direction.ordinal()); + host.getWorld().markBlockForUpdate(host.getX(), host.getY(), host.getZ()); } @Override @@ -132,6 +144,7 @@ public void addExternal(ForgeDirection direction, Connection neighbor) { externalConnections[direction.ordinal()] = neighbor; externalConnectionMask |= (1 << direction.ordinal()); + host.getWorld().markBlockForUpdate(host.getX(), host.getY(), host.getZ()); } @Override @@ -139,15 +152,16 @@ public void removeExternal(ForgeDirection direction) { externalConnections[direction.ordinal()] = null; externalConnectionMask &= ~(1 << direction.ordinal()); + host.getWorld().markBlockForUpdate(host.getX(), host.getY(), host.getZ()); } @Override - public MaskedArrayView getNeighborsExcluding(ForgeDirection direction) + public MaskedArrayView getWalkableDirs(ForgeDirection incomingDirection) { int mask; - if (direction != null) + if (incomingDirection != null) { - mask = networkMask & ~(1 << direction.ordinal()); + mask = networkMask & ~(1 << incomingDirection.ordinal()); } else { @@ -156,6 +170,21 @@ public MaskedArrayView getNeighborsExcluding(ForgeDir return new MaskedArrayView<>(mask, networkNeighbors); } +// @Override +// public MaskedArrayView getNeighborsExcluding(ForgeDirection direction) +// { +// int mask; +// if (direction != null) +// { +// mask = networkMask & ~(1 << direction.ordinal()); +// } +// else +// { +// mask = networkMask; +// } +// return new MaskedArrayView<>(mask, networkNeighbors); +// } + @Override public int getNetworkMask() { return networkMask; @@ -179,7 +208,7 @@ public void setExternalMask(int mask) } @Override - public Connection[] getExternalConnections() + public Connection[] getValidExternalConnections(ForgeDirection fromDirection) { return externalConnections; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/PipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/PipeLogic.java index eac12307..29825827 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/PipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/PipeLogic.java @@ -1,9 +1,15 @@ package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; + public class PipeLogic extends NetworkLogic { + public PipeLogic(ITransferNetworkComponent host) { + super(host); + } + @Override public boolean canConnectEnergy() { return true; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java index dd7493cb..25816779 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java @@ -32,7 +32,7 @@ public void step() @Override public TargetResolver.Target getValidTarget() { - List> validTargets = targeter.getValidTargets(currentComponent); + List> validTargets = targeter.getValidTargets(currentComponent, stepper.fromDirection); if (validTargets.isEmpty()) { return null; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java index 1b097dd5..9880841b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java @@ -3,6 +3,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; import net.minecraft.inventory.IInventory; +import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; @@ -10,9 +11,9 @@ public class ItemTargetResolver implements TargetResolver { @Override - public List> getValidTargets(ITransferNetworkComponent from) + public List> getValidTargets(ITransferNetworkComponent from, ForgeDirection fromDir) { - Connection[] conns = from.getExternalNeighbors(); + Connection[] conns = from.getValidExternalNeighbors(fromDir); List> validTargets = new ArrayList<>(); for (Connection conn : conns) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java index 49f42ca9..09c9bc2b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java @@ -6,8 +6,8 @@ public abstract class StepStrategy { - protected ForgeDirection fromDirection; - protected TransportType transporting; + public ForgeDirection fromDirection; + public TransportType transporting; public enum Strategy { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java index d7c4263b..8e114733 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java @@ -1,13 +1,14 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import net.minecraftforge.common.util.ForgeDirection; import java.util.List; public interface TargetResolver { List> getValidTargets( - ITransferNetworkComponent from); + ITransferNetworkComponent from, ForgeDirection fromDir); class Target { diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/mod_sorting_pipe.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/mod_sorting_pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..91a939234fcedf7e5975a28a0d16b62516f996ad GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Vm)0PLo9le zQw}heZPog}|IpM!2Y_I~=Ul$#=&!MEIj?3ENIK|9m^L&v7KX3>R39_xyts45$%s2_ z8xAbulI1u*=kSMb&+R$V4TTTiE_w5c?H+eTu=wE&uO;gl8E$*Xt+|?hDFtW|gQu&X J%Q~loCIC$&J;MM1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/sorting_pipe.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/sorting_pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..df14b4b1e799678cf8d1a9088d26698dbc2ad88e GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|QaoK8Lo9le zQw}heZPog}|IpM!2Y_I~=Ul$#=&!MEIj?3ENIK|9m^L&v7KX3>R39_xS=4+95b%q8 zd^nSVTW8e;$4yT1%~hyVZp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_pipe.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_pipe.png index 634494507986f5adf69d362fcd390427a98955c2..a009fbda2407e8c63855088b45f2373549313ce7 100644 GIT binary patch literal 650 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4egmB5hW46K32*3xq68y`AMmI6}bgK)eHls47YguJQ{>uF6ifOi{PD zbs{}UK3djZt>nqvW6s4qD1-ZCERRDRmN*N_31y=g{ z<>lpi<;HsXMd|v6mX?v90`zGE;%B09k2gXakl<5wp<;IRwdJb`TMuUx6%m z$bf6P-tP(|DDG3P&W=U&lfx|!LHr-{bctF5zdA{+3AoCA#2WIV(a0^zd bgTe~DWM4fL_RZY From 3459375a6be251a0e1363094d8bfb49f85315f93 Mon Sep 17 00:00:00 2001 From: rjnasers Date: Mon, 25 May 2026 16:12:01 +0200 Subject: [PATCH 08/21] Sorting pipes done --- .../utilitiesinexcess/ModBlocks.java | 2 + .../utilitiesinexcess/UtilitiesInExcess.java | 6 +- .../transfer/BlockRetrievalNodeFluid.java | 5 +- .../blocks/transfer/BlockTransferNode.java | 4 +- .../transfer/BlockTransferNodeEnergy.java | 5 +- .../BlockTransferNodeHyperEnergy.java | 5 +- .../transfer/pipe/BlockSortingPipe.java | 126 ++++++++++++++++++ .../transfer/ITransferNetworkComponent.java | 2 +- ...e.java => TileEntityItemTransferNode.java} | 6 +- .../TileEntityNetworkComponentBase.java | 4 +- .../pipe/TileEntityCrossoverPipe.java | 2 +- .../transfer/pipe/TileEntitySortingPipe.java | 19 +++ .../transfer/pipe/TileEntityTransferPipe.java | 2 +- .../transfer/SharedNodeLogic/Connection.java | 20 ++- .../ITransferNetworkLogic.java | 2 +- .../ItemTransferNodeLogic.java | 26 ++-- .../SharedNodeLogic/NetworkLogic.java | 4 +- .../{ => pipe}/CrossOverPipeLogic.java | 9 +- .../SharedNodeLogic/{ => pipe}/PipeLogic.java | 3 +- .../pipe/SortingPipeLogic.java | 85 ++++++++++++ .../transfer/walk/ItemWalker.java | 2 +- .../walk/stepper/ItemTargetResolver.java | 6 +- .../transfer/walk/stepper/TargetResolver.java | 2 +- 23 files changed, 298 insertions(+), 49 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockSortingPipe.java rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/{TileEntityTransferNode.java => TileEntityItemTransferNode.java} (91%) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java rename src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/{ => pipe}/CrossOverPipeLogic.java (97%) rename src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/{ => pipe}/PipeLogic.java (84%) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/SortingPipeLogic.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 7861b14f..5a44708c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockCrossoverPipe; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockSortingPipe; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.item.Item; @@ -168,6 +169,7 @@ public enum ModBlocks { //TODO: Config TRANSFER_PIPE(true, new BlockTransferPipe(), "transfer_pipe"), CROSSOVER_PIPE(true, new BlockCrossoverPipe(), "crossover_pipe"), + SORTING_PIPE(true, new BlockSortingPipe(), "sorting_pipe"), TRANSFER_NODE(true, new BlockTransferNode(), "transfer_node"), // TRANSFER_NODE_FLUID(true, new BlockTransferNodeFluid(), "transfer_node_fluid"), TRANSFER_NODE_ENERGY(true, new BlockTransferNodeEnergy(), "transfer_node_energy"), diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index 63add249..bf9c1ab4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -3,6 +3,7 @@ //import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityRetrievalNode; import codechicken.lib.world.TileChunkLoadHook; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityCrossoverPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntitySortingPipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; @@ -54,7 +55,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityRedstoneGenerator; import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntitySolarGenerator; import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityTNTGenerator; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; //import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeFluid; //import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; import com.fouristhenumber.utilitiesinexcess.common.worldgen.WorldGenEnderLotus; @@ -169,8 +170,9 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityTradingPost.class, "TileEntityTradingPostUIE"); GameRegistry.registerTileEntity(TileEntityTransferPipe.class, "TileEntityTransferPipeUIE"); GameRegistry.registerTileEntity(TileEntityCrossoverPipe.class, "TileEntityCrossoverPipeUIE"); + GameRegistry.registerTileEntity(TileEntitySortingPipe.class, "TileEntitySortingPipeUIE"); // GameRegistry.registerTileEntity(TileEntityRetrievalNode.class,"TileEntityRetrievalNodeUIE"); // not sure if i did the naming correctly - GameRegistry.registerTileEntity(TileEntityTransferNode.class, "TileEntityTransferNodeUIE"); + GameRegistry.registerTileEntity(TileEntityItemTransferNode.class, "TileEntityTransferNodeUIE"); // GameRegistry.registerTileEntity(TileEntityTransferNodeFluid.class, "TileEntityTransferNodeFluidUIE"); lapisAetheriusRenderID = RenderingRegistry.getNextAvailableRenderId(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNodeFluid.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNodeFluid.java index ef1121a9..6c8d7899 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNodeFluid.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNodeFluid.java @@ -1,10 +1,9 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; - public class BlockRetrievalNodeFluid extends BlockTransferNodeBase { public BlockRetrievalNodeFluid() { @@ -20,6 +19,6 @@ public String getTopIcon() { // TODO: new TE @Override public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityTransferNode(); + return new TileEntityItemTransferNode(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNode.java index a41f718c..b08b218d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNode.java @@ -3,7 +3,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; public class BlockTransferNode extends BlockTransferNodeBase { @@ -14,6 +14,6 @@ public BlockTransferNode() { @Override public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityTransferNode(); + return new TileEntityItemTransferNode(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java index 291468fb..3c3bc3ad 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java @@ -1,10 +1,9 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; - public class BlockTransferNodeEnergy extends BlockTransferNodeBase { public BlockTransferNodeEnergy() { @@ -21,6 +20,6 @@ public String getTopIcon() { @Override public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityTransferNode(); + return new TileEntityItemTransferNode(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeHyperEnergy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeHyperEnergy.java index a2476fcd..3c7273d2 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeHyperEnergy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeHyperEnergy.java @@ -1,10 +1,9 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; - public class BlockTransferNodeHyperEnergy extends BlockTransferNodeBase { public BlockTransferNodeHyperEnergy() { @@ -20,6 +19,6 @@ public String getTopIcon() { // TODO: new TE @Override public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityTransferNode(); + return new TileEntityItemTransferNode(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockSortingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockSortingPipe.java new file mode 100644 index 00000000..db6ad0f7 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockSortingPipe.java @@ -0,0 +1,126 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferBase; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntitySortingPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; +import com.fouristhenumber.utilitiesinexcess.transfer.collision.PipeCollision; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import java.util.List; + +import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; + +public class BlockSortingPipe extends BlockTransferBase +{ + public BlockSortingPipe() { + super(Material.iron); + this.setBlockName("sorting_pipe"); + this.setBlockTextureName("utilitiesinexcess:sorting_pipe"); + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean hasTileEntity(int metadata) + { + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) + { + return new TileEntitySortingPipe(); + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) + { + TileEntitySortingPipe te = (TileEntitySortingPipe) world.getTileEntity(x, y, z); + if (te == null) return; + + int mask = te.getRawConnectionMask(); + + float minY = (mask & (1 << 0)) != 0 ? 0F : 0.375F; // DOWN (-Y) + float maxY = (mask & (1 << 1)) != 0 ? 1F : 0.625F; // UP (+Y) + + float minZ = (mask & (1 << 2)) != 0 ? 0F : 0.375F; // NORTH (-Z) + float maxZ = (mask & (1 << 3)) != 0 ? 1F : 0.625F; // SOUTH (+Z) + + float minX = (mask & (1 << 4)) != 0 ? 0F : 0.375F; // WEST (-X) + float maxX = (mask & (1 << 5)) != 0 ? 1F : 0.625F; // EAST (+X) + + this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ); + } + + @Override + public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, List list, Entity collider) + { + TileEntitySortingPipe te = (TileEntitySortingPipe) worldIn.getTileEntity(x, y, z); + if (te == null) return; + + int connectionMask = te.getRawConnectionMask(); + + AxisAlignedBB boundingBox = PipeCollision.MIDDLE.getBoundingBox().copy().offset(x, y, z); + if (boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.DOWN.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 0)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.UP.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 1)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.NORTH.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 2)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.SOUTH.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 3)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.WEST.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 4)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.EAST.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 5)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + } + + @Override + public int getRenderType() + { + return transferPipeRenderID; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java index 73c3a8ed..5bed7a69 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java @@ -18,7 +18,7 @@ public interface ITransferNetworkComponent void addExternal(ForgeDirection direction, Connection neighbor); void removeExternal(ForgeDirection direction); - Connection[] getValidExternalNeighbors(ForgeDirection fromDirection); + Connection[] getValidExternalNeighbors(ForgeDirection fromDirection, ITransferNetworkComponent walking); ITransferNetworkComponent[] getNetworkNeighbors(); MaskedArrayView getWalkableDirs(TransportType targetType, ForgeDirection fromDirection); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java similarity index 91% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java index c18d4a5c..aa0e6d27 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java @@ -1,7 +1,5 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; -import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.INodeLogicHost; -import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ITransferNetworkLogic; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ItemTransferNodeLogic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -15,11 +13,11 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; -public class TileEntityTransferNode extends TileEntityTransferNodeBase +public class TileEntityItemTransferNode extends TileEntityTransferNodeBase implements IGuiHolder { - public TileEntityTransferNode() + public TileEntityItemTransferNode() { logic = new ItemTransferNodeLogic(this); System.out.println("CALLED"); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java index 32a75c19..7e5d851b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java @@ -91,9 +91,9 @@ public void updateExternalConnections() } @Override - public Connection[] getValidExternalNeighbors(ForgeDirection fromDirection) + public Connection[] getValidExternalNeighbors(ForgeDirection fromDirection, ITransferNetworkComponent walker) { - return logic.getValidExternalConnections(fromDirection); + return logic.getValidExternalConnections(fromDirection, walker); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java index 88f5bd91..e7d653f9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java @@ -2,7 +2,7 @@ import cofh.api.energy.IEnergyReceiver; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; -import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.CrossOverPipeLogic; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe.CrossOverPipeLogic; import net.minecraft.inventory.IInventory; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java new file mode 100644 index 00000000..32dd9c85 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java @@ -0,0 +1,19 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe.SortingPipeLogic; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntitySortingPipe extends TileEntityNetworkComponentBase +{ + + public TileEntitySortingPipe() + { + logic = new SortingPipeLogic(this); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java index 283955bb..69fcbf86 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java @@ -1,7 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; -import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.PipeLogic; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe.PipeLogic; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityTransferPipe extends TileEntityNetworkComponentBase diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java index 8a32088e..7fac1b37 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java @@ -4,4 +4,22 @@ import net.minecraft.tileentity.TileEntity; @Desugar -public record Connection(TileEntity target, int flags, int side) {} +public record Connection(TileEntity target, int flags, int side) +{ + public boolean canConnectItem() + { + return (flags & 1) != 0; + } + + public boolean canConnectEnergy() + { + return false; + } + + public boolean canConnectFluid() + { + return false; + } +} + + diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java index e4df8b12..ec26432b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java @@ -29,7 +29,7 @@ public interface ITransferNetworkLogic boolean canConnectFluid(); boolean canConnectItem(); - Connection[] getValidExternalConnections(ForgeDirection fromDirection); + Connection[] getValidExternalConnections(ForgeDirection fromDirection, ITransferNetworkComponent walker); ITransferNetworkComponent[] getNetworkConnections(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java index 40022af1..dfd17927 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java @@ -44,8 +44,10 @@ public ItemTransferNodeLogic(INodeLogicHost host) walker = new ItemWalker(host); } - public void updateEntity(INodeLogicHost host) { - if (host.getWorld().isRemote || host.getWorld().getTotalWorldTime() % 20 != 0) { + public void updateEntity(INodeLogicHost host) + { + if (host.getWorld().isRemote || host.getWorld().getTotalWorldTime() % 20 != 0) + { return; } @@ -54,6 +56,16 @@ public void updateEntity(INodeLogicHost host) { updateSourceInventory(host); } + if (connectedInventory != null) { + importItems(); + } + + if (buffer[0] == null) + { + walker.reset(); + return; + } + TargetResolver.Target target = walker.getValidTarget(); if (target != null) { @@ -66,16 +78,6 @@ public void updateEntity(INodeLogicHost host) { buffer[0] = TryInsertItem(target.handler, buffer[0], target.side); } } - - if (connectedInventory != null) { - importItems(); - } - - if (buffer[0] == null) - { - walker.reset(); - return; - } walker.step(); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java index 0f1d83bc..a7f7fcbe 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java @@ -12,7 +12,7 @@ // TODO is it really safe to be doing all of this stuff on world join/separation??? public abstract class NetworkLogic implements ITransferNetworkLogic { - ITransferNetworkComponent host; + protected ITransferNetworkComponent host; protected ITransferNetworkComponent[] networkNeighbors = new ITransferNetworkComponent[6]; protected int networkMask = 0; @@ -208,7 +208,7 @@ public void setExternalMask(int mask) } @Override - public Connection[] getValidExternalConnections(ForgeDirection fromDirection) + public Connection[] getValidExternalConnections(ForgeDirection fromDirection, ITransferNetworkComponent walker) { return externalConnections; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/CrossOverPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java similarity index 97% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/CrossOverPipeLogic.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java index bb2f80a1..0b40e6e6 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/CrossOverPipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java @@ -1,13 +1,12 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; -import cofh.api.energy.IEnergyReceiver; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; -import net.minecraft.inventory.IInventory; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.IFluidHandler; // Crossover pipes are unique in that they are the only pipe that when they are updated they will affect neighbor status // of blocks that are not directly adjacent, thus they must have special neighbor logic. @@ -203,7 +202,7 @@ public MaskedArrayView getWalkableDirs(ForgeDirection // Only valid external connection is across from the fromDirection @Override - public Connection[] getValidExternalConnections(ForgeDirection fromDirection) + public Connection[] getValidExternalConnections(ForgeDirection fromDirection, ITransferNetworkComponent walker) { return new Connection[]{externalConnections[fromDirection.getOpposite().ordinal()]}; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/PipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/PipeLogic.java similarity index 84% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/PipeLogic.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/PipeLogic.java index 29825827..8e56cb9d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/PipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/PipeLogic.java @@ -1,7 +1,8 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; public class PipeLogic extends NetworkLogic { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/SortingPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/SortingPipeLogic.java new file mode 100644 index 00000000..dfb08c43 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/SortingPipeLogic.java @@ -0,0 +1,85 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +public class SortingPipeLogic extends NetworkLogic +{ + + public SortingPipeLogic(ITransferNetworkComponent host) { + super(host); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } + + @Override + public Connection[] getValidExternalConnections(ForgeDirection fromDirection, ITransferNetworkComponent walker) + { + // If we have an item Node we need to just return the valid connections + if (walker instanceof TileEntityItemTransferNode itemNodeTE) + { + Connection[] ret = new Connection[6]; + for (int i = 0; i < 6; i++) + { + Connection conn = externalConnections[i]; + if (conn != null && conn.canConnectItem()) + { + if (conn.target() instanceof IInventory inventory) + { + if (containsItemOrEmpty(inventory, itemNodeTE.getStackInSlot(0))) + { + ret[i] = conn; + continue; + } + } + } + ret[i] = null; + } + return ret; + } + // Just return everything because there's no rules for a non-ItemTransferNode + return externalConnections; + } + + public static boolean containsItemOrEmpty(IInventory inv, ItemStack target) + { + boolean empty = true; + for (int i = 0; i < inv.getSizeInventory(); i++) + { + ItemStack slot = inv.getStackInSlot(i); + + if (slot == null) + { + continue; + } + empty = false; + if (slot.getItem() == target.getItem() && + slot.getItemDamage() == target.getItemDamage()) + { + if (ItemStack.areItemStackTagsEqual(slot, target)) + { + return true; + } + } + } + return empty; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java index 25816779..e076dc10 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java @@ -32,7 +32,7 @@ public void step() @Override public TargetResolver.Target getValidTarget() { - List> validTargets = targeter.getValidTargets(currentComponent, stepper.fromDirection); + List> validTargets = targeter.getValidTargets(currentComponent, walkingComponent, stepper.fromDirection); if (validTargets.isEmpty()) { return null; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java index 9880841b..b60f51d0 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java @@ -11,14 +11,14 @@ public class ItemTargetResolver implements TargetResolver { @Override - public List> getValidTargets(ITransferNetworkComponent from, ForgeDirection fromDir) + public List> getValidTargets(ITransferNetworkComponent from, ITransferNetworkComponent walking, ForgeDirection fromDir) { - Connection[] conns = from.getValidExternalNeighbors(fromDir); + Connection[] conns = from.getValidExternalNeighbors(fromDir, walking); List> validTargets = new ArrayList<>(); for (Connection conn : conns) { - if (conn != null && (conn.flags() & 1) != 0) + if (conn != null && conn.canConnectItem()) { validTargets.add(new Target<>((IInventory) conn.target(), conn.side())); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java index 8e114733..94076883 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java @@ -8,7 +8,7 @@ public interface TargetResolver { List> getValidTargets( - ITransferNetworkComponent from, ForgeDirection fromDir); + ITransferNetworkComponent from, ITransferNetworkComponent walking, ForgeDirection fromDir); class Target { From dc5cbfa631e82d4403a7b86807598b4fce4f2527 Mon Sep 17 00:00:00 2001 From: rjnasers Date: Sat, 30 May 2026 01:07:08 +0200 Subject: [PATCH 09/21] Rationing pipe logic + itemTransferNode insertion logic done --- .../utilitiesinexcess/ModBlocks.java | 4 + .../utilitiesinexcess/UtilitiesInExcess.java | 4 + .../pipe/BlockHyperRationingPipe.java | 21 ++ .../transfer/pipe/BlockRationingPipe.java | 21 ++ .../transfer/ITransferNetworkComponent.java | 2 + .../TileEntityNetworkComponentBase.java | 5 + .../pipe/TileEntityCrossoverPipe.java | 5 + .../pipe/TileEntityHyperRationingPipe.java | 18 + .../pipe/TileEntityRationingPipe.java | 18 + .../transfer/pipe/TileEntitySortingPipe.java | 8 +- .../transfer/pipe/TileEntityTransferPipe.java | 6 + .../ITransferNetworkLogic.java | 2 +- .../ItemTransferNodeLogic.java | 314 ++++++++++++++---- .../SharedNodeLogic/NetworkLogic.java | 21 +- .../pipe/HyperRationingPipeLogic.java | 33 ++ .../pipe/RationingPipeLogic.java | 32 ++ .../transfer/walk/ItemWalker.java | 16 +- .../transfer/walk/WalkerBase.java | 4 +- 18 files changed, 452 insertions(+), 82 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockRationingPipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityHyperRationingPipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityRationingPipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/HyperRationingPipeLogic.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/RationingPipeLogic.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 5a44708c..7a151084 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -1,6 +1,8 @@ package com.fouristhenumber.utilitiesinexcess; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockCrossoverPipe; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockHyperRationingPipe; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockRationingPipe; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockSortingPipe; import net.minecraft.block.Block; import net.minecraft.init.Blocks; @@ -170,6 +172,8 @@ public enum ModBlocks { TRANSFER_PIPE(true, new BlockTransferPipe(), "transfer_pipe"), CROSSOVER_PIPE(true, new BlockCrossoverPipe(), "crossover_pipe"), SORTING_PIPE(true, new BlockSortingPipe(), "sorting_pipe"), + RATIONING_PIPE(true, new BlockRationingPipe(), "rationing_pipe"), + HYPER_RATIONING_PIPE(true, new BlockHyperRationingPipe(), "hyper_rationing_pipe"), TRANSFER_NODE(true, new BlockTransferNode(), "transfer_node"), // TRANSFER_NODE_FLUID(true, new BlockTransferNodeFluid(), "transfer_node_fluid"), TRANSFER_NODE_ENERGY(true, new BlockTransferNodeEnergy(), "transfer_node_energy"), diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index bf9c1ab4..a49bba0f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -3,6 +3,8 @@ //import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityRetrievalNode; import codechicken.lib.world.TileChunkLoadHook; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityCrossoverPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityHyperRationingPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityRationingPipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntitySortingPipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; import net.minecraft.creativetab.CreativeTabs; @@ -171,6 +173,8 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityTransferPipe.class, "TileEntityTransferPipeUIE"); GameRegistry.registerTileEntity(TileEntityCrossoverPipe.class, "TileEntityCrossoverPipeUIE"); GameRegistry.registerTileEntity(TileEntitySortingPipe.class, "TileEntitySortingPipeUIE"); + GameRegistry.registerTileEntity(TileEntityRationingPipe.class, "TileEntityRationingPipeUIE"); + GameRegistry.registerTileEntity(TileEntityHyperRationingPipe.class, "TileEntityHyperRationingPipe"); // GameRegistry.registerTileEntity(TileEntityRetrievalNode.class,"TileEntityRetrievalNodeUIE"); // not sure if i did the naming correctly GameRegistry.registerTileEntity(TileEntityItemTransferNode.class, "TileEntityTransferNodeUIE"); // GameRegistry.registerTileEntity(TileEntityTransferNodeFluid.class, "TileEntityTransferNodeFluidUIE"); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java new file mode 100644 index 00000000..99c7d935 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java @@ -0,0 +1,21 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferBase; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityHyperRationingPipe; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class BlockHyperRationingPipe extends BlockTransferBase +{ + public BlockHyperRationingPipe() { + super(Material.iron); + this.setBlockName("hyper_rationing_pipe"); + this.setBlockTextureName("utilitiesinexcess:hyper_rationing_pipe"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityHyperRationingPipe(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockRationingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockRationingPipe.java new file mode 100644 index 00000000..05e057b3 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockRationingPipe.java @@ -0,0 +1,21 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferBase; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityRationingPipe; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class BlockRationingPipe extends BlockTransferBase +{ + public BlockRationingPipe() { + super(Material.iron); + this.setBlockName("rationing_pipe"); + this.setBlockTextureName("utilitiesinexcess:rationing_pipe"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityRationingPipe(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java index 5bed7a69..5c137659 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java @@ -34,4 +34,6 @@ public interface ITransferNetworkComponent boolean canConnectToSide(ForgeDirection side); void updateExternalConnections(); + + int getInsertLimit(); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java index 7e5d851b..769ed056 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java @@ -115,4 +115,9 @@ public int getRawConnectionMask() logic.updateExternalConnections(); return logic.getNetworkMask() | logic.getExternalMask(); } + + @Override + public int getInsertLimit() { + return logic.getMaxInsertable(); + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java index e7d653f9..460d5e7c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java @@ -34,4 +34,9 @@ public boolean canConnectToSide(ForgeDirection side) } return false; } + + @Override + public int getInsertLimit() { + return -1; + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityHyperRationingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityHyperRationingPipe.java new file mode 100644 index 00000000..13760f97 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityHyperRationingPipe.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe.HyperRationingPipeLogic; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityHyperRationingPipe extends TileEntityNetworkComponentBase +{ + public TileEntityHyperRationingPipe() + { + logic = new HyperRationingPipeLogic(this); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityRationingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityRationingPipe.java new file mode 100644 index 00000000..a105d60e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityRationingPipe.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe.RationingPipeLogic; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityRationingPipe extends TileEntityNetworkComponentBase +{ + public TileEntityRationingPipe() + { + logic = new RationingPipeLogic(this); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java index 32dd9c85..448866f9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java @@ -13,7 +13,13 @@ public TileEntitySortingPipe() } @Override - public boolean canConnectToSide(ForgeDirection side) { + public boolean canConnectToSide(ForgeDirection side) + { return true; } + + @Override + public int getInsertLimit() { + return logic.getMaxInsertable(); + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java index 69fcbf86..7f1b7e4a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java @@ -17,4 +17,10 @@ public boolean canConnectToSide(ForgeDirection side) { return true; } + + @Override + public int getInsertLimit() { + return logic.getMaxInsertable(); + } + } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java index ec26432b..8093f223 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java @@ -32,5 +32,5 @@ public interface ITransferNetworkLogic Connection[] getValidExternalConnections(ForgeDirection fromDirection, ITransferNetworkComponent walker); ITransferNetworkComponent[] getNetworkConnections(); - + int getMaxInsertable(); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java index dfd17927..ecaa566e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java @@ -15,15 +15,14 @@ import com.cleanroommc.modularui.widgets.slot.ModularSlot; import com.cleanroommc.modularui.widgets.slot.SlotGroup; import com.fouristhenumber.utilitiesinexcess.transfer.walk.ItemWalker; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.StepStrategy; import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.TargetResolver; +import it.unimi.dsi.fastutil.ints.IntArrayList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.network.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; @@ -44,6 +43,8 @@ public ItemTransferNodeLogic(INodeLogicHost host) walker = new ItemWalker(host); } + // Note that I did write quite length insertion logic for this. I felt that it is more important to keep the + // logic consise and fast for the cases where there is no rationing pipe. public void updateEntity(INodeLogicHost host) { if (host.getWorld().isRemote || host.getWorld().getTotalWorldTime() % 20 != 0) @@ -66,16 +67,46 @@ public void updateEntity(INodeLogicHost host) return; } - TargetResolver.Target target = walker.getValidTarget(); - if (target != null) + List> targets = walker.getValidTargets(); + if (!targets.isEmpty()) { - if (target.handler instanceof ISidedInventory sidedInventory) // Sided logic + // As mentioned elsewhere some pipes have a maximum insertion limit. + int insertLimit = walker.getInsertLimit(); + if (insertLimit == -1) // Unlimited insert logic { - buffer[0] = TryInsertItemSided(sidedInventory, buffer[0], target.side); + for (TargetResolver.Target target : targets) // Need to loop through because sometimes the full stack cannot fit in one inventory + { + if (target.handler instanceof ISidedInventory sidedInventory) // Sided logic + { + buffer[0] = TryInsertItemSided(sidedInventory, buffer[0], target.side); + } + else // Basic logic + { + buffer[0] = TryInsertItem(target.handler, buffer[0]); + } + if (buffer[0] == null) + { + break; + } + } } - else // Basic logic + else // Limited insert logic { - buffer[0] = TryInsertItem(target.handler, buffer[0], target.side); + for (TargetResolver.Target target : targets) // Need to loop through because sometimes the full stack cannot fit in one inventory + { + if (target.handler instanceof ISidedInventory sidedInventory) // Sided logic + { + buffer[0] = TryInsertItemSidedLimited(sidedInventory, buffer[0], target.side, insertLimit); + } + else // Basic logic + { + buffer[0] = TryInsertItemLimited(target.handler, buffer[0], insertLimit); + } + if (buffer[0] == null) + { + break; + } + } } } walker.step(); @@ -110,118 +141,287 @@ else if (buffer[0].isItemEqual(stackInSlot)) } } - public ItemStack TryInsertItemSided(ISidedInventory inventory, ItemStack stack, int side) + // Insertion logic for non-sided inventories where there's a maxAllowed in the inventory + public ItemStack TryInsertItemLimited(IInventory inventory, ItemStack stack, int maxAllowed) { - int[] slots = inventory.getAccessibleSlotsFromSide(side); + if (stack == null || stack.stackSize <= 0) + { + return null; + } - for (int slot : slots) + int size = inventory.getSizeInventory(); + + // I'm using IntArrayLists to be the fastest. + // Even entries are slot numbers and subsequent odd entries are the amount of items that can be put into them. + IntArrayList mergeableSlots = new IntArrayList(); + IntArrayList emptySlots = new IntArrayList(); + + int found = 0; + + for (int slot = 0; slot < size; slot++) { - if (stack == null || stack.stackSize <= 0) + if (!inventory.isItemValidForSlot(slot, stack)) { - return null; + continue; + } + + ItemStack existing = inventory.getStackInSlot(slot); + if (existing == null) + { + emptySlots.add(slot); + emptySlots.add(inventory.getInventoryStackLimit()); + } + else if (canStacksMerge(existing, stack)) + { + found += existing.stackSize; + if (found >= maxAllowed) + { + return stack; + } + + int max = Math.min(existing.getMaxStackSize(), inventory.getInventoryStackLimit()); + int space = max - existing.stackSize; + if (space > 0) + { + mergeableSlots.add(slot); + mergeableSlots.add(space); + } } + } + + int preMergeStackSize = stack.stackSize; + // Once for mergeable slots first, then the empty slots. + StackToInventoryMergingHelperLimited(mergeableSlots, inventory, stack, found, maxAllowed); + if (stack.stackSize <= 0) + { + return null; + } + found += preMergeStackSize - stack.stackSize; + return StackToInventoryMergingHelperLimited(emptySlots, inventory, stack, found, maxAllowed); + } + + // Insertion logic for sided inventories where there's a maxAllowed in the inventory + public ItemStack TryInsertItemSidedLimited(ISidedInventory inventory, ItemStack stack, int side, int maxAllowed) + { + if (stack == null || stack.stackSize <= 0) + { + return null; + } + + int[] slots = inventory.getAccessibleSlotsFromSide(side); + // I'm using IntArrayLists to be the fastest. + // Even entries are slot numbers and subsequent odd entries are the amount of items that can be put into them. + IntArrayList mergeableSlots = new IntArrayList(); + IntArrayList emptySlots = new IntArrayList(); + + int found = 0; + for (int slot : slots) + { if (!inventory.canInsertItem(slot, stack, side)) { continue; } - ItemStack existing = inventory.getStackInSlot(slot); + ItemStack existing = inventory.getStackInSlot(slot); if (existing == null) { - int max = Math.min(stack.getMaxStackSize(), inventory.getInventoryStackLimit()); - - ItemStack toInsert = stack.copy(); - toInsert.stackSize = Math.min(stack.stackSize, max); - - inventory.setInventorySlotContents(slot, toInsert); - stack.stackSize -= toInsert.stackSize; - - inventory.markDirty(); + emptySlots.add(slot); + emptySlots.add(inventory.getInventoryStackLimit()); } else if (canStacksMerge(existing, stack)) { + found += existing.stackSize; + if (found >= maxAllowed) + { + return stack; + } + int max = Math.min(existing.getMaxStackSize(), inventory.getInventoryStackLimit()); int space = max - existing.stackSize; - if (space > 0) { - int toMove = Math.min(space, stack.stackSize); + mergeableSlots.add(slot); + mergeableSlots.add(space); + } + } + } - existing.stackSize += toMove; - stack.stackSize -= toMove; + // Once for mergeable slots first, then the empty slots. + int preMergeStackSize = stack.stackSize; + StackToInventoryMergingHelperLimited(mergeableSlots, inventory, stack, found, maxAllowed); + if (stack.stackSize <= 0) + { + return null; + } + found += preMergeStackSize - stack.stackSize; + return StackToInventoryMergingHelperLimited(emptySlots, inventory, stack, found, maxAllowed); + } + + // Helper for consistent inventory insertion/merging + private ItemStack StackToInventoryMergingHelperLimited(IntArrayList slotInfo, IInventory inventory, ItemStack insertionStack, int currentItemsInInventory, int maxAllowedInInventory) + { + int insertAmount = maxAllowedInInventory - currentItemsInInventory; + for (int i = 0; i < slotInfo.size(); i += 2) + { + int slot = slotInfo.getInt(i); + int amountInsertable = Math.min(slotInfo.getInt(i + 1), Math.min(insertionStack.stackSize, insertAmount)); + insertionStack.stackSize -= amountInsertable; + currentItemsInInventory += amountInsertable; + if (inventory.getStackInSlot(slot) == null) + { + ItemStack newStack = insertionStack.copy(); + newStack.stackSize = amountInsertable; + inventory.setInventorySlotContents(slot, newStack); + } + else + { + inventory.getStackInSlot(slot).stackSize += amountInsertable; + } - inventory.markDirty(); + if (currentItemsInInventory == maxAllowedInInventory) + { + if (insertionStack.stackSize <= 0) + { + return null; + } + else + { + return insertionStack; } } + if (insertionStack.stackSize <= 0) + { + return null; + } } - - return stack.stackSize <= 0 ? null : stack; + return insertionStack; } - public ItemStack TryInsertItem(IInventory inventory, ItemStack stack, int side) + // Default sided insertion logic + public ItemStack TryInsertItemSided(ISidedInventory inventory, ItemStack stack, int side) { if (stack == null || stack.stackSize <= 0) { return null; } - int size = inventory.getSizeInventory(); + int[] slots = inventory.getAccessibleSlotsFromSide(side); - // First pass: try to merge into existing stacks - for (int slot = 0; slot < size; slot++) + IntArrayList mergeableSlots = new IntArrayList(); + IntArrayList emptySlots = new IntArrayList(); + + // Note that we have to iterate the whole inventory first or we won't know if there's mergable slots + for (int slot : slots) { - if (stack.stackSize <= 0) + if (!inventory.canInsertItem(slot, stack, side)) { - return null; + continue; } ItemStack existing = inventory.getStackInSlot(slot); - - if (existing != null && canStacksMerge(existing, stack)) + if (existing == null) + { + emptySlots.add(slot); + emptySlots.add(inventory.getInventoryStackLimit()); + } + else if (canStacksMerge(existing, stack)) { int max = Math.min(existing.getMaxStackSize(), inventory.getInventoryStackLimit()); int space = max - existing.stackSize; - if (space > 0) { - int toMove = Math.min(space, stack.stackSize); - - existing.stackSize += toMove; - stack.stackSize -= toMove; - - inventory.markDirty(); + mergeableSlots.add(slot); + mergeableSlots.add(space); } } } + StackToInventoryMergingHelper(mergeableSlots, inventory, stack); + if (stack.stackSize <= 0) + { + return null; + } + return StackToInventoryMergingHelper(emptySlots, inventory, stack); + } + + // Default insertion logic + public ItemStack TryInsertItem(IInventory inventory, ItemStack stack) + { + if (stack == null || stack.stackSize <= 0) + { + return null; + } + + int size = inventory.getSizeInventory(); + + // I'm using IntArrayLists to be the fastest. + // Even entries are slot numbers and subsequent odd entries are the amount of items that can be put into them. + IntArrayList mergeableSlots = new IntArrayList(); + IntArrayList emptySlots = new IntArrayList(); - // Second pass: fill empty slots for (int slot = 0; slot < size; slot++) { - if (stack.stackSize <= 0) + if (!inventory.isItemValidForSlot(slot, stack)) { - return null; + continue; } ItemStack existing = inventory.getStackInSlot(slot); - if (existing == null) { - int max = Math.min(stack.getMaxStackSize(), inventory.getInventoryStackLimit()); - - ItemStack toInsert = stack.copy(); - toInsert.stackSize = Math.min(stack.stackSize, max); + emptySlots.add(slot); + emptySlots.add(inventory.getInventoryStackLimit()); + } + else if (canStacksMerge(existing, stack)) + { - inventory.setInventorySlotContents(slot, toInsert); - stack.stackSize -= toInsert.stackSize; - inventory.markDirty(); + int max = Math.min(existing.getMaxStackSize(), inventory.getInventoryStackLimit()); + int space = max - existing.stackSize; + if (space > 0) + { + mergeableSlots.add(slot); + mergeableSlots.add(space); + } } } + StackToInventoryMergingHelper(mergeableSlots, inventory, stack); + if (stack.stackSize <= 0) + { + return null; + } + return StackToInventoryMergingHelper(emptySlots, inventory, stack); + } + + // Helper for consistent inventory insertion/merging + private ItemStack StackToInventoryMergingHelper(IntArrayList slotInfo, IInventory inventory, ItemStack insertionStack) + { + for (int i = 0; i < slotInfo.size(); i += 2) + { + int slot = slotInfo.getInt(i); + int amountInsertable = Math.min(slotInfo.getInt(i + 1), insertionStack.stackSize); + insertionStack.stackSize -= amountInsertable; + if (inventory.getStackInSlot(slot) == null) + { + ItemStack newStack = insertionStack.copy(); + newStack.stackSize = amountInsertable; + inventory.setInventorySlotContents(slot, newStack); + } + else + { + inventory.getStackInSlot(slot).stackSize += amountInsertable; + } - return stack.stackSize <= 0 ? null : stack; + if (insertionStack.stackSize <= 0) + { + return null; + } + } + return insertionStack; } + // Not sure if this is the correct way to do this tbh. I don't know if any of the built in + // itemstack stuff is better. private static boolean canStacksMerge(ItemStack a, ItemStack b) { return a.getItem() == b.getItem() diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java index a7f7fcbe..c6105210 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java @@ -170,21 +170,6 @@ public MaskedArrayView getWalkableDirs(ForgeDirection return new MaskedArrayView<>(mask, networkNeighbors); } -// @Override -// public MaskedArrayView getNeighborsExcluding(ForgeDirection direction) -// { -// int mask; -// if (direction != null) -// { -// mask = networkMask & ~(1 << direction.ordinal()); -// } -// else -// { -// mask = networkMask; -// } -// return new MaskedArrayView<>(mask, networkNeighbors); -// } - @Override public int getNetworkMask() { return networkMask; @@ -218,4 +203,10 @@ public ITransferNetworkComponent[] getNetworkConnections() { return networkNeighbors; } + + @Override + public int getMaxInsertable() + { + return -1; + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/HyperRationingPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/HyperRationingPipeLogic.java new file mode 100644 index 00000000..4c6d5efa --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/HyperRationingPipeLogic.java @@ -0,0 +1,33 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; + +public class HyperRationingPipeLogic extends NetworkLogic +{ + + public HyperRationingPipeLogic(ITransferNetworkComponent host) { + super(host); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } + + @Override + public int getMaxInsertable() + { + return 1; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/RationingPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/RationingPipeLogic.java new file mode 100644 index 00000000..b0550601 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/RationingPipeLogic.java @@ -0,0 +1,32 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; + +public class RationingPipeLogic extends NetworkLogic +{ + public RationingPipeLogic(ITransferNetworkComponent host) { + super(host); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } + + @Override + public int getMaxInsertable() { + return 64; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java index e076dc10..7968de3b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java @@ -30,14 +30,16 @@ public void step() } @Override - public TargetResolver.Target getValidTarget() + public List> getValidTargets() { - List> validTargets = targeter.getValidTargets(currentComponent, walkingComponent, stepper.fromDirection); - if (validTargets.isEmpty()) - { - return null; - } - return validTargets.get(rand.nextInt(validTargets.size())); + return targeter.getValidTargets(currentComponent, walkingComponent, stepper.fromDirection); + } + + // Gets the amount of items that can be put into an inventory by a certain component. This is relevant + // for rationing pipes. If result is -1, the limit is ignored. + @Override + public int getInsertLimit() { + return currentComponent.getInsertLimit(); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java index 1d1f0e7e..1083d64a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java @@ -33,5 +33,7 @@ public String getLocationString() public abstract void reset(); - public abstract TargetResolver.Target getValidTarget(); + public abstract List> getValidTargets(); + + public abstract int getInsertLimit(); } From ef1037b492d9c69b7b32493ec4b387c51e822551 Mon Sep 17 00:00:00 2001 From: rjnasers Date: Sun, 31 May 2026 02:08:13 +0200 Subject: [PATCH 10/21] Fuck my life but I think it's finally working only like 8 hours of learning how to do UI shit --- .../utilitiesinexcess/ModBlocks.java | 2 + .../utilitiesinexcess/UtilitiesInExcess.java | 5 +- .../transfer/pipe/BlockCrossoverPipe.java | 108 +----------- .../blocks/transfer/pipe/BlockFilterPipe.java | 55 ++++++ .../pipe/BlockHyperRationingPipe.java | 6 +- .../blocks/transfer/pipe/BlockPipeBase.java | 117 +++++++++++++ .../transfer/pipe/BlockRationingPipe.java | 6 +- .../transfer/pipe/BlockSortingPipe.java | 107 +----------- .../transfer/pipe/BlockTransferPipe.java | 108 +----------- .../common/items/ItemUpgrade.java | 93 +++++++++- .../transfer/ITransferNetworkComponent.java | 2 + .../transfer/TileEntityItemTransferNode.java | 19 ++- .../TileEntityNetworkComponentBase.java | 6 + .../pipe/TileEntityCrossoverPipe.java | 5 - .../transfer/pipe/TileEntityFilterPipe.java | 92 ++++++++++ .../transfer/pipe/TileEntitySortingPipe.java | 5 - .../transfer/pipe/TileEntityTransferPipe.java | 6 - .../ItemTransferNodeLogic.java | 42 ++++- .../SharedNodeLogic/pipe/FilterPipeLogic.java | 159 ++++++++++++++++++ .../pipe/ModSortingPipeLogic.java | 27 +++ .../utils/ItemStackInventory.java | 156 +++++++++++++++++ .../utils/ItemStackInventoryContainer.java | 6 + .../textures/blocks/filter_pipe_0.png | Bin 0 -> 166 bytes .../textures/blocks/filter_pipe_1.png | Bin 0 -> 166 bytes .../textures/blocks/filter_pipe_2.png | Bin 0 -> 165 bytes .../textures/blocks/filter_pipe_3.png | Bin 0 -> 165 bytes .../textures/blocks/filter_pipe_4.png | Bin 0 -> 165 bytes .../textures/blocks/filter_pipe_5.png | Bin 0 -> 165 bytes .../textures/blocks/hyper_rationing_pipe.png | Bin 0 -> 187 bytes .../textures/blocks/rationing_pipe.png | Bin 0 -> 169 bytes 30 files changed, 767 insertions(+), 365 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockFilterPipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockPipeBase.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityFilterPipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/ModSortingPipeLogic.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventoryContainer.java create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/hyper_rationing_pipe.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/rationing_pipe.png diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 7a151084..90712630 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockCrossoverPipe; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockFilterPipe; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockHyperRationingPipe; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockRationingPipe; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockSortingPipe; @@ -174,6 +175,7 @@ public enum ModBlocks { SORTING_PIPE(true, new BlockSortingPipe(), "sorting_pipe"), RATIONING_PIPE(true, new BlockRationingPipe(), "rationing_pipe"), HYPER_RATIONING_PIPE(true, new BlockHyperRationingPipe(), "hyper_rationing_pipe"), + FILTER_PIPE(true, new BlockFilterPipe(), "filter_pipe"), TRANSFER_NODE(true, new BlockTransferNode(), "transfer_node"), // TRANSFER_NODE_FLUID(true, new BlockTransferNodeFluid(), "transfer_node_fluid"), TRANSFER_NODE_ENERGY(true, new BlockTransferNodeEnergy(), "transfer_node_energy"), diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index a49bba0f..b157d785 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -1,8 +1,8 @@ package com.fouristhenumber.utilitiesinexcess; -//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityRetrievalNode; import codechicken.lib.world.TileChunkLoadHook; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityCrossoverPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityFilterPipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityHyperRationingPipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityRationingPipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntitySortingPipe; @@ -58,8 +58,6 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntitySolarGenerator; import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityTNTGenerator; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; -//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeFluid; -//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; import com.fouristhenumber.utilitiesinexcess.common.worldgen.WorldGenEnderLotus; import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPRecipeLoader; import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.Content; @@ -175,6 +173,7 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntitySortingPipe.class, "TileEntitySortingPipeUIE"); GameRegistry.registerTileEntity(TileEntityRationingPipe.class, "TileEntityRationingPipeUIE"); GameRegistry.registerTileEntity(TileEntityHyperRationingPipe.class, "TileEntityHyperRationingPipe"); + GameRegistry.registerTileEntity(TileEntityFilterPipe.class, "TileEntityFilterPipe"); // GameRegistry.registerTileEntity(TileEntityRetrievalNode.class,"TileEntityRetrievalNodeUIE"); // not sure if i did the naming correctly GameRegistry.registerTileEntity(TileEntityItemTransferNode.class, "TileEntityTransferNodeUIE"); // GameRegistry.registerTileEntity(TileEntityTransferNodeFluid.class, "TileEntityTransferNodeFluidUIE"); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockCrossoverPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockCrossoverPipe.java index 3292be89..85073180 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockCrossoverPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockCrossoverPipe.java @@ -1,20 +1,11 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; -import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferBase; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityCrossoverPipe; -import com.fouristhenumber.utilitiesinexcess.transfer.collision.PipeCollision; import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityCrossoverPipe; -import java.util.List; - -import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; - -public class BlockCrossoverPipe extends BlockTransferBase +public class BlockCrossoverPipe extends BlockPipeBase { public BlockCrossoverPipe() { super(Material.iron); @@ -26,99 +17,4 @@ public BlockCrossoverPipe() { public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntityCrossoverPipe(); } - - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - @Override - public boolean hasTileEntity(int metadata) - { - return true; - } - - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) - { - TileEntityCrossoverPipe te = (TileEntityCrossoverPipe) world.getTileEntity(x, y, z); - if (te == null) return; - - int mask = te.getRawConnectionMask(); - - float minY = (mask & (1 << 0)) != 0 ? 0F : 0.375F; // DOWN (-Y) - float maxY = (mask & (1 << 1)) != 0 ? 1F : 0.625F; // UP (+Y) - - float minZ = (mask & (1 << 2)) != 0 ? 0F : 0.375F; // NORTH (-Z) - float maxZ = (mask & (1 << 3)) != 0 ? 1F : 0.625F; // SOUTH (+Z) - - float minX = (mask & (1 << 4)) != 0 ? 0F : 0.375F; // WEST (-X) - float maxX = (mask & (1 << 5)) != 0 ? 1F : 0.625F; // EAST (+X) - - this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ); - } - - @Override - public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, List list, Entity collider) - { - TileEntityCrossoverPipe te = (TileEntityCrossoverPipe) worldIn.getTileEntity(x, y, z); - if (te == null) return; - - int connectionMask = te.getRawConnectionMask(); - - AxisAlignedBB boundingBox = PipeCollision.MIDDLE.getBoundingBox().copy().offset(x, y, z); - if (boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.DOWN.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 0)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.UP.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 1)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.NORTH.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 2)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.SOUTH.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 3)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.WEST.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 4)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.EAST.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 5)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - } - - @Override - public int getRenderType() - { - return transferPipeRenderID; - } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockFilterPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockFilterPipe.java new file mode 100644 index 00000000..fd44deff --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockFilterPipe.java @@ -0,0 +1,55 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import com.cleanroommc.modularui.factory.GuiFactories; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityFilterPipe; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + + +public class BlockFilterPipe extends BlockPipeBase +{ + public IIcon[] icons = new IIcon[6]; + + public BlockFilterPipe() { + super(Material.iron); + this.setBlockName("filter_pipe"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityFilterPipe(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) + { + for (int i = 0; i < 6; i++) + { + icons[i] = reg.registerIcon("utilitiesinexcess:filter_pipe_" + i); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + return icons[side]; + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + if (!worldIn.isRemote) + { + GuiFactories.tileEntity().open(player, x, y, z); + } + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java index 99c7d935..0d7b462e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java @@ -1,12 +1,11 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; -import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferBase; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityHyperRationingPipe; import net.minecraft.block.material.Material; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityHyperRationingPipe; -public class BlockHyperRationingPipe extends BlockTransferBase +public class BlockHyperRationingPipe extends BlockPipeBase { public BlockHyperRationingPipe() { super(Material.iron); @@ -18,4 +17,5 @@ public BlockHyperRationingPipe() { public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntityHyperRationingPipe(); } + } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockPipeBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockPipeBase.java new file mode 100644 index 00000000..792085ee --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockPipeBase.java @@ -0,0 +1,117 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferBase; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.collision.PipeCollision; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import java.util.List; + +import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; + +public abstract class BlockPipeBase extends BlockTransferBase +{ + + protected BlockPipeBase(Material mat) { + super(mat); + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean hasTileEntity(int metadata) + { + return true; + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) + { + TileEntityNetworkComponentBase te = (TileEntityNetworkComponentBase) world.getTileEntity(x, y, z); + if (te == null) return; + + int mask = te.getRawConnectionMask(); + + float minY = (mask & (1 << 0)) != 0 ? 0F : 0.375F; // DOWN (-Y) + float maxY = (mask & (1 << 1)) != 0 ? 1F : 0.625F; // UP (+Y) + + float minZ = (mask & (1 << 2)) != 0 ? 0F : 0.375F; // NORTH (-Z) + float maxZ = (mask & (1 << 3)) != 0 ? 1F : 0.625F; // SOUTH (+Z) + + float minX = (mask & (1 << 4)) != 0 ? 0F : 0.375F; // WEST (-X) + float maxX = (mask & (1 << 5)) != 0 ? 1F : 0.625F; // EAST (+X) + + this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ); + } + + @Override + public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, List list, Entity collider) + { + TileEntityNetworkComponentBase te = (TileEntityNetworkComponentBase) worldIn.getTileEntity(x, y, z); + if (te == null) return; + + int connectionMask = te.getRawConnectionMask(); + + AxisAlignedBB boundingBox = PipeCollision.MIDDLE.getBoundingBox().copy().offset(x, y, z); + if (boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.DOWN.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 0)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.UP.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 1)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.NORTH.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 2)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.SOUTH.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 3)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.WEST.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 4)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.EAST.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 5)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + } + + @Override + public int getRenderType() + { + return transferPipeRenderID; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockRationingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockRationingPipe.java index 05e057b3..1f650a47 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockRationingPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockRationingPipe.java @@ -1,12 +1,11 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; -import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferBase; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityRationingPipe; import net.minecraft.block.material.Material; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityRationingPipe; -public class BlockRationingPipe extends BlockTransferBase +public class BlockRationingPipe extends BlockPipeBase { public BlockRationingPipe() { super(Material.iron); @@ -18,4 +17,5 @@ public BlockRationingPipe() { public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntityRationingPipe(); } + } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockSortingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockSortingPipe.java index db6ad0f7..2ee5e7bc 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockSortingPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockSortingPipe.java @@ -1,21 +1,11 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; -import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferBase; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntitySortingPipe; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; -import com.fouristhenumber.utilitiesinexcess.transfer.collision.PipeCollision; import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import java.util.List; - -import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; - -public class BlockSortingPipe extends BlockTransferBase +public class BlockSortingPipe extends BlockPipeBase { public BlockSortingPipe() { super(Material.iron); @@ -23,104 +13,9 @@ public BlockSortingPipe() { this.setBlockTextureName("utilitiesinexcess:sorting_pipe"); } - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - @Override - public boolean hasTileEntity(int metadata) - { - return true; - } - @Override public TileEntity createNewTileEntity(World world, int metadata) { return new TileEntitySortingPipe(); } - - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) - { - TileEntitySortingPipe te = (TileEntitySortingPipe) world.getTileEntity(x, y, z); - if (te == null) return; - - int mask = te.getRawConnectionMask(); - - float minY = (mask & (1 << 0)) != 0 ? 0F : 0.375F; // DOWN (-Y) - float maxY = (mask & (1 << 1)) != 0 ? 1F : 0.625F; // UP (+Y) - - float minZ = (mask & (1 << 2)) != 0 ? 0F : 0.375F; // NORTH (-Z) - float maxZ = (mask & (1 << 3)) != 0 ? 1F : 0.625F; // SOUTH (+Z) - - float minX = (mask & (1 << 4)) != 0 ? 0F : 0.375F; // WEST (-X) - float maxX = (mask & (1 << 5)) != 0 ? 1F : 0.625F; // EAST (+X) - - this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ); - } - - @Override - public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, List list, Entity collider) - { - TileEntitySortingPipe te = (TileEntitySortingPipe) worldIn.getTileEntity(x, y, z); - if (te == null) return; - - int connectionMask = te.getRawConnectionMask(); - - AxisAlignedBB boundingBox = PipeCollision.MIDDLE.getBoundingBox().copy().offset(x, y, z); - if (boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.DOWN.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 0)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.UP.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 1)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.NORTH.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 2)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.SOUTH.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 3)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.WEST.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 4)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.EAST.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 5)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - } - - @Override - public int getRenderType() - { - return transferPipeRenderID; - } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockTransferPipe.java index 1db628c8..3521fc9a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockTransferPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockTransferPipe.java @@ -1,127 +1,21 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; -import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; - -import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferBase; -import com.fouristhenumber.utilitiesinexcess.transfer.collision.PipeCollision; import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; - import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; -import java.util.List; - -public class BlockTransferPipe extends BlockTransferBase +public class BlockTransferPipe extends BlockPipeBase { - public BlockTransferPipe() { super(Material.iron); this.setBlockName("transfer_pipe"); this.setBlockTextureName("utilitiesinexcess:transfer_pipe"); } - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - @Override - public boolean hasTileEntity(int metadata) - { - return true; - } - @Override public TileEntity createNewTileEntity(World world, int metadata) { return new TileEntityTransferPipe(); } - - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) - { - TileEntityTransferPipe te = (TileEntityTransferPipe) world.getTileEntity(x, y, z); - if (te == null) return; - - int mask = te.getRawConnectionMask(); - - float minY = (mask & (1 << 0)) != 0 ? 0F : 0.375F; // DOWN (-Y) - float maxY = (mask & (1 << 1)) != 0 ? 1F : 0.625F; // UP (+Y) - - float minZ = (mask & (1 << 2)) != 0 ? 0F : 0.375F; // NORTH (-Z) - float maxZ = (mask & (1 << 3)) != 0 ? 1F : 0.625F; // SOUTH (+Z) - - float minX = (mask & (1 << 4)) != 0 ? 0F : 0.375F; // WEST (-X) - float maxX = (mask & (1 << 5)) != 0 ? 1F : 0.625F; // EAST (+X) - - this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ); - } - - @Override - public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, List list, Entity collider) - { - TileEntityTransferPipe te = (TileEntityTransferPipe) worldIn.getTileEntity(x, y, z); - if (te == null) return; - - int connectionMask = te.getRawConnectionMask(); - - AxisAlignedBB boundingBox = PipeCollision.MIDDLE.getBoundingBox().copy().offset(x, y, z); - if (boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.DOWN.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 0)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.UP.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 1)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.NORTH.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 2)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.SOUTH.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 3)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.WEST.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 4)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - - boundingBox = PipeCollision.EAST.getBoundingBox().copy().offset(x, y, z); - if ((connectionMask & (1 << 5)) != 0 && boundingBox.intersectsWith(mask)) - { - list.add(boundingBox); - } - } - - @Override - public int getRenderType() - { - return transferPipeRenderID; - } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java index 96347fae..1db49477 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java @@ -2,8 +2,28 @@ import java.util.List; +import com.cleanroommc.modularui.ModularUI; +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.GuiFactories; +import com.cleanroommc.modularui.factory.PlayerInventoryGuiData; +import com.cleanroommc.modularui.factory.inventory.InventoryTypes; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.ModularScreen; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; +import com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventory; +import com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventoryContainer; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; @@ -13,8 +33,11 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; -public class ItemUpgrade extends Item { +public class ItemUpgrade extends Item implements IGuiHolder, ItemStackInventoryContainer +{ private static final IIcon[] ICONS = new IIcon[TransferUpgrade.VALUES.length]; @@ -29,11 +52,6 @@ public IIcon getIconFromDamage(int meta) { return ICONS[meta]; } - @Override - public int getMetadata(int meta) { - return meta; - } - @Override public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + "_" + TransferUpgrade.VALUES[stack.getItemDamage()].getName(); @@ -53,4 +71,67 @@ public void getSubItems(Item item, CreativeTabs tab, List items) { items.add(new ItemStack(item, 1, upgrade.ordinal())); } } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + { + if (!world.isRemote && TransferUpgrade.getUpgrade(stack) == TransferUpgrade.FILTER) // SERVER side only + { + GuiFactories.playerInventory().open(player, InventoryTypes.PLAYER, player.inventory.currentItem); + } + return stack; + } + + @Override + public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { + ModularPanel panel = new ModularPanel("panel").height(125); + panel.bindPlayerInventory(); + + SlotGroup filterGroup = new SlotGroup("filter_slots", 1); + ItemStackInventory itemInventory; + + ItemStack heldStack = data.getPlayer().getHeldItem(); + if (heldStack.hasTagCompound()) + { + itemInventory = new ItemStackInventory(heldStack); + } + else + { + itemInventory = ItemStackInventory.BlankInventory(heldStack); + } + + IItemHandler handler = new InvWrapper(itemInventory); + + panel.child( + IKey.str(StatCollector.translateToLocal("Item Filter")) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15) + ); + + Flow flow = Flow.row().size(18*9, 18).horizontalCenter().marginTop(16); + + for (int i = 0; i < this.getInventorySize(); i++) + { + flow.child(new ItemSlot().slot(new ModularSlot(handler,i).slotGroup(filterGroup))); + } + + panel.child(flow); + syncManager.addCloseListener(itemInventory::writeInventoryToHeldStack); + + return panel; + } + + @Override + @SideOnly(Side.CLIENT) + public ModularScreen createScreen(PlayerInventoryGuiData data, ModularPanel mainPanel) { + return new ModularScreen(UtilitiesInExcess.MODID, mainPanel); + } + + @Override + public int getInventorySize() { + return 9; + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java index 5c137659..2687c097 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java @@ -36,4 +36,6 @@ public interface ITransferNetworkComponent void updateExternalConnections(); int getInsertLimit(); + + void markHostDirty(); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java index aa0e6d27..1bc3da96 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java @@ -1,6 +1,10 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; +import com.cleanroommc.modularui.screen.ModularScreen; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ItemTransferNodeLogic; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -20,7 +24,6 @@ public class TileEntityItemTransferNode extends TileEntityTransferNodeBase + implements IGuiHolder, IInventory +{ + + public TileEntityFilterPipe() + { + logic = new FilterPipeLogic(this); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) + { + return logic.buildUI(data, syncManager, settings, this); + } + + @Override + public int getSizeInventory() { + return logic.getSizeInventory(); + } + + @Override + public ItemStack getStackInSlot(int slotIn) { + return logic.getStackInSlot(slotIn); + } + + @Override + public ItemStack decrStackSize(int index, int count) { + return logic.decrStackSize(index, count); + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) { + return logic.getStackInSlotOnClosing(index); + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) { + logic.setInventorySlotContents(index, stack); + } + + @Override + public String getInventoryName() { + return logic.getInventoryName(); + } + + @Override + public boolean hasCustomInventoryName() { + return logic.hasCustomInventoryName(); + } + + @Override + public int getInventoryStackLimit() { + return logic.getInventoryStackLimit(); + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return logic.isUseableByPlayer(player); + } + + @Override + public void openInventory() + {} + + @Override + public void closeInventory() + {} + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + return logic.isItemValidForSlot(index, stack); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java index 448866f9..686b5310 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java @@ -17,9 +17,4 @@ public boolean canConnectToSide(ForgeDirection side) { return true; } - - @Override - public int getInsertLimit() { - return logic.getMaxInsertable(); - } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java index 7f1b7e4a..69fcbf86 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java @@ -17,10 +17,4 @@ public boolean canConnectToSide(ForgeDirection side) { return true; } - - @Override - public int getInsertLimit() { - return logic.getMaxInsertable(); - } - } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java index ecaa566e..c0bde150 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java @@ -1,8 +1,10 @@ package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PlayerInventoryGuiData; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.utils.item.IItemHandler; import com.cleanroommc.modularui.utils.item.InvWrapper; @@ -14,8 +16,11 @@ import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; import com.cleanroommc.modularui.widgets.slot.SlotGroup; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.transfer.walk.ItemWalker; import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.TargetResolver; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import it.unimi.dsi.fastutil.ints.IntArrayList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -29,7 +34,7 @@ import java.util.List; -public class ItemTransferNodeLogic extends NetworkLogic +public class ItemTransferNodeLogic extends NetworkLogic implements IInventory { ItemStack[] buffer = new ItemStack[getSizeInventory()]; @@ -464,16 +469,19 @@ public void readFromNBT(NBTTagCompound nbt) } } + @Override public int getSizeInventory() { return 7; } + @Override public ItemStack getStackInSlot(int slotIn) { return buffer[slotIn]; } + @Override public ItemStack decrStackSize(int index, int count) { if (buffer[index] == null) @@ -483,43 +491,58 @@ public ItemStack decrStackSize(int index, int count) return buffer[index].splitStack(count); } + @Override public ItemStack getStackInSlotOnClosing(int index) { return buffer[index]; } - public void setInventorySlotContents(int index, ItemStack stack, INodeLogicHost host) + @Override + public void setInventorySlotContents(int index, ItemStack stack) { buffer[index] = stack; - host.markDirty(); + this.markDirty(); } + @Override public String getInventoryName() { return "gui.title.transfer_node.name"; } + @Override public boolean hasCustomInventoryName() { return false; } + @Override public int getInventoryStackLimit() { return 64; } + @Override + public void markDirty() { + host.markHostDirty(); + } + public boolean isUseableByPlayer(EntityPlayer player) { return true; } - public void openInventory() - {} + @Override + public void openInventory() { + + } + + @Override + public void closeInventory() { - public void closeInventory() - {} + } + @Override public boolean isItemValidForSlot(int index, ItemStack stack) { return true; @@ -573,6 +596,11 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet return panel; } + @SideOnly(Side.CLIENT) + public ModularScreen createScreen(PosGuiData data, ModularPanel mainPanel) { + return new ModularScreen(UtilitiesInExcess.MODID, mainPanel); + } + @Override public boolean canConnectEnergy() { return true; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java new file mode 100644 index 00000000..c26c8dc1 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java @@ -0,0 +1,159 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +public class FilterPipeLogic extends NetworkLogic implements IInventory +{ + // Slot filters are organized in the same way that + ItemStack[] filters = new ItemStack[6]; + + public FilterPipeLogic(ITransferNetworkComponent host) { + super(host); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } + + @Override + public int getSizeInventory() { + return 6; + } + + @Override + public ItemStack getStackInSlot(int slotIn) + { + return filters[slotIn]; + } + + @Override + public ItemStack decrStackSize(int index, int count) + { + if (filters[index] == null) + { + return null; + } + return filters[index].splitStack(count); + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) + { + return filters[index]; + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) + { + filters[index] = stack; + this.markDirty(); + } + + public String getInventoryName() + { + return "gui.title.filter_pipe.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public void markDirty() { + host.markHostDirty(); + } + + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings, IInventory host) + { + SlotGroup slotGroup = new SlotGroup("transfer_node_buffer[0]", 1); + SlotGroup slotGroup1 = new SlotGroup("transfer_node_upgrades", 1); + + ModularPanel panel = new ModularPanel("panel"); + panel.bindPlayerInventory(); + + panel.child( + new ParentWidget<>().coverChildren() + .topRelAnchor(0, 1) + .child( + IKey.str(StatCollector.translateToLocal(getInventoryName())) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15))); + + IItemHandler itemHandler = new InvWrapper(host); + + Flow flow = Flow.row(); + flow.pos(34,60).size(108,18); + for (int i = 0; i < 5; i++) + { + flow.child(new ItemSlot().slot(new ModularSlot(itemHandler,i + 1).slotGroup(slotGroup1))); + } + panel.child(flow); + ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); + + panel.child( + new Grid().coverChildren() + .pos(79, 34) + .mapTo(1, 1, index -> new ItemSlot().slot(slot))); + + return panel; + } + + public boolean isUseableByPlayer(EntityPlayer player) + { + return true; + } + + @Override + public void openInventory() { + + } + + @Override + public void closeInventory() { + + } + + public boolean isItemValidForSlot(int index, ItemStack stack) + { + return true; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/ModSortingPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/ModSortingPipeLogic.java new file mode 100644 index 00000000..f1edfd0f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/ModSortingPipeLogic.java @@ -0,0 +1,27 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; + +public class ModSortingPipeLogic extends NetworkLogic +{ + + public ModSortingPipeLogic(ITransferNetworkComponent host) { + super(host); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java new file mode 100644 index 00000000..223ceb1b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java @@ -0,0 +1,156 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +public class ItemStackInventory implements IInventory +{ + private final int size; + private final ItemStack[] filters; + + + private boolean dirty = false; + + public ItemStackInventory(ItemStack stack) + { + NBTTagCompound nbt = stack.getTagCompound(); + if (nbt == null) + { + nbt = new NBTTagCompound(); + stack.setTagCompound(nbt); + } + + this.size = nbt.hasKey("size") ? nbt.getInteger("size") : 9; + this.filters = new ItemStack[this.size]; + + NBTTagList list = nbt.getTagList("Items", 10); + + for (int i = 0; i < list.tagCount(); i++) + { + NBTTagCompound itemTag = list.getCompoundTagAt(i); + + int slot = itemTag.getByte("Slot") & 255; + + if (slot >= 0 && slot < this.size) + { + filters[slot] = ItemStack.loadItemStackFromNBT(itemTag); + } + } + } + + public void writeInventoryToHeldStack(EntityPlayer player) + { + ItemStack heldStack = player.getHeldItem(); + if (heldStack.stackTagCompound == null) + { + heldStack.stackTagCompound = new NBTTagCompound(); + } + NBTTagCompound compound = heldStack.stackTagCompound; + compound.setInteger("size", filters.length); + NBTTagList itemList = new NBTTagList(); + for (int i = 0; i < filters.length; i++) + { + ItemStack stack = filters[i]; + if (stack != null) + { + NBTTagCompound itemCompound = new NBTTagCompound(); + itemCompound.setByte("Slot", (byte) i); + stack.writeToNBT(itemCompound); + itemList.appendTag(itemCompound); + } + } + compound.setTag("Items", itemList); + } + + private ItemStackInventory(int size) + { + this.size = size; + this.filters = new ItemStack[size]; + } + + public static ItemStackInventory BlankInventory(ItemStack container) + { + if (container.getItem() instanceof ItemStackInventoryContainer inventoryContainer) + { + return new ItemStackInventory(inventoryContainer.getInventorySize()); + } + throw new IllegalArgumentException("Blank inventory attempted to be created on an item that is not an ItemContainer"); + } + + @Override + public int getSizeInventory() { + return size; + } + + @Override + public ItemStack getStackInSlot(int slotIn) { + return filters[slotIn]; + } + + @Override + public ItemStack decrStackSize(int index, int count) + { + if (filters[index] == null) + { + return null; + } + markDirty(); + return filters[index].splitStack(count); + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) + { + return filters[index]; + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) + { + filters[index] = stack; + markDirty(); + } + + @Override + public String getInventoryName() { + return "upgrade_inventory"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public void markDirty() { + this.dirty = true; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return false; + } + + @Override + public void openInventory() { + + } + + @Override + public void closeInventory() { + + } + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventoryContainer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventoryContainer.java new file mode 100644 index 00000000..cd061197 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventoryContainer.java @@ -0,0 +1,6 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +public interface ItemStackInventoryContainer +{ + int getInventorySize(); +} diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e2108b73e674ed2448a0d23251215c48fb9ad4cc GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr}70DF+ze#M=H_zq^iI zM|#Q1Lj?uj`P_26HgYwI^hr55Ni;BVhx@45?&F;{OMP{hHz)JrOK$RO*se^EPp|m> zSw3R1fwi#not3*Ico*Jb=-S($ulgx-4V!oUE zSw3R1fwi#not3*Ico*Jb=-S($ulgx-4V!oUE63DBl4xM!4);;9-N!p^mip>0Z%*dLm)zvnuw9uRpI-6% zvwXy218ZUDJ1cib@GiW=(6zTgUv-nQ)1D8X?S(5f3$HNr|3A{g$Z+~*emmoeEBZit O89ZJ6T-G@yGywqS*gFaU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_3.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_3.png new file mode 100644 index 0000000000000000000000000000000000000000..796cbd107c2afb4ab2ee89ddfb7a469b1ecb8bf2 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar}70DF+ze#M=Iozp+(T z=k63DBl4xM!4);;9-N!p^mip>0Z%*dLm)zvnuw9uRpI-6% zvwXy218ZUDJ1cib@GiW=(6zTgUv-nQ)1D8X?S(5f3$HNr|3A{g$Z+~*emmoeEBZit O89ZJ6T-G@yGywqS*gFaU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_4.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_4.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6d43139381b58b0acb8a045189f061825052d4 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar}70DF+ze#M=Iozp+(T z=k63DBl4xM!4);;9-N!p^mip>0Z%*dN(UPKT*m55JJpbX_ zbNdZ$iDhbSrt8EvNIC6f6scy6_ex1`sd)IjUhPxRqZN#D|2sLE84kY5`@j6;q4_|2 O89ZJ6T-G@yGywql;XDKY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_5.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_5.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6d43139381b58b0acb8a045189f061825052d4 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar}70DF+ze#M=Iozp+(T z=k63DBl4xM!4);;9-N!p^mip>0Z%*dN(UPKT*m55JJpbX_ zbNdZ$iDhbSrt8EvNIC6f6scy6_ex1`sd)IjUhPxRqZN#D|2sLE84kY5`@j6;q4_|2 O89ZJ6T-G@yGywql;XDKY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/hyper_rationing_pipe.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/hyper_rationing_pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..d8af78b0930433000de20d7dfa8eab86097de950 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Nth#V;XLb{h{r>v2A0HYgI>ua@e9+^yZCGi=-VYC%m75zF{Md~Q0uFOW1dAWe e@LIB-kzq!L^6rW1Hda6fFnGH9xvXf;GJyGjVp!^jT#~hvKW||7w=ttygp{q{e5j#VwP@Zn}99{YWDEuRia Date: Sun, 31 May 2026 22:10:14 +0200 Subject: [PATCH 11/21] Slot locking --- .../utilitiesinexcess/common/items/ItemUpgrade.java | 9 ++++++++- .../utilitiesinexcess/utils/ItemStackInventory.java | 11 +++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java index 1db49477..bbb13b58 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java @@ -23,7 +23,6 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; @@ -87,6 +86,14 @@ public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncMa ModularPanel panel = new ModularPanel("panel").height(125); panel.bindPlayerInventory(); + int usedSlot = data.getPlayer().inventory.currentItem; + if (data.getInventoryType() == InventoryTypes.PLAYER) + { + syncManager.bindPlayerInventory(data.getPlayer(), + (inv, index) -> + index == usedSlot ? new ModularSlot(inv, index).accessibility(false, false) : new ModularSlot(inv, index)); + } + SlotGroup filterGroup = new SlotGroup("filter_slots", 1); ItemStackInventory itemInventory; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java index 223ceb1b..89bab7a4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java @@ -11,7 +11,6 @@ public class ItemStackInventory implements IInventory private final int size; private final ItemStack[] filters; - private boolean dirty = false; public ItemStackInventory(ItemStack stack) @@ -43,7 +42,15 @@ public ItemStackInventory(ItemStack stack) public void writeInventoryToHeldStack(EntityPlayer player) { + if (!dirty || player.getEntityWorld().isRemote) + { + return; + } ItemStack heldStack = player.getHeldItem(); + if (heldStack == null) + { + return; // This can happen if you don't lock the slot the inventory is from. + } if (heldStack.stackTagCompound == null) { heldStack.stackTagCompound = new NBTTagCompound(); @@ -77,7 +84,7 @@ public static ItemStackInventory BlankInventory(ItemStack container) { return new ItemStackInventory(inventoryContainer.getInventorySize()); } - throw new IllegalArgumentException("Blank inventory attempted to be created on an item that is not an ItemContainer"); + throw new IllegalArgumentException("Blank inventory attempted to be created on an item that is not an ItemStackInventoryContainer"); } @Override From 3a918a43b160dc6b7722a5bf82ca798897fdd884 Mon Sep 17 00:00:00 2001 From: rjnasers Date: Wed, 3 Jun 2026 23:37:39 +0200 Subject: [PATCH 12/21] NBT aware recipes for filters + phantom slots for filters --- .../common/items/ItemUpgrade.java | 63 ++++++++++++++---- .../common/recipe/NBTPreservingRecipe.java | 42 ++++++++++++ .../common/recipe/RecipeLoader.java | 65 ++++++++++++++++++- .../config/items/ItemConfig.java | 2 + .../config/transfer/TransferConfig.java | 13 ++++ .../transfer/filter/ITransferFilter.java | 4 -- .../utils/ItemStackInventory.java | 24 ++----- 7 files changed, 178 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/NBTPreservingRecipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/transfer/TransferConfig.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/filter/ITransferFilter.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java index bbb13b58..d63fb5e2 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java @@ -2,7 +2,6 @@ import java.util.List; -import com.cleanroommc.modularui.ModularUI; import com.cleanroommc.modularui.api.IGuiHolder; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.factory.GuiFactories; @@ -15,8 +14,8 @@ import com.cleanroommc.modularui.utils.item.InvWrapper; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.PhantomItemSlot; import com.cleanroommc.modularui.widgets.slot.SlotGroup; import com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventory; import com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventoryContainer; @@ -25,6 +24,8 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.util.IIcon; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; @@ -37,6 +38,21 @@ public class ItemUpgrade extends Item implements IGuiHolder, ItemStackInventoryContainer { + public enum FilterMode { + INVERTED("Inverted"), + FUZZYNBT("Fuzzy - Ignores NBT"), + FUZZYMETA("Fuzzy - Ignores Metadata"); + + private final String label; + + FilterMode(String label) { + this.label = label; + } + + public String getLabel() { + return label; + } + } private static final IIcon[] ICONS = new IIcon[TransferUpgrade.VALUES.length]; @@ -98,14 +114,7 @@ public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncMa ItemStackInventory itemInventory; ItemStack heldStack = data.getPlayer().getHeldItem(); - if (heldStack.hasTagCompound()) - { - itemInventory = new ItemStackInventory(heldStack); - } - else - { - itemInventory = ItemStackInventory.BlankInventory(heldStack); - } + itemInventory = new ItemStackInventory(heldStack, 9, 1); IItemHandler handler = new InvWrapper(itemInventory); @@ -122,7 +131,7 @@ public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncMa for (int i = 0; i < this.getInventorySize(); i++) { - flow.child(new ItemSlot().slot(new ModularSlot(handler,i).slotGroup(filterGroup))); + flow.child(new PhantomItemSlot().slot(new ModularSlot(handler,i).slotGroup(filterGroup))); } panel.child(flow); @@ -141,4 +150,36 @@ public ModularScreen createScreen(PlayerInventoryGuiData data, ModularPanel main public int getInventorySize() { return 9; } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) + { + if (TransferUpgrade.getUpgrade(stack) == TransferUpgrade.FILTER || TransferUpgrade.getUpgrade(stack) == TransferUpgrade.ADV_FILTER) + { + if (stack.hasTagCompound()) + { + if (stack.stackTagCompound.hasKey("Mode")) + { + byte filterMode = stack.stackTagCompound.getByte("Mode"); + if (filterMode >= 0 && filterMode < FilterMode.values().length) + { + list.add(FilterMode.values()[filterMode].getLabel()); + } + } + + if (stack.stackTagCompound.hasKey("Items")) + { + NBTTagList tagList = stack.stackTagCompound.getTagList("Items", 10); + for (int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound itemTag = tagList.getCompoundTagAt(i); + ItemStack filteredStack = ItemStack.loadItemStackFromNBT(itemTag); + if (filteredStack != null) { + list.add(" " + filteredStack.getDisplayName()); + } + } + } + } + } + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/NBTPreservingRecipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/NBTPreservingRecipe.java new file mode 100644 index 00000000..53d49cbb --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/NBTPreservingRecipe.java @@ -0,0 +1,42 @@ +package com.fouristhenumber.utilitiesinexcess.common.recipe; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.nbt.NBTTagCompound; + +import java.util.List; + +public class NBTPreservingRecipe extends ShapelessRecipes +{ + + // Which item in the input items to take the NBT from + int slot; + + public NBTPreservingRecipe(ItemStack outputItem, List inputItems, int slot) + { + super(outputItem, inputItems); + this.slot = slot; + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inv) { + ItemStack result = super.getCraftingResult(inv); + + for (int i = 0; i < inv.getSizeInventory(); i++) { + ItemStack stack = inv.getStackInSlot(i); + + if (stack != null && stack.isItemEqual(recipeItems.get(slot)) && stack.hasTagCompound()) { + NBTTagCompound incomingTag = stack.getTagCompound(); + + for (String key : incomingTag.func_150296_c()) + { + result.stackTagCompound.setTag(key, incomingTag.getTag(key)); + } + break; + } + } + + return result; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java index 2ce5d2e0..a2f30784 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java @@ -2,9 +2,14 @@ import static net.minecraft.item.Item.getItemFromBlock; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade; +import com.fouristhenumber.utilitiesinexcess.config.transfer.TransferConfig; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagByte; +import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.oredict.OreDictionary; import com.fouristhenumber.utilitiesinexcess.ModBlocks; @@ -18,6 +23,10 @@ import cpw.mods.fml.common.registry.GameRegistry; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class RecipeLoader { public static void run() { @@ -35,6 +44,7 @@ public static void run() { loadDecorativeBlocksRecipes(); loadColoredBlockRecipes(); loadTransferNodeRecipes(); + loadFilterVariantRecipes(); // Pacifist's Bench addShapedRecipe( @@ -1306,8 +1316,51 @@ private static void loadTransferUpgradeRecipes() { TransferUpgrade.FILTER.getStack()); } - private static void loadTransferPipeRecipes() { + private static void loadTransferPipeRecipes() + { + + } + + private static void loadFilterVariantRecipes() + { + if (TransferConfig.EnableTransferSystem) + { + GameRegistry.addRecipe( new NBTPreservingRecipe( + setNBTForItem(TransferUpgrade.FILTER.getStack(1), "Mode", new NBTTagByte((byte) ItemUpgrade.FilterMode.INVERTED.ordinal())).theStack, + Arrays.asList( + TransferUpgrade.FILTER.getStack(1).theStack, + new ItemStack(Blocks.redstone_torch) + ), + 0)); + + GameRegistry.addRecipe( + new NBTPreservingRecipe( + setNBTForItem(TransferUpgrade.FILTER.getStack(1), "Mode", new NBTTagByte((byte) ItemUpgrade.FilterMode.FUZZYNBT.ordinal())).theStack, + Arrays.asList( + TransferUpgrade.FILTER.getStack(1).theStack, + new ItemStack(Blocks.wool) + ), + 0)); + + GameRegistry.addRecipe( + new NBTPreservingRecipe( + setNBTForItem(TransferUpgrade.FILTER.getStack(1), "Mode", new NBTTagByte((byte) ItemUpgrade.FilterMode.FUZZYMETA.ordinal())).theStack, + Arrays.asList( + TransferUpgrade.FILTER.getStack(1).theStack, + new ItemStack(Items.stick) + ), + 0)); + + GameRegistry.addRecipe( + new NBTPreservingRecipe( + setNBTForItem(TransferUpgrade.ADV_FILTER.getStack(1), "Mode", new NBTTagByte((byte) ItemUpgrade.FilterMode.INVERTED.ordinal())).theStack, + Arrays.asList( + TransferUpgrade.ADV_FILTER.getStack(1).theStack, + new ItemStack(Blocks.redstone_torch) + ), + 0)); + } } private static boolean addShapedRecipe(Object outputObject, Object... params) { @@ -1350,4 +1403,14 @@ private static void loadCompressedBlockRecipes() { } } } + + private static DisableableItemStack setNBTForItem(DisableableItemStack in, String key, NBTBase tag) + { + if (!in.theStack.hasTagCompound()) + { + in.theStack.stackTagCompound = new NBTTagCompound(); + } + in.theStack.stackTagCompound.setTag(key, tag); + return in; + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java index 25379e21..e38cee53 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java @@ -2,6 +2,7 @@ import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.UnstableTools; +import com.fouristhenumber.utilitiesinexcess.config.transfer.TransferConfig; import com.gtnewhorizon.gtnhlib.config.Config; import com.gtnewhorizon.gtnhlib.config.ConfigException; import com.gtnewhorizon.gtnhlib.config.ConfigurationManager; @@ -18,6 +19,7 @@ public static void registerConfig() throws ConfigException { ConfigurationManager.registerConfig(WateringCanConfig.class); ConfigurationManager.registerConfig(InversionConfig.class); ConfigurationManager.registerConfig(FireBatteryConfig.class); + ConfigurationManager.registerConfig(TransferConfig.class); } @Config.DefaultBoolean(true) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/transfer/TransferConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/transfer/TransferConfig.java new file mode 100644 index 00000000..106e8244 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/transfer/TransferConfig.java @@ -0,0 +1,13 @@ +package com.fouristhenumber.utilitiesinexcess.config.transfer; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "transfer") +public class TransferConfig { + + @Config.Comment("Should the transfer system be enabled.") + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean EnableTransferSystem; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/filter/ITransferFilter.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/filter/ITransferFilter.java deleted file mode 100644 index b455d1f8..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/filter/ITransferFilter.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.filter; - -public interface ITransferFilter { -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java index 89bab7a4..ef6aea08 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java @@ -10,11 +10,12 @@ public class ItemStackInventory implements IInventory { private final int size; private final ItemStack[] filters; - + private final int stackLimit; private boolean dirty = false; - public ItemStackInventory(ItemStack stack) + public ItemStackInventory(ItemStack stack, int size, int stackLimit) { + this.stackLimit = stackLimit; NBTTagCompound nbt = stack.getTagCompound(); if (nbt == null) { @@ -22,7 +23,7 @@ public ItemStackInventory(ItemStack stack) stack.setTagCompound(nbt); } - this.size = nbt.hasKey("size") ? nbt.getInteger("size") : 9; + this.size = nbt.hasKey("size") ? nbt.getInteger("size") : size; this.filters = new ItemStack[this.size]; NBTTagList list = nbt.getTagList("Items", 10); @@ -72,21 +73,6 @@ public void writeInventoryToHeldStack(EntityPlayer player) compound.setTag("Items", itemList); } - private ItemStackInventory(int size) - { - this.size = size; - this.filters = new ItemStack[size]; - } - - public static ItemStackInventory BlankInventory(ItemStack container) - { - if (container.getItem() instanceof ItemStackInventoryContainer inventoryContainer) - { - return new ItemStackInventory(inventoryContainer.getInventorySize()); - } - throw new IllegalArgumentException("Blank inventory attempted to be created on an item that is not an ItemStackInventoryContainer"); - } - @Override public int getSizeInventory() { return size; @@ -133,7 +119,7 @@ public boolean hasCustomInventoryName() { @Override public int getInventoryStackLimit() { - return 64; + return stackLimit; } @Override From dfe82dcd21ee44e8d2c581bb487b71ada3d7a1eb Mon Sep 17 00:00:00 2001 From: rjnasers Date: Fri, 5 Jun 2026 00:13:25 +0200 Subject: [PATCH 13/21] A shit-load more filter dogshit. --- .../common/items/ItemUpgrade.java | 75 ++++- .../transfer/upgrade/AdvancedFilterMode.java | 298 ++++++++++++++++++ .../transfer/upgrade/UpgradeInventory.java | 178 ----------- .../utils/OreDictionaryUtils.java | 19 ++ 4 files changed, 389 insertions(+), 181 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/OreDictionaryUtils.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java index d63fb5e2..09872cfc 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java @@ -17,6 +17,7 @@ import com.cleanroommc.modularui.widgets.slot.ModularSlot; import com.cleanroommc.modularui.widgets.slot.PhantomItemSlot; import com.cleanroommc.modularui.widgets.slot.SlotGroup; +import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.AdvancedFilterMode; import com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventory; import com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventoryContainer; import net.minecraft.client.renderer.texture.IIconRegister; @@ -26,6 +27,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.ChatComponentText; import net.minecraft.util.IIcon; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; @@ -45,11 +47,13 @@ public enum FilterMode { private final String label; - FilterMode(String label) { + FilterMode(String label) + { this.label = label; } - public String getLabel() { + public String getLabel() + { return label; } } @@ -94,9 +98,59 @@ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer pla { GuiFactories.playerInventory().open(player, InventoryTypes.PLAYER, player.inventory.currentItem); } + else if (!world.isRemote && TransferUpgrade.getUpgrade(stack) == TransferUpgrade.ADV_FILTER) + { + AdvancedFilterMode mode; + if (player.isSneaking()) + { + mode = cycleAdvancedFilter(stack, false); + } + else + { + mode = cycleAdvancedFilter(stack, true); + } + player.addChatMessage(new ChatComponentText("Filter Mode: " + mode.getLabel())); + } + return stack; } + private AdvancedFilterMode cycleAdvancedFilter(ItemStack stack, boolean up) + { + if (stack.hasTagCompound()) + { + if (stack.stackTagCompound.hasKey("AdvMode")) + { + if (up) + { + stack.stackTagCompound.setByte("AdvMode", (byte) ((stack.stackTagCompound.getByte("AdvMode") + 1) % AdvancedFilterMode.values().length)); + } + else + { + byte mode = stack.stackTagCompound.getByte("AdvMode"); + if (mode == 0) + { + stack.stackTagCompound.setByte("AdvMode", (byte) (AdvancedFilterMode.values().length - 1)); + } + else + { + stack.stackTagCompound.setByte("AdvMode", (byte) (mode - 1)); + } + } + } + else + { + stack.stackTagCompound.setByte("AdvMode", (byte) 1); + } + } + else + { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setByte("AdvMode", (byte) 0); + } + return AdvancedFilterMode.values()[stack.stackTagCompound.getByte("AdvMode")]; + } + @Override public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { ModularPanel panel = new ModularPanel("panel").height(125); @@ -154,7 +208,7 @@ public int getInventorySize() { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { - if (TransferUpgrade.getUpgrade(stack) == TransferUpgrade.FILTER || TransferUpgrade.getUpgrade(stack) == TransferUpgrade.ADV_FILTER) + if (TransferUpgrade.getUpgrade(stack) == TransferUpgrade.FILTER) { if (stack.hasTagCompound()) { @@ -181,5 +235,20 @@ public void addInformation(ItemStack stack, EntityPlayer player, List list, bool } } } + else if (TransferUpgrade.getUpgrade(stack) == TransferUpgrade.ADV_FILTER) + { + if (stack.hasTagCompound()) + { + if (stack.stackTagCompound.hasKey("AdvMode")) + { + byte advFilterMode = stack.stackTagCompound.getByte("AdvMode"); + if (advFilterMode >= 0 && advFilterMode < AdvancedFilterMode.values().length) + { + list.add(AdvancedFilterMode.values()[advFilterMode].getLabel()); + list.add(AdvancedFilterMode.values()[advFilterMode].getDescription()); + } + } + } + } } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java new file mode 100644 index 00000000..e715cf45 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java @@ -0,0 +1,298 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.upgrade; + +import cofh.api.energy.IEnergyContainerItem; +import com.fouristhenumber.utilitiesinexcess.utils.OreDictionaryUtils; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.FurnaceRecipes; +import net.minecraft.util.RegistryDefaulted; + +import static net.minecraft.block.BlockDispenser.dispenseBehaviorRegistry; + +public enum AdvancedFilterMode +{ + DEFAULT("Default.exe", "Does nothing") { + @Override + public boolean matches(ItemStack stack) + { + return true; + } + }, + ITEMS("Items.exe", "Filters Items") { + @Override + public boolean matches(ItemStack stack) + { + return !(stack.getItem() instanceof ItemBlock); + } + }, + BLOCKS("Blocks.exe", "Filters Blocks") { + @Override + public boolean matches(ItemStack stack) + { + return stack.getItem() instanceof ItemBlock; + } + }, + HASSUBTYPES("HasSubTypes.exe", "Filters items that have subtypes e.g. wool, or have Meta Items") { + @Override + public boolean matches(ItemStack stack) + { + Item item = stack.getItem(); + if (item == null) + { + return false; + } + return stack.getItem().getHasSubtypes(); + } + }, + STACKSIZE1("StackSize1.exe", "Filters items that have a maximum stack size of 1") { + @Override + public boolean matches(ItemStack stack) + { + return stack.getMaxStackSize() == 1; + } + }, + STACKSIZE64("StackSize64.exe", "Filters items that have a maximum stack size of 64") { + @Override + public boolean matches(ItemStack stack) + { + return stack.getMaxStackSize() == 64; + } + }, + OREDICTORE("OreDictOre.exe", "Filters items that are ore dictionaried to Ore") { + @Override + public boolean matches(ItemStack stack) + { + return OreDictionaryUtils.IsDictUnder(stack, "ore"); + } + }, + OREDICTINGOT("OreDictIngot.exe", "Filters items that are ore dictionaried to Ingot") { + @Override + public boolean matches(ItemStack stack) + { + return OreDictionaryUtils.IsDictUnder(stack, "ingot"); + } + }, + OREDICTNUGGET("OreDictNugget.exe", "Filters items that are ore dictionaried to Nugget") { + @Override + public boolean matches(ItemStack stack) + { + return OreDictionaryUtils.IsDictUnder(stack, "nugget"); + } + }, + OREDICTGEM("OreDictGem.exe", "Filters items that are ore dictionaried to Gem") { + @Override + public boolean matches(ItemStack stack) + { + return OreDictionaryUtils.IsDictUnder(stack, "gem"); + } + }, + OREDICTDUST("OreDictDust.exe", "Filters items that are ore dictionaried to Dust") { + @Override + public boolean matches(ItemStack stack) + { + return OreDictionaryUtils.IsDictUnder(stack, "dust"); + } + }, + OREDICTBLOCK("OreDictBlock.exe", "Filters items that are ore dictionaried to resource Blocks") { + @Override + public boolean matches(ItemStack stack) + { + return OreDictionaryUtils.IsDictUnder(stack, "block"); + } + }, + ENERGYITEM("EnergyItem.exe", "Filters items that can contain RF energy") { + @Override + public boolean matches(ItemStack stack) + { + return stack.getItem() instanceof IEnergyContainerItem; + } + }, + ENERGYITEMEMPTY("EnergyItemEmpty.exe", "Filters items that can contain RF energy and are empty") { + @Override + public boolean matches(ItemStack stack) + { + if (stack.getItem() instanceof IEnergyContainerItem energyItem) + { + return energyItem.getEnergyStored(stack) == 0; + } + return false; + } + }, + ENERGYITEMLESSTHAN50("EnergyItem<50.exe", "Filters items that can contain RF energy and contain less than 50% energy") { + @Override + public boolean matches(ItemStack stack) + { + if (stack.getItem() instanceof IEnergyContainerItem energyItem) + { + return energyItem.getEnergyStored(stack) < (energyItem.getMaxEnergyStored(stack) / 2); + } + return false; + } + }, + ENERGYITEMFULL("EnergyItemFull.exe", "Filters items that can contain RF energy and are full of energy") { + @Override + public boolean matches(ItemStack stack) + { + if (stack.getItem() instanceof IEnergyContainerItem energyItem) + { + return energyItem.getEnergyStored(stack) == energyItem.getMaxEnergyStored(stack); + } + return false; + } + }, + FOOD("Food.exe", "Filters food items") { + @Override + public boolean matches(ItemStack stack) + { + return stack != null && stack.getItem() instanceof ItemFood; + } + }, + SMELTABLE("Smeltable.exe", "Filters items that are smeltable") { + @Override + public boolean matches(ItemStack stack) + { + return FurnaceRecipes.smelting().getSmeltingResult(stack) != null; + } + }, + ENCHANTED("Enchanted.exe", "Filters items that are enchanted") { + @Override + public boolean matches(ItemStack stack) + { + return stack != null && stack.isItemEnchanted(); + } + }, + ENCHANTABLE("Enchantable.exe", "Filters items that can be enchanted") { + @Override + public boolean matches(ItemStack stack) + { + if (stack != null && stack.getItem() != null) { + return stack.getItem().getItemEnchantability() > 0; + } + return false; + } + }, + HASCONTAINERITEM("HasContainerItem.exe", "Filters items that have a container, e.g. water buckets") { + @Override + public boolean matches(ItemStack stack) { + if (stack != null && stack.getItem() != null) + { + return stack.getItem().hasContainerItem(stack); + } + return false; + } + }, + HASDURABILITYBARSHOWN("HasDurabilityBarShow.exe", "Filters items that have a durability bar that can be seen") { + @Override + public boolean matches(ItemStack stack) { + return stack != null && stack.isItemStackDamageable() && stack.getItemDamage() != 0; + } + }, + HASDURABILITYBARFULL("HasDurabilityBarFull.exe", "Filters items that have a durability bar and aren't damaged") { + @Override + public boolean matches(ItemStack stack) + { + return stack != null && stack.isItemStackDamageable() && stack.getItemDamage() == 0; + } + }, + DURABILITYBARLESSTHAN90("DurabilityBar<90.exe", "Filters items with less than 90% durability") { + @Override + public boolean matches(ItemStack stack) + { + float d = getDurabilityPercent(stack); + return d >= 0 && d < 0.90f; + } + }, + DURABILITYBARLESSTHAN50("DurabilityBar<50.exe", "Filters items with less than 50% durability") { + @Override + public boolean matches(ItemStack stack) + { + float d = getDurabilityPercent(stack); + return d >= 0 && d < 0.50f; + } + }, + DURABILITYBARLESSTHAN10("DurabilityBar<10.exe", "Filters items with less than 10% durability") { + @Override + public boolean matches(ItemStack stack) + { + float d = getDurabilityPercent(stack); + return d >= 0 && d < 0.10f; + } + }, + DURABLITYBAREMPTY("DurabilityBarEmpty.exe", "Filters items that are at max damage") { + @Override + public boolean matches(ItemStack stack) + { + return stack != null && stack.isItemStackDamageable() && stack.getItemDamage() >= stack.getMaxDamage(); + } + }, + HASDISPLAYNAME("HasDisplayName.exe", "Filters items with unique display text such as named items") { + @Override + public boolean matches(ItemStack stack) + { + return stack.hasDisplayName(); + } + }, + REPAIRABLE("Repairable.exe", "Filters items that are repairable in an anvil") { + @Override + public boolean matches(ItemStack stack) + { + if (stack == null || stack.getItem() == null) + { + return false; + } + Item item = stack.getItem(); + return item.isRepairable() && item.isDamageable(); + } + }, + HASDISPENSERBEHAVIOR("HasDispenserBehavior.exe", "Filters items that have unique usages in dispensers") { + @Override + public boolean matches(ItemStack stack) + { + return ((RegistryDefaulted) dispenseBehaviorRegistry).containsKey(stack.getItem()); + } + }, + PLANTABLE("Plantable.exe", "Filters items that are plantable on the ground or tilled soil") { + @Override + public boolean matches(ItemStack stack) { + return false; // God knows how to do this... I don't see how to do this without a registry. It's gonna be case by case. + } + }; + + private final String label; + + // I've added a description for these filter modes because personally it took me so long + // to figure some of them out I can assume most players have no idea. Some I still can't figureout. + private final String description; + AdvancedFilterMode(String label, String description) + { + this.label = label; + this.description = description; + } + + public String getLabel() + { + return label; + } + + public String getDescription() + { + return description; + } + + public abstract boolean matches(ItemStack stack); + + private static float getDurabilityPercent(ItemStack stack) + { + if (stack == null || !stack.isItemStackDamageable()) { + return -1f; + } + + int max = stack.getMaxDamage(); + if (max <= 0) return -1f; + + return (max - stack.getItemDamage()) / (float) max; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java deleted file mode 100644 index f0f4d1c1..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java +++ /dev/null @@ -1,178 +0,0 @@ -//package com.fouristhenumber.utilitiesinexcess.transfer.upgrade; -// -//import java.util.List; -//import java.util.stream.Collectors; -//import java.util.stream.Stream; -// -//import net.minecraft.entity.player.EntityPlayer; -//import net.minecraft.inventory.IInventory; -//import net.minecraft.item.ItemStack; -// -//import org.jetbrains.annotations.Nullable; -// -//import com.fouristhenumber.utilitiesinexcess.transfer.filter.ITransferFilter; -//import com.fouristhenumber.utilitiesinexcess.transfer.walk.ITransferWalker; -//import com.fouristhenumber.utilitiesinexcess.transfer.walk.RandomWalker; -// -//public class UpgradeInventory implements IInventory { -// -// private final List inv; -// -// public UpgradeInventory(int slots) { -// this.inv = Stream.generate(UpgradeData::new) -// .limit(slots) -// .collect(Collectors.toList()); -// } -// -// public ITransferWalker getWalker() { -// TransferUpgrade upgrade = getWalkerUpgrade(); -// return upgrade == null ? new RandomWalker() : upgrade.getWalker(); -// } -// -// private TransferUpgrade getWalkerUpgrade() { -// return inv.stream() -// .map(UpgradeData::getUpgrade) -// .filter(TransferUpgrade::isWalkerUpgrade) -// .findAny() -// .orElse(null); -// } -// -// @Nullable -// public ITransferFilter getFilter() { -// return null; // todo -// } -// -// // IInventory -// -// @Override -// public int getSizeInventory() { -// return this.inv.size(); -// } -// -// @Override -// public ItemStack getStackInSlot(int index) { -// if (index < 0) return null; -// if (index > this.inv.size()) return null; -// -// return this.inv.get(index) -// .getStack(); -// } -// -// @Override -// public ItemStack decrStackSize(int index, int count) { -// if (index < 0) return null; -// if (index > this.inv.size()) return null; -// -// UpgradeData data = this.inv.get(index); -// if (data == null) return null; -// -// ItemStack stack = data.getStack(); -// int toMove = Math.min(stack.stackSize, count); -// ItemStack newStack = stack.copy(); -// newStack.stackSize = toMove; -// stack.stackSize -= toMove; -// if (stack.stackSize == 0) { -// data.clear(); -// } -// markDirty(); -// return newStack; -// } -// -// @Override -// public void setInventorySlotContents(int index, ItemStack stack) { -// if (index < 0) return; -// if (index > this.inv.size()) return; -// -// UpgradeData data = this.inv.get(index); -// data.set(stack); -// markDirty(); -// } -// -// @Override -// public boolean isItemValidForSlot(int index, ItemStack stack) { -// if (stack == null) return true; // allow stuff to be removed -// TransferUpgrade upgrade = TransferUpgrade.getUpgrade(stack); -// if (upgrade == null) return false; -// -// // Handle special cases -// int walkerIndex = -1; -// int filterIndex = -1; -// for (int i = 0; i < this.inv.size(); i++) { -// UpgradeData data = this.inv.get(i); -// if (data.isEmpty()) continue; -// -// if (data.upgrade.isWalkerUpgrade()) walkerIndex = i; -// if (data.upgrade.isFilterUpgrade()) filterIndex = i; -// } -// -// if (upgrade.isWalkerUpgrade()) return walkerIndex == -1 || walkerIndex == index; -// if (upgrade.isFilterUpgrade()) return walkerIndex == -1 || filterIndex == index; -// return true; -// } -// -// @Override -// public void markDirty() { -// // todo -// } -// -// @Override -// public String getInventoryName() { -// return ""; -// } -// -// @Override -// public boolean hasCustomInventoryName() { -// return false; -// } -// -// @Override -// public int getInventoryStackLimit() { -// return 64; -// } -// -// @Override -// public boolean isUseableByPlayer(EntityPlayer player) { -// return true; -// } -// -// // IInventory - Unused for this inventory -// -// @Override -// public ItemStack getStackInSlotOnClosing(int index) { -// return null; -// } -// -// @Override -// public void openInventory() {} -// -// @Override -// public void closeInventory() {} -// -// private static class UpgradeData { -// -// private ItemStack stack; -// private TransferUpgrade upgrade; -// -// public void set(ItemStack stack) { -// this.stack = stack; -// this.upgrade = TransferUpgrade.getUpgrade(stack); -// } -// -// public ItemStack getStack() { -// return this.stack; -// } -// -// public TransferUpgrade getUpgrade() { -// return this.upgrade; -// } -// -// public boolean isEmpty() { -// return this.stack == null; -// } -// -// public void clear() { -// this.stack = null; -// this.upgrade = null; -// } -// } -//} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/OreDictionaryUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/OreDictionaryUtils.java new file mode 100644 index 00000000..ff20cb05 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/OreDictionaryUtils.java @@ -0,0 +1,19 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +public class OreDictionaryUtils +{ + public static boolean IsDictUnder(ItemStack stack, String dictionaryTerm) { + if (stack == null) return false; + + for (int id : OreDictionary.getOreIDs(stack)) { + if (OreDictionary.getOreName(id).startsWith(dictionaryTerm)) { + return true; + } + } + + return false; + } +} From b9e3c98d4749c573e8844ec99e0dbe1de30f0aab Mon Sep 17 00:00:00 2001 From: rjnasers Date: Sat, 6 Jun 2026 12:39:15 +0200 Subject: [PATCH 14/21] Naming + dev art --- .../common/items/ItemUpgrade.java | 2 +- .../textures/items/upgrade_adv_filter.png | Bin 0 -> 206 bytes .../textures/items/upgrade_creative.png | Bin 0 -> 133 bytes .../textures/items/upgrade_ender_receiver.png | Bin 0 -> 170 bytes .../textures/items/upgrade_ender_transmitter.png | Bin 0 -> 164 bytes .../textures/items/upgrade_filter.png | Bin 0 -> 206 bytes .../textures/items/upgrade_search_breadth.png | Bin 0 -> 137 bytes .../textures/items/upgrade_search_depth.png | Bin 0 -> 171 bytes .../textures/items/upgrade_search_round_robin.png | Bin 0 -> 165 bytes .../textures/items/upgrade_speed.png | Bin 0 -> 159 bytes .../textures/items/upgrade_stack.png | Bin 0 -> 150 bytes .../textures/items/upgrade_world_interaction.png | Bin 0 -> 137 bytes 12 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_adv_filter.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_creative.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_ender_receiver.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_ender_transmitter.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_filter.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_breadth.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_depth.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_round_robin.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_speed.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_stack.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_world_interaction.png diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java index 09872cfc..354035b7 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java @@ -80,7 +80,7 @@ public String getUnlocalizedName(ItemStack stack) { @Override public void registerIcons(IIconRegister register) { for (TransferUpgrade upgrade : TransferUpgrade.VALUES) { - ICONS[upgrade.ordinal()] = register.registerIcon(UtilitiesInExcess.MODID + ":" + upgrade.getName()); + ICONS[upgrade.ordinal()] = register.registerIcon(UtilitiesInExcess.MODID + ":upgrade_" + upgrade.getName()); } } diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_adv_filter.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_adv_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..14c48c902ef48169fb5da4e39f9c0e03bab29eb3 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q$1ZALoEE0=Ln~Mp3lf(#+A<= z$n!7X_MnL!LlAfHaSo#fk+TNPiB%G{#rFT*x0_ZT6Xan(b9Tc)0cJ_2GR9pzCm2$A z4VX7dI!$5xafo?2qk->@99OdmWqJxJ#%Dw;_B!+^M({Gs?2{AT!8ECiO~C71#o>mC zvkIjTmiXkTIhje!6W2KDv%rRh-{pyp*9q)n3%=3 z<7<2K-HodYR6XA@?q-;tHo-!XS@Q0kJO2)gER=Sc!gwOFVNGL%ej=|+l4&y&_fdu! zZchSKB-jk}6E;tkm@eSM-om4p!EnO*2hYJwhHW1jT6v3h2s~w~@hp~*U|>j|8=5Gz SrXmDrIfJLGpUXO@geCyd4mg)nD~xu z$Jh4eySrBxsLoJ(!8CzwM$!!biM)y@8A@(D)-2+2C^OpC%^}5bsVC34Xo;W+!!pT8 z;i4H2Oc`dMbve#tmoEH;Y2z%zON?g!59K)fa~l*kHF{{w=3!=L&{YfVE!?g=2WTyW Mr>mdKI;Vst0En+Pod5s; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_filter.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..153289625c93d020289290c7863d8b3d37a3d64d GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q$1ZALoEE0=Ln~Mp3lg^#J`sz zkmvPVl>;Vr3_;w%$2p7|M9vyCCss+^KeghI`*zdHV}d;FXU=XoD8MYqRK~cA=LACv zuL1K$NvA1{KMpZ3XEgA=k>hGMp-fL9#rTY9#a@RV#Ry)8nSFA?JD4Vwu?cvct2o>c zaaN)9!4jVwH77HPdEy!;eHPfT@Vh+G@jAhMVy8I6)Ur4sr?*S$fevKwboFyt=akR{ E0PyickN^Mx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_breadth.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_breadth.png new file mode 100644 index 0000000000000000000000000000000000000000..9a9cec832328c9848e39e7ec4cce6b07e336064f GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`0iG_7Ar}70HQI|m&2MBnV8O#H zu&b>7;oNCl*8&czwF|NRFgfhw63%SiAaV8v52G~0B_BS9%Bfa*2cFvJtUDyhc0|I- kKqK)GgTJ3N)L+)78&qol`;+063v4g#Z8m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_depth.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_depth.png new file mode 100644 index 0000000000000000000000000000000000000000..b60337e50fded696f031fa3782f94d08a6d9e6eb GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar}70HQI|m&2MBnU{S#< zu&a#y-Ny1LEeqSutK27MC0Z3qHYGCn7<({x^!g+hvvo0^nB~|tk(c4)#+^+0ItO?T zh@V!GY5nLow&3(;QL_=YK9RP}EixddpOD+mnwu>61icoP*hnBxVM|89^6M T%qm$8w4K4z)z4*}Q$iB}Bt1A` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_round_robin.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_round_robin.png new file mode 100644 index 0000000000000000000000000000000000000000..2f6f312f3445418e97cc56a1c40d9adf315862cc GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar}70HQI|m&2MBn;8D!n zvhHqT#qy<1mwQ=a8H^ZM3M8GjFdC>YkaoGiFvD$z_k~#JEsP4iH+UMQ8+1H<)*Ra7 zG>Ln|&Zd2A4|tht{<-nXKUtx2ihIW*ffP+g<`0=_CmA+PHd<)H$dI$t^P4 zu&b>7;oNClfpUjGFnJgoDWnK=F&dmz@HGfm=uRvaYGX8zp18O1yuc2|7ys0bwC`-o zV0Mt&u#+X->VT;5i$@j0LWUPTqnSHAJ)2GR1s<2okYbp~9&xdKVLUs~Mg~t;KbLh* G2~7Z0zcSVU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_stack.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..9210c768a17df9c4dfe6343adc9ad545b70a868b GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`v7RoDAr}70fBttqv}a~*C@hdV zQ1Qh!%>VCpu_FSmcSBb;}E}unv8??9fOC31Cz_3feOR%x*lnl@!22WQ%mvv4FO#os^G7A6z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_world_interaction.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_world_interaction.png new file mode 100644 index 0000000000000000000000000000000000000000..34d4aa670eb796a9a42430eb290b1752e98035ba GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`0iG_7Ar}70U(WvhGry7PfJZR% zpZirtIU@J^uGdDyZpakk5A&_7j5jzE$m4L0BdF&MQ;Fpa&x*qhIr;~D Date: Sat, 6 Jun 2026 23:42:56 +0200 Subject: [PATCH 15/21] Filters maybe working. Need to test more. --- .../common/recipe/RecipeLoader.java | 6 +- .../transfer/ITransferNetworkComponent.java | 3 +- .../transfer/TileEntityItemTransferNode.java | 8 +- .../TileEntityNetworkComponentBase.java | 5 +- .../SharedNodeLogic/INodeLogicHost.java | 1 - .../ITransferNetworkLogic.java | 4 +- .../SharedNodeLogic/IWalkingComponent.java | 7 ++ .../ItemTransferNodeLogic.java | 2 +- .../SharedNodeLogic/NetworkLogic.java | 3 +- .../pipe/CrossOverPipeLogic.java | 4 +- .../SharedNodeLogic/pipe/FilterPipeLogic.java | 112 +++++++++++++++++- .../transfer/upgrade/AdvancedFilterMode.java | 5 + .../transfer/walk/ItemWalker.java | 10 +- .../transfer/walk/WalkerBase.java | 7 +- .../transfer/walk/stepper/BFSStepper.java | 5 +- .../transfer/walk/stepper/DFSStepper.java | 5 +- .../transfer/walk/stepper/RandomStepper.java | 7 +- .../walk/stepper/RoundRobinStepper.java | 5 +- .../transfer/walk/stepper/StepStrategy.java | 5 +- .../utilitiesinexcess/utils/ItemFilter.java | 37 ++++++ .../utils/ItemStackInventory.java | 45 +++++++ .../utilitiesinexcess/utils/ItemStackKey.java | 37 ++++++ 22 files changed, 292 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/IWalkingComponent.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemFilter.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackKey.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java index a2f30784..ab853096 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java @@ -1325,7 +1325,8 @@ private static void loadFilterVariantRecipes() { if (TransferConfig.EnableTransferSystem) { - GameRegistry.addRecipe( new NBTPreservingRecipe( + GameRegistry.addRecipe( + new NBTPreservingRecipe( setNBTForItem(TransferUpgrade.FILTER.getStack(1), "Mode", new NBTTagByte((byte) ItemUpgrade.FilterMode.INVERTED.ordinal())).theStack, Arrays.asList( TransferUpgrade.FILTER.getStack(1).theStack, @@ -1360,6 +1361,9 @@ private static void loadFilterVariantRecipes() ), 0)); + // Clears NBT + addShapelessRecipe(TransferUpgrade.FILTER.getStack(1), TransferUpgrade.FILTER.getStack(1)); + addShapelessRecipe(TransferUpgrade.ADV_FILTER.getStack(1), TransferUpgrade.ADV_FILTER.getStack(1)); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java index 2687c097..e09e3f1f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; import net.minecraft.tileentity.TileEntity; @@ -21,7 +22,7 @@ public interface ITransferNetworkComponent Connection[] getValidExternalNeighbors(ForgeDirection fromDirection, ITransferNetworkComponent walking); ITransferNetworkComponent[] getNetworkNeighbors(); - MaskedArrayView getWalkableDirs(TransportType targetType, ForgeDirection fromDirection); + MaskedArrayView getWalkableDirs(TransportType targetType, ForgeDirection fromDirection, IWalkingComponent walkingComponent); int getRawConnectionMask(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java index 1bc3da96..7f28f87c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java @@ -2,6 +2,7 @@ import com.cleanroommc.modularui.screen.ModularScreen; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ItemTransferNodeLogic; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -18,7 +19,7 @@ public class TileEntityItemTransferNode extends TileEntityTransferNodeBase - implements IGuiHolder + implements IGuiHolder, IWalkingComponent { public TileEntityItemTransferNode() @@ -158,4 +159,9 @@ public void updateSourceInventory() { logic.updateSourceInventory(this); } + + @Override + public ItemStack getWalkingObject() { + return logic.getStackInSlot(0); + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java index da1561fd..ec651d8d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java @@ -3,6 +3,7 @@ import codechicken.lib.world.IChunkLoadTile; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ITransferNetworkLogic; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; import net.minecraft.tileentity.TileEntity; @@ -104,9 +105,9 @@ public ITransferNetworkComponent[] getNetworkNeighbors() // TODO make better @Override - public MaskedArrayView getWalkableDirs(TransportType targetType, ForgeDirection fromDirection) + public MaskedArrayView getWalkableDirs(TransportType targetType, ForgeDirection fromDirection, IWalkingComponent walkingComponent) { - return logic.getWalkableDirs(fromDirection); + return logic.getWalkableDirs(targetType, fromDirection, walkingComponent); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/INodeLogicHost.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/INodeLogicHost.java index 92f1e8bd..e96c7f37 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/INodeLogicHost.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/INodeLogicHost.java @@ -8,7 +8,6 @@ // Class that is implemented by public interface INodeLogicHost extends ISidedInventory, ITransferNetworkComponent { - World getWorld(); ForgeDirection getFacing(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java index 8093f223..76a1357a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; import net.minecraftforge.common.util.ForgeDirection; @@ -17,7 +18,8 @@ public interface ITransferNetworkLogic void removeNeighbor(ForgeDirection direction); void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor); - MaskedArrayView getWalkableDirs(ForgeDirection direction); + // I really don't like this method, but I have no idea what is the best way to fix the inheritance chain here. + MaskedArrayView getWalkableDirs(TransportType transPortType, ForgeDirection direction, IWalkingComponent walkingComponent); int getNetworkMask(); int getExternalMask(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/IWalkingComponent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/IWalkingComponent.java new file mode 100644 index 00000000..c6efd890 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/IWalkingComponent.java @@ -0,0 +1,7 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + +// Honestly I don't like how I'm doing this with the inheritance. +public interface IWalkingComponent extends INodeLogicHost +{ + T getWalkingObject(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java index c0bde150..d7c9fab5 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java @@ -42,7 +42,7 @@ public class ItemTransferNodeLogic extends NetworkLogic implements IInventory IInventory connectedInventory; public ItemWalker walker; - public ItemTransferNodeLogic(INodeLogicHost host) + public ItemTransferNodeLogic(IWalkingComponent host) { super(host); walker = new ItemWalker(host); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java index c6105210..78cc5149 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java @@ -2,6 +2,7 @@ import cofh.api.energy.IEnergyReceiver; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; import net.minecraft.inventory.IInventory; import net.minecraft.tileentity.TileEntity; @@ -156,7 +157,7 @@ public void removeExternal(ForgeDirection direction) } @Override - public MaskedArrayView getWalkableDirs(ForgeDirection incomingDirection) + public MaskedArrayView getWalkableDirs(TransportType transportType, ForgeDirection incomingDirection, IWalkingComponent walkingComponent) { int mask; if (incomingDirection != null) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java index 0b40e6e6..41c10b46 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java @@ -2,7 +2,9 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -193,7 +195,7 @@ public void removeExternal(ForgeDirection dir) // Only valid walkable neighbor is across from the fromDirection @Override - public MaskedArrayView getWalkableDirs(ForgeDirection incomingDirection) + public MaskedArrayView getWalkableDirs(TransportType transportType, ForgeDirection incomingDirection, IWalkingComponent walkingComponent) { int mask = 0; mask |= (1 << incomingDirection.getOpposite().ordinal()); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java index c26c8dc1..2241333e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java @@ -13,17 +13,33 @@ import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; import com.cleanroommc.modularui.widgets.slot.SlotGroup; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; +import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.AdvancedFilterMode; +import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.TransferUpgrade; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; +import com.fouristhenumber.utilitiesinexcess.utils.ItemFilter; +import com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventory; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.List; + +import static com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventory.getInventoryContentsFromStack; public class FilterPipeLogic extends NetworkLogic implements IInventory { // Slot filters are organized in the same way that - ItemStack[] filters = new ItemStack[6]; + private final ItemStack[] filters = new ItemStack[6]; + + + private ItemFilter[] logicalFilter = new ItemFilter[6]; public FilterPipeLogic(ITransferNetworkComponent host) { super(host); @@ -133,9 +149,103 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .pos(79, 34) .mapTo(1, 1, index -> new ItemSlot().slot(slot))); + syncManager.addCloseListener(this::parseInventoryToFilter); + return panel; } + public void parseInventoryToFilter(EntityPlayer player) + { + if (!player.worldObj.isRemote) + { + for (int i = 0; i < filters.length; i++) + { + if (filters[i] != null) + { + logicalFilter[i] = new ItemFilter(); + if (filters[i].getItem() instanceof ItemUpgrade) + { + if (TransferUpgrade.getUpgrade(filters[i]) == TransferUpgrade.FILTER) // Case where it's a filter + { + parseFilterItem(filters[i], i); + } + else if (TransferUpgrade.getUpgrade(filters[i]) == TransferUpgrade.ADV_FILTER) // Case where it's an advanced filter + { + if (filters[i].hasTagCompound() && filters[i].stackTagCompound.getByte("Mode") == ItemUpgrade.FilterMode.INVERTED.ordinal()) + { + logicalFilter[i].addToPredicates(AdvancedFilterMode.values()[filters[i].getItemDamage()]::invMatches); + } + else + { + logicalFilter[i].addToPredicates(AdvancedFilterMode.values()[filters[i].getItemDamage()]::matches); + } + } + } + else + { + logicalFilter[i].addToWhiteList(filters[i]); + } + } + } + } + } + + public void parseFilterItem(ItemStack filter, int slot) + { + ItemUpgrade filterUpgrade = (ItemUpgrade) filter.getItem(); + List containedItems = getInventoryContentsFromStack(filter); + + for (ItemStack containedItem : containedItems) + { + if (containedItem.getItem() instanceof ItemUpgrade) + { + if (TransferUpgrade.getUpgrade(containedItem) == TransferUpgrade.FILTER) // Case where it's a filter + { + parseFilterItem(containedItem, slot); + } + else if (TransferUpgrade.getUpgrade(containedItem) == TransferUpgrade.ADV_FILTER) // Case where it's an advanced filter + { + if (containedItem.hasTagCompound() && containedItem.stackTagCompound.getByte("Mode") == ItemUpgrade.FilterMode.INVERTED.ordinal()) + { + logicalFilter[slot].addToPredicates(AdvancedFilterMode.values()[containedItem.getItemDamage()]::invMatches); + } + else + { + logicalFilter[slot].addToPredicates(AdvancedFilterMode.values()[containedItem.getItemDamage()]::matches); + } + } + } + else + { + logicalFilter[slot].addToWhiteList(containedItem); + } + } + + } + + @Override + public MaskedArrayView getWalkableDirs(TransportType transportType, ForgeDirection incomingDirection, IWalkingComponent walkingComponent) + { + Object walkingObject = walkingComponent.getWalkingObject(); + if (walkingObject instanceof ItemStack stack) + { + int mask = 0; + for (int i = 0; i < filters.length; i++) + { + if (filters[i] == null && (networkMask & (1 << i)) != 0) // If a direction is unfiltered and has a network connection. + { + mask = mask | (1 << i); + } + else if (logicalFilter[i].matches(stack))// We're filtered + { + mask = mask | (1 << i); + } + } + return new MaskedArrayView<>(mask, networkNeighbors); + } + return super.getWalkableDirs(transportType, incomingDirection, walkingComponent); + } + public boolean isUseableByPlayer(EntityPlayer player) { return true; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java index e715cf45..4012b5b4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java @@ -283,6 +283,11 @@ public String getDescription() public abstract boolean matches(ItemStack stack); + public boolean invMatches(ItemStack stack) + { + return !matches(stack); + } + private static float getDurabilityPercent(ItemStack stack) { if (stack == null || !stack.isItemStackDamageable()) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java index 7968de3b..a231abc3 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java @@ -1,23 +1,21 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.BFSStepper; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.DFSStepper; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.ItemTargetResolver; import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.RandomStepper; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.RoundRobinStepper; import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.StepStrategy; import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.TargetResolver; import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; import java.util.List; -public class ItemWalker extends WalkerBase +public class ItemWalker extends WalkerBase { StepStrategy stepper; TargetResolver targeter = new ItemTargetResolver(); - public ItemWalker(ITransferNetworkComponent originComponent) + public ItemWalker(IWalkingComponent originComponent) { super(originComponent); stepper = new RandomStepper(TransportType.ITEM); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java index 1083d64a..441d0562 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java @@ -1,18 +1,19 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.TargetResolver; import java.util.List; import java.util.Random; -public abstract class WalkerBase +public abstract class WalkerBase { - protected ITransferNetworkComponent walkingComponent; + protected IWalkingComponent walkingComponent; protected ITransferNetworkComponent currentComponent; Random rand = new Random(); - WalkerBase(ITransferNetworkComponent walkingComponent) + WalkerBase(IWalkingComponent walkingComponent) { this.walkingComponent = walkingComponent; this.currentComponent = walkingComponent; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/BFSStepper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/BFSStepper.java index 7a57a09a..fdbe1ce4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/BFSStepper.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/BFSStepper.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; public class BFSStepper extends StepStrategy @@ -11,13 +12,13 @@ public BFSStepper(TransportType transporting) { } @Override - public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) + public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) { return null; } @Override - public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) + public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) { return null; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/DFSStepper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/DFSStepper.java index 3b614ac2..e6297d7b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/DFSStepper.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/DFSStepper.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; public class DFSStepper extends StepStrategy @@ -11,12 +12,12 @@ public DFSStepper(TransportType transporting) { } @Override - public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) { + public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) { return null; } @Override - public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) { + public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) { return null; } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RandomStepper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RandomStepper.java index 7d2e2101..05a1db2d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RandomStepper.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RandomStepper.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; import net.minecraftforge.common.util.ForgeDirection; @@ -16,10 +17,10 @@ public RandomStepper(TransportType transporting) { } @Override - public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) + public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) { ITransferNetworkComponent newComponent; - MaskedArrayView options = currentComponent.getWalkableDirs(transporting, fromDirection); + MaskedArrayView options = currentComponent.getWalkableDirs(transporting, fromDirection, walkingComponent); if (options.size() != 0) { int direction = rand.nextInt(options.size()); @@ -35,7 +36,7 @@ public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent } @Override - public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) { + public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) { return currentComponent; } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RoundRobinStepper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RoundRobinStepper.java index 8ee33658..24221050 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RoundRobinStepper.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RoundRobinStepper.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; public class RoundRobinStepper extends StepStrategy @@ -10,12 +11,12 @@ public RoundRobinStepper(TransportType transporting) { } @Override - public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) { + public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) { return null; } @Override - public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent) { + public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) { return null; } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java index 09c9bc2b..06c0c554 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; import net.minecraftforge.common.util.ForgeDirection; @@ -22,6 +23,6 @@ public enum Strategy this.transporting = type; } - public abstract ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent); - public abstract ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, ITransferNetworkComponent walkingComponent); + public abstract ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent); + public abstract ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemFilter.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemFilter.java new file mode 100644 index 00000000..6b1b2a3d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemFilter.java @@ -0,0 +1,37 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.item.ItemStack; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Predicate; + +public class ItemFilter +{ + private final Set whitelist = new HashSet<>(); + private final Set blacklist = new HashSet<>(); + + private final List> predicates = new ArrayList<>(); + + public boolean matches(ItemStack stack) { + if (whitelist.contains(new ItemStackKey(stack))) return true; + + for (Predicate p : predicates) { + if (p.test(stack)) return true; + } + + return false; + } + + public void addToWhiteList(ItemStack stack) + { + whitelist.add(new ItemStackKey(stack)); + } + + public void addToPredicates(Predicate pred) + { + predicates.add(pred); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java index ef6aea08..faa2ee01 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java @@ -6,6 +6,9 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import java.util.ArrayList; +import java.util.List; + public class ItemStackInventory implements IInventory { private final int size; @@ -73,6 +76,46 @@ public void writeInventoryToHeldStack(EntityPlayer player) compound.setTag("Items", itemList); } + public static List getInventoryContentsFromStack(ItemStack itemInventory) + { + if (itemInventory == null || !itemInventory.hasTagCompound()) + { + return null; + } + + NBTTagCompound compound = itemInventory.stackTagCompound; + + if (!compound.hasKey("Items")) + { + return null; + } + + int size = compound.getInteger("size"); + List contents = new ArrayList(size); + + // Fill with nulls so we can set by index + for (int i = 0; i < size; i++) + { + contents.add(null); + } + + NBTTagList itemList = compound.getTagList("Items", 10); // 10 = NBTTagCompound + + for (int i = 0; i < itemList.tagCount(); i++) + { + NBTTagCompound itemCompound = itemList.getCompoundTagAt(i); + + int slot = itemCompound.getByte("Slot") & 255; // prevent negative index + + if (slot >= 0 && slot < size) + { + contents.set(slot, ItemStack.loadItemStackFromNBT(itemCompound)); + } + } + + return contents; + } + @Override public int getSizeInventory() { return size; @@ -146,4 +189,6 @@ public void closeInventory() { public boolean isItemValidForSlot(int index, ItemStack stack) { return true; } + + } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackKey.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackKey.java new file mode 100644 index 00000000..60cca407 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackKey.java @@ -0,0 +1,37 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import java.util.Objects; + +class ItemStackKey { + private final Item item; + private final int meta; + private final NBTTagCompound tag; + + public ItemStackKey(ItemStack stack) { + this.item = stack.getItem(); + this.meta = stack.getItemDamage(); + this.tag = stack.stackTagCompound == null ? null : (NBTTagCompound) stack.stackTagCompound.copy(); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof ItemStackKey)) return false; + ItemStackKey other = (ItemStackKey) o; + + return item == other.item + && meta == other.meta + && Objects.equals(tag, other.tag); + } + + @Override + public int hashCode() { + int result = item.hashCode(); + result = 31 * result + meta; + result = 31 * result + (tag != null ? tag.hashCode() : 0); + return result; + } +} From 961d746aa5f3c56dc05560eddabd4fa57ff6fb77 Mon Sep 17 00:00:00 2001 From: rjnasers Date: Mon, 8 Jun 2026 01:13:59 +0200 Subject: [PATCH 16/21] Fuck my life getting the slots to tint seems to be fucking impossible. --- .../common/items/ItemUpgrade.java | 7 +- .../SharedNodeLogic/pipe/FilterPipeLogic.java | 77 ++++++++++-------- .../utilitiesinexcess/utils/FilterThemes.java | 14 ++++ .../assets/utilitiesinexcess/lang/en_US.lang | 2 + .../textures/blocks/filter_pipe_0.png | Bin 166 -> 218 bytes .../textures/blocks/filter_pipe_1.png | Bin 166 -> 218 bytes .../textures/blocks/filter_pipe_2.png | Bin 165 -> 212 bytes .../textures/blocks/filter_pipe_3.png | Bin 165 -> 212 bytes .../textures/blocks/filter_pipe_4.png | Bin 165 -> 212 bytes .../textures/blocks/filter_pipe_5.png | Bin 165 -> 212 bytes 10 files changed, 66 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/FilterThemes.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java index 354035b7..bff4a107 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java @@ -65,6 +65,11 @@ public ItemUpgrade() { setHasSubtypes(true); } + public String getInventoryName() + { + return "gui.title.filter.name"; + } + @SideOnly(Side.CLIENT) @Override public IIcon getIconFromDamage(int meta) { @@ -173,7 +178,7 @@ public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncMa IItemHandler handler = new InvWrapper(itemInventory); panel.child( - IKey.str(StatCollector.translateToLocal("Item Filter")) + IKey.str(StatCollector.translateToLocal(getInventoryName())) .asWidget() .marginLeft(5) .marginRight(5) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java index 2241333e..47df20b9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java @@ -7,12 +7,9 @@ import com.cleanroommc.modularui.utils.item.IItemHandler; import com.cleanroommc.modularui.utils.item.InvWrapper; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.layout.Grid; import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; -import com.cleanroommc.modularui.widgets.slot.SlotGroup; import com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; @@ -21,7 +18,6 @@ import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.TransferUpgrade; import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; import com.fouristhenumber.utilitiesinexcess.utils.ItemFilter; -import com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventory; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -31,6 +27,7 @@ import java.util.List; +import static com.fouristhenumber.utilitiesinexcess.utils.FilterThemes.PINK_SLOT; import static com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventory.getInventoryContentsFromStack; public class FilterPipeLogic extends NetworkLogic implements IInventory @@ -116,39 +113,52 @@ public void markDirty() { public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings, IInventory host) { - SlotGroup slotGroup = new SlotGroup("transfer_node_buffer[0]", 1); - SlotGroup slotGroup1 = new SlotGroup("transfer_node_upgrades", 1); - ModularPanel panel = new ModularPanel("panel"); panel.bindPlayerInventory(); + panel.height(192); panel.child( - new ParentWidget<>().coverChildren() - .topRelAnchor(0, 1) - .child( - IKey.str(StatCollector.translateToLocal(getInventoryName())) - .asWidget() - .marginLeft(5) - .marginRight(5) - .marginTop(5) - .marginBottom(-15))); + IKey.str(StatCollector.translateToLocal(getInventoryName())) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15) + ); IItemHandler itemHandler = new InvWrapper(host); - Flow flow = Flow.row(); - flow.pos(34,60).size(108,18); - for (int i = 0; i < 5; i++) - { - flow.child(new ItemSlot().slot(new ModularSlot(itemHandler,i + 1).slotGroup(slotGroup1))); - } - panel.child(flow); - ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); - - panel.child( - new Grid().coverChildren() - .pos(79, 34) - .mapTo(1, 1, index -> new ItemSlot().slot(slot))); - + Flow parentRow = Flow.row(); + parentRow.top(15); + parentRow.size(18*5); + + Flow leftCol = Flow.col(); + leftCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 2))); + leftCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 4))); + leftCol.childPadding(18); + leftCol.width(18); + leftCol.top(18); + parentRow.child(leftCol); + + Flow midCol = Flow.col(); + midCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 1)).widgetTheme(PINK_SLOT)); + midCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 0))); + midCol.childPadding(3*18); + midCol.width(18); + parentRow.child(midCol); + + Flow rightCol = Flow.col(); + rightCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 3))); + rightCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 5))); + rightCol.childPadding(18); + rightCol.width(18); + rightCol.top(18); + parentRow.child(rightCol); + + panel.child(parentRow); + + parentRow.horizontalCenter(); + parentRow.childPadding(18); syncManager.addCloseListener(this::parseInventoryToFilter); return panel; @@ -192,9 +202,11 @@ else if (TransferUpgrade.getUpgrade(filters[i]) == TransferUpgrade.ADV_FILTER) / public void parseFilterItem(ItemStack filter, int slot) { - ItemUpgrade filterUpgrade = (ItemUpgrade) filter.getItem(); List containedItems = getInventoryContentsFromStack(filter); - + if (containedItems == null) + { + return; + } for (ItemStack containedItem : containedItems) { if (containedItem.getItem() instanceof ItemUpgrade) @@ -220,7 +232,6 @@ else if (TransferUpgrade.getUpgrade(containedItem) == TransferUpgrade.ADV_FILTER logicalFilter[slot].addToWhiteList(containedItem); } } - } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/FilterThemes.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/FilterThemes.java new file mode 100644 index 00000000..0cb194ce --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/FilterThemes.java @@ -0,0 +1,14 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import com.cleanroommc.modularui.api.IThemeApi; +import com.cleanroommc.modularui.drawable.GuiTextures; +import com.cleanroommc.modularui.theme.SlotTheme; +import com.cleanroommc.modularui.theme.WidgetThemeKey; +import com.cleanroommc.modularui.utils.Color; + +public class FilterThemes +{ + public static WidgetThemeKey PINK_SLOT = IThemeApi.get().widgetThemeKeyBuilder("pinkSlot", SlotTheme.class) + .defaultTheme(new SlotTheme(18, 18, GuiTextures.SLOT_ITEM, Color.PINK.main, 0xFF404040, false, Color.PINK.main, Color.withAlpha(Color.PINK.main, 0x60))) + .register(); +} diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index 4bdcb2df..fe93775f 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -561,3 +561,5 @@ ue_wall.name=%s Wall ue_fence.name=%s Fence ue_sphere.name=%s Impossible Object +gui.title.filter_pipe.name=Filter Pipe +gui.title.filter.name=Filter diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_0.png index e2108b73e674ed2448a0d23251215c48fb9ad4cc..9902598b0a62047468d7f83aba4b1fcf0d76143d 100644 GIT binary patch delta 190 zcmV;v073tz0onnOB!7iTL_t(IPh(`j0h*KY|7Yvjfn}#&I>b;rZz3Z$rC0?)3P%kf zAq?jG@%_gZx_4FLQG{Qt)5jWLj33Lzuo}?)JDfpv+ct)`KmRej3-n>Qu+)Zh1BBLZ zVGw3#Vz}+)h1&p%y?`qvdW4()=M{ermj3)wl3~Zn)1;-uQ8xn^7>Er600muhWhs=N sH2?qr5M*USM>jb^K{7ExML0w5&!@I07*qoM6N<$f^0)j%m4rY delta 138 zcmV;50CoS`0j2?vB!6v5L_t(IPh(`j0qk8p{;#`!2P_+;slsq@_YOvEO0f!p6pk7| zLKuJo3s+1eJ-!W=nkTD@O9=y`(ncSw2Go~dXL$SbA6TO>I}=0Psk>MWq1*t9y?`$z s@@cFFOMki%N?uAFHNfLPF<}4z&FOE4flJ9W00000NkvXXt^-0~g6H@(&Hw-a diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_1.png index e2108b73e674ed2448a0d23251215c48fb9ad4cc..9902598b0a62047468d7f83aba4b1fcf0d76143d 100644 GIT binary patch delta 190 zcmV;v073tz0onnOB!7iTL_t(IPh(`j0h*KY|7Yvjfn}#&I>b;rZz3Z$rC0?)3P%kf zAq?jG@%_gZx_4FLQG{Qt)5jWLj33Lzuo}?)JDfpv+ct)`KmRej3-n>Qu+)Zh1BBLZ zVGw3#Vz}+)h1&p%y?`qvdW4()=M{ermj3)wl3~Zn)1;-uQ8xn^7>Er600muhWhs=N sH2?qr5M*USM>jb^K{7ExML0w5&!@I07*qoM6N<$f^0)j%m4rY delta 138 zcmV;50CoS`0j2?vB!6v5L_t(IPh(`j0qk8p{;#`!2P_+;slsq@_YOvEO0f!p6pk7| zLKuJo3s+1eJ-!W=nkTD@O9=y`(ncSw2Go~dXL$SbA6TO>I}=0Psk>MWq1*t9y?`$z s@@cFFOMki%N?uAFHNfLPF<}4z&FOE4flJ9W00000NkvXXt^-0~g6H@(&Hw-a diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_2.png index 796cbd107c2afb4ab2ee89ddfb7a469b1ecb8bf2..6b770953cc0d1f24056b8a38ca7bf64fddad3922 100644 GIT binary patch delta 184 zcmV;p07w6&0n`DIB!2;OQb$4nuFf3k0001vNkl#}J ziFyBVsbj(=K`a@IR0M00000i^+uB!6s4L_t(IPh(`j0qk8p{vX)29W3kM=E-ny_YOvEO0f!p6pk7| zLKuJo3s+1eJ-!W=nkTD@O9=y`(ncSw2Go~dXL$SbA6TO>I}=0Psk>MWq1*t9y?`$z rvNJ-w@bf8sdsMIe20000#}J ziFyBVsbj(=K`a@IR0M00000i^+uB!6s4L_t(IPh(`j0qk8p{vX)29W3kM=E-ny_YOvEO0f!p6pk7| zLKuJo3s+1eJ-!W=nkTD@O9=y`(ncSw2Go~dXL$SbA6TO>I}=0Psk>MWq1*t9y?`$z rvNJ-w@bf8sdsMIe20000#}J ziFyBVsbj(=K`a%rLhr&Pe^aNG|ShDr(uuAkjI>4a1Z5zYepZ^%% z1^O`Xia*Dy4zCy9{`|)v%#PoeEK@HX!Y(7g!0;~6hv6NR`!V^YBwm9sKzoVR|BvfM m|9@OB`oF!zYBVL%(f|NfXD%SumZU%c00000i^+uB!6s4L_t(IPh(`j0qk8p{vX)29W3kM=E-ny_YOvEO0f!p6pk7| zLKuJo3s+1eJ-!W=nkTD@O9=zxTNxFs25jN^&+zu=Kd?q&b|!{3t{1QxLb(AHdjVfc rWM_nU;pcxQ@>1fc0UrN}2?GGZ>~8<3$-#}J ziFyBVsbj(=K`a%rLhr&Pe^aNG|ShDr(uuAkjI>4a1Z5zYepZ^%% z1^O`Xia*Dy4zCy9{`|)v%#PoeEK@HX!Y(7g!0;~6hv6NR`!V^YBwm9sKzoVR|BvfM m|9@OB`oF!zYBVL%(f|NfXD%SumZU%c00000i^+uB!6s4L_t(IPh(`j0qk8p{vX)29W3kM=E-ny_YOvEO0f!p6pk7| zLKuJo3s+1eJ-!W=nkTD@O9=zxTNxFs25jN^&+zu=Kd?q&b|!{3t{1QxLb(AHdjVfc rWM_nU;pcxQ@>1fc0UrN}2?GGZ>~8<3$- Date: Mon, 8 Jun 2026 11:54:11 +0200 Subject: [PATCH 17/21] Finally got the slots coloured --- .../utilitiesinexcess/UtilitiesInExcess.java | 3 ++ .../SharedNodeLogic/pipe/FilterPipeLogic.java | 19 +++++++---- .../utilitiesinexcess/utils/ColoredSlots.java | 34 +++++++++++++++++++ .../utilitiesinexcess/utils/FilterThemes.java | 14 -------- 4 files changed, 49 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColoredSlots.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/FilterThemes.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index b157d785..4b0a1e7b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -7,6 +7,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityRationingPipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntitySortingPipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; +import com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -189,6 +190,8 @@ public void init(FMLInitializationEvent event) { transferNodeRenderID = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new TransferNodeRenderer()); + ColoredSlots.init(); + GameRegistry.registerWorldGenerator(new WorldGenEnderLotus(), 10); if (ModItems.ENDER_LOTUS_SEED.isEnabled()) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java index 47df20b9..50cebce3 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java @@ -27,7 +27,12 @@ import java.util.List; -import static com.fouristhenumber.utilitiesinexcess.utils.FilterThemes.PINK_SLOT; +import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.CYAN_SLOT; +import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.GREEN_SLOT; +import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.ORANGE_SLOT; +import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.PINK_SLOT; +import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.PURPLE_SLOT; +import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.YELLOW_SLOT; import static com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventory.getInventoryContentsFromStack; public class FilterPipeLogic extends NetworkLogic implements IInventory @@ -133,23 +138,23 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet parentRow.size(18*5); Flow leftCol = Flow.col(); - leftCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 2))); - leftCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 4))); + leftCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 2)).widgetTheme(PINK_SLOT.get())); + leftCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 4)).widgetTheme(ORANGE_SLOT.get())); leftCol.childPadding(18); leftCol.width(18); leftCol.top(18); parentRow.child(leftCol); Flow midCol = Flow.col(); - midCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 1)).widgetTheme(PINK_SLOT)); - midCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 0))); + midCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 1)).widgetTheme(CYAN_SLOT.get())); + midCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 0)).widgetTheme(YELLOW_SLOT.get())); midCol.childPadding(3*18); midCol.width(18); parentRow.child(midCol); Flow rightCol = Flow.col(); - rightCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 3))); - rightCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 5))); + rightCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 3)).widgetTheme(GREEN_SLOT.get())); + rightCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 5)).widgetTheme(PURPLE_SLOT.get())); rightCol.childPadding(18); rightCol.width(18); rightCol.top(18); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColoredSlots.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColoredSlots.java new file mode 100644 index 00000000..6dc2b9c9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColoredSlots.java @@ -0,0 +1,34 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import com.cleanroommc.modularui.api.IThemeApi; +import com.cleanroommc.modularui.drawable.GuiTextures; +import com.cleanroommc.modularui.theme.SlotTheme; +import com.cleanroommc.modularui.theme.WidgetThemeKey; +import com.cleanroommc.modularui.utils.Color; + +public enum ColoredSlots +{ + PINK_SLOT(0xee90ad), + ORANGE_SLOT(0xf17716), + PURPLE_SLOT(0x4c17a9), + GREEN_SLOT(0x556e1c), + CYAN_SLOT(0x3cb0da), + YELLOW_SLOT(0xf1af15); + + public static void init() {}; + + + public WidgetThemeKey SLOT_KEY; + + ColoredSlots(int color) + { + SLOT_KEY = IThemeApi.get().widgetThemeKeyBuilder(this.toString(), SlotTheme.class) + .defaultTheme(new SlotTheme(18, 18, GuiTextures.SLOT_ITEM, color, 0xFF404040, false, color, Color.withAlpha(color, 0x60))) + .register(); + } + + public WidgetThemeKey get() + { + return SLOT_KEY; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/FilterThemes.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/FilterThemes.java deleted file mode 100644 index 0cb194ce..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/FilterThemes.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.utils; - -import com.cleanroommc.modularui.api.IThemeApi; -import com.cleanroommc.modularui.drawable.GuiTextures; -import com.cleanroommc.modularui.theme.SlotTheme; -import com.cleanroommc.modularui.theme.WidgetThemeKey; -import com.cleanroommc.modularui.utils.Color; - -public class FilterThemes -{ - public static WidgetThemeKey PINK_SLOT = IThemeApi.get().widgetThemeKeyBuilder("pinkSlot", SlotTheme.class) - .defaultTheme(new SlotTheme(18, 18, GuiTextures.SLOT_ITEM, Color.PINK.main, 0xFF404040, false, Color.PINK.main, Color.withAlpha(Color.PINK.main, 0x60))) - .register(); -} From 62abb1d0c1677bafb153ad19009d241a45b0508c Mon Sep 17 00:00:00 2001 From: rjnasers Date: Mon, 8 Jun 2026 23:20:59 +0200 Subject: [PATCH 18/21] Basic filter functionality working, haven't tested advanced functionality with advanced filters and filters --- .../transfer/pipe/TileEntityFilterPipe.java | 15 +++ .../SharedNodeLogic/pipe/FilterPipeLogic.java | 127 ++++++++++++------ .../transfer/walk/WalkerBase.java | 4 + 3 files changed, 107 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityFilterPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityFilterPipe.java index dcf88918..71dc75ba 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityFilterPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityFilterPipe.java @@ -10,6 +10,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityFilterPipe extends TileEntityNetworkComponentBase @@ -21,6 +22,20 @@ public TileEntityFilterPipe() logic = new FilterPipeLogic(this); } + @Override + public void readFromNBT(NBTTagCompound compound) + { + logic.readFromNBT(compound); + super.readFromNBT(compound); + } + + @Override + public void writeToNBT(NBTTagCompound compound) + { + super.writeToNBT(compound); + logic.writeToNBT(compound); + } + @Override public boolean canConnectToSide(ForgeDirection side) { return true; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java index 50cebce3..6a7cfa2e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java @@ -8,8 +8,8 @@ import com.cleanroommc.modularui.utils.item.InvWrapper; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.PhantomItemSlot; import com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; @@ -22,6 +22,8 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; @@ -37,11 +39,11 @@ public class FilterPipeLogic extends NetworkLogic implements IInventory { - // Slot filters are organized in the same way that + // This is the actual items in the filter. private final ItemStack[] filters = new ItemStack[6]; - - private ItemFilter[] logicalFilter = new ItemFilter[6]; + // This is the logic that those items represent. + private final ItemFilter[] logicalFilter = new ItemFilter[6]; public FilterPipeLogic(ITransferNetworkComponent host) { super(host); @@ -62,6 +64,41 @@ public boolean canConnectItem() { return true; } + public void readFromNBT(NBTTagCompound compound) + { + NBTTagList list = compound.getTagList("Items", 10); + + for (int i = 0; i < list.tagCount(); i++) + { + NBTTagCompound itemTag = list.getCompoundTagAt(i); + + int slot = itemTag.getByte("Slot") & 255; + + if (slot >= 0 && slot < this.getSizeInventory()) + { + filters[slot] = ItemStack.loadItemStackFromNBT(itemTag); + } + } + parseInventoryToFilter(); + } + + public void writeToNBT(NBTTagCompound compound) + { + NBTTagList itemList = new NBTTagList(); + for (int i = 0; i < filters.length; i++) + { + ItemStack stack = filters[i]; + if (stack != null) + { + NBTTagCompound itemCompound = new NBTTagCompound(); + itemCompound.setByte("Slot", (byte) i); + stack.writeToNBT(itemCompound); + itemList.appendTag(itemCompound); + } + } + compound.setTag("Items", itemList); + } + @Override public int getSizeInventory() { return 6; @@ -108,7 +145,7 @@ public boolean hasCustomInventoryName() { @Override public int getInventoryStackLimit() { - return 64; + return 1; } @Override @@ -138,23 +175,23 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet parentRow.size(18*5); Flow leftCol = Flow.col(); - leftCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 2)).widgetTheme(PINK_SLOT.get())); - leftCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 4)).widgetTheme(ORANGE_SLOT.get())); + leftCol.child(new PhantomItemSlot().slot(new ModularSlot(itemHandler, 2)).widgetTheme(PINK_SLOT.get())); + leftCol.child(new PhantomItemSlot().slot(new ModularSlot(itemHandler, 4)).widgetTheme(ORANGE_SLOT.get())); leftCol.childPadding(18); leftCol.width(18); leftCol.top(18); parentRow.child(leftCol); Flow midCol = Flow.col(); - midCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 1)).widgetTheme(CYAN_SLOT.get())); - midCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 0)).widgetTheme(YELLOW_SLOT.get())); + midCol.child(new PhantomItemSlot().slot(new ModularSlot(itemHandler, 1)).widgetTheme(CYAN_SLOT.get())); + midCol.child(new PhantomItemSlot().slot(new ModularSlot(itemHandler, 0)).widgetTheme(YELLOW_SLOT.get())); midCol.childPadding(3*18); midCol.width(18); parentRow.child(midCol); Flow rightCol = Flow.col(); - rightCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 3)).widgetTheme(GREEN_SLOT.get())); - rightCol.child(new ItemSlot().slot(new ModularSlot(itemHandler, 5)).widgetTheme(PURPLE_SLOT.get())); + rightCol.child(new PhantomItemSlot().slot(new ModularSlot(itemHandler, 3)).widgetTheme(GREEN_SLOT.get())); + rightCol.child(new PhantomItemSlot().slot(new ModularSlot(itemHandler, 5)).widgetTheme(PURPLE_SLOT.get())); rightCol.childPadding(18); rightCol.width(18); rightCol.top(18); @@ -164,48 +201,52 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet parentRow.horizontalCenter(); parentRow.childPadding(18); - syncManager.addCloseListener(this::parseInventoryToFilter); + syncManager.addCloseListener(this::closeListener); return panel; } - public void parseInventoryToFilter(EntityPlayer player) + public void closeListener(EntityPlayer player) { if (!player.worldObj.isRemote) { - for (int i = 0; i < filters.length; i++) + parseInventoryToFilter(); + } + } + public void parseInventoryToFilter() + { + for (int i = 0; i < filters.length; i++) + { + if (filters[i] != null) { - if (filters[i] != null) + logicalFilter[i] = new ItemFilter(); + if (filters[i].getItem() instanceof ItemUpgrade) { - logicalFilter[i] = new ItemFilter(); - if (filters[i].getItem() instanceof ItemUpgrade) + if (TransferUpgrade.getUpgrade(filters[i]) == TransferUpgrade.FILTER) // Case where it's a filter + { + parseFilterItem(filters[i], i); + } + else if (TransferUpgrade.getUpgrade(filters[i]) == TransferUpgrade.ADV_FILTER) // Case where it's an advanced filter { - if (TransferUpgrade.getUpgrade(filters[i]) == TransferUpgrade.FILTER) // Case where it's a filter + if (filters[i].hasTagCompound() && filters[i].stackTagCompound.getByte("Mode") == ItemUpgrade.FilterMode.INVERTED.ordinal()) { - parseFilterItem(filters[i], i); + logicalFilter[i].addToPredicates(AdvancedFilterMode.values()[filters[i].getItemDamage()]::invMatches); } - else if (TransferUpgrade.getUpgrade(filters[i]) == TransferUpgrade.ADV_FILTER) // Case where it's an advanced filter + else { - if (filters[i].hasTagCompound() && filters[i].stackTagCompound.getByte("Mode") == ItemUpgrade.FilterMode.INVERTED.ordinal()) - { - logicalFilter[i].addToPredicates(AdvancedFilterMode.values()[filters[i].getItemDamage()]::invMatches); - } - else - { - logicalFilter[i].addToPredicates(AdvancedFilterMode.values()[filters[i].getItemDamage()]::matches); - } + logicalFilter[i].addToPredicates(AdvancedFilterMode.values()[filters[i].getItemDamage()]::matches); } } - else - { - logicalFilter[i].addToWhiteList(filters[i]); - } + } + else + { + logicalFilter[i].addToWhiteList(filters[i]); } } } } - public void parseFilterItem(ItemStack filter, int slot) + private void parseFilterItem(ItemStack filter, int slot) { List containedItems = getInventoryContentsFromStack(filter); if (containedItems == null) @@ -239,6 +280,8 @@ else if (TransferUpgrade.getUpgrade(containedItem) == TransferUpgrade.ADV_FILTER } } + + @Override public MaskedArrayView getWalkableDirs(TransportType transportType, ForgeDirection incomingDirection, IWalkingComponent walkingComponent) { @@ -248,13 +291,19 @@ public MaskedArrayView getWalkableDirs(TransportType int mask = 0; for (int i = 0; i < filters.length; i++) { - if (filters[i] == null && (networkMask & (1 << i)) != 0) // If a direction is unfiltered and has a network connection. + if (incomingDirection.ordinal() != i) { - mask = mask | (1 << i); - } - else if (logicalFilter[i].matches(stack))// We're filtered - { - mask = mask | (1 << i); + if ((networkMask & (1 << i)) != 0) // No reason to look in non-networked directions + { + if (filters[i] == null) // If a direction is unfiltered and has a network connection. + { + mask = mask | (1 << i); + } + else if (logicalFilter[i] != null && logicalFilter[i].matches(stack))// We're filtered + { + mask = mask | (1 << i); + } + } } } return new MaskedArrayView<>(mask, networkNeighbors); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java index 441d0562..182a9132 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java @@ -22,6 +22,10 @@ public abstract class WalkerBase public String getLocationString() { + if (currentComponent == null) + { + return ""; + } StringBuilder location = new StringBuilder(); location.append("x: "); location.append(currentComponent.getX() - walkingComponent.getX()); From 2ed9b564833f725441052d50c3b270ea6c1f2da3 Mon Sep 17 00:00:00 2001 From: rjnasers Date: Tue, 9 Jun 2026 23:04:42 +0200 Subject: [PATCH 19/21] Fixing edge case --- .../SharedNodeLogic/pipe/FilterPipeLogic.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java index 6a7cfa2e..a1c3b6fe 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java @@ -289,6 +289,8 @@ public MaskedArrayView getWalkableDirs(TransportType if (walkingObject instanceof ItemStack stack) { int mask = 0; + int filteredMask = 0; + boolean filtered = false; for (int i = 0; i < filters.length; i++) { if (incomingDirection.ordinal() != i) @@ -301,11 +303,18 @@ public MaskedArrayView getWalkableDirs(TransportType } else if (logicalFilter[i] != null && logicalFilter[i].matches(stack))// We're filtered { - mask = mask | (1 << i); + filtered = true; + filteredMask = filteredMask | (1 << i); } } } } + // This is an annoying edge case where something is filtered in two different slots they need to be both selectable given a walker. + // If there wasn't this edge case we could just return once we found a filter, but no it's always gotta be hard. + if (filtered) + { + return new MaskedArrayView<>(filteredMask, networkNeighbors); + } return new MaskedArrayView<>(mask, networkNeighbors); } return super.getWalkableDirs(transportType, incomingDirection, walkingComponent); From df3d7dbc1302eecd6994e624b00e7c67e0471991 Mon Sep 17 00:00:00 2001 From: rjnasers Date: Sat, 13 Jun 2026 04:26:29 +0200 Subject: [PATCH 20/21] Pretty sure filter items should work now too. Just need to do more testing with the modes --- .../utilitiesinexcess/ModItems.java | 29 ++++- .../common/items/ItemUpgrade.java | 103 +++++++++++++++++- .../common/recipe/NBTPreservingRecipe.java | 15 ++- .../common/recipe/RecipeLoader.java | 9 +- .../SharedNodeLogic/pipe/FilterPipeLogic.java | 78 ++++++++----- .../transfer/upgrade/AdvancedFilterMode.java | 9 ++ .../utilitiesinexcess/utils/ItemFilter.java | 37 ------- .../utils/ItemStackInventory.java | 14 +-- .../utilitiesinexcess/utils/ItemStackKey.java | 37 ------- .../utils/filter/ItemFilter.java | 87 +++++++++++++++ .../utils/filter/ItemRule.java | 29 +++++ .../utils/filter/ItemRules.java | 50 +++++++++ .../utils/filter/MatchMode.java | 9 ++ .../utils/filter/PredicateRules.java | 56 ++++++++++ 14 files changed, 435 insertions(+), 127 deletions(-) delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemFilter.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackKey.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemFilter.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRule.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRules.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/MatchMode.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/PredicateRules.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java index d6f361a8..a86e383a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java @@ -40,6 +40,7 @@ import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.ReversingHoeConfig; import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraftforge.oredict.OreDictionary; // Credit to Et Futurum (Requiem) public enum ModItems { @@ -61,7 +62,7 @@ public enum ModItems { INVERSION_SIGIL_ACTIVE(InversionConfig.enableInversionSigil, new ItemInversionSigilActive(), "inversion_sigil_active"), PSEUDO_INVERSION_SIGIL(InversionConfig.enableInversionSigil, new ItemPseudoInversionSigil(), "pseudo_inversion_sigil"), INVERTED_INGOT(InversionConfig.enableInvertedIngot, new ItemInvertedIngot(), "inverted_ingot"), - INVERTED_NUGGET(InversionConfig.enableInvertedIngot, new ItemInvertedIngot.InvertedNugget(), "inverted_nugget"), + INVERTED_NUGGET(InversionConfig.enableInvertedIngot, new ItemInvertedIngot.InvertedNugget(), "inverted_nugget", "nuggetInverted"), ARCHITECTS_WAND(ItemConfig.enableArchitectsWand, new ItemArchitectsWand(ItemConfig.architectsWandBuildLimit).setTextureName("utilitiesinexcess:architects_wand"), "architects_wand"), SUPER_ARCHITECTS_WAND(ItemConfig.enableSuperArchitectsWand, new ItemArchitectsWand(ItemConfig.superArchitectsWandBuildLimit).setTextureName("utilitiesinexcess:super_architects_wand"), "super_architects_wand"), BEDROCKIUM_INGOT(ItemConfig.enableBedrockium, new ItemBedrockiumIngot().setUnlocalizedName("bedrockium_ingot").setTextureName("utilitiesinexcess:bedrockium_ingot"), "bedrockium_ingot"), @@ -91,13 +92,21 @@ public static void init() { private final Item theItem; private final String name; private final ItemDisabled disabledVersion; + private final String[] oreDictNames; - ModItems(boolean enabled, Item item, String name) { + ModItems(boolean enabled, Item item, String name, String... oreDictNames) { this.isEnabled = enabled; theItem = item; this.name = name; - if (ItemConfig.registerDisabledItems) disabledVersion = new ItemDisabled(theItem); - else disabledVersion = null; + this.oreDictNames = oreDictNames; + if (ItemConfig.registerDisabledItems) + { + disabledVersion = new ItemDisabled(theItem); + } + else + { + disabledVersion = null; + } } public boolean isEnabled() { @@ -119,4 +128,16 @@ public ItemStack newItemStack(int count) { public ItemStack newItemStack(int count, int meta) { return new ItemStack(this.get(), count, meta); } + + public static void registerOreDict() { + for (ModItems item : VALUES) { + if (!item.isEnabled()) continue; + if (item.oreDictNames == null) continue; + + for (String oreName : item.oreDictNames) { + OreDictionary.registerOre(oreName, item.newItemStack()); + } + } + } + } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java index bff4a107..4ead893b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java @@ -56,6 +56,61 @@ public String getLabel() { return label; } + + public static boolean isInverted(ItemStack stack) + { + if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("Mode")) + { + int mode = stack.stackTagCompound.getInteger("Mode"); + return (mode & (1 << INVERTED.ordinal())) != 0; + } + return false; + } + + public static boolean isInverted(int mode) + { + return (mode & (1 << INVERTED.ordinal())) != 0; + } + + public static boolean isIgnoringMeta(ItemStack stack) + { + if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("Mode")) + { + int mode = stack.stackTagCompound.getInteger("Mode"); + return (mode & (1 << FUZZYMETA.ordinal())) != 0; + } + return false; + } + + public static boolean isIgnoringMeta(int mode) + { + return (mode & (1 << FUZZYMETA.ordinal())) != 0; + } + + public static boolean isIgnoringNBT(ItemStack stack) + { + if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("Mode")) + { + int mode = stack.stackTagCompound.getInteger("Mode"); + return (mode & (1 << FUZZYNBT.ordinal())) != 0; + } + return false; + } + + public static boolean isIgnoringNBT(int mode) + { + return (mode & (1 << FUZZYNBT.ordinal())) != 0; + } + + public static int getModesFromStack(ItemStack stack) + { + if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("Mode")) + { + return stack.stackTagCompound.getInteger("Mode"); + } + return 0; + } + } private static final IIcon[] ICONS = new IIcon[TransferUpgrade.VALUES.length]; @@ -212,17 +267,37 @@ public int getInventorySize() { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) + { + addInformationHelper(stack, list, "", true); + } + + @SuppressWarnings("unchecked") + public void addInformationHelper(ItemStack stack, List list, String indent, boolean root) { if (TransferUpgrade.getUpgrade(stack) == TransferUpgrade.FILTER) { if (stack.hasTagCompound()) { - if (stack.stackTagCompound.hasKey("Mode")) + int filterMode = FilterMode.getModesFromStack(stack); + if (filterMode != 0) { - byte filterMode = stack.stackTagCompound.getByte("Mode"); - if (filterMode >= 0 && filterMode < FilterMode.values().length) + for (int i = 0; i < 3; i++) { - list.add(FilterMode.values()[filterMode].getLabel()); + if ((filterMode & (1 << i)) != 0) + { + if (root) + { + list.add(indent + FilterMode.values()[i].getLabel()); + } + else + { + list.add(indent + " " + FilterMode.values()[i].getLabel()); + } + } + } + if (!root) + { + indent += " "; } } @@ -234,7 +309,22 @@ public void addInformation(ItemStack stack, EntityPlayer player, List list, bool NBTTagCompound itemTag = tagList.getCompoundTagAt(i); ItemStack filteredStack = ItemStack.loadItemStackFromNBT(itemTag); if (filteredStack != null) { - list.add(" " + filteredStack.getDisplayName()); + if (filteredStack.getItem() instanceof ItemUpgrade) + { + if (filteredStack.getItemDamage() == TransferUpgrade.FILTER.ordinal()) + { + list.add(indent + " Item Filter"); + addInformationHelper(filteredStack, list, indent + " ", false); + } + else if (filteredStack.getItemDamage() == TransferUpgrade.ADV_FILTER.ordinal()) + { + list.add(indent + " AdvancedFilter: " + AdvancedFilterMode.values()[filteredStack.getItemDamage()].getLabel()); + } + } + else + { + list.add(indent + " " + filteredStack.getDisplayName()); + } } } } @@ -256,4 +346,7 @@ else if (TransferUpgrade.getUpgrade(stack) == TransferUpgrade.ADV_FILTER) } } } + } + + diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/NBTPreservingRecipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/NBTPreservingRecipe.java index 53d49cbb..b4111045 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/NBTPreservingRecipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/NBTPreservingRecipe.java @@ -4,8 +4,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.ShapelessRecipes; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagInt; import java.util.List; +import java.util.Objects; public class NBTPreservingRecipe extends ShapelessRecipes { @@ -26,12 +28,21 @@ public ItemStack getCraftingResult(InventoryCrafting inv) { for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); - if (stack != null && stack.isItemEqual(recipeItems.get(slot)) && stack.hasTagCompound()) { + if (stack != null && stack.isItemEqual(recipeItems.get(slot)) && stack.hasTagCompound()) + { NBTTagCompound incomingTag = stack.getTagCompound(); for (String key : incomingTag.func_150296_c()) { - result.stackTagCompound.setTag(key, incomingTag.getTag(key)); + // Merge mode tags + if (Objects.equals(key, "Mode")) + { + result.stackTagCompound.setTag(key, new NBTTagInt(result.getTagCompound().getInteger(key) | incomingTag.getInteger(key))); + } + else + { + result.stackTagCompound.setTag(key, incomingTag.getTag(key)); + } } break; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java index ab853096..52b6f2ef 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java @@ -10,6 +10,7 @@ import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagByte; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagInt; import net.minecraftforge.oredict.OreDictionary; import com.fouristhenumber.utilitiesinexcess.ModBlocks; @@ -1327,7 +1328,7 @@ private static void loadFilterVariantRecipes() { GameRegistry.addRecipe( new NBTPreservingRecipe( - setNBTForItem(TransferUpgrade.FILTER.getStack(1), "Mode", new NBTTagByte((byte) ItemUpgrade.FilterMode.INVERTED.ordinal())).theStack, + setNBTForItem(TransferUpgrade.FILTER.getStack(1), "Mode", new NBTTagInt((byte) 1 << ItemUpgrade.FilterMode.INVERTED.ordinal())).theStack, Arrays.asList( TransferUpgrade.FILTER.getStack(1).theStack, new ItemStack(Blocks.redstone_torch) @@ -1336,7 +1337,7 @@ private static void loadFilterVariantRecipes() GameRegistry.addRecipe( new NBTPreservingRecipe( - setNBTForItem(TransferUpgrade.FILTER.getStack(1), "Mode", new NBTTagByte((byte) ItemUpgrade.FilterMode.FUZZYNBT.ordinal())).theStack, + setNBTForItem(TransferUpgrade.FILTER.getStack(1), "Mode", new NBTTagInt((byte) 1 << ItemUpgrade.FilterMode.FUZZYNBT.ordinal())).theStack, Arrays.asList( TransferUpgrade.FILTER.getStack(1).theStack, new ItemStack(Blocks.wool) @@ -1345,7 +1346,7 @@ private static void loadFilterVariantRecipes() GameRegistry.addRecipe( new NBTPreservingRecipe( - setNBTForItem(TransferUpgrade.FILTER.getStack(1), "Mode", new NBTTagByte((byte) ItemUpgrade.FilterMode.FUZZYMETA.ordinal())).theStack, + setNBTForItem(TransferUpgrade.FILTER.getStack(1), "Mode", new NBTTagInt((byte) 1 << ItemUpgrade.FilterMode.FUZZYMETA.ordinal())).theStack, Arrays.asList( TransferUpgrade.FILTER.getStack(1).theStack, new ItemStack(Items.stick) @@ -1354,7 +1355,7 @@ private static void loadFilterVariantRecipes() GameRegistry.addRecipe( new NBTPreservingRecipe( - setNBTForItem(TransferUpgrade.ADV_FILTER.getStack(1), "Mode", new NBTTagByte((byte) ItemUpgrade.FilterMode.INVERTED.ordinal())).theStack, + setNBTForItem(TransferUpgrade.ADV_FILTER.getStack(1), "Mode", new NBTTagInt((byte) ItemUpgrade.FilterMode.INVERTED.ordinal())).theStack, Arrays.asList( TransferUpgrade.ADV_FILTER.getStack(1).theStack, new ItemStack(Blocks.redstone_torch) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java index a1c3b6fe..eb10539b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java @@ -17,8 +17,9 @@ import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.AdvancedFilterMode; import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.TransferUpgrade; import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; -import com.fouristhenumber.utilitiesinexcess.utils.ItemFilter; +import com.fouristhenumber.utilitiesinexcess.utils.filter.ItemFilter; import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import com.fouristhenumber.utilitiesinexcess.utils.filter.MatchMode; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -27,8 +28,12 @@ import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; + import java.util.List; +import static com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade.FilterMode.getModesFromStack; +import static com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade.FilterMode.isInverted; +import static com.fouristhenumber.utilitiesinexcess.transfer.upgrade.AdvancedFilterMode.getAdvFilterMode; import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.CYAN_SLOT; import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.GREEN_SLOT; import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.ORANGE_SLOT; @@ -217,6 +222,7 @@ public void parseInventoryToFilter() { for (int i = 0; i < filters.length; i++) { + logicalFilter[i] = null; if (filters[i] != null) { logicalFilter[i] = new ItemFilter(); @@ -224,30 +230,38 @@ public void parseInventoryToFilter() { if (TransferUpgrade.getUpgrade(filters[i]) == TransferUpgrade.FILTER) // Case where it's a filter { - parseFilterItem(filters[i], i); + parseFilterItem(filters[i], i, 0); } else if (TransferUpgrade.getUpgrade(filters[i]) == TransferUpgrade.ADV_FILTER) // Case where it's an advanced filter { - if (filters[i].hasTagCompound() && filters[i].stackTagCompound.getByte("Mode") == ItemUpgrade.FilterMode.INVERTED.ordinal()) - { - logicalFilter[i].addToPredicates(AdvancedFilterMode.values()[filters[i].getItemDamage()]::invMatches); - } - else - { - logicalFilter[i].addToPredicates(AdvancedFilterMode.values()[filters[i].getItemDamage()]::matches); - } + logicalFilter[i].addToPredicates( + AdvancedFilterMode.values()[getAdvFilterMode(filters[i])]::matches, + ItemUpgrade.FilterMode.isInverted(filters[i]) + ); } } else { - logicalFilter[i].addToWhiteList(filters[i]); + logicalFilter[i].addToRuleList(filters[i], false, MatchMode.DEFAULT); } } } } - private void parseFilterItem(ItemStack filter, int slot) + // ParentFilterMask is the settings of the parent. This is needed because if the parent says inverted + // and the child says inverted then they cancel out and the items in the child are NOT inverted. + // On the other hand, metadata and NBT ignoring behaviors are propagated to children, but do not cancel each other out. + private void parseFilterItem(ItemStack filter, int slot, int parentMode) { + // This next block basically does the following: XOR bit 0, then OR bit 1 and 2. + int extractedMode = parentMode & 0b110; + int mode = getModesFromStack(filter) | extractedMode; + boolean inverted = isInverted(parentMode) ^ isInverted(mode); + if (!inverted) + { + mode = mode & 0b110; + } + List containedItems = getInventoryContentsFromStack(filter); if (containedItems == null) { @@ -257,31 +271,45 @@ private void parseFilterItem(ItemStack filter, int slot) { if (containedItem.getItem() instanceof ItemUpgrade) { - if (TransferUpgrade.getUpgrade(containedItem) == TransferUpgrade.FILTER) // Case where it's a filter + if (TransferUpgrade.getUpgrade(containedItem) == TransferUpgrade.FILTER) { - parseFilterItem(containedItem, slot); + parseFilterItem(containedItem, slot, mode); } - else if (TransferUpgrade.getUpgrade(containedItem) == TransferUpgrade.ADV_FILTER) // Case where it's an advanced filter + else if (TransferUpgrade.getUpgrade(containedItem) == TransferUpgrade.ADV_FILTER) + { + logicalFilter[slot].addToPredicates(AdvancedFilterMode.values()[getAdvFilterMode(containedItem)]::matches, inverted); + } + } + else + { + switch(mode & 0b110) { - if (containedItem.hasTagCompound() && containedItem.stackTagCompound.getByte("Mode") == ItemUpgrade.FilterMode.INVERTED.ordinal()) + case (0b000): + { + logicalFilter[slot].addToRuleList(containedItem, inverted, MatchMode.DEFAULT); + break; + } + case (0b010): + { + logicalFilter[slot].addToRuleList(containedItem, inverted, MatchMode.IGNORE_NBT); + break; + } + case (0b100): { - logicalFilter[slot].addToPredicates(AdvancedFilterMode.values()[containedItem.getItemDamage()]::invMatches); + logicalFilter[slot].addToRuleList(containedItem, inverted, MatchMode.IGNORE_META); + break; } - else + case (0b110): { - logicalFilter[slot].addToPredicates(AdvancedFilterMode.values()[containedItem.getItemDamage()]::matches); + logicalFilter[slot].addToRuleList(containedItem, inverted, MatchMode.IGNORE_NBT_MET); + break; } } } - else - { - logicalFilter[slot].addToWhiteList(containedItem); - } } } - - + // One of the big things I want to avoid here is any NBT reading @Override public MaskedArrayView getWalkableDirs(TransportType transportType, ForgeDirection incomingDirection, IWalkingComponent walkingComponent) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java index 4012b5b4..e4cd43e2 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java @@ -281,6 +281,15 @@ public String getDescription() return description; } + public static int getAdvFilterMode(ItemStack stack) + { + if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("AdvMode")) + { + return stack.stackTagCompound.getInteger("AdvMode"); + } + return DEFAULT.ordinal(); + } + public abstract boolean matches(ItemStack stack); public boolean invMatches(ItemStack stack) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemFilter.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemFilter.java deleted file mode 100644 index 6b1b2a3d..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemFilter.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.utils; - -import net.minecraft.item.ItemStack; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.function.Predicate; - -public class ItemFilter -{ - private final Set whitelist = new HashSet<>(); - private final Set blacklist = new HashSet<>(); - - private final List> predicates = new ArrayList<>(); - - public boolean matches(ItemStack stack) { - if (whitelist.contains(new ItemStackKey(stack))) return true; - - for (Predicate p : predicates) { - if (p.test(stack)) return true; - } - - return false; - } - - public void addToWhiteList(ItemStack stack) - { - whitelist.add(new ItemStackKey(stack)); - } - - public void addToPredicates(Predicate pred) - { - predicates.add(pred); - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java index faa2ee01..fec67e0e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java @@ -93,24 +93,12 @@ public static List getInventoryContentsFromStack(ItemStack itemInvent int size = compound.getInteger("size"); List contents = new ArrayList(size); - // Fill with nulls so we can set by index - for (int i = 0; i < size; i++) - { - contents.add(null); - } - NBTTagList itemList = compound.getTagList("Items", 10); // 10 = NBTTagCompound for (int i = 0; i < itemList.tagCount(); i++) { NBTTagCompound itemCompound = itemList.getCompoundTagAt(i); - - int slot = itemCompound.getByte("Slot") & 255; // prevent negative index - - if (slot >= 0 && slot < size) - { - contents.set(slot, ItemStack.loadItemStackFromNBT(itemCompound)); - } + contents.add(ItemStack.loadItemStackFromNBT(itemCompound)); } return contents; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackKey.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackKey.java deleted file mode 100644 index 60cca407..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackKey.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.utils; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - -import java.util.Objects; - -class ItemStackKey { - private final Item item; - private final int meta; - private final NBTTagCompound tag; - - public ItemStackKey(ItemStack stack) { - this.item = stack.getItem(); - this.meta = stack.getItemDamage(); - this.tag = stack.stackTagCompound == null ? null : (NBTTagCompound) stack.stackTagCompound.copy(); - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof ItemStackKey)) return false; - ItemStackKey other = (ItemStackKey) o; - - return item == other.item - && meta == other.meta - && Objects.equals(tag, other.tag); - } - - @Override - public int hashCode() { - int result = item.hashCode(); - result = 31 * result + meta; - result = 31 * result + (tag != null ? tag.hashCode() : 0); - return result; - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemFilter.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemFilter.java new file mode 100644 index 00000000..c19f6f6a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemFilter.java @@ -0,0 +1,87 @@ +package com.fouristhenumber.utilitiesinexcess.utils.filter; + +import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import java.util.function.Predicate; + +public class ItemFilter +{ + private final Reference2ObjectOpenHashMap itemRules = new Reference2ObjectOpenHashMap<>(); + private final PredicateRules predicateRules = new PredicateRules(); + + // Blacklists override whitelists. If an item is found in the blacklist it doesn't matter if the item + // has been whitelisted, but we do need to know if there are whitelists at all so we do need a flag here. + // Counts for both predicates whitelists and item whitelists. + boolean hasWhitelist = false; + + // Heavily commented because this logic is fucking confusing for me. + public boolean matches(ItemStack stack) + { + // If there's no rules in the whole filter, just do nothing. + // Don't think this can happen, but guarding anyway. + if (itemRules.isEmpty() && predicateRules.isEmpty()) + { + return true; + } + + // If we have a rule, check it, otherwise if there's no rule for the item we return if no specific whitelist or predicate whitelist + // exists on the whole filter. This means we have blacklist only filter, and we can accept the item. + ItemRules rules = itemRules.get(stack.getItem()); + if (rules == null) + { + // so here we couldn't find a rule for this block, now we check if there is actually no rules at all + if (itemRules.isEmpty()) + { + // If there are no rules check the predicates of this filter + if (predicateRules.matchesBlackLists(stack)) + { + return false; + } + else if (predicateRules.matchesWhiteLists(stack)) + { + return true; + } + } + return !hasWhitelist; + } + + // Check the blacklists + if (rules.matchesBlacklists(stack) || predicateRules.matchesBlackLists(stack)) + { + return false; + } + + // Check the whitelists + return rules.matchesWhitelists(stack) && predicateRules.matchesWhiteLists(stack); + } + + public void addToRuleList(ItemStack stack, boolean inverted, MatchMode mode) + { + if (stack.getItem() != null) + { + ItemRules rules = itemRules.get(stack.getItem()); + if (rules == null) + { + rules = new ItemRules(); + itemRules.put(stack.getItem(), rules); + } + rules.addRule(stack, inverted, mode); + + if (!inverted) + { + hasWhitelist = true; + } + } + } + + public void addToPredicates(Predicate pred, boolean inverted) + { + predicateRules.add(pred, inverted); + if (!inverted) + { + hasWhitelist = true; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRule.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRule.java new file mode 100644 index 00000000..9eb87657 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRule.java @@ -0,0 +1,29 @@ +package com.fouristhenumber.utilitiesinexcess.utils.filter; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class ItemRule +{ + private MatchMode mode; + private int meta; + private NBTTagCompound nbt; + + public ItemRule(MatchMode mode, int meta, NBTTagCompound nbt) + { + this.mode = mode; + this.meta = meta; + this.nbt = nbt; + } + + // This matches function is called after we've already matched on the item so no need to compare it. + boolean matches(ItemStack stack) + { + return switch (mode) { + case DEFAULT -> stack.stackTagCompound == nbt && stack.getItemDamage() == meta; + case IGNORE_NBT -> stack.getItemDamage() == meta; + case IGNORE_META -> stack.stackTagCompound == nbt; + case IGNORE_NBT_MET -> true; + }; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRules.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRules.java new file mode 100644 index 00000000..3e78496f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRules.java @@ -0,0 +1,50 @@ +package com.fouristhenumber.utilitiesinexcess.utils.filter; + +import net.minecraft.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class ItemRules +{ + + private final List blacklists = new ArrayList<>(); + private final List whitelists = new ArrayList<>(); + + public boolean matchesBlacklists(ItemStack stack) { + + for (ItemRule rule : blacklists) { + if (rule.matches(stack)) { + return true; + } + } + return false; + } + + public boolean matchesWhitelists(ItemStack stack) + { + if (whitelists.isEmpty()) { + return true; + } + + for (ItemRule rule : whitelists) { + if (rule.matches(stack)) { + return true; + } + } + + return false; + } + + public void addRule(ItemStack stack, boolean inverted, MatchMode mode) + { + if (inverted) + { + blacklists.add(new ItemRule(mode, stack.getItemDamage(), stack.stackTagCompound)); + } + else + { + whitelists.add(new ItemRule(mode, stack.getItemDamage(), stack.stackTagCompound)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/MatchMode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/MatchMode.java new file mode 100644 index 00000000..ef69005e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/MatchMode.java @@ -0,0 +1,9 @@ +package com.fouristhenumber.utilitiesinexcess.utils.filter; + +public enum MatchMode +{ + IGNORE_META, + IGNORE_NBT, + IGNORE_NBT_MET, + DEFAULT +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/PredicateRules.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/PredicateRules.java new file mode 100644 index 00000000..8145ab57 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/PredicateRules.java @@ -0,0 +1,56 @@ +package com.fouristhenumber.utilitiesinexcess.utils.filter; + +import net.minecraft.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; + +public class PredicateRules +{ + private final List> whiteListPredicates = new ArrayList<>(); + private final List> blackListPredicates = new ArrayList<>(); + + public boolean isEmpty() + { + return whiteListPredicates.isEmpty() && blackListPredicates.isEmpty(); + } + + // All whitelists must match to pass + public boolean matchesWhiteLists(ItemStack stack) + { + for (Predicate whiteListPredicate : whiteListPredicates) + { + if (!whiteListPredicate.test(stack)) + { + return false; + } + } + return true; + } + + // Only one blacklist must match to fail + public boolean matchesBlackLists(ItemStack stack) + { + for (Predicate blackListPredicate : blackListPredicates) + { + if (blackListPredicate.test(stack)) + { + return true; + } + } + return false; + } + + public void add(Predicate pred, boolean inverted) + { + if (inverted) + { + blackListPredicates.add(pred); + } + else + { + whiteListPredicates.add(pred); + } + } +} From 190c1724e41ba2ba7c395bfa49d6f6d2e82b1ee1 Mon Sep 17 00:00:00 2001 From: rjnasers Date: Sat, 13 Jun 2026 20:18:04 +0200 Subject: [PATCH 21/21] Mod sorting pipe done + fixes for filter pipe --- .../utilitiesinexcess/ModBlocks.java | 2 + .../utilitiesinexcess/UtilitiesInExcess.java | 2 + .../pipe/BlockHyperRationingPipe.java | 1 - .../transfer/pipe/BlockModSortingPipe.java | 20 +++++ .../transfer/ITransferNetworkComponent.java | 2 +- .../TileEntityNetworkComponentBase.java | 2 +- .../pipe/TileEntityModSortingPipe.java | 20 +++++ .../ITransferNetworkLogic.java | 2 +- .../SharedNodeLogic/NetworkLogic.java | 2 +- .../pipe/CrossOverPipeLogic.java | 2 +- .../SharedNodeLogic/pipe/EnergyPipeLogic.java | 4 + .../SharedNodeLogic/pipe/FilterPipeLogic.java | 74 ++++++++++++------- .../pipe/ModSortingPipeLogic.java | 69 +++++++++++++++++ .../pipe/RationingPipeLogic.java | 3 +- .../pipe/SortingPipeLogic.java | 3 +- .../walk/stepper/ItemTargetResolver.java | 3 +- .../transfer/walk/stepper/TargetResolver.java | 3 +- 17 files changed, 179 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockModSortingPipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityModSortingPipe.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/EnergyPipeLogic.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 90712630..b713d741 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -3,6 +3,7 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockCrossoverPipe; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockFilterPipe; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockHyperRationingPipe; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockModSortingPipe; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockRationingPipe; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockSortingPipe; import net.minecraft.block.Block; @@ -173,6 +174,7 @@ public enum ModBlocks { TRANSFER_PIPE(true, new BlockTransferPipe(), "transfer_pipe"), CROSSOVER_PIPE(true, new BlockCrossoverPipe(), "crossover_pipe"), SORTING_PIPE(true, new BlockSortingPipe(), "sorting_pipe"), + MOD_SORTING_PIPE(true, new BlockModSortingPipe(), "mod_sorting_pipe"), RATIONING_PIPE(true, new BlockRationingPipe(), "rationing_pipe"), HYPER_RATIONING_PIPE(true, new BlockHyperRationingPipe(), "hyper_rationing_pipe"), FILTER_PIPE(true, new BlockFilterPipe(), "filter_pipe"), diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index 4b0a1e7b..06843936 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -4,6 +4,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityCrossoverPipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityFilterPipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityHyperRationingPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityModSortingPipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityRationingPipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntitySortingPipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; @@ -175,6 +176,7 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityRationingPipe.class, "TileEntityRationingPipeUIE"); GameRegistry.registerTileEntity(TileEntityHyperRationingPipe.class, "TileEntityHyperRationingPipe"); GameRegistry.registerTileEntity(TileEntityFilterPipe.class, "TileEntityFilterPipe"); + GameRegistry.registerTileEntity(TileEntityModSortingPipe.class, "TileEntityModSortingPipe"); // GameRegistry.registerTileEntity(TileEntityRetrievalNode.class,"TileEntityRetrievalNodeUIE"); // not sure if i did the naming correctly GameRegistry.registerTileEntity(TileEntityItemTransferNode.class, "TileEntityTransferNodeUIE"); // GameRegistry.registerTileEntity(TileEntityTransferNodeFluid.class, "TileEntityTransferNodeFluidUIE"); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java index 0d7b462e..9d2d67fe 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java @@ -17,5 +17,4 @@ public BlockHyperRationingPipe() { public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntityHyperRationingPipe(); } - } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockModSortingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockModSortingPipe.java new file mode 100644 index 00000000..27202b25 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockModSortingPipe.java @@ -0,0 +1,20 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityModSortingPipe; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class BlockModSortingPipe extends BlockPipeBase +{ + public BlockModSortingPipe() { + super(Material.iron); + this.setBlockName("hyper_rationing_pipe"); + this.setBlockTextureName("utilitiesinexcess:hyper_rationing_pipe"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityModSortingPipe(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java index e09e3f1f..1404964c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java @@ -19,7 +19,7 @@ public interface ITransferNetworkComponent void addExternal(ForgeDirection direction, Connection neighbor); void removeExternal(ForgeDirection direction); - Connection[] getValidExternalNeighbors(ForgeDirection fromDirection, ITransferNetworkComponent walking); + Connection[] getValidExternalNeighbors(ForgeDirection fromDirection, IWalkingComponent walking); ITransferNetworkComponent[] getNetworkNeighbors(); MaskedArrayView getWalkableDirs(TransportType targetType, ForgeDirection fromDirection, IWalkingComponent walkingComponent); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java index ec651d8d..7355ebba 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java @@ -92,7 +92,7 @@ public void updateExternalConnections() } @Override - public Connection[] getValidExternalNeighbors(ForgeDirection fromDirection, ITransferNetworkComponent walker) + public Connection[] getValidExternalNeighbors(ForgeDirection fromDirection, IWalkingComponent walker) { return logic.getValidExternalConnections(fromDirection, walker); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityModSortingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityModSortingPipe.java new file mode 100644 index 00000000..c1605f9a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityModSortingPipe.java @@ -0,0 +1,20 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe.ModSortingPipeLogic; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityModSortingPipe extends TileEntityNetworkComponentBase +{ + + public TileEntityModSortingPipe() + { + logic = new ModSortingPipeLogic(this); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) + { + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java index 76a1357a..da9fc662 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java @@ -31,7 +31,7 @@ public interface ITransferNetworkLogic boolean canConnectFluid(); boolean canConnectItem(); - Connection[] getValidExternalConnections(ForgeDirection fromDirection, ITransferNetworkComponent walker); + Connection[] getValidExternalConnections(ForgeDirection fromDirection, IWalkingComponent walker); ITransferNetworkComponent[] getNetworkConnections(); int getMaxInsertable(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java index 78cc5149..6d254e13 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java @@ -194,7 +194,7 @@ public void setExternalMask(int mask) } @Override - public Connection[] getValidExternalConnections(ForgeDirection fromDirection, ITransferNetworkComponent walker) + public Connection[] getValidExternalConnections(ForgeDirection fromDirection, IWalkingComponent walker) { return externalConnections; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java index 41c10b46..0521dae9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java @@ -204,7 +204,7 @@ public MaskedArrayView getWalkableDirs(TransportType // Only valid external connection is across from the fromDirection @Override - public Connection[] getValidExternalConnections(ForgeDirection fromDirection, ITransferNetworkComponent walker) + public Connection[] getValidExternalConnections(ForgeDirection fromDirection, IWalkingComponent walker) { return new Connection[]{externalConnections[fromDirection.getOpposite().ordinal()]}; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/EnergyPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/EnergyPipeLogic.java new file mode 100644 index 00000000..d911c50f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/EnergyPipeLogic.java @@ -0,0 +1,4 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + +public class EnergyPipeLogic { +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java index eb10539b..3409c115 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java @@ -12,6 +12,7 @@ import com.cleanroommc.modularui.widgets.slot.PhantomItemSlot; import com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.AdvancedFilterMode; @@ -28,7 +29,6 @@ import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; - import java.util.List; import static com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade.FilterMode.getModesFromStack; @@ -309,43 +309,67 @@ else if (TransferUpgrade.getUpgrade(containedItem) == TransferUpgrade.ADV_FILTER } } - // One of the big things I want to avoid here is any NBT reading @Override public MaskedArrayView getWalkableDirs(TransportType transportType, ForgeDirection incomingDirection, IWalkingComponent walkingComponent) { Object walkingObject = walkingComponent.getWalkingObject(); if (walkingObject instanceof ItemStack stack) { - int mask = 0; - int filteredMask = 0; - boolean filtered = false; - for (int i = 0; i < filters.length; i++) + return new MaskedArrayView<>(getValidMask(incomingDirection, stack, networkMask), networkNeighbors); + } + return super.getWalkableDirs(transportType, incomingDirection, walkingComponent); + } + + @Override + public Connection[] getValidExternalConnections(ForgeDirection fromDirection, IWalkingComponent walker) + { + Object walkingObject = walker.getWalkingObject(); + if (walkingObject instanceof ItemStack stack) + { + int validMask = getValidMask(fromDirection, stack, externalConnectionMask); + Connection[] retCons = new Connection[Integer.bitCount(validMask)]; + int conIter = 0; + for (int i = 0; i < 6; i++) { - if (incomingDirection.ordinal() != i) + if ((validMask & (1 << i)) != 0) { - if ((networkMask & (1 << i)) != 0) // No reason to look in non-networked directions - { - if (filters[i] == null) // If a direction is unfiltered and has a network connection. - { - mask = mask | (1 << i); - } - else if (logicalFilter[i] != null && logicalFilter[i].matches(stack))// We're filtered - { - filtered = true; - filteredMask = filteredMask | (1 << i); - } - } + retCons[conIter] = externalConnections[i]; } } - // This is an annoying edge case where something is filtered in two different slots they need to be both selectable given a walker. - // If there wasn't this edge case we could just return once we found a filter, but no it's always gotta be hard. - if (filtered) + return retCons; + } + return super.getValidExternalConnections(fromDirection, walker); + } + + private int getValidMask(ForgeDirection incomingDirection, ItemStack stack, int inputMask) + { + int mask = 0; + int filteredMask = 0; + boolean filtered = false; + for (int i = 0; i < filters.length; i++) + { + if (incomingDirection.ordinal() != i) { - return new MaskedArrayView<>(filteredMask, networkNeighbors); + if ((inputMask & (1 << i)) != 0) // No reason to look in non-networked directions + { + if (filters[i] == null) // If a direction is unfiltered and has a network connection. + { + mask = mask | (1 << i); + } + else if (logicalFilter[i] != null && logicalFilter[i].matches(stack))// We're filtered + { + filtered = true; + filteredMask = filteredMask | (1 << i); + } + } } - return new MaskedArrayView<>(mask, networkNeighbors); } - return super.getWalkableDirs(transportType, incomingDirection, walkingComponent); + // This is an annoying edge case where something is filtered in two different slots they need to be both selectable given a walker. + if (filtered) + { + return filteredMask; + } + return mask; } public boolean isUseableByPlayer(EntityPlayer player) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/ModSortingPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/ModSortingPipeLogic.java index f1edfd0f..36b389ba 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/ModSortingPipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/ModSortingPipeLogic.java @@ -1,7 +1,14 @@ package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; +import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; public class ModSortingPipeLogic extends NetworkLogic { @@ -24,4 +31,66 @@ public boolean canConnectFluid() { public boolean canConnectItem() { return true; } + + // Only valid external connection is across from the fromDirection + @Override + public Connection[] getValidExternalConnections(ForgeDirection fromDirection, IWalkingComponent walker) + { + { + // If we have an item Node we need to just return the valid connections + Object walkingObject = walker.getWalkingObject(); + if (walkingObject instanceof ItemStack stack) + { + Connection[] ret = new Connection[6]; + for (int i = 0; i < 6; i++) + { + Connection conn = externalConnections[i]; + if (conn != null && conn.canConnectItem()) + { + if (conn.target() instanceof IInventory inventory) + { + if (containsModItemOrEmpty(inventory, stack)) + { + ret[i] = conn; + continue; + } + } + } + ret[i] = null; + } + return ret; + } + // Just return everything because there's no rules for a non-ItemTransferNode + return externalConnections; + } + } + + private boolean containsModItemOrEmpty(IInventory inv, ItemStack target) + { + boolean empty = true; + for (int i = 0; i < inv.getSizeInventory(); i++) + { + ItemStack slot = inv.getStackInSlot(i); + + if (slot == null) + { + continue; + } + empty = false; + if (slot.getItem() == target.getItem() && + slot.getItemDamage() == target.getItemDamage()) + { + GameRegistry.UniqueIdentifier idA = GameRegistry.findUniqueIdentifierFor(target.getItem()); + GameRegistry.UniqueIdentifier idB = GameRegistry.findUniqueIdentifierFor(slot.getItem()); + + if (idA == null || idB == null) + { + return false; + } + + return idA.modId.equals(idB.modId); + } + } + return empty; + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/RationingPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/RationingPipeLogic.java index b0550601..00ce167a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/RationingPipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/RationingPipeLogic.java @@ -25,7 +25,8 @@ public boolean canConnectItem() { } @Override - public int getMaxInsertable() { + public int getMaxInsertable() + { return 64; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/SortingPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/SortingPipeLogic.java index dfb08c43..6745ba9b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/SortingPipeLogic.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/SortingPipeLogic.java @@ -3,6 +3,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -31,7 +32,7 @@ public boolean canConnectItem() { } @Override - public Connection[] getValidExternalConnections(ForgeDirection fromDirection, ITransferNetworkComponent walker) + public Connection[] getValidExternalConnections(ForgeDirection fromDirection, IWalkingComponent walker) { // If we have an item Node we need to just return the valid connections if (walker instanceof TileEntityItemTransferNode itemNodeTE) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java index b60f51d0..302b72e9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java @@ -2,6 +2,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import net.minecraft.inventory.IInventory; import net.minecraftforge.common.util.ForgeDirection; @@ -11,7 +12,7 @@ public class ItemTargetResolver implements TargetResolver { @Override - public List> getValidTargets(ITransferNetworkComponent from, ITransferNetworkComponent walking, ForgeDirection fromDir) + public List> getValidTargets(ITransferNetworkComponent from, IWalkingComponent walking, ForgeDirection fromDir) { Connection[] conns = from.getValidExternalNeighbors(fromDir, walking); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java index 94076883..efa36c17 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; import net.minecraftforge.common.util.ForgeDirection; import java.util.List; @@ -8,7 +9,7 @@ public interface TargetResolver { List> getValidTargets( - ITransferNetworkComponent from, ITransferNetworkComponent walking, ForgeDirection fromDir); + ITransferNetworkComponent from, IWalkingComponent walking, ForgeDirection fromDir); class Target {

    YMQ2$}gbS45+zf?gHX8=eBqM2Wj?4X*{cf;a;@ zdj7k|CDmH^`q%2%Io8?*2Gv$go<_XWbAT=|^YX3Lv3IPs4N?rL^+`#uEuAo#I0FiL z`u=++rTo`(bgs4X3#|1{O05Nj1IZ!po0{>zY~qyv<&&oZ>B(e79Vvbu1>^$&x2{tM T`SOxO00000NkvXXu0mjfR7-J1 delta 279 zcmV+y0qFkI0+0icf`9o*L_t(|oMU955U|kQfTmgV{{Q~-o1r-?oslF1$|p_z&&kfg zux;I%I`80+CZb)C-`)G4nVFg4@Sfdue}4U9@CyxVs!2{@Bxpcxd-s1P7AA&USFYB* zd-I0j``51w!lEJ!fByVMQHR?FjEoF7E?=$t`2H=!*Uz6Bgnxtu87%GWn;O!S8IhIY zG~oaL{|xWnyk_|J^$UZburLE35dZ%B7egIZ0}6Wj{@=WIjp4`lZw!3=0t|eDf(&X} znoZpWxr{^^FrlOftk5?#Cg=T0000ts@4Di N002ovPDHLkV1mmwM}YtU diff --git a/src/main/resources/assets/tinker/textures/items/throwingknife/magical_wood_knife_blade.png b/src/main/resources/assets/tinker/textures/items/throwingknife/magical_wood_knife_blade.png index bc9cfa4e5dfb663355483f306580bb565c6c2427..04a35831922c3c2473fb07001ee0a63b0480a6ac 100644 GIT binary patch delta 101 zcmV-r0Gj{Q1d0T(tpQy~Nkl0+jd6-6uqHgG=)FB7}zRObUnp~4%00000NkvXX Hu0mjf`%Wv# delta 176 zcmeBTxx%txEo1#8PZ!4!i{9h}i6VuIrytZWntrfeVt!{xZ|c(ez$22K7f&2Ga6m!# z*l_`=Z+(e}M8w*D-qt(tb)&%IiH$%ozr8u}tCk`gTbsYes{$#8%V*9XJ_yut;KRq$ z{B6tE+bz6t&cRFK0aL_bkn#3szV*k~82~}TR@vo@1_2tA6Tbg{sogSvqhy1)!tw7K b3ltd`^1teTHICB^U;qM7S3j3^P6g-1oQ*2tpP_eNklHIB~LTV0J1ex3ILkeBBU|5kB$HU002ovPDHLkV1m#9BisN0 delta 113 zcmV-%0FM9k1C|7^tpRCNNklry&_68hRuiOY5Y(0GWbuDMwsU7`*q3F3^Rai&6ENFSV|>n T9H_Z!00000NkvXXu0mjf%3m;< diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/chandelier.json b/src/main/resources/assets/utilitiesinexcess/blockstates/chandelier.json new file mode 100644 index 00000000..339bcb0b --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/chandelier.json @@ -0,0 +1,8 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/chandelier" }, + "meta=1": { "model": "utilitiesinexcess:blocks/chandelier_copper" }, + "meta=2": { "model": "utilitiesinexcess:blocks/chandelier_redstone" }, + "meta=3": { "model": "utilitiesinexcess:blocks/chandelier_soul" } + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/drum.json b/src/main/resources/assets/utilitiesinexcess/blockstates/drum.json new file mode 100644 index 00000000..2c1899bf --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/drum.json @@ -0,0 +1,5 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/drum"} + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/giga_torch.json b/src/main/resources/assets/utilitiesinexcess/blockstates/giga_torch.json new file mode 100644 index 00000000..132a75f6 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/giga_torch.json @@ -0,0 +1,5 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/giga_torch"} + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index a98fd451..4bdcb2df 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -43,6 +43,9 @@ tile.compressed_gravel.6.name=Septuple Compressed Gravel tile.compressed_gravel.7.name=Octuple Compressed Gravel tile.compressed_gravel.desc=%,d Gravel +nei.title.uie.plugin=UtilitiesInExcess NEI Plugin +nei.title.uie.qed=QED Recipes + nei.infopage.uie.compressed.1=Tons of spare blocks lying around? Save yourself some space by compacting them. Compressible blocks can be repeatedly compressed up to eight times! tile.floating_block.name=Floating Block @@ -50,15 +53,15 @@ tile.floating_block.name=Floating Block nei.infopage.uie.floating_block.1=Floating blocks can be placed in midair. Helpful for building in the middle of the sky. tile.ethereal_glass.0.name=Ethereal Glass +tile.ethereal_glass.1.name=Ineffable Glass tile.ethereal_glass.2.name=Dark Ethereal Glass tile.ethereal_glass.3.name=Ethereal Glass (Inverted) +tile.ethereal_glass.4.name=Ineffable Glass (Inverted) tile.ethereal_glass.5.name=Dark Ethereal Glass (Inverted) -nei.infopage.uie.ethereal_glass.0=Ethereal Glass makes for the perfect zombie-proof door. It stops all creatures in their tracks while letting players through. Sneaking causes players to collide with this block. -nei.infopage.uie.ethereal_glass.1=Placeholder +nei.infopage.uie.ethereal_glass.0=Ethereal Glass makes for the perfect zombie-proof door. It stops all creatures in their tracks while letting players through. Sneaking causes players to collide with this block. Ineffable Glass is a variant block with connected textures. nei.infopage.uie.ethereal_glass.2=Dark Ethereal Glass works just like Ethereal Glass, stopping creatures and allowing players who aren't sneaking to pass through, but it also blocks light. How can you see through it? Stop asking so many questions! -nei.infopage.uie.ethereal_glass.3=Ethereal Glass (Inverted) has the exact opposite functionality as Ethereal Glass. Mobs can phase through, while it is solid to non-sneaking players. -nei.infopage.uie.ethereal_glass.4=Placeholder +nei.infopage.uie.ethereal_glass.3=Ethereal Glass (Inverted) has the exact opposite functionality as Ethereal Glass. Mobs can phase through, while it is solid to non-sneaking players. Ineffable Glass (Inverted) is a variant block with connected textures. nei.infopage.uie.ethereal_glass.5=Dark Ethereal Glass (Inverted) has the exact opposite functionality as Dark Ethereal Glass. Mobs can phase through, while it is solid to non-sneaking players. It still blocks all light. tile.decorative_glass.0.name=Smooth Glass @@ -67,12 +70,13 @@ tile.decorative_glass.2.name=Bricked Glass tile.decorative_glass.3.name=Creepy Glass tile.decorative_glass.4.name=Gilded Glass tile.decorative_glass.5.name=Obsidian Glass -tile.decorative_glass.6.name=Latticed Glass +tile.decorative_glass.6.name=Vortex Glass tile.decorative_glass.7.name=Glowing Glass tile.decorative_glass.8.name=Beloved Glass tile.decorative_glass.9.name=Tiled Glass tile.decorative_glass.10.name=Dark Glass tile.decorative_glass.11.name=Reinforced Dark Glass +tile.decorative_glass.12.name=Latticed Glass tile.decorative_block.0.name=Diamond-Etched Computational Matrix tile.decorative_block.1.name=Sand-Infused Endstone @@ -168,10 +172,12 @@ item.architects_wand.name=Architect's Wand tooltip.architects_wand.1=Can place up to %s blocks at once nei.infopage.uie.architects_wand.1=This wand is designed to aid the bearer in construction by placing many blocks at the same time. While looking at a block, you will see a wireframe indicating how a set of blocks will be extended by the wand. +nei.infopage.uie.architects_wand.2=When holding a building block in your off-hand, the wand will try to place it instead. +nei.infopage.uie.architects_wand.3=If, instead of holding a block, you hold a trowel, random blocks from your hotbar will be placed. -item.gluttons_axe.name=Glutton's Axe +item.gourmands_axe.name=Gourmand's Axe -nei.infopage.uie.gluttons_axe.1=This axe contains potent restorative magic that will restore the bearer's hunger while it is held. Attacking with the axe will heal whatever is hit at the cost of hunger - but this healing is deadly to the undead. +nei.infopage.uie.gourmands_axe.1=This axe contains potent restorative magic that will restore the bearer's hunger while it is held. Attacking with the axe will heal whatever is hit at the cost of hunger - but this healing is deadly to the undead. item.destruction_pickaxe.name=Destruction Pickaxe @@ -224,11 +230,11 @@ nei.infopage.uie.diamond_spike.1=Diamond spikes will kill enemies that walk on t item.heavenly_ring.name=Heavenly Ring nei.infopage.uie.heavenly_ring.1=Grants the bearer the power of creative flight while in the inventory. nei.infopage.uie.heavenly_ring.2=Grants the bearer the power of creative flight while equipped in a baubles slot. -item.heavenly_ring.type.0=No wings -item.heavenly_ring.type.1=type 1 -item.heavenly_ring.type.2=type 2 -item.heavenly_ring.type.3=type 3 -item.heavenly_ring.type.4=type 4 +item.heavenly_ring.type.0=Angelic +item.heavenly_ring.type.1=Demonic +item.heavenly_ring.type.2=Fae +item.heavenly_ring.type.3=Metallic +item.heavenly_ring.type.4=Invisible item.watering_can_basic.name=Basic Watering Can item.watering_can_advanced.name=Advanced Watering Can @@ -323,7 +329,8 @@ tile.potion_generator_plusplus.name=Potion Generator nei.infopage.uie.potion_generator.1=Generates RF from potions. The more complex the potion is (the more steps involved in making it) the more RF/t it will generate. -gui.energy.tooltip=RF: %s / %s +gui.tooltip.energy-max=RF: %s / %s +gui.tooltip.energy-tick= RF/t item.golden_bag.name=Golden Bag of Holding nei.infopage.uie.golden_bag.1=A fancy bag which can carry a double chest's worth of items. Right click to open. @@ -361,6 +368,10 @@ utilitiesinexcess.config.item.watering_can_flowering=Watering Can Flowering tile.block_update_detector.name=Block Update Detector nei.infopage.uie.block_update_detector.1=This mechanism keeps tabs on neighboring blocks and will emit a redstone pulse if any of them receive a block update. +tile.advanced_block_update_detector.name=Advanced Block Update Detector +nei.infopage.uie.advanced.block_update_detector.1=Like the standard Block Update Detector, this block will emit a redstone pulse on neighboring block updates. However, it also reacts to changes to tile-entity data or metadata even without a block update. Shift right click any face of the ABUD to toggle scanning on that side. +chat.tile.advanced_block_update_detector.toggle=Side %s set to redstone output %s. + tile.drum.name=Drum tile.drum.desc=Holds %s buckets of fluid tile.drum.desc.fluid=Currently holding %s %sL @@ -369,6 +380,8 @@ tile.drum.chat.empty=Drum is empty nei.infopage.uie.drum.1=Drums are simple fluid tanks that keep their contents when broken. +gui.title.trash_can.name=Trash Can +gui.title.trash_can_fluid.name=Trash Can (Fluid) tile.trash_can_item.name=Trash Can (Item) tile.trash_can_fluid.name=Trash Can (Fluid) tile.trash_can_energy.name=Trash Can (Energy) @@ -476,6 +489,17 @@ nei.infopage.uie.temporal_gate.3=Right-click the portal in any other dimension t nei.infopage.uie.temporal_gate.4=You will appear at the most recent portal placed in the End of Time. If it no longer exists, you will appear at the bedrock below where you originally entered. If even that is gone, the platform will reappear, replacing anything in its way. nei.infopage.uie.temporal_gate.5=§4§oWas that red star in the sky always there? +tile.chandelier.0.name=Chandelier +tile.chandelier.1.name=Copper Chandelier +tile.chandelier.2.name=Redstone Chandelier +tile.chandelier.3.name=Soul Chandelier +tile.chandelier.desc=%d block radius (square) +nei.infopage.uie.chandelier.1=A torch that prevents natural mob spawning in range. Spawners are not affected. Must hang from a block. + +tile.giga_torch.name=Giga Torch +tile.giga_torch.desc=%d block radius (square) +nei.infopage.uie.giga_torch.1=A torch that prevents natural mob spawning in range. Spawners are not affected. + tile.trading_post.name=Trading Post tile.trading_post.villager_count=Found %,d Villagers tile.trading_post.search_hint=Search... @@ -533,3 +557,7 @@ tile.retrieval_node_fluid.name=Retrieval Node (Fluids) gui.title.transfer_node.name=Transfer Node gui.title.transfer_node_fluid.name=Fluid Transfer Node +ue_wall.name=%s Wall +ue_fence.name=%s Fence +ue_sphere.name=%s Impossible Object + diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier.json new file mode 100644 index 00000000..94389f51 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier.json @@ -0,0 +1,30 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "1": "utilitiesinexcess:models/chandelier", + "particle": "utilitiesinexcess:models/chandelier" + }, + "elements": [ + { + "from": [0.8, 0, 8], + "to": [15.2, 16, 8], + "shade": false, + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + }, + { + "from": [8, 0, 0.8], + "to": [8, 16, 15.2], + "shade": false, + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_copper.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_copper.json new file mode 100644 index 00000000..71f3d0fd --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_copper.json @@ -0,0 +1,7 @@ +{ + "parent": "utilitiesinexcess:blocks/chandelier", + "textures": { + "1": "utilitiesinexcess:models/chandelier_copper", + "particle": "utilitiesinexcess:models/chandelier_copper" + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_redstone.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_redstone.json new file mode 100644 index 00000000..249e1a04 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_redstone.json @@ -0,0 +1,7 @@ +{ + "parent": "utilitiesinexcess:blocks/chandelier", + "textures": { + "1": "utilitiesinexcess:models/chandelier_redstone", + "particle": "utilitiesinexcess:models/chandelier_redstone" + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_soul.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_soul.json new file mode 100644 index 00000000..139eedc0 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_soul.json @@ -0,0 +1,7 @@ +{ + "parent": "utilitiesinexcess:blocks/chandelier", + "textures": { + "1": "utilitiesinexcess:models/chandelier_soul", + "particle": "utilitiesinexcess:models/chandelier_soul" + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/drum.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/drum.json new file mode 100644 index 00000000..a406d5a9 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/drum.json @@ -0,0 +1,186 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "1": "utilitiesinexcess:models/drum" + }, + "elements": [ + { + "name": "side", + "from": [2, 14, 3], + "to": [3, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 14, 3]}, + "faces": { + "north": {"uv": [4, 9, 4.25, 9.5], "texture": "#1"}, + "east": {"uv": [7.5, 2.5, 10.25, 3], "texture": "#1"}, + "south": {"uv": [4.25, 9, 4.5, 9.5], "texture": "#1"}, + "west": {"uv": [7.5, 3, 10.25, 3.5], "texture": "#1"}, + "up": {"uv": [5.75, 11.25, 5.5, 8.5], "texture": "#1"}, + "down": {"uv": [6, 8.5, 5.75, 11.25], "texture": "#1"} + } + }, + { + "name": "side", + "from": [2, 14, 2], + "to": [13, 16, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 14, 2]}, + "faces": { + "north": {"uv": [7.5, 3.5, 10.25, 4], "texture": "#1"}, + "east": {"uv": [4.5, 9, 4.75, 9.5], "texture": "#1"}, + "south": {"uv": [7.5, 4, 10.25, 4.5], "texture": "#1"}, + "west": {"uv": [4.75, 9, 5, 9.5], "texture": "#1"}, + "up": {"uv": [8.75, 8.75, 6, 8.5], "texture": "#1"}, + "down": {"uv": [8.75, 8.75, 6, 9], "texture": "#1"} + } + }, + { + "name": "top", + "from": [3, 15, 3], + "to": [13, 15, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 14, 2]}, + "faces": { + "north": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "east": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "south": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "west": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "up": {"uv": [7.5, 2.5, 5, 0], "texture": "#1"}, + "down": {"uv": [7.5, 2.5, 5, 5], "texture": "#1"} + } + }, + { + "name": "side", + "from": [13, 14, 2], + "to": [14, 16, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 14, 2]}, + "faces": { + "north": {"uv": [5, 9, 5.25, 9.5], "texture": "#1"}, + "east": {"uv": [7.5, 4.5, 10.25, 5], "texture": "#1"}, + "south": {"uv": [5.25, 9, 5.5, 9.5], "texture": "#1"}, + "west": {"uv": [5, 7.5, 7.75, 8], "texture": "#1"}, + "up": {"uv": [9, 11.25, 8.75, 8.5], "texture": "#1"}, + "down": {"uv": [0.25, 9, 0, 11.75], "texture": "#1"} + } + }, + { + "name": "side", + "from": [3, 14, 13], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 14, 2]}, + "faces": { + "north": {"uv": [7.5, 5, 10.25, 5.5], "texture": "#1"}, + "east": {"uv": [6, 9.25, 6.25, 9.75], "texture": "#1"}, + "south": {"uv": [7.5, 5.5, 10.25, 6], "texture": "#1"}, + "west": {"uv": [6.25, 9.25, 6.5, 9.75], "texture": "#1"}, + "up": {"uv": [3, 9.25, 0.25, 9], "texture": "#1"}, + "down": {"uv": [8.75, 9, 6, 9.25], "texture": "#1"} + } + }, + { + "name": "middle", + "from": [3, 2, 3], + "to": [13, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 2, 3]}, + "faces": { + "north": {"uv": [0, 0, 2.5, 3], "texture": "#1"}, + "east": {"uv": [2.5, 0, 5, 3], "texture": "#1"}, + "south": {"uv": [0, 3, 2.5, 6], "texture": "#1"}, + "west": {"uv": [2.5, 3, 5, 6], "texture": "#1"}, + "up": {"uv": [7.5, 7.5, 5, 5], "texture": "#1"}, + "down": {"uv": [2.5, 6, 0, 8.5], "texture": "#1"} + } + }, + { + "name": "sideW", + "from": [2, 0, 3], + "to": [3, 2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 3]}, + "faces": { + "north": {"uv": [6.5, 9.25, 6.75, 9.75], "texture": "#1"}, + "east": {"uv": [7.5, 6, 10.25, 6.5], "texture": "#1"}, + "south": {"uv": [6.75, 9.25, 7, 9.75], "texture": "#1"}, + "west": {"uv": [7.5, 6.5, 10.25, 7], "texture": "#1"}, + "up": {"uv": [3.25, 11.75, 3, 9], "texture": "#1"}, + "down": {"uv": [3.5, 9, 3.25, 11.75], "texture": "#1"} + } + }, + { + "name": "sideN", + "from": [2, 0, 2], + "to": [13, 2, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, + "faces": { + "north": {"uv": [7.5, 7, 10.25, 7.5], "texture": "#1"}, + "east": {"uv": [7, 9.25, 7.25, 9.75], "texture": "#1"}, + "south": {"uv": [7.75, 7.5, 10.5, 8], "texture": "#1"}, + "west": {"uv": [7.25, 9.25, 7.5, 9.75], "texture": "#1"}, + "up": {"uv": [11.75, 8.75, 9, 8.5], "texture": "#1"}, + "down": {"uv": [11.75, 8.75, 9, 9], "texture": "#1"} + } + }, + { + "name": "bottom", + "from": [3, 1, 3], + "to": [13, 1, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 1, 2]}, + "faces": { + "north": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "east": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "south": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "west": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "up": {"uv": [5, 8.5, 2.5, 6], "texture": "#1"}, + "down": {"uv": [10, 0, 7.5, 2.5], "texture": "#1"} + } + }, + { + "name": "sideE", + "from": [13, 0, 2], + "to": [14, 2, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, + "faces": { + "north": {"uv": [7.5, 9.25, 7.75, 9.75], "texture": "#1"}, + "east": {"uv": [5, 8, 7.75, 8.5], "texture": "#1"}, + "south": {"uv": [7.75, 9.25, 8, 9.75], "texture": "#1"}, + "west": {"uv": [7.75, 8, 10.5, 8.5], "texture": "#1"}, + "up": {"uv": [3.75, 11.75, 3.5, 9], "texture": "#1"}, + "down": {"uv": [4, 9, 3.75, 11.75], "texture": "#1"} + } + }, + { + "name": "sideS", + "from": [3, 0, 13], + "to": [14, 2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, + "faces": { + "north": {"uv": [0, 8.5, 2.75, 9], "texture": "#1"}, + "east": {"uv": [8, 9.25, 8.25, 9.75], "texture": "#1"}, + "south": {"uv": [2.75, 8.5, 5.5, 9], "texture": "#1"}, + "west": {"uv": [8.25, 9.25, 8.5, 9.75], "texture": "#1"}, + "up": {"uv": [11.75, 9.25, 9, 9], "texture": "#1"}, + "down": {"uv": [3, 9.25, 0.25, 9.5], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "top", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4] + }, + 5, + { + "name": "bottom", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7, 8, 9, 10] + } + ] + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/giga_torch.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/giga_torch.json new file mode 100644 index 00000000..653c21d9 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/giga_torch.json @@ -0,0 +1,86 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "0": "utilitiesinexcess:models/giga_torch" + }, + "elements": [ + { + "from": [ + 6, + 0, + 6 + ], + "to": [ + 10, + 12, + 10 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 8, + 0, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 4, + 12 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 4, + 12 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 4, + 12 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 4, + 12 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 4, + 4 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 4, + 4 + ], + "texture": "#0" + } + } + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/advanced_block_update_detector_active.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/advanced_block_update_detector_active.png new file mode 100644 index 0000000000000000000000000000000000000000..240c3096a8bf5b00047a7faca25cc8a149299a0f GIT binary patch literal 358 zcmV-s0h#`ZP)Px$AW1|)R5(wClf4auFbsv+fB|kL3K~ipBqm@1Dky0vK@>FfNY}B#t(4Pe>E#Uf zS3GPI`{mhAk}S&tD9h5U_p7Q3MN!y4z}LR~gwHfhVcWK7e?c+xJiiFE0q(b(p=laJ z+qR+a`|wCpgW||B0_12>K_rkU62O|s6;ByP0Gl=m6qaQP<2Z({>x>X^0CD6P0W#Kg zwGBzWmT@J=KaS(v14;H$^E@};tF&Pl%rAZ3>^ps9L=;uPze!izE^fMR2`H{x(_<>bgE% zWp!TT`j#9OK%fO#K$E-`d~7U1PZTmeQ?2=bJ#Xz{pA6bv)aI_rqyPW_07*qoM6N<$ Eg61@pWdHyG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/advanced_block_update_detector_inactive.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/advanced_block_update_detector_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..5b178168441d2cf09fd2d9c38526aebe58487be2 GIT binary patch literal 370 zcmV-&0ge8NP)Px$EJ;K`R5(w4lc92iKoCUl6Rs*McOpN8z#uVH@dZRhp+I7gPzVej&A094&0TMX ztt6tEWp}#inOQDbmIY9jrA5E4swxykVef#o&b7Yqn5HRg+ZN-0P|iHhKLR=c&D;Hn zrZKc_8~VNvU)P&Kd2mbsJK9td1c(v=>`7etlwks>>5xQWS(Y%4W9Yih1OXo)4~_|7 zV_nzh!OL=5Mk>zwIF542#yywPDgh2O@gTD>!o5sL!;B1r_I z1k#J-Z=>~~uItlPR_8UYzsS)60@_dnG|5N7=f)EBiz24qRD1qizqiha5A#(}5VK1W QW&i*H07*qoM6N<$f{T=$*8l(j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/bedrockium_block.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/bedrockium_block.png index 628b1854bdac4c2f71f483d99d8cb4a54197198b..8af26031f4acda8eda24488a2bb40a0f99c6b24c 100644 GIT binary patch delta 229 zcmV}S0oNRg2(Ux9>sGvIg%rnhII#T zjYFNpC09!6L)2RBKj&;9NAMi;;4ToYHA5-ohKN@V@0tLDF@|BzX~6SZ%Ro+ZE`T=P zs-Ad^;Q~N(d=z+eV^OD;;d0u$HDpBPq=N_C!IC((8 z1M5HqbjE0Q=58kH2z&c`ynEmRP-6vt0ga>2c)UpeTp;qk3vX9B%DIWUOi?9PJ1!H~ fQdjy{ysz{Z#Y3og8`o|m00000NkvXXu0mjfB_(C5 delta 390 zcmV;10eSw70<8m(FnxigHx7e>i}Ld3LzrH`~9A( zswj#g`rl;aed>!t`i7MshvmKh$oStW2SUfW^ZCs6dYwMgw@G1Ih%cT=N{RPAzG`^i kvG2XdT03bfr9?`}AH(k3=4;ZWF#rGn07*qoM6N<$f~L#Ae*gdg diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/blackout_curtains.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/blackout_curtains.png index cd081f9bc28d264c59be0e74a326c0b2b768a694..8c73058061a6315088a7c241301d1989bf22e6ba 100644 GIT binary patch delta 258 zcmV+d0sa2@0_OsdZGYuSL_t(2k!4cL3WP8avs3XiJc%eMUPS-@yR^F5MzUi!hcd5r zlBkX2xUMVCuIuJ`-uE46-}lorZQF(z^Of|$}$S^>;WvCHj^ev?3Cjh>R6EWM`sTt$MKYJhyElvMcvC5Jf5`eg1 zVHzzOC`vR*lA$$CQ`a^1$t&-e@Yw2ki-U|}5Hp?)UY6u?gRDy#&juyMwc;D|6-j;V z@g4}EM5!eu|Bd|b!0GP=8RtoR59kkR119-&qcBYYF7QYG0Mqg)BG~u(y#N3J07*qo IM6N<$f|@~k*+7c07Cx{5Qx;qh}9e+DxhB5IsRMpI4`m+jE zl%f#^Qc5os9HXyBN-0c3BouNfCFcx(!D=NI@r!lU9U1}@4k8i^c(oOFu_4f@Dj2wX zR#oON>#=Zkk6VZ+!|OlzzC%QE&Sv(Ow7${$9RNl|J`cBwUKxN7JeV1Web9J8i-W4- bBmV&Un>cvi1P;`y00000NkvXXu0mjfrSE%p diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/blessed_earth_side.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/blessed_earth_side.png index d8dc054b7827ed5c7626cd355bbdd952a39fc102..f75356eb88dc944d77cef2ccfff42f79e11eeaac 100644 GIT binary patch delta 394 zcmV;50d@YQ1-Ju{IDY|ZNkl8^WXHhJkBbPgY+ibqk?LJEPeEt;kc^lUUd+7B7v|4vE9dULK!wV5& zoPs%SGO0?!YV{!r4Cb3QHK$_(7RY8}f-M$Z!D%~wf*_CwMGL4fnVR&dQ}O-CN82@n zBQdDI3Q2J&W`BdVk;X;^n54m!FbpG`KJ{DMHg$e5K|6tV`wy1_K4`U$=_gyC^EvrT z^2Mj(Y)7B77FOI+(Oqp(&}-DJk*1TXRjW-^{?&&}cLf3Jt(8T8PDB*0614vsrXH z9oWXlCs3_ctwfKS7>~#Cap5Z>kuZY6K8%c9uvpoxq8+PI1L<@cKA#`c)7Rnk`e0jI z%j4C+c^>v37eO`4^wz@pw=y7Lj?f0&QmWl-V0i zpq6{Bl1?WF@#*C^g=rIaE~^3OuSN0UX%6AwVf-lXs&B;FgS%7aMx~BWpC2cW9>Jr9 z6^uqBV2mco#2ncDN2m>yJ1Q#xZT)1)J!i^i(euFE&3pZL^-v7OK@44rk`~EHBZ(Lk_kK^M` zY;L}d?d`d^x%nAKM_*%q|5FTyuVZa(HoDy>F&Mmz(dd2NTYvBFen&ez{F22hE6+0- zfbYe{=`31bf0gU*?uXdgdKZ_MKjP%17ybTBEG<2a_VDm0#^Z(TzP$V_uC7KgnS6`A zy^pc8GoS37>%O}BBEuOLYTEhvFzMdj{>lQ$2M3@36=SCXfL?DpSzcd{^L%6DO|;X~ zekNO804VJe6n~RruNfKc(N6~V_miZ>3rr-SPq&cBL}2oGQs5dkPBKnl!Ys%VNf7qT zt8WrD;#E^*15IF240J)aWXThzfH9yPBUBfKOn0X3V=4bsS*f)BKflQ}?&5&h*078n4m7b+4! qv7f_pu2Gt`wL0kxsD3n(uzCb6lcp$hpxrwF0000aeVVYfSQex8KQ zW~a{vO{>zQJ`BTv%jHC~`H1oHAauQjm6a7DD-xrw8yg##mxc(ma6a>_lC;stb!SDZ*v01E0y{q zT^R@jNL>b3S65<-eRF1-R-;PQq4EJ>lICc&T9S07QYFSEX;*G4zRdOKMk^MJ;MQMU zTofXe>+bV;MNX|&m(6zjNz|}MW^6Px+0W%}C1#IsI4l`(g_KYzBz3pjZPbYoVdCM* zW^?o)C&T0Qdf{|BWuVMv70G0h$Z9g73L{&s7V3kjOc|GwOFK6gmSJHgZX8813Gnpv fv?zXQ{~P=V)XR#8m@hzG00000NkvXXu0mjfX*yvQ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector.png deleted file mode 100644 index fcfbab950ec5ec49552a3a60edf7f6c8fc539130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv=}#LT=BJwMkF1yemk zJqzi~S1W*OwxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHL?Lq;aB>!N_{ z%yt&AcovWi0trA2(hsB2EM;J3V3@$pzyefZU}S8-xBy}*NC)czh)Gj`Y!F}qn!^NE z8DwbzWI=Tq8W@0NS2rjM2hX$605StST^vI!{F6-#41SzPx$AW1|)R5(wCld%niFbqZ6fB{&Ef`*a?i3wPM3Q8JE5CsiA(sitGD{=akUd}=2 zuK2{n{y(-8CwZP|&>n{+qEX!8_hcFC-p>113 z*L7h}AWj?;P&%G0l2#EBVGo;lm0lVh5u=(KfRZLjZp6ZF}LV**NJ+qQ6mf?io> z;6(lv!y)H+#yucqIUy89VUYb!Q}d1EXzOttb{nAt1Xx8B2_fx?EGQ<*Kx)251UMN1 znoAFYfYf|_p6G?hKoBRC@UMv?3qHf>7W9LIEU49AE51nJ{*b5>0kRO8J`is`Xqx8n zDRW(rfPc!Cfdrn0Nlo(WeVC%B%!o>iF};tiA8$YMA2a=LS|57LmH+?%07*qoM6N<$ Eg2kAUtpET3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector_inactive.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..b623fdfe8323412ff507b2dedce942a0e7b7b958 GIT binary patch literal 366 zcmV-!0g?WRP)Px$C`m*?R5(w4lOYm=Knz8Dgw9m86}=DwgTyey38<<$tLtBq-ko9|2SSO)^(lPbzSXmgccCMiYO97+7nq&PE>)^e2)ll zG6D>j83X~T`Tp+bTOfKNDiFj8Eqo7A0)B`h3%Vm%Ch`2CJa1yMPm4uqsVpTnwEzGB M07*qoM6N<$g7?3fdH?_b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_0.png index f0fb00712bfeddd6e748b45469e0e875c4432f9d..9a9ec499f95e74dddf0982922153b19bb3af5119 100644 GIT binary patch delta 571 zcmV-B0>u5!2H*scFn~Ca@;M%l^Bpm2 zwVHG~9huE$N+y#WFT7qaA0CefyU26(tyVb@ zN&SAGE8`4bG#aJr^~&)uj3mP0Fjqss|5hrMI57|ikc`>y_ew_quvjc4GMNmu+ij}V zYV>};c|Lp*Ab){=zaO1WCr*?dfh&{AM8amX@db<@k4G8|2Fypd+f`bHAqiwoCKFn% zRvZsSgxzkZX0u6+MuRK*d_ICQI8Ucjy5H~21!RK)=rj}x@!e=N{*j3Jq{(1Ny4h?L z|8lvcN~OYN&t@|!6bigM3?OHcZGt!ipqd0gGXDGhet%_eFou8>i9~|im8{FT%jGg} zqGTTbK)M9wJxF^_%n{9GtL;M8Mi2F6}2gn2qW5* z&@1&)t!iPL5F(I>(X7m(bWBIcf6->{;)Ba~9^fnvM>sq@bO(b0uIsX~vB7*kr`>Kd zolaR=TH^Qjmu|O9zu#v(9wUk(k|dE%r}6oGh;O*dOd2j8p&jmMx#L_5BJ_GaR#sMcd3nLBs_Mns+8SS9Ul@i# zqtWL9}f=?h@yz9s${cSLZJ{(PftjaM7dlh8jYf=Dkmo=RI62FS;ldk|5o1H z+haDH;kquxVv$;{#_H-SvMjT{zRu3h4uwJifPdL+2EcGQq}%Nx{`vEVKp;S`*ZbF? z*=$m&RM2%D%d&_@qa+duEX%?)O~Tx6G p79`cT5prV2iGl~&2cu+wwpcudiMifyo z{(v9bQuUbS9fqAyUEN*Pt9d*gv0ANSu~?)~C`dM&6|dJTPN$RmbUMv5Fb0D`%x1IL z?RLpzGQ?}aV33>p{VvbvQ^w=5l*?tFN28H^J|CIQW-_18iGM2=i*i1nrPu3`SVQL1 z=_KuTo0nM8Xp{u2)k?n`4u_IRB&1X-k!Z8oh~Mx3Bf!Oezn4y@BlUWnKm_&seP+fU zcgbW@E|&}OSZGO$$K%Wf!2eaLR2UeEL_}eByPaMU2pkTFX!(3z&-{A5*dM+CD5CH8 zE63xJfvO^CWq-5TM02@ZJV5co;UI&-fO>ShUA_OA*nZS_%wH*Xy-@zgR4!R;y9$>2yk~5laHq zlPVL!0f20Z0Ks?(6VCVqfQIXOC z?f?u@5Wr&9E~?jH1yof(2mQ}~s k*qA)rK^uLv?(_NN2Z*@|&M(V}_W%F@07*qoM6N<$f@Z1%k^lez delta 795 zcmV+$1LXY31iuE5F@O0!1Fp2u`LMHEF8MIn>PAW0HpI2>kUV}nwugdhksn}1DYS*BPl;<_&Re4bXT zMJN=aR;v*Tg*ZMw#&unuo}Lg#qY>qD8QZp5TU!HQG#UY*X&P^DZvaS=#AGrd5{Ynk zcgOzzK7t@106aWAkjZ3NtyXxRhbW5F>vg`qzKBMn0NA#TAP5u+1pr=NUg-6Di2v$e zU0v~ihQlG2Wq)yhe~&1NTwGi*9*=Pxhg2#>x7#HejUsBAMzvZcnM`tcc*t}*MO9U9 zZfe*qcAH+WM>HB`JRY;Xy-lOhU@aDl{mtcabUGa@%c9%u((QJML?SE} z3s$QYwrvvx0g*@q-}ljV9ox1U3At(jA@!wDt{H`^Ep8fpePD^dwZnQX&lF) z*=!OHhtYMNPN##SC`gjTS|XA7dwzaSGMOZw&m&0^v)PPtxy*98L{(K1i3GZ?<9Qyt zyStdCiRXC?heJewdcBS;%gpCFW0;<(2%jFV9QLt?r!!S5GIRW7D@exrF1SCn~_4O4| z6fq2gLZN`Fs?_Us6h)z0trCmHFbspUvoqe`-_bOU)oS%S<)fn`etv!kf`EsI2OP)Y z&!0bNnno^{||wSCC3VdLgMjw#O-!VE|-%`CL`f+Sp0s!p3~{H-idKI z9O81h#Ow8{pLi=4i;2(YlXAH%l}betiG(I|=UlB;C6!945r4;9p-_;|&rb!msGQH| zWjGwlcsy1k;P>}ew%e`ko6TlgpxtgutJRWhHY<@x)*htc71uo(e>SqMQtRDL`jaz3B+OBDn3dcEZ5 z=SLF_BMKv|6@Lf>^wMZF+<#WrA&*(q5>!bL^M5OCis58%Wk)`{pjG>cI{1-eFc(|5Pqm48~TW-HHIv)NQY0CW%D-rjT^ z^h_{`W)cVr3l__OKA%rrDzoDDChqrpHI{{i0)&y>Za1xH05}5>kH`O}08*(`(qMF8 z?$9(kFdY&A1%MILF1o?qqW@$vY5ySf#TR2#{CUK1r&Y%O{{F6}V`K-MPN%R?oaqZ> k9!;N^5gQvH>eD*@e=x|(us}Hb&j0`b07*qoM6N<$f`GOOApigX delta 748 zcmVg5EO_Q=LDT;#idW{P3 z@$o^Y(?LqfcDqFg!E81oiXtq_0>JluR8{5d>ytM!=bco8%0t0zbwnb^E`at zM+m`aG$M{;f`1?YU^1BiAaq?P3_}Kk0VgLXBuRp<>)hVn^8Eaa=Xs3BW0uP$K@ebB z7I7S7+csesqSfp5f3;c-RaNmkkJW0$YPG^NO|mRQN{R3Llx2x&niNHWVHi9qO?(gqO(-eSOt;S$5pxth>SS)yXd7)aZVt*J0@9*z__(Gsrmi2Fcf1its z3l0wt5kin83D?)x6h(oq>ogh-48vfv+0gIzab1`Bd`?jm2!JpQd3$>!O;b$MWV_vR zcXvme*7-;h*QMbk8%o}SP&4aadfKR-v;b!M{}wOWnobc$`;IF7^B)fMyk zob7gtloC}4LA%{%I2>|%dPkOQe)2{eE9In@x0G-@Q->vCF6^ z3T0Vh+culc22ImQk^}%%RZ&gTWVu|jTCH}jUteEDQADfNqFSw@>pDRYP!t7@O^*ILPBG83I>G%CShPy&H~lu9MZ=kpSa#Uv7m=yxuc(=$09k4JnypM*jo zy(iyECX*5lhoxGrO08CtbULlYocXTT>ypi8HOS+wTrNv0m48xT$2yP4W0_8;8YDcQ zPucJH?%iUs&<4F;Pdc5B6bc1NBohAsKt7+(GMP+dI2>vsMYGvVHk*xpa|fII{jLDi zFp>jJqyK;O`+Y5h9q%wYolY(z00^g8Eb2UT{(L@iyWRAcE(Y}b{p5PRYN0WrF~T~y zz@gP@$>nm9`G0)w>H&xa=kQdQ?yPJ4C z9yM4N777q7d%a%T(E#`c0O!;Nkf1{{IzStmrUUL!04M-h%(&6`C(m=DD1X9QOArL?_j?@2q1)|} z=Q(+vBa5P7Fc@%kb%pD?04$eFrqe0={hln#0FY7=$1y<=P}eoa7>qHv0GrK*UayC> zma;4nLXad0d7cvl0RV9vbl1Fecs>SF~%SPs;Z*ZYOz=> z&{_j(Q375Hk*`X$?feeQ52CR33Xln5oB4$dc8(#jqm%EWyxZ(!1Fx9Fa+TH`x~Vc z^ZA@st3|)xM{A9HI-SV#{A}Uv?Ts)Dsp}f8H7_qOBuRo&ia3r5!;r~j0zgp|NXKz- zU6+rK4}XLZgki{dJjV09^A?uNB}ys6Fy!g!i6lul9*@*@jVq<3+wJoB_{eB9LTk-x zwL0s(zrSZTo1OPjRn_?(4hQ7rI5#&pw%u;yc^-M5Q&kmG%JYu^)>@QO97qlagb*B$M*v*c#r1ukpPwJnG^MU< zthMZRJMuiI)9KJ?G`P69IQL-~((Cnb90$+y_z&#AXOJ2396kU5002ovPDHLkV1fv_ BUe5pk diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_4.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_4.png index 233796939710c4b8ce5ce248dfed895dc1197c14..0ba921d6f3e408a65c81e007d40b03b774ac2a2d 100644 GIT binary patch delta 495 zcmV&Gw%jI%LEEbE&&t|i_^BxL?EF2D7G#XW${2-Z3 z8dj^-tX{8Mu~@WJDy2JqqtUQZsU#zhw`#SjVt@mX2~;W-oqrff{eItCt=2CFU?!8X zLZP5y@)L=~UjUFhosO+mD_blUDqgSGw%Kg#a5%^(HW&=-e!mNV8b%7z>GThsB)8dY zrb2*wy`DXvPdlH_iqR1Oa1nrpG2`d+vD@vYb26FyfWF_aU9VRa(-8phL-zqhaDmm! zhEMY2@emiI(MUjW#Ml6+ z1AgFu0_ODO_xo+f<54k;*5~uNcwn_`>IVP^fOwk_H=R!PH3y*BN%ed>4_F0bARn^=6=0i z8o>eZUFO;X>mvX$oJf_~APJu@5qJF~VaCOm66pXDc><%jxR?>6RhKU-`njx delta 669 zcmV;O0%HA@1i=N6Fnbgcd=Sb6( z5CZ4(nYykCA&}=er_+gH7Z)fH7$ zQB@UMYoaLP`}-RJDJ8P+d(t$eC<-1QAGy7~C5~gBo`0T*q6i@btJR9lW`i+?>+5TZ zqCiRsfQq8%uMh%Y+E7&$bzRf8Ek#iPa5x-Dl7!FCPwKj6KA-=4Mc?;0=eP{n@Angt zAp~AuU-|m_B1sYshXZMvvRp0!@ZO`WwSSE4hY*6Qsu+d=Yc1RD zmi>ND2!8?ZJyIz}mSrp!3-0gl@!nIG<@Cv1-lA*Ey( z2Ap#Y!$8+{6TZe6hGCcx)>?BupE;dQ=%#5f#-O#PZCm=jpPDWvx;WE&PuF$RtCdoS z<#IVX=djjJS9tGHN|7W9-uwRr`!6Si;Cw!#wHD?d`7udX(tgC>00000NkvXXu0mjf D;kZDr diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_5.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_5.png index d39a6e0f6aabb88af0a457ab4d9a17f906548d58..454bbea38d6c00c26f48b63961b84ece834c7deb 100644 GIT binary patch delta 468 zcmV;_0W1EZ1^NS!Fn-|Nk?2 zd<7YNhcM}Mr8=o(LbY18a=9$)bUM~XZK2=RPAx7X`skH(pU+1x@LjLhInnp~wKPqYOhpi&57h^zzyVcx;e0;Ze!mwO5;xA*>(wro zi;c%)_0L2^z<;><{k~qDPNy<_z|ZGXTC7$p5up(x`)DO18jwJr4yKLU?WPz;>D%pA zRWe#gaso7f#LGmu&1R$5oPcB()$vpw7zJ&>>HzN>0T~_f-#e;>KzmRu7Bv#a2pE7* z0zs+bmy|fkX!dUt5$=A!i-d)OgudVJw_0!ld|z`-flcxGf56v&C`7{NCE~vStT0%7 zs#gUpkpq7Bof0uL^7Vz74a77Bf-nKXCxJ7U{wrgM?J+9EC;kV&#atH6wqtDo0000< KMNUMnLSTY=Ox+*= delta 637 zcmV-@0)qYe1EK|xFn z5CYzN#9B*T*PKo#j4|Bmdc9KDHQ(RgXsvmDePtL1x~`)rifIZl#^AlDC zqiGsmUS3$Q*H~-WZns!#QA)8~E?KYFhzP6Iil%AMT7LteZ};u{p5yU28T9%2N!N9g zsi)Hk=N$X}p1$vy&1N{~(Bn8xfB+m02b^;gfgc|q9FIqwbNu}L;GAQzSO5@0z!XLC zpNJ4+oDh9}erB~=F^(fjDcZIrrG$vE*=#r*4#XI5e>8Pnb9Z;g)6)|%M%uO|#z;{V zJU%|M+ji}yRc^USDG_5ttyZgCRTWApa?W_~$vIEwGR7bxq?G=LM})rbxm+%P9NdH< zgo%9-nL?CvrYuWB2-D~QT5Hr|vB<+PAR=h3r#Ne^Da&#a55s^lhO#VCO40W{#u)wq X3~NwsIR*$k00000NkvXXu0mjf0h}$A diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_6.png index 4ef5215c4fe2fafbb8e4630fce61bbdd73fe542d..13991115cf7a425fd25da31bfff4408f0f95441d 100644 GIT binary patch delta 417 zcmV;S0bc%|1jqxBF@J(dL_t(IjZKqVtHLl4gi{-B>jfVQh1UQ7&%_5o5N{|}YrZ*5 zPXlS1&CKj(H=E7p^C6AEh%pBKzu&L+v)N25d+f|C%Vf**T>p^|GYM(^d_JQXM1Z!j zij>ayXGTCpQ3MNd_PdMSd47pp^Vnnps$<1yTBH;L?ayKukX!}IwZ z6AMNHCi}jR$3q9?00LLp@AulfN|1>_$>xKRL%g`8fVSIhsH#eKqH#qK_J~$=vbYA| zwr%Bw`;$03NPjt#6N^OGm&90%Jvo2`fnoCLbQ<3YBTIyV#4MLfk*6fQQ?Au&r9BnF zGm*05G#W^_kP)iuT4LAhRUn9nGO;^X%AKFF=lOgd!*zv-5D^9roOty{O5Om-C4%IJ za>F2C8+(_L=(0rAOZ0=9cAUG?$+f`LuBQwU0XNLllN!NO+q5%(%OpXieg~*M00000 LNkvXXu0mjf)62^8 delta 503 zcmV8z*y#{ZDG#<}rB*y6O4uF~A?zGkb2q6H_TEpFOcSHmLRYgQF5kW+VF(M+=S_fEb z4OJbrTI+qtj9M$TR;;x~&Y2EmW|UHxrs=;XGeiV;M^y*A)_)oSpp-(45i>(oQB~ZX z5CS=8VvGama=8F-yWQ@LQcB(%RF!2}0EjV?b7oyvM1;4uH%cjdetuF);XF@TYgh+ct8}yuZJ*?>onF3}IFE4$z1De}8{}X{|9$6UTAj?tFZFFiq2N zNmV(|^DZ`kyMJS5?E6l)R8@I;dg9^XfqmcEwrx0a90&baN9qVrHb20LJjw*Vot+08v#BAu!J~s`|en5#e^b@%Z=% zz`Cv+$3cvd<2Wd#+!=@n=Xqjg%=66i^E0Z-&(9B~6mZscC8b142~{0hx%+*UV~pc| ze}50U-JuWy>$(Ck&ofK^=0D3ML8ZHYg}nd(002ovPDHLkV1k^E@QVNd diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_7.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_7.png index e1be94bc0fbd3e0d9704a490d5d7d99b3481ca2b..2dec85a4b17479f8a834e3eb1663e8bda9002e39 100644 GIT binary patch delta 318 zcmV-E0m1&31LgvdF@GRQL_t(IPi2x<3dArBMALh3kozCh%M*-nydO%`W~`PKMG+)b zRfV!F-A0e?JkLKd@-rpXbsd_faT08F`Q(pd5M_J>mJsawK6G8@zP4@6Pp$+qBS0Zp zLJ$IE7zX?6k#QUyOiR{+O5zUynWiah+vY^~eTVZrO@~Oc$$!)zU_jS(h39!p7t#B^ z28Ixy+VmNSgz`vQ*VX=jCD_Mt_-woa5x|=EzVEx0u9qPK9IxBA07x&9OdGri0fIiy zvsKAP{wlx;iOPg*Sr#V%4Ef(0bzLG5SVA=bwGrig2y~XrA>ITasz^y8f#5R(hNBgs z)2jw25F*{zs5e7Wf{seJp)=N&;9kr9Kf!l$`Aej->ekL7wkh9WOp}`m6&i0 zGeFF2_yIDD2XmYqW=aVn5^Sz{~)E_xp{t)q( zKK8MWL2~%2dMuM4m)Y+=OvKF5!tV6Fg}e6t4g|ks{9EaJmA{k!0DSxr1jmKmfdBvi M07*qoM6N<$g2Ym&`v3p{ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_0.png index 338ae59d8b6a5a17ec3657c00b79d356fbb66459..66b32bf7d29fc98550772a35822a69c96ddced3f 100644 GIT binary patch delta 284 zcmV+%0ptGd1j7Q5Fn<93NklWrGzrBAX$o{+K_ON3`gZ3V@+-amzC~!RF zY+(CIMOsy3WUCZQqay{5Ic_4yI0o|16tCWb1CPt$M>x}HZ)i0Iz5^$czd=d20E|81 iuIu98K5Oo!!4((t5$!NjxV{(w0000~k+zR!AohmdjB|eFhI7P)>M8|T%Y|hL%XD^ACB8Zijy56AR} zV@g^E$L*2KstflbOR^;6ad=YdmV@xeB!wSPGRjk!rGGB*#vLUT8gLs5l5wKqkFr&D z%i(Cx1mNwb&y+fuh%52#4RbqNYbQxX0pN}hF$j3PwZ>_~VP!eZP%}vm+K53w0tL%% zv!P}A^YaT|o7dBAjN`AY=B6faR%(XMhqG^!L6Xh@_RTFVw--&IB(rAd5vdYh*B_C{ zstdH-UP1IJ^>0Me^=P?0>ei(HazAD#6hL|P>|rSU;NA+Si;oyzT_D>m*E(){{)qo! Wq$$Yk*V0000Wi|;Xyc&z&#J>9y!cI^8lDBrJAT{*p1yiiduj{1b=XtiM}8jsm}`F!$aDM zP*odU!%Rfg00!}tKdI@Ojey<|Xo4b9G(Eo+paxo*e?s<$8LJxjd*HeIv64!qpyN@_ zEKI*rfmY2J6{?Db(J2KTv)x1;W3R|RL%ewl3_P!=nQ)}xZ)h_GeFscb{yLr67<*4R h#%O>4taT3!eiS@&)H5o1@O=OP002ovPDHLkV1nRpgRTGo delta 576 zcmV-G0>Ayj0_6mdFnfgc5Qd+mPSPfElH!n%I4XjwxTypJMWRwF z=z&uYx%3zHukZsnaY0BNxNxfirz);g6|hsKwM*@losUAp!CK2n=dv@qJ0I^mGpWP9 z_S_350El1;K&w_}`OXU`l=G|cyLIW&s+Cz$SF=ZNo^Nn@?SHe`Sf^IW^Y~GP^3Fat zzXxnK);ZYSLa&x6WEBo}x5z4KJP~5r*Q5^j+Vjd<27saK)9bc59@t3f82W-ebbSDN z-8Sz(|3LAA37OUl-d24WfaUlMU7w~_qGRY-j!#`v8M%VGrp7@nCkm7XD7YtBj!(zX z>64>NcwMw3jq0_9Em|UGx%;yNkGcH`g9dK$n6xMS1;gn!JBN)%9Ybv%Y zP}D;1USvs@WIPE^O5d~*!3;$NQ|d-@0khO4-lU_1!hZm6=K>{3RPs@_s&Cr#x@`bH zemkM=s4-XK(+5_zH>yWUD)PGn{BX+l#zT$=HpP67v9`lXc!eKMNt5E#a%gBJ{`@jI zy|`X%V-kO>T3VREW$73?U%sD5gCv~+ted}#ToF&8B(r1aF{u)s7feX2g&ZSS#Gf+% z#tdDbkvS{qn^FJeek@NYKA14B2M6)=Aq7C;SIppD16wIoVGD O0000F+eL&2t3cbcx_kl^SYTXDQ$8PfH=G|nsuEL-`&9yRDX<(C?-EF5&#Sc5};U# zC1BTe$wvzYzz3r|NmNxV`qDYnhUjO2^nIW8uhzWI0o1_W7+@&DGx2Onzugo7nt>mZ z{-RtKBiRf}N`0^J0VFnIgRU!)6JvG zxqR1Unka6r2K>5I1PuEjJ>Mge%8-WrkVq=JfeS!4 zaOwFTH&+AHvZyWsuyaWy6~lhWXdH2Q76OMWVGGNUqlXc0;1bK!kf({FD_s+0EK}N!O`)FP%{t0J9{e zDMXdQ8*kr`w?nJFZy&6cjwUfe>>=vHwrB2MS~wa<+<#mR0QmOf)>sk2Tb8rmSS`mk zV;f0j+F7^o;OvvZd%kDXY5A9IRnj;=4mO3>eEsra$A1`jI}`YN#cD}juB$;h@?GQe z-=ij$>COaBlSzVB_cUX$hpXD0zunUdxOuG2Ia!1TFwwO!LjfKoqk z(mmv1kuf909!(+Gctv=6u_Fk;V0|Q2MT!+Vye@`;`fHj4}Ccu{EF9 zi2+)HLf~;ePM5F#eqK$Nlr}jCKpb8f&8|y{uc5aD6=Nfc$$t-v1ONkq1SnQw2{;Tx z^3j3;@WCig5>*w8zH|v$3Fy@lF+a;w41h|sfwnl+Ir-)|Npr2 zH0{7HMH-t(tt7;babO1%1N9}zdoT9)mj_P|_Xpit0JL$>Bp&m+rj2Dh6231hO%jg@ zWTg?qfLgVPVSpG0Si6VG%-7!DPPls$`FCsg*skNxre^T;aDRWO8$oM;B0ws`0h$>KE5>ge(=~(G@q* z2$95N>c${Tw}0dH{0s8=2WcFUXQ@Y$XDK;Ok7OFcTB2Kv=w0ZCi}E+&G(?ul4;NKK zQiWbfhd^MvJwfm7a#c8PMx zb+T}|+OT+>1MvOlv!^1a_vn|kqtM6IWk6koXOeyP^?x*uJUUzcLmSIrK8p{w>-hHd zBeFb&CXK_31ioHUwHVvEASE}U=egNhWT`F^SX9lC(kY>h-l1E|;M4otgYEWcv*W|v zl%iBKpdO?I2qWXYGMtJ%HI1m#*ChjKK|#oh$FZQI~`wx#*J z&K;l$C|q1d!AStRB({lB9K{pbtg6Z!uUj*Gy6bR1pG^P0AAe>ey5m$A0l?a>PnJNk z0%O3g>+B?!E)0MV22NjzB#FSJGYUnGM9%@2ecy)!IznQdV&u@hbs%=*nSD3jPcb+! z0C9jbCQB{HpxQ>@KzsGG`q{nECEd1WqOYZ9zfOy-$8UDCq$}Pt!l)JkRZnpS8E) Z;0LNgS8M}AZg2nq002ovPDHLkV1hpdnW_K) delta 564 zcmV-40?YmG0@(zRFn&7_@1h3DA!LeL=bG$Q_Fc65& zSc*L6*lJ=w06+!;8?I>gkHmgJo=8+@(Zihq2;0?@ssSjQY{%`~z^ zzS!&D0#K}De(Vm2!8(S^m^Yy%l>uoI;p{*bM{J6mvemr5UQyMGG>NEcMWqd@8z1rj zmZm|OflZNfzuj|tvj*U9R|0Uq-2?DM4uCQP$97aDtaEg|MTS0QtI6UBfJ39^c{=;M z{Z0@^bX`yA3x6EEWN>?(65M>kY`+4qDe_s#`TDU^=&q+x2Cp-AhP5ejWb>0WiRQ~? zt2s1^velH&vb(NF24Z9&ywTf3Jzl74H4{HHimFyKlk?cI)mZ071~L#F&ypu-Q|;%8 zn-w|hQ+d5K374bm56&;9Up{5!g!jYapCERihSfbK22>p3=xERhuJn6lQa zE+r?RJT2>uMRpOMtaJahuopx)qnK=-+WLGy432-KVM&W!WQ3Cd0000P;4uU`og^9tRI8k81XhOoms5>?;WakOI|8)`R-j~KCg2J zXaNcr=UH$PfG){xViZU5f;QW>HOJ!;r`OO=*HdNs`*|}P(SIGMx<~-lcC0LcWCiAc z!!X!MEL|7?9}Jwn5=jz)NoN#_8i}3*F2`|933PpGLd+R{#<}>?lyq{ulU;yF( zXHJ${&Ox<}#DVteXZ5ptp-Z}5i~s& W=t$wWB8u?<0000lK6F@OF^L_t(Ijb)R|Zrd;rMUNgN9nqHDKn@BmT6EX{|C;WK7KMvC zMq^3VgQ7@vp-6U8Zsx@S?%bIh?6sPl^8h$M0U$-h`<(NhC=A#7U>#CK1c{8NJWHrs zgA_3UN<=uhqrIGwA|}(4esCD;R=;iyt+51qttKU60>Idj!+$=ZY6g~>C)b`ux!HzA>rhaGF};9PW<`OqC`yk zs)v`lo3~)B!`P8jOM=N`?1&jg>ZT{vlEXfsYzB6TVgkxLZ3MfGn4F*flW-sulQk@B gUSxeAI~VWy2V7Q1$C0DB{r~^~07*qoM6N<$f_cmh?*IS* diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_6.png index 21163d1c8a69fd32ce42116312f59c31937cee8e..d9a0eaa0259937a80fdc67dcc0460f542222a7e7 100644 GIT binary patch delta 338 zcmV-Y0j>VN1o{GyF@H2kL_t(IPi>RSuEH=3M2nzTghxwwL;^Ob64LF4J^%k*+Yun;t^}3nd-p&kYKs;qFrIl^^ep-6AC5|9z(p&LQ7w?9 zB5;n*x4<3I5KHYQ`eW2(0jR;AgKlW?7IamQ&B!STG%ynQEBWUXv`F0hbe7_BJ#40Lwr!3jwEN(EtDd07*qoM6N<$f_2TJ_5c6? delta 536 zcmV+z0_Xku0=@*0F@N|;L_t(Ijb)SDa^oNjhCgf|rX-W3o7rw}y6^vHy=W)XNgdll zz+RAe+AcSUgGTxfGP~ev$rXTH+wN?~&%0a-eb=q;Nej+)n8Ee+xE&a0!C4D{w;kC< z=F1spExX`YQbx3_@i+^UC}tO2_10nlQRQ(L_?!~=wGHmuS$|Xkc-#eE&m*?vN*M9;D5A_YwTPPK*^OZX<5mNgU2oJgwQI!eT5ozs|xm3BQh8fNyW(EaX}n2i|s!vtSIcvAmx@0aol^6B|dB%LF;6rb07M zlkK#REB+8X*I792Bd2}jIt!wiMGJk{k!x)b+&W`C5#X&-s}7y;NE|E%~Q2G2Mx z&Dzt2TuQUDw;eHT(3@FWNByex&sA$9{rxgE2yyVFl&KYFtw_o&nz6R0R#=kW+^1{u zl5&&r4nb7e28XFFmXsN%g>7&=?gE!75eH8NE?;KDL~m=Z^}i7|)>Bou%X}Z}ujgC} a{{RsMMiI`a`V|lW0000i>UUWu^>SOb;9O z&Fn0=$q(B&oGF*#L^<*eC)dSwIw+5M+(I$#lc&JWIXB-c2l}jz7@E4NCZ!^9A|X{f z)dFiHM|rs10p>izFM3D93T(uOFu`*#$r0b!RQ3V)s@@LBTqenbj%_@FP# z(i(-z137@9n{1Ip&7h+}s$7vo%K?Jxy0(Jv`lMK02v7s`L?CuC0&YJVL4F|s2W%h? zQsqHKf-GA;HRw3dUJ+EGo!tsh0&O<}8tgld-OPfo`Jsz!JhX0&8UaOW0v)TfBgDEf z)bJ(RHHu-q2|~_$B$f2;FX*Y>!r0KTsd?h$$^3_I3rdo1ee&x=NpB5~zOeV6=l{31 bHaPeJ-x(&ge!NYJ00000NkvXXu0mjf)KHhl delta 499 zcmV6Z7=%%?^mgR%7g)%y&##i zyGRHFvUQHnv73{0(++?!P6?iW-^>i}{r=z7kl=BX_(-DE0Eoe%lG!d_NC?bH zs7{Dls}ul_;L7 zN=^d6^#=P|8i(84_W1@tYlehC2fPH2gg|RXQzIN-D5Y{p!t3+G>+=G@`Iz@uWT;`< z@l9=SR-PhKKYvIm0`UI5vew46G}b!y9YG9k6!VN=Ee#P*DeMLAH2$120HxGjjdg1n zee@s(H=5!A0w13%z|Q?=VxA(<=>=5#P+^#7$aX&FoqtM^YiXR1ne#DoEsd&5Rl}zl zqvJh}db4d+WvwIO{d=I8PR~34LlUkxG*&K{*|2g9o@|`r!z?#M>-K>DYxU9ek4qU8 z@+7oo&|%X~Yc?DhJani{AMU#)*QP_pJB7Q6Tpw|5##$;l38y)6DUCb{9k~3M4R?^x pjsD*VyAbJGxyyVX>z{Ws<1d9xFUiSMDg*!k002ovPDHLkV1j{u?Rx+K diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_0.png index 1ee0e07213f6202b73cef4854497c4d4ae6c7e6a..3385e6e263f39a227f389f5add4beb1041b8aec9 100644 GIT binary patch delta 488 zcmVS$^ zKob*CBcAYp#>6i?sp#)qJKGGQ9Hy^t-<#Rl-PTx(uE@-ENNmfJEptOwqfv>3=XFh| zEip|~F%_EBbKU_$!3i-yP9?YH<@rh4H%+lq2{}D>|>!UKWPOhBj8ky`Cs1>owUQCG5U zB|U+IT*j9Hz(ta))vA`oIPTrHn!48#a_(U^os^R!M}w@Nf*?}>;5`7zjpfL^3NRyZ zu$T2YqA=gv&3`Lh1LI@v6sCf@xw~!+EL*!?#=rirVn1uED-a25H|~{y2S#{S^)ir* zI-N>MN4&kcuCapKJP-+OA_PEA#JzD6sFlqkM)xX!uZ{;;*#~xe*fREv_Z}Yv127ic zCjS2P<>%{L570nZrs%NkVS$?4)VbMdG0a#@-rrtbqG9c`i7(D6mwdMA5bwo&#%rQ& zrF^qx?J7|51dx>zf;+lUfu)7820&=JwepY?fG7n}9+PMjH)3Lhf&oDpP@4>l4SrRC eajv6r^zR>R1S*%(EE4ws0000RfhEN@X0! z#`SzW&m|U<$Ye9vwgW)3amMV-EC8vJN=FA zw)%aFiz=x^900>Ga9tN!o?vZlowc=fe$)-7r}CtwXn!EC)sC5(&J)RGa}*cmIR1Ks z+!-)_+|Tll_*)wgM$pJERN0i6^ZC$zb-FaS63BMLHfM5(SmdJI_kEY&;s!NXy&Lwl00000NkvXXu0mjfV!2m~ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_1.png index 6b5dd2d4fb61fec303e431cf4d1d5c3a23e1948f..2f068dacc1dd91059c3da5dbac59a3610afe93a8 100644 GIT binary patch delta 480 zcmV<60U!R<1%?EWFnf(M9+4?HROzwJ~{ny?&dXQyYXy1IMUI!+~NHxef0IFz+Bbd*X_JQn3uDTi#^ zX6%GRd@gr@@OF?akV}PAdVibI^T;Dr%G33wOE2RQwJ%yU7=H|O?2K_g95TM=b80pl zEMh?sL6D7rx#()L5P+`RS&?VcDK%ov#IAF4J3Pzw_ zE&DP6xG3aaug7Ic9QVea$9pcJst+rwKv!LtgHpc;f-C}n+yju@O2(rsAQ^%BdBx{Q zgysF&d*C&=6@SoE*xBaI)1$Yt>=aGLzr~VKt0;B_qQEKUObK{kgf~5tLCC1n?X-Br zr`Z#ZHFfhq6mSzE0CGNO#wkFp(k#K|o(1sL$pKdBgLHe{GWHUm&t3@wuoAk7%f*5g zKfio{2Eww4uG?N0=OaP)Hfbt{>H!+hY3%?}FfLbURSpBMi#AV%#qksQg WXbX2Ul?tE$0000C&|FlOK#Qk!_c;|&rVV*$Mczx zB!cl6fVxo0oZABcN@WFA2xjKm>~{B3lcsghv`$*MR8~;r+@qb~CtIzlw0~xsboX{C1Y^$oC$!rgin7f5 z#u@{AKomzfp3m9o5&k_sK%tOFdcVA!EI#jG^^P#j#q`kkT%JA^XXxm)4 zBNU}drc^HReQS$GqXocVU{jRuegugWTNMKP;)0F!H5}JLn=|h^abTZwlO%KugS?ze zvu|#GW?&B<-F`J1vM~QLZKgs#hqN$nCezOvL@9BMZJ!}TJvHQWIifgD$A9_>6{ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_2.png index a02e413e49c517b7eb48a5e8af1c49502ac01310..3172e46601f862da4ae882271ee872e953c72b66 100644 GIT binary patch delta 508 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 delta 604 zcmV-i0;Bzn1c3#RFnwY+9X~bM|No?Iu?rOF1wpZ0 zE0%R3DN=oqqleDR00YkO@DNiyG|e*SjB}2XGo=*DvLLDor8PNc08)w=Z2%~x05Ip7 z%6q?fXL&pxnPa5ud#te-t(ihVD#bL70C->Dv*+#YjcFWFMt^I3y@O>zX^oTuV+`}0 zaLxgsn+N8cQBqRxb}QAA5kjEe5!cBU@6Vi$=dD&Z4PAF7#l&I1XAFVQpFfey0)Q~q z0x*Th>9{t#d#!F7E|&}K<=0jVAyC&lyss&xASi`#9H{O$#u)Ac1HZ*K^}Ipp`}`DRIscrWLunwmhBAXs!9@-@oa*o;hcx5V*dz z#5r>9x>cYMD1f0Kh$#Z_bXt-7{>HvJ;O%a6aC$nEQh(xh8<}(F)^&)oEGVUDb`4tV z)kD*8|D_H4zh6H$ky1*$)yQ{(dbdL>4Zx4@-AoDQ(z)Mn6nUA)us`+36Xjz}q~9v=^jvkqg{Maem1jKMm`_1a>MBgBaJ zo^c$R##IsLJ)){;+ZL5#!di1Ub*l^Gul5=8`i=i4cOyd$(w9 qSV|$yX>$Qk3BgjzmjA4mW#KnolR4h)cFo-Y0000zIaW+{9R^Eit zG@;cZBBeZ z^W69;W@C*FT>;osCChu$^m0C*scBwmU)S_?I?(7;Cw}0I*tIy*H3jmOmOTY&sloBNPbUadBKT}l}ROA`ko(!{UUGSv(CISF+ z_kHz`GC+nl(WM6rfUR3Z5gXwkeLxSO3vFbEE>p-*h8X|@6h&b=ywD8b3ww^$34AajGtFH|%z;h~T}aiqKl4wub6Dv@wVX0HtKCu>iEzHcbkqh!DKv za6BM6GcOCyI;=6oln5aZ^X`d)Acr`t>hr-E1i98~`yTPREhc zam3%Xei%5P&s@%L4=trc=y!M@Xsw~Bl^9pL`-?fJ$A!y0bDO6JO-u>ZLA?iSti|L~ zu+E~jrXL1+27iA3c)_{N|1Uc^C#-c?>(E+JL|B#^N@~UXfYKU(^Z86E1@9ampFi>O z`4gAv!hYD}tj5`GUyLi(Sd7sc?;R;_$n$k#JdGG@`S$$_%e){}h$(TsPUMog&NIMP z1%P!~$t43Yo;Kv=HnSfN1lK<@IE^1DIdi+M6cKJ^Mt{}T&|0(WcNlB89EO2=l^)pt zz5V+hq}Bvy(MoLu{ceZR27sSGUWjq!`S~*?=LhzmV_73HC5%!E5#e%q<8(YQ-Z7t^ zp7`hG?+5m~jgi;aSBhk`)^vx%Q}fPa?bawFf^`n(9M|iFbAJ0gA+WA1DMp<4sIFt0 zCQQi%=SLjIT4Iby6}p^Rmm4`}prcknM9677+-jvNMb~w7-n(Xuh1STwwd}o4(AxX_ chhAIbe>Jc+!l$_F82|tP07*qoM6N<$f^r5QvH$=8 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_6.png index a13bfcdd9c6b639cb920dfdc96e8d9951b38ae41..30295955ee728f5a1092757850ac798cb6665651 100644 GIT binary patch delta 458 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 YzX1r^@-P5IqW}N^07*qoM6N<$g2feH5C8xG delta 798 zcmV+(1L6FO2EqoAF@O9?L_t(IjU~^^ZW~nqfZ>16IdjY0;!6^{fzm`cMWrkdp&+qf z$G%U%g2!WlK!|;jx+zE?M4^$XlBP`^JMq|Kk3DDZEcyoDXMFeVH*FY%v~5e>mRQQ6 zs5DhoA*IALP3pR#scWP#X`6zQ4oc$B(dOgnw;X{P%K9XV0T)8>Ar# zx+7G%V*ltNuf|UijiP8ZwtT?%KmLjmnDoOt?07p|ycx4UjA#JIQ~;FOYp^V4=YQi_ z9aiZAU1XH9#4$a@Mz5H~S6p7bBjrVj>o{cF4AGjrID5e+O-b{Zf(>C5vfn?%c5Gh1 zy+HZC4@OJm^?zBUQ}#QD09b*CkdpWB+(YL%rc(HJmu0eIzPje44?n>)O+=cexQ@d# ze#7YF$IO!nhE(j7iN=VF+a7Fu9D$w*?PAKPA4MGe9euFGsX1z>pm6|F4Mxkl(L!&D}ZzBpwv zc}u^)$IbEzQ(4r;mUuN~K3}j-SB&nTkn5cB^Pi~7isd3f?1nw^CS@5X9G~1p2!pz= zF_mIEn{s<|0|1S|zt8`{cYAdF1KPGB3H-XdhKiPZLoP-JgXaiW*Q_!I<(AN?&vrW7=VkC`*)oSBh^2Rfj5oC_U9e^Uy{X7J%6(dLkr`wxQ*zp4;j^u z)X6-u>H;dp5vqkPG@AxawKbHp!B%_-FO(igin|B(${v2#W6+XI&{Ip$#3^d4d?=}M z`i?MuzU03=B~@ zc|0$4-mvbg$_JG7b(GTYS3p1#n?TI#S!N`RX342s=$I zN|_Bdk0g**N~BY-ZSy-Z(A8B;D!nZRxlM$FL%0ym$74Qbqo>VEH`N1S;tr}tn7c#( zjmEW*w0~$a7!_Th#0z5siNiV8OvX_~8Y+6{XThxbC&sMkkWYQj+8|9UHVz`)KQ4FJ zqzsL4A%vs-am1s(7Fd9jh&~leCFbBB?Ia0SZi^a!jZYC52T=tAysaH_!p|#nAB=nu zl~SnHwJo?t9-F(MtD^6Mc2c00vtoD><_?^Rc~Cfxy%K{K#OGb*ewxU(#_-@>OvyGjYG$Gj4*LVhP7ALzeWQ4a`3t~8s>6pDpfmsg002ov JPDHLkV1j2STr~gy delta 785 zcmV+s1Md9%1+@l{F@Nt#L_t(IjU~~`ZroG=fZ^Zg`1p8yn@ciIXlWp!Dp?>>KrC3X z?gOykIavS_Vhd6iP$3X%T85-ao6KZlkH_}-epv9m!e@Q^&DSOf0*o;XrbF49wyWv7 z4k;zJvKe~A(Dz7TV+Mmijae@*a2yBQ_eVT?_8D4+IJU#T7k>-Jdm{#8kd`2roFLmR z`$wl-EuJF=Nn>iXe8P7>{EBU1GYbzGjYeF(Td)_07(gobtplDKBO2Q~$e|CtYHE(a;VEeuY zmLc+HY>E~8<9|Z{lNa7?9>G`o2fhbp^f4P+PoN{6v~;Xqt+qY1wrt z7+5ZE@zj{JPrt(VJ*Iw)6cSHIh$xJx`i%K}PT%*$?|;Q)+Z;deIX*tY(GG11oAQp= zum3;_LECqPlgBt(A%u{)GQx2*p`KzJ4`ErzL9@J0X?877o}Q81CurBD+SPPT%Xa+_ zZC_z$Sw=nN$V#&7HW&=9invQ|5w^k6nybZM#0N3acublm*p{NMO0=U9Q52!2&x=2w z|Noq2gnvPZ<4Uv$*^3UDPA9nTi1lg(Kz#HiMz+*Vji{;}wzPTr`5DXQEwkAk>&*?e zt>~>CX}%&!Qu1QU@kb{#baU zV6ZrUd5-VS7<+S!83=;_QFj$u1T>=~X0|IwK;0Fk& zC9e}^;UQ*_*p?CGMajrQXw9g$TblL;r4)AC zReb;RFSJcVS?+lMgA=l3MNt$?qd8TZn(WYiKpr;E;B z2{m$$7#KkTV1IOWZGCV9a1z9fqPthNv(q>}o+YSNETwb5;^boR#as zAk1d)#}*)FGEYg9@c1SUn5TAfaz%{}Q#-==*{VpT znMJ#~EyZIA?&%u|WV`9@$~QBx%t@qW4wwNAQMqK{l4R7X&x8%n182JJ9#9eY(DllG zI|-oQzke3l!XQCiSfEL}^tN$)_);`;;W#6M@VDHF*`Qw)R%|?}(WxOQ86zSUW!=B7 z_M}Knx_8_y9PK|AMn2ev6qo5U)3gzQo)~2bL78>C_8cE8i{iu?81SxlC;`8FN76da zEuquil8$hU9v}C2!7^z=QWhs~MN44Jj?71poj507*qoM6N<$ Ef+|;5;s5{u delta 732 zcmV<20wewR1%U>TF@L*BL_t(IjRnC;Yh+abfYI*`@7_05)k{?pV~4b;Af_D_;z|&7 zA^rpx{#0=(t_49GMLKDNc1)^L_3F)c@*MHy7ayfOFCZl%0i`q{ctQwBDN$OHLL#P! z5{i@(wyHTE9?)8&b89eGAca8*MbkD|t4WzcAjs?r8E5k4nt!(W50L~hcGRmCvvX)r z*sSFH@4n^D!yQ6E0+iMO2n1SdRJ2Gb=!TZbb^P$-FKA_vlOGwUj{C=d$V`TF0c#A? zI3bhb_V$Kx=owstW29P?tWVC7TJf~sqHS&gSmZUwVaIxT27oRLq?BBoKVxzZts+IX zqU}2N-42@-Xn)lrr*T4Q#jbha>bat? zN=WZ!h>GY0|K9z~u{q-0gma!T93jDW_eh}^Tz~i(MOjc6rwAdixpxIZ;G@Tw8l5Sm6n_#W44E-hrbee6DFiAScJ~c# z^t}7xn!~=qSj#ldc;}hNh7cXP8wQL~Ow-Kdk0cUSFL-LU2$jf;;mzG&oSvPsST1Oq z1}!uxL^7?BRZ$>i#>+o{CC`?0ZA(>EWJY3S#d>i@y;@?eWxv}2uzB_=Nk*La$l1+E zA$jrfHGkXfBlXD%`{M&jXGAg5^g9mCk-qP^dgnQAp1HgEi5L@o-y_R>LBP>AEtk(P zkU|h*L`%if(~iS_4**GU^Xit;)+~z+q(q+QNFN-U3>O@~zx<7^AAm$Z^nCFCC#>rW zHp{mt&5Eil5t*l-59FqVBoW_y{dqE(2I28BVpVib@E(~7q!0|_NS@~$+aqOBU{p>& z3<#BoUZQ=RAtt0BGE77y$CD- O0000)tM?A)81-LvQHBW0Ou@Z1bMCj-~nKyE)dZR-VGdmY|> z8vD*>a(CozZ^HL&SbJ;wmh$AMU)VyaXyT=B!OgCtkjo%1#(%S1a^-ywhleHc*+Hpb zJoy{Qdl>>`P$_4zxDPPso?zHJ!9Z*@_@ovO>X^izF^k%m$8AL2I=Y>A3hw7kq%7+> ziusHL)({Wt=v`GYjvDCwu1atN?PghkKOpMY6lgwf;r6Blzqk$4cqR;l1_6jpN1n7< z)Y7xpIYuZM`+s3oSq#HEf*(hy9Ashbt|kmh{*KV9V!3?4b$E>V;>NMTHbK~*&e=dUptHB=I_vMvN6o8`YyfyjhOT`P?gTSf__ zJQSS-q5kPj6N|^oq%J=b5VB)^#)Bp*l^k;JmejyaD}RIg$vJLEZT+b-B;)wHi9uKs zX?+A2N1C0CM%`0wCzFeWRcXf-ro)z2nk?e}nHG-{qQOTEq}|Wk`pqPMZu@Bt$Uugu z+3+zH8J*ybvf(^1)5GjSiue_?aWiSB04x@FDq9(3r3(i#Y18o;t}frJX3}Ivg791K z!fd$+lz$bClWOd&AXV@TttfT>x&5j|>dSo+ok~YuDWe3ero|NY}4Nq3sk=0~J%4J)EHetz>iQGfOQ>OSN!ITX?TVz)H2a+w|}IRu%I~G@bgbU^5OYC zB2WQi3;=>)tU-%M6{dM2riovE{R5*8jX4t6iH|S;VVxzVjCYP0BZBhy_`ovHEU70E zX*UhKvkTNH$Nqrz-UF}+9m9NNx7`C^nt-Zsd2z*>62>T@bd1x)X*%F+!03p^7*S(5 z^e^0e{+50^fPX2Zy09!O#wpiV*LWBBbbMmX3vJu5riD^Lb6TM&HNl5>zcchBDMeCB z#4sB~0~K&)!?8agredArW2=F2a>Vb@)<+g{SRj<#tKo0-?1;2Nlc{P6Zob=HC;a;aG3DLJE7 z5D}JT!H2*&4m2U)OkiFXL@Ol=HkSkia!$mU*e_pfN$Wy9MVhvwR456kN{W>vGlfD; cmAoeY2hkZ}4_Pw{Z~y=R07*qoM6N<$g4pd#h5!Hn diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_4.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_4.png index 2866b671e6deb70e2e93fb096e72bd372dd28d9a..a35f14704959c2e7b8767319ec97d587dc216ba7 100644 GIT binary patch delta 650 zcmV;50(Jeh1+N8=F@I@EL_t&-83n;XawA0$K+&IBS>0{fqY>6<0wTt&Sg~LY7bm#D zEI0sM00_o*1Q-XYN#?jE=;ZxBMz5&4Qg{(QwiFq^QXtbezKaWn!*q5y>7K$UHs zNt$V`(mfFAhzQoBQ|pb^gr9!=o>DfZY2;Q4V;*^a{=)J2h^k`4fQj+>*Wc*9Qnn3C zDFI+>R zjby^{@yL(|-hVDHRNu(iXuS{t>fXT>9R7Lzon={Rz0z7^^92IV=l>XN;_1_OOyfXK zBO*f5gjzB@8pAl??(E;cW4#rIY2?F)6PAs>!BVcgy!?fz5aA@dM^sP|LB&u_O!*!q zqX;RC%iB!bI$wYL#5^zLoT*zS-09mwgrl`}A{yO0rGL&eFXVK`Wxi0_f@b00*S~qc z-!ttd)D%%A+)-6DTSC-0pWn!~9$(}bCjW#VCa&+h&X%f|J50bsa05E8gM+T9UR z_J=)}^O^gH2d>K-DH$#sOS!PjE2R`pA5XN}SmsweptXitGJ;00jpONnh~N>ZD%b0U z`FaI_fPXK~FN}GIr2!&H$*_n(F`D1_`Ipa(;{*Z%OyiDPD>-Lc>jVu1x_5>=0$>F6 z)=8=i!$?xYdq+*Etx&d&5NBN%#$m+LK(8Iwf{G#^Plr%dJe=O0X`1M*(p$%J#=Vm? k(RxEg0SJNsqC5Ws{KHn#R!*J-00000NkvXXt^-0~f_?orfB*mh delta 656 zcmV;B0&o4V1+@i`F@JAKL_t(IjWv@?jw3}BMbCQ?k(p(?U8dY_fz-u_5d+4}#t|Fn z0SkZ)0HUi(0%JQrkrDA81B(S*>E5ezo5a-L4}_wN-13>~!;-fi{(guX*nI2@iRtr6VmEHUSWX`0w>cBly2T0?`9*Uagg9~kE= zsL_07&6N;^4u*7?@z=OX)8?m#_Q{!hzjmTh+9Mj6%kY- zs(~SGQ4)#}JaRpc)V1;Tx6h2@L`sRW7Tk=sPPiLdYJbDM(yWooNVQA~4_wD9xlU*j z{(1Y0$NipRGoVosRoo0!MNX_#hI6!~yExT<1qv}O#$K&ypT q8!;u!8bJfKRrG(sa2)Vv{0IEQR?>(+fyn>>00{s|MNUMnLSTa1q%1Q4 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_5.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_5.png index 743e87ce576872b23633f96701e8997f9f264e39..5a5afd5d2e16b7f0b74c07b282e79759b9ef22cf 100644 GIT binary patch delta 620 zcmV-y0+aoj1(F4jF@H=+L_t&-83n=1ZW~7sK+#)|o*_j_rf4g#O*R3t_5Xi_fvl4c zh#^yOWRf$}-PM(IOjj=|yaz*;M1 zo_KyfV{Sx)wcfeBeMMBr9GLA96;wnJ3>9Pc2NXvUG@aY~ooKflO2l`SkHa{`7JJg4P<- zG=qQu^JTQB^+xeRk01#E#t23T|9*YLNfE);p~>d@9s!qm+WF(`q1^ zs3>xNeoR$m@^l^mIMU0IfeWCamWcSlsHt#W$)oq4^24m=vIcFcsshXXlf z-mYi*XryHLXnzo(5d(%oz(22lv&_pqXYaIF0JvN(WSjW;$6qNWldOP%ilL@P;N+5t zG1xusSZXCth2!yrCBqvm^~U-2E22Wgz-)`Cpdx}`s2EdvKuIWqM&kN*!<+N`%TLVn zz24qBF#>N35d-b+faBrRe#1v4>BM!uQhh;_@bBvj`+xnOX)~cFhzdlYs%SC;F)o+y zq_kySSEgwqnUG}SVR~e{-H?)TyIujv(-R@V7z6cj2V(!Y=X$xYeR$xud`Ha)8gsoe z&kMCyPNx&SJInk^1h_kzED<=PcMhi~M1=8f?{>Q|-)?sx176N&O4?wS-y<0E>Enm^ z;rReKt!y<)nLt2*scdPzkyEC-6ZjqO;S3kPe0?PmFnoXnB8EG}7>I!{H(G6^lBw%T z&Kc80tBz=(qR8p^7^=#M!5D*5CWd$1os=?TIHpGTj=n!w5Cr!_{{bJ5Osqx@CinmV N002ovPDHLkV1iY*Du611mOgbF@GCLL_t&-83n84*55&+o3~?odz^lBg=G3Q0&%1popHFmJ3iF&WLx`1s)o`z#PN2JnPe_dV$JEjVg5Dccak*ZY>!kI@?f#6LQ76nbc=_);2&xjZ3o>C62uE_v z8ipf;${DW*5y|^Meq)Y-o0FMTLasqo(N-i7WCfK$uyE^)aUd(qjK|9lu9qu)>qtTZ zRv{DC+(6Fb^?_OAoF~0^%!R3Q=}+wYhBf0D2LNrmQ-3Nd3yUm}xZR#O&y#)MIp!NC zqX@=27-O>5;`#oL%w!xtse*{0xjPW#D)xQj?|=R!B57{SIlzqWovI}38*UB~>kQ1C zMis)z3LcMN^uB>0BDh}etT<`ji3~&nkh$>I0B96cB&d*_OsGuc@HXFAbJ4cNoRi)f zW{oui88n!L-ap^UOk@?AN$(q#i-^QqqcSlwA_9{DD4>AK8ziLU?v002ov JPDHLkV1nM&1nB?( delta 576 zcmV-G0>Ay?1m*;gF@GRQL_t(IjXjgijulr7gg@KoboZTm86Y6BV1e@fZ-ta7i$uVL zJ9GYQv*<~@^1`ZeRoU|R=8|Rx2}vR%WG0zsF9MkWAV30Yg|!AMN-Aix>4pfXdmt*zH90Qt7_)&UnT{_Pf6OoRY5ji12GXp{)p|>B5K1g>w z9M1v3b8DDYK7YLbgqcySf`E#mrbgn_S|F3-axm7U)WY@lh^dkj#_Bx%`wav#1Jwgj zK}A3?L=4q}VhDny(VrXc!P}3&F?z>d&CP&Voy?>x55S3ZG8|`NTIszZny4!Gr|(>j z3w5ji9~Udn4T>pAjct;G4Iy(qyt6V{rmM}5+V<`W4hMq zaXU030?;B-^mfdfs;!#6O9)xrsxE7tGE*TlRksk%*Qu&hEq|iq80MTZ!`j=-43IhP zTK@U-2^xXN&M!c%tHiO)gr^%%l+}k+KZ&S>}rub?st*tb^WR?Ifm{< zlifun&H4Ja*3wm~OZNijbr~^ye*85u&71@gAv06k<{Wf8ZqwS^7{mSXCL;7^)$;rN zA?Pj8N~4Xeaf8n+Qt|ni5QM?cg!g>t!sgCyz6M)Evpf{y*;e8%sH)f ziU_S-`*f{k*YqJZ>(apqI0mqy)HEy3jXl8WlDwozGEp^gmEf63Y$S~`Oh7c+-k4a^5z1?tkWFj-Ef{IB|^vD8&szzmy zbYzX`j-&ZU(c0GI{pj1>9mSyEqAd&m7)>?AV|raO_rzVBoe$8o0$GLpXjL6QOE(tCM4-b5zdj5!ZDU9U>+_ZMwR zBM8ilP8GtaN}kUry$=vXCfoKwgwt9lGZ6_u=E4N%02KvVov%D&GI-B7F@rXOIVZg} z%o;x9^hoITx!2+?GK<~^l}=`zjY~|n6o`K{2dFIm0HIqpTBY9I;s5{u07*qoM6N<$ Ef{?B0?f?J) diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank.png deleted file mode 100644 index c72b150d7c1e38cadbecc95bd88620daad4b7238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1IggaDrqS0F7V zq3Nn&lV)kyA7(v2NcQG}w0DPR{r+S&^JzfVJ_GY9dES}&LEb7xHkS7GB?bvi(RmM( zXaA2s`{eZPKi95Zo3d(KOI>?rR#s$KP?=NL8Y82d;mOylclA&A>dH58zfj)@v_qjJ z$S;`TKYlQ2*4i?lT7FL##}J9B$pWs-Jj&4w44PX-8BgY{PXJ0Wc)I$ztaD0e0suV4 BV_g6M diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank_left.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank_left.png new file mode 100644 index 0000000000000000000000000000000000000000..aa10c88679863abcf820a8684afc808028498d44 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|GCW-zLo9le z1HuA+_;aQ?h+nvP;XwCCDF+W@GiQl{Ofy3hmxDWa5*6Hx?VJsG9Ih=`zqa?f01xv8 z(_~|Yn*wv#4wx)X{w0}^nZmdKI;Vst0K@1t>;M1& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank_right.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank_right.png new file mode 100644 index 0000000000000000000000000000000000000000..4839b1a4913b5b7c17b5c3154ca4e68f3a0adbe7 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|ay(reLo9le z1HuA+_;aQ?h+nvP;XwCCDF+W@GiQl{Ofy3hmxDWa5*6Hx?VJsG9Ih`}zqa?X01xwq zn_NZ=(-kdv8#0}ae=$CA=?Y6<;w;CUCbkD$E;+Lbr5f@$^v-Iq1Oq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_down.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_down.png index 277814f6af7c3a459dcffd73c8bf8e2f32c0fcc4..f6f6a2df6650d707443e34430f20419011fa82e2 100644 GIT binary patch delta 145 zcmeBVTEsX(vYw5BfkC+T`!pcMSRCZ;#IWw1%u66A#?!?yB%<~01xGFh0g;wO_dqkT zbq#Cp{I^Rlp7r~a+03T_S^Eskr{sBO>IZqN7};3b+m{$5G)3n< zOrHHe{_K;}xBpzbc5TY4Z7p@}nORwpVL@e1U2BYtZiXjcuin)^-K#6#!2LpfBhU_o zk|4iehX44%q*-grfNHfpT^vI!dXoi2lUbP0l+XkK)fR7Q diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_left.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_left.png index 5d8a6afc5abc029ef2af37fa1980663ddc9a0b99..fbcbfb0a82f2e26b7f2cb8ed57b0f7e37c5206a0 100644 GIT binary patch delta 157 zcmbQvw2pCtWIY=L1A}nw_h~?iu{g-xiDBJ2nU_FLhNp{TNW|gffUtlc{+wwGZZK3^ z-~MkUCG~&r9-Dv7Hlp7r~a+03T_S^Eskr{sBO>IZqN7};3b+m{$5G)3n< zOrHHe{_K;}xBpzbc5TY4Z7p@}nORwpVL@e1U2BYtZiXjcuin)^-K#6#!2LpfBhU_o zk|4iehX44%q*-grfNCv0T^vI!dXoiQnR${j8X6}~ohT^DpUTK{KCxncLB)cZCoQJ1 tt`L;VNZZ7h%J`~>kOQKp4Ga=YWP7HuD=@o#K9mt%Im1QyC>xJNMIH-7F>^(lp7r~a+03T_S^Eskr{sBO>IZqN7};3b+m{$5G)3n< zOrHHe{_K;}xBpzbc5TY4Z7p@}nORwpVL@e1U2BYtZiXjcuin)^-K#6#!2LpfBhU_o zk|4iehX44%q*-grfNCu~T^vI!dXoiQnR${j8X6}~oGK{EpUTK{KCxo{j1LZ`r5fA; s$~F-fePmBDg?P$mEaOXMYzopr0MGq&yZ`_I diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_up.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_up.png index 3e524e978ff39a95648fa6b51f7128c0ddc16013..b260bcea645ccf232d28c5ba115b927588827cbd 100644 GIT binary patch delta 148 zcmeBTTFN*}a~x_51zesjlagn16ILE5@`;pK`X$?Dk^w=}}$X=koRMwu@bxrDs(ymf=``<>zJx z?!ZH=5(ytxGo~M5VCJzzopr002Wa AasU7T literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA*!3-o-7PBt_QjEnx?oJHr&dIz4auNc3LR^8g zl!T_MhE1BKVSkwQ{2lp7r~a+03T_S^Eskr{sBO>IZqN7};3b+m{$5G)3n< zOrHHe{_K;}xBpzbc5TY4Z7p@}nORwpVL@e1U2BYtZiXjcuin)^-K#6#!2LpfBhU_o zk|4iehX44%q*-grfNFI-T^vI!dXoi2lU)3C5mdKI;Vst0Cz-j6#xJL diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_0.png index 691bba56bc3f8a72800642e4aac8ea3210b9c0f7..9c57ad10ed8ce851e1fac60eb3a1d1b15a73d219 100644 GIT binary patch delta 109 zcmV-z0FwXB0h$4jG-gprL_t(I%VS^|1*2fl0~U3~|6Hbe|H;w}(kNY&48|aXNYcz1 z=nB^i!|cw6|4A}HC?g7vK?Z=th&F)3$r7$vA~^(1lVkwQ5RhgN#-|woV0ka-F4{Zr P00000NkvXXu0mjf^y@5= delta 161 zcmV;S0ABx^0nGuBG=GFiL_t(IjbmUK1*2fl0~U3~|6Hbe|M9B9CBbE?_g~P~l!1YP zf#KJu&;S42yw8YD9acfkK-d35igGAoZ!Vr=___ByhI*VX`2OuX!ay!g1|~ictm>Gs z3I6~11t?LcQ P00000NkvXXu0mjff;&sL diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_1.png index fa534f0784b00f34f43a24db3ddc318783af162c..43d05adb802e8285b6a63814f52799b76c2f1f0e 100644 GIT binary patch delta 120 zcmV-;0EhqD0i^+uG;v%>L_t(IjbmUK1*3r0fJI&LKbNWAf3h@#G)fmGgE7b;k~DJ$ zy23TXFuSuM@rHmDi)Kdu7s`l&W00XFxd2%+$OR-Bz@Q)n*DR470;WM?L~CYJmB)&) a83F*=X*~D6dw3E60000(DlENq8y6Yn~Ucde(pVwp&qLX{(XAG@awx6!{7f1*E8{n zV09@IRzW@y6wRDmoLDvEG~oOBt8g~k?_UhxzkNp$Lk5^(peG>ppNW+ftKxsZe={&V cc!r_}0Nwm8ntB0;y#N3J07*qoM6N<$f|Q<9v;Y7A diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_2.png index f465e1bea0fd8f6c7d2b941f7869cb57e62f17bd..f4d410271e7e3d226fec973a8575998a1970ab1c 100644 GIT binary patch delta 131 zcmV-}0DS*}0GGS&M}mS&Jf>7ryX1{p+>X3juY zxMmn;cQz#65CK0IxJHTO5HKdm0FYwQ%;^6@8BuTyaurG5K-LU$3F)DzAO+S8az2Pn ll199kkY*-TdAu0i5CC_hO#I1rak>Bi002ovPDHLkV1ff2HM9T# delta 213 zcmV;`04o2m0f7RLG=I2BL_t(IjqQ=K3c^4TL?^+E4M$kln@J;{#Zg0o}Tuv<0%+XY* z@THGpxnb+F006kJw*UZ7RX8tJtreQoFtEN2r;Bl80>Xe?A*}Zwr3}ayjIK5Bn^LK= P00000NkvXXu0mjfcRF4m diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_3.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_3.png index 2929686c6dcef462b511aa29eab0c7086db85215..cf497bf94e7f3bf03c1d573eaacbb87c75682542 100644 GIT binary patch delta 157 zcmV;O0Al~70?7f8G=G3eL_t(I%VS^|1+)b$>WcrlO!fYgr5U7Ax+ocpK?aeenKRJ! zKM2DN5b$#W^GPxQrWuCWoehaM0AwRfqeOBD7?WfGNU>;U^nam@C^#m`3m|~38RQbu zqd`FmtQq8d5Sw%ZpoWm98Ce66W>S?0V`MSh2BK+zv9XCE8x{fp-}PKk1YYa200000 LNkvXXu0mjf?xH?c delta 248 zcmV_ON3Aqg+FC<&>|=X1Q{l!z@0mnE&T!h(Pmi? z!Tf{Pt!h)N3N%8}^tK3})jY+`?B=ZQJNLeG&v`u9W4D+^p}0vbqccMdH;Lu=A_1T( z-sS85!O+c_I?~Bfk)@~3htU~MmTH}71prRMm8uWUPic#n>2VR}O~0(k^PwHX0_Ddm zR_W1*fMx$!Jz8i5v=KgU?~F!z7mn*tu5YG4BEZ}A1^~ORc)GkAjWLYC7Xp9uAN;k| y4L?2`1iqM-1wdQZic|e9fqxgey2Ecy2?E~_BuJwp8G`fx0000UIwR diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_4.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_4.png index bdc99ba74e64e476a938ef3afe18c1ce9790f25e..f8a66773ab0e30f5d251e2388619665a6bea6d74 100644 GIT binary patch delta 181 zcmV;m080PV0^k9VGk*Y=Nkl1m#N-=7Inq{AR2^;)+pfT@}D!%6|70R zC>e}F27$yta(Fev6oF_Eh8ch?hSv~~Bup_(GYlgej@Jb+g)og0$su5j>2WxrFv`UyAn+g4GoO zX7>*Zy$!NA9!c&g)YF8ugCPKu>pT3t0ihP&E^li)E&C839e+wS%f`Clmv?sn$UQ}G zJQ8O>sOMULd(+IF!Isf;uU>k|K2)L|q^DEoa-%_Zabp}s_DMF&DExrJ56C@5sD&ts z+yQnIE%O#}I|e{?VqVX$YBikS*grWIfS@e!x?P@6&zxR2(nLrT`OUKM34cMoR(0Fs wiy}>=<@*49l_RC$jNS|j7HH2!a^BQ zaCyNhGk*aiNklI2en-gCB_Q@G97u`7=zv3 zfgO#NF=n$gyTHyZnU2VG1VHSBkh9~!+m+%dNj(8z-dMk1H+O!H(mOb~ybyqBl~HXr zdAqtU<(5Y$6+1d<`DVB8;4iVU75?=6uIQvv(HelC)ymfj9N!=y=YlZbSIe9J0(8V} U$_kd}!~g&Q07*qoM6N<$g6=b!B>(^b diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_6.png index b2fb6f91c56c1f149950cf63d17dfdc5c6be013a..cb34f052912c76796b98812dd07c19db5a74b8a5 100644 GIT binary patch delta 210 zcmV;@04@K41N{MzGk*ZINkl~!3=?E28qGsacbrabcGuL!VC&hU<~8Kn+a delta 343 zcmV-d0jU1{0f7UMGk*a%NklI*#76KHEELo>MlqY2&1NiQ$Jt!ObpFlEobzAKfq{PwHwv{Ih59#6 zX=0zd2{-n;=AI1( z1ewMTDHzxZUNXY32qOego^Sd>2$Ja)lJhG^2w}`rG9no!D9=ZEJ^(?cu{kpnm~nM+ zl}fb&z_9jx_E66*%^uFQILG?ofd=qXMY&$*<@j_VcQIN`O{=;5Ph19$NwV?y>doHieZ|ii<036faLIM=5Vt755h1*&^5#4v1%6Za{)^V+nIwg%n+Dnm^erc zNG(K$l>~94rxWOPf&Olc%#xMXT0m7o0(O?ZA%^*WS23QDXM8V|+BYm-Z10(@6 z0E9uBkTJ*wAT@BvD`4yO1rZ&^WHu!{3p~_Q>v|| z%+n}&=7Y-%HjX;vg=7Xy&4I2FX9O=Y4|{!eQeIKc&MfMEAgsw#K5y;>fI2_bETdVOn11HWsSc7@IX{z0^ZV8HLhWKS z>XJsi;8!jn&eDk~sc0GiQ4qjOPZZ^5$SI;ApeXkX63K!v5ERA900000NkvXXu0mjf D*I=mH diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/cursed_earth_side.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/cursed_earth_side.png index ad017bb783d4bf06e3d226975ce357a133c0eacd..38d01ebe230e4fc9cf233d74cf0154f18fd2542d 100644 GIT binary patch delta 435 zcmV;k0Zjg<1>pmbIDY|?NklFaqcavmZE{u764|F6L`UE;kSyNMYCU zBmu(qECSXf{FbBy@SE}FLLD(z6@^U`d=&@}<*;SFg&>sJOdb2kT1$M*g3h!{qPRek2$H z5CP?irtCXUQ-8*SK89h)AF|M3rWKPV7C)pvbiPXO9qVn?C>F z?u@~O`UBjVn7Cu@4{+_yy_#q=#wK85NF=-zOr%trLWfp6eM~z=$vEf3YZ?=8@@3B4 z?>^4C_tWNQT-VH(;nb?gn7_C{{9$fqxjf+WIlK`U13y*X?y;3bx~Tg+>m1P5~>qn=m|Pd8>@M^c`r^<3nzH z^a{Q&y;VVHTOMJx_&{OW^}#oIwtf{CPCUi?^fW@9K_oMIbw{i{zBlQnObbRwEBdd}$=CzVXGxA8a9R9x!7v z3pE(+{uv3Tv$FjKNBvDG+K%eJ@2z5aV+VmFO~{w4%Fn}Onoj_`Z0!8_OI_%b870v~ z7BMC8Ul;v!hzTa6e-rCvvAIu@7|cr^;=2>0iY8@K#p z6cZWpCYUTz)E1Z^L5=$rh3Vrk8O(W*jclWynJyF=RNs|D3V9ETJ~7#tY=(_~138UU URLSb^8UO$Q07*qoM6N<$f`Q*HdH?_b diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/cursed_earth_top.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/cursed_earth_top.png index dd5e42918742a55233cf6f60d2ea467ab501d68f..636beec5e1f4952870337bd60211e0ae833ee630 100644 GIT binary patch delta 697 zcmV;q0!IC;2rIZgDt8vXd)Hqq4JpJYLze>ghRD zq&9}MwdWW9zQV~O&3I{;(TFnD6r42UraNqLxjPxNS9h)YJe+Tt{^g_iE3!q=S`OH#VAchbmUUCa1!7b{-Zoo0<{w1v z8mb6NH!ZC+RUefno5&Xtfg-`zR(sCld@afq!(8RFm&Sh_%>-X15DjJ9Y!MXzL;9OX zyI2B~JDD)BLyzKY$WwpdAFq$!hkTbANtr>uG@ly6%N z$yRLvVm1RE(k_Y_#qBkSPVjYquZp@$7e!Wzqn4bZdv5yCTqdALx<~*c+p-i+?Nv-y z;u{Fy)Ny~m(w#(TFc#lpuyh zSDO@M^bft?@s@Dh7*s(QVaw4G9hF!l;iy3d1_UvJxZMb`w^0uj*orb)$5m^nChkM*sjvN_p00000NkvXXu0mjfI{HzW delta 765 zcmVT*H#0^IWRLf|3)Au=PctTd?;cj0x(m+xzxn}!FCPCiTCkm!%y^+&Zkb zuUEq;A)apx7IwB?>=YZwMf7|f1lelupjT4Vzy5m}#-Z!G>Tbiqc)xTD0N~T`x6F}JU{E}nk z@nR5Cn`~K@5(y*-etqwI7uyRfbs0sQvCk4sw< zIO(u@U|8Bze;)#QX?*CZUq&&T;-y-#gA>8Dmkea0B%&z_FpzCk8@7w{*<7h`FQYcn vQp-SQVRIWoTE`&OsBUCyGrj-j!>j)RBK?My|f00000NkvXXu0mjf2c&bM diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_0.png index 2def15583a153f2f84e44cfd6aa6fde48825fb02..a3cf5592a34b8f9de9afb4ee1eac7cb2208d730e 100644 GIT binary patch delta 303 zcmV+~0nq;G1IYrABYyx1a7bBm000XT000XT0n*)m`~Uy|`$5ld%oLPz*#p z01}FzK#GJSAvz{u6-G$K5G=q33_`&aRJ6247wJV8lL87W|DS#L{rxY|Y`a`;+FUg2 zZ2MDomvbKOw>-Wcd3`^J&{~*ss!{D~w@+~cvNnLi6e23L27mWD@q&%M0%|AqWNN7o z5}Znbci=4xhb(SL9gu{+N+RlOzlyk_7E$A5AEXbEd(*Y>phXpsMASnVL~6wie_DiNL>CU`FE=e26~Xxgql0lOZx)cUOHnt*e2?XY}X84+y!D$h#W{ zBUOKsn6q*0Wbc^0_g*gBYy#&NklIOby>o9GGk15-{dV{4x998$A`-bQJl#Yq4_DFR-FZ~M zK8>muCsFO}*en>nQs*{_Cyx!(#^3AmrY&C9_oT6PAg$d)X@Bk?nFV`X-Ii{7!(v=z zHUK0@tBF<@t!`G?h{^q>C=0?82};R+(hjOk779sq*qE&C2n8%bm9{Kl_U&DlBEvqd z+0qmVFhC3#Qxwd9eoOf6^YcO@$M~g5aHw>C>1Ji2w+_pn>3^ri= zvzh0FZcjq4_kRU0KmC{qlu0l!rNG>m&IwU*+QJ;PpMO+3Cve)t147Sx21|?kz|uKk zSSo@^zE(;44oelgcXOyB8BCX%kDM@3EZA^x_wMC{y=U(m%>7a=+mhTcn3>89hj~Vd zb`ThhATyzmGy5?=C&A|*guAZmxRQYQICDeXJu!&0;YnR&-U5z>jw|$$@yA2~Hb_fm z1KtHeRP*Xs*npA9{9|4I00030|G@6td;kCd21!IgR09CCJmoi%w+!(B0000t-IM+rFeHYdoyp|yt!-Cb=S5* zgG+y~YsF2|(JOWwiie|Ch`Eo42UgrQ9SOl?a%hhaZO81TV}H-HQ!A@uf7bc*>BwVp zAq)g`;qd+A!sfr%_V#-2`1W(!)Mx|P?N23Q?cfk zI#8A;DS<}NCrbwu{TF8*@KvFLbpqJ+0}=DA9Q|a;7Pi3>mH&+>xx(ST00000NkvXX Hu0mjf8004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=?fhTDJ)X=LVr*I00KQpL_t(I%cYY$ zZyQGxg}*y9yR$D+q*gWzCq=3hsq_Ckcd1hZNSxT9Wm}fW6}9BfJB0w#Zqnp*w>kLE z!96m~ZwlXNX6C=t(|>mxfIoi!4J{C2LPQX)Ng+~OL&=a*1O%lug+fUgQHq~``4t6_ zVnmEk)f%6KQh#bt5L1FmFpXjHg_tz9sjyu`jPXLy4?QttVp0s-%!|zroK6z}!DU24 zV*^*~k-y*W*p8NAc#fcEX1sHxQZe4F>8g(4XQUE*a5QZT67c85?T7bVUDrHLo}4o? z^K%5Hgb*Ev{ho*WJN6F~ITzN$mMD(>{T)!SohAE3DSsK~!ZQJY4}tC26N1CG7EB9Ln(fPh!_yaX zfNp4U=X^0(&L@IP9P@X}FvXBVrcf>sa!MGhX!@4y6H;or z&496j(tm;|1J>Y9PpsA>rnj7qr;7ms`}>K-9qHF2NqJ)Qgt%}$-cVVA7+J4gvE(zm zzjjpBHytRg8HP36?V2Zd;PCklr4+WU**|{7RxP18OjGgc{h!!oz!-TZ=;={Kpq%;V z?K`fzYhJ$kk<~EL+YP7bNc5Va+YqA1`HH?XUs`uzF0;rCgJO64870EaI1+F)v7_Mm zxSPwQ=RZos*IxDnwMnvPC`}zm+f9L!!pi?3| TSXKho00000NkvXXu0mjf&4Ndi diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_10.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_10.png index f5c18a0bb8fab5d865c0dd1fbe3961e689f919bb..63be3703d1ac68f1eb07a6bf3ec5e2453a0f0fbe 100644 GIT binary patch delta 500 zcmVt*F2vVN^Bu^4q3K?Ps>*P3a#Epgw`$K$c>_kVlK<#LutBrHTX91h|M zUI4)1a0o!o=d+4ywVK6ZF$*1!M+F@<8jb$f3Wb7lMx&7c#Ncwds4M6s<@0$fm&;Zx z7A+EqSiN4iQmJIUUQhAY>!sXa1O&nX0}@)TmT1$3jucKNlc2%eJ&$!H`1cDvm#14cjtKme#z zD%S7!ZL`_PH=Ry(XC&fm%>l&V^Z5k(B>{CwrU*aA9WCPVxBwUd09G#sbaD+~Kr$@a z?Y2(hgTX)m&*xJN0u5Lr2^gv~S2CGYG6`<}4`8rfuWc=x&1#h)L~#HFqXRySI|ZB= zzc7_bi7gByB0mua#UQ&u6N4dp=e}4hbPtEa0uTcNKR-Vbg>~`s{P#7RP5ICTW33cI q9}tPimxT%spO?2AZ;$=$2jmaPUQgUp>JrcZ0000}N11knVLB!2;OQb$4o*~u(_00004XF*Lt006O%3;baP0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=?n`CAr%67lz#&N00EUrL_t(I%Y~A? zuA?vzg};puqVQCR0ym+8hR*53qvdJR4;^U43hdyg@OX_}JztZiGIbBG84N-4beD5a9b$KyfB4PmV%3x&=(>bi~~ zq3how)E)MSUw>a;c<=GvvuztnDe^o|y1w7<*a-MA7={6BEn4fCEF$s0X&OWX5uvK8 zgk?5O({I9@&u5lpK}1;Bm8z<6&LvF3cv;)FQ8?!u)>@`%Vi*SId5*{^qk4Hp= z)9J+hey3>~0JPS;Uau6uITtAffN>nrS~HF#MNx3O-Qvu~7>qG!t?9asY%fTNs;anN zugTq?w&lJ5_#jw!T~~l;*|IFj^PFwlBD-~6DT)Gsd7jCvwE!&35+8zTLSb-ZV7n~K zFAetY3o+rGLn#%%y>Yzv(G$Q&17l3GYZ0OAx_{a`oPPqg>E6q7+@pQ~0000UKq&^W=TZu7<%AmSb`I=Su76`&z2L)nc@%X1wM9SSxvL|90h#8GmQFV*q>z#3OBQQP5IY zX!zVp0Mxa)UGp&x z42?}|s2Ce<));3h#U)G81F&!a_#;U}g=aMlPgFEKIg|Rc3gWr}z>c$kdJUFm-YFS< zq3+^==F43b%71kocP{k(?y8io+Fqj61#$$OnK< z{k?4jQNv!pIlb4}_78pTUTQR%vvXVRW3Pdw004AQ7Jq^8|B0B2H&rt+3+0-{00#gD zz6#KADbNSm4y26a?Ya>WR~y>~z}ix9Wh4j#8VMjun#3J5Vi>Vr^Ux{=D6{cjE4y~h znrmg(&JS9dj~gaOAA#`syL8-uJvvO;(RJgCxQ~sqi?Pr8FU@+EK5VQx@&Et;5M*US lM>0f3L>xpnFhMgmK{GixGdJyV(iH#z002ovPDHLkV1nKR_i_LL delta 473 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 delta 758 zcmV004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0LK9H0OKt8@&5n- z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=?nx66C~sN#($dt00L4;L_t(I%caxH zOVm*m!13?>-QT>NA!`&SK_PqKgxXev9tM>S7;Q``XzQkRwGCRgY~z2RxfLOTCfW)b z_JSHKD{KtM=kMO%{k?9B0YzGcXLA;Zb2xksN2GenmP3RCAc{H0Co2D)0Ys{&Y{w@m zEX}UqI1T`{w|}p}T0&ze4-B)q{DDAk5{3bx)|@?G;l1|-+tAGcqL`yt50Fx_v-uk* z3c*@>FWsW{ZXN)=^9SKL_)3w<<+%CiE>n|p`y0G`_5$B)KokNH1JZS|z9w-~$aDsy zHLb-CwAw&-m#_`pG?<>L;%~2Ef&k-dOb`$ngHZ~R&3_?;z<9f4GHHCTfv^cs4ky2ue!LdGS zYlGI(2{!BB>FU2op-`Z=(#h2198$KoKOVn#4I6Y|v?dG`HVJ9Tw<3ffGz#gu#Kc6# zVB;8XYk!^jl^>v^eS@z{Z}80yLO9qYW_x25*LAVhk|YV%*I4Nyr9^G7?HM=#W1~aO z#?WAs7=*wIhn?MZgn%dru#Q9SSP|b_CyZjIXR7-Hre~@c;! zH)~qqdmep*!+RU-8AM(ikue0ugTP?j7Dyrz<8M>!JdII`C{(!V42_?kS*&jyG^l_3 zL>$M6bQV91XvrVJkrLb#jbAkYviY{=ZByxg4H~61SMOg(brre&WP(O1&B(($#C@l@ oJaJ{ee)2dY561Tl#9`n0FEesNmUn+x8UO$Q07*qoM6N<$g6wKS-T(jq diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_6.png index cf0d9f8a0fc944540e19e0f6d8d67719f129c319..7881604a9501c1182d6d30b028c9f65f8bd5da0d 100644 GIT binary patch delta 483 zcmV<90UZAQ1^ok%B!3BTNLh0L01FZT01FZU(%pXi00056Nkl+xr1<>;jNIsueAe+sa$0)$>Kn{Yf5ik~u zg&Y(#n@s^U8VzZrTrNvjtJS2L02l#)$z&o&6h%rRdB5K)5ztnvr95Ijjz(~RN~L0( z%|=Be(Y;oyS%0xul&;t7iUa6-D-;Sp0H@>g(tWqvsQ_UYi~tzmzMF&rXCw%HUmyU! zTr|FaKu)Y3-0%0q;I$RI-3q)#-F3zC-{x8{K$uXm&u% zcLo4C!TEenX7@YuWa$i5AAzO9z!wNxjX(zsKMmBOOI*_b6`)PAkJ<0{e*koI2L8&h zN%kUVg3M+!X@E2W4E)331eqi*L*jfsx6x>%4>lf;CEiE?%m!`F_b)sw68vxYr$W0A Z{ROdBVjGPpK|lZi002ovPDHLkV1gQW;b#B< delta 741 zcmV004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=?n+}6$H%#2Y(3w00KctL_t(I%Z-xX zPf}q3h9B|Zf&(5c1tKH{DbBPyfVm)YT|ov4o=RB1zr2 zJ#N0|@&K%Ucz?@SU<`mlu>`>S`X_`-gI;=URu&c)iG+hhBIBep8O$aV#Zn2;c!p?n z8PV8*9PpFQWbhnx7HcoU`q~y9}1J3d)v zH5O~>BNDvM%A5B9wBMPTc^D4epi!^lbh=QKT}DQ(AQ}zm+8g}(S)p04BFld2`xTlr zNN2O?^?&VzgCPWqwU>p(XLRVB%+Ag+;O+mj0kerzDveJbJz(xX;Yx_d;{Xf~`~Hjh zcqgP%UjXp?1I$03Z^`^F7SouIM+k?4IGj$FmY(91WkjQa@?M3Z%R{_=^@2XfMeWZ; zqXDr~BA3mQ*-m12xDhV&IWUPvCMKseu5c(w&tAE+$i4tlXD5oPQmIr}S$RpVTITND zJ|$ujYc4RkskjYdN|0S3L^Bm4Lb X``Kg#@QhAF00000NkvXXu0mjfmf}a? diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_7.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_7.png index f42fa9be18f63a35e7e951e6dd36e16562646b66..67f7e3e06f51a4e818538a0e01a891bd895a4269 100644 GIT binary patch delta 463 zcmV;=0Wki(2I&KkB!3BTNLh0L01FZT01FZU(%pXi0004-Nklm&>K+X0w@pU$0lYTrRfX?|ni5qv!MKNHme4=yW>SLmgl+0(BXJIdNbc#4D|@{;Cwh7LV;+A0zh0qBbQK%m`(vP zIFx1SMiULw>3`H4pvReJ|7=V zyCz1SGaf?=JOHfNMFc?H;0|A{m5oRjJh9vD=4%ZTFcM8t|Np)*fZ>kF5C)oK;qg}^kSfSdxO=q2h#Jr-iztQ==30f0_{0!X8%NexUQ5YZy03Bnp_M13Za z(o!BHj`H%v@cfNV0Tgzto%1|-1H1=}Ga6yk=<7T1V9N`|jB@}0002ovPDHLk FV1jU9)+PV| delta 806 zcmV+>1KIrP1HA^2B!2;OQb$4o*~u(_00004XF*Lt006O%3;baP0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=?n-1F)NjPWq+>#00MzYL_t(I%UzPs zPV!6?#(y)@&VUqJAcTaFn7H&NTzauy$$J4Vh$}^!D3%s!DQ%}S@4`=#_j@+yY|hE^ zPdq(6d8HI}T{D?X==+}WcuZZ_bX|wFmeFWLmSsdygfWJysxZdz`ua)`1Od;_&j=xK z&f%OR2m+*(G=EKlQi}O}PL^d@Ygw|C0c9BvZStS z0NS>_&M1m#+ZJmrVHlDm3G#3_a6BFf!w?|^d7jgC9eJK#_pa;c`<^sS5ke4#A=cU- znObXRv)NU9p6CD2zEb_q59b`;-`^xj!f-ew5JE7SOt`tZVY}V(@bGY@{O8Xf9v>fR zn&x__wSQ(lp965YTnLf&6h-lmCyT`br4+`PAMbuMKb=lE z=V;rO;c$pC2Bj3gE&YWMf~IN6^BiLgQfrO(o;Z$CN)g8~bzO70T=3o#h9Se@kg_Z( z%Mz_MQ50SK5tL;~nx@>{-Jz6Xy6F1>K;QSgy}eOY6+z$kIOh;TptYu|DzYp? zDaCX;Wjr2Zt)=Tay!RAEfiZ@`V8CE7AlPg+e13k?wk>Iz^7~LJ#qoH=T1(S3#Bq%G ko*(o1jMkdI@3GeM7moON(8D6FYXATM07*qoM6N<$f<=XF4*&oF diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_8.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_8.png index 15714e71924377c0632c5d8aaa164bb2be09188d..3135557310c1a66cfc416dc629841f9df8405b10 100644 GIT binary patch delta 414 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 KMNUMnLSTZ8Cw8C! diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/drum.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/drum.png index e480a5a97b59f86a1ce2d84afcadd48f6ef5a6e9..6a84f05ed1fdfb988e1788edde28b2eb70660ac6 100644 GIT binary patch delta 60 zcmey)^p$CX1Scai0|SGqZLZQrMO{X9Ax{^_5DwYol!OExUR5ze0|tf%FF0c}1A>y>hDcmaPH13sQxITiYD_%9z`%N*d1vs_ RJ7PeE44$rjF6*2UngC?t6FUF^ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass.png index d1f09f3ed1813d3c5a56d2c2e230797cbe70bc2c..92e8be15916f82a645afc1a95633280f05b4b2c5 100644 GIT binary patch delta 195 zcmV;!06hP8-~o^%e+h6%S#tmY3labT3lag+-G2N4005FnL_t(I%dJz}4S+BRWdC(s zz$yH34u7k*>5+qiiB*%PytzXvrIeG;dc<<(7ZqN9C?uS`Y`b=-`hB<4<>sp~94`oF zhu1ToQc$ILMMoqsB93i^C~=qrD0#a<&54eGguoOu6#RrEJv5;$gZ@+$v-p=nMkPWM x4srT7ep#ep2GgrN`!dP8QN?H7w~%A;2FNC*G`002ovPDHLkV1iTxQk(z) delta 88 zcmV-e0H^=p0d|liQUP;PM?wIu&K&6g001yaL_t(IjboIOlKRg81<#&6V`Lx#AnQTp ukO-utr2aFJt9cZRf69yPL7y6^Jpcdq!9>S=ep=I&AN+d&RI(-&qr_o95Ha@ zAQzg~fMV|s5zQ=U@)}riX-~)O6Q@R4s!j6Ay*M?(QhlP_e@@sMz`X%A(kqqX+F(t( zTdTB{9X8=fo_@4we&b1_w;CGqa2)G$jI= wIcirKW_Y{tN|-iSu?5VTvU1W)jg#jXI-F@J7JL_t(IjqQ`M4Z|=D1W6-Pd=qc*bNs}dgB!?`FomN)ND~Qh z>8se>u^}Bm*&C8JLuP*F$0$dH&jch@k2ruLX-8{Qa_714m6^7!Y#xaSCu!TN_{|-- t17;VTvH>UnC8>UECz7gr{_i`#0F1{jpU5An-T(jq07*qoL diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass_inverted.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass_inverted.png index 7277d0799c761821638ce8e8a08e3054ce8d45dd..d279b3538ef0076dc32e5202f78a431960c626b5 100644 GIT binary patch delta 75 zcmeBUESq5HYT)VO7-G?z9I-v`ZoR~{OP7)q*py! fgU?J$Z%Q(B^l!NPnlEG;0}yz+`njxgN@xNAZaN*h delta 99 zcmXTxW1L_Z>*49*7-G?z9J4*|ZatgEij^x9QxurCY}s<)tHHYH?eFY2N^O)p;?n1q za$v>MrLGehMRq4#X$WMN0D>74jM-K;SXDM&dc(uuWG{85qGr`n1|aZs^>bP0l+XkK DInF3a diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/floating_block.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/floating_block.png index 209caf8976997e3d648f22a2f28ce9ffd68a4d73..2181c83ff9d2a7ecd3a45f9ac93de42863968442 100644 GIT binary patch delta 700 zcmV;t0z>_Q0^kLZFnk*hm9p+{PzrKV~U7@uUhq;qPbuW#>Z+}xb`ksSHbuE?E6fVqJ z{4ww0-P=jz^FbtH9!$iBX!RjxxN&!SPWFXIQK_l_&Jv~?0>ulJZNik;AZ3@2D~cVZXfJ+53~v_Mt} z|BJAzf5}`k*sIZ)`%qcsDQu@38E}6CS44*WItAvvLS|8Jg*oP?&H~eNaJl-ZxJSly zY2E4ci!kpQiV~1B=fs@K@;D3RkWPEi-fpGL0+%!Al_!zXW<{La;SlxEEzI54u)oAD zl(TdL3x8OAnwRt~7f!ew{f*n$27TmCBM)ngld*2RDEM*kF~|ZLoE*+zVLp!BluiYM zXl?Ci64*hY-)P>*NwWTOVF>3tVeG#jW`QJ5t2z1~vLcenSU*ub+9OHFY2G*DV=}gE zLc^X4xjN70rTi!ze0000ST6ht2uJ5W$rl$2CNX=ssGiMx!EhFL5o zKx{yXT&2hqP(+CwVjKB7`|kfcf9q#W+igWDsbozG=E+c$5)ms_y+-xg%U!Mt0FmnK zqLMWtM7qwQ6hOEEfEfqOI7Cx;8~7YUDS`=H=U9sDc7JR!hf*_x{CJ^y9dz_@;wU)7 zQS�*n554w?WDbT698G$cH3t$QnA|Qy^X6~l8fib@OoNyXWBf+ TROFZ)00000NkvXXu0mjf|G;8w diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/ender_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/ender_generator.png index e99765f153d54ad15e597bd7f7bd38e9c38b6a60..ca73f3b651cf821016ec5e9f3a2f1dafa78bb61a 100644 GIT binary patch delta 86 zcmdnY*uXf!(BI0_#W6%&JF!HKY&zh4UtK!+L!oqN>)^5ej6=ggOK;Y@>=d#Wzp$PyaTOGpy delta 138 zcmV;50CoR>0kZ*+F@J4IL_t(2kz{{RV|~x?_B$LQYsR7hsu~$!=%Kx*DbtYkTaZDR6GdK_6D^?7ZGh^5 sA7ZoN1DY?$<6yjlMTI$A~fB%Fh0}yz+`njxgN@xNA D#MdEZ delta 217 zcmV;~04D!{0rdfpB!8+&L_t(|0nCrF4Z=VW1Xq>_2oW(5x)?+Y6hIZOf&yp(Q4Apk zAVLBHxLtwuy1y6lJF%sa{d>0~f3se-?=dv6=XSoL2CG5>esq@;hQJQ#1w7PH6dY#{ zq?F{LfJNM&NKqD8GJzIZ_RE%O=JHJ7=6{b96dYa)U^&l!-BL2m+$6k$7Of!B_pQv8 zc?<;{u#mzmq9}-#qpTNn+dYQxlS#1IwWxuT4*&oF|Nl5Sg8Bde00v1!K~w_(r%H%1 TxmQrV00000NkvXXu0mjfeot9R diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/ender_generator_plusplus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/ender_generator_plusplus.png index 34f32466f0e4e661c2751954605c275c59666d2c..e6891b724b9affdcd3b52642aeff00648fb19b5b 100644 GIT binary patch delta 97 zcmeywSU*7}+Rf9&F~p)bdBWt-|Nfk548s5aPi_t5S&<*>BD8ET0EGYA0i^+uF?3%^L_t(2kzMLKWgtS< zgHHoQHL)5XN;$ariP8W!np4+ATkt00000NkvXXu0mjfB0f%k diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/food_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/food_generator_plus.png index 4c02bc70e29c8fa8045e875bb22ea1d5c0cd4229..f29a1507263f3750756aef71a3a33ab6a599c9ae 100644 GIT binary patch delta 140 zcmV;70CWGF0;mCyB!6#7L_t(Ijbo6LRsT;3W&jcYFEEgWQ4FYWT|^Ql*?_o}lK(xU zRmd}7p@uRTBO5}r0Wi&E835DB!NpIy0mwF!>;i0>i8cUP1I+0}8vs&3jO{oL04V?| u#D>44D8ZS8 z7R18|%AjPKpgoFE1xh{u00960f>nF<00006NklC|2?Bs z$TMJ}hB6o<8$z@JFwJBc0Mp39#ZS5c$TpMg0&JRzHUL=z%;`iM08&7V?KlkpDF7+N thLJVn^#VvCHcW9!BxnFdnTZk%0KmOF#m$dO%K!iX07*qoLfjxm zdjoeb-~q%<$f~QZ+E++On!nN3z(?Br?|lT4sKNOC4+)B;^%ZR>swf5gNcTCKzz(qj z{=~SA);M2wLF6aFFwZbgJLoT-f#j=zWkgm~V9G1~s8!SoOm>;ggX(b;5e05pY&nO4 zz%9qFZXBL~Ph|$&-K(Fn7w*R{X45T47EizcgA$xo%d~g`1{jp!jD;$mfI|i)IFqn~ zY_miYjI0zWH9;FF`2YX_|Nm)!1R($b00v1!K~w_(JkFvqT0u!{00000NkvXXu0mjf DWeIB{ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator.png index de5c92e22c4fa0079d84c79f5cd00b9282cee7f2..982552c519a2a39cc923d4d76cecc3a09da1ba70 100644 GIT binary patch delta 20 ccmcb^^pkOdA!Fu5qg<91`4I~yvoVGN08z#VHvj+t delta 142 zcmey#c!z0%A>)LJM!EHSPZVeg>HEt$SLjwOwVQG%e&w|(7enO3Lft)XJBA3C<*clX82DUICXx0EKskVr;B5V#MI;jH)ftQG8zoq8&+tnnz-8z E0HnxOZU6uP diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator_plus.png index b1ba0f85dcc4d1a846f2451c1c1daa61cc8a3c87..ee81c0bac49a04e78e325244066a801d98a420b2 100644 GIT binary patch delta 125 zcmeBRn#DLlr7Y3Y#WBR9H+jP3(Et9NX$*q@^$jMp2J)=Pk984JJJrx?W|rVHjnUxj z4xWSA47<{D+5}P$%wvf+P&>(xB7Kq9!K`HgNH)fC3S)LzW#h*K5)Ne&0jg3by-taw bs(BeOd}?y}Zx>YH!~g`Iu6{1-oD!M3z1uS5?nh20Bl0UFsLXg`f0xp7nS!HK-8dJcf@9rl+wrCYt zB|SF<@5e{R=aGY~OFAcl=lT%#6u}Sl&d(A73ohnh7ZU{4W-ndvA}3gEOX&lW8UO(Q m{{m|Rh5!Hn21!IgR09BbdyX-*lhIQE0000u|4(iWmsCfs-e})EWu|Qqrur7 zJO{HGcBSRC38WsF#}aR#c9J1Q`XaA`S<3>DY>eX+#_Y1n#*YUi9LgjDRHaUOof1h^ b^DgTe~DWM4fq_r<0 delta 236 zcmVeG^6}*C1 zu@H*|YrTNzzCgl|WES=Z9(IG1sPVNSTGi(`mIZ}No6q5u6k(-;K5uI)Z?Xp6bS-p@J`lT#UdjP0BYq#D*q zPFG~%Ex7fcsmIfZ;ig*&^9A06*&x|)0h0$$rtVL$F<_e@%NEk<_Uk#TmjOdWN2E8C SG*c4;5O})!xvX0nh=EF@K6lL_t(IjboIPRsYXG0bpTZU|>khs3uGE{28qbOqAHpz`%gt zfE6s-3@cc)$uj_1BR)g08h}j$E<^BoLE223LE20jpAt+1@HrQo98MP?+l`P0m&DUkPZ=uB5Nx7d5b@_KiXq6Fk>&8Z03e$}qFq2LV5BrV0{|Mb VAuHg3E+PN`002ovPDHLkV1jI^M2r9c diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/high_temperature_furnace_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/high_temperature_furnace_generator_plus.png index 4c9d522a4e1b984b995ea772e144bb457393b9d8..2d70f8e4329609b036a923ec6b37f74bdf3b4a4c 100644 GIT binary patch delta 125 zcmV-@0D}LB0-6DkBz9p*L_t(Ijbo6LRsT;3W&jcYFEEgWQ4FYWT|^Ql$^iAwvtUe? z0Wi(D48dyvx@K&K5M_YV{uf|Ok^#szq8os02tfm2nsK>;C<9Jj`3uGaV*uGkgE?WJadLOQ00000NkvXXu0mjf;Q%jP delta 236 zcmVoPej$Q5!kQ@{eMeI-D)NdCZj2|;d`2)GFPWo4b&X-ol^u4O4ewip#y zB|SFhb*Ez_#q;n!T{oY|u5&S^!{45c$;9?GTF+tEA&N2lra)Rx#mN_8l0RRC1 m|MuRlR{#J221!IgR09BXc8)Rjo&C4~0000>kmkGEC`emKjX<|$Pm+o~fK(-haSS39- z1>LKYQ{Q{Yx}YRoQg|)Ahlmw@m)aZyeE7wRp=n~7)I4n5JPlUI? l^@Q6Z&c0uX8NVAd?3diMSL$Z~0#8>zmvv4FO#p+s8^Hho delta 112 zcmV-$0FVEDn*oq9YE?-@K~yM_W0aFsXCMWzFfcGAW>gcYdj5=7CX$SY+JFX%K9#`P zeSAGQHNe$v*vN|z^e;iviO>L7cQ3XcA-K2^%8JFX0a+a$!BIa94nHuGn!Ew<_&80T S@+4IN0000zopr0J@VR A<^TWy delta 240 zcmVsS~!cY)I7w?v!9#f21f+<40n_4`1RK#LDDAZOA_u1CQOmyE9B?%SHA1hgr1W>w1qVw9@Dd)HJta{DL&1H_(IZ-uocju}=mR zoGZpB_DWli|)LU4qr7iYdtC q3jhHB|C`fi8vp delta 240 zcmVr%;!cYuEt@MmQT39M#2Sh~^(Xa>$z%)=Gij2Sl zkc)KDbCh2YB0bsP_MI+Oz21EOp^Eoj?YI9YZBm*59Mpo~+YSBQ4 zhDYi>SJm631Rkm?D$#6?WI%zU67Fb}3@A`k!riRF>Da{X{v6SpOm{XJ64doJmLQWa q00030{|^&x+5i9m21!IgR09Bt*7Px)j8HHD0000o delta 152 zcmV;J0B8S=0l@)~F@JkWL_t(IjboIPRsYXG0bpTZU|>khs3uGE{28qbOqAHpz`!ur z4N%%Xi$Q7oEboVU z41j6IWe8CQ>`CwiW0DO(){M&#q77KH%Zq#iK$^)ifGUAV|Aa(QW}*ZG09-s(7|!Vh Q%>V!Z07*qoM6N<$g6Wb%7 delta 221 zcmV<303!d30r>%tB!8|+L_t(|0kn?63Bo`SML+4lv#20KY7wyk4<4-}ScXSi5V00P z1P`7S!J}y2f?tNEj^l;Shl}pZ zTY$`rLLFDY5(Nu0kEp;~_GXo!n9S9Nw=4(-(_ASac>w?b|Nr`rSlIvo00v1!K~w_( X$PtDyBzRjl00000NkvXXu0mjfP@81P diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/low_temperature_furnace_generator_plusplus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/low_temperature_furnace_generator_plusplus.png index 8fc64819c2ba8700f19a36b5a70701ca46245298..45cf7ba87ccf993e17a16b711823d49293a46995 100644 GIT binary patch delta 109 zcmV-z0FwXt0g3^TBxX@bL_t(Ijbo6LRsT;3W&jia|C5DL45)8iL=qk%1}wC(0b{ZZ zfN92M2vG*?N$>?@k_|xCjLQ(B4Op|wi+lq>n#nSNDuGD%tB!8|+L_t(|0kn=W3c^4TML)TLwU|N#y^2>5Y(0dHXyGAjJ%m@W z5Q~7dB3O#%Ef|J48_7x*9{e5Vzuhb!j9>qdsXRq-R0?HPK|ok-_i6(js03V6=vFX1 z>;z3ei~hhCZLZ6r0v7wDo`4*~74V`hl9_oDS6~-!v!}g&*ZW+_{f4F&nHR&$r}Iw|Nkmai!uNJ00v1!K~w_( XG|GlCX%r~=00000NkvXXu0mjf9|l?` diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/nether_star_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/nether_star_generator.png index a6f456ed70bae61d68bc517384ef25e4ba31d265..07174e4a6af52301070afc50e70b065f4071f0c2 100644 GIT binary patch delta 131 zcmV-}0DS-Q0j&X$F??r9L_t(2kzkK{MpnIO{w^Rw_76e>no_uGID+WGsR2zj77fTw!c>aINywhYG?;L( lVpUB&4J0QG!ikS01OVQ}hzevF{h$B<002ovPDHLkV1jy-Fwp=2 delta 201 zcmV;)05<=v0rCNmF@LN{L_t(2kzU#B!6;AL_t(Ijbo6LRsT;3W&jcYFEEgWQ4FYWU4((JT)Gd&*yIQr z0MfW?`)M%7W(aK!K-P@Q5Ud8k{EV)7(fnOtj2tEy24K^OtQi@D)DmR?HqAHG}Ffbl9Mt;nTZk%0Q8uTZ2&ZpU;qFB00>D%PDHLkV1nAqIkEr% delta 280 zcmV+z0q6d!0kZ;-B!B2hL_t(|0i=yF3c^qjM3Q;83p=enfmqslmYl`bGI#=O z?JUGXER+<2H&F8e`)efttR}l?A-W>mFog=UV@T0!%v+(2)kfCE8L z17X*c0AAmP0$=D~!@Acw6l{{6wL7gG3{~ODbZCGV4}<~)2cQV8c#ym93k80_M8GvO zJJJFsr5J2P3vIOa2$q&!#71nqh^3`R zu+~Nk!A1lnh2Rl1FR-6UNEBk=k)7R{`L(Fkeg8wvlJ9mqTNRS1r3DO&)!Oo$j#q>H z9!&;90YaHh#`d^BQ<(Lpb7_H^zRiUNyvXYwWM=1D|Cs_zKz~3@as0Bw{$kufZ=rw# zK~Mu>*OUNW--QBS=wHLS*EtkywmWMy>nRwD!oyL=052X01qcp65nAyecim?S{D6so zYi4$?^dHRF4L4J?+!n7cYdR7HWJ^%m!|Np_Hp2q+H g00v1!K~w_(rV|~kF`4l0O8@`>07*qoM6N<$g1`iQq5uE@ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/pink_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/pink_generator.png index a9bc86cfff23a38aa42edcda78b69287295523f0..f7bd399e9ef09530e7d9db5ff6070001861c5522 100644 GIT binary patch delta 119 zcmV--0Eqw50igkqF>qT+L_t(2kz*b2t>##&_qx)03{B^ zuLL5v3QQ4%2Dltt1*Ql-4VZ{x4fyq7@dG&;aOuGrtXTD+MGN+r#teSKNdq&=DN9Qv ZAprk!a@^&YJUsva002ovPDHLkV1guuEF}N{ delta 168 zcmV;Z09XH^0nq`FF@K9mL_t(2kz+v4;imc!1|g;__ISXm6apAYP2K=V WA3(}tkX`=(0000Mog3*Z25cIS` rFeTzj6GR(;FI8eSfTGMq2?hX4X?j1C*v`=a0000-A1wiva^AfqhLLe<@9_ZRnb1q0m`8q`D)qVP9K^<quFRbn-OqRd1I1^`VIgUj0R^qT+x002ovPDHLkU;%=805wJc delta 259 zcmV+e0sQ`?0iObpB!ARNL_t(|0i?|_&H+&r#qk>(_?oXZEm2Tei^>Y@KqDF(QCW*h zr&epM06)oldGibjCi&-`d+xbsdQE?D{e@oKztia$-*7*TM**?gY~vH$AQu=g`K-Yenb3ro7*C9%;)_iXZ>TuVb3wD=7{7;8n znU*Ibo6KC0j8ETIfo6YrRbnSo?pp;G0)li2&#v_7rvj#+0~$1suIVfga^Mg&uZvu; zUe2Rtv=|3!-<--G1x+)IZ%}dr00960R)LJMrBDAx)n?9rW}f2d2PzYP(6hTH@#U|)+c7?U0UDs;NZG~$2-dz z7#Ivng8YIR{*wkyou3~I)N3O%X|_;o1{Ry!21#t a28NlvoXXQzs6GR#X7F_Nb6Mw<&;$U%lU+gp diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/potion_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/potion_generator_plus.png index 5a47319bacf9bb6200f71d4a1584972210271c77..4236e29cbeaa29b53678327096c9dcd3100b37c7 100644 GIT binary patch delta 118 zcmV-+0Ez#T0+RudByU(PU75EFkYE{7RPX|NUZ*~T1dT^R760k@hT&Bk?>_-B- zP~B=8&`aDsBSls;IQ x5lj}jq=4iD00960=4H#_00006Nkl~8N&=C$^eSP09RU|eM+P#Gf{#8 XKKnVfv7PV;00000NkvXXu0mjfKPoS% delta 247 zcmV$-T4+80O&$yjMxcyux||FtB`C(~vKnY2$`za@n>Dn>wYINhZWWWWhHq@W6J zmr^ve52%9GwlKTZ^&!B)_NaYSfxqytRt5b2d^DExW@n(Lr*O$40gD8}WqQoQek8C9 z<+HM7=liFiSgc*JOBM;Z?N{@0VG3mQm~r-r1Poau;6smDh$>)-fDb(lCphkx(g!Ou xf;^u|3P`>H00960fB-ST00006NklqT+L_t(2kzH1sJd0uiwqAgZzI!J+|K zHKrbP4RA#ZHI%XHLD7I|Hl`k&8jx*(u+cT(Hy&;Yx&}0-qlr*v1D+tl>1jOnP@I-X ZLI6LB3^YbFk%s^P002ovPDHLkV1l3QEbRaQ delta 156 zcmV;N0Av550mT83F@JwaL_t(2kzKqMw6a7H6VnTZk%08si9mp4Y-jsO4v07*qoM6N<$g7wTWQ~&?~ delta 245 zcmVcbg_Ml<`3dAr} zhyf@lX@GZ;@;Ezor2I%HJ==GmEu~n@%kLN!lD@~~CPS2>QUma)t|#duWS|T{VKqJO z1+smvLjVW)&0)MJ%Q{M%| n!~nrSBqk7gv2o$N}00000NkvXXu0mjf991v% delta 240 zcmVKDNC*sx!sjWDsd0PG;z$YEp(pgA7|I<>9*6Fd;YP!C9HFLMOI q7XSeN|D+T@m;e9(21!IgR09AS7m_i827$r=0000-@@mSje&0_F$^>bP0 Hl+XkKX)LJMg{d+Li+x4&K0^9OYNo{ieGtc%EeGUg$g&lSy|R6X6Id6-}B($ zx`M|$%NZCL3`&Chf*Jmk22P!y9}Cp$Wq($joF2uUp7-Hv4qq(=UHwyx6-q1O#_U9zFmx Oj=|H_&t;ucLK6VghHP2@ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/solar_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/solar_generator_plus.png index 6482e4fe5e0bbe0099ec956a4c8db07e53ee3a4e..03dd263781494d102634090a8a09b47a06cfb4eb 100644 GIT binary patch delta 113 zcmeyz*vB|QB`eg^#WBR9H~B|><3oGZ8H_Ghw(BWzFP7MlHeFmo_)^OnzQYVDt=0Y_ z3ld744R{VLmz=F=!FymSkdj~%xYUz(qQIo#k;4)VDNR2Q5%ttABVknu2Cu2dmKTXg QC@=tlr>mdKI;Vst0B~9-lK=n! delta 226 zcmV<803H910saAyB!9C>L_t(|0nCyy3WG2dh9BOiOQCC*j=eyqp2f3t>IFJ>aTP@H zK$qP-MK?4}4P85K!m0ObqRR8Ph2~uZvgjCSP zTrULZ?aGN-Q#SnU+Bme`OsU0g!=Qp*~?!we~{)&3$2 z5=xv6cn&O=oULfVdtfP$l3)|K)RT9jz@*`k!x9ZCO+OD2_0%pSVO0qR%byolulnsK P#Q+4Ju6{1-oD!ML_t(|0nC!I4TCTcMNjOLCQ{loSt3mqNfV{XB5ATj8d@Y8 z1~Pt@FyF=k0S!nG?7QcWEx9u1+#V|P&+GHGE%>Dt0vMbwKLf^d;K1O-0191m=M%Wz zT2n&Nztr*5aR=I9Ax%YV>Lxp2fr`wPQZET82^zpScai{vwObr4p#Gm1Pmnv4Bjkc6 zmU=NjZ&yjwnz}K7KWT#n3Vl$Ac?{ro0mV6RU~odf`}wdf5Yhtx0RR8=9)8sT000I_ cL_t&o03XJW@m-sMTL1t607*qoM6N<$f-8DmO#lD@ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/tnt_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/tnt_generator.png index 47ee1c0a20af353eca0f3596b393f0bf3ab9feb7..19ee2fd48a0c7639ee9adbdf425efcbf65beece2 100644 GIT binary patch delta 81 zcmbQmSTn)U+sxC&F+^ix@`TBu>YRoQg|)Ahlmwj)JMpGAal{_}x%zqohf@1g-;HdO l=9;`}cYMHpNl4z4gJJz!%?k0>%jyh3;OXk;vd$@?2>`ho9b5na delta 111 zcmV-#0FeKDngNh8X;eu>K~yM_W0aFsXCMWzFfcGAW>gcYdj5=776?meaU((1_hRcA z7#Nt~e7&`s_1132&qmQeBw&HFE(QA%WRqjVs2_*{B>MrX0g_IL0gR+3Zvf-OF{gBy RJjwt7002ovPDHLkV1nFZEg=8^ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/tnt_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/tnt_generator_plus.png index 44204519be1cb6bdfdefd263199d57f8903e663b..684e5c9acfcd99ccf0478f117646df0091b5635d 100644 GIT binary patch delta 83 zcmaFQSU5q&*TU1qF~p)bdBWt-|Nfk541)jl4JNb(@%h;|*AGZ6HCbYSi|%*W`S_K9HN3ZSOm)HF$QGFkRd~EBtaW1 z|0H;xhd>j^=yiJ%7^))RSAaU%~t8>*7O@O0D-5gpUXO@geCxLA0L$f delta 210 zcmV;@04@J;?*Wh`f22u7K~#7Fq|Y%5!cY)J(ZPL~N>CejV&wu{n+vdVCpKDGWh0ss z_<<>YF)?t-dk_AF*$mtL_a8PfedG9!HB3)q76`ZFE-H9~MWCGSkAMsrGGxe&Bxqyh zp9Ig#InV?$dflD`hAK(mJ~WApUbiQKp-K|C7fm9g*X>DQOsJ9s?nRTx=yiJ%7^)SYoPS_ldOrJ&hO^i6_`ez~xWUc*zUkp3)_|mjhq34H{b9G{KE|fmaPdWs b1RDcOeei`ZvsD%Wjb-q3^>bP0l+XkKYKkzl delta 93 zcmV-j0HXhy0eg@nR{?WUM?wIu&K&6g001>fL_t(Ijbr@x@85q0GQpwm3=9mE7_j-; z?f*>VYKDPP14a!PH2?w_4}AUi|MSDUWE%hgo*5I4nz?^800000NkvXXu0mjf-&!Q) diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_1.png index 02ed9847d7910be3245bef39b713978bd227e2cc..dd79eb741c306f59bc0c6cb8fd025b109c4c41a4 100644 GIT binary patch delta 187 zcmV;s07U<<0oMVLB!3BTNLh0L01FZT01FZU(%pXi0001qNkl;;NlK#BnPP?p002ovPDHLkV1jR{MVtTt delta 147 zcmV;E0Brx)0j~j&B!2;OQb$4nuFf3k0001KNklunpsLb#&opm}0U1ePGo%=R!2~G=wsnyk z@JACc0l-t`cRfF;0gUtAKheC#`6~NS>d@s&C)4~fxbG5*RSWCES diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_10.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_10.png index 3aecddf3aaff544b078b9938a8132d1f58b0de0d..46fa5c0cb5c8b48188c3f33be5238ab32eaaeaa4 100644 GIT binary patch delta 163 zcmV;U09^l~0lxu|B!3BTNLh0L01FZT01FZU(%pXi0001SNkl2t%`m zb7X)l;35v=%;{I3(3av~F9byJT%Q2oq2SDPRe7}~ndC{5oS6pTs@iO--famH@fv)DoJx@N86ar~ko*iF`76MJ_lF6OTB5+H0fWE*mZ6^# n8CYJudWFyFf6(|WXnbY>aYZvY$HjVQ00000NkvXXu0mjfdTuoE diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_11.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_11.png index 29fa71923c0b5a49cd901e1f8bd6d3f3f4410d42..feed6175e19303d9d01f315ac8583bf4f8947f97 100644 GIT binary patch delta 185 zcmZo+yvjI1rJl3EBeIx*fm;ZK886+f`@_J%(C+Et7-Dfc`N4w+fBiYr8VqxI4*l!q zUe$23smUn8j7K?};iF?#AWws)QNTx~3}qi)AO1TGC9^*yrhMgz_}j|-fR}kkCkum* zuEv}VyBZ{z6Bv61JC;Z^012rEK{gR-hb)ChC5(|5jXLJpa3(%UIp3gLsdV|qC#Fqu lY&j<<-$>~(=J7blFzeal{TDyoI0tkSgQu&X%Q~loCIGxbM~?si delta 103 zcmcc0*upqLC4sRx$lZxy-8q?;3=9l*o-U3d7QM+P#>Uo19M~$pz7k~y0b$Eo6B)UC zKK}UlxP3{+pWol}B|>8ivJR|ZY(C5&7O}2rY3{Dw3=F4l2x?4rzg7)2iNVv=&t;uc GLK6U)XeSN; diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_12.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_12.png new file mode 100644 index 0000000000000000000000000000000000000000..fced222c599471764abdd67fb82869a7acf14ea9 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkS@1 zi(`nz>9s+Qd<_abumA6V%wE$fe*dB9QVkZt6T2!hwzZ|bJ|^H~(fM`9;~xFnaTD%4 z3JD7s9#?i~TX;Ll`_={an^LB{Ts5;QvmM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_2.png index c1b5a41c1eb07c8d77e8ce1a807fab886f50cc59..20ec4143669cc1fc796acf4869b7a4faaa8b81be 100644 GIT binary patch delta 151 zcmV;I0BHY|0kZ*+B!3BTNLh0L01FZT01FZU(%pXi0001GNkl_>jHuX02PpJ0N8R$44{q|Kmmm>Ef7j40Qdi5PY~W1rak}w002ovPDHLk FV1jN&IfVcK delta 119 zcmV--0Eqvy0h9rdBya(9Qb$4nuFf3k0000^Nkl m5ki3FUwH+Pmx>$4s8Kx=jI^O379GF<0000NklTNA>+s3FM^qX zbk>Tr3``4kKXMEnV(@SmZYE%*ZHoN<7oc5n0rd<3`4i-9atr`@jcfxz z`rrnD8AI0qcwkUs0602G1fb}r*Z^?s4X6R&6pSmUq325UC|nCS06B+Y%Y`5e%cUR; c%egQN0R5v;wK|>}m;e9(07*qoM6N<$g2fF*0RR91 delta 92 zcmV-i0HgoQ0eX-mRsnNTM?wIu&K&6g001;eL_t(Ijbr@(xA{KGZx^prw85kHAdb&7C`@c&_@PzF7 zXKdh*At5dA5T>r6@NvH2v4;;ICR!9FiYgnLd3R_1`Ty%TGZ+Z_Oo%wk0|fr@_Z?QK z9=o}tp`qbOy_(XMhpda)c%+z5cyco_3H=X@QP5rG=(0s|&YV95TYW$}#NXv4{{fnF zC&bBY^X6isnjasUCN=_rpk?v|uDXAJ&M`2Y@iSkc&KP;NU2Pns(Ma&A@8}36It;`HofXn>u&0w-N83(uJf}UUT$}bwVnCi z!L%OlFWy0xtOyPQ#YHwBfygUGO=WNo2GSX$GZ~Q)}J-mw;bK z#s|g`f|h}^>|vZIbv5|Ni~^ z&wvCDd?k&~vh~JY6v59AN#nx-x=V=VGr|1=6@>YbSpH}jjE2E52?GEj#Hf-?B`75T O0000GZx^prw85kHAdb&73C zjg5mh`7!f}SA1V~|4nZxys>4nq=clTWaq}8|L5)a&#u2e0SuZrg;vjO1cHmHf=;@I z=Z>+0H7GgB#u;QCSYX&NXG_6?`)}>Lxc|NHbWy$~P|wY{BT9`82+HP)9BZB)f52BY vr8seiWV7=_JvWfJ+mjwgtrzi?U5pGoXFLsb&S&)iUCZF<>gTe~DWM4fwZl~I diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_8.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_8.png index 3dffcfb62506ca0784245f059d16de754bd1b82a..fbb179f4a91d0795cbe5be8104e29adc7c64fbd9 100644 GIT binary patch delta 246 zcmVQO9C_+>SRRSa~aQXNf9625JY!H5Il}Y@jj_? zpB%-`-ctxEWUN*a#j?5o48(JC9?r{iF5E5lmU^C;Hq^xq@;d6;Yp#tB> g78iMD4PSPK)JJpqB)ZOf0nKLcboFyt=akR{05-@gKL7v# delta 119 zcmV--0Eqvd0h9rdBya(9Qb$4nuFf3k0000^Nkl diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/ineffable_glass.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/ineffable_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..f17ac4cf7e9a3f6f7bcf8dcad27e0eccadbf45c7 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`%BgKl#kFyJ`z?{!I| z-^KaoF2+auSp+0|UF7QIe^jY1sZ^AnzW>vWXCIu`FUr)PFyn^AJmKWtjm!)FC)Mnh zeXeuRsMGi6?aqVJlQoVrhWMy%DGy-$;oJ1vW2&kZrf~-_;bP=!X6a;N;^ty(U})A`cIOmOj=|H_ K&t;ucLK6V-WlgjI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/ineffable_glass_inverted.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/ineffable_glass_inverted.png new file mode 100644 index 0000000000000000000000000000000000000000..92e8be15916f82a645afc1a95633280f05b4b2c5 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px`7= z7sn8b(`$oo^EMc8r2H?9IiUHckgtCAwwDu|n>s@$FWa-zS!?N($>*z%6g?9cjjPj8 znX@NnciDi{!heHVCsjG8&3!B0op)++ U*cT5Dpz9bsUHx3vIVCg!0FaPXQUCw| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png index 0684a2486a203af40b5e8fea37f39afcad4022c3..b551eee17b42ca9eb61a0dd85168232660c5c8a7 100644 GIT binary patch delta 663 zcmV;I0%-lT1EK|x7k}^w1^@s63Ag0q00009a7bBm000XT000XT0n*)m`~Uy~R7pfZ zRA}Dqn@v{4APj&xt_PU?9Ko$~1a;xgmCuE)L1L``Ip{;|(@#W%(fFeWNn;B3up+=s~And@; zQ}-@2DDFT+1hGZT+Qwowo#l1a8aKJP+?FWU|F08{`DviaQm9@Agan) zJSZ{ePI!PiFb)r9ibU}MEph`qK$-jDfj|0;2k;MN_w9HfqRPgD^^15Bp?Di(Jn$7M z6alqyH4kv)wmk65Svkct9aTC??FEoo+CLgXl~41^@s6AM^iV00001b5ch_0Itp)=>Px$Zb?KzR5*==lfO#C zP!xy1OD{%qL0d~eCj&x-E`5_ay9@3v;v49jIQalw931RW>{0^RS{$mT*ftn#Gy4Ac-__Fu}-j%6~{D0EqhI`5xfp`jTbU zL=}LJ*UOv_XM=S8cyou8O5k_f0PJrbq?a9rxVFNz75$GWm%vB@_^o*spB^Pk{|DLI z$UOdh{^BPV=|1X@ktO?==EZ4Y^c+Sbi!qzMAVY6jh~V0a5n;N1c=K`zLT`#VIzQHG z*U4OzEX`Iy`F}tLVfyqs|AS?OnyBV}pGMXJj0;Jm@w@Gu1E%yvxpqBu!~~OZFu`y2 zG7gyXJ8KYH=)*EUhw$_BxxWa(TJy$`-qM1vufD0X2H z1Jg*W5LV5?Vk0feyh&X!k<6%?F^z)>+w~pdU|y~nYaq)hV>z18n_@X-{s6}}x+b9@ R5o`be002ovPDHLkV1mPRzzP5W diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png.mcmeta b/src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png.mcmeta new file mode 100644 index 00000000..97c73a60 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png.mcmeta @@ -0,0 +1,11 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + { "index": 0, "time": 200 }, 1, 2, 3, 4, 5, + 6, 7, 8, 7, + 6, 9, 10, 11, 12, + { "index": 0, "time": 200 }, 13, 14, 13 + ] + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_0.png index a449decfda83ba650f4418e380e7f90a7f528cd7..abe083588b86b59dd326bd914d54375836db6eb6 100644 GIT binary patch delta 48 zcmYd}nP8|b=IP=XV$qxY!(TB$!ZhJZLm+coHzPxA#UH(my}@@FfWXt$&t;ucLK6U# Czz~@L delta 55 zcmaz^o?vJs>*?YcV$qxY=l}oz^=w=W!m6{}c_mB}t~4A>VPMEU#Uiu(VQDY}5O})! KxvXFMGaV$qxYBmVq{`9fz5vJR|ZT+GHJ&dgArR4dQEn)eU`5O})!xvX*?YcV$qxYC;t40`Hf5mTsofxGQ06gm?juVGB8BfGR^%uS8fFZ5O})! KxvX}%WV$qv?BjwM3d(|0*?YcV$qv?C*{w7duG;#PNB1l*?Oc5vJNB|F))0;!pwZUb;el+Anzopr E0L0r71poj5 delta 55 zcmaz`o?vJs>*?YcV$qwNlJMjI{6?k&E}hQ;nca9LOcM+w85qLyndErqZc}Ff0#8>z Jmvv4FO#l&t5oZ7Z diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_12.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_12.png index 2a41569ed799d9f2827685adbfe13aeb845ef543..760f0f2afcd4c0f656e8dea2642a04d63dceb9d4 100644 GIT binary patch delta 51 zcmYd}pJ1pb>FMGaV$qwt!aVJVKWCbRX~LC;K<2h?Mg~d2jRIRlm(F1T0#8>zmvv4F FO#ro@5MBTP delta 55 zcmaz~o?vJs>*?YcV$qwt#ysuEc?ZUXMJ}ILFfL~6kusRU!@wZFg7IRCPO&Wm5O})! KxvX{p95>EgC delta 55 zcmaz`o?vJs>*?YcV$qwNGUMcj`Hf5mTsofxGQ06gm?juVGBE7i!?AnFMGaV$qxY=d#Wz Gp$Py20ur*?YcV$qxY=lp>W^Bb8CxO6@XWOn0~FikL!WMGKMWs;jY{q7D1AnmdKI;Vst E0Ju^SGXMYp delta 55 zcmaz`o?vJs>*?YcV$qwNl92G@yaQvxBA3rA7#FkkNEyuFVPNoeV3co2@$z8+0#8>z Jmvv4FO#lmZ5oQ1Y diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_2.png index 286f1e0f8f156c2de62921479788719b6f3cb1ab..4674632d57de8860bc2580ca5aa70535f536e3b0 100644 GIT binary patch delta 52 zcmYdJm|&}%WV$qxY*?YcV$qxY=lqBN_ROpeokC|9v-L*?YcV$qwNvSR}%WV$qxY*?YcV$qxY=l}eN_ROpeokC|9v-L K=d#Wzp$Py-z!X0K diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_5.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_5.png index 4518c22e3df447ed5594dcd372c787c2ae24b659..a78ec2134820d5833660db8c88ff70faeb2c5ae4 100644 GIT binary patch delta 48 zcmYd}nP8|b=IP=XV$qwN@WWqG#x&tdLm+coHzR}L)_($eORVlQ0D-5gpUXO@geCxt CBM=Y( delta 55 zcmaz^o?vJs>*?YcV$qwN^5gu6`Hf5mTsofxGQ06gm?juVGBAYaG0Cki2wu(r1fH&b JF6*2UngA&f5>o&G diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_6.png index 0e8f746cf4a4df30ce9223b4a5d37ca03426775f..f5e17ec8f1fe47a85feb781b3f111e6cd3161ce7 100644 GIT binary patch delta 52 zcmYdJm|&}%WV$qxY!@l@sy_dn^6^x77dZY|uco-NQ=Go}&{kV1>0}yz+`njxg HN@xNA?NSmd delta 55 zcmYdDo?vJs>*?YcV$qxY$G-SwJsTH;u<9&#UJ28LD-8!z7#I@EnPUvR)UGf9fv2mV J%Q~loCIIsd5iI}! diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_7.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_7.png index 380127849604aa45a7c4d83cf764ccbd7d09681c..b8e362e9b164ea8f97c0816395866eda7f451e87 100644 GIT binary patch delta 51 zcmYd}pJ1pb>FMGaV$qwtV*UF6{+wwNrU_RX0-4*o85#1o*2q_VmG)x*0#8>zmvv4F FO#t9m5y$`l delta 55 zcmaz~o?vJs>*?YcV$qwtX8rpA=N%Xm7P)+0!MK>MN6KIZ4+BG30n?nV8mf5=K;Y@> K=d#Wzp$PyzuM+_P diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_8.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_8.png index eb7ebc6f917df59790ee72bc6690f931927e65fe..f78adfbf5938d4376b628a0da0439935196e9ebe 100644 GIT binary patch delta 52 zcmYdJm|&}%WV$qvyQT*&oy_dn^6^x77dZY|uco-PW_9yEJ|KzG>00K`}KbLh* G2~7ag*?YcV$qvyQ~c~qJsTH;u<9&#UJ28LD-8!z7#RNBGdJ()uaIW|0#8>z Jmvv4FO#u8$5%K^4 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_9.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_9.png index 457e0072ebc1409a6ea502ce7ce73215e1807132..992e9311f26010a8b82599a8bd03bfb9dcd8a9c2 100644 GIT binary patch delta 51 zcmYd}pJ1pb>FMGaV$qwN@ZlgOwJ*?YcV$qwN^5g%1duG;#PNB1l*?Oc5vJNB|F)$>|WtO#CvB;bO2s~Z= KT-G@yGywoC9ulhn diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/magic_wood.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/magic_wood.png index cb821af3695215bf2c65d914bd7fb35086ed80da..ea8a91e10ea54c1ee96f4c31d160f285c36d0c0c 100644 GIT binary patch delta 415 zcmV;Q0bu^=1jPf8Fn_yHBl4dwX(D)m1PSQaY)7h=)bwrrp-Z1e1CK%tTEGw09<>iYtmL| zZt9-k_SiSC?R5eBooGn_f%DDEK!DNVJW5~-Vg3V|j*b5HkthGV z4}l~AL?Es%$RaobAh-65f_ST7>fxOEx*E$2Ake6l#8^rIK++LOj<*ZuFqpLr`tSZQ z0gq0XfIf&s6o2Hi|JVF#-RWJ delta 580 zcmV-K0=xai1L*{iFn<^k_d|IDoNuw8OJV*@uOAm#@Az?bMC$8j`i`~(QQ62`7!DM za5d;No95h&^{&(8z1E-XjxOxSo7)o&N(tAPbgg SwfxWk0000Vq+c z@oz_qEv9kw`SaPni7SN`O3`m(seGRtSG140(g2C~@vIsETq!69vh^}HeE|BpYM{B06;Mg z0s!D3XiT!z0DvMIOU3)-asX(@p-=g0M?h05X8{&DZpNDFgR%QEV(@2~TF3(cq&x>e?zW5!)$;(E++ciH62#@S zBcQRC^zdY;dLopI@me0xC+C@4Gk@Mz0YUCA6rz?ZZ3&+hX`AR_=Q;Na8e zRLuvJs0FO^l43Fn@Hzp?R|B9_Ezq0=l&%Guvw+gIKyy)`bS=Uf+fBo+G-{ar(`t;nj#26=@WGyhNOmK)=U^G5pDB`9M^B?30 z3<-d|70O+YPZ9t!ZGID^MSw{kf!uwd{4g?E0Kx*MYyqRl@LIEk$wUIr*`8!B;5pmP zZCXaMl)41G077gpy_RC+L7fzlj;Zgx0KjSiqX&Q#@mK&I70(eE z1OQK#1s`Df6B8UIQrgmM83X{Nu9g&)hd?U;gOt9WNl6izx>_$kM_s*n0FY^J6!bws oK|w)5K|w)5K|w)5K|zhtf0VhwW<1!)9smFU07*qoM6N<$f|12{DgXcg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier.png new file mode 100644 index 0000000000000000000000000000000000000000..a29ea0067e01aca248f9fd88a73c652bdd4fb15c GIT binary patch literal 2086 zcmbVNZEVzJ9530xjlh^NnGhFBC&G|k+k5F<8*Xgw=I(&oCR?}>4Dek0+}7-_?b`0{ zc9?M*R3PjF7=$38V&sDf5|kKVh%*Bg-#~fMi2`vZ`hl05ih>_NpWbfAFykdQX`iQk ze$Vgse|!F2Ute1@as2f07=}&sc|A+eh?{rbIP}yLiR);{SG~)046~G)_n7#*3!)e{ z&Mq}J8BPAhyr4uZKvaUz5|5||jbZZ_#8n`)LIV%NW=VDvsqRk*ToT0iw6P>@BN=NWW8GCP=Iz{FP*gM`Fu()BqQHj~Edr3oQUo+ZN|l=lJR3*8N(n0(5=Pe9(pLEWyie8* zAPdmvaTCaCizJCWumdL>v_aBtXY3@)+CwDg5;)RobB0_j6df$b4Da_SLc5t-bN^78 zi;93a?x=#G$T|QENX{vuht0m5Y2_`G$XJg%?`8GX%aeVAUu-Qv`R#b4wn|oU<(#e%-Ye-ScO97n(g52sv#^Axi-HG&S?q2? zFtZFrBJ)`qB_0o@oY^01fr#`z$sbbJm5>nw8mw$av3qcJQTMc7k)u!>VZRDAfVvFS zbT<*wln4$~H7p6hbe4+BV&?2-(}Nodey3ROsiTAF{bTfSH8bS=Xfe90>i<`aG6@h` zfZPmGlcosM8_MivL+PjfTN&xK5uI-sj@qd?%{FrMlKmAx8BuGf(SHf-UJM(v&F86X zY!*>kCih+@5CHZ5*h7r(ofRulH2XDcJo+!|dw9+~P-n-0_1y5NJDl*c+`W zZZq2S$v4iV94n8UC|WtCb!))&d3P*!DRr^?$zAK>9eckI`!>DMKdEov^aoqoyNgfD zsr;E??RF71ux{Vd%dd^y)}LST_=UPFxp~aOS_`&GU%%$tD%ZT(Gb(=l;?@;kQMK>W z6{*_m6R=lSKV>;tHX#|@+q3nmdakH<`at5QD`#-ZC=5^VrN?M>}_>p8mT8FF(4oE3r8#v%RY-@?M`>m(#PjqTuWa34Q((y?~!L3i0_x0W5p zo}cm6_LF5R%KNt*a$LH(|5X2h__e;m;}_qY`}uOf~ z)K|ZJYVO((kG*=XEcdNT$&KggUhJIKb!&NYb*S&=DgN62H5*;wj|NJQHO4cpv{i~RWJPuZ=%eT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_copper.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_copper.png new file mode 100644 index 0000000000000000000000000000000000000000..3266d779fa16fe5c019862a708c40283bbecbd4b GIT binary patch literal 2084 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_soul.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_soul.png new file mode 100644 index 0000000000000000000000000000000000000000..6350310d9ee2d92934a1d05733af7cf5631b965f GIT binary patch literal 2079 zcmbVNd2AF_9G(K9QqxKmERjZsDMuyFxmRaoX`x$aElZoSfkia>cINHw(A}BYnc1TS z1d&UQKqH4yB1P*z$f0S1^=L65#KbFdhRPovAcjH+LaK>He6!sy#grpXGV|Wd``-8c zuJ@bQ>*vnS&wC;d!?66CYEJ_iaqE6)BzhXn%{S06N~>OIU>H?m-8rfE%M%zj(k}b_ zrr$e95Y;FJBsBo3R8&J~44YP-(ty|qO*{ZYvf?JLes+k!Wywt}aCjN7Rtdv$b+ZoV zHP7{l&5a^25#`hIX(<5_M4<`rR5YR(Lds2~c?C4LKGOuAhM0|RVumG%`@QverK&@m zr&v;C7#r^5Dc;F5pv?6Q&M};WW^6R$Bw1cyIRUL_E&|EvQc!5{%*u$NH#ZSBO--Qb zWHL!5ZIr5qXqM-Bn&D`UBN2i$niLbHNW~}_VDLag)Md?-RRy;gK|qb0ZUULw??Y6} z(kezKPAFn@3TQM-F_uqhpd@B-T3nB$#U+u35g3JvX&@|{#cE;IRE@BD7wYWt9Ret} zUT;=oNL!-Otb}1!C6F7LfDDN?d`%jp8=#@abrDu2keMZxH=0nXLtv`9PgNrWnW`T! z8Rwi7%i^UAWJOYw#?ym#Ko2mXn?PxEl8lXHIUj2iI4g4`V;2~vAL>;lIoLE5)WHf2 ze+Lv5jRZ_^U$7(!K~;|eyL_Y`hBv12H*WWez*wfNOxQPM6V11Chb3mQ@mBbci5eN83rr1Y9KK z>}4e2%UCkV*n>_da01RLS>>Fr5TRN&Q0|&C2V@?MWo8i>PZxy%M61}{glJ_MN<`+f zJVZPmNIA1V8HR}T9?9=lH`Jh+1Uj4%Lb1DlbYV>E9S8T5hU*yd$HzPSatgY7 z^PlY8RCB5=x_v~!gikJ>`;)(TZu77eGaGChM;`z3#G|?0y(Q1@d#r7Bb#Zm9E8h7Q zSrHuD%CvvKci6l|t3vA4zm~4~Cn*$tw1J@}7k=?g``S%A7TjoFw(97q`CpB@IdQTB zo6_i8U$$4?qOSkoLQ!nksEIdwF8nh3#;%;UrHenz+ud8fvvb{vm%IUAZJ_p*&u_We zcKP(w^2zJEa{%_8ZO^0@xZCfy_jP{SQP6$7FYj<{>YU=f1C1*dGXCcd9DMa~Zg*j# zHoo=D!9)1T%T+JzJ9en(=XbhR@0q`{>FnD0l~(z3>$2{AuISpgFyCl@IJ_(QTI~Ab zpO*BDh;6Lv%-=UYx9jSW>(e^+j~{1yJeJe3Je7Cs_u0$8PB5q6s9)VWZbE7Cr0GAr z_vRVxBvpT_u8(4Jmn`Cbd%H)xw4-ps-e;$5OI`X=E8af*JjPcPY(c|Qz2{f{y}9