Ver Fonte

Fixed routing roads behind Sub Gates, Monoliths and Mines

Tomasz Zieliński há 1 ano atrás
pai
commit
d4216a9191
1 ficheiros alterados com 15 adições e 4 exclusões
  1. 15 4
      lib/rmg/modificators/ObjectManager.cpp

+ 15 - 4
lib/rmg/modificators/ObjectManager.cpp

@@ -600,13 +600,24 @@ void ObjectManager::placeObject(rmg::Object & object, bool guarded, bool updateD
 				//Cannot be trespassed (Corpse)
 				continue;
 			}
+			else if(instance->object().appearance->isVisitableFromTop())
+			{
+				//Passable objects
+				m->areaForRoads().add(instance->getVisitablePosition());
+			}
 			else if(!instance->object().appearance->isVisitableFromTop())
 			{
-				auto abovePos = instance->getVisitablePosition() + int3(0, -1, 0);
-				if (!instance->object().blockingAt(abovePos))
+				// Do not route road behind visitable tile
+				int3 visitablePos = instance->getVisitablePosition();
+				auto areaVisitable = rmg::Area({visitablePos});
+				auto borderAbove = areaVisitable.getBorderOutside();
+				vstd::erase_if(borderAbove, [&](const int3 & tile)
 				{
-					m->areaIsolated().add(abovePos);
-				}
+					return tile.y >= visitablePos.y ||
+					(!instance->object().blockingAt(tile + int3(0, 1, 0)) && 
+					instance->object().blockingAt(tile));
+				});				
+				m->areaIsolated().unite(borderAbove);
 			}
 		}