Как управлять одновременно 2 и более ENT.
| |
tonline_kms65
|
Дата: Воскресенье, 05.03.2017, 16:54:43 | Сообщение # 1 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Еще один вопрос появился. Мне нужно управлять независимо друг от друга двумя или более ENT. Для примера - полетели 2 ракеты, обе с автонаведением. Вылетают с небольшой разницей по времени запуска. Последняя ракета естественно управляется, а управление первой теряется и она становится просто физ, объектом, падает, ударяется, отскакивает и в конце концов просто самоуничтожается. Или проще - есть 2 противника, полетели 2 ракеты с автонаведением, одна гоняется за первым противником, вторая за вторым противником, все это одновременно..
Вот и сам вопрос - как управлять и первой ракетой и одновременно (независимо) второй. Что то у меня в мозгу никак не укладывается как это можно сделать. Что то не допонимаю. Не нужен программный код, а нужен принцип, как это возможно сделать.
Гости не могут скачивать файлы
|
Сообщение отредактировал tonline_kms65 - Воскресенье, 05.03.2017, 17:48:36 |
|
| |
_wS_
|
Дата: Воскресенье, 05.03.2017, 18:27:17 | Сообщение # 2 |
|
Ты наверно запоминаешь только один индекс и потом его перезаписываешь. Можно так попробовать:
Код // хукаем OnUser1 HookSingleEntityOutput(entity, "OnUser1", OnUser1_CallBack, false);
// заставляем entity делать OnUser1 каждые 0.1 сек - это бесконечный цикл, пока entity жива SetVariantString("OnUser1 !self:FireUser1::0.1:0"); AcceptEntityInput(entity, "AddOutput"); AcceptEntityInput(entity, "FireUser1");
public OnUser1_CallBack(const String:output[], entity, activator, Float:delay) { // ну и тут рулим индексом entity }
|
|
| |
tonline_kms65
|
Дата: Понедельник, 06.03.2017, 07:43:18 | Сообщение # 3 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Цитата _wS_ ( )
Интересно. Конечно попробую. Простой вариант, но не совсем то что я хотел. Хочу попробовать именно из updater'а (типа OnGameFrame или OnPlayerRunCmd) управлять ENT. Сам принцип хочу понять. Кстати, 0.1 это не мало?
Может быть есть еще мысли как сделать?
Добавлено (06.03.2017, 05:59:49) ---------------------------------------------
Цитата _wS_ ( ) Ты наверно запоминаешь только один индекс и потом его перезаписываешь. Вот этот момент меня заинтересовал. Я сомневаюсь в этом, при создании и уничтожении ракеты я вывожу инфо. к чат и консоль, ID ракеты. ID ракеты при создании и уничтожении одно и то-же. Неважно сколько ракет запущенно (создано), у каждой свой ID от начала и до конца. Возможно я что то не так понял в самом вопросе.
Добавлено (06.03.2017, 07:43:18) --------------------------------------------- Слушай, работает! Это для меня новый вид своеобразного таймера. В смысле работает само движение ENT. Хоть 0,1 сек. и маловато (движения дергает) но для ракеты вполне пойдет.
Для полного счастья хорошо было бы передать в функцию ID не одной а двух (или более) ENT. HookSingleEntityOutput(entity, "OnUser1", OnUser1_CallBack, false);
Как сюда передаются параметры? Как здесь мы получаем activator'а? OnUser1_CallBack(const String:output[], entity, activator, Float:delay) Возможно ли вместо ID activator (так понимаю client) получить ID нужной мне ENT.
Пошел по проверенному пути, в тело "OnUser1_CallBack" вставил определение свой-чужой, задание векторов и т.д. Результат: https://youtu.be/xg2qJyGUa2I
Огромное НО. Если часто пускать ракеты - контра вылетает, напрочь. Пока не пойму причину. Возможно из-за предела 0.1. Не успевает отследить. Это как вариант.
Сообщение отредактировал tonline_kms65 - Понедельник, 06.03.2017, 16:01:28 |
|
| |
_wS_
|
Дата: Понедельник, 06.03.2017, 16:08:27 | Сообщение # 4 |
|
Цитата tonline_kms65 ( ) Хоть 0,1 сек. и маловато (движения дергает) но для ракеты вполне пойдет. Можно же и 0.01 поставить =) Хотя я не знаю, может есть лимит минимального значения, но попробовать стоит, если это нужно.
Цитата tonline_kms65 ( ) хорошо было бы передать в функцию ID не одной а двух (или более) ENT Нельзя, параметры OnUser1_CallBack могут быть только такими.
Цитата tonline_kms65 ( ) Возможно ли вместо ID activator (так понимаю client) получить ID нужной мне ENT. FireUser1 делает entity (ракета) сама на себе, поэтому entity = activator.
Цитата tonline_kms65 ( ) Неважно сколько ракет запущенно (создано), у каждой свой ID от начала и до конца. Возможно я что то не так понял в самом вопросе. Я имею в виду -> Чтобы управлять ракетой, ты же запоминаешь её индекс? g_Index = entity. И если создание следующей ракеты тоже будет g_Index = entity, то конечно инфа о первом индексе теряется и ты управляешь только последней созданной ракетой. Нужно делать примерно так:
Код new Handle:g_IndexAr; public OnPluginStart() g_IndexAr = CreateArray(1); round_start() и map_start() ClearArray(g_IndexAr);
создание_ракеты() { new entity = .. if (FindValueInArray(g_IndexAr, entity) < 0) PushArrayCell(g_IndexAr, entity); }
управление_ракетой() { new rocket_count = GetArraySize(g_IndexAr); // лучше вывести в глобал переменную, т.к. функция часто вызывается
static i, entity; for (i = 0; i < rocket_count; i++) { entity = GetArrayCell(g_IndexAr, i);
// всё, рулим ракетой с индексом entity } }
public OnEntityDestroyed(entity) { new i = FindValueInArray(g_IndexAr, entity); if (i > -1) RemoveFromArray(g_IndexAr, i); } Возможно не индекс перезаписываешь, а какой-то другой параметр, от которого зависит ракета.
|
|
| |
tonline_kms65
|
Дата: Вторник, 14.03.2017, 16:50:28 | Сообщение # 5 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Вот что выяснил в процессе своего эксперимента: OnUser1_CallBack(const String:output[], entity, activator, Float:delay) entity - сама ENT (у меня это ракета) activator - это то, во что она ударилась и взорвалась(у меня это либо браш(id 0), либо игрок(бот), либо любая другая ENT). Проще, это то, с чем произошло взаимодействие entity.
УПС. Прошу прошения. Это я для HookSingleEntityOutput(ent, "OnHealthChanged", _Hurt, false);
Насчет этого - мне нужно все обдумать. Пока не могу сообразить.
Цитата _wS_ ( ) Возможно я путаю индекс энтитьки с её ID, отсюда и все мои головняки.Добавлено (14.03.2017, 16:50:28) --------------------------------------------- Не могу догнать - чем g_IndexAr = CreateArray(1); отличается от например g_IndexAr[MAXPLAYERS+1][MAX_ENT]. Это ведь тоже массив. Причем двухмерный массив. Я правда не уверен что он полноценный, как например в с++. Но по моему это обычный двухмерный массив. Есть имя массива[есть индекс элементов]. В чем отличие?
Сообщение отредактировал tonline_kms65 - Понедельник, 06.03.2017, 18:47:20 |
|
| |
_wS_
|
Дата: Вторник, 14.03.2017, 17:10:02 | Сообщение # 6 |
|
Ну, например, в CreateArray уже есть нужные индексы, а в MAX_ENT надо проходиться большим циклом по всем индексам и искать нужные. И похоже CreateArray будет есть меньше памяти. Хотя если ты обходишься без этого большого цикла, то твой вариант наверно лучше, я прост не знаю как ты используешь этот двумерный массив, array это просто для примера -> как не перезаписывать инфу.
|
|
| |
tonline_kms65
|
Дата: Вторник, 14.03.2017, 23:11:48 | Сообщение # 7 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Цитата _wS_ ( ) Ну, например, в CreateArray уже есть нужные индексы, а в MAX_ENT надо проходиться большим циклом по всем индексам и искать нужные. И похоже CreateArray будет есть меньше памяти. Хотя если ты обходишься без этого большого цикла, то твой вариант наверно лучше, я прост не знаю как ты используешь этот двумерный массив, array это просто для примера -> как не перезаписывать инфу.
Ок. Понятно. Я думал это что то незнакомое. Загрузился. Спасибо за инфо.
|
|
| |
|