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

summaryrefslogtreecommitdiff
path: root/source/game/StarWorldServer.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2025-04-30 14:15:41 +1000
committerGitHub <noreply@github.com>2025-04-30 14:15:41 +1000
commit9a0ad03cba6ac00588fcaa89c7cb0b973e00b59b (patch)
tree999761448e0101efa4eae1dd00417726068e712d /source/game/StarWorldServer.cpp
parent885502bf11057e7de961f178bc85ce93a9f40723 (diff)
parent46edf8d0018e8bbbe62373c5c69c0ff9e8cea2b3 (diff)
Merge pull request #218 from chililisoup/main
Block swap fixes for compat, networking, sounds
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));