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

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

Ответ
 
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Написание МУИ аур
Ух как же у меня всё перекрутилось думая как это сделать через бафф или через что,начиная делать через отлов бафф столкнулось с тем что надо отлавливать носителя что б определить уровень
в итоге я это сделал и мне нужна оптимизация поэтому и сделал тему
теперь описание ауры
она в радиусе 600 союзным героям повышает максимальное кол-во здоровья по уровням
'G000' - Уровень1
'G001' - Уровень2
'G002' - Уровень3
'G003' - Уровень4
((кат Вот собственно код
library WisdomAura initializer Init{
    
    define{
        private Trigger = gg_trg_Wisdom_Aura
        private UT = UNIT_TYPE_HERO
        private UT2 = UNIT_TYPE_DEAD
        private sId = 'C002'
        private aId = 'G000'
        private Range = 601.
    }
    
    private bool Filter(){
        return GetUnitAbilityLevel(GetFilterUnit(),sId) > 0
    }
    
    private bool Filter2(){
        unit f = GetFilterUnit()
        bool b = IsUnitAlly(f,PFG) && IsUnitType(f,UT) && !IsUnitType(f,UT2)
        f = null
        return b
    }
    
    // Удаляем все способности
    private void ClearAbility(unit u){
        int i = 0
        whilenot i > 3{
            UnitRemoveAbility(u,aId+i)
            i = i + 1
        }
    }
    
    // Возврашает уровень дополнительного здоровья 
    private int GetUnitAura(unit u){
        int i = 0
        whilenot i > 3{
            if GetUnitAbilityLevel(u,i+aId) > 0{
                return i+1
            }
        i = i + 1
        }
        return 0
    }
    
    // Дейсвия от каждогоносителя
    private void GroupAction(group g,int lvl){
        unit u = null
        do{
            u = FirstOfGroup(g)
            exitwhen u == null
            if lvl != GetUnitAura(u) && GetUnitAbilityLevel(u,sId) <= lvl{ //если стоят рядом то даём больший уровень
                ClearAbility(u)
                UnitAddAbility(u,lvl+aId-1)
                UnitMakeAbilityPermanent(u,true,lvl+aId-1)
            }
            GroupRemoveUnit(g,u)
        }
        u = null
    }
    
    // Дейсвия отловливают группу носителей ауры на карте
    private void Action(){
        unit u = null
        group gB = null
        group g = CreateGroup()
        GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,Condition(function Filter))
        do{
            u = FirstOfGroup(g)
            exitwhen u == null
            int lvl = GetUnitAbilityLevel(u,sId)
            if lvl > 0{
                PFG = GetOwningPlayer(u)
                gB = CreateGroup()
                GroupEnumUnitsInRange(gB,GetUnitX(u),GetUnitY(u),Range,Condition(function Filter2))
                GroupAction(gB,lvl)
            }
            GroupRemoveUnit(g,u)
            DestroyGroup(gB)
        }
        DestroyGroup(g)
        g = null
        gB = null
        u = null
    }
    
    private void Init(){
        timer t = CreateTimer()
        TimerStart(t,1.,true,function Action)
        t = null
    }
    
}
))
и мне кажеться что очистки ауры нет надо сделать
((кат Вот теперь аура удаляется когда нет баффа
library WisdomAura initializer Init{
    
    define{
        private Trigger = gg_trg_Wisdom_Aura
        private UT = UNIT_TYPE_HERO
        private UT2 = UNIT_TYPE_DEAD
        private sId = 'C002'
        private aId = 'G000'
        private bId = 'B001'
        private Range = 601.
    }
    
    private bool Filter(){
        return GetUnitAbilityLevel(GetFilterUnit(),sId) > 0
    }
    
    private bool Filter2(){
        unit f = GetFilterUnit()
        bool b = IsUnitAlly(f,PFG) && IsUnitType(f,UT) && !IsUnitType(f,UT2)
        f = null
        return b
    }
    
    private void ClearAbility(unit u){
        int i = 0
        whilenot i > 3{
            UnitRemoveAbility(u,aId+i)
            i = i + 1
        }
    }
    
    private int GetUnitAura(unit u){
        int i = 0
        whilenot i > 3{
            if GetUnitAbilityLevel(u,i+aId) > 0{
                return i+1
            }
        i = i + 1
        }
        return 0
    }
    
    private void GroupAction(unit e,int lvl){
        unit u = null
        group g = CreateGroup()
        GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,Condition(function Filter2))
        do{
            u = FirstOfGroup(g)
            exitwhen u == null
            if IsUnitInRange(u,e,Range){
                if lvl != GetUnitAura(u) && GetUnitAbilityLevel(u,sId) <= lvl{
                    ClearAbility(u)
                    UnitAddAbility(u,lvl+aId-1)
                    UnitMakeAbilityPermanent(u,true,lvl+aId-1)
                }
            }else{
                if GetUnitAbilityLevel(u,bId) == 0{
                    ClearAbility(u)
                }
            }
            GroupRemoveUnit(g,u)
        }
        DestroyGroup(g)
        g = null
        u = null
    }
    
    
    private void Action(){
        unit u = null
        group g = CreateGroup()
        GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,Condition(function Filter))
        do{
            u = FirstOfGroup(g)
            exitwhen u == null
            int lvl = GetUnitAbilityLevel(u,sId)
            if lvl > 0{
                PFG = GetOwningPlayer(u)
                GroupAction(u,lvl)
            }
            GroupRemoveUnit(g,u)
        }
        DestroyGroup(g)
        g = null
        u = null
    }
    
    private void Init(){
        timer t = CreateTimer()
        TimerStart(t,1.,true,function Action)
        t = null
    }
    
}
))

Отредактировано Klop, 27.04.2012 в 15:21.
Старый 27.04.2012, 14:54
Klop
Папа римский
offline
Опыт: 13,006
Активность:
раз некто про то как оптимизировать весь этот код не пишет,значит оптимизировать нечего) и улучшить работу кода невозможно
Старый 28.04.2012, 00:03
Msey
????
offline
Опыт: 67,346
Активность:
Могу лишь дать совет:
не надо писать эту функцию, как приватную.
Она же происходит мгновенно.. ведь нет никаких сторонних вызовов или привязок структур-методов.
Просто назови триггер по-другому и всё.
	void IASP(){
        timer t = CreateTimer()
        TimerStart(t,1.,true,function Action)
        t = null
    }
    
}
и достаточно сделать обычную scope, здесь же нет макросов
Старый 28.04.2012, 01:20
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Msey, а какая разница приватная она или нет?
у меня все библиотеки начинаются так)
private void Init(){
}
ведь сторонний вызов или запрет не понадобится
Хотя есть ли смысл запускать эту функцию при изучении спелла?
или пусть работает таймер всегда
Старый 28.04.2012, 01:25
Msey
????
offline
Опыт: 67,346
Активность:
Klop:
ведь сторонний вызов или запрет не понадобится
'7 символов сэкономишь же)
Старый 28.04.2012, 01:44
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Msey, современные оптимизаторы вообще производят ренейм всех фукнций.
Старый 28.04.2012, 14:31
Ответ

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

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

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

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



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