Skip to content

Instantly share code, notes, and snippets.

@Galaxtone
Created July 23, 2018 04:03
Show Gist options
  • Save Galaxtone/d73949555a5e2edae2bd0fb5c0840935 to your computer and use it in GitHub Desktop.
Save Galaxtone/d73949555a5e2edae2bd0fb5c0840935 to your computer and use it in GitHub Desktop.
package com.galaxtone.reltp;
import java.util.UUID;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
public class RelativeTeleportPacket implements IMessage {
private boolean isPlayer;
private int entityId;
private UUID uuid;
private Vec3d relativePosition;
private Vec3d rotationOrigin;
private float relativeYaw;
private float relativePitch;
@Override
public String toString() {
return "{" + (this.isPlayer ? "Player UUID: " + this.uuid : "Entity ID: " + this.entityId) + ", Position: " + relativePosition.toString() + ", Origin: " + rotationOrigin.toString() + ", Rotation: [" + relativeYaw + ", " + relativePitch + "]}";
}
public RelativeTeleportPacket(Entity entity, Vec3d relativePosition, Vec3d rotationOrigin, float relativeYaw, float relativePitch) {
if (entity instanceof EntityPlayerMP) {
this.isPlayer = true;
EntityPlayerMP player = (EntityPlayerMP) entity;
this.uuid = EntityPlayer.getUUID(player.getGameProfile());
} else {
this.isPlayer = false;
this.entityId = entity.getEntityId();
}
this.relativePosition = relativePosition;
this.rotationOrigin = rotationOrigin;
this.relativeYaw = relativeYaw;
this.relativePitch = relativePitch;
}
public RelativeTeleportPacket() {}
@Override
public void fromBytes(ByteBuf buffer) {
this.isPlayer = buffer.readBoolean();
if (this.isPlayer) {
this.uuid = new UUID(buffer.readLong(), buffer.readLong());
} else {
this.entityId = buffer.readInt();
}
this.relativePosition = new Vec3d(buffer.readDouble(), buffer.readDouble(), buffer.readDouble());
this.rotationOrigin = new Vec3d(buffer.readDouble(), buffer.readDouble(), buffer.readDouble());
this.relativeYaw = buffer.readFloat();
this.relativePitch = buffer.readFloat();
}
@Override
public void toBytes(ByteBuf buffer) {
buffer.writeBoolean(this.isPlayer);
if (this.isPlayer) {
buffer.writeLong(this.uuid.getMostSignificantBits());
buffer.writeLong(this.uuid.getLeastSignificantBits());
} else {
buffer.writeInt(this.entityId);
}
buffer.writeDouble(relativePosition.x);
buffer.writeDouble(relativePosition.y);
buffer.writeDouble(relativePosition.z);
buffer.writeDouble(rotationOrigin.x);
buffer.writeDouble(rotationOrigin.y);
buffer.writeDouble(rotationOrigin.z);
buffer.writeFloat(relativeYaw);
buffer.writeFloat(relativePitch);
}
public static final class Handler implements IMessageHandler<RelativeTeleportPacket, IMessage> {
@Override
public IMessage onMessage(RelativeTeleportPacket message, MessageContext context) {
Minecraft minecraft = Minecraft.getMinecraft();
Entity entity;
if (message.isPlayer)
entity = minecraft.world.getPlayerEntityByUUID(message.uuid);
else
entity = minecraft.world.getEntityByID(message.entityId);
minecraft.addScheduledTask(() -> {
TeleportUtils.relativeMove(entity, message.relativePosition, message.rotationOrigin, message.relativeYaw, message.relativePitch);
});
return null;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment