ID по известным координатам
| |
_wS_
|
Дата: Среда, 07.03.2018, 11:38:48 | Сообщение # 16 |
|
Хм той же трассировкой же от дрона до конечной точки. Если по пути будут какие-то ент или стены, то будет столкновение луча и в фильтре будет инфа.
|
|
| |
tonline_kms65
|
Дата: Среда, 07.03.2018, 18:58:36 | Сообщение # 17 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Проверил - просвечивает стены, это у меня за счет ограничения "угла зрения" Дрона, получилось так, что меньше стал через стены видеть. Но ошибка осталась.
Цитата _wS_ ( ) Если по пути будут какие-то ент или стены, то будет столкновение луча и в фильтре будет инфа. Не могу сообразить. Если ENT то понятно, но как стены определить? У меня выдаёт id 61, что это такое, не пойму.
Код TR_TraceHullFilter(dron_pos, spawnPositions[i], {-2.5, -2.5, -2.5}, {2.5, 2.5, 2.5}, MASK_ALL, Filter, ent); // MASK_SOLID_BRUSHONLY TR_GetEndPosition(below); //конечная точка трассировки brush = TR_GetEntityIndex(); // пробовал и так brush = TR_GetPointContents(below);
Сам фильтр, столкновение с ENT.
Код public bool:Filter(entity, contentsMask, any:data){ if(entity != data && entity > MaxClients) return true; return false; } Может быть для стен нужно сделать фильтр так
Код public bool:Filter(entity, contentsMask, any:data){ if(entity == data) return true; return false; }
Гости не могут скачивать файлы
|
Сообщение отредактировал tonline_kms65 - Среда, 07.03.2018, 19:20:35 |
|
| |
_wS_
|
Дата: Среда, 07.03.2018, 20:00:21 | Сообщение # 18 |
|
Стены же почти всегда с индексом 0.
Код public bool:Filter(entity, contentsMask, any:data){ if(entity != data) return true; return false; } Ну и индексы игроков наверно игнорить, логика.
|
|
| |
tonline_kms65
|
Дата: Четверг, 08.03.2018, 02:55:17 | Сообщение # 19 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Цитата _wS_ ( ) Ну и индексы игроков наверно игнорить, логика.
Ну тогда получается делать нужно так:
Код public bool:Filter(entity, contentsMask, any:data){ if(entity == 0) return true; return false; } Игнорируем вообще все ENT(игроки ведь тоже ENT). 0 это консоль. Я, конечно, попробую, но что-то слабо в это верится.
Мне кажется должен быть какой то другой метод. Я не понимаю как работают эти функции. Что передается в contentsMask, data. https://sm.alliedmods.net/new-api/sdktools_trace/__raw Делаю всё в слепую.
Попробовал, не работает. Так же светит через стены. Вот, кстати, одна из причин по которой я сначала хотел вейпоинты делать ENT. С ними конечно было бы проще. Здесь, в sourcepawn. все основано на работе именно с ENT, работа с миром как то упускается. Или я, как обычно, не вижу того, что лежит "у меня под носом".
Гости не могут скачивать файлы
|
Сообщение отредактировал tonline_kms65 - Четверг, 08.03.2018, 03:22:55 |
|
| |
_wS_
|
Дата: Четверг, 08.03.2018, 04:11:34 | Сообщение # 20 |
|
Код public bool:Filter(entity, contentsMask, any:data) { if (entity != data && (entity < 1 || entity > MaxClients)) { if (entity > MaxClients) // игнорим и оружие { decl String:class[32]; return GetEntityClassname(entity, class, sizeof(class)) && StrContains(class, "weapon_", true) != 0; } return true; } return false; }
Цитата _wS_ ( ) Делаю всё в слепую. Сначала пойми как работает функция, потестируй, и потом уже используй)
Цитата tonline_kms65 ( ) Что передается в contentsMask, data. data это индекс танка, который ты передал в функцию, от которого стартует трассировка луча. contentsMask - от этого зависит с чем сможет сталкиваться луч, часто используется MASK_PLAYERSOLID (столкновение со всем, что блокирует движение игрока).
|
|
| |
tonline_kms65
|
Дата: Четверг, 08.03.2018, 07:48:18 | Сообщение # 21 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Цитата _wS_ ( ) public bool:Filter(entity, contentsMask, any:data) { if (entity != data && (entity < 1 || entity > MaxClients)) { if (entity > MaxClients) // игнорим и оружие { decl String:class[32]; return GetEntityClassname(entity, class, sizeof(class)) && StrContains(class, "weapon_", true) != 0; } ..... ...
Не совсем понимаю этого момента: if (entity != data && (entity < 1 || entity > MaxClients)) - игроков и мою ENT(дрона) не трогаем (id ENT игроков 1, 2, 3, 4 ....., 32) if (entity > MaxClients) // игнорим и оружие - зачем эта строка? Мы же уже проигнорировали все ENT что старше(больше) игроков, т.е. вообще все ENT. ID ENT не повторяется. Верхней строкой мы уже все id ENT игнорируем. Какой смысл тогда в имени класса? Этот код просто не будет выполняться. Этот момент мне непонятен - или я что то не так понял, или чего-то не знаю. Если возвращает правду - игнорируется, если ложь- обрабатывается.
В принципе не важно, все равно не работает. Так же просвечивает. Может быть лучше трассировку делать по вектору? Положение Дрона есть. Вектор направления есть.
Код TR_TraceRayFilter(dron_pos, vec, MASK_SOLID, RayType_Infinite, Filter, ent); Я попробую - отпишусь. Хотя сомневаюсь, мне кажется нужно как то по другому делать.
Цитата _wS_ ( ) Сначала пойми как работает функция, потестируй, и потом уже используй) Не поверишь, задрался тестировать уже. Ничего не пойму. Нужно понять сам принцип, а так методом тыка, быстро надоедает и начинает раздражать. Смотреть исходник - опять же время.
Сообщение отредактировал tonline_kms65 - Четверг, 08.03.2018, 07:55:31 |
|
| |
_wS_
|
Дата: Четверг, 08.03.2018, 12:48:26 | Сообщение # 22 |
|
Цитата tonline_kms65 ( ) if (entity > MaxClients) // игнорим и оружие - зачем эта строка? Мы же уже проигнорировали все ENT что старше(больше) игроков, т.е. вообще все ENT. ID ENT не повторяется. Верхней строкой мы уже все id ENT игнорируем. Какой смысл тогда в имени класса? Этот код просто не будет выполняться. Эм, почему не будет выполняться? MaxClients например 32, дрон (data) 100, а entity 150.
Код if (150 != 100 && (150 < 1 || 150 > 32)) // выполняется условие 150 > 32 { if (150 > 32) // и опять оно выполняется, делаем проверку, т.к. не знаем какое из 3х условий выше было true { // раз entity > MaxClients, то это всё что угодно может быть, стена, проп, оружие, граната летящая и тд, вот и отсеиваем ненужные, нам же только стены нужны. }
Цитата tonline_kms65 ( ) Если возвращает правду - игнорируется, если ложь- обрабатывается. true - разрешить столкновение (сможем узнать с чем столкнулось, его координаты (TR_GetEndPosition) и индекс (TR_GetEntityIndex) false - игнорировать столкновение, луч летит дальше.
Только мне помнится что луч летит дальше в любом случае. Создай 3 ent (пропа каких-нибудь) в одну линию, запусти луч от первого к последнему (z первого и последнего приподними до серидины для удобства). И в фильтре (public bool:Filter) выводи в лог столкновения (entity), а после TR_Trace.. сделай
Код if (TR_DidHit()) { new ent = TR_GetEntityIndex(); decl class[32]; if (ent < 0 || !GetEntityClassname(ent, class, sizeof(class))) class[0] = 0; PrintToChatAll("конечная ent: %d (%s)", ent, class); }
Так и поймешь как работает.
|
|
| |
_R1KO_
|
Дата: Четверг, 08.03.2018, 13:00:59 | Сообщение # 23 |
|
Сообщений: 200
Репутация: 30 [ +/- ]
|
|
tonline_kms65, подбирай необходимую маску трасировки
|
|
| |
tonline_kms65
|
Дата: Четверг, 08.03.2018, 17:17:29 | Сообщение # 24 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Я конечно прошу прощения, или я такой тупой. Еще раз пожалуйста, может быть поумнею. TR_TraceHullFilter(dron_pos, spawnPositions[i], {-2.5, -2.5, -2.5}, {2.5, 2.5, 2.5}, MASK_ALL, Filter, ent); отсюда передаю id - своего Дрона в data(ф-я Filter). ..... .. .
data это созданный мною Дрон, я его передаю в эту ф-ю. (если честно, я думал это какие-то параметры (any:), а entity это и есть мой Дрон) contentsMask - это я так понимаю маска (MASK_ALL) тогда что такое entity в этой фунуции? Если я сейчас правильно понял, это то препятствие, с которым происходит столкновение? тогда как точка может быть этой entity? Вообще запутался. Смотри - если id стена(браш) = 0, то смысл тогда вообще заниматься остальными ENT? Игнорировать все что больше 0 и то что меньше 0. Вот не пойму. зачем эта возня с игнорирование отдельных ENT?
public bool:Filter(entity, contentsMask, any:data){ if (entity != data && (entity < 1 || entity > MaxClients)){ // например стена = 0. Если (0!=дрон и (0<1или 0>32)) по идее стена не может быть больше 0, стена не ENT, у неё нет id. вот и получаю такое if (entity == 0) return true; else return false; ...... ... ..
Цитата _R1KO_ ( ) tonline_kms65, подбирай необходимую маску трасировки Я уже всё перепробовал. Всё это отлично работает для ENT, и фильтр работает отлично для ENT. Я не могу сообразить как это переделать для работы с просто точкой. У точки нет id, у неё вообще ничего нет кроме координат. Есть конечно такой костыльный вариант, временно создавать ENT(типа info_target) на месте координат точки. Поработать с info_target и по окончании убивать, аналог временных ENT TE_ Может быть нужны какие-то функции из SDK Hammer, там то точно у брашей всё есть, и id и имя и т.д.
Сообщение отредактировал tonline_kms65 - Четверг, 08.03.2018, 17:37:48 |
|
| |
_wS_
|
Дата: Четверг, 08.03.2018, 18:32:15 | Сообщение # 25 |
|
Цитата tonline_kms65 ( ) тогда что такое entity в этой фунуции? Если я сейчас правильно понял, это то препятствие, с которым происходит столкновение? Да
Цитата tonline_kms65 ( ) Смотри - если id стена(браш) = 0, то смысл тогда вообще заниматься остальными ENT? Индекс стены (entity) может быть > 0.
Цитата tonline_kms65 ( ) тогда как точка может быть этой entity? Вообще запутался. 1. dron_pos - позиция дрона 2. spawnPositions[i] - куда хотим его направить 3. Глобальная переменная new bool:g_bEstPrepyatstvie;
Код g_bEstPrepyatstvie = false; TR_TraceHullFilter(dron_pos, spawnPositions[i], ... if (!g_bEstPrepyatstvie && TR_DidHit()) { // препятствий нет }
public bool:Filter(entity, contentsMask, any:dron) // на contentsMask здесь не смотри, она нафиг не нужна { if (entity < 1 || (entity > MaxClients && entity != dron)) // можно ещё индексы игроков добавить, сам смотри { g_bEstPrepyatstvie = true; return false; } return true; }
|
|
| |
tonline_kms65
|
Дата: Суббота, 24.03.2018, 20:20:17 | Сообщение # 26 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Нашел из Hammer, на Игрока:
Код GetEntInfo(client){ new entId = GetClientAimTarget(client, false); if (entId != -1){ int hammerInt = GetEntProp (entId, Prop_Data, "m_iHammerID"); PrintToChat(client, "hammer Id is %i", hammerInt); } else PrintToChat(client, "No entities found.") }
Стены не видит.
Добавлено (09.03.2018, 23:56:24) --------------------------------------------- _wS_, К сожалению не работает. Я на буржуйском сайте вопрос этот задал, интересно, что там ответят. -------------------------------------------- https://forums.alliedmods.net/showthread.php?p=2582155#post2582155
--------------------------------------------- Добавлено (12.03.2018, 16:30:42) --------------------------------------------- Со стенами пока не разобрался. Думаю, буду делать или сравнением координат, или сравнением длин векторов. https://youtu.be/Yc3C8jQ_fM4Добавлено (24.03.2018, 20:20:17) --------------------------------------------- -------------------------------------------------------- https://youtu.be/jjwsTpPdYRo
Сообщение отредактировал tonline_kms65 - Понедельник, 12.03.2018, 16:45:41 |
|
| |
|