Просмотр исходного кода

铁砧使用类似箱子的储存代码了

LTCatt 6 лет назад
Родитель
Сommit
6beadf0c45

+ 0 - 23
src/main/java/com/hexdragon/core/item/CraftInputInventory.java

@@ -1,23 +0,0 @@
-package com.hexdragon.core.item;
-
-import net.minecraft.inventory.Inventory;
-import net.minecraft.inventory.container.Container;
-import net.minecraft.item.ItemStack;
-
-// 在触发 markDirty 时触发 onCraftMatrixChanged 的 Inventory
-public class CraftInputInventory extends Inventory {
-
-    public CraftInputInventory(int numSlots) {
-        super(numSlots);
-    }
-    public CraftInputInventory(ItemStack... stacksIn) {
-        super(stacksIn);
-    }
-
-    public Container container = null;
-    public void markDirty() {
-        super.markDirty();
-        if (container != null) container.onCraftMatrixChanged(this);
-    }
-
-}

+ 4 - 3
src/main/java/com/hexdragon/enchrebirth/block/anvil/AnvilContainerRe.java

@@ -1,6 +1,5 @@
 package com.hexdragon.enchrebirth.block.anvil;
 package com.hexdragon.enchrebirth.block.anvil;
 
 
-import com.hexdragon.core.item.CraftInputInventory;
 import com.hexdragon.core.item.EnchantmentHelperRe;
 import com.hexdragon.core.item.EnchantmentHelperRe;
 import com.hexdragon.core.item.ItemHelperRe;
 import com.hexdragon.core.item.ItemHelperRe;
 import com.hexdragon.enchrebirth.registry.RegMain;
 import com.hexdragon.enchrebirth.registry.RegMain;
@@ -12,6 +11,7 @@ import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.entity.player.PlayerInventory;
 import net.minecraft.entity.player.PlayerInventory;
 import net.minecraft.inventory.CraftResultInventory;
 import net.minecraft.inventory.CraftResultInventory;
 import net.minecraft.inventory.IInventory;
 import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Inventory;
 import net.minecraft.inventory.container.Container;
 import net.minecraft.inventory.container.Container;
 import net.minecraft.inventory.container.Slot;
 import net.minecraft.inventory.container.Slot;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.ItemStack;
@@ -35,12 +35,13 @@ public class AnvilContainerRe extends Container {
         super(RegMain.containerAnvil.get(), id);
         super(RegMain.containerAnvil.get(), id);
         this.worldPosCallable = worldPosCallable;
         this.worldPosCallable = worldPosCallable;
         this.player = playerInventory.player;
         this.player = playerInventory.player;
-        worldPosCallable.consume((world, blockPos) -> this.inputInventory = ((AnvilTileEntity) world.getTileEntity(blockPos)).inventory); // 与 NBT 中的物品栏同步
+        worldPosCallable.consume((world, blockPos) -> this.inputInventory = (AnvilTileEntity) world.getTileEntity(blockPos)); // 与 NBT 中的物品栏同步
         Constuct(playerInventory);
         Constuct(playerInventory);
+        onCraftMatrixChanged(inputInventory);
     }
     }
 
 
     // 输入与输出物品槽
     // 输入与输出物品槽
-    public CraftInputInventory inputInventory = new CraftInputInventory(2);
+    public IInventory inputInventory = new Inventory(2);
     public final CraftResultInventory outputInventory = new CraftResultInventory();
     public final CraftResultInventory outputInventory = new CraftResultInventory();
 
 
     // 构造页面槽位
     // 构造页面槽位

+ 7 - 12
src/main/java/com/hexdragon/enchrebirth/block/anvil/AnvilRenderer.java

@@ -9,7 +9,6 @@ import net.minecraft.client.renderer.model.ItemCameraTransforms;
 import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
 import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
 import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
 import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.ItemStack;
-import net.minecraft.item.Items;
 import net.minecraft.util.math.vector.Quaternion;
 import net.minecraft.util.math.vector.Quaternion;
 
 
 // 渲染铁砧中存储的物品
 // 渲染铁砧中存储的物品
@@ -17,30 +16,26 @@ public class AnvilRenderer extends TileEntityRenderer<AnvilTileEntity> {
     public AnvilRenderer(TileEntityRendererDispatcher rendererDispatcherIn) { super(rendererDispatcherIn); }
     public AnvilRenderer(TileEntityRendererDispatcher rendererDispatcherIn) { super(rendererDispatcherIn); }
 
 
     @Override public void render(AnvilTileEntity tileEntityIn, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int combinedLightIn, int combinedOverlayIn) {
     @Override public void render(AnvilTileEntity tileEntityIn, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int combinedLightIn, int combinedOverlayIn) {
-        //        matrixStackIn.push();
-        //        matrixStackIn.translate(1, 0, 0);
-        //        BlockRendererDispatcher blockRenderer = Minecraft.getInstance().getBlockRendererDispatcher();
-        //        BlockState state = Blocks.CHEST.getDefaultState();
-        //        blockRenderer.renderBlock(state, matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn, EmptyModelData.INSTANCE);
-        //        matrixStackIn.pop();
+        AnvilContainerRe container = (AnvilContainerRe) tileEntityIn.container;
+        if (container == null) return;
         ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer();
         ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer();
 
 
         // 渲染左侧的物品
         // 渲染左侧的物品
-        ItemStack stackLeft = new ItemStack(Items.DIAMOND); //tileEntityIn.inventory.getStackInSlot(0);
+        ItemStack stackLeft = container.inputInventory.getStackInSlot(0);
         if (!stackLeft.isEmpty()) {
         if (!stackLeft.isEmpty()) {
             matrixStackIn.push();
             matrixStackIn.push();
-            matrixStackIn.translate(1, 3, 0);
+            matrixStackIn.translate(2, 1.01, 0);
             IBakedModel ibakedmodel = itemRenderer.getItemModelWithOverrides(stackLeft, tileEntityIn.getWorld(), null);
             IBakedModel ibakedmodel = itemRenderer.getItemModelWithOverrides(stackLeft, tileEntityIn.getWorld(), null);
             itemRenderer.renderItem(stackLeft, ItemCameraTransforms.TransformType.FIXED, true, matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn, ibakedmodel);
             itemRenderer.renderItem(stackLeft, ItemCameraTransforms.TransformType.FIXED, true, matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn, ibakedmodel);
             matrixStackIn.pop();
             matrixStackIn.pop();
         }
         }
 
 
         // 渲染右侧的物品
         // 渲染右侧的物品
-        ItemStack stackRight = new ItemStack(Items.ACACIA_LOG); //tileEntityIn.inventory.getStackInSlot(1);
+        ItemStack stackRight = container.inputInventory.getStackInSlot(1);
         if (!stackRight.isEmpty()) {
         if (!stackRight.isEmpty()) {
             matrixStackIn.push();
             matrixStackIn.push();
-            matrixStackIn.translate(0, 3, 0);
-            matrixStackIn.rotate(new Quaternion(0, 0, 1, 1));
+            matrixStackIn.translate(0, 1.01, 0);
+            matrixStackIn.rotate(new Quaternion(0, 1, 1, (float) Math.PI));
             IBakedModel ibakedmodel = itemRenderer.getItemModelWithOverrides(stackRight, tileEntityIn.getWorld(), null);
             IBakedModel ibakedmodel = itemRenderer.getItemModelWithOverrides(stackRight, tileEntityIn.getWorld(), null);
             itemRenderer.renderItem(stackRight, ItemCameraTransforms.TransformType.FIXED, true, matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn, ibakedmodel);
             itemRenderer.renderItem(stackRight, ItemCameraTransforms.TransformType.FIXED, true, matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn, ibakedmodel);
             matrixStackIn.pop();
             matrixStackIn.pop();

+ 79 - 24
src/main/java/com/hexdragon/enchrebirth/block/anvil/AnvilTileEntity.java

@@ -1,48 +1,103 @@
 package com.hexdragon.enchrebirth.block.anvil;
 package com.hexdragon.enchrebirth.block.anvil;
 
 
-import com.hexdragon.core.item.CraftInputInventory;
 import com.hexdragon.enchrebirth.registry.RegMain;
 import com.hexdragon.enchrebirth.registry.RegMain;
-import com.sun.istack.internal.Nullable;
 import net.minecraft.block.BlockState;
 import net.minecraft.block.BlockState;
-import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.entity.player.PlayerInventory;
 import net.minecraft.entity.player.PlayerInventory;
+import net.minecraft.inventory.ItemStackHelper;
 import net.minecraft.inventory.container.Container;
 import net.minecraft.inventory.container.Container;
-import net.minecraft.inventory.container.INamedContainerProvider;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.ItemStack;
 import net.minecraft.nbt.CompoundNBT;
 import net.minecraft.nbt.CompoundNBT;
-import net.minecraft.tileentity.TileEntity;
+import net.minecraft.tileentity.LockableLootTileEntity;
 import net.minecraft.util.IWorldPosCallable;
 import net.minecraft.util.IWorldPosCallable;
+import net.minecraft.util.NonNullList;
 import net.minecraft.util.text.ITextComponent;
 import net.minecraft.util.text.ITextComponent;
 import net.minecraft.util.text.TranslationTextComponent;
 import net.minecraft.util.text.TranslationTextComponent;
 
 
 // 铁砧 TileEntity,用于引导自定义模型与存储物品 NBT
 // 铁砧 TileEntity,用于引导自定义模型与存储物品 NBT
-public class AnvilTileEntity extends TileEntity implements INamedContainerProvider {
+public class AnvilTileEntity extends LockableLootTileEntity {
     public AnvilTileEntity() {
     public AnvilTileEntity() {
         super(RegMain.tileEntityAnvil.get());
         super(RegMain.tileEntityAnvil.get());
     }
     }
-    @Override public ITextComponent getDisplayName() {
-        return new TranslationTextComponent("block.minecraft.anvil");
+
+    public Container container = null;
+    public void markDirty() {
+        super.markDirty();
+        if (container != null) container.onCraftMatrixChanged(this);
     }
     }
 
 
-    // 内建物品栏
-    public final CraftInputInventory inventory = new CraftInputInventory(2);
-    @Nullable @Override public Container createMenu(int sycID, PlayerInventory inventory, PlayerEntity player) {
-        // 与 Container 同步物品栏
-        AnvilContainerRe container = new AnvilContainerRe(sycID, inventory, IWorldPosCallable.of(this.world, this.pos));
-        this.inventory.container = container;
-        return container;
+    public NonNullList<ItemStack> contents = NonNullList.withSize(2, ItemStack.EMPTY);
+
+    public CompoundNBT write(CompoundNBT compound) {
+        super.write(compound);
+        if (!this.checkLootAndWrite(compound)) {
+            ItemStackHelper.saveAllItems(compound, this.contents);
+        }
+
+        return compound;
     }
     }
 
 
-    // 将物品栏 NBT 化
-    @Override public void read(BlockState state, CompoundNBT compound) {
-        inventory.setInventorySlotContents(0, ItemStack.read(compound.getCompound("ItemLeft")));
-        inventory.setInventorySlotContents(1, ItemStack.read(compound.getCompound("ItemRight")));
-        super.read(null, compound);
+    public void read(BlockState state, CompoundNBT nbt) {
+        super.read(state, nbt);
+        this.contents = NonNullList.withSize(this.getSizeInventory(), ItemStack.EMPTY);
+        if (!this.checkLootAndRead(nbt)) {
+            ItemStackHelper.loadAllItems(nbt, this.contents);
+        }
+
     }
     }
-    @Override public CompoundNBT write(CompoundNBT compound) {
-        compound.put("ItemLeft", inventory.getStackInSlot(0).serializeNBT());
-        compound.put("ItemRight", inventory.getStackInSlot(1).serializeNBT());
-        return super.write(compound);
+
+    /**
+     * Returns the number of slots in the inventory.
+     */
+    public int getSizeInventory() {
+        return 2;
+    }
+
+    protected NonNullList<ItemStack> getItems() {
+        return this.contents;
+    }
+
+    protected void setItems(NonNullList<ItemStack> itemsIn) {
+        this.contents = itemsIn;
     }
     }
 
 
+    protected ITextComponent getDefaultName() {
+        return new TranslationTextComponent("block.minecraft.anvil");
+    }
+
+    protected Container createMenu(int id, PlayerInventory player) {
+        AnvilContainerRe container = new AnvilContainerRe(id, player, IWorldPosCallable.of(this.world, this.pos));
+        this.container = container;
+        return container;
+        // return ChestContainer.createGeneric9X3(id, player, this);
+    }
+
+
+    // TODO : 检查红石信号输出
+
+
+//    @Override public ITextComponent getDisplayName() {
+//        return new TranslationTextComponent("block.minecraft.anvil");
+//    }
+//
+//    // 内建物品栏
+//    public final CraftInputInventory inventory = new CraftInputInventory(2);
+//    @Nullable @Override public Container createMenu(int sycID, PlayerInventory inventory, PlayerEntity player) {
+//        // 与 Container 同步物品栏
+//        AnvilContainerRe container = new AnvilContainerRe(sycID, inventory, IWorldPosCallable.of(this.world, this.pos));
+//        this.inventory.container = container;
+//        return container;
+//    }
+//
+//    // 将物品栏 NBT 化
+//    @Override public void read(BlockState state, CompoundNBT compound) {
+//        inventory.setInventorySlotContents(0, ItemStack.read(compound.getCompound("ItemLeft")));
+//        inventory.setInventorySlotContents(1, ItemStack.read(compound.getCompound("ItemRight")));
+//        super.read(null, compound);
+//    }
+//    @Override public CompoundNBT write(CompoundNBT compound) {
+//        compound.put("ItemLeft", inventory.getStackInSlot(0).serializeNBT());
+//        compound.put("ItemRight", inventory.getStackInSlot(1).serializeNBT());
+//        return super.write(compound);
+//    }
+
 }
 }