| 1095 | } |
| 1096 | |
| 1097 | ItemDescriptor WorldServer::collectLiquid(List<Vec2I> const& tilePositions, LiquidId liquidId) { |
| 1098 | float bucketSize = Root::singleton().assets()->json("/items/defaultParameters.config:liquidItems.bucketSize").toFloat(); |
| 1099 | unsigned drainedUnits = 0; |
| 1100 | float nextUnit = bucketSize; |
| 1101 | List<ServerTile*> maybeDrainTiles; |
| 1102 | |
| 1103 | for (auto pos : tilePositions) { |
| 1104 | ServerTile* tile = m_tileArray->modifyTile(pos); |
| 1105 | if (tile->liquid.liquid == liquidId && !isTileProtected(pos)) { |
| 1106 | if (tile->liquid.level >= nextUnit) { |
| 1107 | tile->liquid.take(nextUnit); |
| 1108 | nextUnit = bucketSize; |
| 1109 | drainedUnits++; |
| 1110 | |
| 1111 | for (auto previousTile : maybeDrainTiles) |
| 1112 | previousTile->liquid.take(previousTile->liquid.level); |
| 1113 | |
| 1114 | maybeDrainTiles.clear(); |
| 1115 | } |
| 1116 | |
| 1117 | if (tile->liquid.level > 0) { |
| 1118 | nextUnit -= tile->liquid.level; |
| 1119 | maybeDrainTiles.append(tile); |
| 1120 | } |
| 1121 | |
| 1122 | for (auto const& pair : m_clientInfo) { |
| 1123 | if (pair.second->activeSectors.contains(m_tileArray->sectorFor(pos))) |
| 1124 | pair.second->pendingLiquidUpdates.add(pos); |
| 1125 | } |
| 1126 | m_liquidEngine->visitLocation(pos); |
| 1127 | } |
| 1128 | } |
| 1129 | |
| 1130 | if (drainedUnits > 0) { |
| 1131 | auto liquidConfig = Root::singleton().liquidsDatabase()->liquidSettings(liquidId); |
| 1132 | if (liquidConfig && liquidConfig->itemDrop) |
| 1133 | return liquidConfig->itemDrop.multiply(drainedUnits); |
| 1134 | } |
| 1135 | |
| 1136 | return ItemDescriptor(); |
| 1137 | } |
| 1138 | |
| 1139 | bool WorldServer::placeDungeon(String const& dungeonName, Vec2I const& position, Maybe<DungeonId> dungeonId, bool forcePlacement) { |
| 1140 | m_generatingDungeon = true; |
nothing calls this directly
no test coverage detected