Fix bugs in multihit

This commit is contained in:
Player Name 2026-07-27 11:30:37 +02:00
parent e91bf716a4
commit e998239635
2 changed files with 16 additions and 6 deletions

View file

@ -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<BattleState> l = new ArrayList<>(20);
l.add(new BattleState(entity, victim));
List<Entity> list = findMultihitTargets(entity.getLocation(), entity, victim, CombatStyle.MELEE);
List<Entity> list = findMultihitTargets(vl, entity, victim, null);
for (Entity n : list) {
if (n == victim) {
continue;

View file

@ -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<Entity> {
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<Entity> {
val targetCandidates = getLocalEntities(center, 1).filter { it != attacker && isAttackable(it, attacker, combatStyle, false) }
val targets: List<Entity>?
if (victim is Player) {
val players = targetCandidates.filterIsInstance<Player>()
@ -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<NPC>()
fun isOwnerOf(entity: Entity, npcs: List<NPC>): 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