mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-08 22:26:51 +02:00
Do not call visitablePos for non-visitable objects
This commit is contained in:
@@ -217,8 +217,8 @@ int CGObjectInstance::getSightRadius() const
|
||||
|
||||
int3 CGObjectInstance::getVisitableOffset() const
|
||||
{
|
||||
// if (!isVisitable())
|
||||
// logGlobal->debug("Attempt to access visitable offset on a non-visitable object!");
|
||||
if (!isVisitable())
|
||||
logGlobal->debug("Attempt to access visitable offset on a non-visitable object!");
|
||||
return appearance->getVisitableOffset();
|
||||
}
|
||||
|
||||
@@ -317,8 +317,8 @@ void CGObjectInstance::onHeroVisit( const CGHeroInstance * h ) const
|
||||
|
||||
int3 CGObjectInstance::visitablePos() const
|
||||
{
|
||||
// if (!isVisitable())
|
||||
// logGlobal->debug("Attempt to access visitable position on a non-visitable object!");
|
||||
if (!isVisitable())
|
||||
logGlobal->debug("Attempt to access visitable position on a non-visitable object!");
|
||||
|
||||
return pos - getVisitableOffset();
|
||||
}
|
||||
|
@@ -255,6 +255,14 @@ Object::Instance & Object::addInstance(CGObjectInstance & object, const int3 & p
|
||||
return dInstances.back();
|
||||
}
|
||||
|
||||
bool Object::isVisitable() const
|
||||
{
|
||||
return vstd::contains_if(dInstances, [](const Instance & instance)
|
||||
{
|
||||
return instance.object().isVisitable();
|
||||
});
|
||||
}
|
||||
|
||||
const int3 & Object::getPosition() const
|
||||
{
|
||||
return dPosition;
|
||||
@@ -464,6 +472,12 @@ uint32_t rmg::Object::getValue() const
|
||||
|
||||
rmg::Area Object::Instance::getBorderAbove() const
|
||||
{
|
||||
if (!object().isVisitable())
|
||||
{
|
||||
// TODO: Non-visitable objects don't need this, but theoretically could return valid area
|
||||
return rmg::Area();
|
||||
}
|
||||
|
||||
int3 visitablePos = getVisitablePosition();
|
||||
auto areaVisitable = rmg::Area({visitablePos});
|
||||
auto borderAbove = areaVisitable.getBorderOutside();
|
||||
|
@@ -85,6 +85,7 @@ public:
|
||||
const Area getEntrableArea() const;
|
||||
const Area & getBorderAbove() const;
|
||||
|
||||
bool isVisitable() const;
|
||||
const int3 & getPosition() const;
|
||||
void setPosition(const int3 & position);
|
||||
void setTemplate(const TerrainId & terrain, vstd::RNG &);
|
||||
|
@@ -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>())
|
||||
{
|
||||
|
Reference in New Issue
Block a user