Skip to content
This repository has been archived by the owner on Feb 24, 2024. It is now read-only.

Commit

Permalink
fix: Player#switchEntityType throws an exception
Browse files Browse the repository at this point in the history
  • Loading branch information
mworzala committed Jan 29, 2024
1 parent 002dcc2 commit 9fc4137
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 7 deletions.
1 change: 1 addition & 0 deletions demo/src/main/java/net/minestom/demo/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -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)));

Expand Down
29 changes: 29 additions & 0 deletions demo/src/main/java/net/minestom/demo/commands/SetEntityType.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
23 changes: 19 additions & 4 deletions src/main/java/net/minestom/server/entity/Player.java
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand Down Expand Up @@ -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.
*
* <p>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.</p>
*/
public @NotNull PlayerMeta getPlayerMeta() {
return (PlayerMeta) super.getEntityMeta();
}

/**
* Gets the player additional hearts.
*
* <p>Note that this function is uncallable if the player has their entity type switched
* with {@link #switchEntityType(EntityType)}.</p>
*
* @return the player additional hearts
*/
public float getAdditionalHearts() {
return getEntityMeta().getAdditionalHearts();
return getPlayerMeta().getAdditionalHearts();
}

/**
* Changes the amount of additional hearts shown.
*
* <p>Note that this function is uncallable if the player has their entity type switched
* with {@link #switchEntityType(EntityType)}.</p>
*
* @param additionalHearts the count of additional hearts
*/
public void setAdditionalHearts(float additionalHearts) {
getEntityMeta().setAdditionalHearts(additionalHearts);
getPlayerMeta().setAdditionalHearts(additionalHearts);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 9fc4137

Please sign in to comment.