diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSContainers.java b/src/main/java/com/raoulvdberge/refinedstorage/RSContainers.java index 181d13956..755d569b3 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSContainers.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSContainers.java @@ -1,7 +1,10 @@ package com.raoulvdberge.refinedstorage; import com.raoulvdberge.refinedstorage.container.*; +import com.raoulvdberge.refinedstorage.container.factory.TileContainerFactory; import net.minecraft.inventory.container.ContainerType; +import net.minecraftforge.common.extensions.IForgeContainerType; +import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.registries.ObjectHolder; public final class RSContainers { @@ -53,4 +56,8 @@ public final class RSContainers { public static final ContainerType STORAGE_MONITOR = null; @ObjectHolder(RS.ID + ":wireless_transmitter") public static final ContainerType WIRELESS_TRANSMITTER = null; + + public void registerContainers(final RegistryEvent.Register> event) { + event.getRegistry().register(IForgeContainerType.create(new TileContainerFactory<>((ContainerConstructor::new))).setRegistryName(RS.ID, "constructor")); + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/factory/TileContainerFactory.java b/src/main/java/com/raoulvdberge/refinedstorage/container/factory/TileContainerFactory.java new file mode 100644 index 000000000..cee84fc96 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/factory/TileContainerFactory.java @@ -0,0 +1,30 @@ +package com.raoulvdberge.refinedstorage.container.factory; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.network.IContainerFactory; + +public class TileContainerFactory implements IContainerFactory { + public interface Provider { + C create(T tile, PlayerEntity player, int windowId); + } + + private Provider provider; + + public TileContainerFactory(Provider provider) { + this.provider = provider; + } + + @Override + public C create(int windowId, PlayerInventory inv, PacketBuffer data) { + int x = data.readInt(); + int y = data.readInt(); + int z = data.readInt(); + + return this.provider.create((T) inv.player.world.getTileEntity(new BlockPos(x, y, z)), inv.player, windowId); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java index a5bb73c83..afa1df68f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java @@ -8,6 +8,7 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SUpdateTileEntityPacket; import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraftforge.items.IItemHandler; @@ -20,6 +21,10 @@ public abstract class TileBase extends TileEntity { protected IDirectionHandler directionHandler = new DirectionHandlerTile(); protected TileDataManager dataManager = new TileDataManager(this); + public TileBase(TileEntityType tileType) { + super(tileType); + } + public void setDirection(Direction direction) { clientDirection = direction; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java index cbb307576..542042d03 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java @@ -6,18 +6,18 @@ import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeProxy; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.network.node.ICoverable; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode; -import com.raoulvdberge.refinedstorage.apiimpl.util.OneSixMigrationHelper; import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.tile.config.IRedstoneConfigurable; import com.raoulvdberge.refinedstorage.tile.config.RedstoneMode; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import com.raoulvdberge.refinedstorage.tile.direction.DirectionHandlerNetworkNode; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; +import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; import javax.annotation.Nonnull; @@ -31,7 +31,11 @@ public abstract class TileNode extends TileBase implement private N clientNode; - public TileNode() { + private LazyOptional> networkNodeProxy = LazyOptional.of(() -> this); + + public TileNode(TileEntityType tileType) { + super(tileType); + directionHandler = new DirectionHandlerNetworkNode(this); dataManager.addWatchedParameter(REDSTONE_MODE); @@ -62,25 +66,13 @@ public abstract class TileNode extends TileBase implement public void readUpdate(CompoundNBT tag) { super.readUpdate(tag); - if (getNode() instanceof ICoverable && tag.hasKey(NBT_COVERS)) { + if (getNode() instanceof ICoverable && tag.contains(NBT_COVERS)) { ((ICoverable) getNode()).getCoverManager().readFromNbt(tag.getList(NBT_COVERS, Constants.NBT.TAG_COMPOUND)); } getNode().setActive(tag.getBoolean(NBT_ACTIVE)); } - private Direction directionToMigrate; - - @Override - public void read(CompoundNBT tag) { - super.read(tag); - - OneSixMigrationHelper.removalHook(); - if (tag.hasKey(NBT_DIRECTION)) { - directionToMigrate = Direction.byIndex(tag.getInteger("Direction")); - } - } - @Override @Nullable public IItemHandler getDrops() { @@ -108,15 +100,6 @@ public abstract class TileNode extends TileBase implement manager.markForSaving(); } - OneSixMigrationHelper.removalHook(); - if (directionToMigrate != null) { - ((NetworkNode) node).setDirection(directionToMigrate); - - directionToMigrate = null; - - markDirty(); - } - return (N) node; } @@ -124,21 +107,13 @@ public abstract class TileNode extends TileBase implement public abstract String getNodeId(); + @Nonnull @Override - public boolean hasCapability(@Nonnull Capability capability, @Nullable Direction side) { - if (capability == CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY) { - return true; + public LazyOptional getCapability(@Nonnull Capability cap) { + if (cap == CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY) { + return networkNodeProxy.cast(); } - return super.hasCapability(capability, side); - } - - @Override - public T getCapability(@Nonnull Capability capability, @Nullable Direction side) { - if (capability == CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY) { - return CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY.cast(this); - } - - return super.getCapability(capability, side); + return super.getCapability(cap); } }