From a5ed14183e5bd6d19092a141f9e6bb4bbfc027e3 Mon Sep 17 00:00:00 2001 From: "Luis C.M" <42545778+c0508383@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:55:03 -0500 Subject: [PATCH] Animations now continue where they should be when players rejoin a world/server. --- src/main/java/noppes/npcs/CommonProxy.java | 6 +- .../java/noppes/npcs/ServerEventsHandler.java | 24 ++++-- .../npcs/client/ClientCacheHandler.java | 1 - .../noppes/npcs/client/ClientTickHandler.java | 2 +- .../npcs/client/PacketHandlerClient.java | 9 ++- .../npcs/controllers/data/Animation.java | 35 ++++++--- .../npcs/controllers/data/AnimationData.java | 74 ++++++++++++++++--- 7 files changed, 117 insertions(+), 34 deletions(-) diff --git a/src/main/java/noppes/npcs/CommonProxy.java b/src/main/java/noppes/npcs/CommonProxy.java index 68c9db672..ebcb3ed1a 100644 --- a/src/main/java/noppes/npcs/CommonProxy.java +++ b/src/main/java/noppes/npcs/CommonProxy.java @@ -95,8 +95,10 @@ public class CommonProxy implements IGuiHandler { @SideOnly(Side.CLIENT) private boolean clientRemoveAnimation(Entity entity) { - return Minecraft.getMinecraft().currentScreen == null - && !Minecraft.getMinecraft().theWorld.loadedEntityList.contains(entity); + if (Minecraft.getMinecraft().currentScreen == null && !Minecraft.getMinecraft().theWorld.loadedEntityList.contains(entity)) { + return true; + } + return false; } public PlayerData getPlayerData(EntityPlayer player) { diff --git a/src/main/java/noppes/npcs/ServerEventsHandler.java b/src/main/java/noppes/npcs/ServerEventsHandler.java index ab7b67a5d..7742199d8 100644 --- a/src/main/java/noppes/npcs/ServerEventsHandler.java +++ b/src/main/java/noppes/npcs/ServerEventsHandler.java @@ -497,12 +497,24 @@ public class ServerEventsHandler { @SubscribeEvent public void playerTracking(PlayerEvent.StartTracking event){ - if(!(event.target instanceof EntityNPCInterface) || event.target.worldObj.isRemote) - return; + if (event.target.worldObj.isRemote) return; - MarkData data = MarkData.get((EntityNPCInterface) event.target); - if(data.marks.isEmpty()) - return; - Server.sendData((EntityPlayerMP)event.entityPlayer, EnumPacketClient.MARK_DATA, event.target.getEntityId(), data.getNBT()); + if(event.target instanceof EntityPlayerMP || event.target instanceof EntityNPCInterface) { + AnimationData animationData = AnimationData.getData(event.target); + if (animationData.isClientAnimating()) { + AnimationData playerAnimData = AnimationData.getData(event.entityPlayer); + Animation currentAnimation = animationData.currentClientAnimation; + NBTTagCompound compound = currentAnimation.writeToNBT(); + playerAnimData.viewAnimation(currentAnimation, animationData, compound, + animationData.isClientAnimating(), currentAnimation.currentFrame, currentAnimation.currentFrameTime); + } + + if (event.target instanceof EntityNPCInterface) { + MarkData data = MarkData.get((EntityNPCInterface) event.target); + if (data.marks.isEmpty()) + return; + Server.sendData((EntityPlayerMP) event.entityPlayer, EnumPacketClient.MARK_DATA, event.target.getEntityId(), data.getNBT()); + } + } } } diff --git a/src/main/java/noppes/npcs/client/ClientCacheHandler.java b/src/main/java/noppes/npcs/client/ClientCacheHandler.java index bf9c920f4..810cc4bf0 100644 --- a/src/main/java/noppes/npcs/client/ClientCacheHandler.java +++ b/src/main/java/noppes/npcs/client/ClientCacheHandler.java @@ -57,7 +57,6 @@ public class ClientCacheHandler { ClientCacheHandler.skinOverlays.clear(); ClientCacheHandler.playerAnimations.clear(); ClientCacheHandler.playerData.animationData.clearCache(); - CommonProxy.clientPlayingAnimations.clear(); } public static void clearSkinCache() { diff --git a/src/main/java/noppes/npcs/client/ClientTickHandler.java b/src/main/java/noppes/npcs/client/ClientTickHandler.java index 4be801a9b..a2f82b27e 100644 --- a/src/main/java/noppes/npcs/client/ClientTickHandler.java +++ b/src/main/java/noppes/npcs/client/ClientTickHandler.java @@ -32,7 +32,7 @@ public class ClientTickHandler{ @SubscribeEvent(priority = EventPriority.LOWEST) public void onClientTick(TickEvent.ClientTickEvent event){ Minecraft mc = Minecraft.getMinecraft(); - if ((this.prevWorld == null || mc.theWorld == null) && this.prevWorld != mc.theWorld) { + if (mc.theWorld != null && this.prevWorld != mc.theWorld) { ClientCacheHandler.clearCache(); this.prevWorld = mc.theWorld; } diff --git a/src/main/java/noppes/npcs/client/PacketHandlerClient.java b/src/main/java/noppes/npcs/client/PacketHandlerClient.java index b989406cb..d5137c903 100644 --- a/src/main/java/noppes/npcs/client/PacketHandlerClient.java +++ b/src/main/java/noppes/npcs/client/PacketHandlerClient.java @@ -375,8 +375,13 @@ public class PacketHandlerClient extends PacketHandlerServer{ } animationData.setAnimation(ClientCacheHandler.animationCache.get(animationId)); - animationData.readFromNBT(compound); - Client.sendData(EnumPacketServer.CacheAnimation, animationId); + animationData.viewReadFromNBT(compound); + + if (compound.hasKey("Frame")) { + animationData.animation.readFromNBT(compound.getCompoundTag("Animation")); + } else if (compound.hasKey("Animation")) { + Client.sendData(EnumPacketServer.CacheAnimation, animationId); + } } } else if(type == EnumPacketClient.DISABLE_MOUSE_INPUT) { diff --git a/src/main/java/noppes/npcs/controllers/data/Animation.java b/src/main/java/noppes/npcs/controllers/data/Animation.java index 0b9ae8fd7..24c6a28c6 100644 --- a/src/main/java/noppes/npcs/controllers/data/Animation.java +++ b/src/main/java/noppes/npcs/controllers/data/Animation.java @@ -210,6 +210,9 @@ public class Animation implements IAnimation { this.whileStanding = compound.getBoolean("WhileStanding"); this.whileMoving = compound.getBoolean("WhileWalking"); this.whileAttacking = compound.getBoolean("WhileAttacking"); + + this.currentFrame = compound.getInteger("CurrentFrame"); + this.currentFrameTime = compound.getInteger("CurrentFrameTime"); } public NBTTagCompound writeToNBT(){ @@ -231,6 +234,9 @@ public class Animation implements IAnimation { compound.setBoolean("WhileStanding", whileStanding); compound.setBoolean("WhileWalking", whileMoving); compound.setBoolean("WhileAttacking", whileAttacking); + + compound.setInteger("CurrentFrame", currentFrame); + compound.setInteger("CurrentFrameTime", currentFrameTime); return compound; } @@ -277,16 +283,23 @@ public class Animation implements IAnimation { @SideOnly(Side.CLIENT) public void jumpToCurrentFrame() { - this.currentFrameTime = 0; - Frame frame = (Frame) this.currentFrame(); - if(frame != null){ - for (EnumAnimationPart part : EnumAnimationPart.values()) { - if(part != null){ - if (frame.frameParts.containsKey(part)) { - frame.frameParts.get(part).jumpToCurrentFrame(); - } - } - } - } + this.jumpToFrameAtTime(this.currentFrame, 0); } + + @SideOnly(Side.CLIENT) + public void jumpToFrameAtTime(int frameIndex, int time) { + this.currentFrame = frameIndex; + this.currentFrameTime = time; + + Frame frame = (Frame) this.currentFrame(); + if(frame != null){ + for (EnumAnimationPart part : EnumAnimationPart.values()) { + if(part != null){ + if (frame.frameParts.containsKey(part)) { + frame.frameParts.get(part).jumpToCurrentFrame(); + } + } + } + } + } } diff --git a/src/main/java/noppes/npcs/controllers/data/AnimationData.java b/src/main/java/noppes/npcs/controllers/data/AnimationData.java index d8d4a07f7..097c944c6 100644 --- a/src/main/java/noppes/npcs/controllers/data/AnimationData.java +++ b/src/main/java/noppes/npcs/controllers/data/AnimationData.java @@ -1,7 +1,7 @@ package noppes.npcs.controllers.data; -import cpw.mods.fml.common.FMLCommonHandler; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -10,6 +10,7 @@ import net.minecraft.util.AxisAlignedBB; import noppes.npcs.*; import noppes.npcs.api.entity.IAnimatable; import noppes.npcs.api.entity.ICustomNpc; +import noppes.npcs.api.entity.IEntity; import noppes.npcs.api.entity.IPlayer; import noppes.npcs.api.handler.data.IAnimation; import noppes.npcs.api.handler.data.IAnimationData; @@ -32,7 +33,7 @@ public class AnimationData implements IAnimationData { public Animation animation; public boolean allowAnimation = false; - private Animation sentAnimation; + public Animation currentClientAnimation; private boolean isClientAnimating; private final HashSet cachedAnimationIDs = new HashSet<>(); @@ -51,6 +52,16 @@ public class AnimationData implements IAnimationData { } } + public static AnimationData getData(Entity entity) { + if (entity instanceof EntityPlayerMP) { + return PlayerData.get((EntityPlayer) entity).animationData; + } else if (entity instanceof EntityNPCInterface) { + return ((EntityNPCInterface)entity).display.animationData; + } else { + return null; + } + } + public IAnimatable getEntity() { if (this.parent instanceof DataDisplay) { EntityNPCInterface npc = ((DataDisplay)this.parent).npc; @@ -74,13 +85,13 @@ public class AnimationData implements IAnimationData { EntityLivingBase sendingEntity = parent instanceof PlayerData ? ((PlayerData) parent).player : parent instanceof DataDisplay ? ((DataDisplay) parent).npc : null; float range = parent instanceof PlayerData ? 160 : 60; if (sendingEntity != null) { - boolean prevIsClientAnimating = this.isClientAnimating && this.sentAnimation.currentFrame() != null; + boolean prevIsClientAnimating = this.isClientAnimating && this.currentClientAnimation.currentFrame() != null; this.isClientAnimating = this.allowAnimation && this.animation != null; - if (prevIsClientAnimating && (!this.isClientAnimating || this.animation != this.sentAnimation)) { - EventHooks.onAnimationEnded(this.sentAnimation); + if (prevIsClientAnimating && (!this.isClientAnimating || this.animation != this.currentClientAnimation)) { + EventHooks.onAnimationEnded(this.currentClientAnimation); } if (this.isClientAnimating) { - this.sentAnimation = this.animation; + this.currentClientAnimation = this.animation; } if (this.animation != null && this.allowAnimation) { @@ -105,11 +116,15 @@ public class AnimationData implements IAnimationData { if (animationNBT == null && this.animation != null && !animationData.isCached(this.animation.getID())) { animationNBT = this.animation.writeToNBT(); } - animationData.viewAnimation(this.animation, sendingEntity, this, animationNBT); + animationData.viewAnimation(this.animation, this, animationNBT); } } } + public boolean isClientAnimating() { + return this.isClientAnimating; + } + public boolean isActive() { if (!this.allowAnimation || this.animation == null || this.animation.currentFrame == this.animation.frames.size() || animation.currentFrame() == null) return false; @@ -152,27 +167,63 @@ public class AnimationData implements IAnimationData { this.cachedAnimationIDs.clear(); } - public void viewAnimation(Animation animation, EntityLivingBase entity, AnimationData animationData, NBTTagCompound animationNBT) { - NBTTagCompound data = animationData.writeToNBT(new NBTTagCompound()); + public void viewAnimation(Animation animation, AnimationData animationData, NBTTagCompound animationNBT) { + this.viewAnimation(animation, animationData, animationNBT, animationData.allowAnimation, -1, -1); + } + + public void viewAnimation(Animation animation, AnimationData animationData, NBTTagCompound animationNBT, boolean enabled, int currentFrame, int time) { + boolean prevEnabled = animationData.allowAnimation; + animationData.allowAnimation = enabled; + NBTTagCompound data = animationData.viewWriteNBT(new NBTTagCompound()); + animationData.allowAnimation = prevEnabled; + + + if (animation != null && currentFrame >= 0 && currentFrame < animation.frames.size()) { + data.setInteger("Frame", currentFrame); + data.setInteger("Time", time); + } + if (animation != null) { - if (this.cachedAnimationIDs.contains(animation.getID())) { + if (this.cachedAnimationIDs.contains(animation.getID()) && !data.hasKey("Frame")) { data.setInteger("AnimationID", animation.getID()); } else { data.setTag("Animation", animationNBT); } } + + IAnimatable animatable = animationData.getEntity(); + Entity entity = ((IEntity) animatable).getMCEntity(); if (!(entity instanceof EntityPlayer)) { data.setInteger("EntityId", entity.getEntityId()); } + Server.sendData((EntityPlayerMP) ((PlayerData) parent).player, EnumPacketClient.UPDATE_ANIMATIONS, data, entity.getCommandSenderName()); } + public NBTTagCompound viewWriteNBT(NBTTagCompound compound) { + compound.setBoolean("AllowAnimation", allowAnimation); + return compound; + } + + public void viewReadFromNBT(NBTTagCompound compound) { + this.setEnabled(compound.getBoolean("AllowAnimation")); + } + public NBTTagCompound writeToNBT(NBTTagCompound compound) { + if (this.currentClientAnimation != null) { + compound.setTag("CurrentAnimation", currentClientAnimation.writeToNBT()); + compound.setBoolean("IsClientAnimating", isClientAnimating); + } compound.setBoolean("AllowAnimation", allowAnimation); return compound; } public void readFromNBT(NBTTagCompound compound) { + if (compound.hasKey("CurrentAnimation")) { + this.currentClientAnimation = new Animation(); + this.currentClientAnimation.readFromNBT(compound.getCompoundTag("CurrentAnimation")); + this.isClientAnimating = compound.getBoolean("IsClientAnimating"); + } this.setEnabled(compound.getBoolean("AllowAnimation")); } @@ -194,11 +245,12 @@ public class AnimationData implements IAnimationData { if (animation != null) { newAnim = new Animation(); newAnim.readFromNBT(((Animation) animation).writeToNBT()); + newAnim.currentFrame = 0; + newAnim.currentFrameTime = 0; newAnim.parent = this; } if (CustomNpcs.proxy.hasClient() && newAnim != null) { - CommonProxy.clientPlayingAnimations.remove(this.animation); CommonProxy.clientPlayingAnimations.add(newAnim); } this.animation = newAnim;