From a0aa9e22fde2199d62f8555afac0a8150034d2cb Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 27 Sep 2020 23:33:18 +0300 Subject: [PATCH] WIP: smelter --- psd/smelter_gui.psd | Bin 0 -> 71913 bytes .../entities/EndStoneSmelterBlockEntity.java | 150 ++++++++++++++++-- .../betterend/mixin/common/TagAccessor.java | 12 ++ .../betterend/textures/gui/smelter_gui.png | Bin 0 -> 1634 bytes .../resources/betterend.mixins.common.json | 3 +- 5 files changed, 147 insertions(+), 18 deletions(-) create mode 100644 psd/smelter_gui.psd create mode 100644 src/main/java/ru/betterend/mixin/common/TagAccessor.java create mode 100644 src/main/resources/assets/betterend/textures/gui/smelter_gui.png diff --git a/psd/smelter_gui.psd b/psd/smelter_gui.psd new file mode 100644 index 0000000000000000000000000000000000000000..005f83bc3bf989f1b4fcdc16de2cfdcaf1443687 GIT binary patch literal 71913 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 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 0000000000000000000000000000000000000000..a82d38188c10fdc895805e2847b37b7013031037 GIT binary patch literal 1634 zcma)6c~Fyg5dD2IK!}`5P*lXLDhh(21UUo*Dju8yO*mt+DFy`v z3m9Yo(Fln^Lac>|+)W{JBSAU7U`e|JmI)yKi>i&TN94%RyE28Z-bv z^^lW;2LRAQ2mzGhg7Z6{7X*N!{viiD&zOvnE;e=LSF06!PiQ5WP2EZiH_X4TwZYw^ z$$hh3iN3zRP%XhX>&*)NJ?{Cb%-X`7+`F&HFn+#n7c35<_6*$e?#07|6XZWKOeZg! z?g(|hV&PXALFb2z^$X)Ajqyp${iBnzYT>y#wjSIpNx(YuwQNYIr`tO5)}$#x1q*wF zI5sIF(P*@xz2ukKUSfO0hy0L`cy3E0|I#_;NSSrH9#;13`P<>))3A&2mXw;Dir9&K zKR>@Zdjf|!@ALXy|5GdCY^2yJlP2l^CN!kD!v90Dr;{X4=7+J_+uqqhn~9s5#6xQ# z;1wHCNZQ>f8eI+9zIcBCzViHuAD3%s{!ktA`x>!WRj=e2>EE5*eQX z)1RQO1?@A%;bh(0AgnSNE;W$2R&rST0Sk4_eMWv>7k%T~D_DC7vYpTlogWJ%^~7wd zx6<-%kn6@hiq-(0BXhMq+Uk`=%HtAR1la)hev15FAwm;)hRHC!BSwsSnap5?8$C=K z8U=PlTbD$T(W7A#v>@x9I5{cqQF0iZPH{_V6T}&9OYwNECrFBA7mD7Pm1nv_-bm2W zu{XCetV3k*3xmP%t(3(M2dnxZG{UqIHTmgK1$mwn+L071o1JJ~--i>LT#mk@oRPnS z1{en{f1R0`X;>v)L?3M=D1##jwGadhLpJsv1NnmJ=BaUL#Dy_n1}-JB5{KaW_=s0QV0l7SAQJRzlQlukkzMjl z!0C2?w2BTc&6>kvvyu$VodBsLIB79n!0WK;$KTpDMqGUapuD?O2&GeZM~fTshhiJ1mip<)&GtM35OWLaLaMwZcT$k_4~6K`G~ zF8Hn07uBR>N=a0P)G%YtT>q-4cQMbVW_kA&M6v7QsRLhc>7?m!m5o>SayB6dfmfu1 zlMhUm^>Ti8Q7kKTyQsVU@*uCck;BWK-sd1%K?t;KaS&g~%L8w`#?zHR=!5AYdj}vr z^+biu(y}2Y%xiHWn;#v?=;B53YJPlIj)N5->;3d z90F$-90N%qAiz~+fZ7T+q=BUp+(3;j(LZ3WmS*JJ@xzIXa;i`w;_-DrF1u_0r6qGZk5zn@H6|7wf3DDK#hM z165UycuxFtdV`K_v*sxyVI*HOPmKyKwdE4~!y=`uW6s#c?o-o|NRx(MUbE(4j72bT zJebA4$#*`OWnr%P|04c_zJQ@ep<=uK?0yT2P)Pfn&2HpRLPV`c{*H;U5k|rnGU|)C z<8)JySj3Ifp{Eydql!OI|4+)bwyE0+I>M`m9_}0+9YP