|
|
|
|
Селекция группы
|
|
RaiN_S | Дата: Четверг, 25 Апреля 2013, 17:10:50 | Сообщение # 1 |
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
| Привет. Вот код. Код function Trig_C2_5I2I2_Timer takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local group gr = LoadGroupHandle( udg_hash, id, 0) local group grt = CreateGroup() local unit u local unit ud = LoadUnitHandle( udg_hash, id, 1) local unit caster = LoadUnitHandle( udg_hash, id, 3) local integer n = LoadInteger( udg_hash, id, 2) local real l if n<125 and GetUnitState(ud, UNIT_STATE_LIFE)>0.405 then call GroupEnumUnitsInRange(grt, GetUnitX(ud), GetUnitY(ud), 355. , null) loop set u = FirstOfGroup(grt) exitwhen(u == null) if (IsUnitEnemy(u, GetOwningPlayer(caster))) and not (IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE)) and (GetWidgetLife(u) > 0.405) and not (IsUnitInGroup(u, gr)) then call GroupAddUnit(gr, u) endif call GroupRemoveUnit(grt, u) endloop loop set u = FirstOfGroup(gr) exitwhen(u == null) if (IsUnitEnemy(u, GetOwningPlayer(caster))) and not (IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE)) and (GetWidgetLife(u) > 0.405) then call IssueTargetOrder( u, "attack", ud ) call GroupAddUnit( grt, u) endif call GroupRemoveUnit(gr, u) endloop call SaveGroupHandle( udg_hash, id, 0, grt) set n = n + 1 call SaveInteger( udg_hash, id, 2, n) set l = 2. - (GetUnitState(ud, UNIT_STATE_LIFE)/1000.) call SetUnitScale(ud, l ,l,l) else call PauseTimer(t) set l = 1000. - GetUnitState(ud, UNIT_STATE_LIFE) call GroupEnumUnitsInRange(grt, GetUnitX(ud), GetUnitY(ud), 355. , null) loop set u = FirstOfGroup(grt) exitwhen(u == null) if IsUnitEnemy(u, GetOwningPlayer(caster)) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and GetWidgetLife(u) > 0.405 then call UnitDamageTarget(caster, u, udg_M + l , false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) endif call GroupRemoveUnit(grt, u) endloop call KillUnit(ud) call DestroyTimer(t) call DestroyGroup(gr) call FlushChildHashtable( udg_hash, id) endif call DestroyGroup(grt) set gr = null set t = null set u = null set caster = null set ud = null endfunction Почему-то caster атакует ud, и урон при завершении таймера не наносится. Не могу найти ошибку.
Сообщение отредактировал RaiN_S - Четверг, 25 Апреля 2013, 17:58:43 |
|
|
|
Волчачка | Дата: Четверг, 25 Апреля 2013, 17:40:13 | Сообщение # 2 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Цитата (RaiN_S) local group grt = CreateGroup() утечная группа. call DestroyGroup(grt) должен стоять после eninf'a Цитата (RaiN_S) call SaveUnitHandle( udg_hash, id, 1, ud) лол загружать, потом сохранять он и так хранится в кеше, пока ты его не FlushChildHashtable( udg_hash, id)
|
|
|
|
RaiN_S | Дата: Четверг, 25 Апреля 2013, 17:48:22 | Сообщение # 3 |
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
| Цитата (Волчачка) лол загружать, потом сохранять он и так хранится в кеше, пока ты его не FlushChildHashtable( udg_hash, id) Упс, и правда, пропустил мимо глаз.
Ну, это незначительные ошибки, проблема осталась на своём месте.
|
|
|
|
Волчачка | Дата: Четверг, 25 Апреля 2013, 18:01:34 | Сообщение # 4 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Цитата (RaiN_S) (GetWidgetLife(u) > 0.405) Цитата (RaiN_S) GetUnitState(ud, UNIT_STATE_LIFE)>0.405 Попробуй виджеты на поменять на стейты. Цитата (RaiN_S) l = 2. - (GetUnitState(ud, UNIT_STATE_LIFE)/1000.) Интересно.
В вообще сколько макс хп у кастера?
|
|
|
|
RaiN_S | Дата: Четверг, 25 Апреля 2013, 18:13:58 | Сообщение # 5 |
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
| Кастер - герой, у него меняется, а у ud ровно 1000. Цитата (Волчачка) Попробуй виджеты на поменять на стейты. Пробовал менять все вхождения виджет на стэйт и все стэйт на виджет. В обоих случаях никаких изменений.Добавлено (25 Апреля 2013, 18:13:58) --------------------------------------------- А какую функцию лучше использовать при проверке текущего хп в общем случае?
Сообщение отредактировал RaiN_S - Четверг, 25 Апреля 2013, 18:12:33 |
|
|
|
Волчачка | Дата: Четверг, 25 Апреля 2013, 18:16:10 | Сообщение # 6 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Цитата (RaiN_S) ud ровно 1000. set l = 1000. - GetUnitState(ud, UNIT_STATE_LIFE) 1000. - 1000. = 0.
|
|
|
|
RaiN_S | Дата: Четверг, 25 Апреля 2013, 18:20:30 | Сообщение # 7 |
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
| Цитата (Волчачка) set l = 1000. - GetUnitState(ud, UNIT_STATE_LIFE) 1000. - 1000. = 0. :D UNIT_STATE_LIFE - текущее здоровье. Чем меньше хп у ud к моменту завершения заклинания, тем больше должно нанестись урона окружающим противникам. В этом смысл способности. ud - это шарик, который растет, когда его бьют и взрывается при смерти.
Сообщение отредактировал RaiN_S - Четверг, 25 Апреля 2013, 18:21:34 |
|
|
|
Волчачка | Дата: Четверг, 25 Апреля 2013, 18:35:57 | Сообщение # 8 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Когда полсе окончания действия способности, сколько хп у шарика оставалось? Цитата (RaiN_S) когда его бьют Его били?) Какое значение имеет изначально udg_M?
|
|
|
|
RaiN_S | Дата: Четверг, 25 Апреля 2013, 18:46:02 | Сообщение # 9 |
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
| Цитата (Волчачка) Когда полсе окончания действия способности, сколько хп у шарика оставалось? По разному. Цитата (Волчачка) Какое значение имеет изначально udg_M? 0. Там дело не в числах. Даже если константу ввести, то все равно урон не наносится и герой все равно бьет шарик. Там что-то либо с группами, либо с проверкой условий не то. Цитата (Волчачка) Его били?) Код call IssueTargetOrder( u, "attack", ud ) Ну да, он вообще злой шарик.
|
|
|
|
DragoN | Дата: Четверг, 25 Апреля 2013, 18:50:05 | Сообщение # 10 |
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
| Цитата (Волчачка) он и так хранится в кеше кэш != хэш
El Psy Congroo
|
|
|
|
Волчачка | Дата: Четверг, 25 Апреля 2013, 19:53:57 | Сообщение # 11 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Я тебя понял, чешуйчатый. Я просто опечатался. RaiN_S, попробуй call GroupClear(grt) после call PauseTimer(t)
|
|
|
|
Наклз | Дата: Четверг, 25 Апреля 2013, 20:04:32 | Сообщение # 12 |
10 уровень
Группа: Проверенные
Сообщений: 1431
Награды: 0
Репутация: 760
Блокировки:
| Цитата (Волчачка) чешуйчатый !?
|
|
|
|
DragoN | Дата: Четверг, 25 Апреля 2013, 20:38:57 | Сообщение # 13 |
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
| мохнатый видимо намекнул на мой ник
El Psy Congroo
|
|
|
|
RaiN_S | Дата: Пятница, 26 Апреля 2013, 14:55:51 | Сообщение # 14 |
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
| Цитата (Волчачка) RaiN_S, попробуй call GroupClear(grt) после call PauseTimer(t) Не работает. Волчачка, проверь, пожалуйста, логику построения кода. Всякие "авось" я и сам неоднократно проверял. Разве что перебор группы через ForGroup не делал, это ведь через ж*пу.
|
|
|
|
Волчачка | Дата: Пятница, 26 Апреля 2013, 15:15:20 | Сообщение # 15 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| RaiN_S, попробуй так: Код loop set u = FirstOfGroup(grt) if IsUnitEnemy(u, GetOwningPlayer(caster)) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and GetWidgetLife(u) > 0.405 and u !=null then call UnitDamageTarget(caster, u, udg_M + l , false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) endif call GroupRemoveUnit(grt, u) exitwhen u == null endloop
Добавлено (26 Апреля 2013, 15:15:20) --------------------------------------------- Слушай, а ты делал такое в инициализации карты? Код set udg_hash = InitHashtable()
Сообщение отредактировал Волчачка - Пятница, 26 Апреля 2013, 15:15:37 |
|
|
|
RaiN_S | Дата: Пятница, 26 Апреля 2013, 15:25:18 | Сообщение # 16 |
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
| Цитата (Волчачка) RaiN_S, попробуй так: А какой смысл проверять null? Цитата (Волчачка) Слушай, а ты делал такое в инициализации карты? Ну блин, конечно. Так бы и вовсе не работало.Добавлено (26 Апреля 2013, 15:25:18) ---------------------------------------------
Цитата (Волчачка) RaiN_S, попробуй так: Попробовал. Не то.
|
|
|
|
Волчачка | Дата: Пятница, 26 Апреля 2013, 15:34:59 | Сообщение # 17 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| RaiN_S, значит так я проверил у себя на основе пехотинца Код function Trig_cast_Conditions takes nothing returns boolean return GetSpellAbilityId() == 'ANsi' endfunction
function Trig_cast_Actions takes nothing returns nothing local unit caster = GetSpellAbilityUnit() local timer t = CreateTimer() local integer id = GetHandleId(t) local real x = GetSpellTargetX() local real y = GetSpellTargetY() call SaveGroupHandle(udg_hash, id, 0, CreateGroup()) call SaveUnitHandle(udg_hash, id, 1, CreateUnit(GetOwningPlayer(caster),'hfoo',x,y, GetUnitFacing(caster))) call SaveInteger(udg_hash, id, 2, 0) call SaveUnitHandle(udg_hash, id, 3, caster) call TimerStart(t, .08, true, function Trig_C2_5I2I2_Timer) set caster = null set t = null set id = 0 set x = 0. set y = 0. endfunction
//=========================================================================== function InitTrig_cast takes nothing returns nothing set gg_trg_cast = CreateTrigger( ) call TriggerRegisterUnitEvent( gg_trg_cast, gg_unit_Nbrn_0000, EVENT_UNIT_SPELL_EFFECT ) call TriggerAddCondition( gg_trg_cast, Condition( function Trig_cast_Conditions ) ) call TriggerAddAction( gg_trg_cast, function Trig_cast_Actions ) endfunction ^ Типа триггер запуска Использовал твой нетронутый код Код function Trig_C2_5I2I2_Timer takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local group gr = LoadGroupHandle( udg_hash, id, 0) local group grt = CreateGroup() local unit u local unit ud = LoadUnitHandle( udg_hash, id, 1) local unit caster = LoadUnitHandle( udg_hash, id, 3) local integer n = LoadInteger( udg_hash, id, 2) local real l if n<125 and GetUnitState(ud, UNIT_STATE_LIFE)>0.405 then call GroupEnumUnitsInRange(grt, GetUnitX(ud), GetUnitY(ud), 355. , null) loop set u = FirstOfGroup(grt) exitwhen(u == null) if (IsUnitEnemy(u, GetOwningPlayer(caster))) and not (IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE)) and (GetWidgetLife(u) > 0.405) and not (IsUnitInGroup(u, gr)) then call GroupAddUnit(gr, u) endif call GroupRemoveUnit(grt, u) endloop loop set u = FirstOfGroup(gr) exitwhen(u == null) if (IsUnitEnemy(u, GetOwningPlayer(caster))) and not (IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE)) and (GetWidgetLife(u) > 0.405) then call IssueTargetOrder( u, "attack", ud ) call GroupAddUnit( grt, u) endif call GroupRemoveUnit(gr, u) endloop call SaveGroupHandle( udg_hash, id, 0, grt) set n = n + 1 call SaveInteger( udg_hash, id, 2, n) set l = 2. - (GetUnitState(ud, UNIT_STATE_LIFE)/1000.) call SetUnitScale(ud, l ,l,l) else call PauseTimer(t) set l = 1000. - GetUnitState(ud, UNIT_STATE_LIFE) call GroupEnumUnitsInRange(grt, GetUnitX(ud), GetUnitY(ud), 355. , null) loop set u = FirstOfGroup(grt) exitwhen(u == null) if IsUnitEnemy(u, GetOwningPlayer(caster)) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and GetWidgetLife(u) > 0.405 then call UnitDamageTarget(caster, u, udg_M + l , false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) endif call GroupRemoveUnit(grt, u) endloop call KillUnit(ud) call DestroyTimer(t) call DestroyGroup(gr) call FlushChildHashtable( udg_hash, id) endif call DestroyGroup(grt) set gr = null set t = null set u = null set caster = null set ud = null endfunction Этот у меня всё робит.
|
|
|
|
RaiN_S | Дата: Пятница, 26 Апреля 2013, 15:57:58 | Сообщение # 18 |
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
| Пффффффф... Нашел ошибку. хД Короче, когда копировал часть кода из другого триггера, чтобы не морочиться с созданием эффектов, нечаянно захватил с собой set caster = null хД Ну и забыл про него. Считал раз тот триггер работает, то в этой части кода ошибок быть не должно. Вот дурак, а. Ладно, со мной бывает. Спасибо за попытки помочь. Добавлено (26 Апреля 2013, 15:57:58) --------------------------------------------- В следующий раз надо будет код всего триггера скидывать, а не только конкретные функции.
|
|
|
|
Волчачка | Дата: Пятница, 26 Апреля 2013, 16:06:48 | Сообщение # 19 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| RaiN_S, Не за что, зато нежелательные утечки убрали. :)
|
|
|
|
RaiN_S | Дата: Пятница, 26 Апреля 2013, 16:12:00 | Сообщение # 20 |
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
| Посмотри пожалуйста вот это. Не знаю, у меня есть идея проверять всё по четвертям, но кажется, что есть более короткий путь. А эту тему можно закрыть.
Сообщение отредактировал RaiN_S - Пятница, 26 Апреля 2013, 16:12:22 |
|
|
|
|
|
|
|
|
|
|