XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
PiCkUpEr_AsT

offline
Опыт: 1,060
Активность:
не пойму почему не работает спелл
Код:
function CountUnitsInGroupEnum takes nothing returns nothing
    set bj_groupCountUnits = bj_groupCountUnits + 1
endfunction

function TriggerRegisterAnyUnitEvent takes trigger t, playerunitevent FRI returns nothing
    local integer OHI = 0
    loop
        call TriggerRegisterPlayerUnitEvent(t, Player(OHI), FRI, Condition(function FSI))
        set OHI = OHI + 1
        exitwhen OHI==16
    endloop
endfunction

function My_CountUnitsInGroup takes group g returns integer
    set bj_groupCountUnits = 0
    call ForGroup(g, function CountUnitsInGroupEnum)
    return bj_groupCountUnits
endfunction

function InitTrig_Circle_of_Healing_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A034'
endfunction

function Circle_of_Healing_Hero_grfilter takes nothing returns boolean
    return GetOwningPlayer(GetFilterUnit())!=Player(15) and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetTriggerUnit()))==false and GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) < GetUnitState(GetFilterUnit(), UNIT_STATE_MAX_LIFE) and IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true
endfunction

function Circle_of_Healing_NonHero_grfilter takes nothing returns boolean
    return GetOwningPlayer(GetFilterUnit())!=Player(15) and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetTriggerUnit()))==false and GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) < GetUnitState(GetFilterUnit(), UNIT_STATE_MAX_LIFE) and IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) == false and IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == false
endfunction

function Circle_of_Healing_Heal takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local unit t = GetEnumUnit()
    local real current = GetUnitState(t, UNIT_STATE_LIFE)
    local real max = GetUnitState(t, UNIT_STATE_MAX_LIFE)
    local real shouldHeal = max - current
    local real canHeal = 4 * GetHeroInt(u, true)
    if LoadReal(udg_h, GetHandleId(t), 15) > .0 then
        set canHeal = canHeal * LoadReal(udg_h, GetHandleId(t), 15)
    endif
    if GetUnitState(t, UNIT_STATE_LIFE) >= 0.405 and current!=max then

        if shouldHeal > canHeal then
            call SetUnitState(t, UNIT_STATE_LIFE, current + canHeal)
        elseif shouldHeal==canHeal then
            call SetUnitState(t, UNIT_STATE_LIFE, current + canHeal)
        else
            call SetUnitState(t, UNIT_STATE_LIFE, current + shouldHeal)
            set canHeal = shouldHeal
        endif
        call FadingText("|cff00dd00       +" + I2S(R2I(canHeal)), t)
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\Heal\\HealTarget.mdl", t, "origin"))

    else
    endif
    set t = null
    set u = null
    
endfunction

function InitTrig_Circle_of_Healing_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local unit t = GetSpellTargetUnit()
    local real current = GetUnitState(t, UNIT_STATE_LIFE)
    local real max = GetUnitState(t, UNIT_STATE_MAX_LIFE)
    local real shouldHeal = max - current
    local real canHeal = 4 * GetHeroInt(u, true)
    local boolexpr Check = Condition(function Circle_of_Healing_Hero_grfilter)
    local group g = CreateGroup()
    local location loca = GetUnitLoc(t)
    if LoadReal(udg_h, GetHandleId(t), 15) > .0 then
        set canHeal = canHeal * LoadReal(udg_h, GetHandleId(t), 15)
    endif
    if GetUnitState(t, UNIT_STATE_LIFE) >= 0.405 and current!=max then

        if shouldHeal > canHeal then
            call SetUnitState(t, UNIT_STATE_LIFE, current + canHeal)
        elseif shouldHeal==canHeal then
            call SetUnitState(t, UNIT_STATE_LIFE, current + canHeal)
        else
            call SetUnitState(t, UNIT_STATE_LIFE, current + shouldHeal)
            set canHeal = shouldHeal
        endif
        
        call FadingText("|cff00dd00       +" + I2S(R2I(canHeal)), t)
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\Heal\\HealTarget.mdl", t, "origin"))
    else
    endif
    call GroupEnumUnitsInRange(g, GetUnitX(t), GetUnitY(t), 400, Check)
    set Check = Condition(function Circle_of_Healing_NonHero_grfilter)
    if My_CountUnitsInGroup(g) < 6 then
        call GroupEnumUnitsInRangeOfLocCounted(g, loca, 400, Check, 6 - My_CountUnitsInGroup(g))
    endif
    call ForGroup(g, function Circle_of_Healing_Heal)
    call RemoveLocation(loca)
    set loca = null
    set Check = null
    set g = null
    set t = null
    set u = null
endfunction

//===========================================================================
function InitTrig_Circle_of_Healing takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEvent(t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition(t, Condition( function InitTrig_Circle_of_Healing_Conditions ) )
    call TriggerAddAction(t, function InitTrig_Circle_of_Healing_Actions )
    set t = null
endfunction


Описание:
Восстанавливает 4хРазум ед здоровья союзникам находящимся в радиусе 400 от выбранной цели, может исцелить до 6 персонажей. Приоритет отдается героям.

*** Лечит только одну цель....
Старый 09.07.2011, 10:37
Doc

offline
Опыт: 63,163
Активность:
Где отладочные сообщения?
Старый 09.07.2011, 18:41
Helpmeplz

offline
Опыт: 11,738
Активность:
вы используете в фильтре GetTriggerUnit()

в комментариях к одной из работ последнего спел контеста на хайве судья написал:
Цитата:
Destroying boolexprs is no longer needed since patch 1.24 or so

сколько видел на xgm все делают иначе.
Старый 09.07.2011, 19:04
PiCkUpEr_AsT

offline
Опыт: 1,060
Активность:
Цитата:
Сообщение от Doc
Где отладочные сообщения?

не имею понятия о чем вы)

Цитата:
Сообщение от Helpmeplz
в комментариях к одной из работ последнего спел контеста на хайве судья написал:
Цитата:
Цитата:
Destroying boolexprs is no longer needed since patch 1.24 or so

имеется ввиду не надо писать
Код:
set Check=null
?





исправил "триггер юнит" на загрузку хэндла с таймера, но теперь если тыкаю на героя, лечится указанный герой и обычный воин, а если тыкну на воина, то лечится только воин, вот исправленный код:
Код:
function InitTrig_Circle_of_Healing_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A034'
endfunction

function Circle_of_Healing_Hero_grfilter takes nothing returns boolean
    local timer tm = GetExpiredTimer()
    local integer i = GetHandleId(tm)
    set tm = null
    return GetOwningPlayer(GetFilterUnit())!=Player(15) and GetFilterUnit()!=LoadUnitHandle(udg_h, i, 1) and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(LoadUnitHandle(udg_h, i, 0)))==false and GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) < GetUnitState(GetFilterUnit(), UNIT_STATE_MAX_LIFE) and IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) == true
endfunction

function Circle_of_Healing_NonHero_grfilter takes nothing returns boolean
    local timer tm = GetExpiredTimer()
    local integer i = GetHandleId(tm)
    set tm = null
    return GetOwningPlayer(GetFilterUnit())!=Player(15) and GetFilterUnit()!=LoadUnitHandle(udg_h, i, 1) and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(LoadUnitHandle(udg_h, i, 0)))==false and GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) < GetUnitState(GetFilterUnit(), UNIT_STATE_MAX_LIFE) and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) == false
endfunction

function Circle_of_Healing_Heal takes nothing returns nothing
    local timer tm = GetExpiredTimer()
    local unit u = LoadUnitHandle(udg_h, GetHandleId(tm), 0)
    local unit t = GetEnumUnit()
    local real current = GetUnitState(t, UNIT_STATE_LIFE)
    local real max = GetUnitState(t, UNIT_STATE_MAX_LIFE)
    local real shouldHeal = max - current
    local real canHeal = 4 * GetHeroInt(u, true)
    if LoadReal(udg_h, GetHandleId(t), 15) > .0 then
        set canHeal = canHeal * LoadReal(udg_h, GetHandleId(t), 15)
    endif
    if GetUnitState(t, UNIT_STATE_LIFE) >= 0.405 and current!=max then

        if shouldHeal > canHeal then
            call SetUnitState(t, UNIT_STATE_LIFE, current + canHeal)
        elseif shouldHeal==canHeal then
            call SetUnitState(t, UNIT_STATE_LIFE, current + canHeal)
        else
            call SetUnitState(t, UNIT_STATE_LIFE, current + shouldHeal)
            set canHeal = shouldHeal
        endif
        call FadingText("|cff00dd00       +" + I2S(R2I(canHeal)), t)
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\Heal\\HealTarget.mdl", t, "origin"))

    else
    endif
    call DestroyTimer(tm)
    set t = null
    set u = null
    set tm = null
    
endfunction

function Circle_of_Healing_Heal_timer takes nothing returns nothing
    local timer tm = GetExpiredTimer()
    local unit u = LoadUnitHandle(udg_h, GetHandleId(tm), 0)
    local unit t = LoadUnitHandle(udg_h, GetHandleId(tm), 1)
    local location loca = GetUnitLoc(t)
    local group g = CreateGroup()
    local boolexpr Check = Condition(function Circle_of_Healing_Hero_grfilter)
    call GroupEnumUnitsInRange(g, GetUnitX(t), GetUnitY(t), 400, Check)
    set Check = Condition(function Circle_of_Healing_NonHero_grfilter)
    if My_CountUnitsInGroup(g) < 6 then
        call GroupEnumUnitsInRangeOfLocCounted(g, loca, 400, Check, 6 - My_CountUnitsInGroup(g))
    endif
    call ForGroup(g, function Circle_of_Healing_Heal)
    call RemoveLocation(loca)
    set g = null
    set tm = null
    set loca = null
    set t = null
    set u = null
endfunction

function InitTrig_Circle_of_Healing_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local unit t = GetSpellTargetUnit()
    local real current = GetUnitState(t, UNIT_STATE_LIFE)
    local real max = GetUnitState(t, UNIT_STATE_MAX_LIFE)
    local real shouldHeal = max - current
    local real canHeal = 4 * GetHeroInt(u, true)
    local timer tm = CreateTimer()
    if LoadReal(udg_h, GetHandleId(t), 15) > .0 then
        set canHeal = canHeal * LoadReal(udg_h, GetHandleId(t), 15)
    endif
    call SaveUnitHandle(udg_h, GetHandleId(tm), 0, u)
    call SaveUnitHandle(udg_h, GetHandleId(tm), 1, t)
    if GetUnitState(t, UNIT_STATE_LIFE) >= 0.405 and current!=max then

        if shouldHeal > canHeal then
            call SetUnitState(t, UNIT_STATE_LIFE, current + canHeal)
        elseif shouldHeal==canHeal then
            call SetUnitState(t, UNIT_STATE_LIFE, current + canHeal)
        else
            call SetUnitState(t, UNIT_STATE_LIFE, current + shouldHeal)
            set canHeal = shouldHeal
        endif
        
        call FadingText("|cff00dd00       +" + I2S(R2I(canHeal)), t)
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\Heal\\HealTarget.mdl", t, "origin"))
    else
    endif
    call TimerStart(tm, .1, false, function Circle_of_Healing_Heal_timer)
    set tm = null
    set t = null
    set u = null
endfunction

//===========================================================================
function InitTrig_Circle_of_Healing takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEvent(t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition(t, Condition( function InitTrig_Circle_of_Healing_Conditions ) )
    call TriggerAddAction(t, function InitTrig_Circle_of_Healing_Actions )
    set t = null
endfunction
Старый 09.07.2011, 21:07
Helpmeplz

offline
Опыт: 11,738
Активность:
откуда таймер в фильтре группы?
кроме GetFilterUnit() ты не можешь использовать никаких юнитов
используй глобальную переменную
Старый 09.07.2011, 21:24
PiCkUpEr_AsT

offline
Опыт: 1,060
Активность:
Цитата:
Сообщение от Helpmeplz
откуда таймер в фильтре группы?
кроме GetFilterUnit() ты не можешь использовать никаких юнитов


а почему тогда этоn cпелл работает на ура?
Код:
function Piersing_Arrow_cond takes nothing returns boolean
    return GetSpellAbilityId() == 'A01A'
endfunction

function Piersing_Arrow_Conds takes nothing returns boolean
    local timer t = GetExpiredTimer()
    local integer HII = GetHandleId(t)
    set t = null
    return IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE)==false and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(LoadUnitHandle(udg_h, (HII), (0))))==true and GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > .405
endfunction

function Piersing_Arrow_Timer takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer HII = GetHandleId(t)
    local unit u = (LoadUnitHandle(udg_h, (HII), (0)))
    local unit locust = (LoadUnitHandle(udg_h, (HII), (45)))
    local real X2I = (LoadReal(udg_h, (HII), (47)))
    local real X3I = (LoadReal(udg_h, (HII), (48)))
    local real Q4O = (LoadReal(udg_h, (HII), (13)))
    local real X1I = GetUnitX(locust)
    local real XOI = GetUnitY(locust)
    local real YSI = Xmin(GetUnitX(locust) + 30 * Cos(Q4O))
    local real YTI = Ymin(GetUnitY(locust) + 30 * Sin(Q4O))
    local boolexpr FM1 = Condition(function Piersing_Arrow_Conds)
    local group RGI = CreateGroup()
    local group g = LoadGroupHandle(udg_h, (HII), (1))
    local unit VLI
    local real AT2
    local real AR2
    call SetUnitX(locust, YSI)
    call SetUnitY(locust, YTI)
    call GroupEnumUnitsInRange(RGI, YSI, YTI, 140, FM1)
    set VLI = FirstOfGroup(RGI)
    if VLI!=null and IsUnitInGroup(VLI, g) == false then
        set AT2 = (LoadReal(udg_h, (HII), (191)))
        set AR2 = (LoadReal(udg_h, (HII), (192)))
        call UnitDT(u, VLI, 2, 5.0 * (GetUnitLevel(u) + GetHeroAgi(u, true)))
        call GroupAddUnit(g, VLI)
        call SaveGroupHandle(udg_h, (HII), (1), g)
        set t = null
        set u = null
        set locust = null
        set FM1 = null
        set RGI = null
        set VLI = null
//call UnitDamageTarget(u,VLI,90*GetUnitAbilityLevel(H9I,(1093684280)),true,false,ATTAC  K_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_WHOKNOWS)
    elseif(YSI - X2I) * (YSI - X2I) + (YTI - X3I) * (YTI - X3I) < 1600 then
        call KillUnit(locust)
        call destroy_timer(t)
        set t = null
        set u = null
        set locust = null
        set FM1 = null
        set RGI = null
        set VLI = null
    endif
endfunction

function Piersing_Arrow_act takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local real X1I = Xmin(GetUnitX(u))
    local real XOI = Ymin(GetUnitY(u))
    local location AC2 = GetSpellTargetLoc()
    local real X2I = GetLocationX(AC2)
    local real X3I = GetLocationY(AC2)
    local real Q4O = Atan2(X3I - XOI, X2I - X1I)
    local timer t = CreateTimer()
    local integer HII = GetHandleId(t)
    local unit locust = CreateUnit(GetOwningPlayer(u), 'h00Q', X1I, XOI, Q4O * bj_RADTODEG)
    local group g = CreateGroup()
    call RemoveLocation(AC2)
    call SetUnitFacing(locust, Q4O * bj_RADTODEG)
    call SetUnitPathing(locust, false)
    set X2I = Xmin(X1I + 3000 * Cos(Q4O))
    set X3I = Ymin(XOI + 3000 * Sin(Q4O))
    call SaveReal(udg_h, (HII), (191), ((X1I) * 1.0))
    call SaveReal(udg_h, (HII), (192), ((XOI) * 1.0))
    call SaveReal(udg_h, (HII), (47), ((X2I) * 1.0))
    call SaveReal(udg_h, (HII), (48), ((X3I) * 1.0))
    call SaveReal(udg_h, (HII), (13), ((Q4O) * 1.0))
    call SaveGroupHandle(udg_h, (HII), (1), g)
    call SaveUnitHandle(udg_h, (HII), (0), (u))
    call SaveUnitHandle(udg_h, (HII), (45), (locust))
    call TimerStart(t, 0.035, true, function Piersing_Arrow_Timer)
    set u = null
    set AC2 = null
    set t = null
    set locust = null
endfunction

function InitTrig_Piersing_Arrow takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEvent(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(t, Condition(function Piersing_Arrow_cond))
    call TriggerAddAction(t, function Piersing_Arrow_act)
    set t = null
endfunction


Цитата:
Сообщение от Helpmeplz
используй глобальную переменную

на сколько я понял из теории, локалки лучше глобалок, т.к. есть маленькая вероятность в глобалку записаться непонятно какой величине из n-кол-ва запущенных одного и того же триггера, например 10 исцеляющих заклинаний, запущенных в один и тот же момент с точностью до миллионных долей секунд, к примеру.
Старый 09.07.2011, 22:00
Hares
полупротосс
offline
Опыт: 6,966
Активность:
объявление глобальных переменных внутри триггера.
вроде бы, действуют только в нём, как и ф-ии (или везде, если объявлены в разделе описаний), но на совпадающие названия начинает ругаться.
((код
globals
integer i
player p
endglobals
function test takes integer a, real b returns nothing
a += i cJass. Равносильно:
set a = a + i
))
Делаешь 2 фильтра: 1 только на героев, 1 только на не-героев.
Затем подставляешь фильтр в 1 в группу все в области и берёшь 6 любых юниттов из получивышейся группы.
Хилишь каждого.
Измеряешь кол-во юнитов в группе. (i)
((код
if i < 6 then
подставляешь фильтр 2
из получившейся группы берёшь 6-i юнитов и хилишь их.
endif
))
а вот твой код оставил шокирующее впечатление. ЧИТАТЬ НЕВОЗМОЖНО!
(HII) - ты чего в скобки берёшь?
call, local, call ... переходи на cJass, там ето писать не надо
Xmin(GetUnitX(u)) - ты вообще дружишь с мозгами? GetUnitX возвращает ОДНО ЗНАЧЕНИЕ real, а ты берёшь и ищешь среди него минимальное (или я не понял действия той ф-ии, ибо её нет в этом триге, мог бы хоть описать её в 2х словах.
((код
local location AC2 = GetSpellTargetLoc()
local real X2I = GetLocationX(AC2)
local real X3I = GetLocationY(AC2)
))
Ты список ф-ий читал? GetSpellTargetX()//GetSpellTargetY()
переменные можно было назвать и понятным языком (location loc, real x, real y,...)
((код
local unit locust = CreateUnit(GetOwningPlayer(u), 'h00Q', X1I, XOI, Q4O * bj_RADTODEG)
...
call SetUnitFacing(locust, Q4O * bj_RADTODEG)
))
зачем его ещё раз поворачивать???
посмотрел на фильтр
» Filter
((код
function Trig_heal_hero takes nothing returns boolean
unit u = GetFilterUnit()
if IsPlayerEnemy(GetOwningPlayer(GetSpellAbilityUnit()), GetOwningPlayer(u)) then
return false
elseif IsUnitType(u, UNIT_TYPE_STRUCTURE)
return false
elseif IsUnitType(u, UNIT_TYPE_MECHANICAL)
return false
elseif GetWidgetLife(u) < 0.405
return false
elseif GetWidgetLife(u) >= GetUnitState(u, UNIT_STATE_MAX_LIFE)
return false
elseif not(IsUnitType(u, UNIT_TYPE_HERO))
return false
endif
return true
endfunction
))
он же нечитаем! Все условия записаны в единую строчку! (в отличае от вертикального)
пытался понять код и пройтись по нему, но ето у мя не получилось всязи с вышеупомянотыми причинами.
Лана, хватит издеваться.
» Разверни меня!
((код
define msg(s) = DisplayTimedTextToPlayer(GetOwningPlayer(GetSpellAbilityUnit()), 0, 0, 60, s)
))
((код
globals
integer a
integer i
endglobals
))
((код
function Trig_heal_Conditions takes nothing returns boolean
if GetSpellAbilityId() == 'Heal' then
return true
endif
return false
endfunction
))
((код
function Trig_heal_hero takes nothing returns boolean
unit u = GetFilterUnit()
if IsPlayerEnemy(GetOwningPlayer(GetSpellAbilityUnit()), GetOwningPlayer(u)) then
u = null
return false
elseif IsUnitType(u, UNIT_TYPE_STRUCTURE)
u = null
return false
elseif IsUnitType(u, UNIT_TYPE_MECHANICAL)
u = null
return false
elseif GetWidgetLife(u) < 0.405
u = null
return false
elseif GetWidgetLife(u) >= GetUnitState(u, UNIT_STATE_MAX_LIFE)
u = null
return false
elseif not(IsUnitType(u, UNIT_TYPE_HERO))
u = null
return false
endif
u = null
return true
endfunction
))
((код
function Trig_heal_nothero takes nothing returns boolean
unit u = GetFilterUnit()
if IsPlayerEnemy(GetOwningPlayer(GetSpellAbilityUnit()), GetOwningPlayer(u)) then
u = null
return false
elseif IsUnitType(u, UNIT_TYPE_STRUCTURE)
u = null
return false
elseif IsUnitType(u, UNIT_TYPE_MECHANICAL)
u = null
return false
elseif GetWidgetLife(u) < 0.405
u = null
return false
elseif GetWidgetLife(u) >= GetUnitState(u, UNIT_STATE_MAX_LIFE)
u = null
return false
elseif IsUnitType(u, UNIT_TYPE_HERO)
u = null
return false
endif
u = null
return true
endfunction
))
((код
function Trig_heal_heal takes nothing returns nothing
if i > 0 then
i--
UnitDamageTarget(GetSpellAbilityUnit(), GetEnumUnit(), -4.00 * GetHeroInt(GetSpellAbilityUnit(), true), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FORCE, WEAPON_TYPE_WHOKNOWS)
a++
endif
endfunction
))
((код
function Trig_heal_Actions takes nothing returns nothing
group g = CreateGroup()
boolexpr be = Condition(function Trig_heal_hero)
real x = GetSpellTargetX()
real y = GetSpellTargetY()
real dist = 400
i = 6
a = 0

GroupEnumUnitsInRange(g, x, y, dist, be)
ForGroup(g, function Trig_heal_heal)
DestroyBoolExpr(be)
DestroyGroup(g)
msg("Исцелено героев: " + I2S(a))

g = null
be = null

if i > 0 then
a = 0
g = CreateGroup()
be = Condition(function Trig_heal_nothero)
GroupEnumUnitsInRange(g, x, y, dist, be)
ForGroup(g, function Trig_heal_heal)
DestroyBoolExpr(be)
DestroyGroup(g)
msg("Исцелено не-героев: " + I2S(a))
msg(" ")

g = null
be = null
endif

endfunction
))
((код
===========================================================================
function InitTrig_heal takes nothing returns nothing
gg_trg_heal = CreateTrigger()
TriggerRegisterAnyUnitEventBJ(gg_trg_heal, EVENT_PLAYER_UNIT_SPELL_EFFECT)
TriggerAddCondition(gg_trg_heal, Condition( function Trig_heal_Conditions))
TriggerAddAction(gg_trg_heal, function Trig_heal_Actions)
endfunction
))
» вариант на Jass2 (том языке, на котором ты писал)
((код
globals
integer a_j2
integer i_j2
endglobals
))
((код
function trig_heal_j2_Conditions takes nothing returns boolean
if GetSpellAbilityId() == 'Heal' then
return true
endif
return false
endfunction
))
((код
function trig_heal_j2_hero takes nothing returns boolean
local unit u = GetFilterUnit()
if IsPlayerEnemy(GetOwningPlayer(GetSpellAbilityUnit()), GetOwningPlayer(u)) then
set u = null
return false
elseif IsUnitType(u, UNIT_TYPE_STRUCTURE)
set u = null
return false
elseif IsUnitType(u, UNIT_TYPE_MECHANICAL)
set u = null
return false
elseif GetWidgetLife(u) < 0.405
set u = null
return false
elseif GetWidgetLife(u) >= GetUnitState(u, UNIT_STATE_MAX_LIFE)
set u = null
return false
elseif not(IsUnitType(u, UNIT_TYPE_HERO))
set u = null
return false
endif
set u = null
return true
endfunction
))
((код
function trig_heal_j2_nothero takes nothing returns boolean
local unit u = GetFilterUnit()
if IsPlayerEnemy(GetOwningPlayer(GetSpellAbilityUnit()), GetOwningPlayer(u)) then
set u = null
return false
elseif IsUnitType(u, UNIT_TYPE_STRUCTURE)
set u = null
return false
elseif IsUnitType(u, UNIT_TYPE_MECHANICAL)
set u = null
return false
elseif GetWidgetLife(u) < 0.405
set u = null
return false
elseif GetWidgetLife(u) >= GetUnitState(u, UNIT_STATE_MAX_LIFE)
set u = null
return false
elseif IsUnitType(u, UNIT_TYPE_HERO)
set u = null
return false
endif
set u = null
return true
endfunction
))
((код
function trig_heal_j2_heal takes nothing returns nothing
if i_j2 > 0 then
set i_j2 = i_j2 - 1
call UnitDamageTarget(GetSpellAbilityUnit(), GetEnumUnit(), -4.00 * GetHeroInt(GetSpellAbilityUnit(), true), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FORCE, WEAPON_TYPE_WHOKNOWS)
set a_j2 = a_j2 + 1
endif
endfunction
))
((код
function trig_heal_j2_Actions takes nothing returns nothing
local group g = CreateGroup()
local boolexpr be = Condition(function trig_heal_j2_hero)
local real x = GetSpellTargetX()
local real y = GetSpellTargetY()
local real dist = 400
set i_j2 = 6
set a_j2 = 0

call GroupEnumUnitsInRange(g, x, y, dist, be)
call ForGroup(g, function trig_heal_j2_heal)
call DestroyBoolExpr(be)
call DestroyGroup(g)
call DisplayTimedTextToPlayer(GetOwningPlayer(GetSpellAbilityUnit()), 0, 0, 60, "Исцелено героев: " + I2S(a_j2))

set g = null
set be = null

if i_j2 > 0 then
set a_j2 = 0
set g = CreateGroup()
set be = Condition(function trig_heal_j2_nothero)
call GroupEnumUnitsInRange(g, x, y, dist, be)
call ForGroup(g, function trig_heal_j2_heal)
call DestroyBoolExpr(be)
call DestroyGroup(g)
call DisplayTimedTextToPlayer(GetOwningPlayer(GetSpellAbilityUnit()), 0, 0, 60, "Исцелено не-героев: " + I2S(a_j2))
call DisplayTimedTextToPlayer(GetOwningPlayer(GetSpellAbilityUnit()), 0, 0, 60, " ")

set g = null
set be = null
endif

endfunction
))
((код
===========================================================================
function InitTrig_heal_j2 takes nothing returns nothing
set gg_trg_heal_j2 = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_heal_j2, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_heal_j2, Condition( function trig_heal_j2_Conditions))
call TriggerAddAction(gg_trg_heal_j2, function trig_heal_j2_Actions)
endfunction
))
Проверил, работает, оптимизированно, cJass
Hares добавил:
приложил мапу
Только у мя не получилось добавить туда эффект на цель. Просто не получилось.
Hares добавил:
P.S.
и за всё ето всего 4 опыта дали =(
Прикрепленные файлы
Тип файла: w3x MegaHeal.w3x (12.6 Кбайт, 10 просмотров )

Отредактировано Hares, 31.12.2011 в 14:40.
Старый 11.07.2011, 20:16
PiCkUpEr_AsT

offline
Опыт: 1,060
Активность:
Цитата:
объявление глобальных переменных внутри триггера.
вроде бы, действуют только в нём, как и ф-ии (или везде, если объявлены в разделе описаний), но на совпадающие названия начинает ругаться.


довольно интересные взгляды)
значит если 500 героев одновременно замутят этот спелл, запуститься 500 разных глобалок? или 2 глобалки на 500 юнитов?
*и все это конечно же если глобалка объявлена внутри функции

Код:
call UnitDamageTarget(GetSpellAbilityUnit(), GetEnumUnit(), -4.00 * GetHeroInt(GetSpellAbilityUnit(), true), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FORCE, WEAPON_TYPE_WHOKNOWS)

**а если у меня стоит триггер на отлов урона, он будет это фиксировать?
ну т.е. если при положительном уроне вылетают циферки полученного дамага, то якобы при отрицательном уроне будут вылетать цифры полученного исцеления?

П.С. Большое спасибо за наглядное разъяснение, буду теперь много чего переправлять...
Старый 11.07.2011, 20:32
Hares
полупротосс
offline
Опыт: 6,966
Активность:
PiCkUpEr_AsT:
*и все это конечно же если глобалка объявлена внутри функции
глобалка не может быть объявлена внутри функции, только внутри триггера, библиотеки, секции описаний итд. Более того, к ней можно подписать private//public, но это действует только для библиотек.
В данном триге нет вэйтов (пауз) и BJ, поэтому будет работать как часы.
Просто я как-то сцётчики не обнулил и он сначала написал 11, потом 22, 33... Поэтому глобалки нужно обнулять.
**а если у меня стоит триггер на отлов урона, он будет это фиксировать?
ну т.е. если при положительном уроне вылетают циферки полученного дамага, то якобы при отрицательном уроне будут вылетать цифры полученного исцеления?
А хрен его знает. В зависимости от системы. SDMS показывает урон только меньше нуля, там работать будет (скорее всего).
P.S.
И старайся избегать БэДЖэев (BJ). Если у тебя есть Yass Helper, посмотри их код и ужаснись.

Отредактировано Hares, 12.07.2011 в 21:36.
Старый 12.07.2011, 21:29
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 19:48.