diff options
author | chililisoup <rebot333gaming@gmail.com> | 2025-03-23 18:23:11 -0600 |
---|---|---|
committer | chililisoup <rebot333gaming@gmail.com> | 2025-03-23 18:23:11 -0600 |
commit | 83f090f0ca79c4006ef2f1fca2d6b6876661e08c (patch) | |
tree | b3d615195d2b973a98ec489c1516f3421634e4b8 /source/game/StarWorldServer.cpp | |
parent | 2b4c762b6b1da745cabe6810187fc34cb546e0cb (diff) |
more block swap fixes
Diffstat (limited to 'source/game/StarWorldServer.cpp')
-rw-r--r-- | source/game/StarWorldServer.cpp | 46 |
1 files changed, 40 insertions, 6 deletions
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<PacketPtr> c clientInfo->outgoingPackets.append(make_shared<TileModificationFailurePacket>(unappliedModifications)); } else if (auto rtpacket = as<ReplaceTileListPacket>(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<TileModificationFailurePacket>(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<Vec2I> toDamage; + TileLayer layer; + + for (auto pair : modificationList) { + if (auto placeMaterial = pair.second.ptr<PlaceMaterial>()) { + 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<EntityId>()); + + } 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)); |