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 04ca935d9..94c11cca6 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, CombatStyle.MELEE); + List list = findMultihitTargets(vl, entity, victim, null); for (Entity n : list) { if (n == victim) { continue; 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 71666b7da..478d58026 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,18 @@ 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, attacker: Entity, victim: Entity, combatStyle: CombatStyle): List { - val targetCandidates = getLocalEntities(center, 1).filter { it != attacker && it.isAttackable(attacker, combatStyle, false) } +fun isAttackable(victim: Entity, attacker: Entity, combatStyle: CombatStyle?, wilderness: Boolean): Boolean { + if (combatStyle == null) { + return true + } + if (wilderness) { + return WildernessZone.getInstance().continueAttack(attacker, victim, combatStyle, false) + } + return victim.isAttackable(attacker, combatStyle, false) +} + +fun findMultihitTargets(center: Location, attacker: Entity, victim: Entity, combatStyle: CombatStyle?): List { + val targetCandidates = getLocalEntities(center, 1).filter { it != attacker && isAttackable(it, attacker, combatStyle, false) } val targets: List? if (victim is Player) { val players = targetCandidates.filterIsInstance() @@ -17,9 +27,9 @@ fun findMultihitTargets(center: Location, attacker: Entity, victim: Entity, comb if (entity !is Familiar) { return false } - return entity.owner in players && WildernessZone.getInstance().continueAttack(attacker, entity.owner, combatStyle, false) + return entity.owner in players && isAttackable(entity.owner, attacker, combatStyle, true) } - targets = targetCandidates.filter { it is Player || isFamiliarOf(it, players) } + targets = targetCandidates.filter { (it is Player && isAttackable(attacker, it, combatStyle, true)) || isFamiliarOf(it, players) } } else { val npcs = targetCandidates.filterIsInstance() fun isOwnerOf(entity: Entity, npcs: List): Boolean { @@ -28,7 +38,7 @@ fun findMultihitTargets(center: Location, attacker: Entity, victim: Entity, comb } for (npc in npcs) { if (npc is Familiar && npc.owner == entity) { - return WildernessZone.getInstance().continueAttack(attacker, entity, combatStyle, false) + return isAttackable(entity, attacker, combatStyle, true) } } return false