Use UUID instead of entity reference in teleporter calculations, fixed entity teleport

This commit is contained in:
aidancbrady 2016-04-05 09:52:37 -04:00
parent 176f82ab2f
commit 4227439a96
4 changed files with 90 additions and 13 deletions

View file

@ -27,8 +27,8 @@ import mekanism.common.network.PacketEditFilter;
import mekanism.common.network.PacketEditFilter.EditFilterMessage;
import mekanism.common.network.PacketElectricBowState;
import mekanism.common.network.PacketElectricBowState.ElectricBowStateMessage;
import mekanism.common.network.PacketPersonalChest;
import mekanism.common.network.PacketPersonalChest.PersonalChestMessage;
import mekanism.common.network.PacketEntityMove;
import mekanism.common.network.PacketEntityMove.EntityMoveMessage;
import mekanism.common.network.PacketFlamethrowerData;
import mekanism.common.network.PacketFlamethrowerData.FlamethrowerDataMessage;
import mekanism.common.network.PacketJetpackData;
@ -41,6 +41,8 @@ import mekanism.common.network.PacketNewFilter;
import mekanism.common.network.PacketNewFilter.NewFilterMessage;
import mekanism.common.network.PacketOredictionificatorGui;
import mekanism.common.network.PacketOredictionificatorGui.OredictionificatorGuiMessage;
import mekanism.common.network.PacketPersonalChest;
import mekanism.common.network.PacketPersonalChest.PersonalChestMessage;
import mekanism.common.network.PacketPortableTankState;
import mekanism.common.network.PacketPortableTankState.PortableTankStateMessage;
import mekanism.common.network.PacketPortableTeleporter;
@ -131,6 +133,7 @@ public class PacketHandler
netHandler.registerMessage(PacketFlamethrowerData.class, FlamethrowerDataMessage.class, 27, Side.CLIENT);
netHandler.registerMessage(PacketFlamethrowerData.class, FlamethrowerDataMessage.class, 27, Side.SERVER);
netHandler.registerMessage(PacketDropperUse.class, DropperUseMessage.class, 28, Side.SERVER);
netHandler.registerMessage(PacketEntityMove.class, EntityMoveMessage.class, 29, Side.CLIENT);
}
/**

View file

@ -0,0 +1,61 @@
package mekanism.common.network;
import io.netty.buffer.ByteBuf;
import mekanism.api.Pos3D;
import mekanism.common.PacketHandler;
import mekanism.common.network.PacketEntityMove.EntityMoveMessage;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
public class PacketEntityMove implements IMessageHandler<EntityMoveMessage, IMessage>
{
@Override
public IMessage onMessage(EntityMoveMessage message, MessageContext context)
{
EntityPlayer player = PacketHandler.getPlayer(context);
Entity entity = player.worldObj.getEntityByID(message.entityId);
if(entity != null)
{
entity.setLocationAndAngles(message.pos.xPos, message.pos.yPos, message.pos.zPos, entity.rotationYaw, entity.rotationPitch);
}
return null;
}
public static class EntityMoveMessage implements IMessage
{
public int entityId;
public Pos3D pos;
public EntityMoveMessage() {}
public EntityMoveMessage(Entity e)
{
entityId = e.getEntityId();
pos = new Pos3D(e);
}
@Override
public void toBytes(ByteBuf dataStream)
{
dataStream.writeInt(entityId);
dataStream.writeFloat((float)pos.xPos);
dataStream.writeFloat((float)pos.yPos);
dataStream.writeFloat((float)pos.zPos);
}
@Override
public void fromBytes(ByteBuf dataStream)
{
entityId = dataStream.readInt();
pos = new Pos3D(dataStream.readFloat(), dataStream.readFloat(), dataStream.readFloat());
}
}
}

View file

@ -107,7 +107,7 @@ public class PacketPortableTeleporter implements IMessageHandler<PortableTelepor
if(teleporter != null)
{
try {
teleporter.didTeleport.add(player);
teleporter.didTeleport.add(player.getPersistentID());
teleporter.teleDelay = 5;
item.setEnergy(itemstack, item.getEnergy(itemstack) - item.calculateEnergyCost(player, coords));

View file

@ -7,9 +7,11 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import mekanism.api.Chunk3D;
import mekanism.api.Coord4D;
import mekanism.api.Range4D;
import mekanism.common.Mekanism;
import mekanism.common.MekanismBlocks;
import mekanism.common.PacketHandler;
@ -20,6 +22,7 @@ import mekanism.common.frequency.Frequency;
import mekanism.common.frequency.FrequencyManager;
import mekanism.common.frequency.IFrequencyHandler;
import mekanism.common.integration.IComputerIntegration;
import mekanism.common.network.PacketEntityMove.EntityMoveMessage;
import mekanism.common.network.PacketPortalFX.PortalFXMessage;
import mekanism.common.network.PacketTileEntity.TileEntityMessage;
import mekanism.common.security.ISecurityTile;
@ -53,7 +56,7 @@ public class TileEntityTeleporter extends TileEntityElectricBlock implements ICo
public AxisAlignedBB teleportBounds = null;
public Set<Entity> didTeleport = new HashSet<Entity>();
public Set<UUID> didTeleport = new HashSet<UUID>();
public int teleDelay = 0;
@ -271,14 +274,20 @@ public class TileEntityTeleporter extends TileEntityElectricBlock implements ICo
public void cleanTeleportCache()
{
List<Entity> list = worldObj.getEntitiesWithinAABB(Entity.class, teleportBounds);
Set<Entity> teleportCopy = (Set<Entity>)((HashSet<Entity>)didTeleport).clone();
for(Entity entity : teleportCopy)
List<UUID> list = new ArrayList<UUID>();
for(Entity e : (List<Entity>)worldObj.getEntitiesWithinAABB(Entity.class, teleportBounds))
{
if(!list.contains(entity))
list.add(e.getPersistentID());
}
Set<UUID> teleportCopy = (Set<UUID>)((HashSet<UUID>)didTeleport).clone();
for(UUID id : teleportCopy)
{
if(!list.contains(id))
{
didTeleport.remove(entity);
didTeleport.remove(id);
}
}
}
@ -362,7 +371,7 @@ public class TileEntityTeleporter extends TileEntityElectricBlock implements ICo
if(teleporter != null)
{
teleporter.didTeleport.add(entity);
teleporter.didTeleport.add(entity.getPersistentID());
teleporter.teleDelay = 5;
if(entity instanceof EntityPlayerMP)
@ -450,11 +459,15 @@ public class TileEntityTeleporter extends TileEntityElectricBlock implements ICo
{
e.copyDataFrom(entity, true);
world.spawnEntityInWorld(e);
teleporter.didTeleport.add(e);
teleporter.didTeleport.add(e.getPersistentID());
}
entity.isDead = true;
}
else {
entity.setLocationAndAngles(coord.xCoord+0.5, coord.yCoord+1, coord.zCoord+0.5, entity.rotationYaw, entity.rotationPitch);
Mekanism.packetHandler.sendToReceivers(new EntityMoveMessage(entity), new Range4D(new Coord4D(entity)));
}
}
public static void alignPlayer(EntityPlayerMP player, Coord4D coord)
@ -501,7 +514,7 @@ public class TileEntityTeleporter extends TileEntityElectricBlock implements ICo
for(Entity entity : entities)
{
if(!didTeleport.contains(entity))
if(!didTeleport.contains(entity.getPersistentID()))
{
ret.add(entity);
}