From 67237e794fc7b39ce4da4d75554fca7b5e446a7c Mon Sep 17 00:00:00 2001 From: Kam Date: Wed, 28 Jan 2026 17:16:59 -0500 Subject: [PATCH] Fix Defaults / Syncing --- .../npcs/entity/EntityAbilityBeam.java | 8 +- .../npcs/entity/EntityAbilityDisc.java | 6 +- .../npcs/entity/EntityAbilityLaser.java | 3 +- .../kamkeel/npcs/entity/EntityAbilityOrb.java | 6 +- .../npcs/entity/EntityAbilityProjectile.java | 6 - .../gui/advanced/SubGuiAbilityConfig.java | 45 +++- .../animations/Ability_Beam_Active.json | 202 +++-------------- .../animations/Ability_Beam_Windup.json | 206 ++++++++++++------ .../assets/customnpcs/lang/en_US.lang | 2 + 9 files changed, 219 insertions(+), 265 deletions(-) diff --git a/src/main/java/kamkeel/npcs/entity/EntityAbilityBeam.java b/src/main/java/kamkeel/npcs/entity/EntityAbilityBeam.java index 70aaf5254..60f7fd656 100644 --- a/src/main/java/kamkeel/npcs/entity/EntityAbilityBeam.java +++ b/src/main/java/kamkeel/npcs/entity/EntityAbilityBeam.java @@ -68,7 +68,7 @@ public class EntityAbilityBeam extends EntityAbilityProjectile { private static final int DW_CHARGING = 20; // Debug logging - private static final boolean DEBUG_LOGGING = true; + private static final boolean DEBUG_LOGGING = false; public EntityAbilityBeam(World world) { super(world); @@ -560,12 +560,10 @@ public class EntityAbilityBeam extends EntityAbilityProjectile { Vec3 currentPos = Vec3.createVectorHelper(prevHeadWorldX, prevHeadWorldY, prevHeadWorldZ); Vec3 nextPos = Vec3.createVectorHelper(headX, headY, headZ); - MovingObjectPosition blockHit = worldObj.rayTraceBlocks(currentPos, nextPos); + // Use full raytrace that doesn't stop at liquids and checks all blocks + MovingObjectPosition blockHit = worldObj.func_147447_a(currentPos, nextPos, false, true, false); if (blockHit != null && blockHit.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - if (DEBUG_LOGGING) { - LogWriter.info("[Beam] DEAD: Block collision at tick " + ticksExisted); - } hasHit = true; if (explosive) { posX = blockHit.hitVec.xCoord; diff --git a/src/main/java/kamkeel/npcs/entity/EntityAbilityDisc.java b/src/main/java/kamkeel/npcs/entity/EntityAbilityDisc.java index b1f57f9c9..0c5b10ccb 100644 --- a/src/main/java/kamkeel/npcs/entity/EntityAbilityDisc.java +++ b/src/main/java/kamkeel/npcs/entity/EntityAbilityDisc.java @@ -413,11 +413,15 @@ public class EntityAbilityDisc extends EntityAbilityProjectile { private void checkBlockCollision() { Vec3 currentPos = Vec3.createVectorHelper(posX, posY, posZ); Vec3 nextPos = Vec3.createVectorHelper(posX + motionX, posY + motionY, posZ + motionZ); - MovingObjectPosition blockHit = worldObj.rayTraceBlocks(currentPos, nextPos); + // Use full raytrace that doesn't stop at liquids and checks all blocks + MovingObjectPosition blockHit = worldObj.func_147447_a(currentPos, nextPos, false, true, false); if (blockHit != null && blockHit.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { hasHit = true; if (explosive) { + posX = blockHit.hitVec.xCoord; + posY = blockHit.hitVec.yCoord; + posZ = blockHit.hitVec.zCoord; doExplosion(); } this.setDead(); diff --git a/src/main/java/kamkeel/npcs/entity/EntityAbilityLaser.java b/src/main/java/kamkeel/npcs/entity/EntityAbilityLaser.java index 7ad1f0d45..256a4faf7 100644 --- a/src/main/java/kamkeel/npcs/entity/EntityAbilityLaser.java +++ b/src/main/java/kamkeel/npcs/entity/EntityAbilityLaser.java @@ -163,7 +163,8 @@ public class EntityAbilityLaser extends EntityAbilityProjectile { private void checkBlockCollision() { Vec3 start = Vec3.createVectorHelper(startX, startY, startZ); Vec3 end = Vec3.createVectorHelper(endX, endY, endZ); - MovingObjectPosition blockHit = worldObj.rayTraceBlocks(start, end); + // Use full raytrace that doesn't stop at liquids and checks all blocks + MovingObjectPosition blockHit = worldObj.func_147447_a(start, end, false, true, false); if (blockHit != null && blockHit.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { // Laser stops at block diff --git a/src/main/java/kamkeel/npcs/entity/EntityAbilityOrb.java b/src/main/java/kamkeel/npcs/entity/EntityAbilityOrb.java index 18a0c8503..24ca69ef8 100644 --- a/src/main/java/kamkeel/npcs/entity/EntityAbilityOrb.java +++ b/src/main/java/kamkeel/npcs/entity/EntityAbilityOrb.java @@ -298,11 +298,15 @@ public class EntityAbilityOrb extends EntityAbilityProjectile { private void checkBlockCollision() { Vec3 currentPos = Vec3.createVectorHelper(posX, posY, posZ); Vec3 nextPos = Vec3.createVectorHelper(posX + motionX, posY + motionY, posZ + motionZ); - MovingObjectPosition blockHit = worldObj.rayTraceBlocks(currentPos, nextPos); + // Use full raytrace that doesn't stop at liquids and checks all blocks + MovingObjectPosition blockHit = worldObj.func_147447_a(currentPos, nextPos, false, true, false); if (blockHit != null && blockHit.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { hasHit = true; if (explosive) { + posX = blockHit.hitVec.xCoord; + posY = blockHit.hitVec.yCoord; + posZ = blockHit.hitVec.zCoord; doExplosion(); } this.setDead(); diff --git a/src/main/java/kamkeel/npcs/entity/EntityAbilityProjectile.java b/src/main/java/kamkeel/npcs/entity/EntityAbilityProjectile.java index 32c5796bd..5c418d640 100644 --- a/src/main/java/kamkeel/npcs/entity/EntityAbilityProjectile.java +++ b/src/main/java/kamkeel/npcs/entity/EntityAbilityProjectile.java @@ -215,9 +215,6 @@ public abstract class EntityAbilityProjectile extends Entity implements IEntityA // Check lifespan using world time (survives chunk unload/reload) if (deathWorldTime > 0 && worldObj.getTotalWorldTime() >= deathWorldTime) { - if (!worldObj.isRemote) { - noppes.npcs.LogWriter.info("[Projectile:" + this.getClass().getSimpleName() + "] DEAD: Lifetime exceeded. worldTime=" + worldObj.getTotalWorldTime() + " deathTime=" + deathWorldTime); - } this.setDead(); return; } @@ -229,9 +226,6 @@ public abstract class EntityAbilityProjectile extends Entity implements IEntityA } if (hasHit) { - if (!worldObj.isRemote) { - noppes.npcs.LogWriter.info("[Projectile:" + this.getClass().getSimpleName() + "] DEAD: hasHit=true at tick " + ticksExisted); - } this.setDead(); return; } diff --git a/src/main/java/noppes/npcs/client/gui/advanced/SubGuiAbilityConfig.java b/src/main/java/noppes/npcs/client/gui/advanced/SubGuiAbilityConfig.java index a4fef92ef..684138891 100644 --- a/src/main/java/noppes/npcs/client/gui/advanced/SubGuiAbilityConfig.java +++ b/src/main/java/noppes/npcs/client/gui/advanced/SubGuiAbilityConfig.java @@ -66,6 +66,7 @@ public class SubGuiAbilityConfig extends SubGuiInterface implements ITextfieldLi protected int cooldownTicks; protected int windUpTicks; protected int dazedTicks; + protected boolean syncWindupWithAnimation = true; // Sync windup ticks with animation duration // ═══════════════════════════════════════════════════════════════════════════ // CACHED VALUES - Target Tab @@ -282,16 +283,27 @@ public class SubGuiAbilityConfig extends SubGuiInterface implements ITextfieldLi addLabel(new GuiNpcLabel(7, "ability.timing", col1LabelX, y)); y += 14; + // Check if windup animation is selected (either by name or ID) + boolean hasWindupAnimation = windUpAnimationId >= 0 || (windUpAnimationName != null && !windUpAnimationName.isEmpty()); + // Row 4: Windup Ticks + Cooldown Ticks addLabel(new GuiNpcLabel(10, "ability.windup", col1LabelX, y + 5)); - GuiNpcTextField windupField = new GuiNpcTextField(11, this, fontRendererObj, col1FieldX, y, 40, 20, String.valueOf(windUpTicks)); - windupField.setIntegersOnly(); - windupField.setMinMaxDefault(0, 1000, 20); - addTextField(windupField); - // Sync button - only show if windup animation is selected (either by name or ID) - if (windUpAnimationId >= 0 || (windUpAnimationName != null && !windUpAnimationName.isEmpty())) { - GuiNpcButton syncBtn = new GuiNpcButton(17, guiLeft + 115, y, 40, 20, "gui.sync"); + // Only show windup textbox if sync is off or no animation selected + if (!syncWindupWithAnimation || !hasWindupAnimation) { + GuiNpcTextField windupField = new GuiNpcTextField(11, this, fontRendererObj, col1FieldX, y, 40, 20, String.valueOf(windUpTicks)); + windupField.setIntegersOnly(); + windupField.setMinMaxDefault(0, 1000, 20); + addTextField(windupField); + } else { + // Show calculated value as label when synced + addLabel(new GuiNpcLabel(11, String.valueOf(windUpTicks), col1FieldX + 5, y + 5)); + } + + // Sync toggle button - only show if windup animation is selected + if (hasWindupAnimation) { + String syncLabel = syncWindupWithAnimation ? "ability.syncOn" : "ability.syncOff"; + GuiNpcButton syncBtn = new GuiNpcButton(17, guiLeft + 115, y, 50, 20, syncLabel); syncBtn.setHoverText("ability.hover.sync"); addButton(syncBtn); } @@ -654,8 +666,13 @@ public class SubGuiAbilityConfig extends SubGuiInterface implements ITextfieldLi } else if (id == 16) { lockMovement = LockMovementType.fromOrdinal(((GuiNpcButton) guibutton).getValue()); } else if (id == 17) { - // Sync windup ticks with animation duration - syncWindupWithAnimation(); + // Toggle sync on/off + syncWindupWithAnimation = !syncWindupWithAnimation; + if (syncWindupWithAnimation) { + // Calculate windup ticks from animation when turning sync on + calculateWindupFromAnimation(); + } + initGui(); } // Target tab - Targeting mode @@ -896,6 +913,12 @@ public class SubGuiAbilityConfig extends SubGuiInterface implements ITextfieldLi ability.setLockMovement(lockMovement); ability.setInterruptible(interruptible); + // If sync is enabled and we have a windup animation, recalculate before saving + boolean hasWindupAnimation = windUpAnimationId >= 0 || (windUpAnimationName != null && !windUpAnimationName.isEmpty()); + if (syncWindupWithAnimation && hasWindupAnimation) { + calculateWindupFromAnimation(); + } + // Timing ability.setCooldownTicks(cooldownTicks); ability.setWindUpTicks(windUpTicks); @@ -968,9 +991,9 @@ public class SubGuiAbilityConfig extends SubGuiInterface implements ITextfieldLi // ═══════════════════════════════════════════════════════════════════════════ /** - * Syncs windup ticks with the selected windup animation's total duration. + * Calculates windup ticks from the selected windup animation's total duration. */ - private void syncWindupWithAnimation() { + private void calculateWindupFromAnimation() { if (AnimationController.Instance == null) { return; } diff --git a/src/main/resources/assets/customnpcs/animations/Ability_Beam_Active.json b/src/main/resources/assets/customnpcs/animations/Ability_Beam_Active.json index eb9516f38..466b9163c 100644 --- a/src/main/resources/assets/customnpcs/animations/Ability_Beam_Active.json +++ b/src/main/resources/assets/customnpcs/animations/Ability_Beam_Active.json @@ -1,5 +1,5 @@ { - "Loop": -1, + "Loop": 0, "Speed": 1.0f, "Frames": [ { @@ -7,87 +7,6 @@ "Comment": "", "Speed": 1.0f, "FrameParts": [ - { - "Pivot2": -5.0f, - "Part": "LEFT_ARM", - "Rotation1": 107.0f, - "Rotation0": -94.0f, - "Pivot0": -5.0f, - "Pivot1": 3.0f, - "Rotation2": -31.0f - }, - { - "Pivot2": 0.0f, - "Part": "RIGHT_ARM", - "Rotation1": 88.0f, - "Rotation0": -56.0f, - "Pivot0": 1.0f, - "Pivot1": 0.0f, - "Rotation2": -18.0f - }, - { - "Pivot2": -3.0f, - "Part": "HEAD", - "Rotation1": 12.0f, - "Rotation0": 18.0f, - "Pivot0": -1.0f, - "Pivot1": 1.0f, - "Rotation2": -6.0f - }, - { - "Pivot2": 0.0f, - "Part": "RIGHT_LEG", - "Rotation1": 56.0f, - "Rotation0": 6.0f, - "Pivot0": -2.0f, - "Pivot1": 0.0f, - "Rotation2": 0.0f - }, - { - "Pivot2": -3.0f, - "Part": "BODY", - "Rotation1": 25.0f, - "Rotation0": 18.0f, - "Pivot0": -1.0f, - "Pivot1": 1.0f, - "Rotation2": 0.0f - }, - { - "Pivot2": -5.0f, - "Part": "LEFT_LEG", - "Rotation1": -25.0f, - "Rotation0": 12.0f, - "Pivot0": 2.0f, - "Pivot1": 0.0f, - "Rotation2": -6.0f - }, - { - "Pivot2": 0.0f, - "Part": "FULL_MODEL", - "Rotation1": 25.0f, - "Rotation0": 0.0f, - "Pivot0": 0.0f, - "Pivot1": 0.0f, - "Rotation2": 0.0f - } - ], - "Smooth": 0b, - "Duration": 5 - }, - { - "ColorMarker": 16777215, - "Comment": "", - "Speed": 2.0f, - "FrameParts": [ - { - "Pivot2": -5.0f, - "Part": "LEFT_ARM", - "Rotation1": 12.0f, - "Rotation0": -75.0f, - "Pivot0": -2.0f, - "Pivot1": 3.0f, - "Rotation2": 50.0f - }, { "Pivot2": -5.0f, "Part": "RIGHT_ARM", @@ -97,6 +16,33 @@ "Pivot1": 2.0f, "Rotation2": 50.0f }, + { + "Pivot2": -6.0f, + "Part": "LEFT_LEG", + "Rotation1": 0.0f, + "Rotation0": 0.0f, + "Pivot0": 0.0f, + "Pivot1": 0.0f, + "Rotation2": -6.0f + }, + { + "Pivot2": -3.0f, + "Part": "BODY", + "Rotation1": 0.0f, + "Rotation0": 0.0f, + "Pivot0": -1.0f, + "Pivot1": 1.0f, + "Rotation2": 0.0f + }, + { + "Pivot2": 0.0f, + "Part": "FULL_MODEL", + "Rotation1": 0.0f, + "Rotation0": 0.0f, + "Pivot0": 0.0f, + "Pivot1": 0.0f, + "Rotation2": 0.0f + }, { "Pivot2": -3.0f, "Part": "HEAD", @@ -115,42 +61,6 @@ "Pivot1": 0.0f, "Rotation2": 0.0f }, - { - "Pivot2": -3.0f, - "Part": "BODY", - "Rotation1": 0.0f, - "Rotation0": 0.0f, - "Pivot0": -1.0f, - "Pivot1": 1.0f, - "Rotation2": 0.0f - }, - { - "Pivot2": -6.0f, - "Part": "LEFT_LEG", - "Rotation1": 0.0f, - "Rotation0": 0.0f, - "Pivot0": 0.0f, - "Pivot1": 0.0f, - "Rotation2": -6.0f - }, - { - "Pivot2": 0.0f, - "Part": "FULL_MODEL", - "Rotation1": 0.0f, - "Rotation0": 0.0f, - "Pivot0": 0.0f, - "Pivot1": 0.0f, - "Rotation2": 0.0f - } - ], - "Smooth": 0b, - "Duration": 5 - }, - { - "ColorMarker": 16777215, - "Comment": "", - "Speed": 0.75f, - "FrameParts": [ { "Pivot2": -5.0f, "Part": "LEFT_ARM", @@ -159,64 +69,10 @@ "Pivot0": -2.0f, "Pivot1": 3.0f, "Rotation2": 50.0f - }, - { - "Pivot2": -5.0f, - "Part": "RIGHT_ARM", - "Rotation1": -18.0f, - "Rotation0": -107.0f, - "Pivot0": -1.0f, - "Pivot1": 2.0f, - "Rotation2": 50.0f - }, - { - "Pivot2": -3.0f, - "Part": "HEAD", - "Rotation1": 0.0f, - "Rotation0": 0.0f, - "Pivot0": -1.0f, - "Pivot1": 1.0f, - "Rotation2": 0.0f - }, - { - "Pivot2": -4.0f, - "Part": "RIGHT_LEG", - "Rotation1": 56.0f, - "Rotation0": 18.0f, - "Pivot0": -4.0f, - "Pivot1": 0.0f, - "Rotation2": 0.0f - }, - { - "Pivot2": -3.0f, - "Part": "BODY", - "Rotation1": 0.0f, - "Rotation0": 0.0f, - "Pivot0": -1.0f, - "Pivot1": 1.0f, - "Rotation2": 0.0f - }, - { - "Pivot2": -6.0f, - "Part": "LEFT_LEG", - "Rotation1": 0.0f, - "Rotation0": 0.0f, - "Pivot0": 0.0f, - "Pivot1": 0.0f, - "Rotation2": -6.0f - }, - { - "Pivot2": 0.0f, - "Part": "FULL_MODEL", - "Rotation1": 0.0f, - "Rotation0": 0.0f, - "Pivot0": 0.0f, - "Pivot1": 0.0f, - "Rotation2": 0.0f } ], "Smooth": 0b, - "Duration": 20 + "Duration": 30 } ], "CurrentFrameTime": 0, diff --git a/src/main/resources/assets/customnpcs/animations/Ability_Beam_Windup.json b/src/main/resources/assets/customnpcs/animations/Ability_Beam_Windup.json index 6c53e1eab..62e54167a 100644 --- a/src/main/resources/assets/customnpcs/animations/Ability_Beam_Windup.json +++ b/src/main/resources/assets/customnpcs/animations/Ability_Beam_Windup.json @@ -7,33 +7,6 @@ "Comment": "", "Speed": 0.5f, "FrameParts": [ - { - "Pivot2": -5.0f, - "Part": "LEFT_ARM", - "Rotation1": 94.0f, - "Rotation0": -94.0f, - "Pivot0": -4.0f, - "Pivot1": 3.0f, - "Rotation2": -31.0f - }, - { - "Pivot2": 0.0f, - "Part": "RIGHT_ARM", - "Rotation1": 75.0f, - "Rotation0": -56.0f, - "Pivot0": 1.0f, - "Pivot1": 0.0f, - "Rotation2": -18.0f - }, - { - "Pivot2": -3.0f, - "Part": "HEAD", - "Rotation1": 0.0f, - "Rotation0": 18.0f, - "Pivot0": -1.0f, - "Pivot1": 1.0f, - "Rotation2": -6.0f - }, { "Pivot2": 0.0f, "Part": "RIGHT_LEG", @@ -54,11 +27,20 @@ }, { "Pivot2": -5.0f, - "Part": "LEFT_LEG", - "Rotation1": -25.0f, - "Rotation0": 12.0f, - "Pivot0": 2.0f, - "Pivot1": 0.0f, + "Part": "LEFT_ARM", + "Rotation1": 94.0f, + "Rotation0": -94.0f, + "Pivot0": -4.0f, + "Pivot1": 3.0f, + "Rotation2": -31.0f + }, + { + "Pivot2": -3.0f, + "Part": "HEAD", + "Rotation1": 0.0f, + "Rotation0": 18.0f, + "Pivot0": -1.0f, + "Pivot1": 1.0f, "Rotation2": -6.0f }, { @@ -69,6 +51,24 @@ "Pivot0": 0.0f, "Pivot1": 0.0f, "Rotation2": 0.0f + }, + { + "Pivot2": -5.0f, + "Part": "LEFT_LEG", + "Rotation1": -25.0f, + "Rotation0": 12.0f, + "Pivot0": 2.0f, + "Pivot1": 0.0f, + "Rotation2": -6.0f + }, + { + "Pivot2": 0.0f, + "Part": "RIGHT_ARM", + "Rotation1": 75.0f, + "Rotation0": -56.0f, + "Pivot0": 1.0f, + "Pivot1": 0.0f, + "Rotation2": -18.0f } ], "Smooth": 0b, @@ -77,35 +77,8 @@ { "ColorMarker": 16777215, "Comment": "", - "Speed": 0.5f, + "Speed": 0.25f, "FrameParts": [ - { - "Pivot2": -5.0f, - "Part": "LEFT_ARM", - "Rotation1": 107.0f, - "Rotation0": -94.0f, - "Pivot0": -5.0f, - "Pivot1": 3.0f, - "Rotation2": -31.0f - }, - { - "Pivot2": 0.0f, - "Part": "RIGHT_ARM", - "Rotation1": 88.0f, - "Rotation0": -56.0f, - "Pivot0": 1.0f, - "Pivot1": 0.0f, - "Rotation2": -18.0f - }, - { - "Pivot2": -3.0f, - "Part": "HEAD", - "Rotation1": 12.0f, - "Rotation0": 18.0f, - "Pivot0": -1.0f, - "Pivot1": 1.0f, - "Rotation2": -6.0f - }, { "Pivot2": 0.0f, "Part": "RIGHT_LEG", @@ -126,11 +99,20 @@ }, { "Pivot2": -5.0f, - "Part": "LEFT_LEG", - "Rotation1": -25.0f, - "Rotation0": 12.0f, - "Pivot0": 2.0f, - "Pivot1": 0.0f, + "Part": "LEFT_ARM", + "Rotation1": 107.0f, + "Rotation0": -94.0f, + "Pivot0": -5.0f, + "Pivot1": 3.0f, + "Rotation2": -31.0f + }, + { + "Pivot2": -3.0f, + "Part": "HEAD", + "Rotation1": 12.0f, + "Rotation0": 18.0f, + "Pivot0": -1.0f, + "Pivot1": 1.0f, "Rotation2": -6.0f }, { @@ -141,14 +123,104 @@ "Pivot0": 0.0f, "Pivot1": 0.0f, "Rotation2": 0.0f + }, + { + "Pivot2": -5.0f, + "Part": "LEFT_LEG", + "Rotation1": -25.0f, + "Rotation0": 12.0f, + "Pivot0": 2.0f, + "Pivot1": 0.0f, + "Rotation2": -6.0f + }, + { + "Pivot2": 0.0f, + "Part": "RIGHT_ARM", + "Rotation1": 88.0f, + "Rotation0": -56.0f, + "Pivot0": 1.0f, + "Pivot1": 0.0f, + "Rotation2": -18.0f } ], "Smooth": 0b, - "Duration": 35 + "Duration": 30 + }, + { + "ColorMarker": 16777215, + "Comment": "", + "Speed": 2.0f, + "FrameParts": [ + { + "Pivot2": -4.0f, + "Part": "RIGHT_LEG", + "Rotation1": 56.0f, + "Rotation0": 18.0f, + "Pivot0": -4.0f, + "Pivot1": 0.0f, + "Rotation2": 0.0f + }, + { + "Pivot2": -3.0f, + "Part": "BODY", + "Rotation1": 0.0f, + "Rotation0": 0.0f, + "Pivot0": -1.0f, + "Pivot1": 1.0f, + "Rotation2": 0.0f + }, + { + "Pivot2": -5.0f, + "Part": "LEFT_ARM", + "Rotation1": 12.0f, + "Rotation0": -75.0f, + "Pivot0": -2.0f, + "Pivot1": 3.0f, + "Rotation2": 50.0f + }, + { + "Pivot2": -3.0f, + "Part": "HEAD", + "Rotation1": 0.0f, + "Rotation0": 0.0f, + "Pivot0": -1.0f, + "Pivot1": 1.0f, + "Rotation2": 0.0f + }, + { + "Pivot2": 0.0f, + "Part": "FULL_MODEL", + "Rotation1": 0.0f, + "Rotation0": 0.0f, + "Pivot0": 0.0f, + "Pivot1": 0.0f, + "Rotation2": 0.0f + }, + { + "Pivot2": -6.0f, + "Part": "LEFT_LEG", + "Rotation1": 0.0f, + "Rotation0": 0.0f, + "Pivot0": 0.0f, + "Pivot1": 0.0f, + "Rotation2": -6.0f + }, + { + "Pivot2": -5.0f, + "Part": "RIGHT_ARM", + "Rotation1": -18.0f, + "Rotation0": -107.0f, + "Pivot0": -1.0f, + "Pivot1": 2.0f, + "Rotation2": 50.0f + } + ], + "Smooth": 0b, + "Duration": 5 } ], "CurrentFrameTime": 0, - "CurrentFrame": 0, + "CurrentFrame": 1, "Smooth": 0b, "ID": 1, "WhileAttacking": 1b, diff --git a/src/main/resources/assets/customnpcs/lang/en_US.lang b/src/main/resources/assets/customnpcs/lang/en_US.lang index de60eda25..50c150624 100644 --- a/src/main/resources/assets/customnpcs/lang/en_US.lang +++ b/src/main/resources/assets/customnpcs/lang/en_US.lang @@ -1519,6 +1519,8 @@ ability.maxRange=Max Range ability.timing=Timing (ticks) ability.cooldown=Cooldown ability.windup=Wind Up +ability.syncOn=Sync: On +ability.syncOff=Sync: Off ability.dazed=Dazed Ticks ability.interruptible=Interruptible ability.threshold=Threshold