diff --git a/pom.xml b/pom.xml
index 5f37cc625..06c281126 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,7 +32,7 @@
fr.quatrevieux.araknemu
araknemu
- 0.9-alpha
+ 0.9.1-alpha
io.netty
@@ -57,7 +57,7 @@
org.apache.logging.log4j
log4j-core
- 2.16.0
+ 2.17.0
org.ini4j
diff --git a/src/main/java/fr/quatrevieux/araknemu/game/fight/fighter/AbstractFighter.java b/src/main/java/fr/quatrevieux/araknemu/game/fight/fighter/AbstractFighter.java
index d8d8f16bf..56e8524d9 100644
--- a/src/main/java/fr/quatrevieux/araknemu/game/fight/fighter/AbstractFighter.java
+++ b/src/main/java/fr/quatrevieux/araknemu/game/fight/fighter/AbstractFighter.java
@@ -31,6 +31,7 @@
import java.util.HashMap;
import java.util.Map;
+import java.util.function.Consumer;
/**
* Base class for implements a fighter
@@ -135,6 +136,15 @@ public final FightTurn turn() {
return turn;
}
+ @Override
+ public final void perform(Consumer action) {
+ final FightTurn turn = this.turn;
+
+ if (turn != null) {
+ action.accept(turn);
+ }
+ }
+
@Override
public final void attach(Object key, Object value) {
attachments.put(key, value);
diff --git a/src/main/java/fr/quatrevieux/araknemu/game/fight/fighter/Fighter.java b/src/main/java/fr/quatrevieux/araknemu/game/fight/fighter/Fighter.java
index fbe8942aa..22d80dfb8 100644
--- a/src/main/java/fr/quatrevieux/araknemu/game/fight/fighter/Fighter.java
+++ b/src/main/java/fr/quatrevieux/araknemu/game/fight/fighter/Fighter.java
@@ -31,6 +31,8 @@
import fr.quatrevieux.araknemu.game.fight.turn.FightTurn;
import fr.quatrevieux.araknemu.game.world.creature.Creature;
+import java.util.function.Consumer;
+
/**
* Base fighter
*/
@@ -56,9 +58,21 @@ public interface Fighter extends Creature, Dispatcher, ActiveFighter
* Get the current fighter turn
*
* @throws FightException If it's not the turn of the current fighter
+ *
+ * @see Fighter#perform(Consumer) For perform action on fighter in a safe way (no exception)
*/
public FightTurn turn();
+ /**
+ * Perform an action on the current active turn
+ * The action will take as parameter the current turn
+ *
+ * If it's not the turn of the fighter, this method will not call the action
+ *
+ * @param action Action to perform
+ */
+ public void perform(Consumer action);
+
/**
* Attach an attribute to the fighter
*
diff --git a/src/main/java/fr/quatrevieux/araknemu/game/handler/account/BoostCharacteristic.java b/src/main/java/fr/quatrevieux/araknemu/game/handler/account/BoostCharacteristic.java
index 8417adf0f..4de359db5 100644
--- a/src/main/java/fr/quatrevieux/araknemu/game/handler/account/BoostCharacteristic.java
+++ b/src/main/java/fr/quatrevieux/araknemu/game/handler/account/BoostCharacteristic.java
@@ -19,9 +19,11 @@
package fr.quatrevieux.araknemu.game.handler.account;
+import fr.quatrevieux.araknemu.core.network.exception.ErrorPacket;
import fr.quatrevieux.araknemu.core.network.parser.PacketHandler;
import fr.quatrevieux.araknemu.network.game.GameSession;
import fr.quatrevieux.araknemu.network.game.in.account.AskBoost;
+import fr.quatrevieux.araknemu.network.game.out.basic.Noop;
/**
* Boost player characteristic
@@ -29,11 +31,15 @@
public final class BoostCharacteristic implements PacketHandler {
@Override
public void handle(GameSession session, AskBoost packet) throws Exception {
- session.player()
- .properties()
- .characteristics()
- .boostCharacteristic(packet.characteristic())
- ;
+ try {
+ session.player()
+ .properties()
+ .characteristics()
+ .boostCharacteristic(packet.characteristic())
+ ;
+ } catch (RuntimeException e) {
+ throw new ErrorPacket(new Noop(), e);
+ }
}
@Override
diff --git a/src/main/java/fr/quatrevieux/araknemu/game/handler/fight/EndFighterTurn.java b/src/main/java/fr/quatrevieux/araknemu/game/handler/fight/EndFighterTurn.java
index 79eead85b..a1aa9669f 100644
--- a/src/main/java/fr/quatrevieux/araknemu/game/handler/fight/EndFighterTurn.java
+++ b/src/main/java/fr/quatrevieux/araknemu/game/handler/fight/EndFighterTurn.java
@@ -20,6 +20,7 @@
package fr.quatrevieux.araknemu.game.handler.fight;
import fr.quatrevieux.araknemu.core.network.parser.PacketHandler;
+import fr.quatrevieux.araknemu.game.fight.turn.FightTurn;
import fr.quatrevieux.araknemu.network.game.GameSession;
import fr.quatrevieux.araknemu.network.game.in.fight.TurnEnd;
@@ -29,7 +30,7 @@
public final class EndFighterTurn implements PacketHandler {
@Override
public void handle(GameSession session, TurnEnd packet) {
- session.fighter().turn().stop();
+ session.fighter().perform(FightTurn::stop);
}
@Override
diff --git a/src/main/java/fr/quatrevieux/araknemu/game/handler/fight/TerminateTurnAction.java b/src/main/java/fr/quatrevieux/araknemu/game/handler/fight/TerminateTurnAction.java
index 3313f0295..082d1f53d 100644
--- a/src/main/java/fr/quatrevieux/araknemu/game/handler/fight/TerminateTurnAction.java
+++ b/src/main/java/fr/quatrevieux/araknemu/game/handler/fight/TerminateTurnAction.java
@@ -20,6 +20,7 @@
package fr.quatrevieux.araknemu.game.handler.fight;
import fr.quatrevieux.araknemu.core.network.parser.PacketHandler;
+import fr.quatrevieux.araknemu.game.fight.turn.FightTurn;
import fr.quatrevieux.araknemu.network.game.GameSession;
import fr.quatrevieux.araknemu.network.game.in.game.action.GameActionAcknowledge;
@@ -29,7 +30,7 @@
public final class TerminateTurnAction implements PacketHandler {
@Override
public void handle(GameSession session, GameActionAcknowledge packet) {
- session.fighter().turn().terminate();
+ session.fighter().perform(FightTurn::terminate);
}
@Override
diff --git a/src/main/java/fr/quatrevieux/araknemu/game/monster/environment/LivingMonsterGroupPosition.java b/src/main/java/fr/quatrevieux/araknemu/game/monster/environment/LivingMonsterGroupPosition.java
index 8d0e66cfd..9da5b4eca 100644
--- a/src/main/java/fr/quatrevieux/araknemu/game/monster/environment/LivingMonsterGroupPosition.java
+++ b/src/main/java/fr/quatrevieux/araknemu/game/monster/environment/LivingMonsterGroupPosition.java
@@ -82,6 +82,18 @@ public void spawn() {
map.add(factory.create(data, this));
}
+ /**
+ * Respawn a group on the map
+ *
+ * Unlike {@link LivingMonsterGroupPosition#spawn()} the maximum number of groups is checked,
+ * and this method will do nothing if the map is already full
+ */
+ public void respawn() {
+ if (groupStream().count() < data.maxCount()) {
+ map.add(factory.create(data, this));
+ }
+ }
+
/**
* Get list of available monster groups on the map
*/
diff --git a/src/main/java/fr/quatrevieux/araknemu/game/monster/environment/MonsterEnvironmentService.java b/src/main/java/fr/quatrevieux/araknemu/game/monster/environment/MonsterEnvironmentService.java
index 74ab17633..a21b786b9 100644
--- a/src/main/java/fr/quatrevieux/araknemu/game/monster/environment/MonsterEnvironmentService.java
+++ b/src/main/java/fr/quatrevieux/araknemu/game/monster/environment/MonsterEnvironmentService.java
@@ -161,7 +161,7 @@ public Collection byMap(int mapId) {
*/
void respawn(LivingMonsterGroupPosition position, Duration delay) {
activityService.execute(
- new SimpleTask(logger -> position.spawn())
+ new SimpleTask(logger -> position.respawn())
.setDelay(delay.dividedBy(configuration.monsterRespawnSpeedFactor()))
.setMaxTries(2)
.setName("Respawn")
diff --git a/src/main/java/fr/quatrevieux/araknemu/game/player/characteristic/PlayerCharacteristics.java b/src/main/java/fr/quatrevieux/araknemu/game/player/characteristic/PlayerCharacteristics.java
index e9e7aca71..f3df78c5a 100644
--- a/src/main/java/fr/quatrevieux/araknemu/game/player/characteristic/PlayerCharacteristics.java
+++ b/src/main/java/fr/quatrevieux/araknemu/game/player/characteristic/PlayerCharacteristics.java
@@ -93,6 +93,8 @@ public SpecialEffects specials() {
/**
* Boost a characteristic
+ *
+ * @throws IllegalStateException When the character has no enough points for boost the required characteristic
*/
public void boostCharacteristic(Characteristic characteristic) {
final BoostStatsData.Interval interval = race.boost(
@@ -103,7 +105,7 @@ public void boostCharacteristic(Characteristic characteristic) {
final int points = entity.boostPoints() - interval.cost();
if (points < 0) {
- throw new IllegalArgumentException("Not enough points for boost stats");
+ throw new IllegalStateException("Not enough points for boost stats");
}
entity.setBoostPoints(points);
diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
index 74e6c6354..e207c0fb9 100644
--- a/src/main/resources/log4j2.xml
+++ b/src/main/resources/log4j2.xml
@@ -47,7 +47,7 @@
-
+
@@ -63,7 +63,7 @@
-
+
@@ -79,7 +79,7 @@
-
+
@@ -99,7 +99,7 @@
-
+
\ No newline at end of file
diff --git a/src/test/java/fr/quatrevieux/araknemu/game/fight/fighter/monster/MonsterFighterTest.java b/src/test/java/fr/quatrevieux/araknemu/game/fight/fighter/monster/MonsterFighterTest.java
index 2b833f27c..57469e0b4 100644
--- a/src/test/java/fr/quatrevieux/araknemu/game/fight/fighter/monster/MonsterFighterTest.java
+++ b/src/test/java/fr/quatrevieux/araknemu/game/fight/fighter/monster/MonsterFighterTest.java
@@ -256,15 +256,23 @@ void playStop() throws Exception {
Fight fight = createFight();
fighter.joinFight(fight, fight.map().get(123));
- FightTurn turn = new FightTurn(fighter, fight, Duration.ZERO);
+ FightTurn turn = new FightTurn(fighter, fight, Duration.ofSeconds(10));
turn.start();
+ AtomicReference ref = new AtomicReference<>();
fighter.play(turn);
assertSame(turn, fighter.turn());
+ fighter.perform(ref::set);
+ assertSame(turn, ref.get());
+
+ ref.set(null);
fighter.stop();
+ fighter.perform(ref::set);
+
+ assertNull(ref.get());
assertThrows(FightException.class, () -> fighter.turn());
}
diff --git a/src/test/java/fr/quatrevieux/araknemu/game/fight/fighter/player/PlayerFighterTest.java b/src/test/java/fr/quatrevieux/araknemu/game/fight/fighter/player/PlayerFighterTest.java
index 1ee179c5a..2f2419305 100644
--- a/src/test/java/fr/quatrevieux/araknemu/game/fight/fighter/player/PlayerFighterTest.java
+++ b/src/test/java/fr/quatrevieux/araknemu/game/fight/fighter/player/PlayerFighterTest.java
@@ -181,15 +181,22 @@ void turnNotSet() {
@Test
void playAndStop() {
- FightTurn turn = new FightTurn(fighter, fight, Duration.ZERO);
+ FightTurn turn = new FightTurn(fighter, fight, Duration.ofSeconds(10));
turn.start();
+ AtomicReference ref = new AtomicReference<>();
fighter.play(turn);
assertSame(turn, fighter.turn());
+ fighter.perform(ref::set);
+ assertSame(turn, ref.get());
+ ref.set(null);
fighter.stop();
+ fighter.perform(ref::set);
+
+ assertNull(ref.get());
assertThrows(FightException.class, () -> fighter.turn());
}
diff --git a/src/test/java/fr/quatrevieux/araknemu/game/fight/turn/order/AlternateTeamFighterOrderTest.java b/src/test/java/fr/quatrevieux/araknemu/game/fight/turn/order/AlternateTeamFighterOrderTest.java
index 0d71140dc..c5e157d45 100644
--- a/src/test/java/fr/quatrevieux/araknemu/game/fight/turn/order/AlternateTeamFighterOrderTest.java
+++ b/src/test/java/fr/quatrevieux/araknemu/game/fight/turn/order/AlternateTeamFighterOrderTest.java
@@ -42,6 +42,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
+import java.util.function.Consumer;
import static org.junit.jupiter.api.Assertions.*;
@@ -175,6 +176,9 @@ public FightTurn turn() {
return null;
}
+ @Override
+ public void perform(Consumer action) {}
+
@Override
public boolean dead() {
return false;
diff --git a/src/test/java/fr/quatrevieux/araknemu/game/handler/StopSessionTest.java b/src/test/java/fr/quatrevieux/araknemu/game/handler/StopSessionTest.java
index 47ba9678f..cf2c5e10f 100644
--- a/src/test/java/fr/quatrevieux/araknemu/game/handler/StopSessionTest.java
+++ b/src/test/java/fr/quatrevieux/araknemu/game/handler/StopSessionTest.java
@@ -42,6 +42,7 @@
import fr.quatrevieux.araknemu.game.fight.state.PlacementState;
import fr.quatrevieux.araknemu.game.handler.event.Disconnected;
import fr.quatrevieux.araknemu.game.player.GamePlayer;
+import io.github.artsok.RepeatedIfExceptionsTest;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -237,7 +238,7 @@ public Class event() {
assertFalse(map.creatures().contains(player));
}
- @Test
+ @RepeatedIfExceptionsTest
void saveCorrectLifeWhenSessionClosed() throws Exception{
ExplorationPlayer explorationPlayer = explorationPlayer();
explorationPlayer.player().properties().life().set(5);
diff --git a/src/test/java/fr/quatrevieux/araknemu/game/handler/account/BoostCharacteristicTest.java b/src/test/java/fr/quatrevieux/araknemu/game/handler/account/BoostCharacteristicTest.java
index 57dcd8f5b..5ed49b357 100644
--- a/src/test/java/fr/quatrevieux/araknemu/game/handler/account/BoostCharacteristicTest.java
+++ b/src/test/java/fr/quatrevieux/araknemu/game/handler/account/BoostCharacteristicTest.java
@@ -20,12 +20,14 @@
package fr.quatrevieux.araknemu.game.handler.account;
import fr.quatrevieux.araknemu.core.di.ContainerException;
+import fr.quatrevieux.araknemu.core.network.exception.ErrorPacket;
import fr.quatrevieux.araknemu.data.constant.Characteristic;
import fr.quatrevieux.araknemu.data.living.entity.player.Player;
import fr.quatrevieux.araknemu.game.fight.Fight;
import fr.quatrevieux.araknemu.game.fight.FightBaseCase;
import fr.quatrevieux.araknemu.network.game.in.account.AskBoost;
import fr.quatrevieux.araknemu.network.game.out.account.Stats;
+import fr.quatrevieux.araknemu.network.game.out.basic.Noop;
import fr.quatrevieux.araknemu.network.game.out.info.Error;
import fr.quatrevieux.araknemu.network.game.out.object.InventoryWeight;
import org.junit.jupiter.api.BeforeEach;
@@ -67,12 +69,11 @@ void handleSuccess() throws Exception {
}
@Test
- void handleError() throws SQLException, ContainerException, NoSuchFieldException, IllegalAccessException {
+ void handleError() throws Exception {
this.readField(gamePlayer(), "entity").setBoostPoints(0);
+ requestStack.clear();
- assertThrows(IllegalArgumentException.class, () -> handler.handle(session, new AskBoost(Characteristic.INTELLIGENCE)));
-
- requestStack.assertEmpty();
+ assertThrows(ErrorPacket.class, () -> handler.handle(session, new AskBoost(Characteristic.INTELLIGENCE)));
}
@Test
diff --git a/src/test/java/fr/quatrevieux/araknemu/game/handler/fight/EndFighterTurnTest.java b/src/test/java/fr/quatrevieux/araknemu/game/handler/fight/EndFighterTurnTest.java
index 301f942a5..29f3dcda7 100644
--- a/src/test/java/fr/quatrevieux/araknemu/game/handler/fight/EndFighterTurnTest.java
+++ b/src/test/java/fr/quatrevieux/araknemu/game/handler/fight/EndFighterTurnTest.java
@@ -49,7 +49,9 @@ public void setUp() throws Exception {
@Test
void notActiveTurn() {
- assertThrows(FightException.class, () -> handler.handle(session, new TurnEnd()));
+ requestStack.clear();
+ handler.handle(session, new TurnEnd());
+ requestStack.assertEmpty();
}
@Test
diff --git a/src/test/java/fr/quatrevieux/araknemu/game/handler/fight/KickFighterTest.java b/src/test/java/fr/quatrevieux/araknemu/game/handler/fight/KickFighterTest.java
index 7ed705f49..47b2542cc 100644
--- a/src/test/java/fr/quatrevieux/araknemu/game/handler/fight/KickFighterTest.java
+++ b/src/test/java/fr/quatrevieux/araknemu/game/handler/fight/KickFighterTest.java
@@ -33,6 +33,7 @@
import fr.quatrevieux.araknemu.network.game.out.fight.CancelFight;
import fr.quatrevieux.araknemu.network.game.out.game.RemoveSprite;
import fr.quatrevieux.araknemu.network.game.out.info.Error;
+import io.github.artsok.RepeatedIfExceptionsTest;
import org.junit.jupiter.api.Test;
import java.sql.SQLException;
@@ -45,7 +46,7 @@ void notInFight() {
assertThrows(CloseImmediately.class, () -> handlePacket(new KickFighterRequest(12)));
}
- @Test
+ @RepeatedIfExceptionsTest
void notInPlacementState() throws Exception {
Fight fight = createFight();
Fighter teammate = makePlayerFighter(makeSimpleGamePlayer(10));
@@ -60,7 +61,7 @@ void notInPlacementState() throws Exception {
requestStack.assertLast(Error.cantDoDuringFight());
}
- @Test
+ @RepeatedIfExceptionsTest
void notTeammate() throws Exception {
Fight fight = createFight();
Fighter enemy = makePlayerFighter(makeSimpleGamePlayer(10));
@@ -73,7 +74,7 @@ void notTeammate() throws Exception {
requestStack.assertLast(new Noop());
}
- @Test
+ @RepeatedIfExceptionsTest
void fighterNotFound() throws Exception {
Fight fight = createFight();
@@ -83,7 +84,7 @@ void fighterNotFound() throws Exception {
requestStack.assertLast(new Noop());
}
- @Test
+ @RepeatedIfExceptionsTest
void notLeader() throws Exception {
Fight fight = createSimpleFight(container.get(ExplorationMapService.class).load(10340));
Fighter me = makePlayerFighter(gamePlayer());
@@ -97,7 +98,7 @@ void notLeader() throws Exception {
assertTrue(fight.fighters().contains(me));
}
- @Test
+ @RepeatedIfExceptionsTest
void success() throws Exception {
Fight fight = createFight();
Fighter teammate = makePlayerFighter(makeSimpleGamePlayer(10));
diff --git a/src/test/java/fr/quatrevieux/araknemu/game/handler/fight/TerminateTurnActionTest.java b/src/test/java/fr/quatrevieux/araknemu/game/handler/fight/TerminateTurnActionTest.java
index 0aa699036..27d728cb7 100644
--- a/src/test/java/fr/quatrevieux/araknemu/game/handler/fight/TerminateTurnActionTest.java
+++ b/src/test/java/fr/quatrevieux/araknemu/game/handler/fight/TerminateTurnActionTest.java
@@ -33,11 +33,13 @@
import fr.quatrevieux.araknemu.network.game.out.fight.action.ActionEffect;
import io.github.artsok.RepeatedIfExceptionsTest;
import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import java.time.Duration;
import java.util.Arrays;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
class TerminateTurnActionTest extends FightBaseCase {
private Fight fight;
@@ -90,4 +92,11 @@ void terminateMove() {
assertEquals(198, fighter.cell().id());
assertEquals(0, turn.points().movementPoints());
}
+
+ @Test
+ void notActiveTurnShouldNotNothing() {
+ requestStack.clear();
+ handler.handle(session, new GameActionAcknowledge(0));
+ requestStack.assertEmpty();
+ }
}
diff --git a/src/test/java/fr/quatrevieux/araknemu/game/monster/environment/LivingMonsterGroupPositionTest.java b/src/test/java/fr/quatrevieux/araknemu/game/monster/environment/LivingMonsterGroupPositionTest.java
index 3cc53de31..9cad4ecb1 100644
--- a/src/test/java/fr/quatrevieux/araknemu/game/monster/environment/LivingMonsterGroupPositionTest.java
+++ b/src/test/java/fr/quatrevieux/araknemu/game/monster/environment/LivingMonsterGroupPositionTest.java
@@ -104,6 +104,19 @@ void spawn() {
assertCount(3, monsterGroupPosition.available());
}
+ @Test
+ void respawn() {
+ monsterGroupPosition.populate(map);
+ map.remove(monsterGroupPosition.available().get(0));
+ assertCount(1, monsterGroupPosition.available());
+
+ monsterGroupPosition.respawn();
+ assertCount(2, monsterGroupPosition.available());
+
+ monsterGroupPosition.respawn();
+ assertCount(2, monsterGroupPosition.available());
+ }
+
@Test
void fixedGroup() {
monsterGroupPosition = new LivingMonsterGroupPosition(
diff --git a/src/test/java/fr/quatrevieux/araknemu/game/monster/environment/MonsterEnvironmentServiceTest.java b/src/test/java/fr/quatrevieux/araknemu/game/monster/environment/MonsterEnvironmentServiceTest.java
index 08073ddd3..e62574133 100644
--- a/src/test/java/fr/quatrevieux/araknemu/game/monster/environment/MonsterEnvironmentServiceTest.java
+++ b/src/test/java/fr/quatrevieux/araknemu/game/monster/environment/MonsterEnvironmentServiceTest.java
@@ -144,6 +144,8 @@ void respawn() throws InterruptedException, SQLException {
ExplorationMap map = container.get(ExplorationMapService.class).load(10340);
monsterGroupPosition.populate(map);
+ map.remove(monsterGroupPosition.available().get(0));
+
explorationPlayer().changeMap(map, 123);
requestStack.clear();
@@ -151,11 +153,34 @@ void respawn() throws InterruptedException, SQLException {
Thread.sleep(50);
- MonsterGroup lastGroup = monsterGroupPosition.available().get(1);
+ MonsterGroup lastGroup = monsterGroupPosition.available().get(0);
requestStack.assertLast(new AddSprites(Collections.singleton(lastGroup.sprite())));
}
+ @Test
+ void cantRespawnIfAlreadyFull() throws InterruptedException, SQLException {
+ LivingMonsterGroupPosition monsterGroupPosition = new LivingMonsterGroupPosition(
+ container.get(MonsterGroupFactory.class),
+ container.get(MonsterEnvironmentService.class),
+ container.get(FightService.class),
+ container.get(MonsterGroupDataRepository.class).get(3),
+ new RandomCellSelector(), false
+ );
+
+ ExplorationMap map = container.get(ExplorationMapService.class).load(10340);
+ monsterGroupPosition.populate(map);
+
+ explorationPlayer().changeMap(map, 123);
+ requestStack.clear();
+
+ service.respawn(monsterGroupPosition, Duration.ZERO);
+ Thread.sleep(50);
+
+ assertEquals(1, monsterGroupPosition.available().size());
+ requestStack.assertEmpty();
+ }
+
@RepeatedIfExceptionsTest
void respawnWithDelay() throws InterruptedException, SQLException {
LivingMonsterGroupPosition monsterGroupPosition = new LivingMonsterGroupPosition(
@@ -168,6 +193,8 @@ void respawnWithDelay() throws InterruptedException, SQLException {
ExplorationMap map = container.get(ExplorationMapService.class).load(10340);
monsterGroupPosition.populate(map);
+ map.remove(monsterGroupPosition.available().get(0));
+
int size = monsterGroupPosition.available().size();
explorationPlayer().changeMap(map, 123);
@@ -179,7 +206,7 @@ void respawnWithDelay() throws InterruptedException, SQLException {
assertEquals(size, monsterGroupPosition.available().size());
Thread.sleep(20);
- MonsterGroup lastGroup = monsterGroupPosition.available().get(1);
+ MonsterGroup lastGroup = monsterGroupPosition.available().get(0);
requestStack.assertLast(new AddSprites(Collections.singleton(lastGroup.sprite())));
}
@@ -198,13 +225,15 @@ void respawnWithDelayAndRespawnSpeedFactor() throws InterruptedException, SQLExc
ExplorationMap map = container.get(ExplorationMapService.class).load(10340);
monsterGroupPosition.populate(map);
+ map.remove(monsterGroupPosition.available().get(0));
+
explorationPlayer().changeMap(map, 123);
requestStack.clear();
service.respawn(monsterGroupPosition, Duration.ofMillis(50));
Thread.sleep(40);
- MonsterGroup lastGroup = monsterGroupPosition.available().get(1);
+ MonsterGroup lastGroup = monsterGroupPosition.available().get(0);
requestStack.assertLast(new AddSprites(Collections.singleton(lastGroup.sprite())));
}
diff --git a/src/test/java/fr/quatrevieux/araknemu/game/player/GamePlayerTest.java b/src/test/java/fr/quatrevieux/araknemu/game/player/GamePlayerTest.java
index d7fa2de00..764a216f1 100644
--- a/src/test/java/fr/quatrevieux/araknemu/game/player/GamePlayerTest.java
+++ b/src/test/java/fr/quatrevieux/araknemu/game/player/GamePlayerTest.java
@@ -47,6 +47,7 @@
import fr.quatrevieux.araknemu.game.player.spell.SpellBookService;
import fr.quatrevieux.araknemu.game.world.creature.characteristics.DefaultCharacteristics;
import fr.quatrevieux.araknemu.game.world.creature.characteristics.MutableCharacteristics;
+import io.github.artsok.RepeatedIfExceptionsTest;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -229,7 +230,7 @@ void registerUnregister() {
assertNull(session.player());
}
- @Test
+ @RepeatedIfExceptionsTest
void save() throws Exception {
player.setPosition(
new Position(7894, 12)
diff --git a/src/test/java/fr/quatrevieux/araknemu/game/player/PlayerCharacteristicsTest.java b/src/test/java/fr/quatrevieux/araknemu/game/player/PlayerCharacteristicsTest.java
index 64bc95b22..b50c7c380 100644
--- a/src/test/java/fr/quatrevieux/araknemu/game/player/PlayerCharacteristicsTest.java
+++ b/src/test/java/fr/quatrevieux/araknemu/game/player/PlayerCharacteristicsTest.java
@@ -31,24 +31,25 @@
import fr.quatrevieux.araknemu.game.player.characteristic.MutableComputedCharacteristics;
import fr.quatrevieux.araknemu.game.player.characteristic.event.CharacteristicsChanged;
import fr.quatrevieux.araknemu.game.item.ItemService;
-import fr.quatrevieux.araknemu.game.player.characteristic.BaseCharacteristics;
+import fr.quatrevieux.araknemu.game.item.inventory.exception.InventoryException;
import fr.quatrevieux.araknemu.game.player.characteristic.PlayerCharacteristics;
import fr.quatrevieux.araknemu.game.player.characteristic.SpecialEffects;
import fr.quatrevieux.araknemu.game.player.inventory.slot.BeltSlot;
import fr.quatrevieux.araknemu.game.player.inventory.slot.BootsSlot;
import fr.quatrevieux.araknemu.game.world.creature.characteristics.DefaultCharacteristics;
import fr.quatrevieux.araknemu.game.world.creature.characteristics.MutableCharacteristics;
-import fr.quatrevieux.araknemu.game.item.inventory.exception.InventoryException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.sql.SQLException;
import java.util.Arrays;
-import java.util.Collections;
import java.util.NoSuchElementException;
import java.util.concurrent.atomic.AtomicReference;
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
class PlayerCharacteristicsTest extends GameBaseCase {
private PlayerCharacteristics characteristics;
@@ -189,7 +190,7 @@ void boostCharacteristicNotEnoughPoints() throws SQLException, ContainerExceptio
AtomicReference ref = new AtomicReference<>();
dispatcher.add(CharacteristicsChanged.class, ref::set);
- assertThrows(IllegalArgumentException.class, () -> characteristics.boostCharacteristic(Characteristic.STRENGTH));
+ assertThrows(IllegalStateException.class, () -> characteristics.boostCharacteristic(Characteristic.STRENGTH));
assertNull(ref.get());
assertEquals(50, characteristics.base().get(Characteristic.STRENGTH));