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

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

Закрытая тема
 
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Написание MUI спеллов
Скорее не вопрос,а просьба обьяснить написание MUI спеллов,хотелось бы что бы обьяснили суть и помогли перевести вот этот спелл в MUI заранее благодарен
globals
    unit SDU = null
    group SDG = null
    timer SDT = null
    integer SDI = 0
    real SDX = 0
    real SDY = 0
endglobals

function StoneDecay_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A000'
endfunction

function StoneDecayFilter takes nothing returns boolean
    return IsUnitAlly(GetFilterUnit(),GetOwningPlayer(SDU)) == false and GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>0
endfunction

function StoneDecayDamage takes nothing returns nothing
    local real r = Atan2(GetUnitY(GetEnumUnit()-GetUnitY(SDU),GetUnitX(GetEnumUnit())-GetUnitX(SDU)))
    //Нахождение угла между пикнутыми юнитами
    local effect e = AddSpecialEffect("abilities\\weapons\\catapult\\catapultmissile.mdl",GetUnitX(GetEnumUnit(​)),GetUnitY(GetEnumUnit()))
    call Damage(9*GetUnitAbilityLevel(SDU,'A000'),SDU,GetEnumUnit())
    //Функция обычная DamageTarget только с меньшим кол-вом параметоров
    if IsTerrainPathable(AX(GetUnitX(GetEnumUnit()),r,20),AY(GetUnitY(GetEnumUnit()),r,20),PATHING_TYPE_WAL​KABILITY) == false then
    // отталкивание и првоерка на проходимость
    call SetUnitX(GetEnumUnit(),AX(GetUnitX(GetEnumUnit()),r,20))
    call SetUnitY(GetEnumUnit(),AY(GetUnitY(GetEnumUnit()),r,20))
    endif
    call DestroyEffect(e)
endfunction

function StoneDecayTimer takes nothing returns nothing
    if SDI <= 10 then
    set SDG = CreateGroup()
    call GroupEnumUnitsInRange(SDG,SDX,SDY,300,Condition(function StoneDecayFilter))
    call ForGroup(SDG,function StoneDecayDamage)
    call DestroyGroup(SDG)
    set SDG = null
    set SDI = SDI + 1
    else
    call DestroyTimer(SDT)
    set SDU = null
    set SDT = null
    // Функция Check к спеллу не относится просто првоеряю утечки
    call Check()
    endif
endfunction

function StoneDecay_Actions takes nothing returns nothing
    //----------------------------------------------------------------
    set SDI = 0
    set SDX = GetSpellTargetX()
    set SDY = GetSpellTargetY()
    set SDU = GetTriggerUnit()
    set SDT = CreateTimer()
    call SetUnitX(SDU,SDX)
    call SetUnitY(SDU,SDY)
    call SetUnitAnimationByIndex(SDU,9)
    call TimerStart(SDT,0.05,true,function StoneDecayTimer)
endfunction

//===========================================================================
function InitTrig_StoneDecay takes nothing returns nothing
    local trigger t = CreateTrigger()
    call EventUnit(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(t,Condition(function StoneDecay_Conditions))
    call TriggerAddAction(t,function StoneDecay_Actions)
    set t = null
endfunction
Старый 03.11.2010, 23:23
Nekit1234007

offline
Опыт: 11,916
Активность:
Хеш-таблицы, примеры есть.
Старый 03.11.2010, 23:27
Klop
Папа римский
offline
Опыт: 13,006
Активность:
всёравно нужна помощь,вот переписал код под Хеш таблицу,скажите правильно ли всё сделано надо что б кто то проверил((
function StoneDecay_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A000'
endfunction

function StoneDecayFilter takes nothing returns boolean
    local timer t = GetExpiredTimer()
    local unit u = LoadUnitHandle(h,GetHandleId(t),4)
    local boolean b = IsUnitAlly(GetFilterUnit(),GetOwningPlayer(u)) == false and GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>0
    set t = null
    set u = null
    return b
endfunction

function StoneDecayDamage takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit u = LoadUnitHandle(h,GetHandleId(t),4)
    local real r = Atan2(GetUnitY(GetEnumUnit())-GetUnitY(u),GetUnitX(GetEnumUnit())-GetUnitX(u))
    local effect e = AddSpecialEffect("abilities\\weapons\\catapult\\catapultmissile.mdl",GetUnitX(GetEnumUnit(​)),GetUnitY(GetEnumUnit()))
    call Damage(9*GetUnitAbilityLevel(u,'A000'),u,GetEnumUnit())
    if IsTerrainPathable(AX(GetUnitX(GetEnumUnit()),r,20),AY(GetUnitY(GetEnumUnit()),r,20),PATHING_TYPE_WAL​KABILITY) == false then
    call SetUnitX(GetEnumUnit(),AX(GetUnitX(GetEnumUnit()),r,20))
    call SetUnitY(GetEnumUnit(),AY(GetUnitY(GetEnumUnit()),r,20))
    endif
    call DestroyEffect(e)
    set u = null
    set t = null
endfunction

function StoneDecayTimer takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local group g = null
    local real x = LoadReal(h,GetHandleId(t),2)
    local real y = LoadReal(h,GetHandleId(t),3)
    local integer i = LoadInteger(h,GetHandleId(t),1)
    if i <= 10 then
    set g = CreateGroup()
    call GroupEnumUnitsInRange(g,x,y,300,Condition(function StoneDecayFilter))
    call ForGroup(g,function StoneDecayDamage)
    call DestroyGroup(g)
    set g = null
    set i = i + 1
    call SaveInteger(h,GetHandleId(t),1,i)
    else
    call FlushChildHashtable(h,GetHandleId(t))
    call DestroyTimer(t)
    set t = null
    call Check()
    endif
endfunction

function StoneDecay_Actions takes nothing returns nothing
    //----------------------------------------------------------------
    local timer t = CreateTimer()
    call SaveInteger(h,GetHandleId(t),1,0)
    call SaveReal(h,GetHandleId(t),2,GetSpellTargetX())
    call SaveReal(h,GetHandleId(t),3,GetSpellTargetY())
    call SaveUnitHandle(h,GetHandleId(t),4,GetTriggerUnit())
    call SetUnitX(GetTriggerUnit(),GetSpellTargetX())
    call SetUnitY(GetTriggerUnit(),GetSpellTargetY())
    call SetUnitAnimationByIndex(GetTriggerUnit(),9)
    call TimerStart(t,0.05,true,function StoneDecayTimer)
endfunction

//===========================================================================
function InitTrig_StoneDecay takes nothing returns nothing
    local trigger t = CreateTrigger()
    call EventUnit(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(t,Condition(function StoneDecay_Conditions))
    call TriggerAddAction(t,function StoneDecay_Actions)
    set t = null
endfunction
Старый 03.11.2010, 23:49
Doc

offline
Опыт: 63,163
Активность:
local timer t = CreateTimer()
не обнуляешь.
local effect e = AddSpecialEffect("abilities\\weapons\\catapult\\catapultmissile.mdl",GetUnitX(GetEnumUnit(​&#8203;)),GetUnitY(GetEnumUnit()))
не обнуляешь.
Старый 03.11.2010, 23:51
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Doc:
local effect e = AddSpecialEffect("abilities\\weapons\\catapult\\catapultmissile.mdl",GetUnitX(GetEnumUnit(​&#8203;&#8203;)),GetUnitY(GetEnumUnit()))
КОгда я ставлю в конце set e = null
Появляются утечки,когда не ставлю их нету
уже исправил
Local group g = CreateGroup()
set g = CreateGroup()
Тупонул я немного
Старый 03.11.2010, 23:53
Nekit1234007

offline
Опыт: 11,916
Активность:
Всё ок?
Старый 03.11.2010, 23:56
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Вообщем спасибо вам,теперь понял что надо всётаки юзать хеш,а не глобалки)
Старый 04.11.2010, 00:00
XOR

offline
Опыт: 38,159
Активность:
до хеша все отлично делалось на глобалках, лол
Старый 04.11.2010, 00:43
Закрытая тема

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

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

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

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



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