diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/mutators/PlayerKillMutator.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/mutators/PlayerKillMutator.java index df76a9d41..94b4d011e 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/mutators/PlayerKillMutator.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/mutators/PlayerKillMutator.java @@ -47,7 +47,7 @@ public class PlayerKillMutator { Map killMap = new HashMap<>(); killMap.put("date", formatters.secondLong().apply(kill.getDate())); killMap.put("victim", kill.getVictimName().orElse(kill.getVictim().toString())); - killMap.put("killer", kill.getKillerName().orElse("Missing UUID")); // TODO Kills should support killer UUID + killMap.put("killer", kill.getKillerName().orElse(kill.getKiller().toString())); killMap.put("weapon", kill.getWeapon()); return killMap; } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/gathering/domain/PlayerKill.java b/Plan/common/src/main/java/com/djrapitops/plan/gathering/domain/PlayerKill.java index 919dee670..cce0b4b34 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/gathering/domain/PlayerKill.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/gathering/domain/PlayerKill.java @@ -23,13 +23,13 @@ import java.util.Optional; import java.util.UUID; /** - * This class is used to store data about a player kill inside the UserInfo - * object. + * Represents a player vs player kill. * * @author Rsl1122 */ public class PlayerKill implements DateHolder { + private final UUID killer; private final UUID victim; private final String weapon; private final long date; @@ -40,31 +40,32 @@ public class PlayerKill implements DateHolder { /** * Creates a PlayerKill object with given parameters. * + * @param killer UUID of the killer. * @param victim UUID of the victim. * @param weapon Weapon used. * @param date Epoch millisecond at which the kill occurred. */ - public PlayerKill(UUID victim, String weapon, long date) { + public PlayerKill(UUID killer, UUID victim, String weapon, long date) { + this.killer = killer; this.victim = victim; this.weapon = weapon; this.date = date; } - public PlayerKill(UUID victim, String weapon, long date, String victimName) { - this(victim, weapon, date); + public PlayerKill(UUID killer, UUID victim, String weapon, long date, String victimName) { + this(killer, victim, weapon, date); this.victimName = victimName; } - public PlayerKill(UUID victim, String weapon, long date, String victimName, String killerName) { - this(victim, weapon, date, victimName); + public PlayerKill(UUID killer, UUID victim, String weapon, long date, String victimName, String killerName) { + this(killer, victim, weapon, date, victimName); this.killerName = killerName; } - /** - * Get the victim's UUID. - * - * @return UUID of the victim. - */ + public UUID getKiller() { + return killer; + } + public UUID getVictim() { return victim; } @@ -97,25 +98,27 @@ public class PlayerKill implements DateHolder { if (o == null || getClass() != o.getClass()) return false; PlayerKill that = (PlayerKill) o; return date == that.date && + Objects.equals(killer, that.killer) && Objects.equals(victim, that.victim) && Objects.equals(weapon, that.weapon); } @Override public int hashCode() { - return Objects.hash(victim, date, weapon); + return Objects.hash(killer, victim, date, weapon); } @Override public String toString() { return "PlayerKill{" + + "killer=" + killer + ", " + "victim=" + victim + ", " + "date=" + date + ", " + "weapon='" + weapon + "'}"; } public boolean isSelfKill() { - return getVictimName().map(v -> v.equals(killerName)).orElse(false); + return killer.equals(victim); } public boolean isNotSelfKill() { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/processing/processors/player/PlayerKillProcessor.java b/Plan/common/src/main/java/com/djrapitops/plan/processing/processors/player/PlayerKillProcessor.java index 2b832e963..5c9d83207 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/processing/processors/player/PlayerKillProcessor.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/processing/processors/player/PlayerKillProcessor.java @@ -62,6 +62,6 @@ public class PlayerKillProcessor implements CriticalRunnable { } Session session = cachedSession.get(); - session.playerKilled(new PlayerKill(victim, weaponName, time)); + session.playerKilled(new PlayerKill(killer, victim, weaponName, time)); } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/KillQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/KillQueries.java index d436f2608..19a364722 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/KillQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/KillQueries.java @@ -46,7 +46,9 @@ public class KillQueries { } public static Query> fetchPlayerKillsOnServer(UUID serverUUID, int limit) { - String sql = SELECT + KillsTable.VICTIM_UUID + ", " + + String sql = SELECT + + KillsTable.KILLER_UUID + ", " + + KillsTable.VICTIM_UUID + ", " + "v." + UsersTable.USER_NAME + " as victim_name, " + "k." + UsersTable.USER_NAME + " as killer_name," + KillsTable.DATE + ", " + @@ -76,7 +78,9 @@ public class KillQueries { } public static Query> fetchPlayerKillsOfPlayer(UUID playerUUID) { - String sql = SELECT + KillsTable.VICTIM_UUID + ", " + + String sql = SELECT + + KillsTable.KILLER_UUID + ", " + + KillsTable.VICTIM_UUID + ", " + "v." + UsersTable.USER_NAME + " as victim_name, " + "k." + UsersTable.USER_NAME + " as killer_name," + KillsTable.DATE + ", " + @@ -105,7 +109,9 @@ public class KillQueries { } public static Query> fetchPlayerDeathsOfPlayer(UUID playerUUID) { - String sql = SELECT + KillsTable.VICTIM_UUID + ", " + + String sql = SELECT + + KillsTable.KILLER_UUID + ", " + + KillsTable.VICTIM_UUID + ", " + "v." + UsersTable.USER_NAME + " as victim_name, " + "k." + UsersTable.USER_NAME + " as killer_name," + KillsTable.DATE + ", " + @@ -137,10 +143,11 @@ public class KillQueries { String victimName = set.getString("victim_name"); String killerName = set.getString("killer_name"); if (victimName != null && killerName != null) { + UUID killer = UUID.fromString(set.getString(KillsTable.KILLER_UUID)); UUID victim = UUID.fromString(set.getString(KillsTable.VICTIM_UUID)); long date = set.getLong(KillsTable.DATE); String weapon = set.getString(KillsTable.WEAPON); - return Optional.of(new PlayerKill(victim, weapon, date, victimName, killerName)); + return Optional.of(new PlayerKill(killer, victim, weapon, date, victimName, killerName)); } return Optional.empty(); } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/SessionQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/SessionQueries.java index 50bd18035..eea629544 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/SessionQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/SessionQueries.java @@ -67,6 +67,7 @@ public class SessionQueries { WorldTimesTable.ADVENTURE + ',' + WorldTimesTable.SPECTATOR + ',' + WorldTable.NAME + ',' + + KillsTable.KILLER_UUID + ',' + KillsTable.VICTIM_UUID + ',' + "v." + UsersTable.USER_NAME + " as victim_name, " + KillsTable.DATE + ',' + @@ -193,11 +194,12 @@ public class SessionQueries { String victimName = set.getString("victim_name"); if (victimName != null) { + UUID killer = UUID.fromString(set.getString(KillsTable.KILLER_UUID)); UUID victim = UUID.fromString(set.getString(KillsTable.VICTIM_UUID)); long date = set.getLong(KillsTable.DATE); String weapon = set.getString(KillsTable.WEAPON); List playerKills = session.getPlayerKills(); - PlayerKill newKill = new PlayerKill(victim, weapon, date, victimName); + PlayerKill newKill = new PlayerKill(killer, victim, weapon, date, victimName); if (!playerKills.contains(newKill)) { playerKills.add(newKill); } diff --git a/Plan/common/src/test/java/com/djrapitops/plan/gathering/domain/PlayerKillTest.java b/Plan/common/src/test/java/com/djrapitops/plan/gathering/domain/PlayerKillTest.java index 8cc98b29c..f7a9bb1da 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/gathering/domain/PlayerKillTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/gathering/domain/PlayerKillTest.java @@ -31,9 +31,9 @@ import static org.junit.jupiter.api.Assertions.assertFalse; */ class PlayerKillTest { - private String weapon = RandomData.randomString(10); - private UUID testUUID = UUID.randomUUID(); - private PlayerKill underTest = new PlayerKill(testUUID, weapon, 100L); + private final String weapon = RandomData.randomString(10); + private final UUID testUUID = UUID.randomUUID(); + private final PlayerKill underTest = new PlayerKill(testUUID, testUUID, weapon, 100L); @Test void victimUUIDIsReturned() { @@ -58,7 +58,7 @@ class PlayerKillTest { @Test void victimFound() { String expectedName = "Test Victim"; - PlayerKill underTest = new PlayerKill(testUUID, weapon, 100L, expectedName); + PlayerKill underTest = new PlayerKill(testUUID, testUUID, weapon, 100L, expectedName); assertEquals("Test Victim", underTest.getVictimName().orElse("Unknown")); } } diff --git a/Plan/common/src/test/java/com/djrapitops/plan/gathering/domain/SessionTest.java b/Plan/common/src/test/java/com/djrapitops/plan/gathering/domain/SessionTest.java index 2afb68f5a..59698341f 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/gathering/domain/SessionTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/gathering/domain/SessionTest.java @@ -68,7 +68,7 @@ class SessionTest { List before = beforeOptional.get(); assertTrue(before.isEmpty()); - session.playerKilled(new PlayerKill(TestConstants.PLAYER_TWO_UUID, "Weapon", System.currentTimeMillis())); + session.playerKilled(new PlayerKill(TestConstants.PLAYER_ONE_UUID, TestConstants.PLAYER_TWO_UUID, "Weapon", System.currentTimeMillis())); Optional> afterOptional = session.getValue(SessionKeys.PLAYER_KILLS); assertTrue(afterOptional.isPresent()); @@ -82,7 +82,7 @@ class SessionTest { void killsAreAdded2() { Session session = new Session(null, serverUUID, System.currentTimeMillis(), "", ""); - session.playerKilled(new PlayerKill(TestConstants.PLAYER_TWO_UUID, "Weapon", System.currentTimeMillis())); + session.playerKilled(new PlayerKill(TestConstants.PLAYER_ONE_UUID, TestConstants.PLAYER_TWO_UUID, "Weapon", System.currentTimeMillis())); Optional> afterOptional = session.getValue(SessionKeys.PLAYER_KILLS); assertTrue(afterOptional.isPresent()); diff --git a/Plan/common/src/test/java/com/djrapitops/plan/gathering/importing/data/ImportBuilderTest.java b/Plan/common/src/test/java/com/djrapitops/plan/gathering/importing/data/ImportBuilderTest.java index f9e546380..9e8ea7d1d 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/gathering/importing/data/ImportBuilderTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/gathering/importing/data/ImportBuilderTest.java @@ -38,8 +38,8 @@ import static org.junit.jupiter.api.Assertions.*; */ class ImportBuilderTest { - private int randomInt = RandomData.randomInt(0, 10); - private String randomString = RandomData.randomString(randomInt); + private final int randomInt = RandomData.randomInt(0, 10); + private final String randomString = RandomData.randomString(randomInt); @Test void emptyServerBuilderInitializesCollections() { @@ -100,7 +100,7 @@ class ImportBuilderTest { UserImportData.UserImportDataBuilder builder = UserImportData.builder(TestConstants.SERVER_UUID); UUID uuid = UUID.randomUUID(); - PlayerKill playerKill = new PlayerKill(uuid, randomString, 1); + PlayerKill playerKill = new PlayerKill(uuid, uuid, randomString, 1); GMTimes gmTimes = new GMTimes(randomString, randomInt); UserImportData data = builder.uuid(uuid) diff --git a/Plan/common/src/test/java/utilities/RandomData.java b/Plan/common/src/test/java/utilities/RandomData.java index 77bd2aa90..8469ca045 100644 --- a/Plan/common/src/test/java/utilities/RandomData.java +++ b/Plan/common/src/test/java/utilities/RandomData.java @@ -109,7 +109,7 @@ public class RandomData { session.endSession(RandomData.randomTimeAfter(session.getDate())); session.setWorldTimes(RandomData.randomWorldTimes(worlds)); if (uuids.length >= 2) { - session.setPlayerKills(RandomData.randomKills(pickAtRandom(Arrays.copyOfRange(uuids, 1, uuids.length)))); + session.setPlayerKills(RandomData.randomKills(uuids[0], pickAtRandom(Arrays.copyOfRange(uuids, 1, uuids.length)))); } return session; } @@ -122,7 +122,7 @@ public class RandomData { Session session = new Session(uuids[0], serverUUID, RandomData.randomTime(), pickAtRandom(worlds), randomGameMode()); session.setWorldTimes(RandomData.randomWorldTimes(worlds)); if (uuids.length >= 2) { - session.setPlayerKills(RandomData.randomKills(pickAtRandom(Arrays.copyOfRange(uuids, 1, uuids.length)))); + session.setPlayerKills(RandomData.randomKills(uuids[0], pickAtRandom(Arrays.copyOfRange(uuids, 1, uuids.length)))); } return session; } @@ -151,11 +151,11 @@ public class RandomData { return new WorldTimes(times); } - public static List randomKills(UUID... victimUUIDs) { + public static List randomKills(UUID killer, UUID... victimUUIDs) { if (victimUUIDs == null || victimUUIDs.length == 1 && victimUUIDs[0] == null) return Collections.emptyList(); return pickMultiple(randomInt(3, 15), () -> new PlayerKill( - pickAtRandom(victimUUIDs), + killer, pickAtRandom(victimUUIDs), randomString(randomInt(10, KillsTable.WEAPON_COLUMN_LENGTH)), randomTime() )); diff --git a/Plan/common/src/test/java/utilities/TestData.java b/Plan/common/src/test/java/utilities/TestData.java index 354ebf3dd..ffb244576 100644 --- a/Plan/common/src/test/java/utilities/TestData.java +++ b/Plan/common/src/test/java/utilities/TestData.java @@ -78,8 +78,8 @@ public class TestData { Session sessionOne = new Session(uuid, serverUUID, playerFirstJoin, serverWorldNames[0], gms[0]); UUID otherUUID = uuid.equals(playerUUID) ? player2UUID : playerUUID; - sessionOne.playerKilled(new PlayerKill(otherUUID, "Iron Sword", 1234750L)); - sessionOne.playerKilled(new PlayerKill(otherUUID, "Gold Sword", 1234800L)); + sessionOne.playerKilled(new PlayerKill(uuid, otherUUID, "Iron Sword", 1234750L)); + sessionOne.playerKilled(new PlayerKill(uuid, otherUUID, "Gold Sword", 1234800L)); sessionOne.endSession(1235000L); // Length 500ms sessions.add(sessionOne);