Files
CustomNPC-Plus/src/main/java/kamkeel/npcs/network/PacketHandler.java
T

213 lines
8.8 KiB
Java
Raw Normal View History

2025-01-29 13:20:04 -05:00
package kamkeel.npcs.network;
2025-01-28 13:39:46 -05:00
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;
2025-01-28 14:37:07 -05:00
import io.netty.buffer.ByteBuf;
2025-01-29 13:20:04 -05:00
import kamkeel.npcs.network.enums.EnumPacketType;
2025-01-29 23:33:35 -05:00
import kamkeel.npcs.network.packets.client.*;
import kamkeel.npcs.network.packets.client.gui.*;
2025-01-29 18:25:34 -05:00
import kamkeel.npcs.network.packets.client.large.LargeScrollDataPacket;
import kamkeel.npcs.network.packets.client.large.LargeScrollGroupPacket;
import kamkeel.npcs.network.packets.client.large.LargeScrollListPacket;
import kamkeel.npcs.network.packets.client.large.sync.LargeSyncPacket;
2025-01-29 23:33:35 -05:00
import kamkeel.npcs.network.packets.client.npc.DeleteNpcPacket;
import kamkeel.npcs.network.packets.client.npc.EditNpcPacket;
2025-01-30 01:35:48 -05:00
import kamkeel.npcs.network.packets.client.script.ScriptedParticlePacket;
2025-01-29 21:50:55 -05:00
import net.minecraft.entity.Entity;
2025-01-28 14:37:07 -05:00
import net.minecraft.entity.player.EntityPlayer;
2025-01-28 13:39:46 -05:00
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.NetHandlerPlayServer;
import noppes.npcs.CustomNpcs;
2025-01-29 15:08:24 -05:00
import noppes.npcs.LogWriter;
2025-01-28 13:39:46 -05:00
2025-01-28 14:37:07 -05:00
import java.util.*;
2025-01-28 13:39:46 -05:00
public final class PacketHandler {
public static PacketHandler Instance;
2025-01-29 18:25:34 -05:00
// Channels
2025-01-28 14:37:07 -05:00
public Map<EnumPacketType, FMLEventChannel> channels = new Hashtable<>();
2025-01-28 13:39:46 -05:00
2025-01-29 18:25:34 -05:00
public static final PacketChannel INFO_PACKET = new PacketChannel("CNPC+|Info", EnumPacketType.INFO);
public static final PacketChannel DATA_PACKET = new PacketChannel("CNPC+|Data", EnumPacketType.DATA);
public static final PacketChannel CLIENT_PACKET = new PacketChannel("CNPC+|Client", EnumPacketType.CLIENT);
public static final PacketChannel LARGE_PACKET = new PacketChannel("CNPC+|Large", EnumPacketType.LARGE);
2025-01-28 14:37:07 -05:00
2025-01-29 18:25:34 -05:00
private static final List<PacketChannel> packetChannels = new ArrayList<>();
2025-01-28 13:39:46 -05:00
public PacketHandler() {
// Register Channels
2025-01-28 14:37:07 -05:00
packetChannels.add(INFO_PACKET);
packetChannels.add(DATA_PACKET);
packetChannels.add(CLIENT_PACKET);
2025-01-28 18:14:18 -05:00
packetChannels.add(LARGE_PACKET);
2025-01-28 13:39:46 -05:00
this.registerChannels();
2025-01-28 18:19:58 -05:00
// Large Packets
LARGE_PACKET.registerPacket(new LargeScrollGroupPacket());
LARGE_PACKET.registerPacket(new LargeScrollDataPacket());
LARGE_PACKET.registerPacket(new LargeScrollListPacket());
2025-01-29 18:25:34 -05:00
LARGE_PACKET.registerPacket(new LargeSyncPacket());
2025-01-29 21:50:55 -05:00
// Client Packets
CLIENT_PACKET.registerPacket(new ChatBubblePacket());
CLIENT_PACKET.registerPacket(new ChatAlertPacket());
CLIENT_PACKET.registerPacket(new AchievementPacket());
2025-01-29 22:56:28 -05:00
CLIENT_PACKET.registerPacket(new EditNpcPacket());
2025-01-29 23:33:35 -05:00
CLIENT_PACKET.registerPacket(new RolePacket());
CLIENT_PACKET.registerPacket(new GuiTeleporterPacket());
2025-01-29 22:56:28 -05:00
// Client | GUI Packets
CLIENT_PACKET.registerPacket(new GuiClosePacket());
CLIENT_PACKET.registerPacket(new GuiOpenPacket());
CLIENT_PACKET.registerPacket(new GuiErrorPacket());
CLIENT_PACKET.registerPacket(new GuiDataPacket());
2025-01-29 23:33:35 -05:00
CLIENT_PACKET.registerPacket(new GuiClonerPacket());
// Client | NPC Packets
CLIENT_PACKET.registerPacket(new DeleteNpcPacket());
// Client | Other
CLIENT_PACKET.registerPacket(new ParticlePacket());
CLIENT_PACKET.registerPacket(new ScriptedParticlePacket());
2025-01-28 13:39:46 -05:00
}
2025-01-29 18:25:34 -05:00
private void registerChannels() {
2025-01-28 14:37:07 -05:00
for (PacketChannel channel : packetChannels) {
2025-01-29 18:25:34 -05:00
FMLEventChannel eventChannel =
NetworkRegistry.INSTANCE.newEventDrivenChannel(channel.getChannelName());
2025-01-28 13:39:46 -05:00
eventChannel.register(this);
2025-01-28 14:37:07 -05:00
channels.put(channel.getChannelType(), eventChannel);
2025-01-29 15:04:19 -05:00
System.out.println("Registered channel: " + channel.getChannelName());
2025-01-28 13:39:46 -05:00
}
}
2025-01-29 18:25:34 -05:00
public PacketChannel getPacketChannel(EnumPacketType type) {
2025-01-29 15:04:19 -05:00
return packetChannels.stream()
.filter(channel -> channel.getChannelType() == type)
.findFirst()
.orElse(null);
2025-01-28 13:39:46 -05:00
}
2025-01-28 18:14:18 -05:00
public FMLEventChannel getEventChannel(AbstractPacket abstractPacket){
2025-01-29 15:04:19 -05:00
PacketChannel packetChannel = getPacketChannel(abstractPacket.getChannel().getChannelType());
if (packetChannel == null) {
return null;
}
return channels.get(packetChannel.getChannelType());
2025-01-28 18:14:18 -05:00
}
@SubscribeEvent
public void onServerPacket(FMLNetworkEvent.ServerCustomPacketEvent event) {
2025-01-29 15:04:19 -05:00
handlePacket(event.packet, ((NetHandlerPlayServer) event.handler).playerEntity);
2025-01-28 18:14:18 -05:00
}
@SubscribeEvent
public void onClientPacket(FMLNetworkEvent.ClientCustomPacketEvent event) {
2025-01-29 15:04:19 -05:00
handlePacket(event.packet, CustomNpcs.proxy.getPlayer());
2025-01-28 18:14:18 -05:00
}
private void handlePacket(FMLProxyPacket packet, EntityPlayer player) {
ByteBuf buf = packet.payload();
try {
2025-01-29 18:25:34 -05:00
// First two ints are channelTypeOrdinal and packetTypeOrdinal
2025-01-28 18:14:18 -05:00
int packetTypeOrdinal = buf.readInt();
2025-01-29 15:04:19 -05:00
EnumPacketType packetType = EnumPacketType.values()[packetTypeOrdinal];
2025-01-29 18:25:34 -05:00
2025-01-29 15:04:19 -05:00
PacketChannel packetChannel = getPacketChannel(packetType);
if (packetChannel == null) {
2025-01-29 15:08:24 -05:00
LogWriter.error("Error: Packet channel is null for packet type: " + packetType);
2025-01-29 15:04:19 -05:00
return;
}
2025-01-29 18:25:34 -05:00
2025-01-29 15:04:19 -05:00
int packetId = buf.readInt();
AbstractPacket abstractPacket = packetChannel.packets.get(packetId);
if (abstractPacket == null) {
2025-01-29 15:08:24 -05:00
LogWriter.error("Error: Abstract packet is null for packet ID: " + packetId);
2025-01-29 15:04:19 -05:00
return;
2025-01-28 18:14:18 -05:00
}
2025-01-29 18:25:34 -05:00
// Let the packet parse the rest
2025-01-29 15:04:19 -05:00
abstractPacket.receiveData(buf, player);
2025-01-29 18:25:34 -05:00
2025-01-29 15:04:19 -05:00
} catch (IndexOutOfBoundsException e) {
2025-01-29 15:08:24 -05:00
LogWriter.error("Error: IndexOutOfBoundsException in handlePacket: " + e.getMessage());
2025-01-29 19:43:45 -05:00
e.printStackTrace();
2025-01-28 18:14:18 -05:00
} catch (Exception e) {
2025-01-29 15:08:24 -05:00
LogWriter.error("Error: Exception in handlePacket: " + e.getMessage());
2025-01-29 19:43:45 -05:00
e.printStackTrace();
2025-01-28 18:14:18 -05:00
}
}
2025-01-29 18:25:34 -05:00
/**
* Sends every FMLProxyPacket produced by packet.generatePackets()
*/
private void sendAllPackets(AbstractPacket packet, SendAction action) {
// get all generated FMLProxyPacket objects (could be 1 for normal, or many for large)
List<FMLProxyPacket> proxyPackets = packet.generatePackets();
if (proxyPackets.isEmpty()) {
LogWriter.error("Warning: No packets generated for " + packet.getClass().getName());
}
for (FMLProxyPacket proxy : proxyPackets) {
action.send(proxy);
2025-01-28 18:14:18 -05:00
}
}
2025-01-29 18:25:34 -05:00
// ------------------------------------------------------------------------
// Public API methods for sending
2025-01-29 13:28:14 -05:00
public void sendToPlayer(AbstractPacket packet, EntityPlayerMP player) {
2025-01-29 15:04:19 -05:00
FMLEventChannel eventChannel = getEventChannel(packet);
if (eventChannel == null) {
2025-01-29 15:08:24 -05:00
LogWriter.error("Error: Event channel is null for packet: " + packet.getClass().getName());
2025-01-29 15:04:19 -05:00
return;
}
2025-01-29 18:25:34 -05:00
sendAllPackets(packet, p -> eventChannel.sendTo(p, player));
2025-01-29 13:28:14 -05:00
}
2025-01-28 18:14:18 -05:00
public void sendToServer(AbstractPacket packet) {
2025-01-29 15:04:19 -05:00
FMLEventChannel eventChannel = getEventChannel(packet);
if (eventChannel == null) {
2025-01-29 15:08:24 -05:00
LogWriter.error("Error: Event channel is null for packet: " + packet.getClass().getName());
2025-01-29 15:04:19 -05:00
return;
}
2025-01-29 18:25:34 -05:00
sendAllPackets(packet, eventChannel::sendToServer);
2025-01-28 18:14:18 -05:00
}
public void sendToAll(AbstractPacket packet) {
2025-01-29 15:04:19 -05:00
FMLEventChannel eventChannel = getEventChannel(packet);
if (eventChannel == null) {
2025-01-29 15:08:24 -05:00
LogWriter.error("Error: Event channel is null for packet: " + packet.getClass().getName());
2025-01-29 15:04:19 -05:00
return;
}
2025-01-29 18:25:34 -05:00
sendAllPackets(packet, eventChannel::sendToAll);
2025-01-28 18:14:18 -05:00
}
2025-01-29 21:50:55 -05:00
public void sendToDimension(AbstractPacket packet, final int dimensionId) {
2025-01-29 15:04:19 -05:00
FMLEventChannel eventChannel = getEventChannel(packet);
if (eventChannel == null) {
2025-01-29 15:08:24 -05:00
LogWriter.error("Error: Event channel is null for packet: " + packet.getClass().getName());
2025-01-29 15:04:19 -05:00
return;
}
2025-01-29 21:50:55 -05:00
sendAllPackets(packet, p -> eventChannel.sendToDimension(p, dimensionId));
2025-01-28 18:14:18 -05:00
}
2025-01-29 21:50:55 -05:00
public void sendTracking(AbstractPacket packet, final Entity entity) {
2025-01-29 15:04:19 -05:00
FMLEventChannel eventChannel = getEventChannel(packet);
if (eventChannel == null) {
2025-01-29 15:08:24 -05:00
LogWriter.error("Error: Event channel is null for packet: " + packet.getClass().getName());
2025-01-29 15:04:19 -05:00
return;
}
2025-01-29 21:50:55 -05:00
final NetworkRegistry.TargetPoint point = new NetworkRegistry.TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 60);
sendAllPackets(packet, p -> eventChannel.sendToAllAround(p, point));
2025-01-29 18:25:34 -05:00
}
// Simple functional interface to unify the "send" action
private interface SendAction {
void send(FMLProxyPacket proxy);
2025-01-28 18:14:18 -05:00
}
2025-01-28 13:39:46 -05:00
}