diff --git a/demo/src/main/java/net/minestom/demo/Main.java b/demo/src/main/java/net/minestom/demo/Main.java index 255bc525bf7..cebf98a4a00 100644 --- a/demo/src/main/java/net/minestom/demo/Main.java +++ b/demo/src/main/java/net/minestom/demo/Main.java @@ -62,6 +62,7 @@ public static void main(String[] args) { commandManager.register(new TestCommand2()); commandManager.register(new ConfigCommand()); commandManager.register(new SidebarCommand()); + commandManager.register(new SetEntityType()); commandManager.setUnknownCommandCallback((sender, command) -> sender.sendMessage(Component.text("Unknown command", NamedTextColor.RED))); diff --git a/demo/src/main/java/net/minestom/demo/commands/SetEntityType.java b/demo/src/main/java/net/minestom/demo/commands/SetEntityType.java new file mode 100644 index 00000000000..365db971fd9 --- /dev/null +++ b/demo/src/main/java/net/minestom/demo/commands/SetEntityType.java @@ -0,0 +1,29 @@ +package net.minestom.demo.commands; + +import net.minestom.server.command.CommandSender; +import net.minestom.server.command.builder.Command; +import net.minestom.server.command.builder.CommandContext; +import net.minestom.server.command.builder.arguments.ArgumentType; +import net.minestom.server.command.builder.arguments.minecraft.registry.ArgumentEntityType; +import net.minestom.server.entity.Player; +import org.jetbrains.annotations.NotNull; + +public class SetEntityType extends Command { + private final ArgumentEntityType entityTypeArg = ArgumentType.EntityType("type"); + + public SetEntityType() { + super("setentitytype"); + + addSyntax(this::execute, entityTypeArg); + } + + private void execute(@NotNull CommandSender sender, @NotNull CommandContext context) { + if (!(sender instanceof Player player)) { + return; + } + + var entityType = context.get(entityTypeArg); + player.switchEntityType(entityType); + player.sendMessage("set entity type to " + entityType); + } +} diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index c440f3d1797..ed8cd36d6ab 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -820,6 +820,9 @@ protected void updatePose() { Pose oldPose = getPose(); Pose newPose; + // If they are not a player, do nothing + if (!getEntityType().equals(EntityType.PLAYER)) return; + // Figure out their expected state var meta = Objects.requireNonNull(getLivingEntityMeta()); if (meta.isFlyingWithElytra()) { @@ -1015,27 +1018,39 @@ public void setHealth(float health) { sendPacket(new UpdateHealthPacket(health, food, foodSaturation)); } - @Override - public @NotNull PlayerMeta getEntityMeta() { + /** + * Gets the entity meta for the player. + * + *

Note that this method will throw an exception if the player's entity type has + * been changed with {@link #switchEntityType(EntityType)}. It is wise to check + * {@link #getEntityType()} first.

+ */ + public @NotNull PlayerMeta getPlayerMeta() { return (PlayerMeta) super.getEntityMeta(); } /** * Gets the player additional hearts. * + *

Note that this function is uncallable if the player has their entity type switched + * with {@link #switchEntityType(EntityType)}.

+ * * @return the player additional hearts */ public float getAdditionalHearts() { - return getEntityMeta().getAdditionalHearts(); + return getPlayerMeta().getAdditionalHearts(); } /** * Changes the amount of additional hearts shown. * + *

Note that this function is uncallable if the player has their entity type switched + * with {@link #switchEntityType(EntityType)}.

+ * * @param additionalHearts the count of additional hearts */ public void setAdditionalHearts(float additionalHearts) { - getEntityMeta().setAdditionalHearts(additionalHearts); + getPlayerMeta().setAdditionalHearts(additionalHearts); } /** diff --git a/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java b/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java index 47414120ff3..9c3beec2c31 100644 --- a/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java @@ -4,7 +4,7 @@ import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.GameMode; import net.minestom.server.entity.Player; -import net.minestom.server.entity.metadata.PlayerMeta; +import net.minestom.server.entity.metadata.LivingEntityMeta; import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.item.ItemUpdateStateEvent; import net.minestom.server.event.player.PlayerCancelDiggingEvent; @@ -145,8 +145,8 @@ private static void dropSingle(Player player) { } private static void updateItemState(Player player) { - PlayerMeta meta = player.getEntityMeta(); - if (!meta.isHandActive()) return; + LivingEntityMeta meta = player.getLivingEntityMeta(); + if (meta == null || !meta.isHandActive()) return; Player.Hand hand = meta.getActiveHand(); player.refreshEating(null);