package crazypants.enderio.teleport.packet;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.network.play.server.S12PacketEntityVelocity;
import net.minecraftforge.common.MinecraftForge;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import crazypants.enderio.api.teleport.IItemOfTravel;
import crazypants.enderio.api.teleport.TeleportEntityEvent;
import crazypants.enderio.api.teleport.TravelSource;
import com.enderio.core.common.util.Util;
import com.enderio.core.common.vecmath.Vector3d;
public class PacketTravelEvent implements IMessage, IMessageHandler<PacketTravelEvent, IMessage> {
int x;
int y;
int z;
int powerUse;
boolean conserveMotion;
int entityId;
int source;
public PacketTravelEvent() {
}
public PacketTravelEvent(Entity entity, int x, int y, int z, int powerUse, boolean conserveMotion, TravelSource source) {
this.x = x;
this.y = y;
this.z = z;
this.powerUse = powerUse;
this.conserveMotion = conserveMotion;
this.entityId = entity instanceof EntityPlayer ? -1 : entity.getEntityId();
this.source = source.ordinal();
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(x);
buf.writeInt(y);
buf.writeInt(z);
buf.writeInt(powerUse);
buf.writeBoolean(conserveMotion);
buf.writeInt(entityId);
buf.writeInt(source);
}
@Override
public void fromBytes(ByteBuf buf) {
x = buf.readInt();
y = buf.readInt();
z = buf.readInt();
powerUse = buf.readInt();
conserveMotion = buf.readBoolean();
entityId = buf.readInt();
source = buf.readInt();
}
@Override
public IMessage onMessage(PacketTravelEvent message, MessageContext ctx) {
Entity toTp = message.entityId == -1 ? ctx.getServerHandler().playerEntity : ctx.getServerHandler().playerEntity.worldObj.getEntityByID(message.entityId);
int x = message.x, y = message.y, z = message.z;
TravelSource source = TravelSource.values()[message.source];
doServerTeleport(toTp, x, y, z, message.powerUse, message.conserveMotion, source);
return null;
}
public static boolean doServerTeleport(Entity toTp, int x, int y, int z, int powerUse, boolean conserveMotion, TravelSource source) {
EntityPlayer player = toTp instanceof EntityPlayer ? (EntityPlayer) toTp : null;
TeleportEntityEvent evt = new TeleportEntityEvent(toTp, source, x, y, z);
if(MinecraftForge.EVENT_BUS.post(evt)) {
return false;
}
x = evt.targetX;
y = evt.targetY;
z = evt.targetZ;
toTp.worldObj.playSoundEffect(toTp.posX, toTp.posY, toTp.posZ, source.sound, 1.0F, 1.0F);
toTp.playSound(source.sound, 1.0F, 1.0F);
if(player != null) {
player.setPositionAndUpdate(x + 0.5, y + 1.1, z + 0.5);
} else {
toTp.setPosition(x, y, z);
}
toTp.worldObj.playSoundEffect(x, y, z, source.sound, 1.0F, 1.0F);
toTp.fallDistance = 0;
if(player != null) {
if(conserveMotion) {
Vector3d velocityVex = Util.getLookVecEio(player);
S12PacketEntityVelocity p = new S12PacketEntityVelocity(toTp.getEntityId(), velocityVex.x, velocityVex.y, velocityVex.z);
((EntityPlayerMP) player).playerNetServerHandler.sendPacket(p);
}
if(powerUse > 0 && player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof IItemOfTravel) {
ItemStack item = player.getCurrentEquippedItem().copy();
((IItemOfTravel) item.getItem()).extractInternal(item, powerUse);
toTp.setCurrentItemOrArmor(0, item);
}
}
return true;
}
}