mirror of
https://github.com/KAMKEEL/CustomNPC-Plus.git
synced 2026-11-12 00:17:27 +00:00
Removed "render ticks" tick type. Instead, animations and frames can define a tick speed measured in milliseconds. Animations/frames using MC tick type will be 50ms (1000ms/20), and render ticks 20ms.
This commit is contained in:
1 parent
de909472b3
commit
799631eece
11 files changed
+97
-95
No files matched your search
@@ -9,6 +9,7 @@ import noppes.npcs.controllers.data.*;
|
||||
import noppes.npcs.util.CacheHashMap;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.UUID;
|
||||
|
||||
public class ClientCacheHandler {
|
||||
@@ -18,7 +19,9 @@ public class ClientCacheHandler {
|
||||
public static OverlayQuestTracking questTrackingOverlay = null;
|
||||
public static HashMap<Integer, OverlayCustom> customOverlays = new HashMap<>();
|
||||
public static HashMap<UUID, HashMap<Integer, SkinOverlay>> skinOverlays = new HashMap<>();
|
||||
|
||||
public static HashMap<UUID, AnimationData> playerAnimations = new HashMap<>();
|
||||
public static HashSet<Animation> playingAnimations = new HashSet<>();
|
||||
|
||||
public static Party party;
|
||||
|
||||
@@ -54,6 +57,7 @@ public class ClientCacheHandler {
|
||||
ClientCacheHandler.skinOverlays.clear();
|
||||
ClientCacheHandler.playerAnimations.clear();
|
||||
ClientCacheHandler.playerData.animationData.clearCache();
|
||||
ClientCacheHandler.playingAnimations.clear();
|
||||
}
|
||||
|
||||
public static void clearSkinCache() {
|
||||
|
||||
@@ -123,35 +123,9 @@ public class ClientEventHandler {
|
||||
ClientEventHandler.playerModel = null;
|
||||
}
|
||||
|
||||
if (data != null && data.isActive() && !Minecraft.getMinecraft().isGamePaused()) {
|
||||
Animation animation = data.animation;
|
||||
if (data.isActive() && animation.currentFrame().useRenderTicks()) {
|
||||
animation.increaseTime();
|
||||
}
|
||||
}
|
||||
|
||||
ClientEventHandler.renderingNpc = null;
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onUpdateEntity(LivingEvent.LivingUpdateEvent event) {
|
||||
if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) {
|
||||
AnimationData data = null;
|
||||
if (event.entity instanceof EntityNPCInterface) {
|
||||
data = ((EntityNPCInterface) event.entity).display.animationData;
|
||||
} else if (event.entity instanceof EntityPlayer && ClientCacheHandler.playerAnimations.containsKey(event.entity.getUniqueID())) {
|
||||
data = ClientCacheHandler.playerAnimations.get(event.entity.getUniqueID());
|
||||
}
|
||||
|
||||
if (data != null && data.isActive()) {
|
||||
Animation animation = data.animation;
|
||||
if (data.isActive() && !animation.currentFrame().useRenderTicks()) {
|
||||
animation.increaseTime();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onRenderPlayer(RenderPlayerEvent.Pre event) {
|
||||
ClientEventHandler.renderingPlayer = event.entityPlayer;
|
||||
|
||||
@@ -23,6 +23,7 @@ import net.minecraft.stats.Achievement;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
import net.minecraft.util.ReportedException;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.Timer;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.client.MinecraftForgeClient;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
@@ -59,6 +60,7 @@ import noppes.npcs.config.ConfigMain;
|
||||
import noppes.npcs.config.StringCache;
|
||||
import noppes.npcs.constants.EnumGuiType;
|
||||
import noppes.npcs.containers.*;
|
||||
import noppes.npcs.controllers.data.Animation;
|
||||
import noppes.npcs.controllers.data.PlayerData;
|
||||
import noppes.npcs.entity.*;
|
||||
import noppes.npcs.entity.data.ModelData;
|
||||
@@ -80,7 +82,34 @@ public class ClientProxy extends CommonProxy {
|
||||
|
||||
public static FontContainer Font;
|
||||
|
||||
private static Timer animationTimer = new Timer(1000);
|
||||
private static long totalTicks;
|
||||
|
||||
public void load() {
|
||||
Thread thread = (new Thread("Animation Thread") { public void run() {
|
||||
while (true) {
|
||||
if (!Minecraft.getMinecraft().isGamePaused()) {
|
||||
animationTimer.updateTimer();
|
||||
}
|
||||
|
||||
try {
|
||||
for (int i = 0; i < animationTimer.elapsedTicks; ++i) {
|
||||
for (Animation animation : ClientCacheHandler.playingAnimations) {
|
||||
if (animation.parent.isActive() && totalTicks % animation.currentFrame().tickDuration() == 0) {
|
||||
animation.increaseTime();
|
||||
}
|
||||
}
|
||||
totalTicks++;
|
||||
}
|
||||
totalTicks %= 60 * 60 * 1000;
|
||||
ClientCacheHandler.playingAnimations.removeIf(animation ->
|
||||
animation.parent.animation != animation || !animation.parent.isActive());
|
||||
} catch (Exception ignored) {}
|
||||
}
|
||||
}});
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
|
||||
Font = new FontContainer(ConfigClient.FontType, ConfigClient.FontSize);
|
||||
createFolders();
|
||||
CustomNpcs.Channel.register(new PacketHandlerClient());
|
||||
|
||||
@@ -6,12 +6,12 @@ import noppes.npcs.controllers.data.Frame;
|
||||
|
||||
public class SubGuiAnimationFrame extends SubGuiInterface implements ITextfieldListener {
|
||||
private final Frame editingFrame;
|
||||
|
||||
|
||||
public SubGuiAnimationFrame(Frame editingFrame) {
|
||||
this.editingFrame = editingFrame;
|
||||
setBackground("smallbg.png");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void initGui() {
|
||||
super.initGui();
|
||||
@@ -33,7 +33,7 @@ public class SubGuiAnimationFrame extends SubGuiInterface implements ITextfieldL
|
||||
//
|
||||
//ticks - button
|
||||
this.addLabel(new GuiNpcLabel(13, "animation.tickType", guiLeft + 5, guiTop + 78));
|
||||
this.addButton(new GuiNpcButton(13, guiLeft + 65, guiTop + 72, 75, 20, new String[]{"animation.renderTicks", "animation.mcTicks"}, editingFrame.renderTicks ? 0 : 1));
|
||||
//this.addButton(new GuiNpcButton(13, guiLeft + 65, guiTop + 72, 75, 20, new String[]{"animation.renderTicks", "animation.mcTicks"}, editingFrame.renderTicks ? 0 : 1));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,8 +46,6 @@ public class SubGuiAnimationFrame extends SubGuiInterface implements ITextfieldL
|
||||
editingFrame.setCustomized(!editingFrame.isCustomized());
|
||||
} else if (guibutton.id == 12 && editingFrame != null) {
|
||||
editingFrame.smooth = (byte) value;
|
||||
} else if (guibutton.id == 13 && editingFrame != null) {
|
||||
editingFrame.renderTicks = value == 0;
|
||||
}
|
||||
|
||||
initGui();
|
||||
|
||||
@@ -20,7 +20,6 @@ public class SubGuiAnimationOptions extends SubGuiInterface {
|
||||
//
|
||||
//ticks - button
|
||||
this.addLabel(new GuiNpcLabel(10, "animation.tickType", guiLeft + 5, guiTop + 16));
|
||||
this.addButton(new GuiNpcButton(10, guiLeft + 60, guiTop + 10, 75, 20, new String[]{"animation.renderTicks", "animation.mcTicks"}, animation.renderTicks ? 0 : 1));
|
||||
//
|
||||
//whileStanding - button
|
||||
this.addLabel(new GuiNpcLabel(11, "animation.whileStanding", guiLeft + 5, guiTop + 36));
|
||||
@@ -41,7 +40,7 @@ public class SubGuiAnimationOptions extends SubGuiInterface {
|
||||
int value = ((GuiNpcButton)guibutton).getValue();
|
||||
|
||||
if (guibutton.id == 10) {
|
||||
animation.renderTicks = value == 0;
|
||||
|
||||
} else if (guibutton.id == 11) {
|
||||
animation.whileStanding = value == 0;
|
||||
} else if (guibutton.id == 12) {
|
||||
|
||||
@@ -3,6 +3,7 @@ package noppes.npcs.client.gui.global;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import noppes.npcs.client.Client;
|
||||
import noppes.npcs.client.ClientCacheHandler;
|
||||
import noppes.npcs.client.gui.SubGuiAnimationFrame;
|
||||
import noppes.npcs.client.gui.SubGuiAnimationOptions;
|
||||
import noppes.npcs.client.gui.SubGuiColorSelector;
|
||||
@@ -49,7 +50,7 @@ public class GuiNPCEditAnimation extends GuiModelInterface implements ITextfield
|
||||
|
||||
this.animation = animation;
|
||||
AnimationData data = npc.display.animationData;
|
||||
data.animation = animation;
|
||||
data.setAnimation(animation);
|
||||
data.setEnabled(true);
|
||||
|
||||
int bodyPartX = 280;
|
||||
@@ -92,9 +93,9 @@ public class GuiNPCEditAnimation extends GuiModelInterface implements ITextfield
|
||||
|
||||
AnimationData data = npc.display.animationData;
|
||||
if (!playingAnimation) {
|
||||
data.animation = new Animation();
|
||||
data.setAnimation(new Animation());
|
||||
data.animation.smooth = animation.smooth;
|
||||
data.animation.renderTicks = animation.renderTicks;
|
||||
data.animation.tickDuration = 50;
|
||||
data.animation.loop = 0;
|
||||
if (editingFrame != null) {
|
||||
data.animation.frames.add(editingFrame);
|
||||
@@ -107,7 +108,7 @@ public class GuiNPCEditAnimation extends GuiModelInterface implements ITextfield
|
||||
if (!frame.isCustomized()) {
|
||||
frame.speed = animation.speed;
|
||||
frame.smooth = animation.smooth;
|
||||
frame.renderTicks = animation.renderTicks;
|
||||
frame.tickDuration = animation.tickDuration();
|
||||
}
|
||||
for (Map.Entry<EnumAnimationPart,FramePart> entry : frame.frameParts.entrySet()) {
|
||||
FramePart part = entry.getValue();
|
||||
@@ -475,7 +476,7 @@ public class GuiNPCEditAnimation extends GuiModelInterface implements ITextfield
|
||||
}
|
||||
}
|
||||
this.playingAnimation = true;
|
||||
data.animation = animation;
|
||||
data.setAnimation(this.animation);
|
||||
data.animation.paused = false;
|
||||
} else if (guibutton.id == 201) {
|
||||
data.animation.paused = true;
|
||||
@@ -510,12 +511,8 @@ public class GuiNPCEditAnimation extends GuiModelInterface implements ITextfield
|
||||
this.playingAnimation = false;
|
||||
initGui();
|
||||
} else if (data.isActive()) {
|
||||
Frame currentFrame = (Frame) data.animation.currentFrame();
|
||||
long time = mc.theWorld.getTotalWorldTime();
|
||||
if (time != prevTick) {
|
||||
if (currentFrame != null && !currentFrame.renderTicks) {
|
||||
data.animation.increaseTime();
|
||||
}
|
||||
GuiNpcLabel label = this.getLabel(213);
|
||||
if (label != null) {
|
||||
label.label += ".";
|
||||
|
||||
@@ -63,9 +63,9 @@ public class GuiNPCManageAnimations extends GuiModelInterface2 implements IScrol
|
||||
|
||||
AnimationData data = npc.display.animationData;
|
||||
if (!playingAnimation) {
|
||||
data.animation = new Animation();
|
||||
data.setAnimation(new Animation());
|
||||
data.animation.smooth = animation.smooth;
|
||||
data.animation.renderTicks = animation.renderTicks;
|
||||
data.animation.tickDuration = 50;
|
||||
data.animation.loop = 0;
|
||||
|
||||
if (this.animation.frames.size() > 0) {
|
||||
@@ -109,12 +109,8 @@ public class GuiNPCManageAnimations extends GuiModelInterface2 implements IScrol
|
||||
this.playingAnimation = false;
|
||||
initGui();
|
||||
} else if (data.isActive()) {
|
||||
Frame currentFrame = (Frame) data.animation.currentFrame();
|
||||
long time = mc.theWorld.getTotalWorldTime();
|
||||
if (time != prevTick) {
|
||||
if (currentFrame != null && !currentFrame.renderTicks) {
|
||||
data.animation.increaseTime();
|
||||
}
|
||||
GuiNpcLabel label = this.getLabel(94);
|
||||
if (label != null) {
|
||||
label.label += ".";
|
||||
@@ -185,7 +181,7 @@ public class GuiNPCManageAnimations extends GuiModelInterface2 implements IScrol
|
||||
}
|
||||
}
|
||||
this.playingAnimation = true;
|
||||
data.animation = animation;
|
||||
data.setAnimation(this.animation);
|
||||
data.animation.paused = false;
|
||||
} else if (guibutton.id == 92) {
|
||||
data.animation.paused = true;
|
||||
@@ -206,7 +202,7 @@ public class GuiNPCManageAnimations extends GuiModelInterface2 implements IScrol
|
||||
this.animation = new Animation();
|
||||
animation.readFromNBT(compound);
|
||||
setSelected(animation.name);
|
||||
npc.display.animationData.animation = animation;
|
||||
npc.display.animationData.setAnimation(this.animation);
|
||||
this.playingAnimation = false;
|
||||
npc.display.animationData.animation.paused = false;
|
||||
initGui();
|
||||
|
||||
@@ -24,7 +24,7 @@ public class Animation implements IAnimation {
|
||||
public float speed = 1.0F;
|
||||
public byte smooth = 0;
|
||||
public int loop = -1; //If greater than 0 and less than the amount of frames, the animation will begin looping when it reaches this frame.
|
||||
public boolean renderTicks = false; // If true, MC ticks are used. If false, render ticks are used.
|
||||
public int tickDuration = 50;
|
||||
|
||||
public boolean whileStanding = true;
|
||||
public boolean whileAttacking = true;
|
||||
@@ -93,6 +93,15 @@ public class Animation implements IAnimation {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public int tickDuration() {
|
||||
return this.tickDuration;
|
||||
}
|
||||
|
||||
public IAnimation setTickDuration(int tickDuration) {
|
||||
this.tickDuration = tickDuration;
|
||||
return this;
|
||||
}
|
||||
|
||||
public IAnimation setSpeed(float speed) {
|
||||
this.speed = speed;
|
||||
return this;
|
||||
@@ -111,15 +120,6 @@ public class Animation implements IAnimation {
|
||||
return this.smooth;
|
||||
}
|
||||
|
||||
public IAnimation useRenderTicks(boolean renderTicks) {
|
||||
this.renderTicks = renderTicks;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean useRenderTicks() {
|
||||
return this.renderTicks;
|
||||
}
|
||||
|
||||
public IAnimation doWhileStanding(boolean whileStanding) {
|
||||
this.whileStanding = whileStanding;
|
||||
return this;
|
||||
@@ -183,8 +183,6 @@ public class Animation implements IAnimation {
|
||||
smooth = compound.getByte("Smooth");
|
||||
loop = compound.getInteger("Loop");
|
||||
|
||||
renderTicks = compound.getBoolean("RenderTicks");
|
||||
|
||||
ArrayList<Frame> frames = new ArrayList<Frame>();
|
||||
NBTTagList list = compound.getTagList("Frames", 10);
|
||||
for (int i = 0; i < list.tagCount(); i++) {
|
||||
@@ -209,8 +207,6 @@ public class Animation implements IAnimation {
|
||||
compound.setByte("Smooth", smooth);
|
||||
compound.setInteger("Loop",loop);
|
||||
|
||||
compound.setBoolean("RenderTicks", renderTicks);
|
||||
|
||||
NBTTagList list = new NBTTagList();
|
||||
for(Frame frame : frames){
|
||||
NBTTagCompound item = frame.writeToNBT();
|
||||
|
||||
@@ -3,6 +3,7 @@ package noppes.npcs.controllers.data;
|
||||
|
||||
import cpw.mods.fml.common.FMLCommonHandler;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
@@ -12,6 +13,7 @@ import noppes.npcs.DataDisplay;
|
||||
import noppes.npcs.Server;
|
||||
import noppes.npcs.api.handler.data.IAnimation;
|
||||
import noppes.npcs.api.handler.data.IAnimationData;
|
||||
import noppes.npcs.client.ClientCacheHandler;
|
||||
import noppes.npcs.constants.EnumAnimationPart;
|
||||
import noppes.npcs.constants.EnumPacketClient;
|
||||
import noppes.npcs.controllers.PlayerDataController;
|
||||
@@ -154,27 +156,33 @@ public class AnimationData implements IAnimationData {
|
||||
if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) {
|
||||
this.animation = (Animation) animation;
|
||||
} else {
|
||||
Animation newAnim = new Animation();
|
||||
newAnim.readFromNBT(((Animation) animation).writeToNBT());
|
||||
if (this.isActive() && !newAnim.frames.isEmpty()) {
|
||||
Frame frame = (Frame) this.animation.currentFrame();
|
||||
if (frame != null) {
|
||||
Frame firstFrame = newAnim.frames.get(0);
|
||||
for (Map.Entry<EnumAnimationPart, FramePart> entry : frame.frameParts.entrySet()) {
|
||||
if (firstFrame.frameParts.containsKey(entry.getKey())) {
|
||||
FramePart prevFramePart = entry.getValue();
|
||||
FramePart newFramePart = firstFrame.frameParts.get(entry.getKey());
|
||||
for (int i = 0; i < 3; i++) {
|
||||
newFramePart.prevPivots[i] = prevFramePart.prevPivots[i];
|
||||
newFramePart.prevRotations[i] = prevFramePart.prevRotations[i];
|
||||
}
|
||||
this.clientSetAnimation(animation);
|
||||
}
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
private void clientSetAnimation(IAnimation animation) {
|
||||
Animation newAnim = new Animation();
|
||||
newAnim.readFromNBT(((Animation) animation).writeToNBT());
|
||||
if (this.isActive() && !newAnim.frames.isEmpty()) {
|
||||
Frame frame = (Frame) this.animation.currentFrame();
|
||||
if (frame != null) {
|
||||
Frame firstFrame = newAnim.frames.get(0);
|
||||
for (Map.Entry<EnumAnimationPart, FramePart> entry : frame.frameParts.entrySet()) {
|
||||
if (firstFrame.frameParts.containsKey(entry.getKey())) {
|
||||
FramePart prevFramePart = entry.getValue();
|
||||
FramePart newFramePart = firstFrame.frameParts.get(entry.getKey());
|
||||
for (int i = 0; i < 3; i++) {
|
||||
newFramePart.prevPivots[i] = prevFramePart.prevPivots[i];
|
||||
newFramePart.prevRotations[i] = prevFramePart.prevRotations[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.animation = newAnim;
|
||||
newAnim.parent = this;
|
||||
}
|
||||
this.animation = newAnim;
|
||||
newAnim.parent = this;
|
||||
ClientCacheHandler.playingAnimations.add(newAnim);
|
||||
}
|
||||
|
||||
public IAnimation getAnimation() {
|
||||
|
||||
@@ -14,10 +14,11 @@ public class Frame implements IFrame {
|
||||
public Animation parent;
|
||||
public HashMap<EnumAnimationPart,FramePart> frameParts = new HashMap<>();
|
||||
public int duration = 0;
|
||||
public int tickDuration = 50;
|
||||
|
||||
boolean customized = false;
|
||||
public float speed = 1.0F;
|
||||
public byte smooth = 0;
|
||||
public boolean renderTicks = false; // If true, MC ticks are used. If false, render ticks are used.
|
||||
|
||||
private int colorMarker = 0xFFFFFF;
|
||||
|
||||
@@ -75,6 +76,15 @@ public class Frame implements IFrame {
|
||||
return this;
|
||||
}
|
||||
|
||||
public int tickDuration() {
|
||||
return this.tickDuration;
|
||||
}
|
||||
|
||||
public IFrame setTickDuration(int tickDuration) {
|
||||
this.tickDuration = tickDuration;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean isCustomized() {
|
||||
return customized;
|
||||
}
|
||||
@@ -102,15 +112,6 @@ public class Frame implements IFrame {
|
||||
return this;
|
||||
}
|
||||
|
||||
public IFrame useRenderTicks(boolean renderTicks) {
|
||||
this.renderTicks = renderTicks;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean useRenderTicks() {
|
||||
return this.renderTicks;
|
||||
}
|
||||
|
||||
public int getColorMarker() {
|
||||
return this.colorMarker;
|
||||
}
|
||||
@@ -136,13 +137,13 @@ public class Frame implements IFrame {
|
||||
}
|
||||
if(compound.hasKey("RenderTicks")){
|
||||
customized = true;
|
||||
renderTicks = compound.getBoolean("RenderTicks");
|
||||
this.tickDuration = 20;
|
||||
}
|
||||
|
||||
if (!customized) {
|
||||
this.speed = parent.speed;
|
||||
this.smooth = parent.smooth;
|
||||
this.renderTicks = parent.renderTicks;
|
||||
this.tickDuration = parent.tickDuration;
|
||||
}
|
||||
|
||||
HashMap<EnumAnimationPart,FramePart> frameParts = new HashMap<>();
|
||||
@@ -168,7 +169,7 @@ public class Frame implements IFrame {
|
||||
if(customized){
|
||||
compound.setFloat("Speed", speed);
|
||||
compound.setByte("Smooth", smooth);
|
||||
compound.setBoolean("RenderTicks", renderTicks);
|
||||
compound.setInteger("TickDuration", tickDuration);
|
||||
}
|
||||
|
||||
NBTTagList list = new NBTTagList();
|
||||
@@ -191,7 +192,7 @@ public class Frame implements IFrame {
|
||||
frame.customized = this.customized;
|
||||
frame.speed = this.speed;
|
||||
frame.smooth = this.smooth;
|
||||
frame.renderTicks = this.renderTicks;
|
||||
frame.tickDuration = this.tickDuration;
|
||||
frame.colorMarker = this.colorMarker;
|
||||
return frame;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user