Arakne / Araknemu

Simple Dofus server in Java
GNU Lesser General Public License v3.0
105 stars 28 forks source link

Fighter#cell() is called on a fighter without cell when applying spell effect #327

Closed vincent4vx closed 7 months ago

vincent4vx commented 8 months ago
2024-01-13 06:24:32,588 ERROR f.q.a.g.GameService [pool-5-thread-4] Error on fight executor : The fighter is not on a cell
java.lang.IllegalStateException: The fighter is not on a cell
    at fr.quatrevieux.araknemu.game.fight.fighter.AbstractFighter.cell(AbstractFighter.java:69) ~[araknemu-0.11-alpha-jar-with-dependencies.jar:0.11-alpha]
    at fr.quatrevieux.araknemu.game.fight.fighter.AbstractFighter.cell(AbstractFighter.java:42) ~[araknemu-0.11-alpha-jar-with-dependencies.jar:0.11-alpha]
    at fr.quatrevieux.araknemu.game.fight.castable.BaseCastScope.<init>(BaseCastScope.java:53) ~[araknemu-0.11-alpha-jar-with-dependencies.jar:0.11-alpha]
    at fr.quatrevieux.araknemu.game.fight.castable.FightCastScope.<init>(FightCastScope.java:54) ~[araknemu-0.11-alpha-jar-with-dependencies.jar:0.11-alpha]
    at fr.quatrevieux.araknemu.game.fight.castable.FightCastScope.probable(FightCastScope.java:83) ~[araknemu-0.11-alpha-jar-with-dependencies.jar:0.11-alpha]
    at fr.quatrevieux.araknemu.game.fight.turn.action.cast.CastSuccess.apply(CastSuccess.java:99) ~[araknemu-0.11-alpha-jar-with-dependencies.jar:0.11-alpha]
    at fr.quatrevieux.araknemu.game.fight.turn.action.ActionHandler.terminate(ActionHandler.java:101) ~[araknemu-0.11-alpha-jar-with-dependencies.jar:0.11-alpha]
    at fr.quatrevieux.araknemu.game.fight.Fight$Task.run(Fight.java:412) [araknemu-0.11-alpha-jar-with-dependencies.jar:0.11-alpha]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_252]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_252]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_252]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_252]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_252]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_252]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_252]
vincent4vx commented 8 months ago

Seems occurs when a fighter leave the fighter with a pending action (no GKK has been sent), so the pending action will be terminated by a scheduled task, and call ActionHandler::terminate() after the fighter has been removed from fight (so it doesn't have a cell).

To fix that, we can check if the fighter is alive before performing the pending action.