Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Препятствие между игроками
BlackHead1673 Дата: Пятница, 09.06.2023, 02:22:31 | Сообщение # 1
Сообщений: 18
Репутация: 0 [ +/- ]
Можете пожалуйста подсказать, как сделать проверку если между игроками есть препятствие ?
Что-то пробовал/тыкал, но не натыкал

Код
stock bool IsTargetInSightRange(int client, int target, float angle=90.0, float distance=0.0, bool heightcheck=true, bool negativeangle=false, bool OnlyPlayer=true)
{
    if(angle > 360.0 || angle < 0.0)
  ThrowError("Angle Max : 360 & Min : 0. %d isn't proper angle.", angle);
    if(!IsValidClient(client))
  ThrowError("Client is not Alive.");
    if(!IsValidClient(target))
  ThrowError("Target is not Alive.");
  
    float clientpos[3], targetpos[3], anglevector[3], targetvector[3], resultangle, resultdistance;
    
    GetClientEyeAngles(client, anglevector);
    anglevector[0] = anglevector[2] = 0.0;
    GetAngleVectors(anglevector, anglevector, NULL_VECTOR, NULL_VECTOR);
    NormalizeVector(anglevector, anglevector);
    if(negativeangle)
  NegateVector(anglevector);

    GetClientAbsOrigin(client, clientpos);
    GetClientAbsOrigin(target, targetpos);
    if(heightcheck && distance > 0)
  resultdistance = GetVectorDistance(clientpos, targetpos);
    clientpos[2] = targetpos[2] = 0.0;
    MakeVectorFromPoints(clientpos, targetpos, targetvector);
    NormalizeVector(targetvector, targetvector);
    
    resultangle = RadToDeg(ArcCosine(GetVectorDotProduct(targetvector, anglevector)));

    if(resultangle <= angle/2)    
    {
  if(distance > 0)
  {
   if(OnlyPlayer)
   {
    Handle tr = TR_TraceRayFilterEx(clientpos, targetpos, MASK_VISIBLE, RayType_Infinite, TRDontHitTarget, client);
    //PrintToChatAll("%d", TR_GetEntityIndex(tr));
    if(0 < TR_GetEntityIndex(tr) < MaxClients)
    {
     delete tr;
     return true;
    }
    else
    {
     delete tr;
     return false;
    }
   }
   if(!heightcheck)
    resultdistance = GetVectorDistance(clientpos, targetpos);
   if(distance >= resultdistance)
    return true;
   else
    return false;
  }
  else
   return true;
    }
    else
  return false;
}
public bool TRDontHitTarget(int entity, int mask, any data)
{
    if (entity == data)
        return false;
    return true;
}


UPD*

Вроде решил/нашел
Если вдруг кому нужно, то вот функция
Код
stock bool ClientViews(int viewer,int target, float fMaxDistance=0.0, float fThreshold=0.73)
{
    // Получить вид и целевое положение глаз
    float fViewPos[3];   GetClientEyePosition(viewer, fViewPos);
    float fViewAng[3];   GetClientEyeAngles(viewer, fViewAng);
    float fViewDir[3];
    float fTargetPos[3]; GetClientEyePosition(target, fTargetPos);
    float fTargetDir[3];
    float fDistance[3];
    
    // Рассчитать направление взгляда
    fViewAng[0] = fViewAng[2] = 0.0;
    GetAngleVectors(fViewAng, fViewDir, NULL_VECTOR, NULL_VECTOR);
    
    // Рассчитайте расстояние до зрителя, чтобы узнать, видно ли его.
    fDistance[0] = fTargetPos[0]-fViewPos[0];
    fDistance[1] = fTargetPos[1]-fViewPos[1];
    fDistance[2] = 0.0;
    if (fMaxDistance != 0.0)
    {
  if (((fDistance[0]*fDistance[0])+(fDistance[1]*fDistance[1])) >= (fMaxDistance*fMaxDistance))
   return false;
    }
    
    // Проверить скалярное произведение. Если он отрицательный, это означает, что зритель смотрит
    // назад к цели.
    NormalizeVector(fDistance, fTargetDir);
    if (GetVectorDotProduct(fViewDir, fTargetDir) < fThreshold) return false;
    
    // Теперь проверьте, нет ли препятствий между ними с помощью raycasting.
    Handle hTrace = TR_TraceRayFilterEx(fViewPos, fTargetPos, MASK_PLAYERSOLID_BRUSHONLY, RayType_EndPoint, ClientViewsFilter);
    if (TR_DidHit(hTrace)) { delete hTrace; return false; }
    delete hTrace;
    
    // Готово, видно
    return true;
}
public bool ClientViewsFilter(int Entity, int Mask, any Junk)
{
    if (Entity >= 1 && Entity <= MaxClients) return false;
    return true;
}


Сообщение отредактировал BlackHead1673 - Вторник, 13.06.2023, 19:28:41
 
  • Страница 1 из 1
  • 1
Поиск: