Fix mob execution timer and player animation sync
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
package net.fretux.knockedback.client;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class ClientGrippedState {
|
||||
private static final Set<UUID> grippedPlayers = new HashSet<>();
|
||||
|
||||
public static void setGripped(UUID playerId, boolean gripped) {
|
||||
if (gripped) {
|
||||
grippedPlayers.add(playerId);
|
||||
} else {
|
||||
grippedPlayers.remove(playerId);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isGripped(UUID playerId) {
|
||||
return grippedPlayers.contains(playerId);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package net.fretux.knockedback.client;
|
||||
|
||||
import dev.kosmx.playerAnim.api.layered.IAnimation;
|
||||
import dev.kosmx.playerAnim.api.layered.ModifierLayer;
|
||||
import dev.kosmx.playerAnim.core.player.KeyframeAnimationPlayer;
|
||||
import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationAccess;
|
||||
import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationRegistry;
|
||||
import net.fretux.knockedback.KnockedBack;
|
||||
import net.minecraft.client.player.AbstractClientPlayer;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.event.TickEvent;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
@Mod.EventBusSubscriber(modid = KnockedBack.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE)
|
||||
public class PlayerAnimationHandler {
|
||||
private static final ResourceLocation GRIP_ANIMATION_ID = new ResourceLocation(KnockedBack.MOD_ID, "animation.model.gripping");
|
||||
private static final Map<UUID, ModifierLayer<IAnimation>> layers = new HashMap<>();
|
||||
private static final Map<UUID, Boolean> activeStates = new HashMap<>();
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onPlayerTick(TickEvent.PlayerTickEvent event) {
|
||||
if (event.phase != TickEvent.Phase.END) return;
|
||||
if (!(event.player instanceof AbstractClientPlayer player)) return;
|
||||
UUID playerId = player.getUUID();
|
||||
boolean shouldGrip = ClientGrippedState.isGripped(playerId);
|
||||
boolean wasGripping = activeStates.getOrDefault(playerId, false);
|
||||
if (shouldGrip == wasGripping) return;
|
||||
activeStates.put(playerId, shouldGrip);
|
||||
ModifierLayer<IAnimation> layer = layers.computeIfAbsent(playerId, id -> {
|
||||
ModifierLayer<IAnimation> newLayer = new ModifierLayer<>();
|
||||
PlayerAnimationAccess.getPlayerAnimLayer(player).addAnimLayer(newLayer);
|
||||
return newLayer;
|
||||
});
|
||||
if (shouldGrip) {
|
||||
var animation = PlayerAnimationRegistry.getAnimation(GRIP_ANIMATION_ID);
|
||||
if (animation != null) {
|
||||
layer.setAnimation(new KeyframeAnimationPlayer(animation));
|
||||
}
|
||||
} else {
|
||||
layer.setAnimation(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user