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

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

Закрытая тема
 
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
2 Ближайших юнита
Этот код должен при изучении абилки героем, выбирать 2-х ближайших к нему героев и создавать над нами спец эффект
Но работает совсем некорректно, прошу помочь найти ошибки
function IsUnitDeadBX takes unit u returns boolean
    return GetUnitTypeId(u) == 0 or IsUnitType(u, UNIT_TYPE_DEAD)
endfunction

function FDFD takes unit pFb,unit pFB returns real
    local real lFC=GetUnitX(pFb)
    local real lFd=GetUnitY(pFb)
    local real lEv=GetUnitX(pFB)
    local real lEV=GetUnitY(pFB)
    if pFb==null or pFB==null then
        return 0x540BE3FF
    else
        return SquareRoot((lFC-lEv)*(lFC-lEv)+(lFd-lEV)*(lFd-lEV))
    endif
endfunction

function IsTarget takes unit u,unit d returns boolean
    return u!= null and IsUnitDeadBX(u) == false and not IsUnitType(u, UNIT_TYPE_STRUCTURE) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and IsUnitEnemy(u, GetOwningPlayer(d))
endfunction


function MagicArrowsCon takes nothing returns boolean
    return GetLearnedSkill()== 'A00X'
endfunction

function MagicArrowsEffect takes nothing returns nothing
    local timer t= GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit c = LoadUnitHandle(udg_AssassinHash,id,0)
    local group g = LoadGroupHandle(udg_AssassinHash,id,1)
    local group tg = LoadGroupHandle(udg_AssassinHash,id,2)
    local group ng = LoadGroupHandle(udg_AssassinHash,id,3)
    local real x = GetUnitX(c)
    local real y = GetUnitY(c)
    local unit u
    local unit w
    local real dist = 0.
    local real min = 1950.
    local string s = ""
    local integer i = 0
    if IsUnitDeadBX(c) == false then
        loop
            exitwhen i >= 12
            if IsPlayerAlly(GetOwningPlayer(c),Player(i)) then
                if (GetLocalPlayer()==Player(i)) then
                    set s = "Target2.mdx"
                endif
            endif
            set i=i+1
        endloop
        call GroupClear(g)
        call GroupClear(tg)
        call GroupClear(ng)
        call GroupEnumUnitsInRange(g,x,y,2000.,null)
        loop
            set u = FirstOfGroup(g)
            if IsUnitInGroup(u,tg) == false and IsTarget(u,c) and IsUnitType(u,UNIT_TYPE_HERO) and IsUnitVisible(u,GetOwningPlayer(c)) then
                set dist = FDFD(u,c)
                call DisplayTextToForce( GetPlayersAll(),"pick = " + GetHeroProperName(u) )
                call DisplayTextToForce( GetPlayersAll(),"dist = "+R2S(dist))
                call GroupAddUnit(ng,u)
                if dist < min then
                    set min = dist
                    set w = u
                endif
            endif
            call GroupAddUnit(tg,u)
            call GroupRemoveUnit(g,u)
            exitwhen u == null
        endloop
        call DisplayTextToForce( GetPlayersAll(),"w1 = " + GetHeroProperName(w) )
        if w!= null then
            call SaveUnitHandle(udg_AssassinHash,id,StringHash("TMA1"),w)
            call SaveEffectHandle(udg_AssassinHash,id,StringHash("ED"),AddSpecialEffectTarget(s,w,"ove​rhead"))
            call DisplayTextToForce(GetPlayersAll(),"addef1" )
        endif
        call GroupRemoveUnit(ng,LoadUnitHandle(udg_AssassinHash,id,StringHash("TMA1")))
        //call GroupRemoveUnit(ng,c)
        if FirstOfGroup(ng)!= null then
            set min = 1950.
            loop
                set u = FirstOfGroup(ng)
                call DisplayTextToForce( GetPlayersAll(),"pick2 = " + GetHeroProperName(u) )
                set dist = FDFD(u,c)
                if dist < min then
                    set min = dist
                    set w = u
                endif
                call GroupRemoveUnit(ng,u)
                exitwhen u == null
            endloop
            call DisplayTextToForce( GetPlayersAll(),"w2 = " + GetHeroProperName(w))
            if w!= null and w != LoadUnitHandle(udg_AssassinHash,id,StringHash("TMA1")) then
                call SaveUnitHandle(udg_AssassinHash,id,StringHash("TMA2"),w)
                call SaveEffectHandle(udg_AssassinHash,id,StringHash("ED2"),AddSpecialEffectTarget(s,w,"ov​erhead"))
                call DisplayTextToForce(GetPlayersAll(),"addef2")
            endif
        endif
        call SaveUnitHandle(udg_AssassinHash,id,StringHash("TMA1"),null)
        call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("ED")))
        call SaveUnitHandle(udg_AssassinHash,id,StringHash("TMA2"),null)
        call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("ED2")))
    endif
    set t = null
    set c = null
    set u = null
    set g = null
    set tg = null
    set ng = null
    set w = null
endfunction

function MagicArrowsLearn takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local timer t
    local integer id
    if GetUnitAbilityLevel(u,'A00X') == 1 then
        set t = CreateTimer()
        set id = GetHandleId(t)
        call SaveUnitHandle(udg_AssassinHash,id,0,u)
        call SaveGroupHandle(udg_AssassinHash,id,1,CreateGroup())
        call SaveGroupHandle(udg_AssassinHash,id,2,CreateGroup())
        call SaveGroupHandle(udg_AssassinHash,id,3,CreateGroup())
        call TimerStart(t,.2,true,function MagicArrowsEffect)
    endif
    set u = null
    set t = null
endfunction

//===========================================================================
function InitTrig_Magic_Arrows_new takes nothing returns nothing
    set gg_trg_Magic_Arrows_new = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Magic_Arrows_new, EVENT_PLAYER_HERO_SKILL )
    call TriggerAddCondition( gg_trg_Magic_Arrows_new, Condition( function MagicArrowsCon))
    call TriggerAddAction( gg_trg_Magic_Arrows_new, function MagicArrowsLearn)
endfunction

Отредактировано ShadoW DaemoN, 19.06.2011 в 10:44.
Старый 19.06.2011, 10:08
Doc

offline
Опыт: 63,163
Активность:
	loop
            exitwhen i >= 12
            if IsPlayerAlly(GetOwningPlayer(c),Player(i)) then
                if (GetLocalPlayer()==Player(i)) then
                    set s = "Target2.mdx"
                endif
            endif
            set i=i+1
        endloop
надо так.
if (IsPlayerAlly(GetOwningPlayer(c), GetLocalPlayer()))
вот, что я выдавил, вероятно не слишком оптимально, но должно работать.

function distun takes unit u, unit u2 returns real
local real dx = GetUnitX(u2) - GetUnitX(u)
local real dy = GetUnitY(u2) - GetUnitY(u)
return SquareRoot(dx * dx + dy * dy)
endfunction

function GetClosest takes unit h,group g returns unit
    local group gr=CreateGroup()
    local unit tmp
    local unit u=null
    local real d
    local real c=2000.
    set bj_groupAddGroupDest=gr
    call ForGroup(g,function GroupAddGroupEnum)
    loop
        set tmp=FirstOfGroup(gr)
        exitwhen      (tmp==null)
        set d=distun(h,tmp)
        if            (d<c) then
            set c=d
            set u=tmp
        endif
	call GroupRemoveUnit(gr, tmp)
    endloop
    call DestroyGroup(gr)
    set gr=null
    return         u
endfunction

globals
    filterfunc SpellFilter=null
    unit HERO=null
endglobals

function SpellFilterFunc takes nothing returns boolean
    return (IsUnitType(GetFilterUnit(),UNIT_TYPE_HERO) and  not IsUnitType(GetFilterUnit(),UNIT_TYPE_DEAD) and HERO!=GetFilterUnit())
endfunction
вот, что должно быть в самом спелле.
   local group g=CreateGroup()
    local unit caster=null
    local unit u1
    local unit u2
    if (SpellFilter==null) then
        set SpellFilter=Filter(function SpellFilterFunc)
    endif
    set HERO=caster
    call GroupEnumUnitsInRange(g,GetUnitX(caster),GetUnitY(caster),2000.,SpellFilter)
    set u1=GetClosest(caster,g)
    call GroupRemoveUnit(g,u1)
    set u2=GetClosest(caster,g)

Отредактировано Doc, 19.06.2011 в 15:12.
Старый 19.06.2011, 12:56
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
разобрался закрываем
Старый 19.06.2011, 14:40
Закрытая тема

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

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

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

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



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