From 330db50985251f9cddef864f76a85128af37d036 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Thu, 15 Oct 2026 07:15:26 -0400 Subject: [PATCH] Use rune ATTACK for regular mob ATR The client (0x466570) gives mobiles their ATR straight from the rune ATTACK. Read rune_attack from the rune template, falling back to the mobbase atr when the rune has none. Co-Authored-By: Claude Opus 5.5 --- src/engine/objects/AbstractCharacter.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/engine/objects/AbstractCharacter.java b/src/engine/objects/AbstractCharacter.java index 89f83055..fe77b0f2 100644 --- a/src/engine/objects/AbstractCharacter.java +++ b/src/engine/objects/AbstractCharacter.java @@ -659,6 +659,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject { ItemTemplate rune = ItemTemplate.templates.get(mob.loadID); float minDamage = mob.mobBase.getDamageMin(); float maxDamage = mob.mobBase.getDamageMax(); + int attackRating = mob.mobBase.getAttackRating(); // [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. @@ -668,12 +669,17 @@ public abstract class AbstractCharacter extends AbstractWorldObject { maxDamage = rune.rune_max_damage; } + // [AI] Likewise ATR comes straight from the rune ATTACK for mobiles (0x466570). + + if (rune != null && rune.rune_attack > 0) + attackRating = rune.rune_attack; + 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.atrHandOne = attackRating; + abstractCharacter.atrHandTwo = attackRating; abstractCharacter.defenseRating = mob.mobBase.getDefenseRating(); } }