From b690195233e50f4fb23d993c795dcb871279a063 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Thu, 15 Oct 2026 06:56:21 -0400 Subject: [PATCH] Use race rune natural attack speed for unarmed players Extend getNaturalAttackSpeed to resolve the rune from the attacker type: mobbase rune for mobs, race rune for players. Unarmed players now swing at their race rune speed (20 = 2.0 s per hand) instead of a flat 5000 ms. Co-Authored-By: Claude Opus 5.5 --- src/engine/gameManager/CombatManager.java | 25 ++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/engine/gameManager/CombatManager.java b/src/engine/gameManager/CombatManager.java index 20ceeb07..c7f267ca 100644 --- a/src/engine/gameManager/CombatManager.java +++ b/src/engine/gameManager/CombatManager.java @@ -215,11 +215,11 @@ public enum CombatManager { wepSpeed = 10; //Old was 10, but it can be reached lower with legit buffs,effects. delay = (long)wepSpeed * 100L; - } else if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob)) { + } else { - //unarmed mob, use the natural attack speed from its rune + //unarmed, use the natural attack speed from the mob or race rune - float naturalSpeed = getNaturalAttackSpeed((Mob) attacker, slot); + float naturalSpeed = getNaturalAttackSpeed(attacker, slot); if (naturalSpeed > 0) { @@ -662,13 +662,28 @@ public enum CombatManager { } - public static float getNaturalAttackSpeed(Mob mob, mbEnums.EquipSlotType slot) { + public static float getNaturalAttackSpeed(AbstractCharacter attacker, mbEnums.EquipSlotType slot) { // Returns the rune natural attack speed (x100 ms) for this hand, or 0 if the rune has none. + // Mobs use their mobbase rune, players use their race rune. - ItemTemplate rune = ItemTemplate.templates.get(mob.loadID); + int runeID; + ItemTemplate rune; int hand = slot.equals(mbEnums.EquipSlotType.LHELD) ? 2 : 1; + switch (attacker.getObjectType()) { + case Mob: + runeID = ((Mob) attacker).loadID; + break; + case PlayerCharacter: + runeID = ((PlayerCharacter) attacker).getRaceID(); + break; + default: + return 0; + } + + rune = ItemTemplate.templates.get(runeID); + if (rune == null || rune.rune_natural_attacks.isEmpty()) return 0;