From 43993d13bca83eb0f7ad3ecefb1ed5c0978edbbf Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 29 Sep 2020 17:57:46 +0300 Subject: [PATCH] WIP --- .../entities/EndStoneSmelterBlockEntity.java | 20 ++++--- .../gui/EndStoneSmelterRecipeBookScreen.java | 59 ++++++++++++++++--- .../client/gui/EndStoneSmelterScreen.java | 2 +- .../mixin/client/ClientRecipeBookMixin.java | 22 +++++++ .../resources/betterend.mixins.client.json | 1 + 5 files changed, 86 insertions(+), 18 deletions(-) create mode 100644 src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 25b666fe..a36a6d81 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -255,7 +255,8 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp if (recipe == null) { recipe = this.world.getRecipeManager().getFirstMatch(RecipeType.BLASTING, this, world).orElse(null); } - if (!burning && canAcceptRecipeOutput(recipe)) { + boolean accepted = this.canAcceptRecipeOutput(recipe); + if (!burning && accepted) { this.burnTime = this.getFuelTime(fuel); this.fuelTime = this.burnTime; burning = this.isBurning(); @@ -272,7 +273,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } } - if (burning && canAcceptRecipeOutput(recipe)) { + if (burning && accepted) { this.smeltTime++; if (smeltTime == smeltTimeTotal) { this.smeltTime = 0; @@ -415,12 +416,12 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp @Override public void fromTag(BlockState state, CompoundTag tag) { super.fromTag(state, tag); - this.inventory = DefaultedList.ofSize(this.size(), ItemStack.EMPTY); - Inventories.fromTag(tag, this.inventory); + this.inventory = DefaultedList.ofSize(size(), ItemStack.EMPTY); + Inventories.fromTag(tag, inventory); this.burnTime = tag.getShort("BurnTime"); + this.fuelTime = tag.getShort("FuelTime"); this.smeltTime = tag.getShort("SmeltTime"); this.smeltTimeTotal = tag.getShort("SmeltTimeTotal"); - this.fuelTime = this.getFuelTime(this.inventory.get(2)); CompoundTag compoundTag = tag.getCompound("RecipesUsed"); Iterator recipes = compoundTag.getKeys().iterator(); while(recipes.hasNext()) { @@ -432,10 +433,11 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp @Override public CompoundTag toTag(CompoundTag tag) { super.toTag(tag); - tag.putShort("BurnTime", (short)this.burnTime); - tag.putShort("SmeltTime", (short)this.smeltTime); - tag.putShort("SmeltTimeTotal", (short)this.smeltTimeTotal); - Inventories.toTag(tag, this.inventory); + tag.putShort("BurnTime", (short) burnTime); + tag.putShort("FuelTime", (short) fuelTime); + tag.putShort("SmeltTime", (short) smeltTime); + tag.putShort("SmeltTimeTotal", (short) smeltTimeTotal); + Inventories.toTag(tag, inventory); CompoundTag usedRecipes = new CompoundTag(); this.recipesUsed.forEach((identifier, integer) -> { usedRecipes.putInt(identifier.toString(), integer); diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java index 2afe75f6..56ccc5b5 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java @@ -1,21 +1,64 @@ package ru.betterend.client.gui; +import java.lang.reflect.Field; +import java.util.Iterator; +import java.util.List; import java.util.Set; +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.recipebook.AbstractFurnaceRecipeBookScreen; import net.minecraft.client.gui.screen.recipebook.BlastFurnaceRecipeBookScreen; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.Item; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.Ingredient; +import net.minecraft.recipe.Recipe; +import net.minecraft.screen.slot.Slot; +import net.minecraft.util.collection.DefaultedList; 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; - } - + @Override protected Set getAllowedFuels() { return EndStoneSmelterBlockEntity.availableFuels().keySet(); } + + @SuppressWarnings("unchecked") + @Override + public void showGhostRecipe(Recipe recipe, List slots) { + ItemStack result = recipe.getOutput(); + this.ghostSlots.setRecipe(recipe); + this.ghostSlots.addSlot(Ingredient.ofStacks(result), (slots.get(3)).x, (slots.get(3)).y); + DefaultedList inputs = recipe.getPreviewInputs(); + try { + Field outputSlot = super.getClass().getDeclaredField("outputSlot"); + outputSlot.setAccessible(true); + outputSlot.set(Slot.class, slots.get(3)); + Field fuels = super.getClass().getDeclaredField("fuels"); + fuels.setAccessible(true); + if (fuels.get(Set.class) == null) { + fuels.set(Set.class, this.getAllowedFuels()); + } + + Field fuelIterator = super.getClass().getDeclaredField("fuelIterator"); + fuelIterator.setAccessible(true); + fuelIterator.set(Iterator.class, ((Set) fuels.get(Set.class)).iterator()); + } catch (Exception ex) { + ex.printStackTrace(); + } + Iterator iterator = inputs.iterator(); + for(int i = 0; i < 2; i++) { + if (!iterator.hasNext()) { + return; + } + Ingredient ingredient = iterator.next(); + if (!ingredient.isEmpty()) { + Slot slot = slots.get(i); + this.ghostSlots.addSlot(ingredient, slot.x, slot.y); + } + } + } } diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java index b693e8c7..43ed2f65 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java @@ -37,7 +37,7 @@ public class EndStoneSmelterScreen extends HandledScreen recipe, CallbackInfoReturnable cinfo) { + if (recipe instanceof AlloyingRecipe) { + cinfo.setReturnValue(RecipeBookGroup.BLAST_FURNACE_MISC); + cinfo.cancel(); + } + } +} diff --git a/src/main/resources/betterend.mixins.client.json b/src/main/resources/betterend.mixins.client.json index ec6da0be..070d942a 100644 --- a/src/main/resources/betterend.mixins.client.json +++ b/src/main/resources/betterend.mixins.client.json @@ -6,6 +6,7 @@ "client": [ "WorldRendererMixin", "BackgroundRendererMixin", + "ClientRecipeBookMixin", "ClientPlayNetworkHandlerMixin" ], "injectors": {