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-02-01 21:23:49 -05:00
|
|
|
import cpw.mods.fml.relauncher.Side;
|
2025-01-28 14:37:07 -05:00
|
|
|
import io.netty.buffer.ByteBuf;
|
2025-01-30 13:58:09 -05:00
|
|
|
import kamkeel.npcs.network.enums.EnumChannelType;
|
2025-01-30 14:16:39 -05:00
|
|
|
import kamkeel.npcs.network.enums.EnumRequestPacket;
|
2025-01-30 13:54:49 -05:00
|
|
|
import kamkeel.npcs.network.packets.data.*;
|
|
|
|
|
import kamkeel.npcs.network.packets.data.gui.*;
|
|
|
|
|
import kamkeel.npcs.network.packets.data.large.*;
|
|
|
|
|
import kamkeel.npcs.network.packets.data.npc.*;
|
|
|
|
|
import kamkeel.npcs.network.packets.data.script.*;
|
2025-02-01 21:44:22 -05:00
|
|
|
import kamkeel.npcs.network.packets.request.linked.LinkedAddPacket;
|
|
|
|
|
import kamkeel.npcs.network.packets.request.linked.LinkedGetAllPacket;
|
|
|
|
|
import kamkeel.npcs.network.packets.request.linked.LinkedRemovePacket;
|
|
|
|
|
import kamkeel.npcs.network.packets.request.linked.LinkedSetPacket;
|
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-30 18:13:04 -05:00
|
|
|
import noppes.npcs.CustomNpcsPermissions;
|
2025-01-29 15:08:24 -05:00
|
|
|
import noppes.npcs.LogWriter;
|
2025-01-30 18:13:04 -05:00
|
|
|
import noppes.npcs.NoppesUtilServer;
|
2025-02-01 21:44:22 -05:00
|
|
|
import noppes.npcs.config.ConfigMain;
|
2025-01-30 18:13:04 -05:00
|
|
|
import noppes.npcs.entity.EntityNPCInterface;
|
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
|
|
|
|
2025-02-01 21:44:22 -05:00
|
|
|
public class PacketHandler {
|
2025-01-28 13:39:46 -05:00
|
|
|
public static PacketHandler Instance;
|
|
|
|
|
|
2025-01-29 18:25:34 -05:00
|
|
|
// Channels
|
2025-01-30 13:58:09 -05:00
|
|
|
public Map<EnumChannelType, FMLEventChannel> channels = new Hashtable<>();
|
2025-01-28 13:39:46 -05:00
|
|
|
|
2025-01-30 14:16:39 -05:00
|
|
|
// Client to Server
|
|
|
|
|
public static final PacketChannel REQUEST_PACKET = new PacketChannel("CNPC+|Req", EnumChannelType.REQUEST);
|
|
|
|
|
|
|
|
|
|
// Client to Server - Typically information
|
2025-01-30 13:58:09 -05:00
|
|
|
public static final PacketChannel PLAYER_PACKET = new PacketChannel("CNPC+|Player", EnumChannelType.PLAYER);
|
2025-01-30 14:16:39 -05:00
|
|
|
|
|
|
|
|
// Server to Client
|
2025-01-30 13:58:09 -05:00
|
|
|
public static final PacketChannel DATA_PACKET = new PacketChannel("CNPC+|Data", EnumChannelType.DATA);
|
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-30 14:16:39 -05:00
|
|
|
packetChannels.add(REQUEST_PACKET);
|
2025-01-30 13:54:49 -05:00
|
|
|
packetChannels.add(PLAYER_PACKET);
|
2025-01-28 14:37:07 -05:00
|
|
|
packetChannels.add(DATA_PACKET);
|
2025-01-30 11:03:52 -05:00
|
|
|
|
2025-01-28 13:39:46 -05:00
|
|
|
this.registerChannels();
|
2025-01-30 13:58:09 -05:00
|
|
|
this.registerDataPackets();
|
2025-01-30 11:03:52 -05:00
|
|
|
}
|
2025-01-28 18:19:58 -05:00
|
|
|
|
2025-02-01 21:44:22 -05:00
|
|
|
public void registerRequestPackets(){
|
|
|
|
|
// Linked Packets
|
|
|
|
|
REQUEST_PACKET.registerPacket(new LinkedGetAllPacket());
|
|
|
|
|
REQUEST_PACKET.registerPacket(new LinkedRemovePacket());
|
|
|
|
|
REQUEST_PACKET.registerPacket(new LinkedSetPacket());
|
|
|
|
|
REQUEST_PACKET.registerPacket(new LinkedAddPacket());
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-30 13:58:09 -05:00
|
|
|
public void registerDataPackets(){
|
2025-01-29 21:50:55 -05:00
|
|
|
// Client Packets
|
2025-01-30 13:54:49 -05:00
|
|
|
DATA_PACKET.registerPacket(new AchievementPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new ChatAlertPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new ChatBubblePacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new ConfigCommandPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new DisableMouseInputPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new MarkDataPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new OverlayQuestTrackingPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new ParticlePacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new PlayerUpdateSkinOverlaysPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new QuestCompletionPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new ScrollSelectedPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new SoundManagementPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new SwingPlayerArmPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new UpdateAnimationsPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new VillagerListPacket());
|
2025-01-29 22:56:28 -05:00
|
|
|
|
|
|
|
|
// Client | GUI Packets
|
2025-01-30 13:54:49 -05:00
|
|
|
DATA_PACKET.registerPacket(new GuiClosePacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new GuiOpenPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new GuiErrorPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new GuiRedstonePacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new GuiTeleporterPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new GuiWaypointPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new IsGuiOpenPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new GuiOpenBookPacket());
|
2025-01-29 23:33:35 -05:00
|
|
|
|
|
|
|
|
// Client | NPC Packets
|
2025-01-30 13:54:49 -05:00
|
|
|
DATA_PACKET.registerPacket(new DeleteNpcPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new EditNpcPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new UpdateNpcPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new DialogPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new RolePacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new WeaponNpcPacket());
|
2025-01-30 11:03:52 -05:00
|
|
|
|
|
|
|
|
// Client | Script Packets
|
2025-01-30 13:54:49 -05:00
|
|
|
DATA_PACKET.registerPacket(new ScriptedParticlePacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new ScriptOverlayClosePacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new ScriptOverlayDataPacket());
|
2025-01-30 12:16:16 -05:00
|
|
|
|
|
|
|
|
// Client | Large Packets
|
2025-01-30 13:54:49 -05:00
|
|
|
DATA_PACKET.registerPacket(new ClonerPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new ScrollGroupPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new ScrollDataPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new ScrollListPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new SyncPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new GuiDataPacket());
|
|
|
|
|
DATA_PACKET.registerPacket(new PartyDataPacket());
|
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-30 13:58:09 -05:00
|
|
|
public PacketChannel getPacketChannel(EnumChannelType 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-02-01 21:23:49 -05:00
|
|
|
handlePacket(event.packet, ((NetHandlerPlayServer) event.handler).playerEntity, Side.SERVER);
|
2025-01-28 18:14:18 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@SubscribeEvent
|
|
|
|
|
public void onClientPacket(FMLNetworkEvent.ClientCustomPacketEvent event) {
|
2025-02-01 21:23:49 -05:00
|
|
|
handlePacket(event.packet, CustomNpcs.proxy.getPlayer(), Side.CLIENT);
|
2025-01-28 18:14:18 -05:00
|
|
|
}
|
|
|
|
|
|
2025-02-01 21:23:49 -05:00
|
|
|
private void handlePacket(FMLProxyPacket packet, EntityPlayer player, Side side) {
|
2025-01-28 18:14:18 -05:00
|
|
|
ByteBuf buf = packet.payload();
|
|
|
|
|
try {
|
|
|
|
|
int packetTypeOrdinal = buf.readInt();
|
2025-01-30 13:58:09 -05:00
|
|
|
EnumChannelType packetType = EnumChannelType.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
|
|
|
|
2025-02-01 21:23:49 -05:00
|
|
|
if(side == Side.SERVER){
|
2025-02-01 21:44:22 -05:00
|
|
|
if(abstractPacket.getChannel() == REQUEST_PACKET && ConfigMain.OpsOnly && !NoppesUtilServer.isOp(player)){
|
|
|
|
|
LogWriter.error(String.format("%s tried to use CNPC+ without being an op", player.getCommandSenderName()));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-01 21:23:49 -05:00
|
|
|
// Check if permission is allowed
|
|
|
|
|
if(abstractPacket.getPermission() != null && !CustomNpcsPermissions.hasPermission(player, abstractPacket.getPermission())){
|
|
|
|
|
return;
|
|
|
|
|
}
|
2025-01-30 18:13:04 -05:00
|
|
|
|
2025-02-01 21:23:49 -05:00
|
|
|
// Check for required NPC
|
2025-01-30 18:13:04 -05:00
|
|
|
EntityNPCInterface npc = NoppesUtilServer.getEditingNpc(player);
|
2025-02-01 21:23:49 -05:00
|
|
|
if(abstractPacket.needsNPC() && npc == null){
|
2025-01-30 18:13:04 -05:00
|
|
|
return;
|
2025-02-01 21:23:49 -05:00
|
|
|
}
|
2025-01-30 18:13:04 -05:00
|
|
|
|
|
|
|
|
abstractPacket.setNPC(npc);
|
2025-01-30 14:16:39 -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
|
|
|
}
|