From 2fb26163849d86ee090060fd60b4438e17025dfb Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Sat, 19 Aug 2023 21:08:44 +1000 Subject: More accurate liquid collection prediction --- source/game/StarWorldClient.cpp | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'source/game/StarWorldClient.cpp') diff --git a/source/game/StarWorldClient.cpp b/source/game/StarWorldClient.cpp index eb5c313..789bafa 100644 --- a/source/game/StarWorldClient.cpp +++ b/source/game/StarWorldClient.cpp @@ -1344,9 +1344,36 @@ void WorldClient::collectLiquid(List const& tilePositions, LiquidId liqui if (!inWorld()) return; - TileModification modification = PlaceLiquid{ EmptyLiquidId, 0.0f }; - for (auto& pos : tilePositions) - informTilePrediction(pos, modification); + float bucketSize = Root::singleton().assets()->json("/items/defaultParameters.config:liquidItems.bucketSize").toFloat(); + unsigned drainedUnits = 0; + float nextUnit = bucketSize; + List maybeDrainTiles; + + for (auto& pos : tilePositions) { + if (isTileProtected(pos)) + continue; + auto& p = m_predictedTiles[pos]; + auto const& tile = m_tileArray->tile(pos); + if ((p.liquid ? p.liquid->liquid : tile.liquid.liquid) == liquidId) { + if (!p.liquid) + p.liquid.emplace(tile.liquid.liquid, tile.liquid.level); + auto& liquid = *p.liquid; + if (liquid.level >= nextUnit) { + liquid.take(nextUnit); + nextUnit = bucketSize; + + for (auto& previousTile : maybeDrainTiles) + m_predictedTiles[pos].liquid.emplace(EmptyLiquidId, 0.0f); + + maybeDrainTiles.clear(); + } + + if (liquid.level > 0) { + nextUnit -= liquid.level; + maybeDrainTiles.append(pos); + } + } + } m_outgoingPackets.append(make_shared(tilePositions, liquidId)); } -- cgit v1.2.3