package openmods.utils; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import cpw.mods.fml.common.network.handshake.NetworkDispatcher; import cpw.mods.fml.relauncher.ReflectionHelper; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import java.lang.reflect.Field; import java.util.Set; import net.minecraft.entity.EntityTracker; import net.minecraft.entity.EntityTrackerEntry; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.management.PlayerManager; import net.minecraft.util.IntHashMap; import net.minecraft.world.WorldServer; import openmods.Log; public class NetUtils { public static NetworkDispatcher getPlayerDispatcher(EntityPlayerMP player) { NetworkDispatcher dispatcher = player.playerNetServerHandler.netManager.channel().attr(NetworkDispatcher.FML_DISPATCHER).get(); return dispatcher; } private static Field trackingPlayers; public static Set<EntityPlayerMP> getPlayersWatchingEntity(WorldServer server, int entityId) { EntityTracker tracker = server.getEntityTracker(); if (trackingPlayers == null) trackingPlayers = ReflectionHelper.findField(EntityTracker.class, "trackedEntityIDs", "field_72794_c"); IntHashMap trackers; try { trackers = (IntHashMap)trackingPlayers.get(tracker); } catch (Exception e) { throw Throwables.propagate(e); } EntityTrackerEntry entry = (EntityTrackerEntry)trackers.lookup(entityId); if (entry == null) return ImmutableSet.of(); @SuppressWarnings({ "unchecked" }) Set<EntityPlayerMP> trackingPlayers = entry.trackingPlayers; return ImmutableSet.copyOf(trackingPlayers); } public static Set<EntityPlayerMP> getPlayersWatchingChunk(WorldServer world, int chunkX, int chunkZ) { PlayerManager manager = world.getPlayerManager(); Set<EntityPlayerMP> playerList = Sets.newHashSet(); for (Object o : world.playerEntities) { EntityPlayerMP player = (EntityPlayerMP)o; if (manager.isPlayerWatchingChunk(player, chunkX, chunkZ)) playerList.add(player); } return playerList; } public static Set<EntityPlayerMP> getPlayersWatchingBlock(WorldServer world, int blockX, int blockZ) { return getPlayersWatchingChunk(world, blockX >> 4, blockZ >> 4); } public static final ChannelFutureListener LOGGING_LISTENER = new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { if (!future.isSuccess()) { Throwable cause = future.cause(); Log.severe(cause, "Crash in pipeline handler"); } } }; }