diff --git a/source/graphics/Terrain.cpp b/source/graphics/Terrain.cpp index 444212ec49..a8e53ba0b2 100644 --- a/source/graphics/Terrain.cpp +++ b/source/graphics/Terrain.cpp @@ -96,6 +96,10 @@ bool CTerrain::isOnMap(const CVector2D& v) const bool CTerrain::isPassable(const CVector2D &loc/*tile space*/, HEntity entity) const { CMiniPatch *pTile = GetTile(loc.x, loc.y); + if(!pTile->Tex1) + { + return false; // Invalid terrain type in the scenario file + } CTextureEntry *pTexEntry = g_TexMan.FindTexture(pTile->Tex1); CTerrainPropertiesPtr pProperties = pTexEntry->GetProperties(); diff --git a/source/graphics/UnitManager.cpp b/source/graphics/UnitManager.cpp index 1166bfd0da..3e54298fc2 100644 --- a/source/graphics/UnitManager.cpp +++ b/source/graphics/UnitManager.cpp @@ -78,7 +78,7 @@ void CUnitManager::DeleteAll() /////////////////////////////////////////////////////////////////////////////// // PickUnit: iterate through units testing given ray against bounds of each // unit; return the closest unit, or null if everything missed -CUnit* CUnitManager::PickUnit(const CVector3D& origin, const CVector3D& dir) const +CUnit* CUnitManager::PickUnit(const CVector3D& origin, const CVector3D& dir, bool entitiesOnly) const { CLOSManager* losMgr = g_Game->GetWorld()->GetLOSManager(); @@ -94,6 +94,8 @@ CUnit* CUnitManager::PickUnit(const CVector3D& origin, const CVector3D& dir) con float tmin, tmax; CEntity* ent = unit->GetEntity(); + if( entitiesOnly && !ent ) + continue; if( ent && !ent->m_visible ) continue; diff --git a/source/graphics/UnitManager.h b/source/graphics/UnitManager.h index bd10bb042b..b37a5ffd80 100644 --- a/source/graphics/UnitManager.h +++ b/source/graphics/UnitManager.h @@ -48,7 +48,7 @@ public: // iterate through units testing given ray against bounds of each unit; // return the closest unit, or null if everything missed - CUnit* PickUnit(const CVector3D& origin, const CVector3D& dir) const; + CUnit* PickUnit(const CVector3D& origin, const CVector3D& dir, bool entitiesOnly) const; CUnit* FindByID(int id) const; diff --git a/source/gui/MiniMap.cpp b/source/gui/MiniMap.cpp index 17b5193e74..04d5a22a2b 100644 --- a/source/gui/MiniMap.cpp +++ b/source/gui/MiniMap.cpp @@ -71,9 +71,10 @@ void CMiniMap::HandleMessage(const SGUIMessage &Message) } case GUIM_MOUSE_RELEASE_LEFT: { - SetCameraPos(); - m_Clicking = false; - break; + if(m_Clicking) + SetCameraPos(); + m_Clicking = false; + break; } case GUIM_MOUSE_ENTER: { diff --git a/source/ps/Interact.cpp b/source/ps/Interact.cpp index 59fdbebd0d..cb4875007e 100644 --- a/source/ps/Interact.cpp +++ b/source/ps/Interact.cpp @@ -644,7 +644,7 @@ void CMouseoverEntities::update( float timestep ) CVector3D origin, dir; pCamera->BuildCameraRay( origin, dir ); - CUnit* hit = g_UnitMan.PickUnit( origin, dir ); + CUnit* hit = g_UnitMan.PickUnit( origin, dir, true ); m_worldposition = pCamera->GetWorldCoordinates(true); diff --git a/source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp b/source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp index 7e97edf580..5781622145 100644 --- a/source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp +++ b/source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp @@ -487,7 +487,7 @@ QUERYHANDLER(PickObject) CVector3D rayorigin, raydir; g_Game->GetView()->GetCamera()->BuildCameraRay((int)x, (int)y, rayorigin, raydir); - CUnit* target = g_UnitMan.PickUnit(rayorigin, raydir); + CUnit* target = g_UnitMan.PickUnit(rayorigin, raydir, false); if (target) msg->id = target->GetID();