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

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

Закрытая тема
 
perimetral

offline
Опыт: 3,058
Активность:
Damage System ошибка
Вот, набросал лично для себя маленькую Damage System. Скелет SDMS не понравился тем, что проверяются все юниты на карте, что может вызвать иногда лаги. Другие подобные системы какие-то слабые. Но вот протестил свою и понял, что она тоже нерабочая, прошу ткнуть меня носом на ошибки в коде, или что я делаю не так.
» Код
globals
hashtable hash
trigger gg_trg_initmap
trigger gg_trg_eventatacked
boolean on = true // глобальный переключатель. true - система включена, false - выключена.
endglobals

nothing Actions_damaged(unit u, unit ua, real r) {
// unit u == жертва
// unit ua == атакующий юнит
// real r == нанесенный урон. Положительное значение - урон, отрицательное - лечение.
}

nothing Remove_Trig(trigger t, triggeraction tAct) {
    TriggerRemoveAction(t, tAct)
    TriggerClearActions(t)
    DestroyTrigger(t)
}

nothing Event_damaged() {
    trigger t = GetTriggeringTrigger()
    integer tID = GetHandleId(t)
    unit u = LoadUnitHandle(hash, tID, 2)
    triggeraction tAct = LoadTriggerActionHandle(hash, tID, 1)
    real r = GetEventDamage()
    unit ua = GetEventDamageSource()
    if (r!=0.0) {
    Actions_damaged(u, ua, r)
    }
    Remove_Trig(t, tAct)
    tAct = null
    u = null
    ua = null
    t = null
}

nothing Event_atacked() {
    if (on) {
    trigger t = CreateTrigger()
    unit u = GetAttacker()
    integer tID = GetHandleId(t)
    TriggerRegisterUnitEvent(t, u, EVENT_UNIT_DAMAGED)
    triggeraction tAct = TriggerAddAction(t, function Event_damaged)
    SaveUnitHandle(hash, tID, 2, u)
    SaveTriggerActionHandle(hash, tID, 1, tAct)
    }
    //
    tAct = null
    u = null
    t = null
}

nothing InitTrigs() {
    gg_trg_eventatacked = CreateTrigger()
    integer i = 0
    player p
    loop {
    exitwhen i > bj_MAX_PLAYER_SLOTS
    p = Player(i)
    TriggerRegisterPlayerUnitEvent(gg_trg_eventatacked, p, EVENT_PLAYER_UNIT_ATTACKED, null)
    i++
    }
    TriggerAddAction(gg_trg_eventatacked, function Event_atacked)
    //
    p = null
}
Триггер инициализации:
nothing Trig_initmap_Actions() {
    hash = InitHashtable()
    InitTrigs()
}

nothing InitTrig_initmap() {
    gg_trg_init = CreateTrigger()
    TriggerRegisterTimerEvent(gg_trg_initmap, 0.01, false)
    TriggerAddAction(gg_trg_initmap, function Trig_initmap_Actions)
}

Отредактировано perimetral, 30.04.2010 в 14:38.
Старый 30.04.2010, 12:54
ZeToX2007

offline
Опыт: 7,009
Активность:
perimetral, Система тупая просто. Если допустим, юнит получил урон до того как другой успел атаковать?
Выбираей сначало всех юнитов на карте и добовляй им событие, а потом при создание новых ,функцией, делай тоже самое.
Старый 30.04.2010, 14:06
perimetral

offline
Опыт: 3,058
Активность:
ZeToX2007, лол, если получил урон из другого источника, то и будет считаться урон из другого источника, я ж не привязываю к атакующему конкретно. А если получил урон из того же истоника, то лолКАК? Вот: юнит1 замахивается на юнит2 и по твоим словам, есть шанс, что еще не опустив топора на голову юнита2, юнит1 нанесет урон. Ересь имхо.
Старый 30.04.2010, 14:36
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Код:
library dmg initializer settings
    
    globals
        private group G=CreateGroup()
        private trigger T=CreateTrigger()
    endglobals
    
    private function act takes nothing returns nothing
        call GroupAddUnit(G,GetTriggerUnit())
        call TriggerRegisterUnitEvent(T,GetTriggerUnit(),EVENT_UNIT_DAMAGED)
    endfunction
    
    private function cond takes nothing returns boolean
        return IsUnitInGroup(GetTriggerUnit(),G)==false
               
    endfunction
    
    private function act2 takes nothing returns nothing
        //
        // ТВОИ ДЕЙСТВИЯ, где GetTriggerUnit() - жертва, а GetEventDamageSource() - атакер
        //
    endfunction
    
    private function cond2 takes nothing returns boolean
        return true // ТВОИ УСЛОВИЯ, где GetTriggerUnit() - жертва, а GetEventDamageSource() - атакер
    endfunction
    
    private function act3 takes nothing returns nothing
        call GroupRemoveUnit(G,GetTriggerUnit())
    endfunction
    
    private function cond3 takes nothing returns boolean
        return IsUnitInGroup(GetTriggerUnit(),G)
    endfunction
    
    //===========================================================================
    private function settings takes nothing returns nothing
        local trigger t=CreateTrigger()
        local trigger t2=CreateTrigger()
        
        call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_ATTACKED)
        call TriggerAddCondition(t,Condition(function cond))
        call TriggerAddAction(t,function act)
        
        call TriggerRegisterAnyUnitEventBJ(t2,EVENT_PLAYER_UNIT_DEATH)
        call TriggerAddCondition(t2,Condition(function cond3))
        call TriggerAddAction(t2,function act3)
        
        call TriggerAddCondition(T,Condition(function cond2))
        call TriggerAddAction(T,function act2)
        
        set t=null
        set t2=null
    endfunction
    
endlibrary
Старый 30.04.2010, 15:01
perimetral

offline
Опыт: 3,058
Активность:
bee, триггеры не удаляются, как и их действия. А вообще за код спасибо =)
Старый 30.04.2010, 15:09
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Цитата:
триггеры не удаляются, как и их действия

они и не создаются
T - триггер-глобалка
Старый 30.04.2010, 15:19
perimetral

offline
Опыт: 3,058
Активность:
bee, Спасибо, понял, тему на клозед.
Старый 30.04.2010, 15:23
Закрытая тема

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

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

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

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



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