package net.mcft.copy.backpacks.network;
import java.util.List;
import net.minecraft.world.WorldServer;
import net.minecraft.world.World;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraftforge.fml.common.network.NetworkRegistry.TargetPoint;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import net.minecraftforge.fml.relauncher.Side;
import net.mcft.copy.backpacks.WearableBackpacks;
/** Main network class. Handles registering messages
* and sending them to clients as well as the server. */
public class BackpacksChannel extends SimpleNetworkWrapper {
public BackpacksChannel() {
super(WearableBackpacks.MOD_ID);
registerMessage(MessageSyncSettings.Handler.class, MessageSyncSettings.class, 0, Side.CLIENT);
registerMessage(MessageBackpackUpdate.Handler.class, MessageBackpackUpdate.class, 1, Side.CLIENT);
registerMessage(MessageOpenGui.Handler.class, MessageOpenGui.class, 2, Side.CLIENT);
registerMessage(MessageOpenBackpack.Handler.class, MessageOpenBackpack.class, 3, Side.SERVER);
}
/** Sends a message to a player. */
public void sendTo(IMessage message, EntityPlayer player) {
sendTo(message, (EntityPlayerMP)player);
}
/** Sends a message to everyone around a point. */
public void sendToAllAround(IMessage message, World world, double x, double y, double z, double distance) {
sendToAllAround(message, new TargetPoint(world.provider.getDimension(), x, y, z, distance));
}
/** Sends a message to everyone around a point except a specific player. */
public void sendToAllAround(IMessage message, World world, double x, double y, double z,
double distance, EntityPlayer except) {
for (EntityPlayer player : (List<EntityPlayer>)world.playerEntities) {
if (player == except) continue;
double dx = x - player.posX;
double dy = y - player.posY;
double dz = z - player.posZ;
if ((dx * dx + dy * dy + dz * dz) < (distance * distance))
sendTo(message, player);
}
}
/** Sends a message to a everyone tracking an entity. If sendToEntity is
* true and the entity is a player, also sends the message to them. */
public void sendToAllTracking(IMessage message, Entity entity, boolean sendToEntity) {
((WorldServer)entity.world).getEntityTracker()
.sendToTracking(entity, getPacketFrom(message));
if (sendToEntity && (entity instanceof EntityPlayer))
sendTo(message, (EntityPlayer)entity);
}
}