From e91bf716a42230c7772a9b15e0f9f0af6d4d4b4d Mon Sep 17 00:00:00 2001 From: Player Name Date: Mon, 27 Jul 2026 11:13:04 +0200 Subject: [PATCH] Fix bugs in multihit --- .../item/equipment/special/ChinchompaSwingHandler.java | 5 +++-- .../item/equipment/special/PowerstabSpecialHandler.java | 2 +- .../item/equipment/special/SpearWallSpecialHandler.java | 2 +- .../item/equipment/special/SweepSpecialHandler.java | 2 +- .../content/global/skill/magic/ancient/BloodSpells.java | 2 +- .../content/global/skill/magic/ancient/IceSpells.java | 2 +- .../content/global/skill/magic/ancient/MiasmicSpells.java | 2 +- .../content/global/skill/magic/ancient/ShadowSpells.java | 2 +- .../content/global/skill/magic/ancient/SmokeSpells.java | 2 +- .../main/core/game/node/entity/combat/MultihitTargets.kt | 8 ++++---- 10 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Server/src/main/content/global/handlers/item/equipment/special/ChinchompaSwingHandler.java b/Server/src/main/content/global/handlers/item/equipment/special/ChinchompaSwingHandler.java index de9344617..246fb6297 100644 --- a/Server/src/main/content/global/handlers/item/equipment/special/ChinchompaSwingHandler.java +++ b/Server/src/main/content/global/handlers/item/equipment/special/ChinchompaSwingHandler.java @@ -55,14 +55,15 @@ public final class ChinchompaSwingHandler extends RangeSwingHandler { return -1; } - List targetCandidates = findMultihitTargets(victim.getLocation(), entity, victim, entity.getSwingHandler(false), CombatStyle.RANGE); + boolean accurate = isAccurateImpact(entity, victim, CombatStyle.RANGE); + List targetCandidates = findMultihitTargets(victim.getLocation(), entity, victim, CombatStyle.RANGE); BattleState[] targets = new BattleState[targetCandidates.size()]; int count = 0; for (Entity e : targetCandidates) { BattleState s = targets[count++] = new BattleState(entity, e); s.setStyle(CombatStyle.RANGE); int hit = 0; - if (isAccurateImpact(entity, e, CombatStyle.RANGE)) { + if (accurate) { hit = RandomFunction.random(calculateHit(entity, e, 1.0) + 1); } s.setEstimatedHit(hit); diff --git a/Server/src/main/content/global/handlers/item/equipment/special/PowerstabSpecialHandler.java b/Server/src/main/content/global/handlers/item/equipment/special/PowerstabSpecialHandler.java index bcfb11e96..678bc6ef6 100644 --- a/Server/src/main/content/global/handlers/item/equipment/special/PowerstabSpecialHandler.java +++ b/Server/src/main/content/global/handlers/item/equipment/special/PowerstabSpecialHandler.java @@ -76,7 +76,7 @@ public final class PowerstabSpecialHandler extends MeleeSwingHandler implements if (!multi) { return super.swing(entity, victim, state); } - List list = findMultihitTargets(entity.getLocation(), entity, victim, entity.getSwingHandler(false), CombatStyle.MELEE); + List list = findMultihitTargets(entity.getLocation(), entity, victim, CombatStyle.MELEE); BattleState[] targets = new BattleState[list.size()]; int count = 0; for (Entity e : list) { diff --git a/Server/src/main/content/global/handlers/item/equipment/special/SpearWallSpecialHandler.java b/Server/src/main/content/global/handlers/item/equipment/special/SpearWallSpecialHandler.java index b66af1707..9e5b4227c 100644 --- a/Server/src/main/content/global/handlers/item/equipment/special/SpearWallSpecialHandler.java +++ b/Server/src/main/content/global/handlers/item/equipment/special/SpearWallSpecialHandler.java @@ -77,7 +77,7 @@ public final class SpearWallSpecialHandler extends MeleeSwingHandler implements if (!multi) { return super.swing(entity, victim, state); } - List list = findMultihitTargets(entity.getLocation(), entity, victim, entity.getSwingHandler(false), CombatStyle.MELEE); + List list = findMultihitTargets(entity.getLocation(), entity, victim, CombatStyle.MELEE); BattleState[] targets = new BattleState[list.size()]; int count = 0; for (Entity e : list) { diff --git a/Server/src/main/content/global/handlers/item/equipment/special/SweepSpecialHandler.java b/Server/src/main/content/global/handlers/item/equipment/special/SweepSpecialHandler.java index cdeed3461..04ca935d9 100644 --- a/Server/src/main/content/global/handlers/item/equipment/special/SweepSpecialHandler.java +++ b/Server/src/main/content/global/handlers/item/equipment/special/SweepSpecialHandler.java @@ -101,7 +101,7 @@ public final class SweepSpecialHandler extends MeleeSwingHandler implements Plug Direction dir = Direction.getDirection(x - entity.getLocation().getX(), y - entity.getLocation().getY()); List l = new ArrayList<>(20); l.add(new BattleState(entity, victim)); - List list = findMultihitTargets(entity.getLocation(), entity, victim, entity.getSwingHandler(false), CombatStyle.MELEE); + List list = findMultihitTargets(entity.getLocation(), entity, victim, CombatStyle.MELEE); for (Entity n : list) { if (n == victim) { continue; diff --git a/Server/src/main/content/global/skill/magic/ancient/BloodSpells.java b/Server/src/main/content/global/skill/magic/ancient/BloodSpells.java index 700c21ecc..c9ebbff9e 100644 --- a/Server/src/main/content/global/skill/magic/ancient/BloodSpells.java +++ b/Server/src/main/content/global/skill/magic/ancient/BloodSpells.java @@ -121,7 +121,7 @@ public final class BloodSpells extends CombatSpell { return super.getTargets(entity, target); } - List list = MultihitTargetsKt.findMultihitTargets(target.getLocation(), entity, target, entity.getSwingHandler(false), CombatStyle.MAGIC); + List list = MultihitTargetsKt.findMultihitTargets(target.getLocation(), entity, target, CombatStyle.MAGIC); BattleState[] targets = new BattleState[list.size()]; int index = 0; for (Entity e : list) { diff --git a/Server/src/main/content/global/skill/magic/ancient/IceSpells.java b/Server/src/main/content/global/skill/magic/ancient/IceSpells.java index 664971e2f..e2afb1488 100644 --- a/Server/src/main/content/global/skill/magic/ancient/IceSpells.java +++ b/Server/src/main/content/global/skill/magic/ancient/IceSpells.java @@ -146,7 +146,7 @@ public final class IceSpells extends CombatSpell { return super.getTargets(entity, target); } - List list = MultihitTargetsKt.findMultihitTargets(target.getLocation(), entity, target, entity.getSwingHandler(false), CombatStyle.MAGIC); + List list = MultihitTargetsKt.findMultihitTargets(target.getLocation(), entity, target, CombatStyle.MAGIC); BattleState[] targets = new BattleState[list.size()]; int index = 0; for (Entity e : list) { diff --git a/Server/src/main/content/global/skill/magic/ancient/MiasmicSpells.java b/Server/src/main/content/global/skill/magic/ancient/MiasmicSpells.java index 075e1e725..101c21943 100644 --- a/Server/src/main/content/global/skill/magic/ancient/MiasmicSpells.java +++ b/Server/src/main/content/global/skill/magic/ancient/MiasmicSpells.java @@ -160,7 +160,7 @@ public final class MiasmicSpells extends CombatSpell { return super.getTargets(entity, target); } - List list = MultihitTargetsKt.findMultihitTargets(target.getLocation(), entity, target, entity.getSwingHandler(false), CombatStyle.MAGIC); + List list = MultihitTargetsKt.findMultihitTargets(target.getLocation(), entity, target, CombatStyle.MAGIC); BattleState[] targets = new BattleState[list.size()]; int index = 0; for (Entity e : list) { diff --git a/Server/src/main/content/global/skill/magic/ancient/ShadowSpells.java b/Server/src/main/content/global/skill/magic/ancient/ShadowSpells.java index 29ec2eb5a..f50d3206a 100644 --- a/Server/src/main/content/global/skill/magic/ancient/ShadowSpells.java +++ b/Server/src/main/content/global/skill/magic/ancient/ShadowSpells.java @@ -117,7 +117,7 @@ public final class ShadowSpells extends CombatSpell { return super.getTargets(entity, target); } - List list = MultihitTargetsKt.findMultihitTargets(target.getLocation(), entity, target, entity.getSwingHandler(false), CombatStyle.MAGIC); + List list = MultihitTargetsKt.findMultihitTargets(target.getLocation(), entity, target, CombatStyle.MAGIC); BattleState[] targets = new BattleState[list.size()]; int index = 0; for (Entity e : list) { diff --git a/Server/src/main/content/global/skill/magic/ancient/SmokeSpells.java b/Server/src/main/content/global/skill/magic/ancient/SmokeSpells.java index 1245dbd01..4c238df56 100644 --- a/Server/src/main/content/global/skill/magic/ancient/SmokeSpells.java +++ b/Server/src/main/content/global/skill/magic/ancient/SmokeSpells.java @@ -125,7 +125,7 @@ public final class SmokeSpells extends CombatSpell { return super.getTargets(entity, target); } - List list = MultihitTargetsKt.findMultihitTargets(target.getLocation(), entity, target, entity.getSwingHandler(false), CombatStyle.MAGIC); + List list = MultihitTargetsKt.findMultihitTargets(target.getLocation(), entity, target, CombatStyle.MAGIC); BattleState[] targets = new BattleState[list.size()]; int index = 0; for (Entity e : list) { diff --git a/Server/src/main/core/game/node/entity/combat/MultihitTargets.kt b/Server/src/main/core/game/node/entity/combat/MultihitTargets.kt index 244358bd5..71666b7da 100644 --- a/Server/src/main/core/game/node/entity/combat/MultihitTargets.kt +++ b/Server/src/main/core/game/node/entity/combat/MultihitTargets.kt @@ -8,8 +8,8 @@ import core.game.world.map.Location import core.game.world.map.RegionManager.getLocalEntities import core.game.world.map.zone.impl.WildernessZone -fun findMultihitTargets(center: Location, entity: Entity, victim: Entity, swingHandler: CombatSwingHandler, combatStyle: CombatStyle): List { - val targetCandidates = getLocalEntities(center, 1).filter { it != entity && swingHandler.canSwing(entity, it) != InteractionType.NO_INTERACT && it.isAttackable(entity, combatStyle, false) } +fun findMultihitTargets(center: Location, attacker: Entity, victim: Entity, combatStyle: CombatStyle): List { + val targetCandidates = getLocalEntities(center, 1).filter { it != attacker && it.isAttackable(attacker, combatStyle, false) } val targets: List? if (victim is Player) { val players = targetCandidates.filterIsInstance() @@ -17,7 +17,7 @@ fun findMultihitTargets(center: Location, entity: Entity, victim: Entity, swingH if (entity !is Familiar) { return false } - return entity.owner in players + return entity.owner in players && WildernessZone.getInstance().continueAttack(attacker, entity.owner, combatStyle, false) } targets = targetCandidates.filter { it is Player || isFamiliarOf(it, players) } } else { @@ -28,7 +28,7 @@ fun findMultihitTargets(center: Location, entity: Entity, victim: Entity, swingH } for (npc in npcs) { if (npc is Familiar && npc.owner == entity) { - return WildernessZone.getInstance().continueAttack(entity, entity, combatStyle, false) + return WildernessZone.getInstance().continueAttack(attacker, entity, combatStyle, false) } } return false