Minestom/src/main/java/fr/themode/minestom/entity/EntityCreature.java

66 lines
2.3 KiB
Java
Raw Normal View History

2019-08-10 08:44:35 +02:00
package fr.themode.minestom.entity;
2019-08-21 16:50:52 +02:00
import fr.themode.minestom.net.packet.server.play.EntityPacket;
import fr.themode.minestom.net.packet.server.play.EntityRelativeMovePacket;
import fr.themode.minestom.net.packet.server.play.SpawnMobPacket;
2019-08-10 08:44:35 +02:00
import fr.themode.minestom.net.player.PlayerConnection;
2019-08-21 16:50:52 +02:00
import fr.themode.minestom.utils.Position;
2019-08-10 08:44:35 +02:00
// TODO viewers synchronization each X ticks?
public abstract class EntityCreature extends LivingEntity {
2019-08-10 08:44:35 +02:00
protected boolean isDead;
2019-08-10 08:44:35 +02:00
public EntityCreature(int entityType) {
2019-08-19 17:04:19 +02:00
super(entityType);
2019-08-10 08:44:35 +02:00
}
2019-08-21 16:50:52 +02:00
public void move(float x, float y, float z) {
Position position = getPosition();
float newX = position.getX() + x;
float newY = position.getY() + y;
float newZ = position.getZ() + z;
2019-08-11 13:57:23 +02:00
2019-08-21 16:50:52 +02:00
if (isChunkUnloaded(newX, newZ))
2019-08-11 13:57:23 +02:00
return;
EntityRelativeMovePacket entityRelativeMovePacket = new EntityRelativeMovePacket();
entityRelativeMovePacket.entityId = getEntityId();
2019-08-21 16:50:52 +02:00
entityRelativeMovePacket.deltaX = (short) ((newX * 32 - position.getX() * 32) * 128);
entityRelativeMovePacket.deltaY = (short) ((newY * 32 - position.getY() * 32) * 128);
entityRelativeMovePacket.deltaZ = (short) ((newZ * 32 - position.getZ() * 32) * 128);
2019-08-11 13:57:23 +02:00
entityRelativeMovePacket.onGround = true;
sendPacketToViewers(entityRelativeMovePacket);
refreshPosition(newX, newY, newZ);
}
2019-08-21 16:50:52 +02:00
public void kill() {
this.isDead = true;
2019-08-21 16:50:52 +02:00
triggerStatus((byte) 3);
scheduleRemove(1000);
2019-08-11 13:57:23 +02:00
}
2019-08-19 17:04:19 +02:00
@Override
2019-08-10 08:44:35 +02:00
public void addViewer(Player player) {
super.addViewer(player);
2019-08-10 08:44:35 +02:00
PlayerConnection playerConnection = player.getPlayerConnection();
EntityPacket entityPacket = new EntityPacket();
entityPacket.entityId = getEntityId();
SpawnMobPacket spawnMobPacket = new SpawnMobPacket();
spawnMobPacket.entityId = getEntityId();
spawnMobPacket.entityUuid = getUuid();
spawnMobPacket.entityType = getEntityType();
2019-08-21 16:50:52 +02:00
spawnMobPacket.position = getPosition();
2019-08-10 08:44:35 +02:00
spawnMobPacket.headPitch = 0;
playerConnection.sendPacket(entityPacket);
playerConnection.sendPacket(spawnMobPacket);
2019-08-22 14:52:32 +02:00
playerConnection.sendPacket(getMetadataPacket());
2019-08-10 08:44:35 +02:00
}
public boolean isDead() {
return isDead;
}
2019-08-10 08:44:35 +02:00
}