Корректное получение координат

Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Есть код получения координат игрока:
Код:
#include <amxmodx>
#include <reapi>

enum coords {
    Float:ORIGIN[3],
    Float:ANGLES[3]
}

new Float:g_fCoords[MAX_PLAYERS + 1][coords];

public plugin_init()
{
    RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn_Post", true);
    RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed_Post", true);
}

public CBasePlayer_Spawn_Post(const id)
{
    if(!is_user_alive(id))
        return;

    // get_coords(id); // некорректные данные в координатах
    // [old]Origin[448.000000/2368.000000/-87.000000] Angles[0.000000/255.000000/0.000000]
    // [new]Origin[448.000000/2368.000000/-91.968750] Angles[0.000000/74.926757/0.000000]
   
   
    set_task(0.2, "get_coords", id); // корректные данные
    // [old]Origin[448.000000/2368.000000/-91.968750] Angles[0.000000/-105.001831/0.000000]
    // [new]Origin[448.000000/2368.000000/-91.968750] Angles[0.000000/-105.001831/0.000000]
}

public CBasePlayer_Killed_Post(const id)
{
    new Float:fOrigin[3], Float:fAngles[3];
    get_entvar(id, var_origin, fOrigin);
    get_entvar(id, var_angles, fAngles);
   
    client_print(id, print_chat, "[old]Origin[%f/%f/%f] Angles[%f/%f/%f]", g_fCoords[id][ORIGIN][0], g_fCoords[id][ORIGIN][1], g_fCoords[id][ORIGIN][2], g_fCoords[id][ANGLES][0], g_fCoords[id][ANGLES][1], g_fCoords[id][ANGLES][2]);
    client_print(id, print_chat, "[new]Origin[%f/%f/%f] Angles[%f/%f/%f]", fOrigin[0], fOrigin[1], fOrigin[2], fAngles[0], fAngles[1], fAngles[2]);
}

public get_coords(id)
{
    get_entvar(id, var_origin, g_fCoords[id][ORIGIN]);
    get_entvar(id, var_angles, g_fCoords[id][ANGLES]);
}
Суть проблемы - если получить координаты сразу в спавне(RG_CBasePlayer_Spawn/RG_CSGameRules_PlayerSpawn), то они получаются некорректные относительно тех, которые были получены в RG_CBasePlayer_Killed
Если сделать задержку в 0.2 секунды(на карте de_dus2), то все ок.
Вроде бы вот оно решение... Но как быть с картами типа 35HP, где игрок падает с неба?)
 
Последнее редактирование:
Сообщения
957
Реакции
1,185
Помог
52 раз(а)
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Sonyx, это все очевидное.
но выглядит в коде как кусок гГ..)
вот и думаю, может есть более практичное решение
 
Сообщения
957
Реакции
1,185
Помог
52 раз(а)
Кст, по поводу задержки - не лучше ли юзать просто RG_CSGameRules_GetPlayerSpawnSpot в посте?
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Sonyx, результат:
Код:
[old]Origin[448.000000/2368.000000/-87.000000] Angles[0.000000/255.000000/0.000000]
[new]Origin[448.000000/2368.000000/-91.968750] Angles[0.000000/-105.001831/0.000000]
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Sonyx, пробовал.
такие же как и в post
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
Но как быть с картами типа 35HP, где игрок падает с неба?)
Ну и пусть падает. Зачем z вообще в данном случае. Не думаю, что он умрет со смещением по вертикали)
Код:
L 12/20/2018 - 22:44:46: [new43.amxx] SpawnPost Origin [-736.000000/-704.000000/164.031250] Angles[0.000000/0.000000/0.000000]
L 12/20/2018 - 22:44:54: [new43.amxx] Kill [old]Origin[-736.000000/-704.000000/164.031250] Angles[0.000000/0.000000/0.000000]
L 12/20/2018 - 22:44:54: [new43.amxx] Kill [new]Origin[-736.000000/-704.000000/164.031250] Angles[0.000000/0.000000/0.000000]
Но, это для игрока в состоянии "покоя". Если в него стрельнут, задеть гранатой, пнуть и еще чего- то затея бесполезная
 
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
Действительно Z нет необходимости.
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
начал тестить способ без проверки без Z плоскости и получил интересный лог...
СПАВН | ПРОВЕРКА
Код:
origin 448.000000/2368.000000/-87.000000 | 448.000000/2368.000000/-91.968750
angles 0.000000/255.000000/0.000000 | 0.000000/-105.001831/0.000000
все бы ок, но углы...
 
Последнее редактирование:
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
neygomon, углы одинаковые, нормируй, чтобы были от -180 до 180.
 
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
Работа с углами, базовая - https://stackoverflow.com/a/11498248 [RUS]
а, вот чем я когда-то у себя пользовался. Быть может есть такие уже готовые где-то, но я не видел.
Код:
stock Float: WrapAngle(Float: vAngle_Current)
{
    if(vAngle_Current >= 180.0)
    {
        vAngle_Current -= 360.0;
    }
    else if(vAngle_Current <= -180.0)
    {
        vAngle_Current += 360.0;
    }

    return vAngle_Current;
}
в целом, операция эта с углами называется Wrap Angle
 
Последнее редактирование:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу