Хотелось бы знать какие пути решения без использования отдельных массивов/хэштэйбла видит кто-либо для разрешения ситуации следующего характера:
Скилл поражает цели в выбранной зоне и оставляет даммика, находясь возле которого юниты, задетые заклинанием, получают урон. В один момент времени может существовать хоть с десяток таких даммиков, но они должны наносить повреждения лишь целям, задетыми заклинанием их создателя. Проверка на бафф не актуальна, поскольку два таких кастера будут перебивать баффы друг друга.
В данный момент под каждый каст скилла выделяется перерабатываемая группа на время жизни этого скилла, которая содержит юнитов, задетых этим конкретным кастом, а также группа, содержащие все цели, пораженные этими же заклинаниями кастера. Поскольку нельзя добавить в группу юнита, который уже содержится в ней, нерешенным остается вопрос о том, как же удалять юнита из второй группы, только когда он не содержится в первых группах. Сейчас на ум приходит только выделение, скажем, 64 перерабатываемых элементов параллельных массивов юнит+интегер, куда в интегер записывается число групп, в которых содержится юнит. Солюшн весьма хреновый, поскольку придется каждый раз искать этого юнита в 64 элементах массива...
`
ОЖИДАНИЕ РЕКЛАМЫ...
26
которая содержит юнитов, задетых этим конкретным кастом, а также группа, содержащие все цели, пораженные этими же заклинаниями кастера
и зачем тебе 2 группы? храни одну на каждого игрока
28
немного не понял по поводу того что должно быть
1 каст спелла - 1 даммик?
если 2 спела одновременно попали на 1 юнита то они оба дамажат или только 1 из них?
18
nvc123, Стакающийся эффект.
разве баффы нельзя разбить на лвлы? Тогда и лвл баффа юзать как множитель.
21
Если урон от одного игрока складывается при нескольких применениях скила, то:
КОгда кастуется эта способность, делам переменную типа integer cast count = cast count +1
Юнит кастер[cast count] = GetSpellAbilityUnit()
Группа юнитов[cast count] = юниты которых надо дамажить
И в триггере с переодиком через цикл перебираем от 1 до cast count
в нём перебираем юнитов в определённой группе и в каждой группе наносим урон от кастера всем юнитам в этой группе.
В итоге: способность можно кастовать любое количество раз, разными героями, а также складывается урон от 1 перса.
Если нужно, чтобы урон не складывался, то тогда для одного героя 1 группа, или проще для игрока, так как герой такой у игрока будет 1 скорее всего
Hate:
храни одну на каждого игрока
20
немного не понял по поводу того что должно быть
1 каст спелла - 1 даммик?
если 2 спела одновременно попали на 1 юнита то они оба дамажат или только 1 из них?
Тогда дамажат с течением времени оба даммика. Если было бы скастованно в одну точку 2 таких скилла и лишь один из них задел бы цель - цель бы получала урон от обоих даммиков. Если ни одного - могла бы спокойно гулять возле даммиков. Если бы два разных кастера скастовали скилл в одну точку и только один из них задел бы цель - цель получала бы урон от даммика кастера, который ее задел.
Proshel_Doty:
Если урон от одного игрока складывается при нескольких применениях скила, то:
КОгда кастуется эта способность, делам переменную типа integer cast count = cast count +1
Юнит кастер[cast count] = GetSpellAbilityUnit()
Группа юнитов[cast count] = юниты которых надо дамажить
И в триггере с переодиком через цикл перебираем от 1 до cast count
в нём перебираем юнитов в определённой группе и в каждой группе наносим урон от кастера всем юнитам в этой группе.
В итоге: способность можно кастовать любое количество раз, разными героями, а также складывается урон от 1 перса.
Если нужно, чтобы урон не складывался, то тогда для одного героя 1 группа, или проще для игрока, так как герой такой у игрока будет 1 скорее всего
Hate:
храни одну на каждого игрока
Во-первых, я с тем же успехом наношу урон от даммиков через ForGroup внутри ForGroup.
Во-вторых, суть именно том, чтобы попав под бафф такого каста юнит старался избегать созданных даммиков до окончания времени действия мнимого баффа. Мнимого - поскольку реальный бафф будет перебиваться, например, таким же юнитом союзника. Если желаемого адекватного решения возникшей проблемы не возникнет - скорее всего прибегну к этому решению.
mishanka122:
nvc123, Стакающийся эффект.
разве баффы нельзя разбить на лвлы? Тогда и лвл баффа юзать как множитель.
Как упоминалось в этом посте - такой вариант реализации не желателен.
21
Во-вторых, суть именно том, чтобы попав под бафф такого каста юнит старался избегать созданных даммиков до окончания времени действия мнимого баффа. Мнимого - поскольку реальный бафф будет перебиваться, например, таким же юнитом союзника. Если желаемого адекватного решения возникшей проблемы не возникнет - скорее всего прибегну к этому решению.
Честно, ничего не понял
Особенно сути этих даммиков, ты бы хоть способность описал, что она делает...
Diaboliko:
наношу урон от даммиков
Я бы так не делал, хотя бы потому, что тогда такой предмет как Octarine Core как в доте2 (ну суть понятна - хилит от способностей) не будет просто хилить героя из-за того, что не он наносит урон.
Это на всякий, а пока ещё раз скажу, что вообще не понятно, что за способность ты делаешь и суть этих даммиков
Кинь описание
20
Diaboliko:
наношу урон от даммиков
Я бы так не делал, хотя бы потому, что тогда такой предмет как Octarine Core как в доте2 (ну суть понятна - хилит от способностей) не будет просто хилить героя из-за того, что не он наносит урон.
Внезапно решается базами данных. Я храню в UnitUserData юнитов их позицию в БД, а в UnitUserData даммиков, являющихся снарядами и прочей подобной фигней - позицию в БД их создателя. Ссылка на даммиков в БД хранится в таймерах, использующих их. Для мгновенного урона также есть два даммика, которые постоянно меняют владельца перед нанесением урона. Первый - для блокируемого урона, второй - для не блокируемого.
Попытка описать дубль два:
Герой кидает молнию
да, да, привет фанатам дарк соулс //
Она задевает огра мага в момент достижения указанной точки
На месте взрыва появляется даммик, к которому этот огр притягивается, при этом ему наносится урон. При текущей реализации огр будет притягиваться лишь к тем даммикам, которые, грубо говоря, задели его своим появлением(если его заденет снаряд во время полета или непосредственный взрыв). Задумка в том, чтобы подвергнуть огра эффекту двух таких даммиков, если его заденет хотя-бы один каст. Проблема реализации через баффы в том, что два и более таких персонажей, будучи союзниками, засрут все поле боя и будут держать всех противников под дебаффом.
Загруженные файлы
21
Для мгновенного урона также есть два даммика, которые постоянно меняют владельца перед нанесением урона. Первый - для блокируемого урона, второй - для не блокируемого.
При чём тут владелец
Когда урон надо наносить от определённого юнита - кастера, т.е. героя в данном случае
Proshel_Doty:
Я бы так не делал, хотя бы потому, что тогда такой предмет как Octarine Core как в доте2 (ну суть понятна - хилит от способностей) не будет просто хилить героя из-за того, что не он наносит урон.
20
При чём тут владелец
Когда урон надо наносить от определённого юнита - кастера, т.е. героя в данном случае
Proshel_Doty:
Я бы так не делал, хотя бы потому, что тогда такой предмет как Octarine Core как в доте2 (ну суть понятна - хилит от способностей) не будет просто хилить героя из-за того, что не он наносит урон.
Поскольку я знаю что даммика создал конкретный юнит под нужды нанесения урона - я утверждаю что урон, в итоге, наносит этот конкретный юнит. Если я захочу прохилить этого юнита - у меня есть ссылка на него в UnitUserData даммика.
Однако я бы предпочел услышать в этом конкретном топике мысли по решению возникшей у меня задачи. Если хочется дальше поспорить о превосходстве гибкости метода нанесения всего магического урона от даммика против нанесения урона от того же юнита - пиши в ЛС.
28
Diaboliko, насколько я понял ситуация следующая
есть 2 юнита-кастера C1 и C2 являющихся союзниками
C1 кастует этот спел и задевает вражеского юнита T
создаётся даммик D1
C2 кастует этот спел и не задевает вражеского юнита T
создаётся даммик D2
в результате D1 наносит урон T если T находится в радиусе досягаемости D1
и D2 наносит урон T если T находится в радиусе досягаемости D2
да или нет?
20
в результате D1 наносит урон T если T находится в радиусе досягаемости D1
и D2 наносит урон T если T находится в радиусе досягаемости D2
да или нет?
Это как раз тот солюшн, которого я хочу избежать. D2 не должен наносить урон T, поскольку сам каст его не задел. Такое поведение в данный момент реализовано в рамках каждого каста. Если каст задевает юнита - даммик этого каста будет наносить задетому юниту урон. Сабж в том чтобы если персонаж применяет дважды этот скилл и задевает противника T лишь одним из них, то даммики D1 и D2, созданные по итогам применения обоих кастов наносили этому юниту урон. Проблема именно в ведении счета того, сколько раз юнит был добавлен в эту "глобальную" группу, содержащую всех юнитов, которых своими кастами задел этот персонаж.
В прочем, спустя два дня тыканья палкой, я уже уверен что "красивого" решения здесь нет. Разве что я что-то упускаю...
26
в результате D1 наносит урон T если T находится в радиусе досягаемости D1
и D2 наносит урон T если T находится в радиусе досягаемости D2
Сабж в том чтобы если персонаж применяет дважды этот скилл и задевает противника T лишь одним из них, то даммики D1 и D2, созданные по итогам применения обоих кастов наносили этому юниту урон.
разве это не противоречие самому себе?
лично мне до сих пор непонятно как должно работать и как работает сейчас.
20
разве это не противоречие самому себе?
В первой цитате говорилось о двух разных кастерах.
Сейчас касты работают каждый сами по себе(задел кастом - даммик будет дпсить), но от задевания одним кастом, даммику, появившемуся от другого каста, ни горячо, ни холодно.
Этот комментарий удален
29
Кто-нибудь уже объяснил зачем нужна глобальная группа?
Есть такое понятие как скоупинг. В чем проблема использовать одну группу на один каст? Я что-то не так понял?
26
Doc:
Кто-нибудь уже объяснил зачем нужна глобальная группа?
Есть такое понятие как скоупинг. В чем проблема использовать одну группу на один каст? Я что-то не так понял?
Hate:
и зачем тебе 2 группы? храни одну на каждого игрока
я с самого начала задал этот вопрос
22
Сабж в том чтобы если персонаж применяет дважды этот скилл и задевает противника T лишь одним из них, то даммики D1 и D2, созданные по итогам применения обоих кастов наносили этому юниту урон.
Создавать группу для каждого кастера в которой хранить задетых юнитов
Каждую сек. очищаем группу, далее каждый даммик перебирает юнитов вокруг себя добавляя их в группу, затем каждый даммик перебирает группу нанося урон
20
Doc:
Кто-нибудь уже объяснил зачем нужна глобальная группа?
Есть такое понятие как скоупинг. В чем проблема использовать одну группу на один каст? Я что-то не так понял?
Одна группа на один каст имеется. Глобальная группа выделяется для каждого такого юнита дабы при добавлении в первую группу, юнит также добавлялся в глобальную. При поиске целей для нанесения урона от даммика используется глобальная группа(дабы обеспечить желаемый эффект двух войд-зон, дамажащих юнитов, задетых хотя бы одним кастом своего кастера). Первая упомянутая в этом посте группа (назовем ее локальной, т.к. используется в рамках 1 каста) нужна для удаления из глобальной всех юнитов, содержащихся в ней(своего рода удаление дебаффа без использования оного).
Опять же - единственный солюшн, который я вижу - использовать 2 параллельных массива(юнит+интегер), где массив юнитов заменит глобальную группу, а параллельный этому массиву массив интегеров будет работать как счетчик. Недостаток этого метода в необходимости искать задетых каждым следующим кастом юнитов из массива юнитов.
Если этого описания все еще недостаточно, то пора закрывать эту тему -_-
В общем, прибегнул к эмуляции группы юнитов через цикл + два параллельных массива, пространство которых выделяется под кастеров этого заклинания.
28
Diaboliko, крайне кривое решение
не проще ли создать 2 структуры
1 содержит группу всех задетых юнитов и крепится к кастеру
2 содержит оставшееся время баффа, даммика который наносит урон и структуру 1 и крепится к юнитам попавшим под спелл
20
nvc123:
Diaboliko, крайне кривое решение
не проще ли создать 2 структуры
1 содержит группу всех задетых юнитов и крепится к кастеру
2 содержит оставшееся время баффа, даммика который наносит урон и структуру 1 и крепится к юнитам попавшим под спелл
Что, ятп, преобразуется как раз в несколько параллельных массивов, пространство которых выделяется под юнитов, попавших под спелл.
28
преобразуется как раз в несколько параллельных массивов
и что в этом плохого?
Diaboliko:
пространство которых выделяется под юнитов, попавших под спелл
тут вообще бред
20
nvc123:
преобразуется как раз в несколько параллельных массивов
и что в этом плохого?
Ятп, что предлагаемое тобой решение заключается в создании нескольких массивов чисто под этот спелл. В прочем, я не до конца понимаю во что превратятся такие структуры в конечном итоге. :>
Дубль 2: Ятп,
nvc123:
2 содержит оставшееся время баффа, даммика который наносит урон и структуру 1 и крепится к юнитам попавшим под спелл
что здесь крепление к юнитам, попавшим под спелл, подразумевает крепление ко всем и сразу, т.е. к группе юнитов внутри структуры, а также обработки этих структур из под единственного таймера. Как раз в этой ситуации я и прибег к своим костылям. Как ты собрался удалять юнита из структуры 1, если он содержится в двух структурах 2(задет двумя кастами)? Как узнать что время действующего на него лжебаффа закончилось во всех структурах 2 типа? Только перебором.
28
даммиков кстати лучше хранить не во 2 а в 1 структуре
Diaboliko:
Как ты собрался удалять юнита из структуры 1, если он содержится в двух структурах 2(задет двумя кастами)?
перебираем по таймеру все структуры 2 и уменьшаем оставшееся время
если время равно 0 то удаляем экземпляр
Diaboliko:
Как узнать что время действующего на него лжебаффа закончилось во всех структурах 2 типа?
а это зачем?
если бафы от 1 кастера то просто обновляется время
а если от разных то они действую порознь
Diaboliko:
Только перебором
тут как не крути будет перебор всех бафов по таймеру
20
nvc123, тогда я не понимаю почему ты назвал мое решение кривым. Каким ты увидил принцип работы?
Просто я все больше вижу в твоем решении свое. Подход немного другой, но в целом - я делаю тоже самое. Я храню в массиве из 64 элементов(сохранив ссылку на выделенное пространство там, где надо) информацию о числе задеваний таргета Т1 кастами кастера C1. Прогоняюсь через этот массив каждый раз при непосредственном задевании дабы увеличить или уменьшить счетчик, плюс при проверке на нахождение целей вблизи даммиков для нанесения урона. Уменьшаю этот счетчик при звонке таймера на окончание действие дебаффа(/жизни даммика). Считай тот же отсчет времени дебаффа. Таймер реализован как отдельный поток работы одного глобального, так что использую ресурсы, находящиеся в простОе.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.