Добавлен KaneThaumaturge
Решил тут код оптимизировать, заменив перебор группы формированием фильтра. Столкнулся с несколькими трудностями.
Есть такой участок кода:
Есть такой участок кода:
private nothing uiClear(){
unit u = GetEnumUnit()
integer id = GetUnitUserData(u)
if GetUnitTypeId(u) == 0 {
GroupRemoveUnit(allUnits, u)
FlushChildHashtable(HT, id)
if dbg {dbgT("clr " + I2S(id))}
}
u = null
}
private nothing uiClearStart(){
ForGroup(allUnits, function uiClear)
}
Нужно как-то сформировать группу уже с имеющийся группой allUnits, но такой нативки я не нашёл. Можно сделать перебором, но тогда какое отличие от исходного варианта.
Принятый ответ
NazarPunk, ну, чтобы рассеивание заклинаний действительно рассеивали их.
Если они сделаны триггерно
И чтоб похищение магии тоже работало корректно
Если они сделаны триггерно
И чтоб похищение магии тоже работало корректно
code
library BuffRemover initializer brInit uses CreekKeepersNeptulonShadow, HashId
private nothing bfActions (){
unit u = GetEnumUnit()
integer id = GetUnitUserData(u)
integer bon = LoadInteger(HT, id, BlessingOfNeptulon_hid)
integer bi
//Благословение Нептулона (рассеивание/окончание)
if (bon > 0) and (GetUnitAbilityLevel(u, 'NSe1') <= 0) and (GetUnitAbilityLevel(u, 'NSe2') <= 0) and (GetUnitAbilityLevel(u, 'NSe3') <= 0){
bonStateDel(u, bon)
}
//Благословение Нептулона (похищение магии)
if (bon <= 0) and ((GetUnitAbilityLevel(u, 'NSe1') > 0) or (GetUnitAbilityLevel(u, 'NSe2') > 0) or (GetUnitAbilityLevel(u, 'NSe3') > 0)) {
if GetUnitAbilityLevel(u, 'NSe1') > 0 {bi = 1}
if GetUnitAbilityLevel(u, 'NSe2') > 0 {bi = 2}
if GetUnitAbilityLevel(u, 'NSe3') > 0 {bi = 3}
bonStateAdd(u, bi)
}
u = null
}
private nothing brActionsStart(){
ForGroup(allUnits, function bfActions)
}
private nothing brInit (){
TimerStart(CreateTimer(), 0.25, true, function brActionsStart)
}
endlibrary
UPD:
Изменил с помощью фильтров. Получилось так:
Изменил с помощью фильтров. Получилось так:
code2
library BuffRemover initializer brInit uses CreekKeepersNeptulonShadow, HashId
//Фильтры
private boolean fBoN_end (){
return (LoadInteger(HT, GetUnitUserData(GetFilterUnit()), BlessingOfNeptulon_hid) > 0) and (GetUnitAbilityLevel(GetFilterUnit(), 'NSe1') <= 0) and (GetUnitAbilityLevel(GetFilterUnit(), 'NSe2') <= 0) and (GetUnitAbilityLevel(GetFilterUnit(), 'NSe3') <= 0)
}
private boolean fBoN_abd (){
return (LoadInteger(HT, GetUnitUserData(GetFilterUnit()), BlessingOfNeptulon_hid) <= 0) and ((GetUnitAbilityLevel(GetFilterUnit(), 'NSe1') > 0) or (GetUnitAbilityLevel(GetFilterUnit(), 'NSe2') > 0) or (GetUnitAbilityLevel(GetFilterUnit(), 'NSe3') > 0))
}
//Фильтры
//Функции
private nothing BoN_end (){
bonStateDel(GetEnumUnit(), LoadInteger(HT, GetUnitUserData(GetEnumUnit()), BlessingOfNeptulon_hid))
}
private nothing BoN_abd (){
integer bi
unit u = GetEnumUnit()
if GetUnitAbilityLevel(u, 'NSe1') > 0 {bi = 1}
if GetUnitAbilityLevel(u, 'NSe2') > 0 {bi = 2}
if GetUnitAbilityLevel(u, 'NSe3') > 0 {bi = 3}
bonStateAdd(u, bi)
u = null
}
//Функции
private nothing brActions(){
group g = CreateGroup()
//Благославление Нептулона (рассеивание/окончание)
GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, function fBoN_end)
ForGroup(g, function BoN_end)
GroupClear(g)
//Благославление Нептулона (похищение магии)
GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, function fBoN_abd)
ForGroup(g, function BoN_abd)
GroupClear(g)
DestroyGroup(g)
g = null
}
private nothing brInit (){
TimerStart(CreateTimer(), 0.25, true, function brActions)
}
endlibrary
Так норм или можно еще оптимизировать?
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован nazarpunk
Так, можно же выбрать всех юнитов на карте, а потом в фильтре проверить принадлежат ли они группе, да?
Отредактирован KaneThaumaturge
Если они сделаны триггерно
И чтоб похищение магии тоже работало корректно
Изменил с помощью фильтров. Получилось так:
например, тут
if GetUnitAbilityLevel(u, 'NSe1') > 0 {bi = 1}
if GetUnitAbilityLevel(u, 'NSe2') > 0 {bi = 2}
if GetUnitAbilityLevel(u, 'NSe3') > 0 {bi = 3}
во-первых, если они взаимоисключающие, то нужно единую ветку с if-else , а не 3 ифа
если даже нет, расположи их в порядке от максимальной вероястноти к минимальной. Если в игре пассивка набирает 3й уровень через 5 минут после начала, то и нет смысла начинать с первого и второго, т.к. в 95% случаев будет именно 3й уровень.
Ну, я так понял мой вариант верный, тогда я им закрою вопрос.
UPD:
Хотя я не совсем понимаю, все равно перебор, только при формировании группы.