Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Как управлять одновременно 2 и более ENT.
Как управлять одновременно 2 и более ENT.
tonline_kms65 Дата: Воскресенье, 05.03.2017, 16:54:43 | Сообщение # 1
Сообщений: 176
Репутация: 2 [ +/- ]
Еще один вопрос появился.
Мне нужно управлять независимо друг от друга двумя или более ENT.
Для примера - полетели 2 ракеты, обе с автонаведением. Вылетают с небольшой разницей по времени запуска. Последняя ракета естественно управляется, а управление первой теряется и она становится просто физ, объектом, падает, ударяется, отскакивает и в конце концов просто самоуничтожается.
Или проще - есть 2 противника, полетели 2 ракеты с автонаведением, одна гоняется за первым противником, вторая за вторым противником, все это одновременно..

Вот и сам вопрос - как управлять и первой ракетой и одновременно (независимо) второй. Что то у меня в мозгу никак не укладывается как это можно сделать. Что то не допонимаю. Не нужен программный код, а нужен принцип, как это возможно сделать.

Прикрепления: 4439923.jpg(369Kb)


Сообщение отредактировал 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
Сообщений: 176
Репутация: 2 [ +/- ]
Цитата _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
Сообщений: 176
Репутация: 2 [ +/- ]
Вот что выяснил в процессе своего эксперимента:
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
Сообщений: 176
Репутация: 2 [ +/- ]
Цитата _wS_ ()
Ну, например, в CreateArray уже есть нужные индексы, а в MAX_ENT надо проходиться большим циклом по всем индексам и искать нужные. И похоже CreateArray будет есть меньше памяти. Хотя если ты обходишься без этого большого цикла, то твой вариант наверно лучше, я прост не знаю как ты используешь этот двумерный массив, array это просто для примера -> как не перезаписывать инфу.


Ок. Понятно.
Я думал это что то незнакомое. Загрузился. Спасибо за инфо.
 
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Как управлять одновременно 2 и более ENT.
Страница 1 из 11
Поиск: