Citizens2/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/PlayerAnimationImpl.java

88 lines
3.6 KiB
Java
Raw Normal View History

package net.citizensnpcs.nms.v1_19_R3.util;
2022-06-08 05:58:22 +02:00
import java.util.Map;
2023-02-22 17:06:13 +01:00
2022-06-08 05:58:22 +02:00
import org.bukkit.entity.Player;
import org.bukkit.metadata.FixedMetadataValue;
2023-02-22 17:06:13 +01:00
2022-06-08 05:58:22 +02:00
import com.google.common.collect.Maps;
2023-02-22 17:06:13 +01:00
import net.citizensnpcs.api.CitizensAPI;
2022-06-08 05:58:22 +02:00
import net.citizensnpcs.util.PlayerAnimation;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientboundAnimatePacket;
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
2023-01-01 13:44:17 +01:00
import net.minecraft.world.entity.Pose;
2022-06-08 05:58:22 +02:00
public class PlayerAnimationImpl {
public static void play(PlayerAnimation animation, Player bplayer, int radius) {
final ServerPlayer player = (ServerPlayer) NMSImpl.getHandle(bplayer);
if (DEFAULTS.containsKey(animation)) {
playDefaultAnimation(player, radius, DEFAULTS.get(animation));
return;
}
switch (animation) {
case SNEAK:
2023-01-01 13:44:17 +01:00
player.setPose(Pose.CROUCHING);
2022-12-10 07:59:27 +01:00
sendEntityData(radius, player);
2022-06-08 05:58:22 +02:00
break;
case START_ELYTRA:
player.startFallFlying();
break;
case STOP_ELYTRA:
player.stopFallFlying();
break;
2022-06-08 05:58:22 +02:00
case START_USE_MAINHAND_ITEM:
player.startUsingItem(InteractionHand.MAIN_HAND);
2022-12-10 07:59:27 +01:00
sendEntityData(radius, player);
player.getBukkitEntity().setMetadata("citizens-using-item-remaining-ticks",
new FixedMetadataValue(CitizensAPI.getPlugin(), player.getUseItemRemainingTicks()));
2022-06-08 05:58:22 +02:00
break;
case START_USE_OFFHAND_ITEM:
player.startUsingItem(InteractionHand.OFF_HAND);
2022-12-10 07:59:27 +01:00
sendEntityData(radius, player);
player.getBukkitEntity().setMetadata("citizens-using-item-remaining-ticks",
new FixedMetadataValue(CitizensAPI.getPlugin(), player.getUseItemRemainingTicks()));
2022-06-08 05:58:22 +02:00
break;
case STOP_SNEAKING:
2023-01-01 13:44:17 +01:00
player.setPose(Pose.STANDING);
2022-12-10 07:59:27 +01:00
sendEntityData(radius, player);
2022-06-08 05:58:22 +02:00
break;
case STOP_USE_ITEM:
player.stopUsingItem();
2022-12-10 07:59:27 +01:00
sendEntityData(radius, player);
2022-06-08 05:58:22 +02:00
break;
default:
throw new UnsupportedOperationException();
}
}
protected static void playDefaultAnimation(ServerPlayer player, int radius, int code) {
ClientboundAnimatePacket packet = new ClientboundAnimatePacket(player, code);
sendPacketNearby(packet, player, radius);
}
2022-12-10 07:59:27 +01:00
private static void sendEntityData(int radius, final ServerPlayer player) {
if (!player.getEntityData().isDirty())
return;
sendPacketNearby(new ClientboundSetEntityDataPacket(player.getId(), player.getEntityData().packDirty()), player,
radius);
}
2022-06-08 05:58:22 +02:00
protected static void sendPacketNearby(Packet<?> packet, ServerPlayer player, int radius) {
NMSImpl.sendPacketNearby(player.getBukkitEntity(), player.getBukkitEntity().getLocation(), packet, radius);
}
private static Map<PlayerAnimation, Integer> DEFAULTS = Maps.newEnumMap(PlayerAnimation.class);
static {
DEFAULTS.put(PlayerAnimation.ARM_SWING, 0);
DEFAULTS.put(PlayerAnimation.HURT, 1);
DEFAULTS.put(PlayerAnimation.LEAVE_BED, 2);
DEFAULTS.put(PlayerAnimation.ARM_SWING_OFFHAND, 3);
DEFAULTS.put(PlayerAnimation.CRIT, 4);
DEFAULTS.put(PlayerAnimation.MAGIC_CRIT, 5);
}
}