Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Zinc
Тип:
Наработка
Версия Warcraft:
1.26+

Система мультикаста для заклинаний наподобии "Волна Силы".

MUI: да
Импорт: нет
Утечки: нет
Требования: JNGP

Скриншоты

Техничеcкие подробности

Установка
  • скопировать триггер SystemCastMultiWave
  • скопировать юнита Dummy. Равкод u000
Если равкод после копирования изменится, то указать это в настройках:
    /* Настройки системы */
    constant integer DummyID = 'u000';
  • скопировать нестандартные способности по вкусу
  • скопировать триггер SystemCastMultiWaveSetting
Код системы
//! zinc
library SystemCastMultiWave {
    /* Настройки системы */
    
    constant integer DummyID = 'u000';
    
    
    /**********************************************************
    *
    * ВСЁ, ЧТО НИЖЕ, ПРАВИТЬ НА СВОЙ СТРАХ И РИСК!!!
    *
    **********************************************************/
    
    SystemCastMultiWave Struct[];
    integer StructI = -1;
    
    function Angle(real x1, real y1, real x2, real y2) -> real { return bj_RADTODEG * Atan2(y2 - y1, x2 - x1); }
    function PolarX(real x, real d, real a) -> real { return x + d * Cos(a * bj_DEGTORAD); }
    function PolarY(real y, real d, real a) -> real { return y + d * Sin(a * bj_DEGTORAD); }
    function Distance(real x1, real y1, real x2, real y2) -> real {
            real dx = x2 - x1;
            real dy = y2 - y1;
            return SquareRoot(dx * dx + dy * dy);
    }
    
    function fixAngle(real a) -> real {
        if (a > 360){ a = a - 360; }
        else if (a < 0){ a = 360 + a; }
        return a;
    }
    
    public {
    
        struct SystemCastMultiWave {
            integer SpellHero, SpellDummy, SpellDummyOrder;
            unit DummyUnit[32];
            integer WaveCount[32];
            integer AngleStep[32];
            real DummyLifeTime = 0;
            
            static method create(integer sh, integer sd, string sdo, real dlt) -> SystemCastMultiWave {
                integer i;
                SystemCastMultiWave this = SystemCastMultiWave.allocate();
                this.SpellHero = sh;
                this.SpellDummy = sd;
                this.SpellDummyOrder = OrderId(sdo);
                this.DummyLifeTime = dlt;
         
                if (this.DummyLifeTime == 0){
                    for (0 <= i < bj_MAX_PLAYER_SLOTS) {
                        this.DummyUnit[i] = CreateUnit(Player(i), DummyID, 0, 0, 0);
                        UnitAddAbility(this.DummyUnit[i], this.SpellDummy);
                    }
                }
        
                StructI = StructI + 1;
                Struct[StructI] = this;
                
                return this;
            }
            
            method setLevel(integer level, integer cw) -> SystemCastMultiWave {
                this.WaveCount[level] = cw;
                return this;
            }
            
            method cast(unit caster, real x, real y, real a){
                integer i;
                integer level = GetUnitAbilityLevel(caster, this.SpellHero); 
                integer count = IMaxBJ(1, WaveCount[level]);
                player p = GetOwningPlayer(caster);
                integer pid = GetPlayerId(p);
                real dist = 50, step = 360 / count;
                unit u;
                
                if (this.DummyLifeTime == 0){
                    u = this.DummyUnit[pid];
                    SetUnitX(u, x);
                    SetUnitY(u, y);
                }
                
                for (0 < i <= count){
                    if (this.DummyLifeTime > 0){
                        u = CreateUnit(p, DummyID, x, y, 0);
                        UnitApplyTimedLife(u, 'BTLF', this.DummyLifeTime);
                        UnitAddAbility(u, this.SpellDummy);
                    }
                    
                    SetUnitAbilityLevel(u, this.SpellDummy, level);
                    IssuePointOrderById(u, this.SpellDummyOrder, PolarX(x, dist, a), PolarY(y, dist, a));
                    a = fixAngle(a + step);
                }
                
                u = null;
            }
            
            method check(integer abi) -> boolean {
                return abi == this.SpellHero;
            }
        }
    }
    
    function onInit(){
        integer i;
        trigger t = CreateTrigger();
        for (0 <= i < bj_MAX_PLAYER_SLOTS) {
            TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        }
        
        TriggerAddAction(t, function(){
            integer i;
            location loc = GetSpellTargetLoc();
            unit u = GetTriggerUnit();      
            real x, y, a;
            
            for (0 <= i <= StructI){
                if (Struct[i].check(GetSpellAbilityId())){
                    x = GetUnitX(u);
                    y = GetUnitY(u);
                    
                    if (loc == null){
                        a = GetUnitFacing(u);
                    } else {
                        a = Angle(x, y, GetLocationX(loc), GetLocationY(loc));
                    }
                    Struct[i].cast(u, x, y, a);
                }
            }
            
            RemoveLocation(loc); loc = null;
            u = null;
        });
    }
}
//! endzinc
Пример настройки
//! zinc
library SystemCastMultiWaveSetting requires SystemCastMultiWave { function onInit() {

    //Волна Силы I
    SystemCastMultiWave
        .create(
            'A001',         // Равкод способности, которую кастует герой
            'A000',         // Равкод способности, которую кастует дамми
            "shockwave",    // Приказ способности, которую кастует дамми
            0               // Время жизни дамми, если больше нуля, то на каждый каст будет создан отдельный дамми
        )
        .setLevel(
            1,  // Уровень способности, который настраиваем
            1   // Количество способностей, которые будут кастованы дамми
        )
        .setLevel(
            2,  // Уровень, который настраиваем
            2   // Количество способностей, которые будут кастованы дамми
        )
        .setLevel(
            3,  // Уровень, который настраиваем
            3   // Количество способностей, которые будут кастованы дамми
        )
    ;
    
    // Волна Силы II
    SystemCastMultiWave
        .create('A002', 'A000', "shockwave", 0)
        .setLevel(1, 12)
    ;
    
    // Пронзающая Смерть I
    SystemCastMultiWave
        .create('A004', 'A003', "impale", 10)
        .setLevel(1, 1)
        .setLevel(2, 2)
        .setLevel(3, 3)
    ;
    
    // Пронзающая Смерть II
    SystemCastMultiWave
        .create('A005', 'A003', "impale", 10)
        .setLevel(1, 12)
    ;
    
    // Тёмная стая I
    SystemCastMultiWave
        .create('A007', 'A006', "carrionswarm", 0)
        .setLevel(1, 1)
        .setLevel(2, 2)
        .setLevel(3, 3)
    ;
    
    // Тёмная стая II
    SystemCastMultiWave
        .create('A008', 'A006', "carrionswarm", 0)
        .setLevel(1, 12)
    ;
    
    // Огненное дыхание I
    SystemCastMultiWave
        .create('A00A', 'A009', "breathoffire", 0)
        .setLevel(1, 1)
        .setLevel(2, 2)
        .setLevel(3, 3)
    ;
    
    // Огненное дыхание II
    SystemCastMultiWave
        .create('A00B', 'A009', "breathoffire", 0)
        .setLevel(1, 12)
    ;

}}
//! endzinc
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
2
5 лет назад
0
можно вопрос этот способности можно ли использовать для разных карт ? примерно для кампани ?
0
26
5 лет назад
0
это система для создания таких способностей
0
7
5 лет назад
0
Как по мне, нужная вещь.
У меня всегда проблемы с градусами в редакторе. (в основном что бы градус всегда был одним и тем же, а не менялся).
Но было бы хорошо если бы было и на GUI.
0
29
5 лет назад
Отредактирован nazarpunk
0
примерно для кампани ?
Не тестировал для компании.
RiderOfBalance:
Как по мне, нужная вещь.
Как по мне, она ещё много чего не умеет.
Идея была в том, чтоб показать всем свой уровень и доработать систему по запросам в комментариях.
0
32
5 лет назад
0
Система слишка крута и сложна для тех кто пользуется гуи они мало что поймут, и одновременно слишком проста и бесполезна для тек кто знает jass, так как у них свои такие системы.
Но весьма полезна для тех кто учится и начинает переходить
0
29
5 лет назад
Отредактирован nazarpunk
0
Bergi_Bear:
Система слишка крута и сложна для тех кто пользуется гуи они мало что поймут, и одновременно слишком проста и бесполезна для тек кто знает jass, так как у них свои такие системы.
Но весьма полезна для тех кто учится и начинает переходить
Тоесть система находится в суперпозиции))
0
12
5 лет назад
0
Мне понравилось.~NazarPunk:
А можете сделать способность рывок?Просто мне очень нужно.
2
29
5 лет назад
2
А можете сделать способность рывок?Просто мне очень нужно.
Для этого существует тема Заклинания на заказ. А можно ещё и на сайте посмотреть:
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.