Добавлено (08-04-2010, 19:00) --------------------------------------------- Нужна помощь: сделал скилл: геров притягивает к центру указанной области, потом в центре взрыв и всех дамажит. вроде все работает. но скилл работает только 1 раз. т.е. после первого использования при использовании скилла создаются только спецэффекты(у меня они как юниты). но не работает ни притяжение, ни взрыв. вот триги:
Code
globals location t unit u unit array c player p group g = CreateGroup() group g2 = CreateGroup() timer time = CreateTimer() boolexpr bol boolexpr bol2 endglobals
function filter takes nothing returns boolean if (not ( IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) == true )) then return false endif if (not (IsUnitAlly(GetFilterUnit(), p) == true)) then return false endif return true endfunction
function filter2 takes nothing returns boolean if (not (IsUnitAlly(GetFilterUnit(), p) == true)) then return false endif return true endfunction
function Trig_Use_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'A000' ) ) then return false endif return true endfunction
function FGA takes nothing returns nothing call PauseUnit(GetEnumUnit(), true) endfunction
function FGA3 takes nothing returns nothing local unit enumm = GetEnumUnit() local real life = GetUnitState(enumm, UNIT_STATE_LIFE) local real nlife = life - 200 call SetUnitState(enumm, UNIT_STATE_LIFE, nlife) call PauseUnit(enumm, false) set enumm = null endfunction
function TimeEnd takes nothing returns nothing set bol2 = Condition(function filter2) call DisableTrigger(gg_trg_Styag) call CreateNUnitsAtLoc(1, 'h000', p, t, bj_UNIT_FACING ) set c[3] = GetLastCreatedUnit() call UnitApplyTimedLife(c[3], 'BTLF', 3.00) call GroupEnumUnitsInRangeOfLoc(g2,t,250,bol2) call ForGroupBJ(g2, function FGA3) call RemoveLocation(t) call DestroyGroup(g) call DestroyGroup(g2) call DestroyTimer(time) call DestroyBoolExpr(bol) call DestroyBoolExpr(bol2) set bol = null set bol2 = null set time = null set t = null set u = null set c[1] = null set c[2] = null set c[3] = null set p = null set g = null set g2 = null endfunction
function Trig_Use_Actions takes nothing returns nothing set t = GetSpellTargetLoc() set u = GetSpellAbilityUnit() set p = GetOwningPlayer(u) set bol = Condition(function filter) call GroupEnumUnitsInRangeOfLoc(g,t,500, bol) call ForGroupBJ(g, function FGA) call CreateNUnitsAtLoc(1, 'h001', p, t, bj_UNIT_FACING ) set c[1] = GetLastCreatedUnit() call UnitApplyTimedLife(c[1], 'BTLF', 5.00) call CreateNUnitsAtLoc(1, 'h002', p, t, bj_UNIT_FACING ) set c[2] = GetLastCreatedUnit() call UnitApplyTimedLife(c[2], 'BTLF', 3.00) call EnableTrigger(gg_trg_Styag) call TimerStart(time, 5, false, function TimeEnd) endfunction
//=========================================================================== function InitTrig_Use takes nothing returns nothing set gg_trg_Use = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Use, EVENT_PLAYER_UNIT_SPELL_CHANNEL ) call TriggerAddCondition( gg_trg_Use, Condition( function Trig_Use_Conditions ) ) call TriggerAddAction( gg_trg_Use, function Trig_Use_Actions ) endfunction
Code
function FGA2 takes nothing returns nothing local unit enu = GetEnumUnit() local real x1 = GetUnitX(enu) local real y1 = GetUnitY(enu) local location l = Location(x1,y1) local real angle = AngleBetweenPoints(l, t) local real x2 = x1 + 5*Cos(angle) local real y2 = y1 + 5*Sin(angle) local real dist = DistanceBetweenPoints(l, t) local real lif = GetUnitState(enu, UNIT_STATE_LIFE) local real nlif = lif - 4 if dist>100 then call SetUnitPosition(enu, x2, y2) endif call SetUnitState(enu, UNIT_STATE_LIFE, nlif) call RemoveLocation(l) set l = null set enu = null endfunction
function Trig_Styag_Actions takes nothing returns nothing call ForGroupBJ(g, function FGA2) endfunction
//=========================================================================== function InitTrig_Styag takes nothing returns nothing set gg_trg_Styag = CreateTrigger() call DisableTrigger(gg_trg_Styag) call TriggerRegisterTimerEventPeriodic(gg_trg_Styag, 0.10) call TriggerAddAction(gg_trg_Styag, function Trig_Styag_Actions) endfunction
Очень. Они щекотные. При оптимизации заметил это - local real x2 = x1 + 5*Cos(angle) local real y2 = y1 + 5*Sin(angle) У какого еретика ты украл эти полярки ?)
Svyaga, спасибо, не подскажешь как будет область в которую кастовали это что-то вроде SpellAbiliting и что-то еще, и плиз полную, мне надо написать создать боевую единицу в области в которую кастовали способность. Как создать знаю а вот в область каста не знаю.
Добавлено (08-04-2010, 21:27) --------------------------------------------- Svyaga, пишет ошибку вот здесь
function FGA2 takes nothing returns nothing local unit enu = GetEnumUnit() local real x1 = GetUnitX(enu) local real y1 = GetUnitY(enu) local location l = Location(x1,y1) local real angle = AngleBetweenPoints(l, t) local real x2 = x1 + 5*Cos(angle) local real y2 = y1 + 5*Sin(angle) local real dist = DistanceBetweenPoints(l, t) local real lif = GetUnitState(enu, UNIT_STATE_LIFE) local real nlif = lif - 4 if IsUnitAlly(enu, p) == true and IsUnitType(enu, UNIT_TYPE_HERO) == true then if dist>100 then call SetUnitPosition(enu, x2, y2) endif call SetUnitState(enu, UNIT_STATE_LIFE, nlif) endif call RemoveLocation(l) set l = null set enu = null endfunction
function Trig_Styag_Actions takes nothing returns nothing local timer t = GetExpiredTimer() local player p = LoadPlayerHandle(Hash, GetHandleId(t), 1) local location to = LoadLocationHandle(Hash, GetHandleId(t), 2) // я лол незнаю как значение локалок в ФорГроуп отправить <img rel="usm" src="http://warcraft3ft.info/image/smiles/smile.gif" border="0" align="absmiddle" alt=":)"> call ForGroup(g, function FGA2) set t = null set p = null set to = null endfunction
function FGA takes nothing returns nothing if IsUnitAlly(GetEnumUnit(), p) == true then call PauseUnit(GetEnumUnit(), true) endif endfunction
function FGA3 takes nothing returns nothing if IsUnitAlly(GetEnumUnit(), p) == true then local unit enumm = GetEnumUnit() local real life = GetUnitState(enumm, UNIT_STATE_LIFE) local real nlife = life - 200 call SetUnitState(enumm, UNIT_STATE_LIFE, nlife) call PauseUnit(enumm, false) set enumm = null endif endfunction
function TimeEnd takes nothing returns nothing local timer t = GetExpiredTimer() local timer t2 = LoadTimerHandle(Hash, GetHandleId(t), 4) local group g = LoadGroupHandle(Hash, GetHandleId(t), 1) local player p = LoadPlayerHandle(Hash, GetHandleId(t), 2) local location to = LoadLocationHandle(Hash, GetHandleId(t), 3) local unit dumm1 = CreateUnitAtLoc( p,'h000', to, bj_UNIT_FACING ) call UnitApplyTimedLife(dumm1, 'BTLF', 3.00) call FlushChildHashtable(Hash, t1) call FlushChildHashtable(Hash, t2) call DestroyTimer(t2) // я лол незнаю как значение локалок в ФорГроуп отправить <img rel="usm" src="http://warcraft3ft.info/image/smiles/smile.gif" border="0" align="absmiddle" alt=":)"> call ForGroup(g, function FGA3) call RemoveLocation(t) call GroupClear(g) call DestroyGroup(g) call DestroyTimer(t) call RemoveLocation(t) call RemoveUnit(dumm1) set time = null set to = null set dumm1 = null set p = null set g = null endfunction
function Trig_Use_Actions takes nothing returns nothing local location t = GetSpellTargetLoc() local unit u = GetSpellAbilityUnit() local player p = GetOwningPlayer(u) local group g = CreateGroup() local timer time = CreateTimer() local unit dumm1 local unit dumm2 local timer time2 if GetSpellAbilityId() == 'A000' then call GroupEnumUnitsInRangeOfLoc(g,t,500, null) // я лол незнаю как значение локалок в ФорГроуп отправить <img rel="usm" src="http://warcraft3ft.info/image/smiles/smile.gif" border="0" align="absmiddle" alt=":)"> call ForGroup(g, function FGA) set dumm1 = CreateUnitAtLoc( p,'h001', t, bj_UNIT_FACING ) call UnitApplyTimedLife(dumm1, 'BTLF', 5.00) set dumm2 CreateUnitAtLoc( p,'h002', t, bj_UNIT_FACING ) call UnitApplyTimedLife( dumm2, 'BTLF', 3.00) call EnableTrigger(gg_trg_Styag) call SaveGroupHandle(Hash, GetHandleId(time), 1, g) call SavePlayerHandle(Hash, GetHandleId(time), 2, p) call SaveLocationHandle(Hash, GetHandleId(time), 3, t) call SavePlayerHandle(Hash, GetHandleId(time2), 1, p) call SaveLocationHandle(Hash, GetHandleId(time2), 2, t) call SaveLocationHandle(Hash, GetHandleId(time), 4, time2) call TimerStart(time, 5, false, function TimeEnd) call TimerStart(time2, .10, true, function Trig_Styag_Actions) endif set p = null set u = null set dumm1 = null set dumm2 = null set g = null set t = null set time = null endfunction
//=========================================================================== function InitTrig_Use takes nothing returns nothing set gg_trg_Use = CreateTrigger() call TriggerRegisterAnyUnitEventBJ( gg_trg_Use, EVENT_PLAYER_UNIT_SPELL_CHANNEL ) call TriggerAddAction( gg_trg_Use, function Trig_Use_Actions ) endfunction
Svyaga, плз глянь, там где коментарии доработай плз)
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
хеш не нужен, вот: ПРИМЕР Допустим тебе надо добавить какую-то реальную (real) в форгрупп (ну например урон, значение к-ого зависит от чегото) Вот что нужно сделать: 1.Меняешь:
Code
function SomeFunc takes nothing returns nothing
На это:
Code
function SomeFunc takes real R returns nothing
2.Добавляешь то что нужно в форгрупп: Из вот этого:
Code
call ForGroup (SomeGroup, function SomeFunc)
Получится вот это:
Code
call ForGroup (SomeGroup, function SomeFunc(SomeReal))
Где SomeReal - как раз та реальная, к-ую и нужно отправить в форгрупп 3.Там где нужно подставить реальную пишешь "R", так как в "обозначении" (не знаю как правильно сказать ) функции она у тебя обозначается как "R"
Вот и всё впринципе, так же можно поступать с чем угодно=)
H_A_PK, так причём тут локалки-то=) Если вводить локалки (если нужно) в функции, к-ая используется на каждом юните в группе, то и получится, что для каждого юнита своя локалка будет В крайнем случае в том, что тебе надо было, можно было сделать глобальную переменную просто и поставить ей значение до форгрупп, а потом её в форгрупп использовать, но так как уже указан способ намного лучше, то это просто указано для сравнения