2022-03-01 13:54:08 +01:00
|
|
|
package net.citizensnpcs.nms.v1_18_R2.util;
|
2021-12-01 15:56:22 +01:00
|
|
|
|
2022-03-23 13:57:18 +01:00
|
|
|
import java.util.Map;
|
2021-12-01 15:56:22 +01:00
|
|
|
|
2023-01-29 15:15:32 +01:00
|
|
|
import org.bukkit.Bukkit;
|
2021-12-01 15:56:22 +01:00
|
|
|
import org.bukkit.entity.Player;
|
2023-01-29 15:15:32 +01:00
|
|
|
import org.bukkit.metadata.FixedMetadataValue;
|
|
|
|
import org.bukkit.scheduler.BukkitRunnable;
|
2021-12-01 15:56:22 +01:00
|
|
|
|
|
|
|
import com.google.common.collect.Maps;
|
|
|
|
|
2023-01-29 15:15:32 +01:00
|
|
|
import net.citizensnpcs.api.CitizensAPI;
|
2021-12-01 15:56:22 +01: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;
|
2021-12-01 15:56:22 +01: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);
|
2021-12-01 15:56:22 +01:00
|
|
|
sendPacketNearby(new ClientboundSetEntityDataPacket(player.getId(), player.getEntityData(), true),
|
|
|
|
player, radius);
|
|
|
|
break;
|
|
|
|
case START_ELYTRA:
|
|
|
|
player.startFallFlying();
|
|
|
|
break;
|
2022-10-22 04:42:44 +02:00
|
|
|
case STOP_ELYTRA:
|
|
|
|
player.stopFallFlying();
|
|
|
|
break;
|
2021-12-01 15:56:22 +01:00
|
|
|
case START_USE_MAINHAND_ITEM:
|
|
|
|
player.startUsingItem(InteractionHand.MAIN_HAND);
|
2023-01-29 15:15:32 +01:00
|
|
|
new BukkitRunnable() {
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
player.startUsingItem(InteractionHand.MAIN_HAND);
|
|
|
|
sendPacketNearby(
|
|
|
|
new ClientboundSetEntityDataPacket(player.getId(), player.getEntityData(), true),
|
|
|
|
player, radius);
|
|
|
|
if (!player.getBukkitEntity().hasMetadata("citizens-using-item-id")) {
|
|
|
|
player.getBukkitEntity().setMetadata("citizens-using-item-id",
|
|
|
|
new FixedMetadataValue(CitizensAPI.getPlugin(), getTaskId()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}.runTaskTimer(CitizensAPI.getPlugin(), player.getUseItemRemainingTicks() - 1,
|
|
|
|
player.getUseItemRemainingTicks() - 1);
|
2021-12-01 15:56:22 +01:00
|
|
|
sendPacketNearby(new ClientboundSetEntityDataPacket(player.getId(), player.getEntityData(), true),
|
|
|
|
player, radius);
|
|
|
|
break;
|
|
|
|
case START_USE_OFFHAND_ITEM:
|
|
|
|
player.startUsingItem(InteractionHand.OFF_HAND);
|
2023-01-29 15:15:32 +01:00
|
|
|
new BukkitRunnable() {
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
player.startUsingItem(InteractionHand.OFF_HAND);
|
|
|
|
sendPacketNearby(
|
|
|
|
new ClientboundSetEntityDataPacket(player.getId(), player.getEntityData(), true),
|
|
|
|
player, radius);
|
|
|
|
if (!player.getBukkitEntity().hasMetadata("citizens-using-item-id")) {
|
|
|
|
player.getBukkitEntity().setMetadata("citizens-using-item-id",
|
|
|
|
new FixedMetadataValue(CitizensAPI.getPlugin(), getTaskId()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}.runTaskTimer(CitizensAPI.getPlugin(), player.getUseItemRemainingTicks() - 1,
|
|
|
|
player.getUseItemRemainingTicks() - 1);
|
2021-12-01 15:56:22 +01:00
|
|
|
sendPacketNearby(new ClientboundSetEntityDataPacket(player.getId(), player.getEntityData(), true),
|
|
|
|
player, radius);
|
|
|
|
break;
|
|
|
|
case STOP_SNEAKING:
|
2023-01-01 13:44:17 +01:00
|
|
|
player.setPose(Pose.STANDING);
|
2021-12-01 15:56:22 +01:00
|
|
|
sendPacketNearby(new ClientboundSetEntityDataPacket(player.getId(), player.getEntityData(), true),
|
|
|
|
player, radius);
|
|
|
|
break;
|
|
|
|
case STOP_USE_ITEM:
|
|
|
|
player.stopUsingItem();
|
2023-01-29 15:15:32 +01:00
|
|
|
if (player.getBukkitEntity().hasMetadata("citizens-using-item-id")) {
|
|
|
|
Bukkit.getScheduler()
|
|
|
|
.cancelTask(player.getBukkitEntity().getMetadata("citizens-using-item-id").get(0).asInt());
|
|
|
|
player.getBukkitEntity().removeMetadata("citizens-using-item-id", CitizensAPI.getPlugin());
|
|
|
|
}
|
2021-12-01 15:56:22 +01:00
|
|
|
sendPacketNearby(new ClientboundSetEntityDataPacket(player.getId(), player.getEntityData(), true),
|
|
|
|
player, radius);
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected static void sendPacketNearby(Packet<?> packet, ServerPlayer player, int radius) {
|
|
|
|
NMSImpl.sendPacketNearby(player.getBukkitEntity(), player.getBukkitEntity().getLocation(), packet, radius);
|
|
|
|
}
|
|
|
|
|
2022-03-23 13:57:18 +01:00
|
|
|
private static Map<PlayerAnimation, Integer> DEFAULTS = Maps.newEnumMap(PlayerAnimation.class);
|
2021-12-01 15:56:22 +01:00
|
|
|
static {
|
|
|
|
DEFAULTS.put(PlayerAnimation.ARM_SWING, 0);
|
|
|
|
DEFAULTS.put(PlayerAnimation.HURT, 1);
|
2022-04-13 05:14:37 +02:00
|
|
|
DEFAULTS.put(PlayerAnimation.LEAVE_BED, 2);
|
2021-12-01 15:56:22 +01:00
|
|
|
DEFAULTS.put(PlayerAnimation.ARM_SWING_OFFHAND, 3);
|
|
|
|
DEFAULTS.put(PlayerAnimation.CRIT, 4);
|
|
|
|
DEFAULTS.put(PlayerAnimation.MAGIC_CRIT, 5);
|
|
|
|
}
|
|
|
|
}
|