| 889 | } |
| 890 | |
| 891 | bool WorldServer::replaceTile(Vec2I const& pos, TileModification const& modification, TileDamage const& tileDamage) { |
| 892 | if (isTileProtected(pos)) |
| 893 | return false; |
| 894 | |
| 895 | if (!WorldImpl::validateTileReplacement(modification)) |
| 896 | return false; |
| 897 | |
| 898 | if (auto placeMaterial = modification.ptr<PlaceMaterial>()) { |
| 899 | if (!isTileConnectable(pos, placeMaterial->layer, true)) |
| 900 | return false; |
| 901 | |
| 902 | if (auto tile = m_tileArray->modifyTile(pos)) { |
| 903 | auto damageParameters = WorldImpl::tileDamageParameters(tile, placeMaterial->layer, tileDamage); |
| 904 | bool harvested = tileDamage.amount >= 0 && tileDamage.harvestLevel >= damageParameters.requiredHarvestLevel(); |
| 905 | auto damage = placeMaterial->layer == TileLayer::Foreground ? tile->foregroundDamage : tile->backgroundDamage; |
| 906 | Vec2F dropPosition = centerOfTile(pos); |
| 907 | |
| 908 | for (auto drop : destroyBlock(placeMaterial->layer, pos, harvested, !tileDamageIsPenetrating(damage.damageType()), false)) |
| 909 | addEntity(ItemDrop::createRandomizedDrop(drop, dropPosition)); |
| 910 | |
| 911 | return true; |
| 912 | } |
| 913 | } |
| 914 | |
| 915 | return false; |
| 916 | } |
| 917 | |
| 918 | TileModificationList WorldServer::replaceTiles(TileModificationList const& modificationList, TileDamage const& tileDamage, bool applyDamage) { |
| 919 | TileModificationList success, failures; |
nothing calls this directly
no test coverage detected