diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelLaserRelay.java b/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelLaserRelay.java index d0abbb5c0..72a6aa575 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelLaserRelay.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelLaserRelay.java @@ -10,9 +10,15 @@ package ellpeck.actuallyadditions.blocks.render; +import ellpeck.actuallyadditions.misc.LaserRelayConnectionHandler; +import ellpeck.actuallyadditions.tile.TileEntityLaserRelay; +import ellpeck.actuallyadditions.util.WorldPos; import net.minecraft.client.model.ModelRenderer; +import net.minecraft.tileentity.TileEntity; import org.lwjgl.opengl.GL11; +import java.util.ArrayList; + public class ModelLaserRelay extends ModelBaseAA{ ModelRenderer bottom; @@ -164,6 +170,20 @@ public class ModelLaserRelay extends ModelBaseAA{ covering12.render(f); } + @Override + public void renderExtra(float f, TileEntity tile){ + TileEntityLaserRelay relay = (TileEntityLaserRelay)tile; + WorldPos thisPos = new WorldPos(relay.getWorldObj(), relay.xCoord, relay.yCoord, relay.zCoord); + ArrayList network = LaserRelayConnectionHandler.getInstance().getNetworkFor(thisPos); + if(network != null){ + for(LaserRelayConnectionHandler.ConnectionPair aPair : network){ + if(aPair.contains(thisPos) && aPair.firstRelay.isEqual(thisPos)){ + //TODO Make this work + } + } + } + } + @Override public String getName(){ return "modelLaserRelay"; diff --git a/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java b/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java index 36469c573..55b03d352 100644 --- a/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java +++ b/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java @@ -31,6 +31,7 @@ public class InitEvents{ Util.registerEvent(new BucketFillEvent()); Util.registerEvent(new LogoutEvent()); Util.registerEvent(new EntityConstructingEvent()); + Util.registerEvent(new WorldLoadEvent()); MinecraftForge.TERRAIN_GEN_BUS.register(new WorldDecorationEvent()); } diff --git a/src/main/java/ellpeck/actuallyadditions/event/WorldLoadEvent.java b/src/main/java/ellpeck/actuallyadditions/event/WorldLoadEvent.java new file mode 100644 index 000000000..add130643 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/event/WorldLoadEvent.java @@ -0,0 +1,26 @@ +/* + * This file ("WorldLoadEvent.java") is part of the Actually Additions Mod for Minecraft. + * It is created and owned by Ellpeck and distributed + * under the Actually Additions License to be found at + * http://github.com/Ellpeck/ActuallyAdditions/blob/master/README.md + * View the source code at https://github.com/Ellpeck/ActuallyAdditions + * + * © 2015 Ellpeck + */ + +package ellpeck.actuallyadditions.event; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import ellpeck.actuallyadditions.misc.LaserRelayConnectionHandler; +import net.minecraftforge.event.world.WorldEvent; + +public class WorldLoadEvent{ + + @SubscribeEvent + public void onLoad(WorldEvent.Load event){ + if(LaserRelayConnectionHandler.getInstance() == null){ + LaserRelayConnectionHandler.setInstance(new LaserRelayConnectionHandler()); + } + } + +} diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemLaserWrench.java b/src/main/java/ellpeck/actuallyadditions/items/ItemLaserWrench.java index 96470cf74..d3dd94893 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemLaserWrench.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemLaserWrench.java @@ -35,10 +35,19 @@ public class ItemLaserWrench extends Item implements IActAddItemOrBlock{ this.setMaxStackSize(1); } + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player){ + if(player.isSneaking() && !world.isRemote){ + ItemPhantomConnector.clearStorage(stack); + player.addChatComponentMessage(new ChatComponentText("Storage cleared!")); + } + return stack; + } + @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int par7, float par8, float par9, float par10){ TileEntity tile = world.getTileEntity(x, y, z); - if(tile instanceof TileEntityLaserRelay){ + if(tile instanceof TileEntityLaserRelay && !player.isSneaking()){ if(!world.isRemote){ if(ItemPhantomConnector.getStoredPosition(stack) == null){ ItemPhantomConnector.storeConnection(stack, x, y, z, world); @@ -54,6 +63,9 @@ public class ItemLaserWrench extends Item implements IActAddItemOrBlock{ if(LaserRelayConnectionHandler.getInstance().addConnection(savedPos, otherPos)){ player.addChatComponentMessage(new ChatComponentText("Connected!")); ItemPhantomConnector.clearStorage(stack); + + savedPos.update(); + otherPos.update(); } else{ player.addChatComponentMessage(new ChatComponentText("Couldn't connect!")); diff --git a/src/main/java/ellpeck/actuallyadditions/misc/LaserRelayConnectionHandler.java b/src/main/java/ellpeck/actuallyadditions/misc/LaserRelayConnectionHandler.java index bfe282e96..4a6c84e86 100644 --- a/src/main/java/ellpeck/actuallyadditions/misc/LaserRelayConnectionHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/misc/LaserRelayConnectionHandler.java @@ -14,7 +14,10 @@ import cofh.api.energy.IEnergyReceiver; import ellpeck.actuallyadditions.tile.TileEntityLaserRelay; import ellpeck.actuallyadditions.util.WorldPos; import ellpeck.actuallyadditions.util.WorldUtil; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; @@ -31,12 +34,37 @@ public class LaserRelayConnectionHandler{ public ArrayList> networks = new ArrayList>(); public static LaserRelayConnectionHandler getInstance(){ - if(instance == null){ - instance = new LaserRelayConnectionHandler(); - } return instance; } + public static void setInstance(LaserRelayConnectionHandler i){ + instance = i; + } + + public void writeNetworkToNBT(ArrayList network, NBTTagCompound tag, String name){ + NBTTagCompound compound = new NBTTagCompound(); + compound.setInteger("NetworkSize", network.size()); + + for(int pair = 0; pair < network.size(); pair++){ + network.get(pair).writeToNBT(compound, "Pair"+pair); + } + + tag.setTag(name, compound); + } + + public ArrayList readNetworkFromNBT(NBTTagCompound tag, String name){ + NBTTagCompound compound = tag.getCompoundTag(name); + + int networkSize = compound.getInteger("NetworkSize"); + + ArrayList network = new ArrayList(); + for(int pair = 0; pair < networkSize; pair++){ + network.add(ConnectionPair.readFromNBT(compound, "Pair"+pair)); + } + + return network; + } + /** * Gets a Network for a Relay */ @@ -51,6 +79,21 @@ public class LaserRelayConnectionHandler{ return null; } + /** + * Gets all Connections for a Relay + */ + public ArrayList getConnectionsFor(WorldPos relay){ + ArrayList allPairs = new ArrayList(); + for(ArrayList aNetwork : this.networks){ + for(ConnectionPair pair : aNetwork){ + if(pair.contains(relay)){ + allPairs.add(pair); + } + } + } + return allPairs; + } + /** * Adds a new connection between two relays * (Puts it into the correct network!) @@ -170,5 +213,27 @@ public class LaserRelayConnectionHandler{ public String toString(){ return (this.firstRelay == null ? "-" : this.firstRelay.toString())+" | "+(this.secondRelay == null ? "-" : this.secondRelay.toString()); } + + public void writeToNBT(NBTTagCompound compound, String name){ + for(int i = 0; i < 2; i++){ + WorldPos relay = i == 0 ? this.firstRelay : this.secondRelay; + compound.setInteger("world"+name+i, relay.getWorld().provider.dimensionId); + compound.setInteger("x"+name+i, relay.getX()); + compound.setInteger("y"+name+i, relay.getY()); + compound.setInteger("z"+name+i, relay.getZ()); + } + } + + public static ConnectionPair readFromNBT(NBTTagCompound compound, String name){ + WorldPos[] pos = new WorldPos[2]; + for(int i = 0; i < pos.length; i++){ + World aWorld = DimensionManager.getWorld(compound.getInteger("world"+name+i)); + int anX = compound.getInteger("x"+name+i); + int aY = compound.getInteger("y"+name+i); + int aZ = compound.getInteger("z"+name+i); + pos[i] = new WorldPos(aWorld, anX, aY, aZ); + } + return new ConnectionPair(pos[0], pos[1]); + } } } diff --git a/src/main/java/ellpeck/actuallyadditions/misc/WorldData.java b/src/main/java/ellpeck/actuallyadditions/misc/WorldData.java index b884420f2..b39f9ed3d 100644 --- a/src/main/java/ellpeck/actuallyadditions/misc/WorldData.java +++ b/src/main/java/ellpeck/actuallyadditions/misc/WorldData.java @@ -16,6 +16,8 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.world.World; import net.minecraft.world.WorldSavedData; +import java.util.ArrayList; + public class WorldData extends WorldSavedData{ public static final String DATA_TAG = ModUtil.MOD_ID+"WorldData"; @@ -28,12 +30,25 @@ public class WorldData extends WorldSavedData{ @Override public void readFromNBT(NBTTagCompound compound){ + int netAmount = compound.getInteger("LaserNetworkAmount"); + LaserRelayConnectionHandler.getInstance().networks.clear(); + for(int i = 0; i < netAmount; i++){ + ArrayList network = LaserRelayConnectionHandler.getInstance().readNetworkFromNBT(compound, "LaserNetwork"+i); + if(network != null){ + LaserRelayConnectionHandler.getInstance().networks.add(network); + } + } } @Override public void writeToNBT(NBTTagCompound compound){ + int netAmount = LaserRelayConnectionHandler.getInstance().networks.size(); + compound.setInteger("LaserNetworkAmount", netAmount); + for(int i = 0; i < netAmount; i++){ + LaserRelayConnectionHandler.getInstance().writeNetworkToNBT(LaserRelayConnectionHandler.getInstance().networks.get(i), compound, "LaserNetwork"+i); + } } public static void makeDirty(){ diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java index a1273fc56..babc3bd7c 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java @@ -77,7 +77,9 @@ public abstract class TileEntityBase extends TileEntity{ this.writeSyncableNBT(compound, false); } - public abstract void writeSyncableNBT(NBTTagCompound compound, boolean isForSync); + public void writeSyncableNBT(NBTTagCompound compound, boolean isForSync){ + + } @Override public Packet getDescriptionPacket(){ @@ -96,7 +98,9 @@ public abstract class TileEntityBase extends TileEntity{ return !(oldBlock.isAssociatedBlock(newBlock)); } - public abstract void readSyncableNBT(NBTTagCompound compound, boolean isForSync); + public void readSyncableNBT(NBTTagCompound compound, boolean isForSync){ + + } protected void sendUpdate(){ this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLaserRelay.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLaserRelay.java index 7564dd80f..332239367 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLaserRelay.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLaserRelay.java @@ -14,6 +14,9 @@ import cofh.api.energy.IEnergyReceiver; import ellpeck.actuallyadditions.misc.LaserRelayConnectionHandler; import ellpeck.actuallyadditions.util.WorldPos; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; @@ -34,13 +37,33 @@ public class TileEntityLaserRelay extends TileEntityBase implements IEnergyRecei } @Override - public void writeSyncableNBT(NBTTagCompound compound, boolean isForSync){ + public Packet getDescriptionPacket(){ + NBTTagCompound compound = new NBTTagCompound(); + WorldPos thisPos = new WorldPos(this.worldObj, this.xCoord, this.yCoord, this.zCoord); + ArrayList connections = LaserRelayConnectionHandler.getInstance().getConnectionsFor(thisPos); + + if(connections != null){ + compound.setInteger("ConnectionAmount", connections.size()); + for(int i = 0; i < connections.size(); i++){ + connections.get(i).writeToNBT(compound, "Connection"+i); + } + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 3, compound); + } + return null; } @Override - public void readSyncableNBT(NBTTagCompound compound, boolean isForSync){ + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt){ + NBTTagCompound compound = pkt.func_148857_g(); + LaserRelayConnectionHandler.getInstance().removeRelayFromNetwork(new WorldPos(this.worldObj, this.xCoord, this.yCoord, this.zCoord)); + + int amount = compound.getInteger("ConnectionAmount"); + for(int i = 0; i < amount; i++){ + LaserRelayConnectionHandler.ConnectionPair pair = LaserRelayConnectionHandler.ConnectionPair.readFromNBT(compound, "Connection"+i); + LaserRelayConnectionHandler.getInstance().addConnection(pair.firstRelay, pair.secondRelay); + } } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomBooster.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomBooster.java index fc34ec51e..04e6d7828 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomBooster.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomBooster.java @@ -10,22 +10,10 @@ package ellpeck.actuallyadditions.tile; -import net.minecraft.nbt.NBTTagCompound; - public class TileEntityPhantomBooster extends TileEntityBase{ @Override public boolean canUpdate(){ return false; } - - @Override - public void writeSyncableNBT(NBTTagCompound compound, boolean isForSync){ - - } - - @Override - public void readSyncableNBT(NBTTagCompound compound, boolean isForSync){ - - } } diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldPos.java b/src/main/java/ellpeck/actuallyadditions/util/WorldPos.java index 6c7a92934..5e40a4c8a 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldPos.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldPos.java @@ -51,7 +51,13 @@ public class WorldPos{ } public boolean isEqual(WorldPos pos){ - return pos != null && this.x == pos.getX() && this.y == pos.getY() && this.z == pos.getZ() && this.world == pos.getWorld(); + return pos != null && this.x == pos.getX() && this.y == pos.getY() && this.z == pos.getZ() && (this.world == pos.getWorld() || ((world.isRemote || pos.getWorld().isRemote) && this.world.provider.dimensionId == pos.getWorld().provider.dimensionId)); + } + + public void update(){ + if(this.world != null){ + this.world.markBlockForUpdate(this.x, this.y, this.z); + } } public int getX(){