diff --git a/src/object/object_manager.cpp b/src/object/object_manager.cpp index f22f1faa..896cb608 100644 --- a/src/object/object_manager.cpp +++ b/src/object/object_manager.cpp @@ -228,6 +228,10 @@ CObject* CObjectManager::Radar(CObject* pThis, Math::Vector thisPosition, float iAngle = thisAngle+angle; iAngle = Math::NormAngle(iAngle); // 0..2*Math::PI + int filter_team = filter & 0xFF; + RadarFilter filter_flying = static_cast(filter & (FILTER_ONLYLANDING | FILTER_ONLYFLYING)); + RadarFilter filter_enemy = static_cast(filter & (FILTER_FRIENDLY | FILTER_ENEMY | FILTER_NEUTRAL)); + if ( !furthest ) best = 100000.0f; else best = 0.0f; pBest = nullptr; @@ -271,17 +275,29 @@ CObject* CObjectManager::Radar(CObject* pThis, Math::Vector thisPosition, float // END OF TODO } - if ( filter == FILTER_ONLYLANDING ) + if ( filter_flying == FILTER_ONLYLANDING ) { physics = pObj->GetPhysics(); if ( physics != nullptr && !physics->GetLand() ) continue; } - if ( filter == FILTER_ONLYFLYING ) + if ( filter_flying == FILTER_ONLYFLYING ) { physics = pObj->GetPhysics(); if ( physics != nullptr && physics->GetLand() ) continue; } + if ( filter_team != 0 && pObj->GetTeam() != filter_team ) + continue; + + if( pThis != nullptr ) + { + RadarFilter enemy = FILTER_NONE; + if ( pObj->GetTeam() == 0 ) enemy = static_cast(enemy | FILTER_NEUTRAL); + if ( pObj->GetTeam() == pThis->GetTeam() ) enemy = static_cast(enemy | FILTER_FRIENDLY); + if ( pObj->GetTeam() != pThis->GetTeam() ) enemy = static_cast(enemy | FILTER_ENEMY); + if ( filter_enemy != 0 && (filter_enemy & enemy) == 0 ) continue; + } + if ( std::find(type.begin(), type.end(), oType) == type.end() && type.size() > 0 ) continue; oPos = pObj->GetPosition(0); diff --git a/src/object/object_manager.h b/src/object/object_manager.h index 67bd2d4a..7314773e 100644 --- a/src/object/object_manager.h +++ b/src/object/object_manager.h @@ -48,9 +48,14 @@ class CObjectFactory; enum RadarFilter { - FILTER_NONE = 0, - FILTER_ONLYLANDING = 1, - FILTER_ONLYFLYING = 2, + FILTER_NONE = (0b00000000) << 8, + + FILTER_ONLYLANDING = (0b00000001) << 8, + FILTER_ONLYFLYING = (0b00000010) << 8, + + FILTER_FRIENDLY = (0b00000100) << 8, + FILTER_ENEMY = (0b00001000) << 8, + FILTER_NEUTRAL = (0b00010000) << 8, }; using CObjectMap = std::map>; diff --git a/src/script/scriptfunc.cpp b/src/script/scriptfunc.cpp index 8fabf16f..165f7481 100644 --- a/src/script/scriptfunc.cpp +++ b/src/script/scriptfunc.cpp @@ -1062,7 +1062,7 @@ bool CScriptFunctions::rDelete(CBotVar* var, CBotVar* result, int& exception, vo } else { - if ( exploType ) + if ( exploType != 0 ) { obj->ExplodeObject(static_cast(exploType), force); } @@ -3821,12 +3821,15 @@ void CScriptFunctions::Init() CBotProgram::DefineNum("FilterNone", FILTER_NONE); CBotProgram::DefineNum("FilterOnlyLanding", FILTER_ONLYLANDING); - CBotProgram::DefineNum("FilterOnlyFliying", FILTER_ONLYFLYING); + CBotProgram::DefineNum("FilterOnlyFlying", FILTER_ONLYFLYING); + CBotProgram::DefineNum("FilterFriendly", FILTER_FRIENDLY); + CBotProgram::DefineNum("FilterEnemy", FILTER_ENEMY); + CBotProgram::DefineNum("FilterNeutral", FILTER_NEUTRAL); - CBotProgram::DefineNum("ExploNone", 0); - CBotProgram::DefineNum("ExploBoum", static_cast(ExplosionType::Bang)); - CBotProgram::DefineNum("ExploBurn", static_cast(ExplosionType::Burn)); - CBotProgram::DefineNum("ExploWater", static_cast(ExplosionType::Water)); + CBotProgram::DefineNum("ExplosionNone", 0); + CBotProgram::DefineNum("ExplosionBang", static_cast(ExplosionType::Bang)); + CBotProgram::DefineNum("ExplosionBurn", static_cast(ExplosionType::Burn)); + CBotProgram::DefineNum("ExplosionWater", static_cast(ExplosionType::Water)); CBotProgram::DefineNum("ResultNotEnded", ERR_MISSION_NOTERM); CBotProgram::DefineNum("ResultLost", INFO_LOST);