diff --git a/psd/smelter_gui.psd b/psd/smelter_gui.psd new file mode 100644 index 00000000..005f83bc Binary files /dev/null and b/psd/smelter_gui.psd differ diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 279fbb01..e35e91ed 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -1,78 +1,165 @@ package ru.betterend.blocks.entities; +import java.util.Iterator; +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.block.entity.LockableContainerBlockEntity; import net.minecraft.entity.player.PlayerEntity; 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.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.recipe.AbstractCookingRecipe; import net.minecraft.recipe.Recipe; import net.minecraft.recipe.RecipeFinder; import net.minecraft.recipe.RecipeInputProvider; import net.minecraft.recipe.RecipeUnlocker; +import net.minecraft.screen.PropertyDelegate; import net.minecraft.screen.ScreenHandler; import net.minecraft.text.Text; +import net.minecraft.text.TranslatableText; import net.minecraft.util.Tickable; +import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.math.Direction; +import ru.betterend.BetterEnd; + public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity implements SidedInventory, RecipeUnlocker, RecipeInputProvider, Tickable { + private static final int[] TOP_SLOTS = new int[] { 0, 1 }; + private static final int[] BOTTOM_SLOTS = new int[] { 2, 3 }; + private static final int[] SIDE_SLOTS = new int[] { 3 }; + protected DefaultedList inventory; + protected final PropertyDelegate propertyDelegate; + private Map availableFuels = Maps.newHashMap(); + private int burnTime; + private int fuelTime; + private int smeltTime; + private int smeltTimeTotal; + protected EndStoneSmelterBlockEntity(BlockEntityType blockEntityType) { super(blockEntityType); + this.inventory = DefaultedList.ofSize(4, ItemStack.EMPTY); + 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 int size() { + return 4; + } + }; + } + + private boolean isBurning() { + return this.burnTime > 0; } @Override public int size() { - // TODO Auto-generated method stub - return 0; + return this.inventory.size(); } @Override public boolean isEmpty() { - // TODO Auto-generated method stub + Iterator iterator = this.inventory.iterator(); + ItemStack itemStack; + do { + if (!iterator.hasNext()) { + return true; + } + itemStack = iterator.next(); + } while (itemStack.isEmpty()); + return false; } @Override public ItemStack getStack(int slot) { - // TODO Auto-generated method stub - return null; + return this.inventory.get(slot); } @Override public ItemStack removeStack(int slot, int amount) { - // TODO Auto-generated method stub - return null; + return Inventories.splitStack(this.inventory, slot, amount); } @Override public ItemStack removeStack(int slot) { - // TODO Auto-generated method stub - return null; + return Inventories.removeStack(this.inventory, slot); } @Override public void setStack(int slot, ItemStack stack) { - // TODO Auto-generated method stub - + //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 (slot == 0 && !stackValid) { + this.smeltTimeTotal = this.getSmeltTime(); + this.smeltTime = 0; + this.markDirty(); + } + } + + protected int getSmeltTime() { + //TODO + return 0; } @Override public boolean canPlayerUse(PlayerEntity player) { - // TODO Auto-generated method stub - return false; + if (this.world.getBlockEntity(this.pos) != this) { + return false; + } else { + return player.squaredDistanceTo(this.pos.getX() + 0.5D, this.pos.getY() + 0.5D, this.pos.getZ() + 0.5D) <= 64.0D; + } } @Override public void clear() { - // TODO Auto-generated method stub - + this.inventory.clear(); } @Override protected Text getContainerName() { - // TODO Auto-generated method stub - return null; + return new TranslatableText(String.format("block.%s.end_stone_smelter", BetterEnd.MOD_ID)); } @Override @@ -123,4 +210,33 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp return false; } + protected int getFuelTime(ItemStack fuel) { + if (fuel.isEmpty()) { + return 0; + } else { + Item item = fuel.getItem(); + return this.availableFuels.getOrDefault(item, 0); + } + } + + @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.burnTime = tag.getShort("BurnTime"); + this.smeltTime = tag.getShort("SmeltTime"); + this.smeltTimeTotal = tag.getShort("SmeltTimeTotal"); + this.fuelTime = this.getFuelTime(this.inventory.get(2)); + } + + @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); + return tag; + } } diff --git a/src/main/java/ru/betterend/mixin/common/TagAccessor.java b/src/main/java/ru/betterend/mixin/common/TagAccessor.java new file mode 100644 index 00000000..546bcd4e --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/TagAccessor.java @@ -0,0 +1,12 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.tag.Tag; + +@Mixin(targets = "net.minecraft.tag.RequiredTagList$TagWrapper") +public interface TagAccessor { + @Accessor + Tag getDelegate(); +} diff --git a/src/main/resources/assets/betterend/textures/gui/smelter_gui.png b/src/main/resources/assets/betterend/textures/gui/smelter_gui.png new file mode 100644 index 00000000..a82d3818 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/gui/smelter_gui.png differ diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 6cfb90af..4c202460 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -8,7 +8,8 @@ "RecipeManagerMixin", "ServerPlayNetworkHandlerMixin", "TagGroupLoaderMixin", - "CraftingScreenHandlerMixin" + "CraftingScreenHandlerMixin", + "TagAccessor" ], "injectors": { "defaultRequire": 1