1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-15 00:05:02 +02:00

Serverside validation, setting for terrain compatibility before cast etc

This commit is contained in:
Dydzio
2024-04-01 18:12:38 +02:00
parent e69c096f94
commit 3bb66de551
7 changed files with 113 additions and 52 deletions

View File

@ -522,18 +522,22 @@ const TerrainTile * CGameInfoCallback::getTileForDimensionDoor(int3 tile, const
if(!allowOnlyToUncoveredTiles)
{
if(castingHero->canCastThisSpell(static_cast<SpellID>(SpellID::DIMENSION_DOOR).toSpell())
&& isInScreenRange(castingHero->pos, tile)) //TODO: check if > 0 casts left
&& isInScreenRange(castingHero->getSightCenter(), tile)) //TODO: check if > 0 casts left
{
//we are allowed to get basic blocked/water invisible nearby tile date when casting DD spell
TerrainTile targetTile = gs->map->getTile(tile);
auto obfuscatedTile = std::make_shared<TerrainTile>();
obfuscatedTile->visitable = false;
obfuscatedTile->blocked = targetTile.blocked || targetTile.visitable;
obfuscatedTile->terType = (targetTile.blocked || targetTile.visitable)
? VLC->terrainTypeHandler->getById(TerrainId::ROCK)
: targetTile.isWater()
? VLC->terrainTypeHandler->getById(TerrainId::WATER)
: VLC->terrainTypeHandler->getById(TerrainId::GRASS);
if(targetTile.blocked || targetTile.visitable)
obfuscatedTile->terType = VLC->terrainTypeHandler->getById(TerrainId::ROCK);
else if(!VLC->settings()->getBoolean(EGameSettings::DIMENSION_DOOR_EXPOSES_TERRAIN_TYPE))
obfuscatedTile->terType = gs->map->getTile(castingHero->getSightCenter()).terType;
else
obfuscatedTile->terType = targetTile.isWater()
? VLC->terrainTypeHandler->getById(TerrainId::WATER)
: VLC->terrainTypeHandler->getById(TerrainId::GRASS);
outputTile = obfuscatedTile.get();
}