Fix Defaults / Syncing

This commit is contained in:
Kam committed 2026-01-28 17:16:59 -05:00
1 parent c339e5edbc
commit 67237e794f
9 files changed
+219 -265

No files matched your search

@@ -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;
@@ -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();
@@ -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
@@ -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();
@@ -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;
}
@@ -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;
}