| 
 
 
	
		
		
			| Как управлять одновременно 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 |  |   | Ты наверно запоминаешь только один индекс и потом его перезаписываешь.Можно так попробовать:
 
 
 Код // хукаем OnUser1HookSingleEntityOutput(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 это просто для примера -> как не перезаписывать инфу.
 Ок. Понятно.
 Я думал это что то незнакомое. Загрузился. Спасибо за инфо.
 |  |  |  |  |  
 |