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

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

Закрытая тема
 
Kuzanin
Дед
offline
Опыт: 805
Активность:
Помогите исправить код
Способность Meat Hook:
Код карты:
Код:
function SetHandle takes string pTable,string pKey,handle pData returns nothing
    call StoreInteger(udg_gc_DTAX_Core,pTable,pKey,H2Ix(pData))
endfunction

function GetInteger takes string pTable,string pKey returns integer
    return GetStoredInteger(udg_gc_DTAX_Core,pTable,pKey)
endfunction

function FastFlush takes string pTable returns nothing
    call FlushStoredMission(udg_gc_DTAX_Core,pTable)
endfunction

function SetInteger takes string pTable,string pKey,integer pData returns nothing
    call StoreInteger(udg_gc_DTAX_Core,pTable,pKey,pData)
endfunction

function GetTimer takes string pTable,string pKey returns timer
    return GetStoredInteger(udg_gc_DTAX_Core,pTable,pKey)
    return null
endfunction

function GetUnit takes string pTable,string pKey returns unit
    return GetStoredInteger(udg_gc_DTAX_Core,pTable,pKey)
    return null
endfunction

Сам триггер Meat Hook.
Код:
scope MeatHook initializer Init
private function Conditions takes nothing returns boolean
    return GetSpellAbilityId()=='A06I'
endfunction

private function Filter takes nothing returns boolean
    if(IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) or GetUnitAbilityLevel(GetFilterUnit(),'A04R')==1)or GetFilterUnit()==udg_u_DTAX_temp then
        return false
    endif
    if GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)<=0 or GetUnitTypeId(GetFilterUnit())=='u00H'or GetUnitTypeId(GetFilterUnit())=='u00F'or IsUnitType(GetFilterUnit(),UNIT_TYPE_ANCIENT) then
        return false
    endif
    return true
endfunction

private function Timer takes nothing returns nothing
    local timer ltt=GetExpiredTimer()
    local timer lTk=GetTimer(H2Tx(ltt),"ExtendCache")
    local string lf5=H2Tx(lTk)
    local integer lTK=GetInteger(lf5,"ChainLinkNumber")
    local unit lFB=GetUnit(lf5,"Target")
    local unit lTl=GetUnit(lf5,"Pudge")
    local unit lgl=GetUnit(lf5,"ChainLinks"+I2S(lTK))
    if(lFB!=null)then
        call SetUnitX(lFB,GetUnitX(lgl))
        call SetUnitY(lFB,GetUnitY(lgl))
    endif
    call RemoveUnit(lgl)
    call SetInteger(lf5,"ChainLinkNumber",lTK-1)
    if(lTK==1)then
        call PauseTimer(ltt)
        call FastFlush(lf5)
        call FastFlush(H2Tx(ltt))
        call PolledWait(1)
        call DestroyTimer(ltt)
        call DestroyTimer(lTk)
    endif
endfunction

private function Main takes nothing returns nothing
    local timer ltt=GetExpiredTimer()
    local string lf5=H2Tx(ltt)
    local integer lTK=GetInteger(lf5,"ChainLinkNumber")
    local unit lTl=GetUnit(lf5,"Pudge")
    local real lnM=GetReal(lf5,"Angle")
    local integer lmZ=GetUnitAbilityLevel(lTl,'A06I')
    local unit lgl
    local group lEw
    local real lxx
    local real lyy
    local boolexpr lTM
    local timer lTn
    local string lCache2
    if(lTK<5+6*lmZ)then
        set lTK=lTK+1
        set lxx=GetUnitX(lTl)+lTK*40*Cos(lnM*bj_DEGTORAD)
        set lyy=GetUnitY(lTl)+lTK*40*Sin(lnM*bj_DEGTORAD)
        set lgl=CreateUnit(GetOwningPlayer(lTl),'u00H',lxx,lyy,lnM)
        call SetHandle(lf5,"ChainLinks"+I2S(lTK),lgl)
        call SetInteger(lf5,"ChainLinkNumber",lTK)
        set lEw=CreateGroup()
        set udg_u_DTAX_temp=lTl
        set lTM=Condition(function Filter)
        call GroupEnumUnitsInRange(lEw,lxx,lyy,'}',lTM)
        call DestroyBoolExpr(lTM)
        set lgl=FirstOfGroup(lEw)
        call DestroyGroup(lEw)
        if(lgl!=null)then
            call SetHandle(lf5,"Target",lgl)
            if IsUnitEnemy(lgl,GetOwningPlayer(lTl))then
                call UnitDamageTargetBJ(lTl,lgl,lmZ*100,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_ENHANCED)
                call DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl",lgl,"origin"))
            endif
            call PauseTimer(ltt)
            set lTn=CreateTimer()
            call SetHandle(H2Tx(lTn),"ExtendCache",ltt)
            call TimerStart(lTn,.03,true,function Timer)
        endif
    else
        call PauseTimer(ltt)
        set lTn=CreateTimer()
        call SetHandle(H2Tx(lTn),"ExtendCache",ltt)
        call TimerStart(lTn,.03,true,function Timer)
    endif
endfunction

private function Actions takes nothing returns nothing
    local location lTo=GetUnitLoc(GetSpellAbilityUnit())
    local location lng=GetSpellTargetLoc()
    local timer ltt=CreateTimer()
    local unit lTl=GetTriggerUnit()
    local real lnM=AngleBetweenPoints(lTo,lng)
    local string lf5=H2Tx(ltt)
    call SetHandle(lf5,"Pudge",lTl)
    call SetReal(lf5,"Angle",lnM)
    call TimerStart(ltt,.03,true,function Main)
    call RemoveLocation(lTo)
    call RemoveLocation(lng)
endfunction

private function Init takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(t,Condition(function Conditions))
    call TriggerAddAction(t,function Actions)
    set t = null
endfunction
endscope

Проблема: jngp проверяет и пишет все окей, но карта в варе не запускается. Пожалуйста помогите перевести все в хеш-таблицы.
Старый 28.03.2012, 14:41
BizzaroFukuro
MWS Hardcore
offline
Опыт: 2,178
Активность:
mazahaka45541:
jngp проверяет и пишет все окей, но карта в варе не запускается
Это из-за функций GetTimer и GetUnit.
Ты откопал слишком древний код, со времён когда ещё работал ретурнбаг.
Старый 28.03.2012, 15:30
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
function VirusHookCon takes nothing returns boolean
return GetSpellAbilityId()=='A01C'
endfunction

function VirusHookTimer takes nothing returns nothing
local timer tt = GetExpiredTimer()
local timer t = LoadTimerHandle(udg_Hash,GetHandleId(tt),StringHash("ExtendCache"))
local integer id = GetHandleId(t)
local unit c = LoadUnitHandle(udg_Hash,id,StringHash("Caster"))
local unit g = LoadUnitHandle(udg_Hash,id,StringHash("Target"))
local integer l = LoadInteger(udg_Hash,id,StringHash("Num"))
local unit d = LoadUnitHandle(udg_Hash,id,StringHash("VD"+I2S(l)))
if g != null then
call SetUnitPosition(g,GetUnitX(d),GetUnitY(d))
endif
call RemoveUnit(d)
call SaveInteger(udg_Hash,id,StringHash("Num"),l-1)
if l == 1 then
call FlushChildHashtable(udg_Hash,id)
call FlushChildHashtable(udg_Hash,GetHandleId(tt))
call DestroyTimer(t)
call DestroyTimer(tt)
endif
set c = null
set d = null
set g = null
set t = null
set tt = null
endfunction

function VirusHookMain takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id= GetHandleId(t)
local unit c = LoadUnitHandle(udg_Hash,id,StringHash("Caster"))
local real r = LoadReal(udg_Hash,id,StringHash("Angle"))
local integer l = LoadInteger(udg_Hash,id,StringHash("Num"))
local unit d
local unit u
local real x = GetUnitX(c)
local real y = GetUnitY(c)
local boolean b = false
local timer tt
if l < 25 then
set l = l+1
set x = GetUnitX(c)+(l*40.)*Cos(r)
set y = GetUnitY(c)+(l*40.)*Sin(r)
set d = CreateUnit(GetOwningPlayer(c),'u004',x,y,r*bj_RADTODEG)
call SaveUnitHandle(udg_Hash,id,StringHash("VD"+I2S(l)),d)
call SaveInteger(udg_Hash,id,StringHash("Num"),l)
call GroupClear(udg_G)
call GroupEnumUnitsInRange(udg_G,x,y,115,null)
loop
set u = FirstOfGroup(udg_G)
if IsPlayerEnemy(GetOwningPlayer(c), GetOwningPlayer(u))  then
set b = true
call SaveUnitHandle(udg_Hash,id,StringHash("Target"),u)
endif
call GroupRemoveUnit(udg_G,u)
exitwhen u == null or b
endloop
call GroupClear(udg_G)
if b then			
call PauseTimer(t)
set tt = CreateTimer()
call SaveTimerHandle(udg_Hash,GetHandleId(tt),StringHash("ExtendCache"),t)
call TimerStart(tt,.03,true,function VirusHookTimer)
endif
else
call PauseTimer(t)
set tt = CreateTimer()
call SaveTimerHandle(udg_Hash,GetHandleId(tt),StringHash("ExtendCache"),t)
call TimerStart(tt,.03,true,function VirusHookTimer)
endif
set c = null
set d = null
set u = null
set t = null
set tt = null
endfunction

function VirusHook takes nothing returns nothing
local unit c = GetSpellAbilityUnit()
local real X = GetSpellTargetX()
local real Y = GetSpellTargetY()
local real x = GetUnitX(c)
local real y = GetUnitY(c)
local timer t= CreateTimer()
local real r = Atan2(Y-y,X-x)
local integer id = GetHandleId(t)
call SaveUnitHandle(udg_Hash,id,StringHash("Caster"),c)
call SaveReal(udg_Hash,id,StringHash("Angle"),r)
call TimerStart(t,.03,true,function VirusHookMain)
set c = null
set t = null
endfunction

function InitTrig_Virus_Hook takes nothing returns nothing
set gg_trg_Virus_Hook=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Virus_Hook,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_Virus_Hook,Condition(function VirusHookCon))
call TriggerAddAction(gg_trg_Virus_Hook,function VirusHook)
endfunction
на разбирайся
Старый 28.03.2012, 16:07
Kuzanin
Дед
offline
Опыт: 805
Активность:
BizzaroFukuro, Это я понял и поэтому попросил помочь перевести в хеш-таблицы.
16GB, Благодарю)
Тему close.
Старый 28.03.2012, 19:28
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Да что ж вы так упорно все юзаете стрингхэш. Юзайте блин индексы которые не нужно рассчитывать перед обращением к ячейке хт.
Старый 28.03.2012, 21:32
Закрытая тема

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

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

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

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



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