From 3a54621bd8a55b672ba986f02ab094bfb4ba6faf Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Wed, 7 May 2025 04:49:52 +1000 Subject: add world.template, world.setTemplate --- source/game/StarWorldServer.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'source/game/StarWorldServer.cpp') diff --git a/source/game/StarWorldServer.cpp b/source/game/StarWorldServer.cpp index 3bc067a..a9dc1f0 100644 --- a/source/game/StarWorldServer.cpp +++ b/source/game/StarWorldServer.cpp @@ -340,7 +340,7 @@ List WorldServer::players() const { } void WorldServer::handleIncomingPackets(ConnectionId clientId, List const& packets) { - auto const& clientInfo = m_clientInfo.get(clientId); + shared_ptr clientInfo = m_clientInfo.get(clientId); auto& root = Root::singleton(); auto entityFactory = root.entityFactory(); auto itemDatabase = root.itemDatabase(); @@ -542,6 +542,14 @@ void WorldServer::handleIncomingPackets(ConnectionId clientId, List c for (auto const& pair : m_clientInfo) pair.second->outgoingPackets.append(make_shared(updateWorldProperties->updatedProperties)); + } else if (auto updateWorldTemplate = as(packet)) { + if (!clientInfo->admin) + continue; // nuh-uh! + + auto newWorldTemplate = make_shared(updateWorldTemplate->templateData); + setTemplate(newWorldTemplate); + // setTemplate re-adds all clients currently, update clientInfo + clientInfo = m_clientInfo.get(clientId); } else { throw WorldServerException::format("Improper packet type {} received by client", (int)packet->type()); } @@ -2587,4 +2595,19 @@ void WorldServer::setupForceRegions() { } } +void WorldServer::setTemplate(WorldTemplatePtr newTemplate) { + m_worldTemplate = std::move(newTemplate); + for (auto& client : clientIds()) { + auto& info = m_clientInfo.get(client); + bool local = info->local; + bool isAdmin = info->admin; + auto netRules = info->clientState.netCompatibilityRules(); + SpawnTarget spawnTarget; + if (auto player = clientPlayer(client)) + spawnTarget = SpawnTargetPosition(player->position() + player->feetOffset()); + removeClient(client); + addClient(client, spawnTarget, local, isAdmin, netRules); + } +} + } -- cgit v1.2.3