Ty3uK, Слушай не помню есть ли такой статический бж как bj_lastCreatedUnit или я путаю название, хорошая штука ловит юнитов отлично так что можно ею пользоваться.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Четверг, 22 Сентября 2011, 22:54:31
Итак. Я оптимизировал спелл насколько мог, не использую при этом ни одной глобалки. Вот код:
Code
function Trig_Explode_Corpses_Conditions takes nothing returns boolean if ( GetSpellAbilityId() == 'A0QT' ) then return true endif return false endfunction
function EC2 takes nothing returns nothing local timer t = GetExpiredTimer() local group g = LoadGroupHandle(udg_Items, GetSpellAbilityId(), 3) local location p = LoadLocationHandle(udg_Items, GetSpellAbilityId(), 2) call DestroyTimer(t) call RemoveLocation(p) call DestroyGroup(g) set g = null call FlushChildHashtable(udg_Items, GetSpellAbilityId()) endfunction
function group1 takes nothing returns nothing local real d = LoadReal(udg_Items, GetSpellAbilityId(), 1) local location p = GetUnitLoc(GetEnumUnit()) call UnitDamagePointLoc( GetEnumUnit(), 0, 180.00, p, d, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FORCE ) ///////// НЕ РАБОТАЕТ!!!! call AddSpecialEffectLoc( "Units\\Undead\\Abomination\\AbominationExplosion.mdl", p ) call DestroyEffect( GetLastCreatedEffectBJ() ) call RemoveLocation(p) call RemoveUnit(GetEnumUnit()) endfunction
function EC1 takes nothing returns nothing local timer t = GetExpiredTimer() local timer t1 = CreateTimer() local group g = LoadGroupHandle(udg_Items, GetSpellAbilityId(), 0) local location p = LoadLocationHandle(udg_Items, GetSpellAbilityId(), 2) local integer n = LoadInteger(udg_Items, GetSpellAbilityId(), 3) call DestroyGroup(g) set g = null call ForGroup( GetUnitsOfPlayerAndTypeId(Player(n), 'h007'), function group1) call SaveGroupHandle(udg_Items, GetSpellAbilityId(), 3, GetLastCreatedGroup()) call PlaySoundAtPointBJ( gg_snd_ImpaleLand, 100, p, 10.00 ) call DestroyTimer(t) call RemoveLocation(p) call TimerStart( t1, 1.00, false, function EC2 ) endfunction
function group0 takes nothing returns nothing local location p = GetUnitLoc(GetEnumUnit()) if (IsUnitDeadBJ(GetEnumUnit()) == true) then call CreateUnitAtLoc( GetOwningPlayer(GetSpellAbilityUnit()), 'h007', p, 0.00 ) call RemoveUnit(GetEnumUnit()) endif call RemoveLocation(p) endfunction
function Trig_Explode_Corpses_Actions takes nothing returns nothing local timer t = CreateTimer() local integer l = GetUnitAbilityLevel( GetSpellAbilityUnit(), 'A0QT') local location p = GetUnitLoc(GetSpellAbilityUnit()) local real d = 0.00 call ForGroup( GetUnitsInRangeOfLocAll(900.00, p), function group0) call SaveGroupHandle(udg_Items, GetSpellAbilityId(), 0, GetLastCreatedGroup())
if ( l == 1 ) then set d = 50.00 endif if ( l == 2 ) then set d = 65.00 endif if ( l == 3 ) then set d = 85.00 endif if ( l == 4 ) then set d = 110.00 endif if ( l == 5 ) then set d = 140.00 endif if ( l == 6 ) then set d = 175.00 endif if ( l == 7 ) then set d = 215.00 endif if ( l == 8 ) then set d = 260.00 endif if ( l == 9 ) then set d = 310.00 endif if ( l == 10 ) then set d = 365.00 endif
//=========================================================================== function InitTrig_Explode_Corpses takes nothing returns nothing set gg_trg_Explode_Corpses = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Explode_Corpses, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_Explode_Corpses, Condition( function Trig_Explode_Corpses_Conditions ) ) call TriggerAddAction( gg_trg_Explode_Corpses, function Trig_Explode_Corpses_Actions ) endfunction
Работает всё, кроме одной строки кода, там где написано //НЕ РАБОТАЕТ. А именно - не наносится урон! Почему? Подскажите плз что здесь не так и вообще как ещё можно оптимизировать этот код
Сообщение отредактировал FatalBlade - Четверг, 22 Сентября 2011, 23:45:40
call DestroyGroup(g) set g= null поствь после call DestroyTimer(t)
Тоже после call TimerStart( t1, 1.00, false, function EC2 )? И вообще какое значение это имеет?
Добавлено (23 Сентябрь 2011, 00:42:20) --------------------------------------------- И кстати не помогло((
Добавлено (23 Сентябрь 2011, 00:44:38) --------------------------------------------- Вот почему все остальные действия в этой функции работают, и только одно действие, нанесение урона не работает.
Сообщение отредактировал FatalBlade - Пятница, 23 Сентября 2011, 00:32:48
function FilterCourpse takes nothing returns boolean return GetWidgetLife(GetFilterUnit())<=0. endfunction
function Exploid takes nothing returns nothing local timer t=GetExpieredTimer() local integer id=GetHandleId(t) local group g=CreateGroup() local unit u=LoadUnitHandle(udg_H,id,3) local unit e local unit en loop set e=FirstOfGroup(LoadGroupHandle(udg_H,id,1)) exitwhen e==null call GroupEnumInRange(g,GetWidgetX(e),GetWidgetY(e),180.,null) loop set en=FirstOfGroup(g) exitwhen en==null if IsUnitEnemy(en,GetOwningPlayer(u))==true then call DamageTarget(u,en,LoadReal(udg_H,id,2),true,false,DAMAGE_TYPE_MAGIC,ATTACK_TYPE_NORMAL,null) call GroupRemoveUnit(g,en) else call GroupRemoveUnit(g,en) endif endloop call RemoveUnit(e) call GroupRemoveUnit(g,e) endloop call DestroyGroup(LoadGroupHandle(udg_H,id,1)) call DestroyGroup(g) call FlushChildHashtable(udg_H,id) set t=null set g=null set u=null set e=nll set en=null endfunction
function ExplodeCourpse takes nothing returns nothing local unit u=GetTriggerUnit() local timer t=CreateTimer() local integer id=GetHandleId(t) local integer l=GetUnitAbilityLevel(u, 'A0QT') local group g=CreateGroup() local real dm if l==1 then set dm = 50.00 elseif l == 2 then set dm = 65.00 elseif l == 3 then set dm = 85.00 elseif l == 4 then set dm = 110.00 elseif l == 5 then set dm = 140.00 elseif l == 6 then set dm = 175.00 elseif l == 7 then set dm = 215.00 elseif l == 8 then set dm = 260.00 elseif l== 9 then set dm = 310.00 elseif l == 10 then set dm = 365.00 endif call GroupEnumInRange(g,GetWidgetX(u),GetWidgetY(u),900.,function FilterCourpse) call SaveGroupHandle(udg_H,id,1,g) call SaveReal(udg_H,id,2,dm) call SaveUnitHandle(udg_H,id,3,u) call TimerStart(t,.4,false,function Exploid) set u=null set t=null set g=null endfunction //=========================================================================== function InitTrig_Explode_Corpses takes nothing returns nothing set gg_trg_Explode_Corpses = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Explode_Corpses, EVENT_PLAYER_UNIT_SPELL_EFFECT ) call TriggerAddCondition( gg_trg_Explode_Corpses, Condition( function Trig_Explode_Corpses_Conditions ) ) call TriggerAddAction( gg_trg_Explode_Corpses, function ExplodeCourpse ) endfunction
Что ты вообще хочешь сделать что за способсноть такая?
Герой взрывает всех трупов вокруг себя в радиусе 900. Каждый труп который взрывается наносит урон всем юнитам в радиусе 180. Скилл очень простенький на ГУИ (с удалением утечек естественно), но на ГУИ используется много глобалок...
Ну это используется когда ты добавляешь юнитов в группу например ты хочешь чтобы туда добавлялись только те юниты у которых хп меньше 100: call GroupEnumUnitsInRect(group, rect, а здесь указываеться фильт который и будет тебе добавлять только тех юнитов у которых хп < 100) Обычно вместо фильтра ставиться null если хочешь добавлять всех юнитов подряд, иначе пишеться фильтр который с помощью своей отдельной функции фильтрует юнитов.