From 83f090f0ca79c4006ef2f1fca2d6b6876661e08c Mon Sep 17 00:00:00 2001 From: chililisoup Date: Sun, 23 Mar 2025 18:23:11 -0600 Subject: more block swap fixes --- source/game/StarWorldServer.cpp | 46 +++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) (limited to 'source/game/StarWorldServer.cpp') diff --git a/source/game/StarWorldServer.cpp b/source/game/StarWorldServer.cpp index b58c41d..5796b65 100644 --- a/source/game/StarWorldServer.cpp +++ b/source/game/StarWorldServer.cpp @@ -374,7 +374,7 @@ void WorldServer::handleIncomingPackets(ConnectionId clientId, List c clientInfo->outgoingPackets.append(make_shared(unappliedModifications)); } else if (auto rtpacket = as(packet)) { - auto unappliedModifications = replaceTiles(rtpacket->modifications, rtpacket->tileDamage); + auto unappliedModifications = replaceTiles(rtpacket->modifications, rtpacket->tileDamage, rtpacket->applyDamage); if (!unappliedModifications.empty()) clientInfo->outgoingPackets.append(make_shared(unappliedModifications)); @@ -907,14 +907,48 @@ bool WorldServer::replaceTile(Vec2I const& pos, TileModification const& modifica return false; } -TileModificationList WorldServer::replaceTiles(TileModificationList const& modificationList, TileDamage const& tileDamage) { +TileModificationList WorldServer::replaceTiles(TileModificationList const& modificationList, TileDamage const& tileDamage, bool applyDamage) { TileModificationList success, failures; - for (auto pair : modificationList) { - if (replaceTile(pair.first, pair.second, tileDamage)) - success.append(pair); - else + if (applyDamage) { + List toDamage; + TileLayer layer; + + for (auto pair : modificationList) { + if (auto placeMaterial = pair.second.ptr()) { + layer = placeMaterial->layer; + + if (placeMaterial->material == material(pair.first, layer)) { + failures.append(pair); + continue; + } + + if (damageWouldDestroy(pair.first, layer, tileDamage)) { + if (replaceTile(pair.first, pair.second, tileDamage)) + success.append(pair); + else + failures.append(pair); + continue; + } + + toDamage.append(pair.first); + success.append(pair); + continue; + } + failures.append(pair); + } + + if (!toDamage.empty()) + damageTiles(toDamage, layer, Vec2F(), tileDamage, Maybe()); + + } else { + for (auto pair : modificationList) { + if (replaceTile(pair.first, pair.second, tileDamage)) + success.append(pair); + else + failures.append(pair); + } } failures.appendAll(doApplyTileModifications(success, true, false, false)); -- cgit v1.2.3