diff --git a/src/main/java/techreborn/Core.java b/src/main/java/techreborn/Core.java index cf7484ea5..470ebf78a 100644 --- a/src/main/java/techreborn/Core.java +++ b/src/main/java/techreborn/Core.java @@ -12,6 +12,7 @@ import techreborn.init.ModBlocks; import techreborn.init.ModItems; import techreborn.init.ModRecipes; import techreborn.lib.ModInfo; +import techreborn.packets.PacketHandler; import techreborn.util.LogHelper; import techreborn.world.TROreGen; @@ -48,6 +49,8 @@ public class Core { GameRegistry.registerWorldGenerator(new TROreGen(), 0); //Register Gui Handler NetworkRegistry.INSTANCE.registerGuiHandler(INSTANCE, new GuiHandler()); + //packets + PacketHandler.setChannels(NetworkRegistry.INSTANCE.newChannel(ModInfo.MOD_ID + "_packets", new PacketHandler())); LogHelper.info("Initialization Compleate"); } diff --git a/src/main/java/techreborn/packets/PacketHandler.java b/src/main/java/techreborn/packets/PacketHandler.java new file mode 100644 index 000000000..759499e8d --- /dev/null +++ b/src/main/java/techreborn/packets/PacketHandler.java @@ -0,0 +1,71 @@ +package techreborn.packets; + +import cpw.mods.fml.common.network.FMLEmbeddedChannel; +import cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec; +import cpw.mods.fml.common.network.FMLOutboundHandler; +import cpw.mods.fml.relauncher.Side; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.Packet; +import net.minecraft.world.World; + +import java.io.IOException; +import java.util.EnumMap; +import java.util.logging.Logger; + +public class PacketHandler extends FMLIndexedMessageToMessageCodec { + private static EnumMap channels; + + public PacketHandler() { + + } + + public static EnumMap getChannels() { + return channels; + } + + public static void setChannels(EnumMap _channels) { + channels = _channels; + } + + public static void sendPacketToServer(SimplePacket packet) { + PacketHandler.getChannels().get(Side.CLIENT).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER); + PacketHandler.getChannels().get(Side.CLIENT).writeOutbound(packet); + } + + public static void sendPacketToPlayer(SimplePacket packet, EntityPlayer player) { + PacketHandler.getChannels().get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER); + PacketHandler.getChannels().get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player); + PacketHandler.getChannels().get(Side.SERVER).writeOutbound(packet); + } + + public static void sendPacketToAllPlayers(SimplePacket packet) { + PacketHandler.getChannels().get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL); + PacketHandler.getChannels().get(Side.SERVER).writeOutbound(packet); + } + + public static void sendPacketToAllPlayers(Packet packet, World world) { + for (Object player : world.playerEntities) { + if (player instanceof EntityPlayerMP) + if (player != null) + ((EntityPlayerMP) player).playerNetServerHandler.sendPacket(packet); + } + } + + @Override + public void encodeInto(ChannelHandlerContext ctx, SimplePacket msg, ByteBuf target) throws Exception { + msg.writePacketData(target); + } + + @Override + public void decodeInto(ChannelHandlerContext ctx, ByteBuf source, SimplePacket msg) { + try { + msg.readPacketData(source); + msg.execute(); + } catch (IOException e) { + Logger.getLogger("Network").warning("Something caused a Protocol Exception!"); + } + } +} \ No newline at end of file diff --git a/src/main/java/techreborn/packets/SimplePacket.java b/src/main/java/techreborn/packets/SimplePacket.java new file mode 100644 index 000000000..6d9ae96cb --- /dev/null +++ b/src/main/java/techreborn/packets/SimplePacket.java @@ -0,0 +1,118 @@ +package techreborn.packets; + +import com.google.common.base.Charsets; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; + +import java.io.IOException; + +public abstract class SimplePacket { + protected EntityPlayer player; + protected byte mode; + + public SimplePacket(EntityPlayer _player) { + player = _player; + } + + @SuppressWarnings("unused") + public SimplePacket() { + player = null; + } + + public static String readString(ByteBuf in) throws IOException { + byte[] stringBytes = new byte[in.readInt()]; + in.readBytes(stringBytes); + return new String(stringBytes, Charsets.UTF_8); + } + + public static void writeString(String string, ByteBuf out) throws IOException { + byte[] stringBytes; + stringBytes = string.getBytes(Charsets.UTF_8); + out.writeInt(stringBytes.length); + out.writeBytes(stringBytes); + } + + public static World readWorld(ByteBuf in) throws IOException { + return DimensionManager.getWorld(in.readInt()); + } + + public static void writeWorld(World world, ByteBuf out) throws IOException { + out.writeInt(world.provider.dimensionId); + } + + public static EntityPlayer readPlayer(ByteBuf in) throws IOException { + if (!in.readBoolean()) + return null; + World playerWorld = readWorld(in); + return playerWorld.getPlayerEntityByName(readString(in)); + } + + public static void writePlayer(EntityPlayer player, ByteBuf out) throws IOException { + if (player == null) { + out.writeBoolean(false); + return; + } + out.writeBoolean(true); + writeWorld(player.worldObj, out); + writeString(player.getCommandSenderName(), out); + } + + public static TileEntity readTileEntity(ByteBuf in) throws IOException { + return readWorld(in).getTileEntity(in.readInt(), in.readInt(), in.readInt()); + } + + public static void writeTileEntity(TileEntity tileEntity, ByteBuf out) throws IOException { + writeWorld(tileEntity.getWorldObj(), out); + out.writeInt(tileEntity.xCoord); + out.writeInt(tileEntity.yCoord); + out.writeInt(tileEntity.zCoord); + } + + public static Fluid readFluid(ByteBuf in) throws IOException { + return FluidRegistry.getFluid(readString(in)); + } + + public static void writeFluid(Fluid fluid, ByteBuf out) throws IOException { + if (fluid == null) { + writeString("", out); + return; + } + writeString(fluid.getName(), out); + } + + public void writePacketData(ByteBuf out) throws IOException { + out.writeByte(mode); + writePlayer(player, out); + writeData(out); + } + + public abstract void writeData(ByteBuf out) throws IOException; + + public void readPacketData(ByteBuf in) throws IOException { + mode = in.readByte(); + player = readPlayer(in); + readData(in); + } + + public abstract void readData(ByteBuf in) throws IOException; + + public abstract void execute(); + + public void sendPacketToServer() { + PacketHandler.sendPacketToServer(this); + } + + public void sendPacketToPlayer(EntityPlayer player) { + PacketHandler.sendPacketToPlayer(this, player); + } + + public void sendPacketToAllPlayers() { + PacketHandler.sendPacketToAllPlayers(this); + } + +} diff --git a/src/main/java/techreborn/tiles/TileMachineBase.java b/src/main/java/techreborn/tiles/TileMachineBase.java index ffc0ed4cb..c15de2f3c 100644 --- a/src/main/java/techreborn/tiles/TileMachineBase.java +++ b/src/main/java/techreborn/tiles/TileMachineBase.java @@ -3,13 +3,27 @@ package techreborn.tiles; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.tileentity.TileEntity; +import techreborn.packets.PacketHandler; import java.util.List; public class TileMachineBase extends TileEntity { - @SideOnly(Side.CLIENT) + @Override + public void updateEntity() { + super.updateEntity(); + //TODO make this happen less + //syncWithAll(); + } + + @SideOnly(Side.CLIENT) public void addWailaInfo(List info) { } + + public void syncWithAll() { + if (!worldObj.isRemote) { + PacketHandler.sendPacketToAllPlayers(getDescriptionPacket(), worldObj); + } + } } diff --git a/src/main/java/techreborn/tiles/TileQuantumTank.java b/src/main/java/techreborn/tiles/TileQuantumTank.java index a13ff6528..a5a33c75b 100644 --- a/src/main/java/techreborn/tiles/TileQuantumTank.java +++ b/src/main/java/techreborn/tiles/TileQuantumTank.java @@ -1,6 +1,7 @@ package techreborn.tiles; import ic2.api.tile.IWrenchable; +import io.netty.channel.ChannelHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -15,6 +16,7 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; import techreborn.init.ModBlocks; +import techreborn.packets.PacketHandler; import techreborn.util.FluidUtils; import techreborn.util.Inventory; import techreborn.util.Tank;