Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarNetPackets.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/game/StarNetPackets.cpp')
-rw-r--r--source/game/StarNetPackets.cpp1264
1 files changed, 1264 insertions, 0 deletions
diff --git a/source/game/StarNetPackets.cpp b/source/game/StarNetPackets.cpp
new file mode 100644
index 0000000..11944f5
--- /dev/null
+++ b/source/game/StarNetPackets.cpp
@@ -0,0 +1,1264 @@
+#include "StarNetPackets.hpp"
+#include "StarDataStreamExtra.hpp"
+
+namespace Star {
+
+VersionNumber const StarProtocolVersion = 747;
+
+EnumMap<PacketType> const PacketTypeNames{
+ {PacketType::ProtocolRequest, "ProtocolRequest"},
+ {PacketType::ProtocolResponse, "ProtocolResponse"},
+ {PacketType::ServerDisconnect, "ServerDisconnect"},
+ {PacketType::ConnectSuccess, "ConnectSuccess"},
+ {PacketType::ConnectFailure, "ConnectFailure"},
+ {PacketType::HandshakeChallenge, "HandshakeChallenge"},
+ {PacketType::ChatReceive, "ChatReceive"},
+ {PacketType::UniverseTimeUpdate, "UniverseTimeUpdate"},
+ {PacketType::CelestialResponse, "CelestialResponse"},
+ {PacketType::PlayerWarpResult, "PlayerWarpResult"},
+ {PacketType::PlanetTypeUpdate, "PlanetTypeUpdate"},
+ {PacketType::Pause, "Pause"},
+ {PacketType::ServerInfo, "ServerInfo"},
+ {PacketType::ClientConnect, "ClientConnect"},
+ {PacketType::ClientDisconnectRequest, "ClientDisconnectRequest"},
+ {PacketType::HandshakeResponse, "HandshakeResponse"},
+ {PacketType::PlayerWarp, "PlayerWarp"},
+ {PacketType::FlyShip, "FlyShip"},
+ {PacketType::ChatSend, "ChatSend"},
+ {PacketType::CelestialRequest, "CelestialRequest"},
+ {PacketType::ClientContextUpdate, "ClientContextUpdate"},
+ {PacketType::WorldStart, "WorldStart"},
+ {PacketType::WorldStop, "WorldStop"},
+ {PacketType::WorldLayoutUpdate, "WorldLayoutUpdate"},
+ {PacketType::WorldParametersUpdate, "WorldParametersUpdate"},
+ {PacketType::CentralStructureUpdate, "CentralStructureUpdate"},
+ {PacketType::TileArrayUpdate, "TileArrayUpdate"},
+ {PacketType::TileUpdate, "TileUpdate"},
+ {PacketType::TileLiquidUpdate, "TileLiquidUpdate"},
+ {PacketType::TileDamageUpdate, "TileDamageUpdate"},
+ {PacketType::TileModificationFailure, "TileModificationFailure"},
+ {PacketType::GiveItem, "GiveItem"},
+ {PacketType::EnvironmentUpdate, "EnvironmentUpdate"},
+ {PacketType::UpdateTileProtection, "UpdateTileProtection"},
+ {PacketType::SetDungeonGravity, "SetDungeonGravity"},
+ {PacketType::SetDungeonBreathable, "SetDungeonBreathable"},
+ {PacketType::SetPlayerStart, "SetPlayerStart"},
+ {PacketType::FindUniqueEntityResponse, "FindUniqueEntityResponse"},
+ {PacketType::Pong, "Pong"},
+ {PacketType::ModifyTileList, "ModifyTileList"},
+ {PacketType::DamageTileGroup, "DamageTileGroup"},
+ {PacketType::CollectLiquid, "CollectLiquid"},
+ {PacketType::RequestDrop, "RequestDrop"},
+ {PacketType::SpawnEntity, "SpawnEntity"},
+ {PacketType::ConnectWire, "ConnectWire"},
+ {PacketType::DisconnectAllWires, "DisconnectAllWires"},
+ {PacketType::WorldClientStateUpdate, "WorldClientStateUpdate"},
+ {PacketType::FindUniqueEntity, "FindUniqueEntity"},
+ {PacketType::WorldStartAcknowledge, "WorldStartAcknowledge"},
+ {PacketType::Ping, "Ping"},
+ {PacketType::EntityCreate, "EntityCreate"},
+ {PacketType::EntityUpdateSet, "EntityUpdate"},
+ {PacketType::EntityDestroy, "EntityDestroy"},
+ {PacketType::EntityInteract, "EntityInteract"},
+ {PacketType::EntityInteractResult, "EntityInteractResult"},
+ {PacketType::HitRequest, "HitRequest"},
+ {PacketType::DamageRequest, "DamageRequest"},
+ {PacketType::DamageNotification, "DamageNotification"},
+ {PacketType::EntityMessage, "EntityMessage"},
+ {PacketType::EntityMessageResponse, "EntityMessageResponse"},
+ {PacketType::UpdateWorldProperties, "UpdateWorldProperties"},
+ {PacketType::StepUpdate, "StepUpdate"},
+ {PacketType::SystemWorldStart, "SystemWorldStart"},
+ {PacketType::SystemWorldUpdate, "SystemWorldUpdate"},
+ {PacketType::SystemObjectCreate, "SystemObjectCreate"},
+ {PacketType::SystemObjectDestroy, "SystemObjectDestroy"},
+ {PacketType::SystemShipCreate, "SystemShipCreate"},
+ {PacketType::SystemShipDestroy, "SystemShipDestroy"},
+ {PacketType::SystemObjectSpawn, "SystemObjectSpawn"}
+};
+
+Packet::~Packet() {}
+
+PacketPtr createPacket(PacketType type) {
+ if (type == PacketType::ProtocolRequest)
+ return make_shared<ProtocolRequestPacket>();
+ else if (type == PacketType::ProtocolResponse)
+ return make_shared<ProtocolResponsePacket>();
+ else if (type == PacketType::ServerDisconnect)
+ return make_shared<ServerDisconnectPacket>();
+ else if (type == PacketType::ConnectSuccess)
+ return make_shared<ConnectSuccessPacket>();
+ else if (type == PacketType::ConnectFailure)
+ return make_shared<ConnectFailurePacket>();
+ else if (type == PacketType::HandshakeChallenge)
+ return make_shared<HandshakeChallengePacket>();
+ else if (type == PacketType::ChatReceive)
+ return make_shared<ChatReceivePacket>();
+ else if (type == PacketType::UniverseTimeUpdate)
+ return make_shared<UniverseTimeUpdatePacket>();
+ else if (type == PacketType::CelestialResponse)
+ return make_shared<CelestialResponsePacket>();
+ else if (type == PacketType::PlayerWarpResult)
+ return make_shared<PlayerWarpResultPacket>();
+ else if (type == PacketType::PlanetTypeUpdate)
+ return make_shared<PlanetTypeUpdatePacket>();
+ else if (type == PacketType::Pause)
+ return make_shared<PausePacket>();
+ else if (type == PacketType::ServerInfo)
+ return make_shared<ServerInfoPacket>();
+ else if (type == PacketType::ClientConnect)
+ return make_shared<ClientConnectPacket>();
+ else if (type == PacketType::ClientDisconnectRequest)
+ return make_shared<ClientDisconnectRequestPacket>();
+ else if (type == PacketType::HandshakeResponse)
+ return make_shared<HandshakeResponsePacket>();
+ else if (type == PacketType::PlayerWarp)
+ return make_shared<PlayerWarpPacket>();
+ else if (type == PacketType::FlyShip)
+ return make_shared<FlyShipPacket>();
+ else if (type == PacketType::ChatSend)
+ return make_shared<ChatSendPacket>();
+ else if (type == PacketType::CelestialRequest)
+ return make_shared<CelestialRequestPacket>();
+ else if (type == PacketType::ClientContextUpdate)
+ return make_shared<ClientContextUpdatePacket>();
+ else if (type == PacketType::WorldStart)
+ return make_shared<WorldStartPacket>();
+ else if (type == PacketType::WorldStop)
+ return make_shared<WorldStopPacket>();
+ else if (type == PacketType::WorldLayoutUpdate)
+ return make_shared<WorldLayoutUpdatePacket>();
+ else if (type == PacketType::WorldParametersUpdate)
+ return make_shared<WorldParametersUpdatePacket>();
+ else if (type == PacketType::CentralStructureUpdate)
+ return make_shared<CentralStructureUpdatePacket>();
+ else if (type == PacketType::TileArrayUpdate)
+ return make_shared<TileArrayUpdatePacket>();
+ else if (type == PacketType::TileUpdate)
+ return make_shared<TileUpdatePacket>();
+ else if (type == PacketType::TileLiquidUpdate)
+ return make_shared<TileLiquidUpdatePacket>();
+ else if (type == PacketType::TileDamageUpdate)
+ return make_shared<TileDamageUpdatePacket>();
+ else if (type == PacketType::TileModificationFailure)
+ return make_shared<TileModificationFailurePacket>();
+ else if (type == PacketType::GiveItem)
+ return make_shared<GiveItemPacket>();
+ else if (type == PacketType::EnvironmentUpdate)
+ return make_shared<EnvironmentUpdatePacket>();
+ else if (type == PacketType::ModifyTileList)
+ return make_shared<ModifyTileListPacket>();
+ else if (type == PacketType::DamageTileGroup)
+ return make_shared<DamageTileGroupPacket>();
+ else if (type == PacketType::CollectLiquid)
+ return make_shared<CollectLiquidPacket>();
+ else if (type == PacketType::RequestDrop)
+ return make_shared<RequestDropPacket>();
+ else if (type == PacketType::SpawnEntity)
+ return make_shared<SpawnEntityPacket>();
+ else if (type == PacketType::EntityInteract)
+ return make_shared<EntityInteractPacket>();
+ else if (type == PacketType::EntityInteractResult)
+ return make_shared<EntityInteractResultPacket>();
+ else if (type == PacketType::UpdateTileProtection)
+ return make_shared<UpdateTileProtectionPacket>();
+ else if (type == PacketType::SetDungeonGravity)
+ return make_shared<SetDungeonGravityPacket>();
+ else if (type == PacketType::SetDungeonBreathable)
+ return make_shared<SetDungeonBreathablePacket>();
+ else if (type == PacketType::SetPlayerStart)
+ return make_shared<SetPlayerStartPacket>();
+ else if (type == PacketType::FindUniqueEntityResponse)
+ return make_shared<FindUniqueEntityResponsePacket>();
+ else if (type == PacketType::Pong)
+ return make_shared<PongPacket>();
+ else if (type == PacketType::ConnectWire)
+ return make_shared<ConnectWirePacket>();
+ else if (type == PacketType::DisconnectAllWires)
+ return make_shared<DisconnectAllWiresPacket>();
+ else if (type == PacketType::WorldClientStateUpdate)
+ return make_shared<WorldClientStateUpdatePacket>();
+ else if (type == PacketType::FindUniqueEntity)
+ return make_shared<FindUniqueEntityPacket>();
+ else if (type == PacketType::WorldStartAcknowledge)
+ return make_shared<WorldStartAcknowledgePacket>();
+ else if (type == PacketType::Ping)
+ return make_shared<PingPacket>();
+ else if (type == PacketType::EntityCreate)
+ return make_shared<EntityCreatePacket>();
+ else if (type == PacketType::EntityUpdateSet)
+ return make_shared<EntityUpdateSetPacket>();
+ else if (type == PacketType::EntityDestroy)
+ return make_shared<EntityDestroyPacket>();
+ else if (type == PacketType::HitRequest)
+ return make_shared<HitRequestPacket>();
+ else if (type == PacketType::DamageRequest)
+ return make_shared<DamageRequestPacket>();
+ else if (type == PacketType::DamageNotification)
+ return make_shared<DamageNotificationPacket>();
+ else if (type == PacketType::EntityMessage)
+ return make_shared<EntityMessagePacket>();
+ else if (type == PacketType::EntityMessageResponse)
+ return make_shared<EntityMessageResponsePacket>();
+ else if (type == PacketType::UpdateWorldProperties)
+ return make_shared<UpdateWorldPropertiesPacket>();
+ else if (type == PacketType::StepUpdate)
+ return make_shared<StepUpdatePacket>();
+ else if (type == PacketType::SystemWorldStart)
+ return make_shared<SystemWorldStartPacket>();
+ else if (type == PacketType::SystemWorldUpdate)
+ return make_shared<SystemWorldUpdatePacket>();
+ else if (type == PacketType::SystemObjectCreate)
+ return make_shared<SystemObjectCreatePacket>();
+ else if (type == PacketType::SystemObjectDestroy)
+ return make_shared<SystemObjectDestroyPacket>();
+ else if (type == PacketType::SystemShipCreate)
+ return make_shared<SystemShipCreatePacket>();
+ else if (type == PacketType::SystemShipDestroy)
+ return make_shared<SystemShipDestroyPacket>();
+ else if (type == PacketType::SystemObjectSpawn)
+ return make_shared<SystemObjectSpawnPacket>();
+ else
+ throw StarPacketException(strf("Unrecognized packet type %s", (unsigned)type));
+}
+
+ProtocolRequestPacket::ProtocolRequestPacket()
+ : requestProtocolVersion(0) {}
+
+ProtocolRequestPacket::ProtocolRequestPacket(VersionNumber requestProtocolVersion)
+ : requestProtocolVersion(requestProtocolVersion) {}
+
+void ProtocolRequestPacket::read(DataStream& ds) {
+ ds.read(requestProtocolVersion);
+}
+
+void ProtocolRequestPacket::write(DataStream& ds) const {
+ ds.write(requestProtocolVersion);
+}
+
+ProtocolResponsePacket::ProtocolResponsePacket(bool allowed)
+ : allowed(allowed) {}
+
+void ProtocolResponsePacket::read(DataStream& ds) {
+ ds.read(allowed);
+}
+
+void ProtocolResponsePacket::write(DataStream& ds) const {
+ ds.write(allowed);
+}
+
+ConnectSuccessPacket::ConnectSuccessPacket() {}
+
+ConnectSuccessPacket::ConnectSuccessPacket(
+ ConnectionId clientId, Uuid serverUuid, CelestialBaseInformation celestialInformation)
+ : clientId(clientId), serverUuid(move(serverUuid)), celestialInformation(move(celestialInformation)) {}
+
+void ConnectSuccessPacket::read(DataStream& ds) {
+ ds.vuread(clientId);
+ ds.read(serverUuid);
+ ds.read(celestialInformation);
+}
+
+void ConnectSuccessPacket::write(DataStream& ds) const {
+ ds.vuwrite(clientId);
+ ds.write(serverUuid);
+ ds.write(celestialInformation);
+}
+
+ConnectFailurePacket::ConnectFailurePacket() {}
+
+ConnectFailurePacket::ConnectFailurePacket(String reason) : reason(move(reason)) {}
+
+void ConnectFailurePacket::read(DataStream& ds) {
+ ds.read(reason);
+}
+
+void ConnectFailurePacket::write(DataStream& ds) const {
+ ds.write(reason);
+}
+
+HandshakeChallengePacket::HandshakeChallengePacket() {}
+
+HandshakeChallengePacket::HandshakeChallengePacket(ByteArray const& passwordSalt) : passwordSalt(passwordSalt) {}
+
+void HandshakeChallengePacket::read(DataStream& ds) {
+ ds.read(passwordSalt);
+}
+
+void HandshakeChallengePacket::write(DataStream& ds) const {
+ ds.write(passwordSalt);
+}
+
+ChatReceivePacket::ChatReceivePacket() {}
+
+ChatReceivePacket::ChatReceivePacket(ChatReceivedMessage receivedMessage) : receivedMessage(receivedMessage) {}
+
+void ChatReceivePacket::read(DataStream& ds) {
+ ds.read(receivedMessage);
+}
+
+void ChatReceivePacket::write(DataStream& ds) const {
+ ds.write(receivedMessage);
+}
+
+UniverseTimeUpdatePacket::UniverseTimeUpdatePacket() {
+ universeTime = 0;
+}
+
+UniverseTimeUpdatePacket::UniverseTimeUpdatePacket(double universeTime) : universeTime(universeTime) {}
+
+void UniverseTimeUpdatePacket::read(DataStream& ds) {
+ ds.vfread(universeTime, 0.05);
+}
+
+void UniverseTimeUpdatePacket::write(DataStream& ds) const {
+ ds.vfwrite(universeTime, 0.05);
+}
+
+CelestialResponsePacket::CelestialResponsePacket() {}
+
+CelestialResponsePacket::CelestialResponsePacket(List<CelestialResponse> responses) : responses(move(responses)) {}
+
+void CelestialResponsePacket::read(DataStream& ds) {
+ ds.read(responses);
+}
+
+void CelestialResponsePacket::write(DataStream& ds) const {
+ ds.write(responses);
+}
+
+PlayerWarpResultPacket::PlayerWarpResultPacket() : warpActionInvalid(false) {}
+
+PlayerWarpResultPacket::PlayerWarpResultPacket(bool success, WarpAction warpAction, bool warpActionInvalid)
+ : success(success), warpAction(move(warpAction)), warpActionInvalid(warpActionInvalid) {}
+
+void PlayerWarpResultPacket::read(DataStream& ds) {
+ ds.read(success);
+ ds.read(warpAction);
+ ds.read(warpActionInvalid);
+}
+
+void PlayerWarpResultPacket::write(DataStream& ds) const {
+ ds.write(success);
+ ds.write(warpAction);
+ ds.write(warpActionInvalid);
+}
+
+PlanetTypeUpdatePacket::PlanetTypeUpdatePacket() {}
+
+PlanetTypeUpdatePacket::PlanetTypeUpdatePacket(CelestialCoordinate coordinate)
+ : coordinate(coordinate) {}
+
+void PlanetTypeUpdatePacket::read(DataStream& ds) {
+ ds.read(coordinate);
+}
+
+void PlanetTypeUpdatePacket::write(DataStream& ds) const {
+ ds.write(coordinate);
+}
+
+PausePacket::PausePacket() {}
+
+PausePacket::PausePacket(bool pause) : pause(move(pause)) {}
+
+void PausePacket::read(DataStream& ds) {
+ ds.read(pause);
+}
+
+void PausePacket::write(DataStream& ds) const {
+ ds.write(pause);
+}
+
+ServerInfoPacket::ServerInfoPacket() {}
+
+ServerInfoPacket::ServerInfoPacket(uint16_t players, uint16_t maxPlayers) :
+ players(players),
+ maxPlayers(maxPlayers) {}
+
+void ServerInfoPacket::read(DataStream& ds)
+{
+ ds.read(players);
+ ds.read(maxPlayers);
+}
+
+void ServerInfoPacket::write(DataStream& ds) const
+{
+ ds.write(players);
+ ds.write(maxPlayers);
+}
+
+ClientConnectPacket::ClientConnectPacket() {}
+
+ClientConnectPacket::ClientConnectPacket(ByteArray assetsDigest, bool allowAssetsMismatch, Uuid playerUuid,
+ String playerName, String playerSpecies, WorldChunks shipChunks, ShipUpgrades shipUpgrades,
+ bool introComplete, String account)
+ : assetsDigest(move(assetsDigest)), allowAssetsMismatch(allowAssetsMismatch), playerUuid(move(playerUuid)),
+ playerName(move(playerName)), playerSpecies(move(playerSpecies)), shipChunks(move(shipChunks)),
+ shipUpgrades(move(shipUpgrades)), introComplete(move(introComplete)), account(move(account)) {}
+
+void ClientConnectPacket::read(DataStream& ds) {
+ ds.read(assetsDigest);
+ ds.read(allowAssetsMismatch);
+ ds.read(playerUuid);
+ ds.read(playerName);
+ ds.read(playerSpecies);
+ ds.read(shipChunks);
+ ds.read(shipUpgrades);
+ ds.read(introComplete);
+ ds.read(account);
+}
+
+void ClientConnectPacket::write(DataStream& ds) const {
+ ds.write(assetsDigest);
+ ds.write(allowAssetsMismatch);
+ ds.write(playerUuid);
+ ds.write(playerName);
+ ds.write(playerSpecies);
+ ds.write(shipChunks);
+ ds.write(shipUpgrades);
+ ds.write(introComplete);
+ ds.write(account);
+}
+
+ClientDisconnectRequestPacket::ClientDisconnectRequestPacket() {}
+
+void ClientDisconnectRequestPacket::read(DataStream& ds) {
+ // Packets cannot be empty due to the way packet serialization is handled.
+ ds.read<uint8_t>();
+}
+
+void ClientDisconnectRequestPacket::write(DataStream& ds) const {
+ // Packets cannot be empty due to the way packet serialization is handled.
+ ds.write<uint8_t>(0);
+}
+
+HandshakeResponsePacket::HandshakeResponsePacket() {}
+
+HandshakeResponsePacket::HandshakeResponsePacket(ByteArray const& passHash) : passHash(passHash) {}
+
+void HandshakeResponsePacket::read(DataStream& ds) {
+ ds.read(passHash);
+}
+
+void HandshakeResponsePacket::write(DataStream& ds) const {
+ ds.write(passHash);
+}
+
+PlayerWarpPacket::PlayerWarpPacket() {}
+
+PlayerWarpPacket::PlayerWarpPacket(WarpAction action, bool deploy) : action(move(action)), deploy(move(deploy)) {}
+
+void PlayerWarpPacket::read(DataStream& ds) {
+ ds.read(action);
+ ds.read(deploy);
+}
+
+void PlayerWarpPacket::write(DataStream& ds) const {
+ ds.write(action);
+ ds.write(deploy);
+}
+
+FlyShipPacket::FlyShipPacket() {}
+
+FlyShipPacket::FlyShipPacket(Vec3I system, SystemLocation location) : system(move(system)), location(move(location)) {}
+
+void FlyShipPacket::read(DataStream& ds) {
+ ds.read(system);
+ ds.read(location);
+}
+
+void FlyShipPacket::write(DataStream& ds) const {
+ ds.write(system);
+ ds.write(location);
+}
+
+ChatSendPacket::ChatSendPacket() : sendMode(ChatSendMode::Broadcast) {}
+
+ChatSendPacket::ChatSendPacket(String text, ChatSendMode sendMode) : text(move(text)), sendMode(sendMode) {}
+
+void ChatSendPacket::read(DataStream& ds) {
+ ds.read(text);
+ ds.read(sendMode);
+}
+
+void ChatSendPacket::write(DataStream& ds) const {
+ ds.write(text);
+ ds.write(sendMode);
+}
+
+CelestialRequestPacket::CelestialRequestPacket() {}
+
+CelestialRequestPacket::CelestialRequestPacket(List<CelestialRequest> requests) : requests(move(requests)) {}
+
+void CelestialRequestPacket::read(DataStream& ds) {
+ ds.read(requests);
+}
+
+void CelestialRequestPacket::write(DataStream& ds) const {
+ ds.write(requests);
+}
+
+ClientContextUpdatePacket::ClientContextUpdatePacket() {}
+
+ClientContextUpdatePacket::ClientContextUpdatePacket(ByteArray updateData) : updateData(move(updateData)) {}
+
+void ClientContextUpdatePacket::read(DataStream& ds) {
+ ds.read(updateData);
+}
+
+void ClientContextUpdatePacket::write(DataStream& ds) const {
+ ds.write(updateData);
+}
+
+WorldStartPacket::WorldStartPacket() : clientId(), localInterpolationMode() {}
+
+void WorldStartPacket::read(DataStream& ds) {
+ ds.read(templateData);
+ ds.read(skyData);
+ ds.read(weatherData);
+ ds.read(playerStart);
+ ds.read(playerRespawn);
+ ds.read(respawnInWorld);
+ ds.read(worldProperties);
+ ds.read(dungeonIdGravity);
+ ds.read(dungeonIdBreathable);
+ ds.read(protectedDungeonIds);
+ ds.read(clientId);
+ ds.read(localInterpolationMode);
+}
+
+void WorldStartPacket::write(DataStream& ds) const {
+ ds.write(templateData);
+ ds.write(skyData);
+ ds.write(weatherData);
+ ds.write(playerStart);
+ ds.write(playerRespawn);
+ ds.write(respawnInWorld);
+ ds.write(worldProperties);
+ ds.write(dungeonIdGravity);
+ ds.write(dungeonIdBreathable);
+ ds.write(protectedDungeonIds);
+ ds.write(clientId);
+ ds.write(localInterpolationMode);
+}
+
+WorldStopPacket::WorldStopPacket() {}
+
+WorldStopPacket::WorldStopPacket(String const& reason) : reason(reason) {}
+
+void WorldStopPacket::read(DataStream& ds) {
+ ds.read(reason);
+}
+
+void WorldStopPacket::write(DataStream& ds) const {
+ ds.write(reason);
+}
+
+WorldLayoutUpdatePacket::WorldLayoutUpdatePacket() {}
+
+WorldLayoutUpdatePacket::WorldLayoutUpdatePacket(Json const& layoutData) : layoutData(layoutData) {}
+
+void WorldLayoutUpdatePacket::read(DataStream& ds) {
+ ds.read(layoutData);
+}
+
+void WorldLayoutUpdatePacket::write(DataStream& ds) const {
+ ds.write(layoutData);
+}
+
+WorldParametersUpdatePacket::WorldParametersUpdatePacket() {}
+
+WorldParametersUpdatePacket::WorldParametersUpdatePacket(ByteArray const& parametersData) : parametersData(parametersData) {}
+
+void WorldParametersUpdatePacket::read(DataStream& ds) {
+ ds.read(parametersData);
+}
+
+void WorldParametersUpdatePacket::write(DataStream& ds) const {
+ ds.write(parametersData);
+}
+
+CentralStructureUpdatePacket::CentralStructureUpdatePacket() {}
+
+CentralStructureUpdatePacket::CentralStructureUpdatePacket(Json structureData) : structureData(move(structureData)) {}
+
+void CentralStructureUpdatePacket::read(DataStream& ds) {
+ ds.read(structureData);
+}
+
+void CentralStructureUpdatePacket::write(DataStream& ds) const {
+ ds.write(structureData);
+}
+
+TileArrayUpdatePacket::TileArrayUpdatePacket() {}
+
+void TileArrayUpdatePacket::read(DataStream& ds) {
+ ds.viread(min[0]);
+ ds.viread(min[1]);
+
+ size_t width, height;
+ ds.vuread(width);
+ ds.vuread(height);
+ array.resize(width, height);
+ for (size_t y = 0; y < height; ++y) {
+ for (size_t x = 0; x < width; ++x)
+ ds.read(array(x, y));
+ }
+}
+
+void TileArrayUpdatePacket::write(DataStream& ds) const {
+ ds.viwrite(min[0]);
+ ds.viwrite(min[1]);
+ ds.vuwrite(array.size(0));
+ ds.vuwrite(array.size(1));
+ for (size_t y = 0; y < array.size(1); ++y) {
+ for (size_t x = 0; x < array.size(0); ++x)
+ ds.write(array(x, y));
+ }
+}
+
+void TileUpdatePacket::read(DataStream& ds) {
+ ds.viread(position[0]);
+ ds.viread(position[1]);
+ ds.read(tile);
+}
+
+void TileUpdatePacket::write(DataStream& ds) const {
+ ds.viwrite(position[0]);
+ ds.viwrite(position[1]);
+ ds.write(tile);
+}
+
+TileLiquidUpdatePacket::TileLiquidUpdatePacket() {}
+
+TileLiquidUpdatePacket::TileLiquidUpdatePacket(Vec2I const& position, LiquidNetUpdate liquidUpdate)
+ : position(position), liquidUpdate(liquidUpdate) {}
+
+void TileLiquidUpdatePacket::read(DataStream& ds) {
+ ds.viread(position[0]);
+ ds.viread(position[1]);
+ ds.read(liquidUpdate.liquid);
+ ds.read(liquidUpdate.level);
+}
+
+void TileLiquidUpdatePacket::write(DataStream& ds) const {
+ ds.viwrite(position[0]);
+ ds.viwrite(position[1]);
+ ds.write(liquidUpdate.liquid);
+ ds.write(liquidUpdate.level);
+}
+
+TileDamageUpdatePacket::TileDamageUpdatePacket() : layer(TileLayer::Foreground) {}
+
+TileDamageUpdatePacket::TileDamageUpdatePacket(
+ Vec2I const& position, TileLayer layer, TileDamageStatus const& tileDamage)
+ : position(position), layer(layer), tileDamage(tileDamage) {}
+
+void TileDamageUpdatePacket::read(DataStream& ds) {
+ ds.read(position);
+ ds.read(layer);
+ ds.read(tileDamage);
+}
+
+void TileDamageUpdatePacket::write(DataStream& ds) const {
+ ds.write(position);
+ ds.write(layer);
+ ds.write(tileDamage);
+}
+
+TileModificationFailurePacket::TileModificationFailurePacket() {}
+
+TileModificationFailurePacket::TileModificationFailurePacket(TileModificationList modifications)
+ : modifications(modifications) {}
+
+void TileModificationFailurePacket::read(DataStream& ds) {
+ ds.readContainer(modifications);
+}
+
+void TileModificationFailurePacket::write(DataStream& ds) const {
+ ds.writeContainer(modifications);
+}
+
+GiveItemPacket::GiveItemPacket() {}
+
+GiveItemPacket::GiveItemPacket(ItemDescriptor const& item) : item(item) {}
+
+void GiveItemPacket::read(DataStream& ds) {
+ ds.read(item);
+}
+
+void GiveItemPacket::write(DataStream& ds) const {
+ ds.write(item);
+}
+
+EnvironmentUpdatePacket::EnvironmentUpdatePacket() {}
+
+EnvironmentUpdatePacket::EnvironmentUpdatePacket(ByteArray skyDelta, ByteArray weatherDelta)
+ : skyDelta(move(skyDelta)), weatherDelta(move(weatherDelta)) {}
+
+void EnvironmentUpdatePacket::read(DataStream& ds) {
+ ds.read(skyDelta);
+ ds.read(weatherDelta);
+}
+
+void EnvironmentUpdatePacket::write(DataStream& ds) const {
+ ds.write(skyDelta);
+ ds.write(weatherDelta);
+}
+
+ModifyTileListPacket::ModifyTileListPacket() : allowEntityOverlap() {}
+
+ModifyTileListPacket::ModifyTileListPacket(TileModificationList modifications, bool allowEntityOverlap)
+ : modifications(modifications), allowEntityOverlap(allowEntityOverlap) {}
+
+void ModifyTileListPacket::read(DataStream& ds) {
+ ds.readContainer(modifications);
+ ds.read(allowEntityOverlap);
+}
+
+void ModifyTileListPacket::write(DataStream& ds) const {
+ ds.writeContainer(modifications);
+ ds.write(allowEntityOverlap);
+}
+
+DamageTileGroupPacket::DamageTileGroupPacket() : layer(TileLayer::Foreground) {}
+
+DamageTileGroupPacket::DamageTileGroupPacket(
+ List<Vec2I> tilePositions, TileLayer layer, Vec2F sourcePosition, TileDamage tileDamage, Maybe<EntityId> sourceEntity)
+ : tilePositions(move(tilePositions)), layer(layer), sourcePosition(sourcePosition), tileDamage(move(tileDamage)), sourceEntity(move(sourceEntity)) {}
+
+void DamageTileGroupPacket::read(DataStream& ds) {
+ ds.readContainer(tilePositions);
+ ds.read(layer);
+ ds.read(sourcePosition);
+ ds.read(tileDamage);
+ ds.read(sourceEntity);
+}
+
+void DamageTileGroupPacket::write(DataStream& ds) const {
+ ds.writeContainer(tilePositions);
+ ds.write(layer);
+ ds.write(sourcePosition);
+ ds.write(tileDamage);
+ ds.write(sourceEntity);
+}
+
+CollectLiquidPacket::CollectLiquidPacket() {}
+
+CollectLiquidPacket::CollectLiquidPacket(List<Vec2I> tilePositions, LiquidId liquidId)
+ : tilePositions(move(tilePositions)), liquidId(liquidId) {}
+
+void CollectLiquidPacket::read(DataStream& ds) {
+ ds.readContainer(tilePositions);
+ ds.read(liquidId);
+}
+
+void CollectLiquidPacket::write(DataStream& ds) const {
+ ds.writeContainer(tilePositions);
+ ds.write(liquidId);
+}
+
+RequestDropPacket::RequestDropPacket() {
+ dropEntityId = NullEntityId;
+}
+
+RequestDropPacket::RequestDropPacket(EntityId dropEntityId) : dropEntityId(dropEntityId) {}
+
+void RequestDropPacket::read(DataStream& ds) {
+ ds.viread(dropEntityId);
+}
+
+void RequestDropPacket::write(DataStream& ds) const {
+ ds.viwrite(dropEntityId);
+}
+
+SpawnEntityPacket::SpawnEntityPacket() {}
+
+SpawnEntityPacket::SpawnEntityPacket(EntityType entityType, ByteArray storeData, ByteArray firstNetState)
+ : entityType(entityType), storeData(move(storeData)), firstNetState(move(firstNetState)) {}
+
+void SpawnEntityPacket::read(DataStream& ds) {
+ ds.read(entityType);
+ ds.read(storeData);
+ ds.read(firstNetState);
+}
+
+void SpawnEntityPacket::write(DataStream& ds) const {
+ ds.write(entityType);
+ ds.write(storeData);
+ ds.write(firstNetState);
+}
+
+EntityInteractPacket::EntityInteractPacket() {}
+
+EntityInteractPacket::EntityInteractPacket(InteractRequest interactRequest, Uuid requestId)
+ : interactRequest(interactRequest), requestId(requestId) {}
+
+void EntityInteractPacket::read(DataStream& ds) {
+ ds.read(interactRequest);
+ ds.read(requestId);
+}
+
+void EntityInteractPacket::write(DataStream& ds) const {
+ ds.write(interactRequest);
+ ds.write(requestId);
+}
+
+EntityInteractResultPacket::EntityInteractResultPacket() {}
+
+EntityInteractResultPacket::EntityInteractResultPacket(InteractAction action, Uuid requestId, EntityId sourceEntityId)
+ : action(action), requestId(requestId), sourceEntityId(sourceEntityId) {}
+
+void EntityInteractResultPacket::read(DataStream& ds) {
+ ds.read(action);
+ ds.read(requestId);
+ ds.read(sourceEntityId);
+}
+
+void EntityInteractResultPacket::write(DataStream& ds) const {
+ ds.write(action);
+ ds.write(requestId);
+ ds.write(sourceEntityId);
+}
+
+EntityCreatePacket::EntityCreatePacket() {
+ entityId = NullEntityId;
+}
+
+ServerDisconnectPacket::ServerDisconnectPacket() {}
+
+ServerDisconnectPacket::ServerDisconnectPacket(String reason) : reason(move(reason)) {}
+
+void ServerDisconnectPacket::read(DataStream& ds) {
+ ds.read(reason);
+}
+
+void ServerDisconnectPacket::write(DataStream& ds) const {
+ ds.write(reason);
+}
+
+ConnectWirePacket::ConnectWirePacket() {}
+
+ConnectWirePacket::ConnectWirePacket(WireConnection outputConnection, WireConnection inputConnection)
+ : outputConnection(outputConnection), inputConnection(inputConnection) {}
+
+void ConnectWirePacket::read(DataStream& ds) {
+ ds.read(outputConnection);
+ ds.read(inputConnection);
+}
+
+void ConnectWirePacket::write(DataStream& ds) const {
+ ds.write(outputConnection);
+ ds.write(inputConnection);
+}
+
+DisconnectAllWiresPacket::DisconnectAllWiresPacket() {}
+
+DisconnectAllWiresPacket::DisconnectAllWiresPacket(Vec2I entityPosition, WireNode wireNode)
+ : entityPosition(entityPosition), wireNode(wireNode) {}
+
+void DisconnectAllWiresPacket::read(DataStream& ds) {
+ ds.viread(entityPosition[0]);
+ ds.viread(entityPosition[1]);
+ ds.read(wireNode);
+}
+
+void DisconnectAllWiresPacket::write(DataStream& ds) const {
+ ds.viwrite(entityPosition[0]);
+ ds.viwrite(entityPosition[1]);
+ ds.write(wireNode);
+}
+
+WorldClientStateUpdatePacket::WorldClientStateUpdatePacket() {}
+
+WorldClientStateUpdatePacket::WorldClientStateUpdatePacket(ByteArray const& worldClientStateDelta)
+ : worldClientStateDelta(worldClientStateDelta) {}
+
+void WorldClientStateUpdatePacket::read(DataStream& ds) {
+ ds.read(worldClientStateDelta);
+}
+
+void WorldClientStateUpdatePacket::write(DataStream& ds) const {
+ ds.write(worldClientStateDelta);
+}
+
+FindUniqueEntityPacket::FindUniqueEntityPacket() {}
+
+FindUniqueEntityPacket::FindUniqueEntityPacket(String uniqueEntityId)
+ : uniqueEntityId(move(uniqueEntityId)) {}
+
+void FindUniqueEntityPacket::read(DataStream& ds) {
+ ds.read(uniqueEntityId);
+}
+
+void FindUniqueEntityPacket::write(DataStream& ds) const {
+ ds.write(uniqueEntityId);
+}
+
+WorldStartAcknowledgePacket::WorldStartAcknowledgePacket() {}
+
+void WorldStartAcknowledgePacket::read(DataStream& ds) {
+ // Packets can't be empty, read the trash data
+ ds.read<bool>();
+}
+
+void WorldStartAcknowledgePacket::write(DataStream& ds) const {
+ // Packets can't be empty, write some trash data
+ ds.write<bool>(false);
+}
+
+PingPacket::PingPacket() {}
+
+void PingPacket::read(DataStream& ds) {
+ // Packets can't be empty, read the trash data
+ ds.read<bool>();
+}
+
+void PingPacket::write(DataStream& ds) const {
+ // Packets can't be empty, write some trash data
+ ds.write(false);
+}
+
+EntityCreatePacket::EntityCreatePacket(EntityType entityType, ByteArray storeData, ByteArray firstNetState, EntityId entityId)
+ : entityType(entityType), storeData(move(storeData)), firstNetState(move(firstNetState)), entityId(entityId) {}
+
+void EntityCreatePacket::read(DataStream& ds) {
+ ds.read(entityType);
+ ds.read(storeData);
+ ds.read(firstNetState);
+ ds.viread(entityId);
+}
+
+void EntityCreatePacket::write(DataStream& ds) const {
+ ds.write(entityType);
+ ds.write(storeData);
+ ds.write(firstNetState);
+ ds.viwrite(entityId);
+}
+
+EntityUpdateSetPacket::EntityUpdateSetPacket(ConnectionId forConnection) : forConnection(forConnection) {}
+
+void EntityUpdateSetPacket::read(DataStream& ds) {
+ ds.vuread(forConnection);
+ ds.readMapContainer(deltas,
+ [](DataStream& ds, EntityId& entityId, ByteArray& delta) {
+ ds.viread(entityId);
+ ds.read(delta);
+ });
+}
+
+void EntityUpdateSetPacket::write(DataStream& ds) const {
+ ds.vuwrite(forConnection);
+ ds.writeMapContainer(deltas, [](DataStream& ds, EntityId const& entityId, ByteArray const& delta) {
+ ds.viwrite(entityId);
+ ds.write(delta);
+ });
+}
+
+EntityDestroyPacket::EntityDestroyPacket() {
+ entityId = NullEntityId;
+ death = false;
+}
+
+EntityDestroyPacket::EntityDestroyPacket(EntityId entityId, ByteArray finalNetState, bool death)
+ : entityId(entityId), finalNetState(move(finalNetState)), death(death) {}
+
+void EntityDestroyPacket::read(DataStream& ds) {
+ ds.viread(entityId);
+ ds.read(finalNetState);
+ ds.read(death);
+}
+
+void EntityDestroyPacket::write(DataStream& ds) const {
+ ds.viwrite(entityId);
+ ds.write(finalNetState);
+ ds.write(death);
+}
+
+HitRequestPacket::HitRequestPacket() {}
+
+HitRequestPacket::HitRequestPacket(RemoteHitRequest remoteHitRequest) : remoteHitRequest(move(remoteHitRequest)) {}
+
+void HitRequestPacket::read(DataStream& ds) {
+ ds.read(remoteHitRequest);
+}
+
+void HitRequestPacket::write(DataStream& ds) const {
+ ds.write(remoteHitRequest);
+}
+
+DamageRequestPacket::DamageRequestPacket() {}
+
+DamageRequestPacket::DamageRequestPacket(RemoteDamageRequest remoteDamageRequest)
+ : remoteDamageRequest(move(remoteDamageRequest)) {}
+
+void DamageRequestPacket::read(DataStream& ds) {
+ ds.read(remoteDamageRequest);
+}
+
+void DamageRequestPacket::write(DataStream& ds) const {
+ ds.write(remoteDamageRequest);
+}
+
+DamageNotificationPacket::DamageNotificationPacket() {}
+
+DamageNotificationPacket::DamageNotificationPacket(RemoteDamageNotification remoteDamageNotification)
+ : remoteDamageNotification(move(remoteDamageNotification)) {}
+
+void DamageNotificationPacket::read(DataStream& ds) {
+ ds.read(remoteDamageNotification);
+}
+
+void DamageNotificationPacket::write(DataStream& ds) const {
+ ds.write(remoteDamageNotification);
+}
+
+EntityMessagePacket::EntityMessagePacket() {}
+
+EntityMessagePacket::EntityMessagePacket(Variant<EntityId, String> entityId, String message, JsonArray args, Uuid uuid, ConnectionId fromConnection)
+ : entityId(entityId), message(move(message)), args(move(args)), uuid(uuid), fromConnection(fromConnection) {}
+
+void EntityMessagePacket::read(DataStream& ds) {
+ ds.read(entityId);
+ ds.read(message);
+ ds.read(args);
+ ds.read(uuid);
+ ds.read(fromConnection);
+}
+
+void EntityMessagePacket::write(DataStream& ds) const {
+ ds.write(entityId);
+ ds.write(message);
+ ds.write(args);
+ ds.write(uuid);
+ ds.write(fromConnection);
+}
+
+EntityMessageResponsePacket::EntityMessageResponsePacket() {}
+
+EntityMessageResponsePacket::EntityMessageResponsePacket(Either<String, Json> response, Uuid uuid)
+ : response(move(response)), uuid(uuid) {}
+
+void EntityMessageResponsePacket::read(DataStream& ds) {
+ ds.read(response);
+ ds.read(uuid);
+}
+
+void EntityMessageResponsePacket::write(DataStream& ds) const {
+ ds.write(response);
+ ds.write(uuid);
+}
+
+UpdateWorldPropertiesPacket::UpdateWorldPropertiesPacket() {}
+
+UpdateWorldPropertiesPacket::UpdateWorldPropertiesPacket(JsonObject const& updatedProperties)
+ : updatedProperties(updatedProperties) {}
+
+void UpdateWorldPropertiesPacket::read(DataStream& ds) {
+ ds.readMapContainer(updatedProperties);
+}
+
+void UpdateWorldPropertiesPacket::write(DataStream& ds) const {
+ ds.writeMapContainer(updatedProperties);
+}
+
+UpdateTileProtectionPacket::UpdateTileProtectionPacket() {}
+
+UpdateTileProtectionPacket::UpdateTileProtectionPacket(DungeonId dungeonId, bool isProtected)
+ : dungeonId(dungeonId), isProtected(isProtected) {}
+
+void UpdateTileProtectionPacket::read(DataStream& ds) {
+ ds.read(dungeonId);
+ ds.read(isProtected);
+}
+
+void UpdateTileProtectionPacket::write(DataStream& ds) const {
+ ds.write(dungeonId);
+ ds.write(isProtected);
+}
+
+SetDungeonGravityPacket::SetDungeonGravityPacket() {}
+
+SetDungeonGravityPacket::SetDungeonGravityPacket(DungeonId dungeonId, Maybe<float> gravity)
+ : dungeonId(move(dungeonId)), gravity(move(gravity)) {}
+
+void SetDungeonGravityPacket::read(DataStream& ds) {
+ ds.read(dungeonId);
+ ds.read(gravity);
+}
+
+void SetDungeonGravityPacket::write(DataStream& ds) const {
+ ds.write(dungeonId);
+ ds.write(gravity);
+}
+
+SetDungeonBreathablePacket::SetDungeonBreathablePacket() {}
+
+SetDungeonBreathablePacket::SetDungeonBreathablePacket(DungeonId dungeonId, Maybe<bool> breathable)
+ : dungeonId(move(dungeonId)), breathable(move(breathable)) {}
+
+void SetDungeonBreathablePacket::read(DataStream& ds) {
+ ds.read(dungeonId);
+ ds.read(breathable);
+}
+
+void SetDungeonBreathablePacket::write(DataStream& ds) const {
+ ds.write(dungeonId);
+ ds.write(breathable);
+}
+
+SetPlayerStartPacket::SetPlayerStartPacket() {}
+
+SetPlayerStartPacket::SetPlayerStartPacket(Vec2F playerStart, bool respawnInWorld) : playerStart(playerStart), respawnInWorld(respawnInWorld) {}
+
+void SetPlayerStartPacket::read(DataStream& ds) {
+ ds.read(playerStart);
+ ds.read(respawnInWorld);
+}
+
+void SetPlayerStartPacket::write(DataStream& ds) const {
+ ds.write(playerStart);
+ ds.write(respawnInWorld);
+}
+
+FindUniqueEntityResponsePacket::FindUniqueEntityResponsePacket() {}
+
+FindUniqueEntityResponsePacket::FindUniqueEntityResponsePacket(String uniqueEntityId, Maybe<Vec2F> entityPosition)
+ : uniqueEntityId(move(uniqueEntityId)), entityPosition(move(entityPosition)) {}
+
+void FindUniqueEntityResponsePacket::read(DataStream& ds) {
+ ds.read(uniqueEntityId);
+ ds.read(entityPosition);
+}
+
+void FindUniqueEntityResponsePacket::write(DataStream& ds) const {
+ ds.write(uniqueEntityId);
+ ds.write(entityPosition);
+}
+
+PongPacket::PongPacket() {}
+
+void PongPacket::read(DataStream& ds) {
+ // Packets can't be empty, read the trash data
+ ds.read<bool>();
+}
+
+void PongPacket::write(DataStream& ds) const {
+ // Packets can't be empty, write some trash data
+ ds.write<bool>(false);
+}
+
+StepUpdatePacket::StepUpdatePacket() : remoteStep(0) {}
+
+StepUpdatePacket::StepUpdatePacket(uint64_t remoteStep) : remoteStep(remoteStep) {}
+
+void StepUpdatePacket::read(DataStream& ds) {
+ ds.vuread(remoteStep);
+}
+
+void StepUpdatePacket::write(DataStream& ds) const {
+ ds.vuwrite(remoteStep);
+}
+
+SystemWorldStartPacket::SystemWorldStartPacket() {}
+
+SystemWorldStartPacket::SystemWorldStartPacket(Vec3I location, List<ByteArray> objectStores, List<ByteArray> shipStores, pair<Uuid, SystemLocation> clientShip)
+ : location(move(location)), objectStores(move(objectStores)), shipStores(move(shipStores)), clientShip(move(clientShip)) {}
+
+void SystemWorldStartPacket::read(DataStream& ds) {
+ ds.read(location);
+ ds.read(objectStores);
+ ds.read(shipStores);
+ ds.read(clientShip);
+}
+
+void SystemWorldStartPacket::write(DataStream& ds) const {
+ ds.write(location);
+ ds.write(objectStores);
+ ds.write(shipStores);
+ ds.write(clientShip);
+}
+
+SystemWorldUpdatePacket::SystemWorldUpdatePacket() {}
+
+SystemWorldUpdatePacket::SystemWorldUpdatePacket(HashMap<Uuid, ByteArray> objectUpdates, HashMap<Uuid, ByteArray> shipUpdates)
+ : objectUpdates(move(objectUpdates)), shipUpdates(move(shipUpdates)) {}
+
+void SystemWorldUpdatePacket::read(DataStream& ds) {
+ ds.read(objectUpdates);
+ ds.read(shipUpdates);
+}
+
+void SystemWorldUpdatePacket::write(DataStream& ds) const {
+ ds.write(objectUpdates);
+ ds.write(shipUpdates);
+}
+
+SystemObjectCreatePacket::SystemObjectCreatePacket() {}
+
+SystemObjectCreatePacket::SystemObjectCreatePacket(ByteArray objectStore) : objectStore(move(objectStore)) {}
+
+void SystemObjectCreatePacket::read(DataStream& ds) {
+ ds.read(objectStore);
+}
+
+void SystemObjectCreatePacket::write(DataStream& ds) const {
+ ds.write(objectStore);
+}
+
+SystemObjectDestroyPacket::SystemObjectDestroyPacket() {}
+
+SystemObjectDestroyPacket::SystemObjectDestroyPacket(Uuid objectUuid) : objectUuid(move(objectUuid)) {}
+
+void SystemObjectDestroyPacket::read(DataStream& ds) {
+ ds.read(objectUuid);
+}
+
+void SystemObjectDestroyPacket::write(DataStream& ds) const {
+ ds.write(objectUuid);
+}
+
+SystemShipCreatePacket::SystemShipCreatePacket() {}
+
+SystemShipCreatePacket::SystemShipCreatePacket(ByteArray shipStore) : shipStore(move(shipStore)) {}
+
+void SystemShipCreatePacket::read(DataStream& ds) {
+ ds.read(shipStore);
+}
+
+void SystemShipCreatePacket::write(DataStream& ds) const {
+ ds.write(shipStore);
+}
+
+SystemShipDestroyPacket::SystemShipDestroyPacket() {}
+
+SystemShipDestroyPacket::SystemShipDestroyPacket(Uuid shipUuid) : shipUuid(move(shipUuid)) {}
+
+void SystemShipDestroyPacket::read(DataStream& ds) {
+ ds.read(shipUuid);
+}
+
+void SystemShipDestroyPacket::write(DataStream& ds) const {
+ ds.write(shipUuid);
+}
+
+SystemObjectSpawnPacket::SystemObjectSpawnPacket() {}
+
+SystemObjectSpawnPacket::SystemObjectSpawnPacket(String typeName, Uuid uuid, Maybe<Vec2F> position, JsonObject parameters)
+ : typeName(move(typeName)), uuid(move(uuid)), position(move(position)), parameters(move(parameters)) {}
+
+void SystemObjectSpawnPacket::read(DataStream& ds) {
+ ds.read(typeName);
+ ds.read(uuid);
+ ds.read(position);
+ ds.read(parameters);
+}
+
+void SystemObjectSpawnPacket::write(DataStream& ds) const {
+ ds.write(typeName);
+ ds.write(uuid);
+ ds.write(position);
+ ds.write(parameters);
+}
+
+}