diff --git a/src/resonantinduction/PacketHandler.java b/src/resonantinduction/PacketHandler.java index 3b022b19..b6acc911 100644 --- a/src/resonantinduction/PacketHandler.java +++ b/src/resonantinduction/PacketHandler.java @@ -5,6 +5,7 @@ package resonantinduction; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; +import java.util.ArrayList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.INetworkManager; @@ -52,6 +53,19 @@ public class PacketHandler implements IPacketHandler ((IPacketReceiver) tileEntity).handle(dataStream); } } + else if (packetType == PacketType.DATA_REQUEST.ordinal()) + { + int x = dataStream.readInt(); + int y = dataStream.readInt(); + int z = dataStream.readInt(); + + TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + + if (tileEntity instanceof IPacketReceiver) + { + sendTileEntityPacketToClients(tileEntity, ((IPacketReceiver) tileEntity).getNetworkedData(new ArrayList()).toArray()); + } + } } catch (Exception e) { @@ -90,12 +104,40 @@ public class PacketHandler implements IPacketHandler { output.writeByte((Byte) data); } + else if (data instanceof Object[]) + { + encode((Object[])data, output); + } } } catch (Exception e) { } } + + public static void sendDataRequest(TileEntity tileEntity) + { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + DataOutputStream data = new DataOutputStream(bytes); + + try + { + data.writeInt(PacketType.DATA_REQUEST.ordinal()); + data.writeInt(tileEntity.xCoord); + data.writeInt(tileEntity.yCoord); + data.writeInt(tileEntity.zCoord); + } + catch (Exception e) + { + } + + Packet250CustomPayload packet = new Packet250CustomPayload(); + packet.channel = ResonantInduction.CHANNEL; + packet.data = bytes.toByteArray(); + packet.length = packet.data.length; + + PacketDispatcher.sendPacketToServer(packet); + } public static void sendTileEntityPacketToServer(TileEntity tileEntity, Object... dataValues) { @@ -135,6 +177,7 @@ public class PacketHandler implements IPacketHandler public static enum PacketType { - TILE + TILE, + DATA_REQUEST } } diff --git a/src/resonantinduction/ResonantInduction.java b/src/resonantinduction/ResonantInduction.java index fe79fb19..615f14fc 100644 --- a/src/resonantinduction/ResonantInduction.java +++ b/src/resonantinduction/ResonantInduction.java @@ -10,6 +10,7 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.common.Configuration; import net.minecraftforge.oredict.ShapedOreRecipe; import resonantinduction.contractor.BlockEMContractor; +import resonantinduction.contractor.ItemBlockContractor; import resonantinduction.contractor.TileEntityEMContractor; import resonantinduction.entangler.ItemQuantumEntangler; import resonantinduction.tesla.BlockTesla; @@ -125,7 +126,7 @@ public class ResonantInduction GameRegistry.registerBlock(blockTesla, blockTesla.getUnlocalizedName()); blockEMContractor = new BlockEMContractor(getNextBlockID()); - GameRegistry.registerBlock(blockEMContractor, blockEMContractor.getUnlocalizedName()); + GameRegistry.registerBlock(blockEMContractor, ItemBlockContractor.class, blockEMContractor.getUnlocalizedName()); CONFIGURATION.save(); diff --git a/src/resonantinduction/base/IPacketReceiver.java b/src/resonantinduction/base/IPacketReceiver.java index 12683075..781fbc0b 100644 --- a/src/resonantinduction/base/IPacketReceiver.java +++ b/src/resonantinduction/base/IPacketReceiver.java @@ -1,8 +1,12 @@ package resonantinduction.base; +import java.util.ArrayList; + import com.google.common.io.ByteArrayDataInput; public interface IPacketReceiver { public void handle(ByteArrayDataInput input); + + public ArrayList getNetworkedData(ArrayList data); } diff --git a/src/resonantinduction/contractor/BlockEMContractor.java b/src/resonantinduction/contractor/BlockEMContractor.java index ee870684..dd4f9389 100644 --- a/src/resonantinduction/contractor/BlockEMContractor.java +++ b/src/resonantinduction/contractor/BlockEMContractor.java @@ -2,9 +2,12 @@ package resonantinduction.contractor; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; import resonantinduction.ResonantInduction; @@ -28,26 +31,6 @@ public class BlockEMContractor extends BlockBase implements ITileEntityProvider return BlockRenderingHandler.INSTANCE.getRenderId(); } - @Override - public void onBlockAdded(World world, int x, int y, int z) - { - TileEntityEMContractor tileContractor = (TileEntityEMContractor)world.getBlockTileEntity(x, y, z); - tileContractor.updateBounds(); - - if(!tileContractor.isLatched()) - { - for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) - { - TileEntity tileEntity = world.getBlockTileEntity(x+side.offsetX, y+side.offsetY, z+side.offsetZ); - - if(tileEntity instanceof IInventory) - { - tileContractor.setFacing(side.getOpposite()); - } - } - } - } - @Override public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { @@ -69,7 +52,7 @@ public class BlockEMContractor extends BlockBase implements ITileEntityProvider { TileEntityEMContractor tileContractor = (TileEntityEMContractor)world.getBlockTileEntity(x, y, z); - if(!tileContractor.isLatched()) + if(!world.isRemote && !tileContractor.isLatched()) { for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { @@ -78,6 +61,7 @@ public class BlockEMContractor extends BlockBase implements ITileEntityProvider if(tileEntity instanceof IInventory) { tileContractor.setFacing(side.getOpposite()); + return; } } } diff --git a/src/resonantinduction/contractor/ItemBlockContractor.java b/src/resonantinduction/contractor/ItemBlockContractor.java new file mode 100644 index 00000000..9ca49d3e --- /dev/null +++ b/src/resonantinduction/contractor/ItemBlockContractor.java @@ -0,0 +1,45 @@ +package resonantinduction.contractor; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; + +public class ItemBlockContractor extends ItemBlock +{ + public ItemBlockContractor(int id) + { + super(id); + } + + @Override + public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata) + { + boolean place = super.placeBlockAt(stack, player, world, x, y, z, side, hitX, hitY, hitZ, metadata); + + if(place) + { + TileEntityEMContractor tileContractor = (TileEntityEMContractor)world.getBlockTileEntity(x, y, z); + tileContractor.setFacing(ForgeDirection.getOrientation(side)); + + if(!tileContractor.isLatched()) + { + for(ForgeDirection side1 : ForgeDirection.VALID_DIRECTIONS) + { + TileEntity tileEntity = world.getBlockTileEntity(x+side1.offsetX, y+side1.offsetY, z+side1.offsetZ); + + if(tileEntity instanceof IInventory) + { + tileContractor.setFacing(side1.getOpposite()); + break; + } + } + } + } + + return place; + } +} diff --git a/src/resonantinduction/contractor/TileEntityEMContractor.java b/src/resonantinduction/contractor/TileEntityEMContractor.java index 9fad87d3..e2a8d7ee 100644 --- a/src/resonantinduction/contractor/TileEntityEMContractor.java +++ b/src/resonantinduction/contractor/TileEntityEMContractor.java @@ -1,7 +1,13 @@ package resonantinduction.contractor; +import java.util.ArrayList; import java.util.List; +import com.google.common.io.ByteArrayDataInput; + +import resonantinduction.PacketHandler; +import resonantinduction.base.IPacketReceiver; + import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.inventory.IInventory; @@ -10,7 +16,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.ForgeDirection; -public class TileEntityEMContractor extends TileEntity +public class TileEntityEMContractor extends TileEntity implements IPacketReceiver { public static int MAX_REACH = 40; public static double MAX_SPEED = .1; @@ -88,63 +94,6 @@ public class TileEntityEMContractor extends TileEntity entityItem.isAirBorne = true; break; case NORTH: - if(!worldObj.isRemote) - { - entityItem.setPosition(entityItem.posX, yCoord+0.5, zCoord+0.5); - } - - entityItem.motionY = 0; - entityItem.motionZ = 0; - - if(!suck) - { - entityItem.motionX = Math.min(MAX_SPEED, entityItem.motionX+ACCELERATION); - } - else { - entityItem.motionX = Math.max(-MAX_SPEED, entityItem.motionX-ACCELERATION); - } - - entityItem.isAirBorne = true; - break; - case SOUTH: - if(!worldObj.isRemote) - { - entityItem.setPosition(entityItem.posX, yCoord+0.5, zCoord+0.5); - } - - entityItem.motionY = 0; - entityItem.motionZ = 0; - - if(!suck) - { - entityItem.motionX = Math.max(-MAX_SPEED, entityItem.motionX-ACCELERATION); - } - else { - entityItem.motionX = Math.min(MAX_SPEED, entityItem.motionX+ACCELERATION); - } - - entityItem.isAirBorne = true; - break; - case WEST: - if(!worldObj.isRemote) - { - entityItem.setPosition(xCoord+0.5, yCoord+0.5, entityItem.posZ); - } - - entityItem.motionX = 0; - entityItem.motionY = 0; - - if(!suck) - { - entityItem.motionZ = Math.min(MAX_SPEED, entityItem.motionZ+ACCELERATION); - } - else { - entityItem.motionZ = Math.max(-MAX_SPEED, entityItem.motionZ-ACCELERATION); - } - - entityItem.isAirBorne = true; - break; - case EAST: if(!worldObj.isRemote) { entityItem.setPosition(xCoord+0.5, yCoord+0.5, entityItem.posZ); @@ -161,6 +110,63 @@ public class TileEntityEMContractor extends TileEntity entityItem.motionZ = Math.min(MAX_SPEED, entityItem.motionZ+ACCELERATION); } + entityItem.isAirBorne = true; + break; + case SOUTH: + if(!worldObj.isRemote) + { + entityItem.setPosition(xCoord+0.5, yCoord+0.5, entityItem.posZ); + } + + entityItem.motionX = 0; + entityItem.motionY = 0; + + if(!suck) + { + entityItem.motionZ = Math.min(MAX_SPEED, entityItem.motionZ+ACCELERATION); + } + else { + entityItem.motionZ = Math.max(-MAX_SPEED, entityItem.motionZ-ACCELERATION); + } + + entityItem.isAirBorne = true; + break; + case WEST: + if(!worldObj.isRemote) + { + entityItem.setPosition(entityItem.posX, yCoord+0.5, zCoord+0.5); + } + + entityItem.motionY = 0; + entityItem.motionZ = 0; + + if(!suck) + { + entityItem.motionX = Math.max(-MAX_SPEED, entityItem.motionX-ACCELERATION); + } + else { + entityItem.motionX = Math.min(MAX_SPEED, entityItem.motionX+ACCELERATION); + } + + entityItem.isAirBorne = true; + break; + case EAST: + if(!worldObj.isRemote) + { + entityItem.setPosition(entityItem.posX, yCoord+0.5, zCoord+0.5); + } + + entityItem.motionY = 0; + entityItem.motionZ = 0; + + if(!suck) + { + entityItem.motionX = Math.min(MAX_SPEED, entityItem.motionX+ACCELERATION); + } + else { + entityItem.motionX = Math.max(-MAX_SPEED, entityItem.motionX-ACCELERATION); + } + entityItem.isAirBorne = true; break; } @@ -169,6 +175,17 @@ public class TileEntityEMContractor extends TileEntity } } + @Override + public void validate() + { + super.validate(); + + if(worldObj.isRemote) + { + PacketHandler.sendDataRequest(this); + } + } + public void updateBounds() { switch(facing) @@ -180,7 +197,7 @@ public class TileEntityEMContractor extends TileEntity operationBounds = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord+1, Math.min(yCoord+MAX_REACH, 255), zCoord+1); break; case NORTH: - operationBounds = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord+MAX_REACH, yCoord+1, zCoord+1); + operationBounds = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord-MAX_REACH, xCoord+1, yCoord+1, zCoord); break; case SOUTH: operationBounds = AxisAlignedBB.getBoundingBox(xCoord-MAX_REACH, yCoord, zCoord, xCoord, yCoord+1, zCoord+1); @@ -189,7 +206,7 @@ public class TileEntityEMContractor extends TileEntity operationBounds = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord+1, yCoord+1, zCoord+MAX_REACH); break; case EAST: - operationBounds = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord-MAX_REACH, xCoord+1, yCoord+1, zCoord); + operationBounds = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord+MAX_REACH, yCoord+1, zCoord+1); break; } } @@ -212,8 +229,6 @@ public class TileEntityEMContractor extends TileEntity { int newOrdinal = facing.ordinal() < 5 ? facing.ordinal()+1 : 0; setFacing(ForgeDirection.getOrientation(newOrdinal)); - - updateBounds(); } public ForgeDirection getFacing() @@ -224,6 +239,13 @@ public class TileEntityEMContractor extends TileEntity public void setFacing(ForgeDirection side) { facing = side; + + if(!worldObj.isRemote) + { + PacketHandler.sendTileEntityPacketToClients(this, getNetworkedData(new ArrayList()).toArray()); + } + + updateBounds(); } @Override @@ -243,4 +265,20 @@ public class TileEntityEMContractor extends TileEntity nbtTags.setInteger("facing", facing.ordinal()); nbtTags.setBoolean("suck", suck); } + + @Override + public void handle(ByteArrayDataInput input) + { + try { + facing = ForgeDirection.getOrientation(input.readInt()); + worldObj.markBlockForRenderUpdate(xCoord, yCoord, zCoord); + } catch(Exception e) {} + } + + @Override + public ArrayList getNetworkedData(ArrayList data) + { + data.add(facing.ordinal()); + return data; + } } diff --git a/src/resonantinduction/render/RenderEMContractor.java b/src/resonantinduction/render/RenderEMContractor.java index 9d73e42c..2145d61b 100644 --- a/src/resonantinduction/render/RenderEMContractor.java +++ b/src/resonantinduction/render/RenderEMContractor.java @@ -22,6 +22,7 @@ public class RenderEMContractor extends TileEntitySpecialRenderer GL11.glPushMatrix(); GL11.glTranslated(x + 0.5, y + 1.5, z + 0.5); GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(90F, 0.0F, 1.0F, 0.0F); switch(((TileEntityEMContractor)t).getFacing()) { @@ -32,13 +33,13 @@ public class RenderEMContractor extends TileEntitySpecialRenderer case UP: break; case NORTH: - GL11.glTranslatef(-1, 1, 0); - GL11.glRotatef(-90, 0, 0, 1); - break; - case SOUTH: GL11.glTranslatef(1, 1, 0); GL11.glRotatef(90, 0, 0, 1); break; + case SOUTH: + GL11.glTranslatef(-1, 1, 0); + GL11.glRotatef(-90, 0, 0, 1); + break; case WEST: GL11.glTranslatef(0, 1, 1); GL11.glRotatef(-90, 1, 0, 0); diff --git a/src/resonantinduction/tesla/TileEntityTesla.java b/src/resonantinduction/tesla/TileEntityTesla.java index 3b12fb42..f7dfbb95 100644 --- a/src/resonantinduction/tesla/TileEntityTesla.java +++ b/src/resonantinduction/tesla/TileEntityTesla.java @@ -3,18 +3,16 @@ */ package resonantinduction.tesla; +import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Set; import net.minecraft.block.BlockFurnace; -import net.minecraft.entity.Entity; import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityFurnace; -import net.minecraft.util.AxisAlignedBB; import resonantinduction.ITesla; import resonantinduction.PacketHandler; import resonantinduction.ResonantInduction; @@ -181,6 +179,12 @@ public class TileEntityTesla extends TileEntityBase implements ITesla, IPacketRe { return PacketHandler.getTileEntityPacket(this, (byte) 1, this.getEnergyStored(), this.dyeID); } + + @Override + public ArrayList getNetworkedData(ArrayList data) + { + return null; + } @Override public void handle(ByteArrayDataInput input)