Атака всех видимых врагов заклинанием
Нужно чтобы при активации спел бил по всем видимым врагам. Как это реализовать и возможно ли вообще, я не знаю.

Лучший ответ:
NazarPunk:
» И что тут сложного
//! zinc
library SpellDamageAllVisible {

    /* Настройки заклинания */
    
    constant integer SpellHero          = 'A000';   // Способность для героя.
    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 getDamage(integer level) -> integer {
        return level * 100;
    }
  
    /* ВСЁ, ЧТО НИЖЕ, ПРАВИТЬ НА СВОЙ СТРАХ И РИСК!!! */
    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(){
            group g = CreateGroup();
            unit target, caster = GetTriggerUnit();
            integer level = GetUnitAbilityLevel(caster, SpellHero);
            
            GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, Condition(function() -> boolean {
                return GetWidgetLife(GetFilterUnit()) >= 0.405;
            }));
           
            while (true) {
                target = FirstOfGroup(g);
                if (target == null) { break; }
                if (
                    IsPlayerEnemy(GetOwningPlayer(caster), GetOwningPlayer(target))
                    &&
                    IsUnitVisible(target, GetOwningPlayer(caster))
                ) {
                    DestroyEffect(AddSpecialEffectTarget(SpellEffect, target, SpellEffectAttach));
                    UnitDamageTarget(caster, target, getDamage(level), true, false, DamageAttackType, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS);                
                }
    
                GroupRemoveUnit(g, target);
            }
            
            DestroyGroup(g);
            g = null; caster = null;
        });

        t = null;
    }
}
//! endzinc
8gabriel8:
Странно вы группы удаляете, обычно перед перебором
set bj_wantDestroyGroup = true
О, во, чётко, пасиба. (жаль на джазе сделал, ну да ладно)
о, 8gabriel8 тоже сделал на "Заклинания на заказ" ща чекну..



Просмотров: 261

» Лучшие комментарии


XGM Bot #1 - 4 дня назад 2
Похожие вопросы:

» ответ
В этом архиве ищи свои скиллы, в [скобках] смотри нужный ID.
» ответ
Конечно много мороки. Нужно создать предмет для каждого спелла. Для предмета задать id-код тот же что и в спела. Если id будет одинаковый, то описание, название и картинка предмета будет как у спелла. Если создать другое id, то нужно самому указывать пиктограммы, описание и название. Всем предметам даешь особенность использовать сразу или нет (на твой выбор). Всем предметам даешь нестандартную способность-пустышку. Дальше создаешь глобальные переменные для каждого героя твоей карты, в которые будут записываться id-способностей. Потом создаешь отдельный триггер для изучения нового или улучшение спелла. Событие "Юнит использует предмет". Условие "Классификация предмета == Усиливающие". (Так мы будем классифицировать предметы для изучения спеллов). Дальше нужно узнать id способности, которую хотят выучить. Если id ваших предметов такие же как у спеллов, то просто в переменную id способности записываешь id триггерного предмета. Если нет, то нужно через много условий типа "Если предмет равно == Благодать, то в переменную spell записать 'AHhb' ". Это много мороки. Потом проверяешь с глобальными переменными. Если у героя уже есть такой спелл, то нужно повысить его уровень. Если такого спелла нету, то удалить предыдущий спелл и дать этот.
» ответ
Так триггер-то не MUI. Нужно через локальные переменные делать.
Статья про локальные переменные.
Исправил. Смотри, изучай - пригодится)
» ответ
Проще сразу сделать триггено, торнадо вроде вручается абилка чтобы он сам ходил.
Канал с временем каста и обычный суммон, так же триггер с событием юнит завершил каст, дейсвтие найти вызванного им юнита и убить.
И событие юнит умирает, действие запаузить и тут же снять паузу с кастующего юнита. при услови что его текущий приказ равен - кастовать твою абилку.
Все просто.
» ответ
Solo, "Отдать приказ - тип цель/точка/без цели" там находишь спелл, из которого сделал свой нестандартный. На джасе проще

Esea #3 - 4 дня назад -4
Hate:
ну серьёзно что ли? нужно заполнять там заявку и ждать... ну, если здесь ответа не найду то придётся.
PrincePhoenix #4 - 4 дня назад 0
Вкратце, необходима проверка Unit is Visible for ...
Esea #5 - 4 дня назад -2
PrincePhoenix:
Вкратце, необходима проверка Unit is Visible for ...
попробую
Esea:
PrincePhoenix:
Вкратце, необходима проверка Unit is Visible for ...
попробую
Не получилось..
NazarPunk #6 - 4 дня назад 0
Вкратце, необходима проверка Unit is Visible for .
Проверяет только Fog of War, нужно проверять все баффы невидимости, которых, к счастью, не так уж и много.
Hate #7 - 4 дня назад 0
NazarPunk:
Вкратце, необходима проверка Unit is Visible for .
Проверяет только Fog of War, нужно проверять все баффы невидимости, которых, к счастью, не так уж и много.
у меня работало и с невидимостью вроде как
NazarPunk #8 - 4 дня назад 0
у меня работало и с невидимостью вроде как
Буду за компом, сделаю тесты. Самому интересно.
Esea #9 - 4 дня назад 0
Всё таки написал туда~Hate:
PT153 #10 - 4 дня назад 0
Вкратце, необходима проверка Unit is Visible for ...
Эта функция пашет только для людей, для ИИ возвращает false.
NazarPunk:
Проверяет только Fog of War
Да нет, с невидимость проверяет.
NazarPunk #11 - 4 дня назад 0
Да нет, с невидимость проверяет.
Если руки дойдут, потещу.
PT153 #12 - 4 дня назад 0
Если руки дойдут, потещу.
Ну я тестил, вернёт ложь, если юнит невидим. Если игрок ИИ, то всегда ложь, почему-то.
Но проверь и ты, вдруг я где-то накосячил.
NazarPunk #13 - 4 дня назад 0
Но проверь и ты, вдруг я где-то накосячил.
Я вот точно помню, что есть n+ подводных камней с видимотью на баффах. К сожалению сейчас просто нет времени, но самому интересно, потещу)
pro100master #14 - 4 дня назад 0
а не проше проверить если кастер игрок не видит его то не заносить в группу...
quq_CCCP #15 - 4 дня назад 4
Веер ножей мБ?
Esea #16 - 4 дня назад (отредактировано ) 0
quq_CCCP:
Веер ножей мБ?
и как же это сделать?
да и не думаю что если поставить гигантскую дальность то он не будет бить тех которых ты не видишь
ssbbssc #17 - 4 дня назад 2
вы о чем вообще
если отдавать приказ на каст дамми юниту - он не сможет кастануть его на инвизерного юнита, если рядом нет варда или другого детектора

единственное что - дамми создаются, но самого каста нет
прикреплены файлы
quq_CCCP #18 - 3 дня назад 0
Esea, ShareVision не не слышал, ты можешь выдать видимость над всеми юнитами, сделать каст и тут же забрать видимость, все.
PT153 #19 - 3 дня назад 0
ShareVision
Вот это ржачная вещь, сделал ShareVision невидимому юниту, мои войска его атаковали, но сам я его не видел.
Esea #20 - 3 дня назад 0
мде, так и не понимаю о чём вы? повторюсь:нужен спелл, активируешь дамажит всех ВИДИМЫХ врагов на карте (не важно где они находятся). И если враг в невидимости, значит - ты его не видишь - спелл на него не работает.
8gabriel8 #21 - 3 дня назад 0
Скрин триггера приложи, как ты сделал с проверкой видимости, что не работало. Потому что это должно очень просто делаться, то есть скорее всего допущена ошибка.
Esea #22 - 3 дня назад 0
8gabriel8:
Скрин триггера приложи, как ты сделал с проверкой видимости, что не работало. Потому что это должно очень просто делаться, то есть скорее всего допущена ошибка.
смысл в том, что я вообще не понимаю какие события/условия/действия подобрать
8gabriel8 #23 - 3 дня назад 0
Но что-то всё-таки делал?
Esea:
PrincePhoenix:
Вкратце, необходима проверка Unit is Visible for ...
попробую
Esea:
PrincePhoenix:
Вкратце, необходима проверка Unit is Visible for ...
попробую
Не получилось..
Esea #24 - 3 дня назад 0
8gabriel8:
Но что-то всё-таки делал?
Esea:
PrincePhoenix:
Вкратце, необходима проверка Unit is Visible for ...
попробую
Esea:
PrincePhoenix:
Вкратце, необходима проверка Unit is Visible for ...
попробую
Не получилось..
да, но что уже забыл. (поверь там ничего интересного)
8gabriel8 #25 - 3 дня назад 0
Наверное, ты не сделал ничего и в результате всю эту болтологию опытных посетителей развёл, не?)
Спорят они здесь, как же оно так не работает.
PT153 #26 - 3 дня назад (отредактировано ) 0
Выбрать всех юнитов на карте, удовлетворяющих условию (Filter unit виден игроку Х И Filter unit есть враг для игрока Х) и сделать действия:
8gabriel8 #27 - 3 дня назад 0
NazarPunk #28 - 3 дня назад 0
» И что тут сложного
//! zinc
library SpellDamageAllVisible {

    /* Настройки заклинания */
    
    constant integer SpellHero          = 'A000';   // Способность для героя.
    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 getDamage(integer level) -> integer {
        return level * 100;
    }
  
    /* ВСЁ, ЧТО НИЖЕ, ПРАВИТЬ НА СВОЙ СТРАХ И РИСК!!! */
    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(){
            group g = CreateGroup();
            unit target, caster = GetTriggerUnit();
            integer level = GetUnitAbilityLevel(caster, SpellHero);
            
            GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, Condition(function() -> boolean {
                return GetWidgetLife(GetFilterUnit()) >= 0.405;
            }));
           
            while (true) {
                target = FirstOfGroup(g);
                if (target == null) { break; }
                if (
                    IsPlayerEnemy(GetOwningPlayer(caster), GetOwningPlayer(target))
                    &&
                    IsUnitVisible(target, GetOwningPlayer(caster))
                ) {
                    DestroyEffect(AddSpecialEffectTarget(SpellEffect, target, SpellEffectAttach));
                    UnitDamageTarget(caster, target, getDamage(level), true, false, DamageAttackType, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS);                
                }
    
                GroupRemoveUnit(g, target);
            }
            
            DestroyGroup(g);
            g = null; caster = null;
        });

        t = null;
    }
}
//! endzinc
8gabriel8:
Странно вы группы удаляете, обычно перед перебором
set bj_wantDestroyGroup = true
прикреплены файлы
8gabriel8 #29 - 3 дня назад 0
Поставь на карту юнитов разных игроков, перед перебором группы поставь set bj_wantDestroyGroup = true, а потом перебери группу.
обработает лишь юнитов красного игрока
NazarPunk #30 - 3 дня назад 0
обработает лишь юнитов красного игрока
С чего бы это?
function ForGroupBJ takes group whichGroup, code callback returns nothing
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    call ForGroup(whichGroup, callback)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(whichGroup)
    endif
endfunction
прикреплены файлы
PT153 #31 - 3 дня назад 0
С чего бы это?
Потому что в GroupAddGroup() тоже есть эта проверка, а действие на выбор юнитов всех игроков использует эту функцию.
NazarPunk #32 - 3 дня назад 0
Потому что в GroupAddGroup() тоже есть эта проверка, а действие на выбор юнитов всех игроков использует эту функцию.
А какое дейтвие из гуи использует GroupAddGroup() внутри ForGroupBJ()?
8gabriel8 #33 - 3 дня назад 2
NazarPunk, запамятовал упомянуть, что при выборе юнитов одного типа.
Чтобы не привыкать к set bj_wantDestroyGroup = true, а в один прекрасный момент не заламывать руки со словами: "Ну как же так!", всегда использую DestroyGroup().
прикреплены файлы
PT153 #34 - 3 дня назад (отредактировано ) 2
А какое дейтвие из гуи использует GroupAddGroup() внутри ForGroupBJ()?
Читаем этот тред со следующего комментария.
NazarPunk #35 - 3 дня назад 0
а в один прекрасный момент не заламывать руки
Я делаю проще и не пишу на гуях)
8gabriel8 #36 - 3 дня назад 0
По объёму кода видно насколько проще.
NazarPunk #37 - 3 дня назад 0
По объёму кода видно насколько проще.
Разверните все BJ в вашем примере и тогда сравним)
8gabriel8 #38 - 3 дня назад 0
В этом и суть GUI, что этого не надо делать.
Esea #39 - 2 дня назад 0

NazarPunk:
» И что тут сложного
//! zinc
library SpellDamageAllVisible {

    /* Настройки заклинания */
    
    constant integer SpellHero          = 'A000';   // Способность для героя.
    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 getDamage(integer level) -> integer {
        return level * 100;
    }
  
    /* ВСЁ, ЧТО НИЖЕ, ПРАВИТЬ НА СВОЙ СТРАХ И РИСК!!! */
    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(){
            group g = CreateGroup();
            unit target, caster = GetTriggerUnit();
            integer level = GetUnitAbilityLevel(caster, SpellHero);
            
            GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, Condition(function() -> boolean {
                return GetWidgetLife(GetFilterUnit()) >= 0.405;
            }));
           
            while (true) {
                target = FirstOfGroup(g);
                if (target == null) { break; }
                if (
                    IsPlayerEnemy(GetOwningPlayer(caster), GetOwningPlayer(target))
                    &&
                    IsUnitVisible(target, GetOwningPlayer(caster))
                ) {
                    DestroyEffect(AddSpecialEffectTarget(SpellEffect, target, SpellEffectAttach));
                    UnitDamageTarget(caster, target, getDamage(level), true, false, DamageAttackType, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS);                
                }
    
                GroupRemoveUnit(g, target);
            }
            
            DestroyGroup(g);
            g = null; caster = null;
        });

        t = null;
    }
}
//! endzinc
8gabriel8:
Странно вы группы удаляете, обычно перед перебором
set bj_wantDestroyGroup = true
О, во, чётко, пасиба. (жаль на джазе сделал, ну да ладно)
о, 8gabriel8 тоже сделал на "Заклинания на заказ" ща чекну..