From 12c08c940a7f8458e3d5009bf8b57e7b25867e78 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Thu, 15 Oct 2026 07:13:52 -0400 Subject: [PATCH] Use rune MINDAMAGE/MAXDAMAGE for regular mob damage The client (ArcMobile, 0x46D200) takes mob damage straight from the rune MINDAMAGE/MAXDAMAGE with no stat scaling; natural attack damage is only scaled for non-mobile characters. Read rune_min_damage/rune_max_damage from the rune template, falling back to the mobbase row when the rune has none. 2689 of 2770 mobbase rows already match the rune. Co-Authored-By: Claude Opus 5.5 --- src/engine/objects/AbstractCharacter.java | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/engine/objects/AbstractCharacter.java b/src/engine/objects/AbstractCharacter.java index 1b42ecda..89f83055 100644 --- a/src/engine/objects/AbstractCharacter.java +++ b/src/engine/objects/AbstractCharacter.java @@ -656,10 +656,22 @@ public abstract class AbstractCharacter extends AbstractWorldObject { AssignDamageAtrForPlayers(abstractCharacter, equipped.get(EquipSlotType.LHELD), false, equipped.get(EquipSlotType.LHELD)); if (abstractCharacter.getObjectType().equals(GameObjectType.Mob)) { Mob mob = (Mob) abstractCharacter; - abstractCharacter.minDamageHandOne = (int) mob.mobBase.getDamageMin(); - abstractCharacter.minDamageHandTwo = (int) mob.mobBase.getDamageMin(); - abstractCharacter.maxDamageHandOne = (int) mob.mobBase.getDamageMax(); - abstractCharacter.maxDamageHandTwo = (int) mob.mobBase.getDamageMax(); + ItemTemplate rune = ItemTemplate.templates.get(mob.loadID); + float minDamage = mob.mobBase.getDamageMin(); + float maxDamage = mob.mobBase.getDamageMax(); + + // [AI] The client (ArcMobile, 0x46D200) takes mob damage straight from the rune MINDAMAGE/MAXDAMAGE, + // with no stat scaling. Use the rune when it has damage, otherwise keep the mobbase value. + + if (rune != null && rune.rune_max_damage > 0) { + minDamage = rune.rune_min_damage; + maxDamage = rune.rune_max_damage; + } + + abstractCharacter.minDamageHandOne = (int) minDamage; + abstractCharacter.minDamageHandTwo = (int) minDamage; + abstractCharacter.maxDamageHandOne = (int) maxDamage; + abstractCharacter.maxDamageHandTwo = (int) maxDamage; abstractCharacter.atrHandOne = mob.mobBase.getAttackRating(); abstractCharacter.atrHandTwo = mob.mobBase.getAttackRating(); abstractCharacter.defenseRating = mob.mobBase.getDefenseRating();