Добавлен Jack-of-shadow
"Бафф" в ковычках, т.к. мне требуется только таймер, и ссылка на функцию.
Что то вроде:
Что то вроде:
код
есть родительский класс бафф
инициализация чилд классов
BuffIni(){
Buff(1,func)
Buff(2,func)
..//ид класса, функция
}
инициализация чилд классов
BuffIni(){
Buff(1,func)
Buff(2,func)
..//ид класса, функция
}
функция добавления бафа юниту:
AddBuff(integer unitid, integer buffid, real time){
если юнит имеет бафф то продлеваем жизнь таймера
if IsUnitHasBuff(unitid,buffid) {
добавить время таймеру
}else{
создать бафф с таймером
создать эффект и привязать к ид юнита (юзер дата)
выполнить функцию бафа
}
если юнит имеет бафф то продлеваем жизнь таймера
if IsUnitHasBuff(unitid,buffid) {
добавить время таймеру
}else{
создать бафф с таймером
создать эффект и привязать к ид юнита (юзер дата)
выполнить функцию бафа
}
Функция удаления
DestroyBuff(integer unitid, integer buffid){
выполнить функциию удаления бафа
}
DestroyBuff(integer unitid, integer buffid){
выполнить функциию удаления бафа
}
Использую подобную системку, слегка кривую.. для способностей, реализованную через хеш и массив триггеров с передачей аргументов через глобалки.
Баффов же у меня было до этого былр немного, и использовались примитивные заглушки. Однако в последнее время их кол-во стало разрастается, поэтому появилась необходимость в нормальной системе.
Отсюда вопрос. Может я велосипед изобретаю, и есть ли готовые решения?
Не особо смотрел раньше в сторону структур, хотя может и зря, но проблема то в основном с ссылкой на функцию, так как тип code с массивом не работает.
Принятый ответ
Нет универсальных решений нет и врятли будут, тут все надо своими руками, лучше для некоторых баффов юзать триггеры чтобы отследить смерть событием TriggerRegisterDeathEvent а так же применение диспелящих способностей на цель, либо самой целью.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
В карте, что я сейчас делаю, отличная система кастомных баффов (баффы WarCraft 3 я не использую вообще). Её я собираюсь выложить и рассказать, когда создам проект на XGM.
Система долго эволюционировала, потому человеку, который её никогда не видел, возможно будет сложно её понять.
Есть структура MinionBuff, в ней есть следующие функции.
Примеры баффов.
Отредактирован PT153
Что же касается вопроса простоты и удобства - дело личное. Мне было удобнее сделать так.
Я не показал БД, где прописываются свойства баффов, потому что не посчитал это нужным. Вопрос ведь про готовые системы баффов. Я ответил, что наличие такой системы зависит от требований к ней. Также я хотел привести рабочий пример псевдомассива code, о чём также спрашивалось.
Для остальных юзалась другая логика. В общем, не то что бы прям мешанина была, для большинства я тупо копировал шаблон и менял атрибуты.
Но столкнулся с проблемой что бафф может быть наложен дважды, и получался просто стак. Но минус в том что висели лишние эффекты.
А простая проверка на имеющийся бафф требовала нахождения таймера который уже мог быть запущен, то бишь нужно было хранить его хендл, а там еще всякие коллизии начинали возникать.
Поэтому захотелось все таки покурить структуры и придумать более изящный вариант.
Отредактирован PT153
А ещё тут пробелы не расставлены.
Немного поэкспериментировал с boolexpr, получилось создать массив функций для баффов через них, не используя даже кэш, раньше делал массив функций через массив триггеров с экзекутом + кеш, для прокачки и использования триггерных спеллов.
globals
constant integer BMax = 50 Макслимальное бафов, 8192/UntitMax = BMax
boolexpr array BCode Функция бафа
timer array BTimer Таймер бафа
integer array BUnitIdArray ид юнита прикрепояемый к тайммеру
integer array BBuffIdArray ид бафа прикрепояемый к бафу
integer array BEffectArray ид эффекта прикрепояемого к бафу
boolean BDestroy = true аттрибут_функции_Удаления бафа
integer BUnitId = 0 аттрибут_функции_Ид юнита
force BForce = CreateForce()
endglobals
timer t = GetExpiredTimer( )
integer i = R2I(TimerGetRemaining(t)+0.5)
BUnitId = BUnitIdArray[i]
BDestroy = true
ForceEnumPlayers(BForce, BCode[BBuffIdArray[i]])
DestroyTimer (t)
}
t = CreateTimer()
TimerStart(t, I2R(b), false, null)
PauseTimer(t)
TimerStart(t, d, false, function BuffEnd )
ForceEnumPlayers (BForce, BCode[BBuffIdArray[b]])
}
integer id = unitid*BMax+buffid
BDestroy = false
BUnitId = unitid
BUnitIdArray [id] = unitid
BBuffIdArray [id] = buffid
BTimerEx(BTimer[id],id,time)
}
endlibrary
if BDestroy {
Msg("Buff1_Destroy"+" for unit "+I2S(BUnitId))
}else{
Msg("Buff1"+" for unit "+I2S(BUnitId))
}
return false
}
if BDestroy {
Msg("Buff2_Destroy"+" for unit "+I2S(BUnitId))
}else{
Msg("Buff2"+" for unit "+I2S(BUnitId))
}
return false
}
BuffIni(1,function Buff1)
BuffIni(2,function Buff2)
}
Отредактирован PT153
Boolexp тоже неплохой вариант. Они могут даже ничего не возвращать (по идее, должны возвращать boolean, но можно возвращать что угодно, всё равно все типы в Jass занимают 4 байта и возвращают то, что записано напротив return. nothing возвращает 0). Можно использовать bj переменную, ты же всё равно ничего не добавляешь в клан.