1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-05 00:49:09 +02:00

Do not call visitablePos for non-visitable objects

This commit is contained in:
Tomasz Zieliński
2024-12-25 08:23:45 +01:00
parent 77a35f76f7
commit d631e3f604
4 changed files with 33 additions and 10 deletions

View File

@ -587,17 +587,22 @@ void ObjectManager::placeObject(rmg::Object & object, bool guarded, bool updateD
Zone::Lock lock(zone.areaMutex);
zone.areaPossible()->subtract(object.getArea());
bool keepVisitable = zone.freePaths()->contains(object.getVisitablePosition());
bool keepVisitable = object.isVisitable() && zone.freePaths()->contains(object.getVisitablePosition());
zone.freePaths()->subtract(object.getArea()); //just to avoid areas overlapping
if(keepVisitable)
zone.freePaths()->add(object.getVisitablePosition());
zone.areaUsed()->unite(object.getArea());
zone.areaUsed()->erase(object.getVisitablePosition());
if (keepVisitable)
{
zone.freePaths()->add(object.getVisitablePosition());
zone.areaUsed()->erase(object.getVisitablePosition());
}
if(guarded) //We assume the monster won't be guarded
{
auto guardedArea = object.instances().back()->getAccessibleArea();
guardedArea.add(object.instances().back()->getVisitablePosition());
if (object.isVisitable())
{
guardedArea.add(object.instances().back()->getVisitablePosition());
}
auto areaToBlock = object.getAccessibleArea(true);
areaToBlock.subtract(guardedArea);
zone.areaPossible()->subtract(areaToBlock);
@ -641,7 +646,10 @@ void ObjectManager::placeObject(rmg::Object & object, bool guarded, bool updateD
// TODO: Add multiple tiles in one operation to avoid multiple invalidation
for(auto * instance : object.instances())
{
objectsVisitableArea.add(instance->getVisitablePosition());
if (instance->object().isVisitable())
{
objectsVisitableArea.add(instance->getVisitablePosition());
}
objects.push_back(&instance->object());
if(auto * rp = zone.getModificator<RoadPlacer>())
{