diff --git a/src/main/java/kamkeel/network/AbstractPacket.java b/src/main/java/kamkeel/network/AbstractPacket.java index 26614cbd4..7d8fa4d77 100644 --- a/src/main/java/kamkeel/network/AbstractPacket.java +++ b/src/main/java/kamkeel/network/AbstractPacket.java @@ -1,25 +1,31 @@ package kamkeel.network; +import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.internal.FMLProxyPacket; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import net.minecraft.entity.player.EntityPlayer; +import noppes.npcs.CustomNpcs; +import noppes.npcs.LogWriter; import java.io.IOException; public abstract class AbstractPacket { - public final FMLProxyPacket generatePacket() { + public FMLProxyPacket generatePacket() { + PacketChannel packetChannel = getChannel(); ByteBuf buf = Unpooled.buffer(); try { + buf.writeInt(packetChannel.getChannelType().ordinal()); + buf.writeInt(getType().ordinal()); sendData(buf); - return new FMLProxyPacket(buf, getChannel()); + return new FMLProxyPacket(buf, getChannel().getChannelName()); } catch (Exception ignored) {} return null; } - public abstract String getName(); - public abstract String getChannel(); + public abstract Enum getType(); + public abstract PacketChannel getChannel(); public abstract void sendData(ByteBuf out) throws IOException; //"player" on the server side is the client who sent this packet diff --git a/src/main/java/kamkeel/network/PacketChannel.java b/src/main/java/kamkeel/network/PacketChannel.java new file mode 100644 index 000000000..19f677c72 --- /dev/null +++ b/src/main/java/kamkeel/network/PacketChannel.java @@ -0,0 +1,39 @@ +package kamkeel.network; + +import kamkeel.network.enums.EnumPacketType; + +import java.util.Hashtable; +import java.util.Map; + +public class PacketChannel { + + private String channelName; + private EnumPacketType channelType; + + public Map packets = new Hashtable<>(); + + public PacketChannel(String channelName, EnumPacketType channelType) { + this.channelName = channelName; + this.channelType = channelType; + } + + public String getChannelName() { + return channelName; + } + + public void setChannelName(String channelName) { + this.channelName = channelName; + } + + public EnumPacketType getChannelType() { + return channelType; + } + + public void setChannelType(EnumPacketType channelType) { + this.channelType = channelType; + } + + public void registerPacket(Enum ord, AbstractPacket packet) { + this.packets.put(ord.ordinal(), packet); + } +} diff --git a/src/main/java/kamkeel/network/PacketHandler.java b/src/main/java/kamkeel/network/PacketHandler.java index 4673bef62..01f5ba1d4 100644 --- a/src/main/java/kamkeel/network/PacketHandler.java +++ b/src/main/java/kamkeel/network/PacketHandler.java @@ -6,37 +6,43 @@ import cpw.mods.fml.common.network.FMLNetworkEvent; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.internal.FMLProxyPacket; import cpw.mods.fml.relauncher.Side; +import io.netty.buffer.ByteBuf; +import kamkeel.network.enums.EnumPacketType; +import kamkeel.util.ByteBufUtils; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityTracker; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.NetHandlerPlayServer; -import net.minecraft.world.WorldServer; import noppes.npcs.CustomNpcs; -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.List; -import java.util.Map; +import java.util.*; public final class PacketHandler { public static PacketHandler Instance; public Map packet_names = new Hashtable<>(); - public Map channels = new Hashtable<>(); - public final static String INFO_PACKET = "CNPC+|Info"; - public final static String DATA_PACKET = "CNPC+|Data"; - public final static String CLIENT_PACKET = "CNPC+|Client"; + public Map channels = new Hashtable<>(); - public final static List channelNames = new ArrayList<>(); + public final static PacketChannel INFO_PACKET = new PacketChannel("CNPC+|Info", EnumPacketType.INFO); + public final static PacketChannel DATA_PACKET = new PacketChannel("CNPC+|Data", EnumPacketType.DATA); + public final static PacketChannel CLIENT_PACKET = new PacketChannel("CNPC+|Client", EnumPacketType.CLIENT); + public final static PacketChannel LARGE_PACKET = new PacketChannel("CNPC+|Large", EnumPacketType.LARGE); + + public final static List packetChannels = new ArrayList<>(); public PacketHandler() { // Register Channels - channelNames.add(INFO_PACKET); - channelNames.add(DATA_PACKET); - channelNames.add(CLIENT_PACKET); + packetChannels.add(INFO_PACKET); + packetChannels.add(DATA_PACKET); + packetChannels.add(CLIENT_PACKET); this.registerChannels(); + // Register Info Packets + + // Register Data Packets + + // Register Client Packets // Register Packets // map.put(PingPacket.packetName, new PingPacket()); @@ -44,60 +50,29 @@ public final class PacketHandler { public void registerChannels() { FMLEventChannel eventChannel; - for (String channel : channelNames) { - eventChannel = NetworkRegistry.INSTANCE.newEventDrivenChannel(channel); + for (PacketChannel channel : packetChannels) { + eventChannel = NetworkRegistry.INSTANCE.newEventDrivenChannel(channel.getChannelName()); eventChannel.register(this); - channels.put(channel, eventChannel); + channels.put(channel.getChannelType(), eventChannel); } } - @SubscribeEvent - public void onServerPacket(FMLNetworkEvent.ServerCustomPacketEvent event) { - try { - packet_names.get(event.packet.channel()).receiveData(event.packet.payload(), ((NetHandlerPlayServer) event.handler).playerEntity); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @SubscribeEvent - public void onClientPacket(FMLNetworkEvent.ClientCustomPacketEvent event) { - try { - packet_names.get(event.packet.channel()).receiveData(event.packet.payload(), CustomNpcs.proxy.getPlayer()); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void sendToPlayer(FMLProxyPacket packet, EntityPlayerMP player) { - if (packet != null && CustomNpcs.side()== Side.SERVER) { - channels.get(packet.channel()).sendTo(packet, player); - } - } - - public void sendToServer(FMLProxyPacket packet) { - if (packet != null) { - packet.setTarget(Side.SERVER); - channels.get(packet.channel()).sendToServer(packet); - } - } - - public void sendToTrackingPlayers(Entity entity, FMLProxyPacket packet) { - if (packet != null && CustomNpcs.side() == Side.SERVER) { - EntityTracker tracker = ((WorldServer) entity.worldObj).getEntityTracker(); - tracker.func_151248_b(entity, packet); // Send packet to tracking players - } - } - - public void sendAround(Entity entity, double range, FMLProxyPacket packet) { - if (packet != null && CustomNpcs.side() == Side.SERVER) { - channels.get(packet.channel()).sendToAllAround(packet, new NetworkRegistry.TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, range)); - } - } - - public void sendToAll(FMLProxyPacket packet) { - if (packet != null && CustomNpcs.side() == Side.SERVER) { - channels.get(packet.channel()).sendToAll(packet); + public PacketChannel getPacketChannel(EnumPacketType type){ + PacketChannel packetChannel; + switch (type){ + case DATA: + packetChannel = DATA_PACKET; + break; + case INFO: + packetChannel = INFO_PACKET; + break; + case LARGE: + packetChannel = LARGE_PACKET; + break; + default: + packetChannel = CLIENT_PACKET; + break; } + return packetChannel; } } diff --git a/src/main/java/kamkeel/network/enums/EnumClientPacket.java b/src/main/java/kamkeel/network/enums/EnumClientPacket.java new file mode 100644 index 000000000..24f677c84 --- /dev/null +++ b/src/main/java/kamkeel/network/enums/EnumClientPacket.java @@ -0,0 +1,4 @@ +package kamkeel.network.enums; + +public enum EnumClientPacket { +} diff --git a/src/main/java/kamkeel/network/enums/EnumDataPacket.java b/src/main/java/kamkeel/network/enums/EnumDataPacket.java new file mode 100644 index 000000000..2481eb446 --- /dev/null +++ b/src/main/java/kamkeel/network/enums/EnumDataPacket.java @@ -0,0 +1,4 @@ +package kamkeel.network.enums; + +public enum EnumDataPacket { +} diff --git a/src/main/java/kamkeel/network/enums/EnumInfoPacket.java b/src/main/java/kamkeel/network/enums/EnumInfoPacket.java new file mode 100644 index 000000000..06586758d --- /dev/null +++ b/src/main/java/kamkeel/network/enums/EnumInfoPacket.java @@ -0,0 +1,5 @@ +package kamkeel.network.enums; + +public enum EnumInfoPacket { + LOGIN, +} diff --git a/src/main/java/kamkeel/network/enums/EnumPacketType.java b/src/main/java/kamkeel/network/enums/EnumPacketType.java new file mode 100644 index 000000000..e38ad0ac4 --- /dev/null +++ b/src/main/java/kamkeel/network/enums/EnumPacketType.java @@ -0,0 +1,5 @@ +package kamkeel.network.enums; + +public enum EnumPacketType { + INFO, DATA, CLIENT, LARGE +} diff --git a/src/main/java/kamkeel/network/packets/LoginPacket.java b/src/main/java/kamkeel/network/packets/LoginPacket.java new file mode 100644 index 000000000..82d5899d4 --- /dev/null +++ b/src/main/java/kamkeel/network/packets/LoginPacket.java @@ -0,0 +1,40 @@ +package kamkeel.network.packets; + +import io.netty.buffer.ByteBuf; +import kamkeel.network.AbstractPacket; +import kamkeel.network.PacketChannel; +import kamkeel.network.PacketHandler; +import kamkeel.network.enums.EnumInfoPacket; +import kamkeel.util.ByteBufUtils; +import net.minecraft.entity.player.EntityPlayer; + +import java.io.IOException; + +public final class LoginPacket extends AbstractPacket { + public static final String packetName = "CNPC+|LoginPacket"; + + public LoginPacket() {} + + + @Override + public Enum getType() { + return EnumInfoPacket.LOGIN; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.INFO_PACKET; + } + + @Override + public void sendData(ByteBuf out) throws IOException { +// ByteBufUtils.writeUTF8String(out, this.data.player.getCommandSenderName()); +// ByteBufUtils.writeNBT(out,this.data.saveFromNBT(new NBTTagCompound())); + } + + @Override + public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { + String playerName = ByteBufUtils.readUTF8String(in); + + } +} diff --git a/src/main/java/kamkeel/util/ByteBufUtils.java b/src/main/java/kamkeel/util/ByteBufUtils.java new file mode 100644 index 000000000..35be971ff --- /dev/null +++ b/src/main/java/kamkeel/util/ByteBufUtils.java @@ -0,0 +1,63 @@ +package kamkeel.util; + +import com.google.common.base.Charsets; +import io.netty.buffer.ByteBuf; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTSizeTracker; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; +import net.minecraft.village.MerchantRecipeList; +import noppes.npcs.LogWriter; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class ByteBufUtils extends cpw.mods.fml.common.network.ByteBufUtils { + + public static void writeIntArray(ByteBuf buffer, int[] arr) { + buffer.writeInt(arr.length); + for (int i : arr) { + buffer.writeInt(i); + } + } + + public static int[] readIntArray(ByteBuf buffer) { + int length = buffer.readInt(); + int[] arr = new int[length]; + for (int i = 0; i < length; i++) { + arr[i] = buffer.readInt(); + } + return arr; + } + + public static void writeNBT(ByteBuf buffer, NBTTagCompound compound) throws IOException { + byte[] bytes = CompressedStreamTools.compress(compound); + buffer.writeShort((short)bytes.length); + buffer.writeBytes(bytes); + } + + public static NBTTagCompound readNBT(ByteBuf buffer) throws IOException { + byte[] bytes = new byte[buffer.readShort()]; + buffer.readBytes(bytes); + return CompressedStreamTools.func_152457_a(bytes, new NBTSizeTracker(2097152L)); + } + + public static void writeString(ByteBuf buffer, String s){ + byte[] bytes = s.getBytes(Charsets.UTF_8); + buffer.writeShort((short)bytes.length); + buffer.writeBytes(bytes); + } + + public static String readString(ByteBuf buffer){ + try{ + byte[] bytes = new byte[buffer.readShort()]; + buffer.readBytes(bytes); + return new String(bytes, Charsets.UTF_8); + } + catch(IndexOutOfBoundsException ex){ + return null; + } + } +}