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

+ 15 - 5
src/main/java/com/hexdragon/enchrebirth/block/anvil/AnvilTileEntity.java

@@ -8,17 +8,24 @@ import net.minecraft.entity.player.PlayerInventory;
 import net.minecraft.inventory.ItemStackHelper;
 import net.minecraft.inventory.container.Container;
 import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
 import net.minecraft.nbt.CompoundNBT;
 import net.minecraft.network.NetworkManager;
 import net.minecraft.network.play.server.SUpdateTileEntityPacket;
 import net.minecraft.tileentity.LockableLootTileEntity;
 import net.minecraft.tileentity.TileEntityType;
+import net.minecraft.util.Direction;
 import net.minecraft.util.IWorldPosCallable;
 import net.minecraft.util.NonNullList;
 import net.minecraft.util.text.ITextComponent;
 import net.minecraft.util.text.TranslationTextComponent;
+import net.minecraftforge.common.capabilities.Capability;
 import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.LazyOptional;
+import net.minecraftforge.items.CapabilityItemHandler;
+import net.minecraftforge.items.ItemStackHandler;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 // 铁砧 TileEntity,用于引导自定义模型与存储物品 NBT
@@ -91,20 +98,23 @@ public class AnvilTileEntity extends LockableLootTileEntity {
     }
 
     // TODO : [难顶] 让漏斗只能从上方注入物品(由于 Forge 接管了漏斗代码,需要使用它的 Capability,什么 SidedInventory 不管用),不过这个写起来还是不太对的样子
-    /*@Nonnull @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
+    @Nonnull @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
         if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
             return LazyOptional.of(() -> new ItemStackHandler() {
                 @Override public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) {
-                    if (side != Direction.UP) return ItemStack.EMPTY;
-                    return super.insertItem(slot, stack, simulate);
+                    if (side == Direction.UP) {
+                        return new ItemStack(Items.APPLE);
+                    } else {
+                        return stack;
+                    }
                 }
             }).cast();
         }
         return super.getCapability(cap, side);
-    }*/
+    }
 
     // TODO : 让目前的机制修改根据游戏难度略有变化
-    // TODO : 由于目前的铁砧判断方式,它现在不接受线,因为线有对应的方块……
+    // TODO : 由于目前的铁砧判断方式,它现在不接受线,因为线有对应的方块……是不是有一个 tag 可以解决这个问题?
     // TODO : 让铁砧可以根据物品栏里的物品数量向比较器输出红石信号
 
 }

+ 6 - 3
src/main/java/com/hexdragon/enchrebirth/block/grindstone/GrindstoneContainerRe.java

@@ -105,7 +105,6 @@ public class GrindstoneContainerRe extends Container {
         this.detectAndSendChanges();
     }
 
-    // TODO : [难顶] 打开砂轮物品栏时关闭游戏,会在重新上线后掉落包括输入和输出预览的全部物品(看起来是从服务端触发的,破坏方块什么的都不会出这个问题)
     // TODO : 将铁砧、砂轮、命名牌 GUI 左侧的图片对应换成渲染的物品模型
     // TODO : 添加方块的使用音效、命名牌的重命名音效什么的
 
@@ -130,8 +129,12 @@ public class GrindstoneContainerRe extends Container {
     public void onContainerClosed(PlayerEntity playerIn) {
         super.onContainerClosed(playerIn);
         // 如果输入为空则返还输出,如果输出为空则返还输入
-        this.worldPosCallable.consume((p_217009_2_, p_217009_3_) -> this.clearContainer(playerIn, p_217009_2_,
-                this.inputInventory.isEmpty() ? this.outputInventory : this.inputInventory));
+        this.worldPosCallable.consume((world, pos) -> {
+            this.clearContainer(playerIn, world, this.inputInventory.isEmpty() ? this.outputInventory : this.inputInventory);
+            // 在服务器关闭时会连续调用两次 onContainerClosed,所以需要确保在第一次调用后清空全部物品栏
+            this.inputInventory.clear();
+            this.outputInventory.clear();
+        });
     }
 
     // 接口: 当玩家使用 Shift+左键 快速转移物品时触发,需要尝试转移物品

+ 1 - 1
src/main/java/com/hexdragon/enchrebirth/mixin/block/AnvilBlockMixin.java

@@ -97,7 +97,7 @@ public abstract class AnvilBlockMixin extends FallingBlock implements IForgeBloc
         }
     }
 
-    // TODO : [难顶] 下界合金砧的 GUI 打不开,准确的说是客户端打开了但是服务端又把它关掉了,鬼知道为啥
+    // TODO : 为下界合金砧注册 ANVIL 的 tag
     // TODO : 破坏下界合金砧没有掉落物
 
 }

+ 1 - 0
src/main/java/com/hexdragon/enchrebirth/registry/RegClient.java

@@ -31,6 +31,7 @@ public class RegClient {
         ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityDamagedNetheriteAnvil.get(), (AnvilRenderer::new));
     }
 
+
     //    @SubscribeEvent public static void onCommonSetup(FMLCommonSetupEvent event) {
     //        // 注册数据包
     //        Networking.registerMessage();