/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.common.util.network;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
import cpw.mods.fml.relauncher.ReflectionHelper;
import java.lang.reflect.Method;
import mods.railcraft.common.util.misc.Game;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.Packet;
import net.minecraft.server.management.PlayerManager;
import net.minecraft.world.WorldServer;
/**
*
* @author CovertJaguar <http://www.railcraft.info/>
*/
public class PacketDispatcher {
private static final Class playerInstanceClass;
private static final Method getOrCreateChunkWatcher;
private static final Method sendToAllPlayersWatchingChunk;
static {
try {
playerInstanceClass = PlayerManager.class.getDeclaredClasses()[0];
getOrCreateChunkWatcher = ReflectionHelper.findMethod(PlayerManager.class, null, new String[]{"func_72690_a", "getOrCreateChunkWatcher"}, int.class, int.class, boolean.class);
sendToAllPlayersWatchingChunk = ReflectionHelper.findMethod(playerInstanceClass, null, new String[]{"func_151251_a", "sendToAllPlayersWatchingChunk"}, Packet.class);
getOrCreateChunkWatcher.setAccessible(true);
sendToAllPlayersWatchingChunk.setAccessible(true);
} catch (Exception ex) {
Game.logThrowable("Reflection Failure in PacketDispatcher initalization {0} {1}", ex);
throw new RuntimeException(ex);
}
}
public static void sendToServer(RailcraftPacket packet) {
PacketHandler.INSTANCE.channel.sendToServer(packet.getPacket());
}
public static void sendToPlayer(RailcraftPacket packet, EntityPlayerMP player) {
PacketHandler.INSTANCE.channel.sendTo(packet.getPacket(), player);
}
public static void sendToAll(RailcraftPacket packet) {
PacketHandler.INSTANCE.channel.sendToAll(packet.getPacket());
}
public static void sendToAllAround(RailcraftPacket packet, TargetPoint zone) {
PacketHandler.INSTANCE.channel.sendToAllAround(packet.getPacket(), zone);
}
public static void sendToDimension(RailcraftPacket packet, int dimensionId) {
PacketHandler.INSTANCE.channel.sendToDimension(packet.getPacket(), dimensionId);
}
public static void sendToWatchers(RailcraftPacket packet, WorldServer world, int worldX, int worldZ) {
try {
Object playerInstance = getOrCreateChunkWatcher.invoke(world.getPlayerManager(), worldX >> 4, worldZ >> 4, false);
if (playerInstance != null)
sendToAllPlayersWatchingChunk.invoke(playerInstance, (Packet) packet.getPacket());
} catch (Exception ex) {
Game.logThrowable("Reflection Failure in PacketDispatcher.sendToWatchers() {0} {1}", 20, ex, getOrCreateChunkWatcher.getName(), sendToAllPlayersWatchingChunk.getName());
throw new RuntimeException(ex);
}
}
}