From bed60002c35ec58c866e7bc2536ee00f69cc22d1 Mon Sep 17 00:00:00 2001 From: Kam Date: Thu, 6 Nov 2025 02:14:11 -0500 Subject: [PATCH] Restrict mount riders and expose jump controls --- .../npcs/client/gui/roles/GuiNpcMount.java | 27 ++++++++- .../npcs/entity/EntityNPCInterface.java | 60 ++++++++++++++----- .../java/noppes/npcs/roles/RoleMount.java | 29 +++++++++ .../assets/customnpcs/lang/cs_CZ.lang | 2 + .../assets/customnpcs/lang/de_DE.lang | 2 + .../assets/customnpcs/lang/en_US.lang | 2 + .../assets/customnpcs/lang/es_AR.lang | 2 + .../assets/customnpcs/lang/es_MX.lang | 2 + .../assets/customnpcs/lang/fr_FR.lang | 2 + .../assets/customnpcs/lang/hu_HU.lang | 2 + .../assets/customnpcs/lang/id_ID.lang | 2 + .../assets/customnpcs/lang/ko_KR.lang | 2 + .../assets/customnpcs/lang/nl_NL.lang | 2 + .../assets/customnpcs/lang/pl_PL.lang | 2 + .../assets/customnpcs/lang/pt_BR.lang | 2 + .../assets/customnpcs/lang/ru_RU.lang | 2 + .../assets/customnpcs/lang/sv_SE.lang | 2 + .../assets/customnpcs/lang/zh_CN.lang | 2 + .../assets/customnpcs/lang/zh_TW.lang | 2 + 19 files changed, 130 insertions(+), 18 deletions(-) diff --git a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcMount.java b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcMount.java index 57f39a6d8..0a2a2a450 100644 --- a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcMount.java +++ b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcMount.java @@ -38,10 +38,16 @@ public class GuiNpcMount extends GuiNPCInterface2 implements ITextfieldListener addOffsetRow(1, "role.mount.offsety", role.getOffsetY(), y); y += 24; addOffsetRow(2, "role.mount.offsetz", role.getOffsetZ(), y); + y += 24; + addJumpRow(3, "role.mount.jumpheight", role.getJumpStrength(), y); + y += 24; - addButton(new GuiNpcButton(3, guiLeft + 4, y + 26, 80, 20, "role.mount.reset")); + addLabel(new GuiNpcLabel(5, "role.mount.sprint", guiLeft + 4, y + 5)); + addButton(new GuiNpcButton(5, guiLeft + 140, y, 60, 20, new String[]{"gui.no", "gui.yes"}, role.isSprintAllowed() ? 1 : 0)); - GuiNpcLabel speedLabel = new GuiNpcLabel(4, "", guiLeft + 4, y + 6); + addButton(new GuiNpcButton(4, guiLeft + 4, y + 30, 80, 20, "role.mount.reset")); + + GuiNpcLabel speedLabel = new GuiNpcLabel(6, "", guiLeft + 4, y + 56); speedLabel.label = StatCollector.translateToLocalFormatted("role.mount.walkspeed", npc.ais.getWalkingSpeed()); addLabel(speedLabel); } @@ -54,6 +60,14 @@ public class GuiNpcMount extends GuiNPCInterface2 implements ITextfieldListener addTextField(field); } + private void addJumpRow(int id, String translationKey, float value, int y) { + addLabel(new GuiNpcLabel(id, translationKey, guiLeft + 4, y + 5)); + GuiNpcTextField field = new GuiNpcTextField(id, this, guiLeft + 140, y, 80, 20, format(value)); + field.floatsOnly = true; + field.setMinMaxDefaultFloat(0.1F, 3.0F, 1.0F); + addTextField(field); + } + private String format(float value) { return String.format(Locale.ROOT, "%.2f", value); } @@ -62,9 +76,11 @@ public class GuiNpcMount extends GuiNPCInterface2 implements ITextfieldListener public void buttonEvent(GuiButton guibutton) { if (role == null) return; - if (guibutton.id == 3) { + if (guibutton.id == 4) { role.resetOffsets(); initGui(); + } else if (guibutton.id == 5 && guibutton instanceof GuiNpcButton) { + role.setSprintAllowed(((GuiNpcButton) guibutton).getValue() == 1); } } @@ -83,6 +99,9 @@ public class GuiNpcMount extends GuiNPCInterface2 implements ITextfieldListener case 2: role.setOffsetZ(value); break; + case 3: + role.setJumpStrength(value); + break; } textfield.setText(format(valueForField(textfield.id))); } @@ -95,6 +114,8 @@ public class GuiNpcMount extends GuiNPCInterface2 implements ITextfieldListener return role.getOffsetY(); case 2: return role.getOffsetZ(); + case 3: + return role.getJumpStrength(); default: return 0.0F; } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index 56bc0df8c..4f0abbe61 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -2091,10 +2091,15 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti protected boolean handleMountedMovement(float strafe, float forward) { if (advanced.role != EnumRoleType.Mount || !(roleInterface instanceof RoleMount)) return false; - if (!(riddenByEntity instanceof EntityLivingBase)) + if (riddenByEntity != null && !(riddenByEntity instanceof EntityPlayer)) { + riddenByEntity.mountEntity(null); + return false; + } + if (!(riddenByEntity instanceof EntityPlayer)) return false; - EntityLivingBase rider = (EntityLivingBase) riddenByEntity; + RoleMount mount = (RoleMount) roleInterface; + EntityPlayer rider = (EntityPlayer) riddenByEntity; this.prevRotationYaw = this.rotationYaw = rider.rotationYaw; this.rotationPitch = rider.rotationPitch * 0.5F; this.setRotation(this.rotationYaw, this.rotationPitch); @@ -2108,11 +2113,16 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti } float moveSpeed = Math.max(0.1F, getSpeed()); - if (rider.isSprinting()) { + boolean riderSprinting = rider.isSprinting() && mount.isSprintAllowed(); + if (riderSprinting) { moveSpeed *= 1.2F; } - this.setSprinting(rider.isSprinting()); + if (!mount.isSprintAllowed() && rider.isSprinting()) { + rider.setSprinting(false); + } + + this.setSprinting(riderSprinting); this.stepHeight = 1.0F; this.jumpMovementFactor = moveSpeed * 0.1F; @@ -2135,21 +2145,33 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti if (!worldObj.isRemote) { this.setAIMoveSpeed(moveSpeed); super.moveEntityWithHeading(strafe, forward); - this.prevLimbSwingAmount = this.limbSwingAmount; - double deltaX = this.posX - this.prevPosX; - double deltaZ = this.posZ - this.prevPosZ; - float limbSwingSpeed = MathHelper.sqrt_double(deltaX * deltaX + deltaZ * deltaZ) * 4.0F; - if (limbSwingSpeed > 1.0F) { - limbSwingSpeed = 1.0F; - } - this.limbSwingAmount += (limbSwingSpeed - this.limbSwingAmount) * 0.4F; - this.limbSwing += this.limbSwingAmount; } + + this.prevLimbSwingAmount = this.limbSwingAmount; + double deltaX = this.posX - this.prevPosX; + double deltaZ = this.posZ - this.prevPosZ; + if (worldObj.isRemote && deltaX * deltaX + deltaZ * deltaZ < 1.0E-6D) { + deltaX = this.motionX; + deltaZ = this.motionZ; + } + float limbSwingSpeed = MathHelper.sqrt_double(deltaX * deltaX + deltaZ * deltaZ) * 4.0F; + if (limbSwingSpeed > 1.0F) { + limbSwingSpeed = 1.0F; + } + this.limbSwingAmount += (limbSwingSpeed - this.limbSwingAmount) * 0.4F; + this.limbSwing += this.limbSwingAmount; } protected void applyMountedVerticalMotion(EntityLivingBase rider, float moveSpeed, float forward) { + if (!(roleInterface instanceof RoleMount)) { + return; + } + RoleMount mount = (RoleMount) roleInterface; + double jumpFactor = MathHelper.clamp_double(mount.getJumpStrength(), 0.1D, 3.0D); + if (canFly()) { - double vertical = Math.max(0.1D, moveSpeed * 0.6D); + double verticalBase = Math.max(0.1D, moveSpeed * 0.6D); + double vertical = MathHelper.clamp_double(verticalBase * jumpFactor, 0.05D, 2.0D); if (rider.isJumping) { this.motionY = Math.min(this.motionY + vertical, vertical); this.isAirBorne = true; @@ -2165,7 +2187,8 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti } } } else if (rider.isJumping && this.onGround) { - double jumpVelocity = MathHelper.clamp_double(0.4D + moveSpeed * 1.5D, 0.4D, 0.9D); + double baseVelocity = MathHelper.clamp_double(0.4D + moveSpeed * 1.5D, 0.2D, 1.2D); + double jumpVelocity = MathHelper.clamp_double(baseVelocity * jumpFactor, 0.2D, 2.0D); this.motionY = jumpVelocity; this.isAirBorne = true; this.velocityChanged = true; @@ -2230,6 +2253,13 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti } Entity currentRider = this.riddenByEntity; + if (currentRider != null && !(currentRider instanceof EntityPlayer)) { + Entity dismount = currentRider; + dismount.mountEntity(null); + stabilizeDismountedRider(dismount); + haltMountedMotion(); + currentRider = null; + } if (currentRider != lastRider) { if (lastRider != null) { stabilizeDismountedRider(lastRider); diff --git a/src/main/java/noppes/npcs/roles/RoleMount.java b/src/main/java/noppes/npcs/roles/RoleMount.java index e3ee3bf25..a1a07c800 100644 --- a/src/main/java/noppes/npcs/roles/RoleMount.java +++ b/src/main/java/noppes/npcs/roles/RoleMount.java @@ -10,7 +10,12 @@ public class RoleMount extends RoleInterface { private float offsetX; private float offsetY; private float offsetZ; + private static final float MIN_JUMP_STRENGTH = 0.1F; + private static final float MAX_JUMP_STRENGTH = 3.0F; + private boolean storedReturnToStart; + private float jumpStrength = 1.0F; + private boolean allowSprint = true; public RoleMount(EntityNPCInterface npc) { super(npc); @@ -24,6 +29,8 @@ public class RoleMount extends RoleInterface { compound.setFloat("MountOffsetY", offsetY); compound.setFloat("MountOffsetZ", offsetZ); compound.setBoolean("MountReturnFlag", storedReturnToStart); + compound.setFloat("MountJumpStrength", jumpStrength); + compound.setBoolean("MountAllowSprint", allowSprint); return compound; } @@ -37,6 +44,12 @@ public class RoleMount extends RoleInterface { } else { storedReturnToStart = npc.ais.returnToStart; } + if (compound.hasKey("MountJumpStrength")) { + setJumpStrength(compound.getFloat("MountJumpStrength")); + } else { + jumpStrength = 1.0F; + } + allowSprint = !compound.hasKey("MountAllowSprint") || compound.getBoolean("MountAllowSprint"); npc.ais.returnToStart = false; } @@ -92,6 +105,22 @@ public class RoleMount extends RoleInterface { return offsetZ; } + public void setJumpStrength(float value) { + this.jumpStrength = ValueUtil.clamp(value, MIN_JUMP_STRENGTH, MAX_JUMP_STRENGTH); + } + + public float getJumpStrength() { + return jumpStrength; + } + + public void setSprintAllowed(boolean allowSprint) { + this.allowSprint = allowSprint; + } + + public boolean isSprintAllowed() { + return allowSprint; + } + public void setReturnToStartPreference(boolean value) { this.storedReturnToStart = value; npc.ais.returnToStart = false; diff --git a/src/main/resources/assets/customnpcs/lang/cs_CZ.lang b/src/main/resources/assets/customnpcs/lang/cs_CZ.lang index e9cd29b99..e574a1fb1 100644 --- a/src/main/resources/assets/customnpcs/lang/cs_CZ.lang +++ b/src/main/resources/assets/customnpcs/lang/cs_CZ.lang @@ -443,5 +443,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/de_DE.lang b/src/main/resources/assets/customnpcs/lang/de_DE.lang index 38f3d3377..86269b7b0 100644 --- a/src/main/resources/assets/customnpcs/lang/de_DE.lang +++ b/src/main/resources/assets/customnpcs/lang/de_DE.lang @@ -875,5 +875,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/en_US.lang b/src/main/resources/assets/customnpcs/lang/en_US.lang index c3edc664e..6026ed59a 100644 --- a/src/main/resources/assets/customnpcs/lang/en_US.lang +++ b/src/main/resources/assets/customnpcs/lang/en_US.lang @@ -421,6 +421,8 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/es_AR.lang b/src/main/resources/assets/customnpcs/lang/es_AR.lang index 5ca50fc49..f0d9533a2 100644 --- a/src/main/resources/assets/customnpcs/lang/es_AR.lang +++ b/src/main/resources/assets/customnpcs/lang/es_AR.lang @@ -503,5 +503,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/es_MX.lang b/src/main/resources/assets/customnpcs/lang/es_MX.lang index fd58878af..9b3ee6a1f 100644 --- a/src/main/resources/assets/customnpcs/lang/es_MX.lang +++ b/src/main/resources/assets/customnpcs/lang/es_MX.lang @@ -503,5 +503,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/fr_FR.lang b/src/main/resources/assets/customnpcs/lang/fr_FR.lang index 6229aa1b9..6fc66154c 100644 --- a/src/main/resources/assets/customnpcs/lang/fr_FR.lang +++ b/src/main/resources/assets/customnpcs/lang/fr_FR.lang @@ -545,5 +545,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/hu_HU.lang b/src/main/resources/assets/customnpcs/lang/hu_HU.lang index e3112252c..63ee943af 100644 --- a/src/main/resources/assets/customnpcs/lang/hu_HU.lang +++ b/src/main/resources/assets/customnpcs/lang/hu_HU.lang @@ -545,5 +545,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/id_ID.lang b/src/main/resources/assets/customnpcs/lang/id_ID.lang index a7de30101..2b53a9639 100644 --- a/src/main/resources/assets/customnpcs/lang/id_ID.lang +++ b/src/main/resources/assets/customnpcs/lang/id_ID.lang @@ -320,5 +320,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/ko_KR.lang b/src/main/resources/assets/customnpcs/lang/ko_KR.lang index 64b370445..89f7c8d7d 100644 --- a/src/main/resources/assets/customnpcs/lang/ko_KR.lang +++ b/src/main/resources/assets/customnpcs/lang/ko_KR.lang @@ -800,5 +800,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/nl_NL.lang b/src/main/resources/assets/customnpcs/lang/nl_NL.lang index 6998ad909..acae2f273 100644 --- a/src/main/resources/assets/customnpcs/lang/nl_NL.lang +++ b/src/main/resources/assets/customnpcs/lang/nl_NL.lang @@ -235,5 +235,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/pl_PL.lang b/src/main/resources/assets/customnpcs/lang/pl_PL.lang index 0526906d6..ff860e0ab 100644 --- a/src/main/resources/assets/customnpcs/lang/pl_PL.lang +++ b/src/main/resources/assets/customnpcs/lang/pl_PL.lang @@ -501,5 +501,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/pt_BR.lang b/src/main/resources/assets/customnpcs/lang/pt_BR.lang index 3e5411213..066697e8c 100644 --- a/src/main/resources/assets/customnpcs/lang/pt_BR.lang +++ b/src/main/resources/assets/customnpcs/lang/pt_BR.lang @@ -501,5 +501,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/ru_RU.lang b/src/main/resources/assets/customnpcs/lang/ru_RU.lang index f190a84f0..a34739f0d 100644 --- a/src/main/resources/assets/customnpcs/lang/ru_RU.lang +++ b/src/main/resources/assets/customnpcs/lang/ru_RU.lang @@ -1024,5 +1024,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/sv_SE.lang b/src/main/resources/assets/customnpcs/lang/sv_SE.lang index adf43d88c..70a29ebc9 100644 --- a/src/main/resources/assets/customnpcs/lang/sv_SE.lang +++ b/src/main/resources/assets/customnpcs/lang/sv_SE.lang @@ -311,5 +311,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/zh_CN.lang b/src/main/resources/assets/customnpcs/lang/zh_CN.lang index 41799f778..00fb8c796 100644 --- a/src/main/resources/assets/customnpcs/lang/zh_CN.lang +++ b/src/main/resources/assets/customnpcs/lang/zh_CN.lang @@ -1247,5 +1247,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/zh_TW.lang b/src/main/resources/assets/customnpcs/lang/zh_TW.lang index 6b864af53..a4f3d4ae5 100644 --- a/src/main/resources/assets/customnpcs/lang/zh_TW.lang +++ b/src/main/resources/assets/customnpcs/lang/zh_TW.lang @@ -317,5 +317,7 @@ role.mount=Mount role.mount.offsetx=Seat Offset X role.mount.offsety=Seat Offset Y role.mount.offsetz=Seat Offset Z +role.mount.jumpheight=Jump Strength +role.mount.sprint=Allow Sprinting role.mount.reset=Reset Position role.mount.walkspeed=Walking speed: %s