Между игроком и предметом что-то есть..

Jafa

Участник
Сообщения
159
Реакции
3
PHP:
{   
            new Float:client_pos[3];
            new Float:prop_pos[3];
           
            GetClientAbsOrigin(cl_index, client_pos);
            GetEntPropVector(prop_index, Prop_Send, "m_vecOrigin", prop_pos);
           
            TR_TraceRayFilter(prop_pos, client_pos, MASK_SOLID, RayType_Infinite, wS_TraceFilter);
            new index = TR_GetEntityIndex();
            if (index < 0)
            {
                PrintToChatAll("1");
                return Plugin_Continue;
            }

            decl Float:end_origin[3]; TR_GetEndPosition(end_origin);
            if (GetVectorDistance(prop_pos, end_origin) >= GetVectorDistance(prop_pos, client_pos))
            {
                PrintToChatAll("2");
                return Plugin_Continue;
            }
}

public bool:wS_TraceFilter(ent, mask, any:killer)
{
    return ent != killer;
}

Здравствуйте форумчане, хочу отловить момент когда между позицией игрока и между позицией пропа что-то есть (стена или другой предмет, или игрок... - что либо)... но никак не выходит, вот мой код на анализ - помогите пожалуйста.
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
967
не проще ли отправлять трейс в определенную точку, а потом проверить, на той ли она точке?
 
  • Мне нравится
Реакции: Jafa

Jafa

Участник
Сообщения
159
Реакции
3
не проще ли отправлять трейс в определенную точку, а потом проверить, на той ли она точке?
возможно, дайте пример пожалуйста.
--- Добавлено позже ---
не проще ли отправлять трейс в определенную точку, а потом проверить, на той ли она точке?
PHP:
TR_TraceRayFilter(prop_pos, client_pos, MASK_SOLID, RayType_Infinite, wS_TraceFilter);
            new index = TR_GetEntityIndex();
            PrintToChat(cl_index, "%d | %d", index, prop_index);

Трейс показываем всегда индекс самого предмета... а нужно чтоб показывал индекс предемета от его до client_pos
 
Последнее редактирование:

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
967
возможно, дайте пример пожалуйста.
--- Добавлено позже ---

PHP:
TR_TraceRayFilter(prop_pos, client_pos, MASK_SOLID, RayType_Infinite, wS_TraceFilter);
            new index = TR_GetEntityIndex();
            PrintToChat(cl_index, "%d | %d", index, prop_index);

Трейс показываем всегда индекс самого предмета... а нужно чтоб показывал индекс предемета от его до client_pos
Возможно он просто застревает в самом себе... В фильтре уже мудрить надо
--- Добавлено позже ---
Ты сравниваешь с параметром data, но его не указываешь...
не TR_TraceRayFilter(prop_pos, client_pos, MASK_SOLID, RayType_Infinite, wS_TraceFilter);
а TR_TraceRayFilter(prop_pos, client_pos, MASK_SOLID, RayType_Infinite, wS_TraceFilter, index);
 

Jafa

Участник
Сообщения
159
Реакции
3
TR_TraceRayFilter(prop_pos, client_pos, MASK_SOLID, RayType_Infinite, wS_TraceFilter, prop_index);
new index = TR_GetEntityIndex();
PrintToChat(cl_index, "%d | %d", index, prop_index);

Сработало, но реагирует только на игроков,на стены или коробки - нет... а нужно чтоб реагировало на все препятствия между ними.
 
Последнее редактирование:

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
@Jafa, зачем тебе tr_getentityindex, просто проверяй tr_didhit, тебе же не нужно знать индекс того, на ком остановился луч.
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
@Jafa, эту булевое значение. Луч может упереться в игрока, у которого ты берёшь координаты. Ты помни, что у него диаметр 25 юнитов, то бишь он прежде чем дойти до конечной координаты, сталкивается с целью, и возращает тебе true, т.к. встретил его коллизию. В этом случае можешь после TR_DidHit сделать if(TR_GetEntityIndex() != prop_index)

if(TR_DidHit())

Return:
True if any collision found, otherwise false. (Возвращает true если была найдена любая коллизия (банально стена), в противном случае false)
Main - SourceMod Scripting API Reference
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

Jafa

Участник
Сообщения
159
Реакции
3
посмотрел и сделал точно также с 1 поправкой :

ВМЕСТО ЭТОГО
GetClientEyePosition(killer, killer_origin); GetClientEyeAngles(killer, x_origin);
TR_TraceRayFilter(killer_origin, x_origin, MASK_SOLID, RayType_Infinite, wS_TraceFilter, killer);

делаю так потому что мне

GetClientAbsOrigin(cl_index, client_pos);
GetEntPropVector(prop_index, Prop_Send, "m_vecOrigin", prop_pos);

TR_TraceRayFilter(prop_pos, client_pos, MASK_SOLID, RayType_Infinite, wS_TraceFilter, prop_index);


В результате:
new index = TR_GetEntityIndex();
PrintToChat(cl_index, "Индекс препятствия: %d ", index,);

Вывод сообщения - 0 всгда за исключением когда между игроками есть другой игрок, мне же нужно отловить стены и любые другие препятствия. ничерта не получается(
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
посмотрел и сделал точно также с 1 поправкой :

ВМЕСТО ЭТОГО
GetClientEyePosition(killer, killer_origin); GetClientEyeAngles(killer, x_origin);
TR_TraceRayFilter(killer_origin, x_origin, MASK_SOLID, RayType_Infinite, wS_TraceFilter, killer);

делаю так потому что мне

GetClientAbsOrigin(cl_index, client_pos);
GetEntPropVector(prop_index, Prop_Send, "m_vecOrigin", prop_pos);

TR_TraceRayFilter(prop_pos, client_pos, MASK_SOLID, RayType_Infinite, wS_TraceFilter, prop_index);


В результате:
new index = TR_GetEntityIndex();
PrintToChat(cl_index, "Индекс препятствия: %d ", index,);

Вывод сообщения - 0 всгда за исключением когда между игроками есть другой игрок, мне же нужно отловить стены и любые другие препятствия. ничерта не получается(
PHP:
{  
        float client_pos[3];
        float prop_pos[3];
      
        GetClientAbsOrigin(cl_index, client_pos);
        GetEntPropVector(prop_index, Prop_Send, "m_vecOrigin", prop_pos);
      
        Handle trace = TR_TraceRayFilter(prop_pos, client_pos, MASK_SOLID, RayType_Infinite, wS_TraceFilter);
        if(TR_DidHit(trace))
        {
            if(TR_GetEntityIndex(trace) != prop_index)
            {
                PrintToChatAll("Между игроком и пропом появилась стена");
            }
        }
}

public bool wS_TraceFilter(int ent,int mask, any killer)
{
    return true;
}
 
Последнее редактирование:

Jafa

Участник
Сообщения
159
Реакции
3
PHP:
{ 
        float client_pos[3];
        float prop_pos[3];
     
        GetClientAbsOrigin(cl_index, client_pos);
        GetEntPropVector(prop_index, Prop_Send, "m_vecOrigin", prop_pos);
     
        Handle trace = TR_TraceRayFilter(prop_pos, client_pos, MASK_SOLID, RayType_Infinite, wS_TraceFilter);
        if(TR_DidHit(trace))
        {
            if(TR_GetEntityIndex(trace) != prop_index)
            {
                PrintToChatAll("Между игроком и пропом появилась стена");
            }
        }
}

public bool wS_TraceFilter(int ent,int mask, any killer)
{
    return true;
}
L 01/31/2017 - 13:37:58: [SM] Native "TR_DidHit" reported: Invalid Handle 1 (error 1)
на эту строку - if(TR_DidHit(trace))
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
@Jafa,
PHP:
{   
        float client_pos[3];
        float prop_pos[3];
       
        GetClientAbsOrigin(cl_index, client_pos);
        GetEntPropVector(prop_index, Prop_Send, "m_vecOrigin", prop_pos);
       
        Handle trace = TR_TraceRayFilter(prop_pos, client_pos, MASK_SOLID, RayType_Infinite, wS_TraceFilter, prop_index);
        if(TR_DidHit(trace))
        {
            PrintToChatAll("Между игроком и пропом появилась стена");
        }
}

public bool wS_TraceFilter(int ent,int mask, any prop)
{
    return ent != prop;
}
Чуть поправил код. А SM какой?
 

Jafa

Участник
Сообщения
159
Реакции
3
0 - это и есть игровой мир (пол, стены). -1 - препятствия нет.killer не найден)
когда нет препятствий тоже пишет "0"... даже фиксировал себя и предмет в воздухе - тоже "0".
--- Добавлено позже ---
@Jafa,
PHP:
{ 
        float client_pos[3];
        float prop_pos[3];
     
        GetClientAbsOrigin(cl_index, client_pos);
        GetEntPropVector(prop_index, Prop_Send, "m_vecOrigin", prop_pos);
     
        Handle trace = TR_TraceRayFilter(prop_pos, client_pos, MASK_SOLID, RayType_Infinite, wS_TraceFilter, prop_index);
        if(TR_DidHit(trace))
        {
            PrintToChatAll("Между игроком и пропом появилась стена");
        }
}

public bool wS_TraceFilter(int ent,int mask, any prop)
{
    return ent != prop;
}
Чуть поправил код. А SM какой?
SourceMod Version: 1.7.3-dev+5280 - на сервере.
На каком компилирую - не знаю как глянуть (нет установленого сервера на компе), но точно с новым синтаксисом моя см дружит))
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
Моя ошибка, замени TR_TraceRayFilter на TR_TraceRayFilterEx
 

Jafa

Участник
Сообщения
159
Реакции
3
@Jafa,
PHP:
{  
        float client_pos[3];
        float prop_pos[3];
      
        GetClientAbsOrigin(cl_index, client_pos);
        GetEntPropVector(prop_index, Prop_Send, "m_vecOrigin", prop_pos);
      
        Handle trace = TR_TraceRayFilter(prop_pos, client_pos, MASK_SOLID, RayType_Infinite, wS_TraceFilter, prop_index);
        if(TR_DidHit(trace))
        {
            PrintToChatAll("Между игроком и пропом появилась стена");
        }
}

public bool wS_TraceFilter(int ent,int mask, any prop)
{
    return ent != prop;
}
Чуть поправил код. А SM какой?
Native "TR_DidHit" reported: Invalid Handle 1 (error 1) - по прежнему спамит это в логи.
 
Сверху Снизу