Remove player entries on leave/death prior to session start.
While we do want to keep track of join and ready times, we really don't care about those stats for players who join the lobby _and leave_ prior to the arena actually starting. Coincidentally, _not_ storing stats for players that don't actually pick a class means we don't end up trying to insert a `null` value into the class name column, which should solve the error thrown when trying to do just that as a result of the auto-start timer kicking players or players themselves leaving prior to starting. Fixes #16
This commit is contained in:
@@ -47,6 +47,11 @@ public class Session {
|
|||||||
|
|
||||||
public void playerLeave(Arena arena, Player player) {
|
public void playerLeave(Arena arena, Player player) {
|
||||||
UUID playerId = player.getUniqueId();
|
UUID playerId = player.getUniqueId();
|
||||||
|
if (sessionStats.startTime == null) {
|
||||||
|
playerStats.remove(playerId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
PlayerSessionStats stats = playerStats.get(playerId);
|
PlayerSessionStats stats = playerStats.get(playerId);
|
||||||
if (stats == null) {
|
if (stats == null) {
|
||||||
return;
|
return;
|
||||||
@@ -63,6 +68,11 @@ public class Session {
|
|||||||
|
|
||||||
public void playerDeath(Arena arena, Player player) {
|
public void playerDeath(Arena arena, Player player) {
|
||||||
UUID playerId = player.getUniqueId();
|
UUID playerId = player.getUniqueId();
|
||||||
|
if (sessionStats.startTime == null) {
|
||||||
|
playerStats.remove(playerId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
PlayerSessionStats stats = playerStats.get(playerId);
|
PlayerSessionStats stats = playerStats.get(playerId);
|
||||||
if (stats == null) {
|
if (stats == null) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -95,6 +95,19 @@ class SessionTest {
|
|||||||
assertThat(actual.className, equalTo(className));
|
assertThat(actual.className, equalTo(className));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void removeFromSessionOnLeaveBeforeStart() {
|
||||||
|
UUID playerId = UUID.fromString("cafebabe-ea75-dead-beef-deadcafebabe");
|
||||||
|
Player player = Mocks.player(playerId, "garbagemule");
|
||||||
|
Arena arena = mock(Arena.class);
|
||||||
|
subject.playerJoin(player);
|
||||||
|
|
||||||
|
subject.playerLeave(arena, player);
|
||||||
|
|
||||||
|
PlayerSessionStats actual = subject.getPlayerStats(playerId);
|
||||||
|
assertThat(actual, nullValue());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void setLeaveTimeOnLeave() {
|
void setLeaveTimeOnLeave() {
|
||||||
UUID playerId = UUID.fromString("cafebabe-ea75-dead-beef-deadcafebabe");
|
UUID playerId = UUID.fromString("cafebabe-ea75-dead-beef-deadcafebabe");
|
||||||
@@ -103,6 +116,7 @@ class SessionTest {
|
|||||||
ArenaPlayer ap = mock(ArenaPlayer.class);
|
ArenaPlayer ap = mock(ArenaPlayer.class);
|
||||||
when(arena.getArenaPlayer(player)).thenReturn(ap);
|
when(arena.getArenaPlayer(player)).thenReturn(ap);
|
||||||
subject.playerJoin(player);
|
subject.playerJoin(player);
|
||||||
|
subject.start();
|
||||||
|
|
||||||
subject.playerLeave(arena, player);
|
subject.playerLeave(arena, player);
|
||||||
|
|
||||||
@@ -118,6 +132,7 @@ class SessionTest {
|
|||||||
ArenaPlayer ap = mock(ArenaPlayer.class);
|
ArenaPlayer ap = mock(ArenaPlayer.class);
|
||||||
when(arena.getArenaPlayer(player)).thenReturn(ap);
|
when(arena.getArenaPlayer(player)).thenReturn(ap);
|
||||||
subject.playerJoin(player);
|
subject.playerJoin(player);
|
||||||
|
subject.start();
|
||||||
|
|
||||||
subject.playerLeave(arena, player);
|
subject.playerLeave(arena, player);
|
||||||
|
|
||||||
@@ -133,6 +148,7 @@ class SessionTest {
|
|||||||
ArenaPlayer ap = mock(ArenaPlayer.class);
|
ArenaPlayer ap = mock(ArenaPlayer.class);
|
||||||
when(arena.getArenaPlayer(player)).thenReturn(ap);
|
when(arena.getArenaPlayer(player)).thenReturn(ap);
|
||||||
subject.playerJoin(player);
|
subject.playerJoin(player);
|
||||||
|
subject.start();
|
||||||
subject.getPlayerStats(playerId).conclusion = PlayerConclusion.VICTORY;
|
subject.getPlayerStats(playerId).conclusion = PlayerConclusion.VICTORY;
|
||||||
|
|
||||||
subject.playerLeave(arena, player);
|
subject.playerLeave(arena, player);
|
||||||
@@ -141,6 +157,19 @@ class SessionTest {
|
|||||||
assertThat(actual.conclusion, not(equalTo(PlayerConclusion.RETREAT)));
|
assertThat(actual.conclusion, not(equalTo(PlayerConclusion.RETREAT)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void removeFromSessionOnDeathBeforeStart() {
|
||||||
|
UUID playerId = UUID.fromString("cafebabe-ea75-dead-beef-deadcafebabe");
|
||||||
|
Player player = Mocks.player(playerId, "garbagemule");
|
||||||
|
Arena arena = mock(Arena.class);
|
||||||
|
subject.playerJoin(player);
|
||||||
|
|
||||||
|
subject.playerDeath(arena, player);
|
||||||
|
|
||||||
|
PlayerSessionStats actual = subject.getPlayerStats(playerId);
|
||||||
|
assertThat(actual, nullValue());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void setDeathTimeOnDeath() {
|
void setDeathTimeOnDeath() {
|
||||||
UUID playerId = UUID.fromString("cafebabe-ea75-dead-beef-deadcafebabe");
|
UUID playerId = UUID.fromString("cafebabe-ea75-dead-beef-deadcafebabe");
|
||||||
@@ -149,6 +178,7 @@ class SessionTest {
|
|||||||
ArenaPlayer ap = mock(ArenaPlayer.class);
|
ArenaPlayer ap = mock(ArenaPlayer.class);
|
||||||
when(arena.getArenaPlayer(player)).thenReturn(ap);
|
when(arena.getArenaPlayer(player)).thenReturn(ap);
|
||||||
subject.playerJoin(player);
|
subject.playerJoin(player);
|
||||||
|
subject.start();
|
||||||
|
|
||||||
subject.playerDeath(arena, player);
|
subject.playerDeath(arena, player);
|
||||||
|
|
||||||
@@ -164,6 +194,7 @@ class SessionTest {
|
|||||||
ArenaPlayer ap = mock(ArenaPlayer.class);
|
ArenaPlayer ap = mock(ArenaPlayer.class);
|
||||||
when(arena.getArenaPlayer(player)).thenReturn(ap);
|
when(arena.getArenaPlayer(player)).thenReturn(ap);
|
||||||
subject.playerJoin(player);
|
subject.playerJoin(player);
|
||||||
|
subject.start();
|
||||||
|
|
||||||
subject.playerDeath(arena, player);
|
subject.playerDeath(arena, player);
|
||||||
|
|
||||||
@@ -179,6 +210,7 @@ class SessionTest {
|
|||||||
ArenaPlayer ap = mock(ArenaPlayer.class);
|
ArenaPlayer ap = mock(ArenaPlayer.class);
|
||||||
when(arena.getArenaPlayer(player)).thenReturn(ap);
|
when(arena.getArenaPlayer(player)).thenReturn(ap);
|
||||||
subject.playerJoin(player);
|
subject.playerJoin(player);
|
||||||
|
subject.start();
|
||||||
subject.getPlayerStats(playerId).conclusion = PlayerConclusion.VICTORY;
|
subject.getPlayerStats(playerId).conclusion = PlayerConclusion.VICTORY;
|
||||||
|
|
||||||
subject.playerDeath(arena, player);
|
subject.playerDeath(arena, player);
|
||||||
@@ -246,6 +278,7 @@ class SessionTest {
|
|||||||
when(arena.getArenaPlayer(corpse)).thenReturn(ap);
|
when(arena.getArenaPlayer(corpse)).thenReturn(ap);
|
||||||
subject.playerJoin(corpse);
|
subject.playerJoin(corpse);
|
||||||
subject.playerJoin(survivor);
|
subject.playerJoin(survivor);
|
||||||
|
subject.start();
|
||||||
subject.playerDeath(arena, corpse);
|
subject.playerDeath(arena, corpse);
|
||||||
|
|
||||||
subject.complete();
|
subject.complete();
|
||||||
|
|||||||
Reference in New Issue
Block a user