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
|
|
|
|
2019-08-23 23:55:09 +02:00
|
|
|
// TODO viewers synchronization each X ticks?
|
2019-08-20 17:41:07 +02:00
|
|
|
public abstract class EntityCreature extends LivingEntity {
|
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-24 20:34:01 +02:00
|
|
|
@Override
|
|
|
|
public void update() {
|
|
|
|
super.update();
|
|
|
|
}
|
|
|
|
|
2019-08-21 16:50:52 +02:00
|
|
|
public void move(float x, float y, float z) {
|
2019-08-24 20:34:01 +02:00
|
|
|
if (velocityTime != 0) {
|
|
|
|
// Cancel movements if velocity is active
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO change yaw/pitch based on next position?
|
2019-08-21 16:50:52 +02:00
|
|
|
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-24 20:34:01 +02:00
|
|
|
@Override
|
2019-08-21 16:50:52 +02:00
|
|
|
public void kill() {
|
2019-08-23 23:55:09 +02:00
|
|
|
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) {
|
2019-08-20 17:41:07 +02:00
|
|
|
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
|
|
|
}
|
2019-08-23 23:55:09 +02:00
|
|
|
|
2019-08-10 08:44:35 +02:00
|
|
|
}
|