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

summaryrefslogtreecommitdiff
path: root/source/game/StarWorldServer.cpp
diff options
context:
space:
mode:
authorchililisoup <rebot333gaming@gmail.com>2025-03-23 18:23:11 -0600
committerchililisoup <rebot333gaming@gmail.com>2025-03-23 18:23:11 -0600
commit83f090f0ca79c4006ef2f1fca2d6b6876661e08c (patch)
treeb3d615195d2b973a98ec489c1516f3421634e4b8 /source/game/StarWorldServer.cpp
parent2b4c762b6b1da745cabe6810187fc34cb546e0cb (diff)
more block swap fixes
Diffstat (limited to 'source/game/StarWorldServer.cpp')
-rw-r--r--source/game/StarWorldServer.cpp46
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));