diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/data/PlayerSave.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/data/PlayerSave.kt index 72b97ee8ed..92fec8c681 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/data/PlayerSave.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/data/PlayerSave.kt @@ -389,7 +389,7 @@ data class PlayerSave( colours = colours, variables = variables, inventories = inventories, - friends = friends, + friends = friends.toMap(), ignores = ignores, offers = offers, history = history, @@ -410,8 +410,8 @@ internal fun Player.copy() = PlayerSave( colours = body.colours.copyOf(), variables = variables.data.toMap(), inventories = inventories.instances.mapValues { it.value.items.map { itm -> itm.copy() }.toTypedArray() }, - friends = friends, + friends = friends.toMap(), ignores = ignores.toList(), - offers = offers.copyOf(), + offers = Array(offers.size) { offers[it].copy() }, history = history.toList(), ) diff --git a/engine/src/test/kotlin/world/gregs/voidps/engine/data/PlayerSaveTest.kt b/engine/src/test/kotlin/world/gregs/voidps/engine/data/PlayerSaveTest.kt new file mode 100644 index 0000000000..e4f560a8a4 --- /dev/null +++ b/engine/src/test/kotlin/world/gregs/voidps/engine/data/PlayerSaveTest.kt @@ -0,0 +1,32 @@ +package world.gregs.voidps.engine.data + +import org.junit.jupiter.api.Test +import world.gregs.voidps.engine.data.exchange.ExchangeOffer +import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.character.player.chat.clan.ClanRank +import kotlin.test.assertEquals + +internal class PlayerSaveTest { + + @Test + fun `Snapshot doesn't share the player's friends`() { + val player = Player(accountName = "name") + player.friends["first"] = ClanRank.Friend + + val save = player.copy() + player.friends["second"] = ClanRank.Friend + + assertEquals(mapOf("first" to ClanRank.Friend), save.friends, "Snapshot changed after the player edited their friends list") + } + + @Test + fun `Snapshot doesn't share the player's exchange offers`() { + val player = Player(accountName = "name") + player.offers[0] = ExchangeOffer(id = 1, item = "coins", amount = 10, price = 5) + + val save = player.copy() + player.offers[0].completed = 7 + + assertEquals(0, save.offers[0].completed, "Snapshot changed after the player's offer progressed") + } +}