From a542aac45bf583695ece7f0755be10c930e60a3e Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 29 Sep 2020 15:26:15 +0300 Subject: [PATCH] End Stone Smelter --- src/main/java/ru/betterend/BetterEnd.java | 9 + .../ru/betterend/blocks/EndStoneSmelter.java | 1 + .../entities/EndStoneSmelterBlockEntity.java | 252 ++++++++++++++---- .../ru/betterend/client/BetterEndClient.java | 2 + .../gui/EndStoneSmelterRecipeBookScreen.java | 22 ++ .../client/gui/EndStoneSmelterScreen.java | 128 +++++++++ .../gui/EndStoneSmelterScreenHandler.java | 12 +- .../gui/{ => slot}/SmelterFuelSlot.java | 3 +- .../gui/{ => slot}/SmelterOutputSlot.java | 2 +- .../ru/betterend/recipe/AlloyingRecipe.java | 102 ++++++- .../ru/betterend/recipe/AlloyingRecipes.java | 38 +++ .../ru/betterend/recipe/EndRecipeManager.java | 27 +- .../ru/betterend/recipe/RecipeBuilder.java | 4 +- .../registry/BlockEntityRegistry.java | 2 +- .../ru/betterend/registry/BlockRegistry.java | 4 +- .../betterend/registry/BlockTagRegistry.java | 5 +- .../ru/betterend/registry/ItemRegistry.java | 4 +- .../betterend/registry/ScreensRegistry.java | 11 + 18 files changed, 551 insertions(+), 77 deletions(-) create mode 100644 src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java create mode 100644 src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java rename src/main/java/ru/betterend/client/gui/{ => slot}/SmelterFuelSlot.java (87%) rename src/main/java/ru/betterend/client/gui/{ => slot}/SmelterOutputSlot.java (97%) create mode 100644 src/main/java/ru/betterend/recipe/AlloyingRecipes.java create mode 100644 src/main/java/ru/betterend/registry/ScreensRegistry.java diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index f9b2bdeb..72ad6e82 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -1,7 +1,11 @@ package ru.betterend; import net.fabricmc.api.ModInitializer; + +import net.minecraft.util.Identifier; + import ru.betterend.config.MainConfig; +import ru.betterend.recipe.AlloyingRecipes; import ru.betterend.recipe.CraftingRecipes; import ru.betterend.registry.BiomeRegistry; import ru.betterend.registry.BlockEntityRegistry; @@ -28,6 +32,11 @@ public class BetterEnd implements ModInitializer { BiomeRegistry.register(); BetterEndBiomeSource.register(); CraftingRecipes.register(); + AlloyingRecipes.register(); BlockTagRegistry.register(); } + + public static Identifier getResId(String path) { + return new Identifier(MOD_ID, path); + } } diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index 0d5d4185..27315e60 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -94,6 +94,7 @@ public class EndStoneSmelter extends BaseBlockWithEntity { @Override public int getComparatorOutput(BlockState state, World world, BlockPos pos) { + //TODO return ScreenHandler.calculateComparatorOutput(world.getBlockEntity(pos)); } diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 15851015..6e2c52ff 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -10,7 +10,9 @@ import com.google.common.collect.Maps; import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectIterator; + import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.entity.LockableContainerBlockEntity; import net.minecraft.entity.ExperienceOrbEntity; import net.minecraft.entity.player.PlayerEntity; @@ -18,15 +20,19 @@ import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.Inventories; import net.minecraft.inventory.SidedInventory; import net.minecraft.item.Item; +import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundTag; +import net.minecraft.recipe.BlastingRecipe; import net.minecraft.recipe.Recipe; import net.minecraft.recipe.RecipeFinder; import net.minecraft.recipe.RecipeInputProvider; +import net.minecraft.recipe.RecipeType; import net.minecraft.recipe.RecipeUnlocker; import net.minecraft.screen.PropertyDelegate; import net.minecraft.screen.ScreenHandler; +import net.minecraft.tag.Tag; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Identifier; @@ -36,6 +42,7 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; + import ru.betterend.BetterEnd; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.client.gui.EndStoneSmelterScreenHandler; @@ -52,51 +59,60 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp private final Object2IntOpenHashMap recipesUsed; protected DefaultedList inventory; protected final PropertyDelegate propertyDelegate; + private Recipe lastRecipe; + private int smeltTimeTotal; + private int smeltTime; private int burnTime; private int fuelTime; - private int smeltTime; - private int smeltTimeTotal; public EndStoneSmelterBlockEntity() { super(BlockEntityRegistry.END_STONE_SMELTER); this.inventory = DefaultedList.ofSize(4, ItemStack.EMPTY); this.recipesUsed = new Object2IntOpenHashMap(); - this.propertyDelegate = new PropertyDelegate() { - public int get(int index) { - switch(index) { - case 0: - return EndStoneSmelterBlockEntity.this.burnTime; - case 1: - return EndStoneSmelterBlockEntity.this.fuelTime; - case 2: - return EndStoneSmelterBlockEntity.this.smeltTime; - case 3: - return EndStoneSmelterBlockEntity.this.smeltTimeTotal; - default: - return 0; - } - } + this.propertyDelegate = new PropertyDelegate() { + public int get(int index) { + switch(index) { + case 0: + return EndStoneSmelterBlockEntity.this.burnTime; + case 1: + return EndStoneSmelterBlockEntity.this.fuelTime; + case 2: + return EndStoneSmelterBlockEntity.this.smeltTime; + case 3: + return EndStoneSmelterBlockEntity.this.smeltTimeTotal; + default: + return 0; + } + } - public void set(int index, int value) { - switch(index) { - case 0: - EndStoneSmelterBlockEntity.this.burnTime = value; - break; - case 1: - EndStoneSmelterBlockEntity.this.fuelTime = value; - break; - case 2: - EndStoneSmelterBlockEntity.this.smeltTime = value; - break; - case 3: - EndStoneSmelterBlockEntity.this.smeltTimeTotal = value; - } - } + public void set(int index, int value) { + switch(index) { + case 0: + EndStoneSmelterBlockEntity.this.burnTime = value; + break; + case 1: + EndStoneSmelterBlockEntity.this.fuelTime = value; + break; + case 2: + EndStoneSmelterBlockEntity.this.smeltTime = value; + break; + case 3: + EndStoneSmelterBlockEntity.this.smeltTimeTotal = value; + } + } - public int size() { - return 4; - } - }; + public int size() { + return 4; + } + }; + + this.registerFuels(); + } + + private void registerFuels() { + registerFuel(Items.LAVA_BUCKET, 16000); + registerFuel(Blocks.COAL_BLOCK, 12000); + registerFuel(Items.BLAZE_ROD, 2000); } private boolean isBurning() { @@ -139,14 +155,13 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp @Override public void setStack(int slot, ItemStack stack) { - //TODO ItemStack itemStack = this.inventory.get(slot); boolean stackValid = !stack.isEmpty() && stack.isItemEqualIgnoreDamage(itemStack) && ItemStack.areTagsEqual(stack, itemStack); this.inventory.set(slot, stack); - if (stack.getCount() > this.getMaxCountPerStack()) { - stack.setCount(this.getMaxCountPerStack()); + if (stack.getCount() > getMaxCountPerStack()) { + stack.setCount(getMaxCountPerStack()); } - if (slot == 0 && !stackValid) { + if ((slot == 0 || slot == 1) && !stackValid) { this.smeltTimeTotal = this.getSmeltTime(); this.smeltTime = 0; this.markDirty(); @@ -154,8 +169,14 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } protected int getSmeltTime() { - return this.world.getRecipeManager().getFirstMatch(AlloyingRecipe.TYPE, this, world) - .map(AlloyingRecipe::getSmeltTime).orElse(350); + int smeltTime = this.world.getRecipeManager().getFirstMatch(AlloyingRecipe.TYPE, this, world) + .map(AlloyingRecipe::getSmeltTime).orElse(0); + if (smeltTime == 0) { + smeltTime = this.world.getRecipeManager().getFirstMatch(RecipeType.BLASTING, this, world) + .map(BlastingRecipe::getCookTime).orElse(200); + smeltTime /= 1.5; + } + return smeltTime; } public void dropExperience(PlayerEntity player) { @@ -165,8 +186,13 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp Entry entry = usedRecipes.next(); world.getRecipeManager().get(entry.getKey()).ifPresent((recipe) -> { list.add(recipe); - AlloyingRecipe alloying = (AlloyingRecipe) recipe; - this.dropExperience(player.world, player.getPos(), entry.getIntValue(), alloying.getExperience()); + if (recipe instanceof AlloyingRecipe) { + AlloyingRecipe alloying = (AlloyingRecipe) recipe; + this.dropExperience(player.world, player.getPos(), entry.getIntValue(), alloying.getExperience()); + } else { + BlastingRecipe blasting = (BlastingRecipe) recipe; + this.dropExperience(player.world, player.getPos(), entry.getIntValue(), blasting.getExperience()); + } }); } player.unlockRecipes(list); @@ -213,7 +239,123 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp @Override public void tick() { - // TODO Auto-generated method stub + boolean initialBurning = this.isBurning(); + boolean smelting = false; + if (initialBurning) { + this.burnTime--; + } + + boolean burning = this.isBurning(); + if (!this.world.isClient) { + ItemStack fuel = this.inventory.get(2); + if (!burning && (fuel.isEmpty() || inventory.get(0).isEmpty() && inventory.get(1).isEmpty())) { + if (!burning && smeltTime > 0) { + this.smeltTime = MathHelper.clamp(smeltTime - 2, 0, smeltTimeTotal); + } + } else { + Recipe recipe = this.world.getRecipeManager().getFirstMatch(AlloyingRecipe.TYPE, this, world).orElse(null); + if (recipe == null) { + recipe = this.world.getRecipeManager().getFirstMatch(RecipeType.BLASTING, this, world).orElse(null); + } + if (!burning && canAcceptRecipeOutput(recipe)) { + this.burnTime = this.getFuelTime(fuel); + this.fuelTime = this.burnTime; + burning = this.isBurning(); + if (burning) { + smelting = true; + if (!fuel.isEmpty()) { + Item item = fuel.getItem(); + fuel.decrement(1); + if (fuel.isEmpty()) { + Item remainFuel = item.getRecipeRemainder(); + this.inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel)); + } + } + } + } + + if (burning && canAcceptRecipeOutput(recipe)) { + this.smeltTime++; + if (smeltTime == smeltTimeTotal) { + this.smeltTime = 0; + this.smeltTimeTotal = this.getSmeltTime(); + this.craftRecipe(recipe); + smelting = true; + } + } else { + this.smeltTime = 0; + } + } + + if (initialBurning != burning) { + smelting = true; + this.world.setBlockState(pos, world.getBlockState(pos).with(EndStoneSmelter.LIT, burning), 3); + } + } + + if (smelting) { + this.markDirty(); + } + } + + protected boolean canAcceptRecipeOutput(Recipe recipe) { + if (recipe == null) return false; + boolean validInput = false; + if (recipe instanceof AlloyingRecipe) { + validInput = !inventory.get(0).isEmpty() && + !inventory.get(1).isEmpty(); + } else { + validInput = !inventory.get(0).isEmpty() || + !inventory.get(1).isEmpty(); + } + if (validInput) { + ItemStack result = recipe.getOutput(); + if (result.isEmpty()) { + return false; + } else { + ItemStack output = this.inventory.get(3); + int outCount = output.getCount(); + int total = outCount + result.getCount(); + if (output.isEmpty()) { + return true; + } else if (!output.isItemEqualIgnoreDamage(result)) { + return false; + } else if (outCount < this.getMaxCountPerStack() && outCount < output.getMaxCount()) { + return this.getMaxCountPerStack() >= total; + } else { + return output.getCount() < result.getMaxCount(); + } + } + } + + return false; + } + + private void craftRecipe(Recipe recipe) { + if (recipe == null || !canAcceptRecipeOutput(recipe)) return; + + ItemStack result = recipe.getOutput(); + ItemStack output = this.inventory.get(3); + if (output.isEmpty()) { + this.inventory.set(3, result.copy()); + } else if (output.getItem() == result.getItem()) { + output.increment(result.getCount()); + } + + if (!this.world.isClient) { + this.setLastRecipe(recipe); + } + + if (recipe instanceof AlloyingRecipe) { + this.inventory.get(0).decrement(1); + this.inventory.get(1).decrement(1); + } else { + if (!this.inventory.get(0).isEmpty()) { + this.inventory.get(0).decrement(1); + } else { + this.inventory.get(1).decrement(1); + } + } } @Override @@ -230,12 +372,13 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp if (recipe != null) { Identifier recipeId = recipe.getId(); this.recipesUsed.addTo(recipeId, 1); + this.lastRecipe = recipe; } } @Override public Recipe getLastRecipe() { - return null; + return this.lastRecipe; } @Override @@ -318,4 +461,21 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp public static boolean canUseAsFuel(ItemStack stack) { return availableFuels.containsKey(stack.getItem()); } + + public static void registerFuel(ItemConvertible fuel, int time) { + if (availableFuels.containsKey(fuel)) { + availableFuels.replace(fuel.asItem(), time); + } else { + availableFuels.put(fuel.asItem(), time); + } + } + + public static void registerFuel(Tag tag, int time) { + Iterator tagItems = tag.values().iterator(); + tagItems.forEachRemaining(item -> registerFuel(item, time)); + } + + public static Map availableFuels() { + return availableFuels; + } } diff --git a/src/main/java/ru/betterend/client/BetterEndClient.java b/src/main/java/ru/betterend/client/BetterEndClient.java index 7c9b0e33..e5d19664 100644 --- a/src/main/java/ru/betterend/client/BetterEndClient.java +++ b/src/main/java/ru/betterend/client/BetterEndClient.java @@ -5,12 +5,14 @@ import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.minecraft.client.render.RenderLayer; import net.minecraft.util.registry.Registry; import ru.betterend.registry.BlockEntityRenderRegistry; +import ru.betterend.registry.ScreensRegistry; public class BetterEndClient implements ClientModInitializer { @Override public void onInitializeClient() { registerRenderLayers(); BlockEntityRenderRegistry.register(); + ScreensRegistry.register(); } private void registerRenderLayers() { diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java new file mode 100644 index 00000000..4a9f74ec --- /dev/null +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java @@ -0,0 +1,22 @@ +package ru.betterend.client.gui; + +import java.util.Set; + +import net.minecraft.client.gui.screen.recipebook.BlastFurnaceRecipeBookScreen; +import net.minecraft.item.Item; +import net.minecraft.text.Text; +import net.minecraft.text.TranslatableText; + +import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; + +public class EndStoneSmelterRecipeBookScreen extends BlastFurnaceRecipeBookScreen { + private static final Text TITLE = new TranslatableText("gui.recipebook.toggleRecipes.blastable"); + + protected Text getToggleCraftableButtonText() { + return TITLE; + } + + protected Set getAllowedFuels() { + return EndStoneSmelterBlockEntity.availableFuels().keySet(); + } +} diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java new file mode 100644 index 00000000..91ec24cb --- /dev/null +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java @@ -0,0 +1,128 @@ +package ru.betterend.client.gui; + +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; +import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; +import net.minecraft.client.gui.widget.TexturedButtonWidget; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.screen.slot.Slot; +import net.minecraft.screen.slot.SlotActionType; +import net.minecraft.text.StringVisitable; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import ru.betterend.BetterEnd; + +public class EndStoneSmelterScreen extends HandledScreen implements RecipeBookProvider { + + private final static Identifier RECIPE_BUTTON_TEXTURE = new Identifier("textures/gui/recipe_button.png"); + private final static Identifier BACKGROUND_TEXTURE = BetterEnd.getResId("textures/gui/smelter_gui.png"); + + public final EndStoneSmelterRecipeBookScreen recipeBook; + private boolean narrow; + + public EndStoneSmelterScreen(EndStoneSmelterScreenHandler handler, PlayerInventory inventory, Text title) { + super(handler, inventory, title); + this.recipeBook = new EndStoneSmelterRecipeBookScreen(); + } + + public void init() { + super.init(); + this.narrow = this.width < 379; + this.recipeBook.initialize(width, height, client, narrow, handler); + this.x = this.recipeBook.findLeftEdge(narrow, width, backgroundWidth); + this.addButton(new TexturedButtonWidget(x + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, (buttonWidget) -> { + this.recipeBook.reset(narrow); + this.recipeBook.toggleOpen(); + this.x = this.recipeBook.findLeftEdge(narrow, width, backgroundWidth); + ((TexturedButtonWidget)buttonWidget).setPos(this.x + 20, height / 2 - 49); + })); + this.titleX = (this.backgroundWidth - this.textRenderer.getWidth((StringVisitable)this.title)) / 2; + } + + @Override + public void tick() { + super.tick(); + this.recipeBook.update(); + } + + @Override + public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + this.renderBackground(matrices); + if (this.recipeBook.isOpen() && this.narrow) { + this.drawBackground(matrices, delta, mouseX, mouseY); + this.recipeBook.render(matrices, mouseX, mouseY, delta); + } else { + this.recipeBook.render(matrices, mouseX, mouseY, delta); + super.render(matrices, mouseX, mouseY, delta); + this.recipeBook.drawGhostSlots(matrices, x, y, true, delta); + } + + this.drawMouseoverTooltip(matrices, mouseX, mouseY); + this.recipeBook.drawTooltip(matrices, x, y, mouseX, mouseY); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (this.recipeBook.mouseClicked(mouseX, mouseY, button)) { + return true; + } else { + return this.narrow && this.recipeBook.isOpen() ? true : super.mouseClicked(mouseX, mouseY, button); + } + } + + @Override + protected void onMouseClick(Slot slot, int invSlot, int clickData, SlotActionType actionType) { + super.onMouseClick(slot, invSlot, clickData, actionType); + this.recipeBook.slotClicked(slot); + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + return this.recipeBook.keyPressed(keyCode, scanCode, modifiers) ? false : super.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + protected boolean isClickOutsideBounds(double mouseX, double mouseY, int left, int top, int button) { + boolean isMouseOut = mouseX < left || mouseY < top || mouseX >= (left + backgroundWidth) || mouseY >= (top + backgroundHeight); + return this.recipeBook.isClickOutsideBounds(mouseX, mouseY, x, y, backgroundWidth, backgroundHeight, button) && isMouseOut; + } + + @Override + public boolean charTyped(char chr, int keyCode) { + return this.recipeBook.charTyped(chr, keyCode) ? true : super.charTyped(chr, keyCode); + } + + @Override + public void refreshRecipeBook() { + this.recipeBook.refresh(); + } + + @Override + public RecipeBookWidget getRecipeBookWidget() { + return this.recipeBook; + } + + @Override + protected void drawBackground(MatrixStack matrices, float delta, int mouseX, int mouseY) { + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + this.client.getTextureManager().bindTexture(BACKGROUND_TEXTURE); + this.drawTexture(matrices, x, y, 0, 0, backgroundWidth, backgroundHeight); + int p; + if (handler.isBurning()) { + p = handler.getFuelProgress(); + this.drawTexture(matrices, x + 56, y + 36 + 12 - p, 176, 12 - p, 14, p + 1); + } + p = handler.getSmeltProgress(); + this.drawTexture(matrices, x + 92, y + 34, 176, 14, p + 1, 16); + } + + @Override + public void removed() { + this.recipeBook.close(); + super.removed(); + } +} diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java index 0b142cbe..b84728f4 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreenHandler.java @@ -22,6 +22,8 @@ import net.minecraft.world.World; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; +import ru.betterend.client.gui.slot.SmelterFuelSlot; +import ru.betterend.client.gui.slot.SmelterOutputSlot; import ru.betterend.recipe.AlloyingRecipe; public class EndStoneSmelterScreenHandler extends AbstractRecipeScreenHandler { @@ -44,10 +46,10 @@ public class EndStoneSmelterScreenHandler extends AbstractRecipeScreenHandler { public final static String GROUP = "alloying"; - public final static RecipeType TYPE = registerType(GROUP); - public final static AlloyingRecipeSerializer SERIALIZER = registerSerializer(GROUP, new AlloyingRecipeSerializer()); + public final static RecipeType TYPE = EndRecipeManager.registerType(GROUP); + public final static AlloyingRecipeSerializer SERIALIZER = EndRecipeManager.registerSerializer(GROUP, new AlloyingRecipeSerializer()); protected final RecipeType type; protected final Identifier id; @@ -104,15 +106,91 @@ public class AlloyingRecipe implements Recipe { return new ItemStack(BlockRegistry.END_STONE_SMELTER); } - private static , T extends Recipe> S registerSerializer(String id, S serializer) { - return Registry.register(Registry.RECIPE_SERIALIZER, new Identifier(BetterEnd.MOD_ID, id), serializer); - } - - private static > RecipeType registerType(String name) { - return Registry.register(Registry.RECIPE_TYPE, new Identifier(BetterEnd.MOD_ID, name), new RecipeType() { - public String toString() { - return name; + public static class Builder { + private final static Builder INSTANCE = new Builder(); + + public static Builder create(String id) { + INSTANCE.id = BetterEnd.getResId(id); + INSTANCE.primaryInput = null; + INSTANCE.secondaryInput = null; + INSTANCE.output = null; + INSTANCE.experience = 0.0F; + INSTANCE.smeltTime = 350; + + return INSTANCE; + } + + private Identifier id; + private Ingredient primaryInput; + private Ingredient secondaryInput; + private ItemStack output; + private float experience; + private int smeltTime; + + private Builder() {} + + public Builder setPrimaryInput(ItemConvertible... inputs) { + this.primaryInput = Ingredient.ofItems(inputs); + return this; + } + + public Builder setSecondaryInput(ItemConvertible... inputs) { + this.secondaryInput = Ingredient.ofItems(inputs); + return this; + } + + public Builder setPrimaryInput(Tag input) { + this.primaryInput = Ingredient.fromTag(input); + return this; + } + + public Builder setSecondaryInput(Tag input) { + this.secondaryInput = Ingredient.fromTag(input); + return this; + } + + public Builder setInput(ItemConvertible primaryInput, ItemConvertible secondaryInput) { + this.setPrimaryInput(primaryInput); + this.setSecondaryInput(secondaryInput); + return this; + } + + public Builder setInput(Tag primaryInput, Tag secondaryInput) { + this.setPrimaryInput(primaryInput); + this.setSecondaryInput(secondaryInput); + return this; + } + + public Builder setInput(Ingredient primaryInput, Ingredient secondaryInput) { + this.primaryInput = primaryInput; + this.secondaryInput = secondaryInput; + return this; + } + + public Builder setOutput(ItemConvertible output, int amount) { + this.output = new ItemStack(output, amount); + return this; + } + + public Builder setExpiriense(float amount) { + this.experience = amount; + return this; + } + + public Builder setSmeltTime(int time) { + this.smeltTime = time; + return this; + } + + public void build() { + if (primaryInput == null) { + throw new IllegalArgumentException("Primary input can't be null!"); + } else if(secondaryInput == null) { + throw new IllegalArgumentException("Secondary input can't be null!"); + } else if(output == null) { + throw new IllegalArgumentException("Output can't be null!"); } - }); + EndRecipeManager.addRecipe(AlloyingRecipe.TYPE, new AlloyingRecipe(id, primaryInput, secondaryInput, output, experience, smeltTime)); + } } } diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java new file mode 100644 index 00000000..fe832d48 --- /dev/null +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -0,0 +1,38 @@ +package ru.betterend.recipe; + +import net.minecraft.block.Blocks; +import net.minecraft.item.Items; +import ru.betterend.registry.ItemRegistry; + +public class AlloyingRecipes { + public static void register() { + AlloyingRecipe.Builder.create("additional_iron") + .setInput(Blocks.IRON_ORE, Blocks.IRON_ORE) + .setOutput(Items.IRON_INGOT, 3) + .setExpiriense(2.1F) + .build(); + AlloyingRecipe.Builder.create("additional_gold") + .setInput(Blocks.GOLD_ORE, Blocks.GOLD_ORE) + .setOutput(Items.GOLD_INGOT, 3) + .setExpiriense(3F) + .build(); + AlloyingRecipe.Builder.create("additional_netherite") + .setInput(Blocks.ANCIENT_DEBRIS, Blocks.ANCIENT_DEBRIS) + .setOutput(Items.NETHERITE_SCRAP, 3) + .setExpiriense(6F) + .setSmeltTime(500) + .build(); + AlloyingRecipe.Builder.create("terminite_ingot") + .setInput(Items.IRON_INGOT, ItemRegistry.ENDER_DUST) + .setOutput(ItemRegistry.TERMINITE_INGOT, 1) + .setExpiriense(2.5F) + .setSmeltTime(450) + .build(); + AlloyingRecipe.Builder.create("aeternium_ingot") + .setInput(ItemRegistry.TERMINITE_INGOT, Items.NETHERITE_INGOT) + .setOutput(ItemRegistry.AETERNIUM_INGOT, 1) + .setExpiriense(4.5F) + .setSmeltTime(600) + .build(); + } +} diff --git a/src/main/java/ru/betterend/recipe/EndRecipeManager.java b/src/main/java/ru/betterend/recipe/EndRecipeManager.java index dd766de8..20d7c7e0 100644 --- a/src/main/java/ru/betterend/recipe/EndRecipeManager.java +++ b/src/main/java/ru/betterend/recipe/EndRecipeManager.java @@ -1,12 +1,16 @@ package ru.betterend.recipe; import java.util.Map; +import java.util.Map.Entry; import com.google.common.collect.Maps; import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeSerializer; import net.minecraft.recipe.RecipeType; import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import ru.betterend.BetterEnd; public class EndRecipeManager { private static final Map, Map>> RECIPES = Maps.newHashMap(); @@ -33,13 +37,30 @@ public class EndRecipeManager { Map> list = RECIPES.get(type); if (list != null) { Map> typeList = result.get(type); - list.forEach((id, recipe) -> { + if (typeList == null) { + typeList = Maps.newHashMap(); + result.put(type, typeList); + } + for (Entry> entry : list.entrySet()) { + Identifier id = entry.getKey(); if (!typeList.containsKey(id)) - typeList.put(id, recipe); - }); + typeList.put(id, entry.getValue()); + } } } return result; } + + static , T extends Recipe> S registerSerializer(String id, S serializer) { + return Registry.register(Registry.RECIPE_SERIALIZER, BetterEnd.getResId(id), serializer); + } + + static > RecipeType registerType(String name) { + return Registry.register(Registry.RECIPE_TYPE, BetterEnd.getResId(name), new RecipeType() { + public String toString() { + return name; + } + }); + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/recipe/RecipeBuilder.java b/src/main/java/ru/betterend/recipe/RecipeBuilder.java index 8fbcf78c..19398485 100644 --- a/src/main/java/ru/betterend/recipe/RecipeBuilder.java +++ b/src/main/java/ru/betterend/recipe/RecipeBuilder.java @@ -97,8 +97,8 @@ public class RecipeBuilder { int height = shape.length; int width = shape[0].length(); ItemStack result = new ItemStack(output, count); - Identifier id = new Identifier(BetterEnd.MOD_ID, name); - DefaultedList materials = getMaterials(width, height); + Identifier id = BetterEnd.getResId(name); + DefaultedList materials = this.getMaterials(width, height); CraftingRecipe recipe = shaped ? new ShapedRecipe(id, group, width, height, materials, result) : new ShapelessRecipe(id, group, result, materials); EndRecipeManager.addRecipe(type, recipe); diff --git a/src/main/java/ru/betterend/registry/BlockEntityRegistry.java b/src/main/java/ru/betterend/registry/BlockEntityRegistry.java index 38e8b4fd..f438207c 100644 --- a/src/main/java/ru/betterend/registry/BlockEntityRegistry.java +++ b/src/main/java/ru/betterend/registry/BlockEntityRegistry.java @@ -31,7 +31,7 @@ public class BlockEntityRegistry { BlockEntityType.Builder.create(ESignBlockEntity::new, getSigns())); public static BlockEntityType registerBlockEntity(String id, BlockEntityType.Builder builder) { - return Registry.register(Registry.BLOCK_ENTITY_TYPE, new Identifier(BetterEnd.MOD_ID, id), builder.build(null)); + return Registry.register(Registry.BLOCK_ENTITY_TYPE, BetterEnd.getResId(id), builder.build(null)); } public static void register() {} diff --git a/src/main/java/ru/betterend/registry/BlockRegistry.java b/src/main/java/ru/betterend/registry/BlockRegistry.java index 2af34de6..32e139ac 100644 --- a/src/main/java/ru/betterend/registry/BlockRegistry.java +++ b/src/main/java/ru/betterend/registry/BlockRegistry.java @@ -42,12 +42,12 @@ public class BlockRegistry { public static void register() {} public static Block registerBlock(String name, Block block) { - Registry.register(Registry.BLOCK, new Identifier(BetterEnd.MOD_ID, name), block); + Registry.register(Registry.BLOCK, BetterEnd.getResId(name), block); ItemRegistry.registerItem(name, new BlockItem(block, new Item.Settings().group(CreativeTab.END_TAB))); return block; } public static Block registerBlockNI(String name, Block block) { - return Registry.register(Registry.BLOCK, new Identifier(BetterEnd.MOD_ID, name), block); + return Registry.register(Registry.BLOCK, BetterEnd.getResId(name), block); } } diff --git a/src/main/java/ru/betterend/registry/BlockTagRegistry.java b/src/main/java/ru/betterend/registry/BlockTagRegistry.java index b19db7c1..5ec14e43 100644 --- a/src/main/java/ru/betterend/registry/BlockTagRegistry.java +++ b/src/main/java/ru/betterend/registry/BlockTagRegistry.java @@ -1,10 +1,11 @@ package ru.betterend.registry; import net.fabricmc.fabric.api.tag.TagRegistry; + import net.minecraft.block.Block; import net.minecraft.tag.Tag; import net.minecraft.tag.Tag.Identified; -import net.minecraft.util.Identifier; + import ru.betterend.BetterEnd; import ru.betterend.util.TagHelper; @@ -12,7 +13,7 @@ public class BlockTagRegistry { public static final Tag.Identified END_GROUND = makeTag("end_ground"); private static Tag.Identified makeTag(String name) { - return (Identified) TagRegistry.block(new Identifier(BetterEnd.MOD_ID, name)); + return (Identified) TagRegistry.block(BetterEnd.getResId(name)); } public static void register() { diff --git a/src/main/java/ru/betterend/registry/ItemRegistry.java b/src/main/java/ru/betterend/registry/ItemRegistry.java index 834e92e1..54830293 100644 --- a/src/main/java/ru/betterend/registry/ItemRegistry.java +++ b/src/main/java/ru/betterend/registry/ItemRegistry.java @@ -8,8 +8,8 @@ import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.Items; -import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; + import ru.betterend.BetterEnd; public class ItemRegistry { @@ -22,7 +22,7 @@ public class ItemRegistry { protected static Item registerItem(String name, Item item) { if (item != Items.AIR) { - Registry.register(Registry.ITEM, new Identifier(BetterEnd.MOD_ID, name), item); + Registry.register(Registry.ITEM, BetterEnd.getResId(name), item); if (item instanceof BlockItem) MOD_BLOCKS.add(item); else diff --git a/src/main/java/ru/betterend/registry/ScreensRegistry.java b/src/main/java/ru/betterend/registry/ScreensRegistry.java new file mode 100644 index 00000000..06ff537e --- /dev/null +++ b/src/main/java/ru/betterend/registry/ScreensRegistry.java @@ -0,0 +1,11 @@ +package ru.betterend.registry; + +import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry; +import ru.betterend.client.gui.EndStoneSmelterScreen; +import ru.betterend.client.gui.EndStoneSmelterScreenHandler; + +public class ScreensRegistry { + public static void register() { + ScreenRegistry.register(EndStoneSmelterScreenHandler.HANDLER_TYPE, EndStoneSmelterScreen::new); + } +}