diff --git a/src/main/java/kamkeel/network/AbstractPacket.java b/src/main/java/kamkeel/network/AbstractPacket.java new file mode 100644 index 000000000..26614cbd4 --- /dev/null +++ b/src/main/java/kamkeel/network/AbstractPacket.java @@ -0,0 +1,28 @@ +package kamkeel.network; + +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 java.io.IOException; + +public abstract class AbstractPacket { + + public final FMLProxyPacket generatePacket() { + ByteBuf buf = Unpooled.buffer(); + try { + sendData(buf); + return new FMLProxyPacket(buf, getChannel()); + } catch (Exception ignored) {} + return null; + } + + public abstract String getName(); + public abstract String getChannel(); + public abstract void sendData(ByteBuf out) throws IOException; + + //"player" on the server side is the client who sent this packet + //"player" on the client side is the client player + public abstract void receiveData(ByteBuf in, EntityPlayer player) throws IOException; +} diff --git a/src/main/java/kamkeel/network/PacketHandler.java b/src/main/java/kamkeel/network/PacketHandler.java new file mode 100644 index 000000000..4673bef62 --- /dev/null +++ b/src/main/java/kamkeel/network/PacketHandler.java @@ -0,0 +1,103 @@ +package kamkeel.network; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.network.FMLEventChannel; +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 net.minecraft.entity.Entity; +import net.minecraft.entity.EntityTracker; +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; + +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 final static List channelNames = new ArrayList<>(); + + public PacketHandler() { + // Register Channels + channelNames.add(INFO_PACKET); + channelNames.add(DATA_PACKET); + channelNames.add(CLIENT_PACKET); + this.registerChannels(); + + + // Register Packets + // map.put(PingPacket.packetName, new PingPacket()); + } + + public void registerChannels() { + FMLEventChannel eventChannel; + for (String channel : channelNames) { + eventChannel = NetworkRegistry.INSTANCE.newEventDrivenChannel(channel); + eventChannel.register(this); + channels.put(channel, 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); + } + } +} diff --git a/src/main/java/noppes/npcs/CustomNpcs.java b/src/main/java/noppes/npcs/CustomNpcs.java index ce5577197..1a8108a2f 100644 --- a/src/main/java/noppes/npcs/CustomNpcs.java +++ b/src/main/java/noppes/npcs/CustomNpcs.java @@ -8,6 +8,7 @@ import cpw.mods.fml.common.event.*; import cpw.mods.fml.common.network.FMLEventChannel; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.EntityRegistry; +import cpw.mods.fml.relauncher.Side; import foxz.command.CommandNoppes; import kamkeel.addon.AddonManager; import kamkeel.command.CommandKamkeel; @@ -318,4 +319,8 @@ public class CustomNpcs { public static MinecraftServer getServer(){ return MinecraftServer.getServer(); } + + public static Side side() { + return FMLCommonHandler.instance().getEffectiveSide(); + } }