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

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

Ответ
 
karaliti
z0r
offline
Опыт: 94
Активность:
HaveStoredBoolean
Вот попробовал работать с кешем, и сразу неудачно.
Короче я записываю в юнита булеан что он получил дмг, потом в фильтре при группированию юнитов использую HaveStoredBoolean, и ноль на массу =( примерно так
Код:
return GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0. and IsUnitEnemy(GetFilterUnit(), stOwner) and not HaveStoredBoolean(cache, I2S(U2I(GetFilterUnit())), "damaged")

пытался через иф вставить в саму фун-ю - эффект лаги и нечего не работает =(
Код:
loop
    set f = FirstOfGroup(g)
    exitwhen f == null
    if HaveStoredBoolean(cache, I2S(U2I(f)), "damaged")==false then
        call UnitDamageTarget(s.u, f, 100, true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
        set cUnit[num] = f
        call StoreBoolean(cache, I2S(U2I(cUnit[num])), "damaged", true)
        call SetUnitColor(cUnit[num], PLAYER_COLOR_RED)
        set num = num + 1
    else
        call GroupRemoveUnit(g, f)
    endif
endloop

Короче помогите разобраться, где я напортачил?
Старый 09.06.2009, 01:00
J
expert
offline
Опыт: 48,447
Активность:
вместо HaveStoredBoolean используй GetStoredBoolean
Старый 09.06.2009, 02:07
karaliti
z0r
offline
Опыт: 94
Активность:
Спасибо, но проблема была не в этом =( (я в начале так и делал)
Я просто забыл инициализировать кеш =((((
Сидел пол дня делал и так, и сяк =((
В общем вышло вот что
Код:
scope st initializer Init

globals
    private constant integer spellID = 'A000'
    private constant integer dummyID = 'u000'
    private constant string  tEffect = "Abilities\\Spells\\Human\\ManaFlare\\ManaFlareBoltImpact.mdl"
    private real    Period      = 0.05
    private real    Speed       = 700
    private real    Distance    = Speed * Period
    private sTest   Temp 
    private player  stOwner
    private unit    array cUnit    
    private integer num         = 0
endglobals

struct sTest
    unit u
    unit tu
    unit dummy
    real sin 
    real cos
    real mc
    real rc = 0
    timer t
    
        method onDestroy takes nothing returns nothing
            set this.u      = null
            set this.tu     = null
            set this.t      = null
            set this.dummy  = null
        endmethod
        
        method MoveAtan2 takes nothing returns real
            local real x    =   GetUnitX    (this.dummy )
            local real y    =   GetUnitY    (this.dummy )
            local real dx   =   GetUnitX    (this.tu    ) - x
            local real dy   =   GetUnitY    (this.tu    ) - y
            return              Atan2       (dy, dx     )
        endmethod
        
        method MoveCos takes nothing returns real
            return  Distance *  Cos         (this.MoveAtan2()   )
        endmethod
        
        method MoveSin takes nothing returns real
            return  Distance *  Sin         (this.MoveAtan2()   )
        endmethod
        
        method MoveCount takes nothing returns real
            local real x    =   GetUnitX     (this.u    )
            local real y    =   GetUnitY     (this.u    )
            local real dx   =   GetUnitX     (this.tu   ) - x
            local real dy   =   GetUnitY     (this.tu   ) - y
            return              SquareRoot   (dx * dx + dy * dy )/Distance
        endmethod
endstruct

private function stCon takes nothing returns boolean
    return GetSpellAbilityId()==spellID
endfunction


private function stFilter takes nothing returns boolean
    return GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0 and IsUnitEnemy(GetFilterUnit(), stOwner) and not GetStoredBoolean(udg_cache, I2S(U2I(GetFilterUnit())), "damaged")
endfunction

private function stTimer takes nothing returns nothing
    local sTest     s
    local unit      f
    local group     g   = CreateGroup()
    local integer   ls  = 0
    set             s   = Temp
    if s.rc >= s.mc then
        call KillUnit(s.dummy)
        call DestroyTimer(s.t)
        call UnitDamageTarget(s.u, s.tu, 350, true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) 
        call sTest.destroy(s)
        loop
            exitwhen ls >= num
            call FlushStoredBoolean(udg_cache, I2S(U2I(cUnit[num])), "damaged")
            set num = num - 1
        endloop
    else
        set s.cos = s.MoveCos() 
        set s.sin = s.MoveSin()
        call SetUnitX(s.dummy, GetUnitX(s.dummy) + s.cos)
        call SetUnitY(s.dummy, GetUnitY(s.dummy) + s.sin)
        call GroupEnumUnitsInRange(g, GetUnitX(s.dummy), GetUnitY(s.dummy), 350, Condition(function stFilter))
            loop
                set f = FirstOfGroup(g)
                exitwhen f == null
                call DestroyEffect(AddSpecialEffect(tEffect, GetUnitX(f), GetUnitY(f)))
                call UnitDamageTarget(s.u, f, 100, true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
                call StoreBoolean(udg_cache, I2S(U2I(f)), "damaged", true)
                set num = num + 1
                set cUnit[num] = f
                call GroupRemoveUnit(g, f)
            endloop
        set s.rc = s.rc + 1
    endif
    call DestroyGroup(g)
    set f = null
    set g = null
endfunction

private function stMain takes nothing returns nothing
    local sTest s = sTest.create()
    set s.t = CreateTimer()
    set s.u = GetTriggerUnit()
    set s.tu = GetSpellTargetUnit()
    set stOwner = GetOwningPlayer(s.u)
    set s.cos = s.MoveCos()
    set s.sin = s.MoveSin()
    set s.dummy = CreateUnit(GetOwningPlayer(s.u), dummyID, GetUnitX(s.u), GetUnitY(s.u), GetUnitFacing(s.u))
    call SetUnitPathing(s.dummy, false)
    call PauseUnit(s.dummy, true)
    call TimerStart(s.t, Period, true, function stTimer)
    set s.mc = s.MoveCount()
    set Temp = s
endfunction

private function Init takes nothing returns nothing
    local trigger lt = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(lt, EVENT_PLAYER_UNIT_SPELL_CAST)
    call TriggerAddCondition(lt, Condition(function stCon))
    call TriggerAddAction(lt, function stMain)
    call Preload(tEffect)
endfunction
endscope

Насколько кривой получился код? Как насчет утечек? Я только учусь так что ваша критика мне будет только на пользу.
"писал после изучения одной карты(а как еще разобраться что к чему=) ), так что код может быть похожим"

Отредактировано karaliti, 09.06.2009 в 03:37.
Старый 09.06.2009, 03:28
Ответ

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

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

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

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



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