From cd6fc93488980cbca5746fc3e5e99dd05794c876 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 5 Jan 2021 02:07:44 +0300 Subject: [PATCH] Aeternium tools parts, multiple Anvil crafts with same input --- psd/tool_items.psd | Bin 43494 -> 49358 bytes .../AnvilScreenHandlerExtended.java | 11 ++ .../mixin/client/AnvilScreenMixin.java | 102 ++++++++++++++++++ .../mixin/common/AnvilScreenHandlerMixin.java | 52 ++++++--- .../ru/betterend/recipe/CraftingRecipes.java | 34 ++++-- .../ru/betterend/recipe/SmithingRecipes.java | 25 +++++ .../java/ru/betterend/registry/EndItems.java | 11 ++ .../betterend/textures/item/aeternium_axe.png | Bin 372 -> 462 bytes .../textures/item/aeternium_axe_head.png | Bin 0 -> 355 bytes .../textures/item/aeternium_hammer.png | Bin 395 -> 530 bytes .../textures/item/aeternium_hammer_head.png | Bin 0 -> 435 bytes .../betterend/textures/item/aeternium_hoe.png | Bin 312 -> 446 bytes .../textures/item/aeternium_hoe_head.png | Bin 0 -> 300 bytes .../textures/item/aeternium_pickaxe.png | Bin 420 -> 557 bytes .../textures/item/aeternium_pickaxe_head.png | Bin 0 -> 423 bytes .../textures/item/aeternium_shovel.png | Bin 282 -> 376 bytes .../textures/item/aeternium_shovel_head.png | Bin 0 -> 262 bytes .../textures/item/aeternium_sword.png | Bin 542 -> 629 bytes .../textures/item/aeternium_sword_blade.png | Bin 0 -> 359 bytes .../textures/item/aeternium_sword_handle.png | Bin 0 -> 439 bytes .../textures/item/leather_stripe.png | Bin 0 -> 332 bytes .../textures/item/leather_wrapped_stick.png | Bin 0 -> 316 bytes .../resources/betterend.mixins.client.json | 5 +- .../resources/betterend.mixins.common.json | 2 +- 24 files changed, 216 insertions(+), 26 deletions(-) create mode 100644 src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java create mode 100644 src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_axe_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_hammer_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_hoe_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_pickaxe_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_shovel_head.png create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_sword_blade.png create mode 100644 src/main/resources/assets/betterend/textures/item/aeternium_sword_handle.png create mode 100644 src/main/resources/assets/betterend/textures/item/leather_stripe.png create mode 100644 src/main/resources/assets/betterend/textures/item/leather_wrapped_stick.png diff --git a/psd/tool_items.psd b/psd/tool_items.psd index 036b30d2943647c3b984872236dc1090b94a6350..e3fa9647a6ad30d3f8073faee0670d285e392b0b 100644 GIT binary patch delta 4834 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 RjI@SOT2IT#;2pmX{To1VMq~g0 delta 1213 zcma))ZD>*~|4H&)ufdEFAq0HscRKKPv zPQS-n;q?36Tb*4#uiL5hcq;s^Zmp}^=YoR#WZwVkL=jV!>0kTCO)V(hB%u*;De9bK zLJOoII*^wS^DTQ;@r%*1>gkVc!XiNtLS$779wAJs2v;i93ofc^gdia`f+|GdK#`ZZdxzcIQ>^bmW7Pcn|*X#gRq*^wPfTv)ERQa+0YW+@*#~F zXvB?DwQf`zmUuf-!*~C{cjEfxi#+CfzPop)?cA->PsYTLHNtTtYJaDY5WA1g`h4J-mOg}-}`pTdn z+L+Zv1-g&YwN`l6;$>_(VQK|p@{x(p?@ zxL~})#Cjg<3=&(`WVI|Jb+8zBUkH>rSB)w>r9QXYqswp zyafC^-w5!-uCw`2KYreTh7L}kWPB1GKeR0O56O6=5u6iA9&AVM8=?AGIuA~r)QT&c z`eZ2(+$Z9{a6!|48JjBinlXNd4aCS`EN1X~Qty}lz!}QkVoWs(CORs;&9b#I8kh92 zw^zp2hPai6i9y098YTt}6Gp>Cqq~U?zpX^JHZ&ikVcRl2d>|VpMh5dzHccFwCXl9y JMzL$%e*;|Xy4e5# diff --git a/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java b/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java new file mode 100644 index 00000000..2c6fbc71 --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java @@ -0,0 +1,11 @@ +package ru.betterend.interfaces; + +import java.util.List; + +import ru.betterend.recipe.builders.AnvilSmithingRecipe; + +public interface AnvilScreenHandlerExtended { + public void be_updateCurrentRecipe(AnvilSmithingRecipe recipe); + public AnvilSmithingRecipe be_getCurrentRecipe(); + public List be_getRecipes(); +} diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java new file mode 100644 index 00000000..6716f669 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -0,0 +1,102 @@ +package ru.betterend.mixin.client; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.google.common.collect.Lists; + +import net.minecraft.client.gui.screen.ingame.AnvilScreen; +import net.minecraft.client.gui.screen.ingame.ForgingScreen; +import net.minecraft.client.gui.widget.AbstractButtonWidget; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.AnvilScreenHandler; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.text.LiteralText; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import ru.betterend.interfaces.AnvilScreenHandlerExtended; +import ru.betterend.recipe.builders.AnvilSmithingRecipe; + +@Mixin(AnvilScreen.class) +public class AnvilScreenMixin extends ForgingScreen { + + @Shadow + private TextFieldWidget nameField; + + private List be_buttons = Lists.newArrayList(); + + public AnvilScreenMixin(AnvilScreenHandler handler, PlayerInventory playerInventory, Text title, + Identifier texture) { + super(handler, playerInventory, title, texture); + } + + @Inject(method = "setup", at = @At("TAIL")) + protected void setup(CallbackInfo info) { + this.be_buttons.clear(); + int x = (this.width - this.backgroundWidth) / 2; + int y = (this.height - this.backgroundHeight) / 2; + this.be_buttons.add(new ButtonWidget(x + 8, y + 45, 15, 20, new LiteralText("<"), (b) -> be_previousRecipe())); + this.be_buttons.add(new ButtonWidget(x + 154, y + 45, 15, 20, new LiteralText(">"), (b) -> be_nextRecipe())); + } + + @Inject(method = "renderForeground", at = @At("TAIL")) + protected void renderForeground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { + AnvilScreenHandlerExtended handler = AnvilScreenHandlerExtended.class.cast(this.handler); + if (handler.be_getRecipes().size() > 1) { + this.be_buttons.forEach(button -> button.render(matrices, mouseX, mouseY, delta)); + } + } + + @Inject(method = "onSlotUpdate", at = @At("HEAD"), cancellable = true) + public void onSlotUpdate(ScreenHandler handler, int slotId, ItemStack stack, CallbackInfo info) { + AnvilScreenHandlerExtended anvilHandler = AnvilScreenHandlerExtended.class.cast(this.handler); + if (anvilHandler.be_getCurrentRecipe() != null) { + this.nameField.setText(""); + this.nameField.setEditable(false); + this.setFocused(null); + info.cancel(); + } + } + + private void be_nextRecipe() { + AnvilScreenHandlerExtended handler = AnvilScreenHandlerExtended.class.cast(this.handler); + List recipes = handler.be_getRecipes(); + AnvilSmithingRecipe current = handler.be_getCurrentRecipe(); + int i = recipes.indexOf(current) + 1; + if (i == recipes.size()) { + i = 0; + } + handler.be_updateCurrentRecipe(recipes.get(i)); + } + + private void be_previousRecipe() { + AnvilScreenHandlerExtended handler = AnvilScreenHandlerExtended.class.cast(this.handler); + List recipes = handler.be_getRecipes(); + AnvilSmithingRecipe current = handler.be_getCurrentRecipe(); + int i = recipes.indexOf(current) - 1; + if (i == 0) { + i = recipes.size() - 1; + } + handler.be_updateCurrentRecipe(recipes.get(i)); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + for (AbstractButtonWidget elem : be_buttons) { + if (elem.mouseClicked(mouseX, mouseY, button)) { + return true; + } + } + return super.mouseClicked(mouseX, mouseY, button); + } +} diff --git a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java index c8a4aa23..9c1f528b 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilScreenHandlerMixin.java @@ -1,5 +1,8 @@ package ru.betterend.mixin.common; +import java.util.Collections; +import java.util.List; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -18,15 +21,14 @@ import net.minecraft.screen.ForgingScreenHandler; import net.minecraft.screen.ScreenHandlerContext; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.tag.BlockTags; -import net.minecraft.world.World; +import ru.betterend.interfaces.AnvilScreenHandlerExtended; import ru.betterend.recipe.builders.AnvilSmithingRecipe; @Mixin(AnvilScreenHandler.class) -public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { +public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler implements AnvilScreenHandlerExtended { - private final World world = this.player.world; - private final RecipeManager recipeManager = this.world.getRecipeManager(); - private AnvilSmithingRecipe currentRecipe; + private List be_recipes = Collections.emptyList(); + private AnvilSmithingRecipe be_currentRecipe; public AnvilScreenHandlerMixin(ScreenHandlerType type, int syncId, PlayerInventory playerInventory, ScreenHandlerContext context) { @@ -38,8 +40,8 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { @Inject(method = "canTakeOutput", at = @At("HEAD"), cancellable = true) protected void canTakeOutput(PlayerEntity player, boolean present, CallbackInfoReturnable info) { - if (currentRecipe != null) { - ItemStack output = this.currentRecipe.craft(input, player); + if (be_currentRecipe != null) { + ItemStack output = this.be_currentRecipe.craft(input, player); if (!output.isEmpty()) { info.setReturnValue(true); info.cancel(); @@ -49,7 +51,7 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { @Inject(method = "onTakeOutput", at = @At("HEAD"), cancellable = true) protected void onTakeOutput(PlayerEntity player, ItemStack stack, CallbackInfoReturnable info) { - if (currentRecipe != null) { + if (be_currentRecipe != null) { this.input.getStack(1).decrement(1); this.updateResult(); this.context.run((world, blockPos) -> { @@ -66,7 +68,6 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { } else { world.syncWorldEvent(1030, blockPos, 0); } - }); info.setReturnValue(stack); info.cancel(); @@ -75,18 +76,41 @@ public abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { @Inject(method = "updateResult", at = @At("HEAD"), cancellable = true) public void updateOutput(CallbackInfo info) { - this.currentRecipe = this.recipeManager.getFirstMatch(AnvilSmithingRecipe.TYPE, input, world).orElse(null); - if (currentRecipe != null) { - this.output.setStack(0, currentRecipe.craft(input)); - this.sendContentUpdates(); + RecipeManager recipeManager = this.player.world.getRecipeManager(); + this.be_recipes = recipeManager.getAllMatches(AnvilSmithingRecipe.TYPE, input, player.world); + if (be_recipes.size() > 0) { + this.be_currentRecipe = recipeManager.getFirstMatch(AnvilSmithingRecipe.TYPE, input, player.world).get(); + this.be_updateResult(); info.cancel(); } } @Inject(method = "setNewItemName", at = @At("HEAD"), cancellable = true) public void setNewItemName(String string, CallbackInfo info) { - if (currentRecipe != null) { + if (be_currentRecipe != null) { info.cancel(); } } + + private void be_updateResult() { + if (be_currentRecipe == null) return; + this.output.setStack(0, be_currentRecipe.craft(input)); + this.sendContentUpdates(); + } + + @Override + public void be_updateCurrentRecipe(AnvilSmithingRecipe recipe) { + this.be_currentRecipe = recipe; + this.be_updateResult(); + } + + @Override + public AnvilSmithingRecipe be_getCurrentRecipe() { + return this.be_currentRecipe; + } + + @Override + public List be_getRecipes() { + return this.be_recipes; + } } diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index e630e1e8..dc5704a5 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -134,7 +134,8 @@ public class CraftingRecipes { .build(); GridRecipe.make("shadow_berry_jelly", EndItems.SHADOW_BERRY_JELLY) - .setList("JWSB").addMaterial('J', EndItems.GELATINE) + .setList("JWSB") + .addMaterial('J', EndItems.GELATINE) .addMaterial('W', PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER)) .addMaterial('S', Items.SUGAR) .addMaterial('B', EndItems.SHADOW_BERRY_COOKED) @@ -169,19 +170,34 @@ public class CraftingRecipes { .build(); GridRecipe.make("hopper", Blocks.HOPPER) - .setShape("I I", "ICI", " I ") - .addMaterial('I', Items.IRON_INGOT) - .addMaterial('C', EndTags.ITEM_CHEST) - .build();; + .setShape("I I", "ICI", " I ") + .addMaterial('I', Items.IRON_INGOT) + .addMaterial('C', EndTags.ITEM_CHEST) + .build(); GridRecipe.make("shulker_box", Blocks.SHULKER_BOX) - .setShape("S", "C", "S") - .addMaterial('S', Items.SHULKER_SHELL) - .addMaterial('C', EndTags.ITEM_CHEST) - .build(); + .setShape("S", "C", "S") + .addMaterial('S', Items.SHULKER_SHELL) + .addMaterial('C', EndTags.ITEM_CHEST) + .build(); GridRecipe.make("twisted_umbrella_moss_dye", Items.PURPLE_DYE).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS).build(); GridRecipe.make("twisted_umbrella_moss_dye_tall", Items.PURPLE_DYE).setOutputCount(2).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS_TALL).build(); + + GridRecipe.make("leather_to_stripes", EndItems.LEATHER_STRIPE) + .setList("L") + .addMaterial('L', Items.LEATHER) + .setOutputCount(3) + .build(); + GridRecipe.make("stripes_to_leather", Items.LEATHER) + .setList("SSS") + .addMaterial('S', EndItems.LEATHER_STRIPE) + .build(); + GridRecipe.make("leather_wrapped_stick", EndItems.LEATHER_WRAPPED_STICK) + .setList("SL") + .addMaterial('S', Items.STICK) + .addMaterial('L', EndItems.LEATHER_STRIPE) + .build(); } private static void registerLantern(String name, Block lantern, Block slab) { diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index 369236f2..c5ab7711 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -18,5 +18,30 @@ public class SmithingRecipes { .setLevel(2) .setDamage(3) .build(); + + AnvilSmithingRecipe.Builder.create("aeternium_axe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_AXE_HEAD, 1) + .setLevel(4) + .setDamage(6) + .build(); + AnvilSmithingRecipe.Builder.create("aeternium_pickaxe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD, 1) + .setLevel(4) + .setDamage(6) + .build(); + AnvilSmithingRecipe.Builder.create("aeternium_shovel_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD, 1) + .setLevel(4) + .setDamage(6) + .build(); + AnvilSmithingRecipe.Builder.create("aeternium_hoe_head") + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HOE_HEAD, 1) + .setLevel(4) + .setDamage(6) + .build(); } } diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index bc3108e1..9492d3d4 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -68,6 +68,8 @@ public class EndItems { public final static Item GELATINE = registerItem("gelatine"); public static final Item ETERNAL_CRYSTAL = registerItem("eternal_crystal", new EternalCrystal()); public final static Item ENCHANTED_PETAL = registerItem("enchanted_petal", new EnchantedPetal()); + public final static Item LEATHER_STRIPE = registerItem("leather_stripe"); + public final static Item LEATHER_WRAPPED_STICK = registerItem("leather_wrapped_stick"); // Armor // public static final Item TERMINITE_HELMET = registerItem("terminite_helmet", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.HEAD, makeItemSettings())); @@ -110,6 +112,15 @@ public class EndItems { public final static Item SWEET_BERRY_JELLY = registerFood("sweet_berry_jelly", 3, 0.75F); public final static Item SHADOW_BERRY_JELLY = registerFood("shadow_berry_jelly", 4, 0.75F, new StatusEffectInstance(StatusEffects.NIGHT_VISION, 400)); + // Toolparts // + public final static Item AETERNIUM_SHOVEL_HEAD = registerItem("aeternium_shovel_head"); + public final static Item AETERNIUM_PICKAXE_HEAD = registerItem("aeternium_pickaxe_head"); + public final static Item AETERNIUM_AXE_HEAD = registerItem("aeternium_axe_head"); + public final static Item AETERNIUM_HOE_HEAD = registerItem("aeternium_hoe_head"); + public final static Item AETERNIUM_HAMMER_HEAD = registerItem("aeternium_hammer_head"); + public final static Item AETERNIUM_SWORD_BLADE = registerItem("aeternium_sword_blade"); + public final static Item AETERNIUM_SWORD_HANDLE = registerItem("aeternium_sword_handle"); + // Drinks public final static Item UMBRELLA_CLUSTER_JUICE = registerDrink("umbrella_cluster_juice"); diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_axe.png b/src/main/resources/assets/betterend/textures/item/aeternium_axe.png index d7101869f8f53e498c909e0587f0039f8cd30709..71931e6a1a85ffff3c3178838a46c47d01e2f222 100644 GIT binary patch delta 436 zcmV;l0Zab$0?q@FB!87jL_t(IjkS?WC`3^h$N%@{F=ytwhK7{Ph|HPsriQXsGd3(x zNH!KIu@tFUTiPfqWr<{{S+JQD8}e9rjJF!&RcNasJGEhaRY4JNvnY+D9QuEr>E#@?|`SG3X#Y) zTn&8)?cB$o;N>a`Q4kQmyg*-fH^wI?gwT{9B~Fg5?OoKj^}`~|#$|jdzr+nG!%C7h zou=nz&`^`5jeqU3TWDZpnCiSDd_!)jDXbhimYle-uoTG&t68 ze3Mz0HF&+#LoGa8cdMXUk}T_X!9W8V%rh+rp4?&X;70eD%oa5UBno(adNy!6{Ijzj zz?fDdGsT|Zx6bjDq#ijgPASRB$gF%rF!Xm=m(AgzYAv6S%<7gU^_>YS)t*ZtV`O5C eQW^U@4d4S-NTSqIqdn;W0000bhiUF4zN{bFLt){_65dVZ01l#{Y z8gX(`{6P!4cM=6byNaf|>MV4y>Qp-<@n3n~UCAJt#0)-o%W_5WG6@QFrrX9&w*$LGlLMHhVG@S8dho#V8ZNyXBASnS zJ*+odaQF5>`JLE+IlD^eOkTp*gIf}fEt-| zWMsJW-~m|kjUM|D$ zKYth)85kK@SXlo5|M#Ea``0gwAXkn8Y5@iY1^~poZvg~=6RiLM002ovPDHLkV1h^i Bq&WZp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_hammer.png b/src/main/resources/assets/betterend/textures/item/aeternium_hammer.png index ef7ff4f18a2d8047fb0aa24162454cdf438efd61..a594cfd5e620d6bc9553e61c467912ef64577ac4 100644 GIT binary patch delta 504 zcmVnR{pM;J#uRo``g#YV3Am1soTQkOtVrw;vjh8h>!xvenyZ_U$4qynjaz z8yiUMNp-bZFViID1lB%oq@m|SNS>ykkb(yl5;o?%uvsmbUyZ7)Za}pxlV|t^zVAkm zIzK}=6aqIGG5F*fGplEa#bS&VSzyqR|5U&Y_^|a+g%5Uq;>7n1$IVrk4;e8U2*6TO zLMAZc8Zy%Y=YQaCNIj9j8px?IZ zAVo|YVK^|(u1P^~Y(firTW$1tpqct)Nq;nR2JgQXGAB=eiDEgD(4CQ7WdpifDyYn1 uR?E&87Rnl}R;yZaJRZ*rzU%YlF90`Qx6v*DRga7S0000J&(59y+=1!lG^}l!q3}Lx=v#rx{_P$k8ntcwv~~`91IR&Jg|A0wAq;A^|;{ z2IW$szTHg)#FFc9-v)SoA7YV1#2H&#{RtS?(NZph_TUBg?SCdJEeD<9D@xllC>Q53 z6)?x!ZVfz~RVz5Uxx#EFi3JXPx?X{<>mvX$CI>91li0sF8HqE60_ej8T^fj`Q|Ngf z6jkL}n7oDfMwZk_7%Ut{C>jM-&p`*fV48+I+s0$R4`mX74~+Isk4a<}Z3_?!g^)K4 z?379{U3W6zwrNo(e_$fB0OSvaxQIr#H;V9JS@Ie9&O*GIi;%(rTio63cA)aT(n;xX(37K3S&O`8irxUZS%4S~7e7>Pl;F3H>JEt0<>nUoRe26>gUcCB;5yn#LkZ1lMP0 zSq>aO1^lv1!B7xu@ogZj1}=_Ha3AWy zWuOR71`H1kl9-=Q^eux;fOF2amsha6vWmN#B=oHV(5;GxWD3bt3KOxJtbJPq!6Bfo zrJ3p48xk9vVj53GH7mxxj{C>Qs9gF0$8pHWGW)TXYM?Duy%P?)O@H50{PKeKj-oU?=_DQ0 zOcv)TB~y3A3ufx-7D(FOqW$A24LBXNJljK|)xMfp!?xPZCNdC^NG4eBC69Hlmps7$ z9D{bWrA}~oT0l0Nt+Jes24Daf$H3G$i!K*JJ7K0IVn{#8D2;4j$>&3d(bzl^F9_hf z1@MBoy4TtkMSqd}l0-(6i2{;@rX3U&1;xCAqEf)_oQ)QyEQnvfV}8ZM&SEiyBN0}v zRCHXO+-`Rjz6#Ee-)_~ltG!mkA*%57>m%7MMw~z85R;#E_f!M*zvv=p@Y;~IDg0eJ z1FdrOCesquMNp@06FZTU-&(?2ggW?O(_Ve5R#i2FIv%OuZ{dape-eOC-oC2M>8}0h P00000NkvXXu0mjf-K54f delta 286 zcmV+(0pb3>1GoZ^BYyz@Nkldw{qi#Z*H51Ke`>n)e}6$iLHq^)H8U^+@rCQx z!2JC7HU^N*L0OsqYbW&m56{f}&&bS-+Yn}Ub_OO+b|B3L=EIx~ve`Ew;Xf15bwLRU z#03XPGtAlkDaj0sEG+-4y1E#Al>)t(v z?CdNC2S>;MT)e!vogpMD%D^iqz`(`F2j+vE%*w&ez{KRi9{KPL~*|InmF41HJu y%+D+!12{MsK$KXjQ!?7tJ1!MyT1_l80XHtlkd88iz0000msE-X-q^+%ehfmqj7q{JGnSHs14 z@n_Ee_+OD1ez$O^_boC$qCVT^K%LvZkuIFlKchi8m}|6QJk; zWV0DUr@Od68s*si+Z+ssIT#N0V}DCip=c_|ukDnegn}$vqse~(pmwYEZxbm1KLP&R Wz+iG58VxJ}0000e!g$sn<4s-a7Dui z#yI?X2)=fyU`E^3{F#1ZYkGZRr7Vj(=+)U4uN~#7ce>%Ud}V z>IazO5oF?Sl+(TuFkPc|=Z#vA4|I5bMlO#BirbCFTo%Q84M)XUc)i{c0Ck=w!x{x5 z8cjzzB}+TBzPC%Jb7C!vLahqf=^TBX8LpE*#=rKxvQ6jsY7*O(3M56b*Ar9RD?5=+ z5fj3tOa{yjpnu=F+guTn!+}I9jg3+XOp;*B`S+B}9yFTG;edYUfn!!=T-@J)1_6dS z{{RSK>-9wd7;HQDLX`apVK}+Ew370I3J=$9JQDM;WQytb$)G#KuyRTu0BV-Ivy~M2 o@7Xf;y)3HSZ3wg0SU>jzvNxrPT#y3700000NkvXXt^-0~f+4K9QUCw| diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_pickaxe_head.png b/src/main/resources/assets/betterend/textures/item/aeternium_pickaxe_head.png new file mode 100644 index 0000000000000000000000000000000000000000..5a0ba485877a00ef30816710660a4528f5c8a46a GIT binary patch literal 423 zcmV;Y0a*TtP)s)qxA|-gnQB^B(?PtTBKvGDJ=duo2*73_KCbUS)pFXaGD) zfYRv{UY-g#&EDcVpU3&(5jY!%n~O_ka()L85jqAGQk^{B?;kK0jY4jBV>A>-YCDO{ z$ys%mv1XRNe((nr>}@64<8uMI+#M3@YXru@!8GivO%!T>nAhOc*M$08JC4|I?>TW;lH6B*VNlD;V6|T;Ylc8UWHf zd-_aK!=&T>iglAEGYy-zLD9 zfs=>le_3NA!?rzp;7W0N0i;=7h?`;Cy*CVNZoUGm+p=pH0}~S?gO`gdhI$OmFq<(X z(Ex@Eu-S|cuvft31a-Ckb1^V72pRlg*mi(8%^(0bfR}-ZK~+PIp?<|42FCxyCvmvK w|Ns9paP#v1XJ7y$#&2K05^DwpfPsMl0A-tQ!meg+hX4Qo07*qoM6N<$f@6%JIRF3v delta 255 zcmVCdkZ!A`vLV2?4ve3*2*v z{%8#1TwWwoEMR{PF=Ro1`fV253k#4m??%`5J1!Qrx0yDPYo{EReHlhNDl7S;xG8!+X&ZP;Hx<+=l#i9 zuB;q%aV%du$E-Zc%?3zBq#1_#odX~yw#;-6#`*6a>;XYdao{YLp4aW_EA6$z`(!&03zc}RKgqepa1{> M07*qoM6N<$f{s6bO8@`> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_sword.png b/src/main/resources/assets/betterend/textures/item/aeternium_sword.png index af121d60b23aa6b36aca09341f3ce0f85779c9bc..7ed4b9e7800aa8d81cc45f660b603443bdaffba9 100644 GIT binary patch delta 605 zcmV-j0;2t%1oZ@vBYy%sNklJxo(k6vzMf)wZwiRr`R_(AXl-VkxC2YOQer zOmty!PzEP)chD{l$UrnsxRsGa2A28(389m5F(!yHB#P;WfPe+1Vs#)s?8iOkJ(J2y z8>61_=KRk6o&UWI|544s0Lf*JGSR=o^097uoy}4zl_p7+Nq?y6_(OGsLp1+*29J_+ zC=*AqQu%whJshI+@-mH$$0?o8kXe%G<=Z6~44i%+9qI|zz`@7~N={E>?&%YpiAE7Q z6~T>>TMYXn@OJoU@ahmb14qfz{c8vj>G0~tI*m`>r)MwbNp?7BEFQ<3R7&ruzJkl^ zp*Ft{pEo~3uzy+@35>uwCMPDal+EH~D2)EzUJQ?pvf)^)dU16Hrq5!?Z-2seE(Zzt>8g^V zu&;$LC{};pXW?#bCGWi$iFUhTL5n2efK7y16rs3V(BN)?>}m!RtwsZz-A+G<1DwEB r)sTtatc6!BL9m$hGhQtHZUFET+1fB$tBYy$qNklKJV zkc}U>a6>`@xPT~&26W-V#6%=o7C_Na(Ulth2)MA~q6vYvHr?nCdAaApq6MnrNls?& z%z2;poSS=z{wKQQu%l7g_%u4yRMtSI*gw8~FNT2d2k^%&V7_->U&woneek zPl4hwoa;G+0MO#_@fN6AKqhIwawpOtmhhU61N-Z=|bYh z2m>&_kinAs2KVM3LN<9BK!#~H2E+%`iY(}}7EP&6l&~nK}YrC!2CmTdYIfmBp5j{nbko#t4aXt^$mo50g1NNOZ?s`4&aT9xP zTks1^)M_-hvV@JT&1@=e?|tZ;qE+T6xc1}G= z6$LtDLy^w8;4MVaRAeRFo=cK4LaMIk(ir<)!9RqEz5v^qed6;iXs-YO002ovPDHLk FV1i%{oE-oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_sword_handle.png b/src/main/resources/assets/betterend/textures/item/aeternium_sword_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..ee18d7b9b768df1dd33cd0adfe885e09f244fd7c GIT binary patch literal 439 zcmV;o0Z9IdP))E%=ne;A~FyGFam-Wi{R|| zI*gCb2Q<_4YLrsFCIjp~c9y1iCZ%EP)WYoIBBYYIy}a_K3L>yl^lsbX3S9DfK7;*> zdt^4&sCszp{s6?2DNmXc6=>97*xTYK(JU2MCxN{Q#!2lJN7cHQAJz5VDV6f>*#Sc( zOu|z=_zw&SINKF$o;~>Fud96dmPjNinobhJJkaBDc3k%uXf+yvoTlrLN}=6sf<|Jl h8gQrkn}vS`0H2x0pxj`S)H478002ovPDHLkV1lwz#YzAG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/leather_stripe.png b/src/main/resources/assets/betterend/textures/item/leather_stripe.png new file mode 100644 index 0000000000000000000000000000000000000000..37007bfa5ebe46f0b0f39ba5fdd52e9c48fe7459 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!H1qMjv*HQ$qPgb{{8 z;%II&FrUHCbb@PQqky{h9o7Wq38u=wB_$8+VPaBve`fz5o~sNg_J{vyA3MsnEb+nB z?ePgx%OsDqNi%R2PB@nP{a(XjF18~(1=|iBNu1@#Ajej=sVRYNlZqij9>dOr1)rIi anHku3w;dI)_I3h#mci52&t;ucLK6TK5_?Dh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/item/leather_wrapped_stick.png b/src/main/resources/assets/betterend/textures/item/leather_wrapped_stick.png new file mode 100644 index 0000000000000000000000000000000000000000..63021506ffbfec012c506299361c64ce703d40bc GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!Hb?Qjv*HQ$r1t&9z9|@rf`5o&67c)cg=jg zfAvMLf7A=iS7A<=CCk&gK#7N^Ct#L>!!?`w-@N5GF2=Y|LZeoN4jFMELJ{#e;`7e7_XUw)_v