Как юзать функцию

Q

Qujeck

PHP:
native TeleportEntity(entity, const Float:origin[3], const Float:angles[3], const Float:velocity[3]);
entity - индекс игрока
origin - Новые координаты, или NULL_VECTOR по умолчанию. Теперь вопрос, как определить координаты или как тпхнуть игрока на респавн его команды, или где найти origin'ы для этого, или как определить координаты туда куда смотрит прицел игрока, или где находится другой игрок.
angles - Новый угол взгляда, или NULL_VECTOR по умолчанию. Здесь по идеи должно быть в углах(но хз какой синтаксис)
velocity - Новая скорость, или NULL_VECTOR по умолчанию. при тп игроку присваивается скорость.
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
Теперь вопрос, как определить координаты или как тпхнуть игрока на респавн его команды
Либо CS_RespawnPlayer, либо пример:

PHP:
public Action Event_PlayerSpawn(Event hEvent, const char[] name, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    if(IsClientInGame(iClient))
    {
        int iEnemyTeam = (GetClientTeam(iClient) == 2) ? 3 : 2;
      
        int iAvailableLocations = 0;

        float fEmptySpawnPoints[100][3],
            fPlayerPosition[3],
            fSpawnPosition[3];
      
        int iEnt = INVALID_ENT_REFERENCE;
        while((iEnt = FindEntityByClassname(iEnt, (iEnemyTeam == 2) ? "info_player_terrorist" : "info_player_counterterrorist")) != INVALID_ENT_REFERENCE)
        {
            GetEntDataVector(iEnt, g_iOriginOffset, fSpawnPosition);

            bool bIsConflicting = false;
            for(int i = 1; i <= MaxClients; i++)        if(IsClientInGame(i))
            {
                GetClientAbsOrigin(i, fPlayerPosition);
                if(GetVectorDistance(fSpawnPosition, fPlayerPosition) < 60.0)
                {
                    bIsConflicting = true;
                    break;
                }
            }
          
            if(!bIsConflicting)
            {
                fEmptySpawnPoints[iAvailableLocations][0] = fSpawnPosition[0];
                fEmptySpawnPoints[iAvailableLocations][1] = fSpawnPosition[1];
                fEmptySpawnPoints[iAvailableLocations][2] = fSpawnPosition[2];
                iAvailableLocations++;
            }
          
            TeleportEntity(iClient, fEmptySpawnPoints[GetRandomInt(0, iAvailableLocations - 1)], NULL_VECTOR, NULL_VECTOR);
        }
    }
}

куда смотрит прицел игрока
GetClientEyePosition sourcemod function
 

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #3
origin - Новые координаты, или NULL_VECTOR по умолчанию. Теперь вопрос, как определить координаты
Для того, чтобы получить координаты сущности, можно использовать встроенную функцию sourcemod.
PHP:
void GetClientAbsOrigin(int client, float vec[3])
Или ещё можно получить позицию так:
PHP:
float position[3];
GetEntPropVector(entity, Prop_Send, "m_vecOrigin", position);

как тпхнуть игрока на респавн его команды
По сути то же самое, только во время начала раунда получить координаты и сохранить в памяти.
PHP:
float g_iPlayerOrigin[MAXPLAYERS+1][3];
public void OnPluginStart()
{
     HookEvent("round_start", Event_OnRoundStart, EventHookMode_PostNoCopy); // postnocopy чтобы не получать параметры этого события (в данном случае они нам не нужны и так будет быстрее)
}

public void Event_OnRoundStart(Event event, const char[] name, bool dontBroadcast)
{
      for (int i = 1; i <= MaxClients; ++i)
      {
          if (IsClientInGame(i) && IsPlayerAlive(i))
                    GetClientAbsOrigin(i, g_iPlayerOrigin[i]); // записали координаты спавна каждого игрока в массив
      }
}

/* Далее используете массив g_iPlayerOrigin */

как определить координаты туда куда смотрит прицел игрока
Здесь посложнее, так как мы должны построить вектор куда смотрит игрок и позицию куда упирается этот вектор. По сути вектор может ещё упираться в бесконечность. По этому хорошим вариантом будет использовать функцию TR_TraceRayEx или TR_TraceRayFilter
Далее код будет выглядеть примерно так:
PHP:
void GetAimPos(int client, float end_origin[3])
{
   float angles[3];
   if (!GetClientEyeAngles(client, angles)) return; // когда не удалось получить углы поворота у клиента.
   float origin[3];
   GetClientEyePosition(client, origin); // позиция глаз клиента
   TR_TraceRayFilter(origin, angles, MASK_SHOT, RayType_Infinite, TraceFilter_Callback, client); // для вычисления конечной точки используем направляющий вектор (RayType_Infinite)
 
   if (!TR_DidHit())
       return; // если не было встречено препятствий, то конечная позиция уходит в бесконечность, следовательно это ошибка
 
   TR_GetEndPosition(end_origin); // если всё успешно получаем конечную точку
}

public bool TraceFilter_Callback(int ent, int mask, any entity)
{
   return entity != ent; // проверяем чтобы игрок не смотрел сам на себя
}
Хороший пример интерполяции сущности в пространстве показан на картинке.

angles - Новый угол взгляда, или NULL_VECTOR по умолчанию. Здесь по идеи должно быть в углах(но хз какой синтаксис)
Функция получения углов поворота клиента:
GetClientAbsAngles и GetClientEyeAngles
Это есть вещественные числа. На картинке это yaw, roll, pitch
 

Вложения

  • 28bf21d3c4a7.jpg
    28bf21d3c4a7.jpg
    11.1 КБ · Просмотры: 86
Последнее редактирование:
Сверху Снизу