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

Способность

Утечки:Нет
Mui:Да
Требования: JNGP
Описание: Герой создает в области пламя, который наносит урон окружающим.
Время действия: 0.50 сек.
Урон: 700 ед. урона.
Перезарядка: 10 сек.

Скриншоты

Подробности

Код
function Fire_Cond takes nothing returns boolean
    return GetSpellAbilityId() == 'A000' // событие триггера
endfunction

function Fire_Act takes nothing returns nothing
   local unit a = GetSpellAbilityUnit() // кастер
   local real x = GetSpellTargetX() // координаты области каста
   local real y = GetSpellTargetY() // координаты области каста
   local group g = CreateGroup()
   local unit n = null
   local real c = 0
   call PauseUnit(a,true) // если не хотите чтобы кастер паузился, можете убрать эту функцию
   call TriggerSleepAction(0.10)
   loop
   exitwhen c == 78 // условия заканчивания цикла
   call DestroyEffect(AddSpecialEffect("Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralBuildingExplosion.mdl",x+400*Cos(6*c*bj_DEGTORAD),y+400*Sin(6*c*bj_DEGTORAD))) 
   call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl",x+150*Cos(6*c*bj_DEGTORAD),y+150*Sin(6*c*bj_DEGTORAD)))
   call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl",x+250*Cos(6*c*bj_DEGTORAD),y+250*Sin(6*c*bj_DEGTORAD)))
   call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl",x+350*Cos(6*c*bj_DEGTORAD),y+350*Sin(6*c*bj_DEGTORAD)))
   set c = c + 6
   endloop
   call GroupEnumUnitsInRange(g,x,y,530,null) // почему тут 530 стоит? Просто когда проверял юнитам в эффекте не наносился урон
   loop
   set n = FirstOfGroup(g)
   exitwhen n == null
   if IsUnitEnemy(n,GetOwningPlayer(a)) == true and IsUnitType(n,UNIT_TYPE_DEAD) == false // условия нанесения урона
   call UnitDamageTarget(a,n,700,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_FIRE,null) // наносим урон
   endif
   call GroupRemoveUnit(g,n)
   endloop
   call PauseUnit(a,false)
   // обнуляем переменные
   call DestroyGroup(g)
   set x = 0
   set y = 0
   set c = 0
   set n = null
   set a = null
   set g = null
endfunction

//===========================================================================
function InitTrig_Fire takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer index
    set index = 0
    loop
    call TriggerRegisterPlayerUnitEvent(t, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    set index = index + 1
    exitwhen index == 16
    endloop
    call TriggerAddCondition(t, Condition( function Fire_Cond ) )
    call TriggerAddAction(t, function Fire_Act )
    set t = null
endfunction
СКАЧАТЬ ДРУГУЮ ВЕРСИЮ С ДРУГИМ ЭФФЕКТОМ
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
32
5 лет назад
2
Rockmaf, вау поздравляю, у тебя тут чистый jass, это точно твой код? На первый взгляд всё даже нормально, но не надо обнулять x,y и с
5
29
5 лет назад
Отредактирован nazarpunk
5
Rockmaf, без всякого сарказма, по сравнению с тем что было раньше, это просто шикарно. Но есть добавлю критики:
Если сюда дописать then, то заклинание будет работать на 1.26+
Избавьтесь от привычки всюду лепить вэйты:
Процитирую комментатора выше, эти действия бессмысслены
Не забивайте значения вручную, используйте константу bj_MAX_PLAYER_SLOTS ибо ваш код могут использовать на патче 1.30+ где 24 игрока.
IsUnitType(n,UNIT_TYPE_DEAD) не очень корректно работает, лучше подтянуть нативку UnitAlive()
У способности три уровня, а урон наносится фиксированный

Коли уж используете JNGP, то почему чистый jass? Держите, переписал на zinc, можете публиковать без моего авторства.
//! nocjass
native UnitAlive takes unit u returns boolean

//! zinc
library SpellFire {
    integer ABILITY_ID = 'A000';
    real EXPLODE_RANGE = 400;
    string EXPLODE_CENTER = "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl";
    string EXPLODE_CIRCLE = "Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralBuildingExplosion.mdl";
    integer EXPLODE_CIRCLE_COUNT = 12;
    integer DAMAGE = 100;
    
    // ---
    group g = CreateGroup();
    
    function onInit() {
        integer i;
        trigger t = CreateTrigger();
        TriggerAddCondition(t, Filter(function() -> boolean {
            return GetSpellAbilityId() == ABILITY_ID;
        }));
        for (0 <= i < bj_MAX_PLAYER_SLOTS){
            TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        }
        TriggerAddAction(t, function(){
            unit target, caster = GetSpellAbilityUnit(); // кастер
            real a = bj_PI * 2 / EXPLODE_CIRCLE_COUNT , x = GetSpellTargetX(), y = GetSpellTargetY(); // координаты области каста
            integer i;
            real damage = GetUnitAbilityLevel(caster, ABILITY_ID) * DAMAGE;
            
            DestroyEffect(AddSpecialEffect(EXPLODE_CENTER, x, y));
            for (0 < i <= EXPLODE_CIRCLE_COUNT){
                DestroyEffect(AddSpecialEffect(EXPLODE_CIRCLE, x + EXPLODE_RANGE * Cos(a*i), y + EXPLODE_RANGE * Sin(a*i)));  
            }
            GroupEnumUnitsInRange(g, x, y , EXPLODE_RANGE, null);
            while (true){
                target = FirstOfGroup(g);
                if (target == null) { break; }
                if (IsUnitEnemy(target, GetOwningPlayer(caster)) && UnitAlive(target)){
                    UnitDamageTarget(caster, target, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS); // наносим урон
                }
                GroupRemoveUnit(g, target);
            }
            caster = null;
            target = null;
        });
    }
}
//! endzinc
//! endnocjass
2
12
5 лет назад
Отредактирован Rockmaf
2
Bergi_Bear:
Rockmaf, вау поздравляю, у тебя тут чистый jass, это точно твой код? На первый взгляд всё даже нормально, но не надо обнулять x,y и с
Да, это мой код. Если надо то могу другие свои наработки кинуть.
NazarPunk:
Держите, переписал на zinc, можете публиковать без моего авторства.
Я не очень понимаю zinc, а публиковать мне как - то лень :).
Про x,y,c я думал что если их не обнулять то утечки будут.
Вот, и эту способность сделал на джазз(внизу)
И это, как делать вот эти гифки?
Чтобы оставить комментарий, пожалуйста, войдите на сайт.