, Гильдия «Черамор»

Заклинание: Благодать AOE

Published
» Способ реализации: Zinc
» Тип: Способность

AOE реализация заклинания "Благодать"

MUI: да
Импорт: нет
Утечки: нет
Требования: JNGP
Даммики не используются.

Скриншоты

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

» Установка
  • скопировать триггер SpellHolyBoltAOE
  • скопировать способность Благодать (герой). Равкод A000.
Если равкод после копирования изменится, то указать это в настройках:
constant integer SpellHero          = 'A000';   // Способность для героя.
    constant boolean IsDetectCaster     = true;     // Применять ли заклинание на кастере
    
    constant integer AllyUndeadAction       = 0;    /*  Что делать с дружественной нежитью:
                                                            0 - ничего
                                                            1 - лечить
                                                            2 - наносить урон
                                                    */
                                                
    constant integer EnemyNoUndeadAction    = 0;    /*  Что делать с враждебной НЕ нежитью:
                                                            0 - ничего
                                                            1 - лечить
                                                            2 - наносить урон
                                                    */
    
    constant string SpellEffect         = "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl";
    constant string SpellEffectAttach   = "origin";
    
    constant attacktype DamageAttackType = ATTACK_TYPE_MAGIC;   /* Тип урона:
                                                                    ATTACK_TYPE_CHAOS
                                                                    ATTACK_TYPE_HERO
                                                                    ATTACK_TYPE_MAGIC
                                                                    ATTACK_TYPE_MELEE
                                                                    ATTACK_TYPE_NORMAL
                                                                    ATTACK_TYPE_PIERCE
                                                                    ATTACK_TYPE_SIEGE
                                                                */
    
    // Указываем радиус захвата заклинания
    function getRange(integer level) -> integer {
        integer range[];
        range[1] = 100; // 1 уровень
        range[2] = 200; // 2 уровень
        range[3] = 300; // 3 уровень
        return range[level];
    }
    
    // Указываем количество вылеченных хитпоинтов
    function getHeal(integer level) -> integer {
        integer heal[];
        heal[1] = 200; // 1 уровень
        heal[2] = 400; // 2 уровень
        heal[3] = 600; // 3 уровень
        return heal[level];
    }
    
    // Указываем количество нанесённого урона
    function getDamage(integer level) -> integer {
        integer damage[];
        damage[1] = 100; // 1 уровень
        damage[2] = 200; // 2 уровень
        damage[3] = 300; // 3 уровень
        return damage[level];
    }
    
    // На кого действует заклинание
    function isUnit(unit u) -> boolean {
        return (
            !IsUnitType(u, UNIT_TYPE_STRUCTURE)     // НЕ здания
            &&
            !IsUnitType(u, UNIT_TYPE_MECHANICAL)    // НЕ механические
        );
    }
    /* Возможные типы:
        UNIT_TYPE_FLYING - Тип передвижения: Летающий
        UNIT_TYPE_GROUND - Тип передвижения: Пеший, НЕ Парящий
        UNIT_TYPE_ANCIENT
        UNIT_TYPE_ATTACKS_FLYING
        UNIT_TYPE_ATTACKS_GROUND
        UNIT_TYPE_DEAD
        UNIT_TYPE_ETHEREAL
        UNIT_TYPE_GIANT
        UNIT_TYPE_HERO
        UNIT_TYPE_MAGIC_IMMUNE
        UNIT_TYPE_MECHANICAL
        UNIT_TYPE_MELEE_ATTACKER
        UNIT_TYPE_PEON
        UNIT_TYPE_PLAGUED
        UNIT_TYPE_POISONED
        UNIT_TYPE_POLYMORPHED
        UNIT_TYPE_RANGED_ATTACKER
        UNIT_TYPE_RESISTANT
        UNIT_TYPE_SAPPER
        UNIT_TYPE_SLEEPING
        UNIT_TYPE_SNARED
        UNIT_TYPE_STRUCTURE
        UNIT_TYPE_STUNNED
        UNIT_TYPE_SUMMONED
        UNIT_TYPE_TAUREN
        UNIT_TYPE_TOWNHALL
        UNIT_TYPE_UNDEAD
    */
  • Настройки маны и перезарядки производятся в способности Благодать (герой).
» Код заклинания
//! zinc
library SpellHolyBoltAOE {

    /* Настройки заклинания */
    
    constant integer SpellHero          = 'A000';   // Способность для героя.
    constant boolean IsDetectCaster     = true;     // Применять ли заклинание на кастере
    
    constant integer AllyUndeadAction       = 0;    /*  Что делать с дружественной нежитью:
                                                            0 - ничего
                                                            1 - лечить
                                                            2 - наносить урон
                                                    */
                                                
    constant integer EnemyNoUndeadAction    = 0;    /*  Что делать с враждебной НЕ нежитью:
                                                            0 - ничего
                                                            1 - лечить
                                                            2 - наносить урон
                                                    */
    
    constant string SpellEffect         = "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl";
    constant string SpellEffectAttach   = "origin";
    
    constant attacktype DamageAttackType = ATTACK_TYPE_MAGIC;   /* Тип урона:
                                                                    ATTACK_TYPE_CHAOS
                                                                    ATTACK_TYPE_HERO
                                                                    ATTACK_TYPE_MAGIC
                                                                    ATTACK_TYPE_MELEE
                                                                    ATTACK_TYPE_NORMAL
                                                                    ATTACK_TYPE_PIERCE
                                                                    ATTACK_TYPE_SIEGE
                                                                */
    
    // Указываем радиус захвата заклинания
    function getRange(integer level) -> integer {
        integer range[];
        range[1] = 100; // 1 уровень
        range[2] = 200; // 2 уровень
        range[3] = 300; // 3 уровень
        return range[level];
    }
    
    // Указываем количество вылеченных хитпоинтов
    function getHeal(integer level) -> integer {
        integer heal[];
        heal[1] = 200; // 1 уровень
        heal[2] = 400; // 2 уровень
        heal[3] = 600; // 3 уровень
        return heal[level];
    }
    
    // Указываем количество нанесённого урона
    function getDamage(integer level) -> integer {
        integer damage[];
        damage[1] = 100; // 1 уровень
        damage[2] = 200; // 2 уровень
        damage[3] = 300; // 3 уровень
        return damage[level];
    }
    
    // На кого действует заклинание
    function isUnit(unit u) -> boolean {
        return (
            !IsUnitType(u, UNIT_TYPE_STRUCTURE)     // НЕ здания
            &&
            !IsUnitType(u, UNIT_TYPE_MECHANICAL)    // НЕ механические
        );
    }
    /* Возможные типы:
        UNIT_TYPE_FLYING - Тип передвижения: Летающий
        UNIT_TYPE_GROUND - Тип передвижения: Пеший, НЕ Парящий
        UNIT_TYPE_ANCIENT
        UNIT_TYPE_ATTACKS_FLYING
        UNIT_TYPE_ATTACKS_GROUND
        UNIT_TYPE_DEAD
        UNIT_TYPE_ETHEREAL
        UNIT_TYPE_GIANT
        UNIT_TYPE_HERO
        UNIT_TYPE_MAGIC_IMMUNE
        UNIT_TYPE_MECHANICAL
        UNIT_TYPE_MELEE_ATTACKER
        UNIT_TYPE_PEON
        UNIT_TYPE_PLAGUED
        UNIT_TYPE_POISONED
        UNIT_TYPE_POLYMORPHED
        UNIT_TYPE_RANGED_ATTACKER
        UNIT_TYPE_RESISTANT
        UNIT_TYPE_SAPPER
        UNIT_TYPE_SLEEPING
        UNIT_TYPE_SNARED
        UNIT_TYPE_STRUCTURE
        UNIT_TYPE_STUNNED
        UNIT_TYPE_SUMMONED
        UNIT_TYPE_TAUREN
        UNIT_TYPE_TOWNHALL
        UNIT_TYPE_UNDEAD
    */
    
    /* ВСЁ, ЧТО НИЖЕ, ПРАВИТЬ НА СВОЙ СТРАХ И РИСК!!! */
    function onInit(){
        trigger t = CreateTrigger();
        integer i;
        
        for (0 <= i < bj_MAX_PLAYER_SLOTS) {
            TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        }
        TriggerAddCondition(t, Condition( function() -> boolean { return SpellHero == GetSpellAbilityId(); }));
        TriggerAddAction(t, function(){
            location loc = GetSpellTargetLoc();
            real x = GetLocationX(loc);
            real y = GetLocationY(loc);
            boolean isEnemy, isUndead;
            group g = CreateGroup();
            unit target, caster = GetTriggerUnit();
            integer level = GetUnitAbilityLevel(caster, SpellHero);
            
            GroupEnumUnitsInRange(g, x, y, I2R(getRange(GetUnitAbilityLevel(caster, SpellHero))), Condition(function() -> boolean {
                if (GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) <= 0.405) {return false;}
                return isUnit(GetFilterUnit());
            }));
           
            while (true) {
                target = FirstOfGroup(g);
                if (target == null) { break; }
                
                if (!(!IsDetectCaster && caster == target)) {
                    isEnemy = IsPlayerEnemy(GetOwningPlayer(caster), GetOwningPlayer(target));
                    isUndead = IsUnitType(target, UNIT_TYPE_UNDEAD);
                    
                    if (
                        (!isUndead && !isEnemy) ||
                        (AllyUndeadAction == 1 && isUndead && !isEnemy) ||
                        (EnemyNoUndeadAction == 1 && !isUndead && isEnemy)
                    ){
                        DestroyEffect(AddSpecialEffectTarget(SpellEffect, target, SpellEffectAttach));
                        SetUnitState(target, UNIT_STATE_LIFE, GetUnitState(target, UNIT_STATE_LIFE) + getHeal(level));    
                    }
                
                    if (
                        (isUndead && isEnemy) ||
                        (AllyUndeadAction == 2 && isUndead && !isEnemy) ||
                        (EnemyNoUndeadAction == 2 && !isUndead && isEnemy)
                    ){
                        DestroyEffect(AddSpecialEffectTarget(SpellEffect, target, SpellEffectAttach));
                        UnitDamageTarget(caster, target, getDamage(level), true, false, DamageAttackType, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS);
                    }
                }
                
                GroupRemoveUnit(g, target);
            }
            
            RemoveLocation(loc);
            DestroyGroup(g);
            loc = null; g = null; caster = null;
        });

        t = null;
    }
}
//! endzinc


Views: 1 726

Elmibur #3 - 9 months ago 0
Голосов: +0 / -0
хм, че-то я меняю код и при тесте крашит варик. в чем проблем?
Elmibur #5 - 9 months ago 0
Голосов: +0 / -0
защита от взлома
а как сменить тогда количевство хила?
rsfghd #7 - 3 months ago 0
Голосов: +0 / -0
Можно было бы переменную булекспра пихнуть через гуи, а так же сами настройки, чтобы не шарящим за код было проще настраивать (к примеру есть разные варианты абилки, не копировать же весь код заново). Так же настроить, чтобы не только нежить получала варианты ничего/дамажить/лечить, чтобы пользователь сам выбирал к кому это применимо. Ну и оставить естественно возможность редактировать действия абилки через гуи. Перед получением урона выставить какую-то там глобалку на единичку. Если юнит получил урон и оно равно единичке, значит это твоя абилка, игрок сам сможет пихнуть сколько угодно эффектов и различных настроек
N7 Molot #8 - 3 months ago (изм. ) 2
Голосов: +2 / -0
rsfghd:
Автор не любил gui, так этому не бывать(
Vlod #9 - 3 months ago 2
Голосов: +2 / -0
rsfghd, если взять хотя бы 25 героев, у которых по 4 абилки, где у каждой по 3 переменных-параметра, - получается 300 переменных на гуи. Да еще переменные с других систем. Поэтому действительно проще, когда переменные для способности находятся там же, где и сама способность
rsfghd #10 - 3 months ago (изм. ) 0
Голосов: +0 / -0
Vlod, ты неправильно понял, локальным переменным присваивать глобалки. В итоге всего лишь несколько глобалок-настроек для всех твоих 100 абилок. Я уже делал так, а вот копировать весь этот код 100 раз уже не очень)
Да и для друзей активно этой темой пользуюсь, чтобы с кодом не мучились

Вот пример

N7 Molot, ну автор же для других людей всё таки делал))
Гуишникам и так страшно в код лезть, а тут ещё и зинк, пускай все предоставленные настройки и наверху. Те, кто шарит за абилки и на гуи смогут это сделать, поэтому я ориентировался на ландшафтеров всяких или любителей синематиков)
N7 Molot #11 - 3 months ago 2
Голосов: +2 / -0
rsfghd:
поверь мне, автор считает гуишниов, как людей, которые во времена вов используют каменные копья против ак-47
GetLocalPlayer #12 - 3 months ago 0
Голосов: +0 / -0
поверь мне, автор считает гуишниов, как людей, которые во времена вов используют каменные копья против ак-47
А вот тут ты не прав. Автор гуишников за людей не считает.
DarkLigthing #13 - 3 months ago 0
Голосов: +0 / -0
Сенсей по Lua вернулся! (: