Получение индекса по координатам без использования TR_TraceRayFilter

T

Tolyan

Здравствуйте, есть координата в пространстве:
flaot coord[3]; которая находится на каком-то предмете\обьекте
Нужно без использования TR_TraceRayFilter получить индекс этого предмета - это возможно?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
@Tolyan, да. цикл по всем ентити, получение их координат и сравнение (а точнее получение расстояния). + Можно по класснейму отесивать
 
T

Tolyan

@Tolyan, да. цикл по всем ентити, получение их координат и сравнение (а точнее получение расстояния). + Можно по класснейму отесивать
я тоже так и подумал но потом как представлю что там может быть у меня 500 координат и мне нужно каждый entity стравнивать с координатой... аж тошно... сервер не повиснет?


+ Можно по класснейму отесивать - если не затруднит дайте пример как это делать и обьясните что из себя представляет класснейм.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #4
@Tolyan, их может быть 2048.
+ Можно по класснейму отесивать - если не затруднит дайте пример как это делать и обьясните что из себя представляет класснейм.
Ну например если тебе нужно только prop_dynamic найти то в цикле проверяешь:
PHP:
char szClassName[64];
for(int i = 1; i < 2048; ++i)
{
    if(IsValidEntity(i))
    {
        GetEdictClassname(i, szClassName, sizeof(szClassName)); // Получаем класснейм
        if(!strcmp(szClassName, "prop_dynamic"))    // Это prop_dynamic
        {
            // проверяем его координаты
        }
    }
}
Класснейм это класс объекта, который определяет его тип и свойства.
 
T

Tolyan

@Tolyan, их может быть 2048.

Ну например если тебе нужно только prop_dynamic найти то в цикле проверяешь:
PHP:
char szClassName[64];
for(int i = 1; i < 2048; ++i)
{
    if(IsValidEntity(i))
    {
        GetEdictClassname(i, szClassName, sizeof(szClassName)); // Получаем класснейм
        if(!strcmp(szClassName, "prop_dynamic"))    // Это prop_dynamic
        {
            // проверяем его координаты
        }
    }
}
Класснейм это класс объекта, который определяет его тип и свойства.
Некоторые IsValidEntity не обладают координаторами и получить их нельзя.. "prop_dynamic" - обладает координатой и получить ее можно.. мне нужно устроить цикл по всем entity которые обладают координатами, не только по "prop_dynamic"...

можно это сделать?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@Tolyan, можно
юзай HasEntProp · entity · SourceMod Scripting API Reference
PHP:
float pos[3];
char class[64];
for(int i = 1, num = GetMaxEntities(); i <= num; ++i)
{
    if(IsValidEntity(i) && HasEntProp(i, Prop_Send, "m_vecOrigin") && GetEdictClassname(i, class, sizeof(class)))
    {
        GetEntPropVector(i, Prop_Send, "m_vecOrigin", pos);
        ...    // прочий код
    }
}
 
Последнее редактирование:
T

Tolyan

GetMaxEntities() - если это значение 300.. то это значит что сейчас нет энтити на карте с индексом 301 -2048 ? верно?
--- Добавлено позже ---
TR_TraceRayFilter(origin, angles, MASK_SOLID, RayType_Infinite, FilterClient, client);

if (!TR_DidHit())
return false;

new ent = TR_GetEntityIndex();

Скажите пожалуйста таким образом индексы некоторых предметов не выходит получить... считает их стеной.. можно как-то исправить?
--- Добавлено позже ---
upload_2018-3-24_13-26-43.png
 
Последнее редактирование модератором:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #8
@Tolyan, с недавних пор ентити бывают серверные ентити. Про них сервер не отправляет инфу клиентам. Их индексы отрицательные, найти их можно только через
FindEntityByClassname
 
T

Tolyan

@Tolyan, с недавних пор ентити бывают серверные ентити. Про них сервер не отправляет инфу клиентам. Их индексы отрицательные, найти их можно только через
FindEntityByClassname
вы же видите что я бот)) помогите кодом для примера))
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
вообще ближайший проп по положению его нулевой точки можно сделать вот так:
PHP:
int nearest_ent;

for(int i = 1, num = GetMaxEntities(); i <= num; ++i)
{
    if(IsValidEntity(i) && HasEntProp(i, Prop_Send, "m_vecOrigin"))
    {
        static float pos[3], dist, min_dist = 1000000.0;
        GetEntPropVector(i, Prop_Send, "m_vecOrigin", pos);
        dist = GetVectorDistance(coord, pos);
        if(FloatCompare(min_dist, dist) < 1) continue;
        nearest_ent = i;
        min_dist = dist;
    }
}
Но проблема в том, что пропы могут быть разных размеров, нулевая точка может быть не в геометрическом центре пропа (даже не внутри пропа: я встречал пропы с нулевой точкой вне пропа).
Поэтому маленький проп, границы которого находятся дальше от точки этот алгоритм может посчитать ближе, чем большой проп, у которого границы находятся ближе к точке.
Я ещё не вспоминал, что пропы имеют такой параметр как углы поворота, что ещё больше усложняет алгоритм поиска нужного пропа (я пожалуй за такой не возьмусь: я с трехмерными расчётами где учитываются углы как-то не очень).
--- Добавлено позже ---
если нужно тупо удалить проп по прицелу, то можно сделать гораздо проще через GetClientAimTarget()
 
Последнее редактирование:
T

Tolyan

@Tolyan, с недавних пор ентити бывают серверные ентити. Про них сервер не отправляет инфу клиентам. Их индексы отрицательные, найти их можно только через
FindEntityByClassname
они занимают место в ограничении 2048 энтити верно? Скажите пожалуйста как его найти и удалить если я смотрю на его (т.е я его вижу на карте и этот предмет мне нужно убрать) - GetClientAimTarget() показывает на этот предмет -1 (((
--- Добавлено позже ---
@Grey83, ну а если создать тригер какого-то размера и получить все пропы которые находятся в нем?
 
Последнее редактирование модератором:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
@Tolyan,
Чем-то созвучна твоя проблема с моей. Я понял так, на сегодня решения этого вопроса нет, так как нет точного определения самого вопроса.
Одно дело работа с ENT, и совсем другое - работа с "миром", и объектами этого самого мира(созданного в Хаммере).
Видимо сделано это в целях защиты от разрушения и последующего, просто полого краха сервера.
Представь - ты выдернул силами sourcepawn или c++, ну к напримеру, стену из карты Dust2. Что будет? Понятно, что хорошего не будет ничего.
Вот отсюда и эта проблема. Как её решить, лично я пока не знаю. Просто не представляю. По хорошему - мир, это все то, что создано в хаммере, естественно, при создании все объекты в Хаммере имеют свой Id, иначе навряд ли что можно сделать. После компиляции карты в .bsp формат все эти id куда-то спрятаны.
Но решение должно быть, просто есть-ли целесообразность ломать мозг над этой проблемой.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@Tolyan, значит тот проп является частью карты, а не отдельным пропом
Ты же делал так?
PHP:
int ent = GetClientAimTarget(client, false); // без false будет показывать индекс только игроков
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
@Tolyan, значит тот проп является частью карты, а не отдельным пропом
Ты же делал так?
PHP:
int ent = GetClientAimTarget(client, false); // без false будет показывать индекс только игроков
Хаммером карту нужно открыть и посмотреть.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@tonline_kms65_1, то, что только хаммером проматривается, только им и удаляется
В этом случае использовать SM смысла вообще нет
 
Сверху Снизу