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

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

Библиотека заклинаний

Если вы хотите поделиться своими триггерными и JASS-заклинаниями, то можете оставлять их здесь.
Желательно иметь, в карте, небольшое руководство для новичков, по установке вашего творения на другую карту.
» Шаблон выкладывания способностей:
Название: название заклинания
Метод исполнения: GUI, Jass (v*, c*)
Нужен ли JNGP: да или нет
Тип цели: юнит, точка, область, без цели
Результат применения: целое описание
Количество уровней: 0-255
Вызов заклинания на цель: buff, если есть
Наличие глобальных переменных: да или нет
Дополнительные аргументы(такие, как вызов новых юнитов, предметов, требования, и прочее)
**Название:**
**Метод исполнения:**
**Нужен ли JNGP:** 
**Тип цели:**
**Результат применения:**
**Количество уровней:**
**Вызов заклинания на цель:**
**Наличие глобальных переменных:** 
Шаблон можно просто скопировать здесь, вставить в свое сообщение, и заполнить
Выполняется для каждой способности, независимо от количества карт.

Правила темы:
  • Запрещены заказы заклинаний, для этого есть тема
  • Можно оставлять пожелания для улучшения заклинаний, указывать баги, но не оценки, и прочий флуд.
  • Оформление ответов, согласно шаблонам.
  • Запрещается выкладывать разные версии одного и того же заклинания в разных сообщениях.
  • Написание описаний понятным русским языком.
  • Не забывайте указывать в своих картах авторов заклинаний!
Заявки, не удовлетворяющие правилам, будут удаляться

Ответ
 
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
ScorpioT1000, ок...
Старый 31.01.2013, 17:31
ScorpioT1000
Работаем
online
Опыт: отключен
Сколько уже готово? Когда надоест - скажи, где остановился.
Старый 01.02.2013, 13:50
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
ScorpioT1000, 6 - готово, буду по 3-4 в день делать, некоторые очень мудрёные....
Ну собственно можешь попробовать сам, сразу помёшь =)
Старый 01.02.2013, 14:05
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Cosonic5, Народ что то все расфлудились, давайте делится скиллами и обсуждать их а не спорить, муи гуи т тд...
Старый 07.02.2013, 06:26
ScorpioT1000
Работаем
online
Опыт: отключен
Ну что там как результаты?
Старый 18.02.2013, 23:48
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
ScorpioT1000, то что стоило исправил, щя думаю исправлять уг и вату, сделанной на уровни гуи с помощью Custom Value, все хочу с сайте скопипастить сюда всяких Seal Master и другие скилыы или херо скилл паки...
Старый 19.02.2013, 04:22
ScorpioT1000
Работаем
online
Опыт: отключен
С сайта сюда не надо, надо прямо там, я выдам доступы. Ты текущие поправь что еще стоящее =)
Старый 19.02.2013, 04:29
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
ScorpioT1000, ну в библиотеке заклинаний было мало с RB штук 12-15 и так мелочи которые некому не интересны...
Старый 19.02.2013, 05:06
krosaf4eg

offline
Опыт: 1,859
Активность:
Все способности героя Pudge из популярной карты (Вытащено из Dota Allstars v6.77b) на cJass:
((кат Meat Hook
Название: Meat Hook
Метод исполнения: cJass
Нужен ли JNGP: да (c AdicHelper)
Тип цели: точка или боевая единица
Результат применения: Бpocaeт oкpoвaвлeнный мяcнoй кpюк в укaзaннoe мecтo или юнитa. Kpюк пpицeпитcя к пepвoму пoпaвшeмуcя нa пути юниту, нaнecя eму уpoн, пocлe чeгo пpитянeт пoймaнную жepтву к гepoю.
Уpoвeнь 1 - Paccтoяниe 600, уpoн 90.
Уpoвeнь 2 - Paccтoяниe 800, уpoн 180.
Уpoвeнь 3 - Paccтoяниe 1000, уpoн 270.
Уpoвeнь 4 - Paccтoяниe 1200, уpoн 360.
Пepeзapядкa: 14/13/12/11 ceкунд
Tpeбуeт мaны: 110/120/130/140
Введя в чат команду "-stats" ("-st"), игрок может узнать точность попадания крюком.
Количество уровней: 4
Вызов заклинания на цель: да
Наличие глобальных переменных: да (hashtable и пара массивов для команды -stats)
((кат Код способности
scope MeatHook initializer MeatHookInit
{
    
    #include "cj_types_priv.j"
    
    define
    {
        private MEAT_HOOK_ABILITY_ID = 'A06I'
        private MEAT_HOOK_DUMMY_ID = 'u00H' 
        private MEAT_HOOK_STUNNER_ID = 'e00E'
        private MEAT_HOOK_STUN_ID = 'A0PZ'
    }
    
    private hashtable ht = InitHashtable();
    private int array ha_enemy_hero;
    private int array ha_total;
    
    enum { MEAT_HOOK_KEY_CASTER, MEAT_HOOK_KEY_ABLVL, MEAT_HOOK_KEY_ANGLE, MEAT_HOOK_KEY_TICK, MEAT_HOOK_KEY_TRIGGER, MEAT_HOOK_KEY_TARGET, MEAT_HOOK_KEY_IS_CATCHED, MEAT_HOOK_KEY_DUMMY }
    
    
    private bool MeatHookShowStats()
    {
        int catched = ha_enemy_hero[GetPlayerId(GetTriggerPlayer())];
        int total = ha_total[GetPlayerId(GetTriggerPlayer())];
        if (total > 0)
        {
            DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, 10., "Toчнocть пoпaдaний Meat Hook: "+R2S(I2R(catched)/I2R(total)*100)+"% ("+I2S(catched)+"/"+I2S(total)+")");
        }
        return false;
    }
    
    private bool MeatHookReturnActions()
    {
        trigger t = GetTriggeringTrigger();
        int htkey = GetHandleId(t);
        int tick = LoadInteger(ht, htkey, MEAT_HOOK_KEY_TICK);
        bool hooked = LoadBoolean(ht, htkey, MEAT_HOOK_KEY_IS_CATCHED);
        unit target;
        unit dummy = LoadUnitHandle(ht, htkey, MEAT_HOOK_KEY_DUMMY+tick);
        if (hooked)
        {
            target = LoadUnitHandle(ht, htkey, MEAT_HOOK_KEY_TARGET);
            SetUnitX(target, GetUnitX(dummy));
            SetUnitY(target, GetUnitY(dummy));
        }
        RemoveUnit(dummy);
        tick--;
        SaveInteger(ht, htkey, MEAT_HOOK_KEY_TICK, tick);
        if (tick == 0)
        {
            FlushChildHashtable(ht, htkey);
            DisableTrigger(t);
            DestroyTrigger(t);
        }
        t = null;
        target = null;
        return false;
    }
    
    private bool MeatHookFilter()
    {
        int typeid = GetUnitTypeId(GetFilterUnit());
        return \
                !IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) &&\
                !(GetUnitTypeId(GetFilterUnit())<1 || IsUnitType(GetFilterUnit(),UNIT_TYPE_DEAD))&&\
                !IsUnitType(GetFilterUnit(),UNIT_TYPE_ANCIENT) &&\
                !(typeid == MEAT_HOOK_DUMMY_ID || typeid == MEAT_HOOK_STUNNER_ID || GetUnitAbilityLevel(GetFilterUnit(), 'Aloc') > 0);
    }
    
    private bool MeatHookRunActions()
    {
        trigger t = GetTriggeringTrigger();
        int htkey = GetHandleId(t);
        unit caster = LoadUnitHandle(ht, htkey, MEAT_HOOK_KEY_CASTER);
        float angle = LoadReal(ht, htkey, MEAT_HOOK_KEY_ANGLE);
        int ablvl = LoadInteger(ht, htkey, MEAT_HOOK_KEY_ABLVL);
        int tick = LoadInteger(ht, htkey, MEAT_HOOK_KEY_TICK);
        trigger trig = LoadTriggerHandle(ht, htkey, MEAT_HOOK_KEY_TRIGGER);
        int trighandle = GetHandleId(trig);
        group g;
        unit target;
        float x, y, z;
        if (tick < 10+5*ablvl)
        {
            tick++;
            SaveInteger(ht, htkey, MEAT_HOOK_KEY_TICK, tick);
            x = GetUnitX(caster)+tick*40*Cos(angle);
            y = GetUnitY(caster)+tick*40*Sin(angle);
            SaveUnitHandle(ht, trighandle, MEAT_HOOK_KEY_DUMMY+tick, CreateUnit(GetOwningPlayer(caster), MEAT_HOOK_DUMMY_ID, x, y, bj_RADTODEG*angle));
            g = CreateGroup();
            GroupEnumUnitsInRange(g, x, y, 125., Condition(function MeatHookFilter));
            GroupRemoveUnit(g, caster);
            target = GroupPickRandomUnit(g);
            DestroyGroup(g);
            if (target != null)
            {
                FlushChildHashtable(ht, htkey);
                DisableTrigger(t);
                DestroyTrigger(t);
                TriggerRegisterTimerEvent(trig, .03, true);
                TriggerAddCondition(trig, Condition(function MeatHookReturnActions));
                SaveInteger(ht, trighandle, MEAT_HOOK_KEY_TICK, tick);
                SaveBoolean(ht, trighandle, MEAT_HOOK_KEY_IS_CATCHED, true);
                SaveUnitHandle(ht, trighandle, MEAT_HOOK_KEY_TARGET, target);
                if (IsUnitEnemy(target, GetOwningPlayer(caster)))
                {
                    if (IsUnitType(target, UNIT_TYPE_HERO))
                    {
                        ha_enemy_hero[GetPlayerId(GetOwningPlayer(caster))]++;
                    }
                    ha_total[GetPlayerId(GetOwningPlayer(caster))]++;
                    unit stunner = CreateUnit(GetOwningPlayer(target), MEAT_HOOK_STUNNER_ID, GetUnitX(target), GetUnitY(target), 0.); //1697656901 ? 1697657409
                    UnitAddAbility(stunner, MEAT_HOOK_STUN_ID);
                    UnitMakeAbilityPermanent(stunner, true, MEAT_HOOK_STUN_ID);
                    IssueTargetOrder(stunner, "thunderbolt", target);
                    UnitApplyTimedLife(stunner, 'BTLF', 1.);
                    stunner = null;
                    UnitDamageTarget(caster, target, 90*ablvl, true, true, ATTACK_TYPE_HERO, DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS);
                    DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThi​efBlood.mdl", target, "origin"));
                }
            }
        }
        else
        {
            FlushChildHashtable(ht, htkey);
            DisableTrigger(t);
            DestroyTrigger(t);
            ha_total[GetPlayerId(GetOwningPlayer(caster))]++;
            TriggerRegisterTimerEvent(trig, .03, true);
            TriggerAddCondition(trig, Condition(function MeatHookReturnActions));
            SaveInteger(ht, trighandle, MEAT_HOOK_KEY_TICK, tick);
            SaveBoolean(ht, trighandle, MEAT_HOOK_KEY_IS_CATCHED, false);
        }
        t = null;
        caster = null;
        target = null;
        trig = null;
        g = null;
        return false;
    }
    
    private void MeatHookPrepare()
    {
        unit caster = GetTriggerUnit();
        location targetloc = GetSpellTargetLoc();
        float angle = Atan2(GetLocationY(targetloc)-GetUnitY(caster), GetLocationX(targetloc)-GetUnitX(caster));
        int ablvl = GetUnitAbilityLevel(caster, MEAT_HOOK_ABILITY_ID);
        trigger t = CreateTrigger();
        int htkey = GetHandleId(t);
        SaveUnitHandle(ht, htkey, MEAT_HOOK_KEY_CASTER, caster);
        SaveInteger(ht, htkey, MEAT_HOOK_KEY_ABLVL, ablvl);
        SaveReal(ht, htkey, MEAT_HOOK_KEY_ANGLE, angle);
        SaveInteger(ht, htkey, MEAT_HOOK_KEY_TICK, 0);
        SaveTriggerHandle(ht, htkey, MEAT_HOOK_KEY_TRIGGER, CreateTrigger());
        TriggerRegisterTimerEvent(t, .03, true);
        TriggerAddCondition(t, Condition(function MeatHookRunActions));
        RemoveLocation(targetloc);
        targetloc = null;
        caster = null;
        t = null;
    }
    
    private bool MeatHookCondition()
    {
        if (GetSpellAbilityId() == MEAT_HOOK_ABILITY_ID)
        {
            MeatHookPrepare();
        }
        return false;
    }
    
    private void MeatHookInit()
    {
        trigger t = CreateTrigger();
        TriggerRegisterPlayerUnitEvent(t, Player(0), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(1), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(2), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(3), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(4), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(5), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(6), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(7), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(8), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(9), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(10), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(11), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(12), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(13), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(14), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerRegisterPlayerUnitEvent(t, Player(15), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        TriggerAddCondition(t, Condition(function MeatHookCondition));
        t = CreateTrigger();
        TriggerRegisterPlayerChatEvent(t, Player(0), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(1), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(2), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(3), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(4), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(5), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(6), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(7), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(8), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(9), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(10), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(11), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(12), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(13), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(14), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(15), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(0), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(1), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(2), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(3), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(4), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(5), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(6), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(7), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(8), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(9), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(10), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(11), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(12), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(13), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(14), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(15), "-st", true);
        TriggerAddCondition(t, Condition(function MeatHookShowStats));
        t = null;
    }
}
))
))
((кат Rot
Название: Rot
Метод исполнения: cJass
Нужен ли JNGP: да (c AdicHelper)
Тип цели: без цели (переключаемая)
Результат применения: Pudge иcпуcкaeт бoлeзнь и злoвoниe, нaнocящиe cepьeзный уpoн oкpужaющим вpaгaм и зaмeдляющиe иx, в тo жe вpeмя вpeдящиe eму caмoму.
Уpoвeнь 1 - 35 уpoнa в ceкунду.
Уpoвeнь 2 - 60 уpoнa в ceкунду.
Уpoвeнь 3 - 85 уpoнa в ceкунду.
Уpoвeнь 4 - 110 уpoнa в ceкунду.
Количество уровней: 4
Вызов заклинания на цель: да
Наличие глобальных переменных: нет
((кат Код способности
scope Rot initializer RotInit
{
    #include "cj_types_priv.j"
    
    define
    {
        private ROT_ABILITY_ID = 'A00K'
        private ROT_SPELL_ID = 'A00I'
    }
    
    private bool RotCondition()
    {
        return GetUnitAbilityLevel(GetTriggerUnit(), ROT_ABILITY_ID) > 0;
    }
    
    private void RotActions()
    {
        if (GetIssuedOrderId() == 852177)
        {
            UnitAddAbility(GetTriggerUnit(), ROT_SPELL_ID);
            UnitMakeAbilityPermanent(GetTriggerUnit(), true, ROT_SPELL_ID);
        }
        if (GetIssuedOrderId() == 852177)
        {
            UnitRemoveAbility(GetTriggerUnit(), ROT_SPELL_ID);
        }
        
    }
    
    private void RotInit()
    {
        trigger t = CreateTrigger();
        TriggerRegisterPlayerUnitEvent(t, Player(0), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(1), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(2), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(3), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(4), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(5), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(6), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(7), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(8), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(9), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(10), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(11), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(12), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(13), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(14), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerRegisterPlayerUnitEvent(t, Player(15), EVENT_PLAYER_UNIT_ISSUED_ORDER, null);
        TriggerAddCondition(t, Condition(function RotCondition));
        TriggerAddAction(t, function RotActions);
    }
}
))
))
((кат Flesh Heap
Название: Flesh Heap
Метод исполнения: cJass
Нужен ли JNGP: да (c AdicHelper)
Тип цели: нет (пассивная)
Результат применения: Pudge cocтoит из бecчиcлeнныx гниющиx тeл, чтo дaeт eму дoпoлнитeльную coпpoтивляeмocть к мaгии, paвнo кaк и cпocoбнocть нapaщивaть cвoю мaccу.
Уpoвeнь 1 - 4% coпpoтивлeниe мaгии.
Уpoвeнь 2 - 8% coпpoтивлeниe мaгии.
Уpoвeнь 3 - 12% coпpoтивлeниe мaгии.
Уpoвeнь 4 - 16% coпpoтивлeниe мaгии.
Pudge нaвceгдa пoлучaeт 0.9/1.2/1.5/1.8 cилы зa кaждoгo убитoгo им или пoгибшeгo pядoм вpaжecкoгo гepoя. Пока способность не изучена, сила все равно накапливается и дается герою при изучении способности или повышении ее уровня.
Введя в чат команду "-stats" ("-st"), игрок может узнать количество полученной от способности силы.
Количество уровней: 4
Вызов заклинания на цель: нет
Наличие глобальных переменных: да (hashtable, массив для команды -stats и пара sound)
((кат Код способности
scope FleshHeap initializer FleshHeapInit
{
    #include "cj_types_priv.j"
    
    define
    {
        private FLESH_HEAP_ABILITY_ID = 'A06D'
        private FLESH_HEAP_DUMMY_ID = 'h0BB'
        private FLESH_HEAP_HERO_ID = 'U00F'
    }
    
    enum { FLESH_HEAP_KEY_UNIT, FLESH_HEAP_KEY_BONUS_STR, FLESH_HEAP_KEY_BONUS_COUNT }
    
    private hashtable ht = InitHashtable();
    
    private int array fh_bonus;
    
    private sound fh_death_sound = CreateSound("Units\\Undead\\Abomination\\AbominationPissed5.wav", false, true, true, 10, 10, "DefaultEAXON");
    private sound fh_death_sound2 = CreateSound("Sound\\Units\\Death\\ArtilleryCorpseExplodeDeath1.wav", false, true, true, 10, 10, "DefaultEAXON");
    
    private bool FleshHeapShowStats()
    {
        int bonus = fh_bonus[GetPlayerId(GetTriggerPlayer())];
        if (bonus > 0)
        {
            DisplayTimedTextToPlayer(GetTriggerPlayer(), 0., 0., 10., "Вы получили "+I2S(bonus)+" силы от Flesh Heap"); 
        }
        return false;
    }
    
    private void FleshHeapAddBonus()
    {
        int htkey = GetHandleId(GetEnumUnit());
        if (GetTriggerUnit() != GetEnumUnit())
        {
            SaveInteger(ht, htkey, FLESH_HEAP_KEY_BONUS_COUNT, LoadInteger(ht, htkey, FLESH_HEAP_KEY_BONUS_COUNT) + 1);
        }
    }
    
    private bool FleshHeapPudgeFilter()
    {
        return GetUnitTypeId(GetFilterUnit()) == FLESH_HEAP_HERO_ID && !IsUnitIllusion(GetFilterUnit()) && IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetTriggerUnit()));
    }
    
    private bool FleshHeapOnDeathActions()
    {
        group g;
        if (IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) && !IsUnitIllusion(GetTriggerUnit()))
        {
            g = CreateGroup();
            GroupEnumUnitsInRange(g, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 475., Condition(function FleshHeapPudgeFilter));
            if (GetUnitTypeId(GetKillingUnit()) == FLESH_HEAP_HERO_ID)
            {
                GroupAddUnit(g, GetKillingUnit());
            }
            ForGroup(g, function FleshHeapAddBonus);
            DestroyGroup(g);
            g = null;
        }
        return false;
    }
    
    private bool FlashHeapOnSuicidePeriodic()
    {
        trigger t = GetTriggeringTrigger();
        int htkey = GetHandleId(t);
        unit u = LoadUnitHandle(ht, htkey, FLESH_HEAP_KEY_UNIT);
        if (GetTriggerEvalCount(t) == 1)
        {
            ShowUnit(u, false);
        }
        elseif (GetTriggerEvalCount(t) > 80)
        {
            FlushChildHashtable(ht, htkey);
            DisableTrigger(t);
            DestroyTrigger(t);
        }
        t = null;
        u = null;
        return false;
    }
    
    private bool FleshHeapOnSuicideActions()
    {
        unit killer, victim, dummy;
        trigger t;
        int htkey;
        if (GetUnitTypeId(GetTriggerUnit()) == FLESH_HEAP_HERO_ID)
        {
            victim = GetTriggerUnit();
            killer = GetKillingUnit();
            if (victim == killer)
            {
                dummy = CreateUnit(GetOwningPlayer(victim), FLESH_HEAP_DUMMY_ID, GetUnitX(victim), GetUnitY(victim), GetUnitFacing(victim));
                SetUnitTimeScale(dummy, .75);
                UnitApplyTimedLife(dummy, 'BTLF', 1.);
                DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Undead\\UndeadBlood\\UndeadBloodAbo​mination.mdl", dummy, "origin"));
                dummy = null;
                SetSoundPosition(fh_death_sound, GetUnitX(victim), GetUnitY(victim), 50.);
                SetSoundVolume(fh_death_sound, 127);
                StartSound(fh_death_sound);
                SetSoundPosition(fh_death_sound2, GetUnitX(victim), GetUnitY(victim), 50.);
                SetSoundVolume(fh_death_sound2, 127);
                StartSound(fh_death_sound2);
                t = CreateTrigger();
                htkey = GetHandleId(t);
                TriggerRegisterTimerEvent(t, .1, true);
                TriggerAddCondition(t, Condition(function FlashHeapOnSuicidePeriodic));
                SaveUnitHandle(ht, htkey, FLESH_HEAP_KEY_UNIT, victim);
                t = null;
            }
            victim = null;
            killer = null;
        }
        return false;
    }
    
    private bool FleshHeapPeriodic()
    {
        trigger t = GetTriggeringTrigger();
        unit u = LoadUnitHandle(ht, GetHandleId(t), FLESH_HEAP_KEY_UNIT);
        texttag tt;
        int htkey = GetHandleId(u);
        int bonuscount = LoadInteger(ht, htkey, FLESH_HEAP_KEY_BONUS_COUNT);
        int bonusstr = LoadInteger(ht, htkey, FLESH_HEAP_KEY_BONUS_STR);
        int ablvl = GetUnitAbilityLevel(u, FLESH_HEAP_ABILITY_ID);
        int newbonusstr = R2I(I2R(bonuscount)*(.6+.3*ablvl));
        if (newbonusstr > bonusstr)
        {
            SetHeroStr(u, GetHeroStr(u, false)+(newbonusstr-bonusstr), true);
            SaveInteger(ht, htkey, FLESH_HEAP_KEY_BONUS_STR, newbonusstr);
            fh_bonus[GetPlayerId(GetOwningPlayer(u))] = newbonusstr;
            tt = CreateTextTag();
            SetTextTagText(tt, "+"+I2S(newbonusstr-bonusstr)+" Str", .023);  
            SetTextTagPosUnit(tt, u, 64.);
            SetTextTagColor(tt, 0, 255, 0, 0);
            SetTextTagVelocity(tt, .0, .0355);
            SetTextTagFadepoint(tt, 2.);
            SetTextTagPermanent(tt, false);
            SetTextTagLifespan(tt, 3.);
            if (IsUnitVisible(u, GetLocalPlayer()))
            {
                SetTextTagVisibility(tt, true);
            }
            else
            {
                SetTextTagVisibility(tt, false);
            }
            tt = null;
        }
        t = null;
        u = null;
        return false;
    }
    
    private void FleshHeapOnLearnActions()
    {
        unit u = GetTriggerUnit();
        trigger t = CreateTrigger();
        int  htkey = GetHandleId(t);
        TriggerRegisterTimerEvent(t, .5, true);
        TriggerAddCondition(t, Condition(function FleshHeapPeriodic));
        SaveUnitHandle(ht, htkey, FLESH_HEAP_KEY_UNIT, u);
        u = null;
        t = null;
    }
    
    private bool FleshHeapCondition()
    {
        if (GetLearnedSkill() == FLESH_HEAP_ABILITY_ID && !IsUnitIllusion(GetTriggerUnit()) && GetUnitAbilityLevel(GetTriggerUnit(), FLESH_HEAP_ABILITY_ID) == 1)
        {
            FleshHeapOnLearnActions();
        }
        return false;
    }
    
    private void FleshHeapInit()
    {
        trigger t = CreateTrigger();
        TriggerRegisterPlayerUnitEvent(t, Player(0), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(1), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(2), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(3), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(4), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(5), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(6), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(7), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(8), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(9), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(10), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(11), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(12), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(13), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(14), EVENT_PLAYER_HERO_SKILL, null);
        TriggerRegisterPlayerUnitEvent(t, Player(15), EVENT_PLAYER_HERO_SKILL, null);
        TriggerAddCondition(t, Condition(function FleshHeapCondition));
        t = CreateTrigger();
        TriggerRegisterPlayerChatEvent(t, Player(0), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(1), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(2), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(3), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(4), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(5), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(6), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(7), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(8), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(9), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(10), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(11), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(12), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(13), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(14), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(15), "-stats", true);
        TriggerRegisterPlayerChatEvent(t, Player(0), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(1), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(2), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(3), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(4), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(5), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(6), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(7), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(8), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(9), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(10), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(11), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(12), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(13), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(14), "-st", true);
        TriggerRegisterPlayerChatEvent(t, Player(15), "-st", true);
        TriggerAddCondition(t, Condition(function FleshHeapShowStats));
        t = CreateTrigger();
        TriggerRegisterPlayerUnitEvent(t, Player(0), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(1), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(2), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(3), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(4), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(5), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(6), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(7), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(8), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(9), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(10), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(11), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(12), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(13), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(14), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(15), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerAddCondition(t, Condition(function FleshHeapOnSuicideActions));
        t = CreateTrigger();
        TriggerRegisterPlayerUnitEvent(t, Player(0), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(1), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(2), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(3), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(4), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(5), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(6), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(7), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(8), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(9), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(10), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(11), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(12), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(13), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(14), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerRegisterPlayerUnitEvent(t, Player(15), EVENT_PLAYER_UNIT_DEATH, null);
        TriggerAddCondition(t, Condition(function FleshHeapOnDeathActions));
        
        SetSoundParamsFromLabel(fh_death_sound, "AbominationPissed");
        SetSoundDuration(fh_death_sound, 1735);
    
        SetSoundParamsFromLabel(fh_death_sound2, "ArtilleryExplodeDeath");
        SetSoundDuration(fh_death_sound2,1486);
    
        t = null;
    }
}
))
))
((кат Dismember
Способность не триггерная, но на всякий случай приведу описание.
Название: Dismemer
Метод исполнения: Редактор объектов
Нужен ли JNGP: нет
Тип цели: боевая единица
Результат применения: Пoeдaeт цeль, пpичиняя мучитeльную бoль в тeчeнии 3 ceкунд.
Уpoвeнь 1 - 75 уpoнa в ceкунду.
Уpoвeнь 2 - 125 уpoнa в ceкунду.
Уpoвeнь 3 - 175 уpoнa в ceкунду.
Пepeзapядкa: 30 ceкунд
Tpeбуeт мaны: 100/130/170
Количество уровней: 3
Вызов заклинания на цель: да
Наличие глобальных переменных: нет, разумеется)
))
Варкравтом и джассом долго не занимался, вот решил вспомнить что к чему и накидал на скорую руку. Код вытаскивался из оригинальной карты, поэтому вы возможно найдете в нем странные вещи. Все должно быть переносимо - просто копируете код и связанные с ним объекты в целевую карту.
Прикрепленные файлы
Тип файла: w3x Pudge.w3x (49.3 Кбайт, 56 просмотров )
Старый 20.02.2013, 21:38
krosaf4eg

offline
Опыт: 1,859
Активность:
DualShock, Vadik29, про циклы знаю конечно. Просто, насколько я знаю, такой вариант несколько быстрее работает. Короче, когда-то привык и всегда так делал, оптимизация же xD
Кстати, в оригинальной карте для для чат-ивентов код так же написан без использования циклов. Хотя, возможно, это результат работы оптимизатора.

Отредактировано krosaf4eg, 20.02.2013 в 23:19.
Старый 20.02.2013, 22:49
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
krosaf4eg, циклы помедленнее, чем последовательные действия, хотя-бы только по тому что там постоянно вызывается условия выхода из цикла и есть счётчик цикла, уже 2 операции как минимум... Но это заметно на сотнях шагов цикла, для создание событий в триггерах циклы самое то.
quq_CCCP добавил:
p.s вытаскивал скиллы пeджа из версии на ретурн баге, сделано было так себе с локейшинами и кучей бж, а как же сделан хук сейчас?
Старый 21.02.2013, 05:50
ScorpioT1000
Работаем
online
Опыт: отключен
krosaf4eg все правильно сделал, не упарывайтесь.
Старый 21.02.2013, 13:21
Extremator

offline
Опыт: 39,428
Активность:
я плох смотрел?
или 2й скилл никого не замедляет тут... ?
Старый 21.02.2013, 15:36
krosaf4eg

offline
Опыт: 1,859
Активность:
Extremator, Да, действительно, забыл скопировать ауру замедления в РО. Исправлю, как доберусь до домашнего компа, спасибо.
Старый 21.02.2013, 19:11
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
делал очень давно героев учился jass понемногу, вот выкладываю просто так все равно лежат.
Прикрепленные файлы
Тип файла: w3x разные герои v2.w3x (127.6 Кбайт, 62 просмотров )
Старый 02.03.2013, 06:50
эскалибур

offline
Опыт: 547
Активность:
Сделал 5 заклинаний, думаю, камуто поможет...
1 заклинание
Название: Водный Щит
Метод исполнения: GUI
Нужен ли JNGP:нет
Тип цели:область, без цели
Результат применения: Вокруг героя начинают кружится ледяные сгустки, один сгусток наносит 42 урона, летит сгустков 5, летят в области 500 от героя, и наносят в этой же области
Количество уровней: 1
Вызов заклинания на цель:
Наличие глобальных переменных: нет
2 заклинание
Название: Похищение жизни
Метод исполнения: GUI
Нужен ли JNGP:нет
Тип цели: юнит,область
Результат применения: Герой начинает высасивать жизненую силу из воина, при этом востонавливая себе 55 жизней каждую секунду, но ещё и забирает по 55 жизней всех кто рядом, забирает токо у того, на кого наложенно, а остольным только отнимает.
Количество уровней: 1
Вызов заклинания на цель:
Наличие глобальных переменных:нет
3 заклинание
Название: Отталкивание
Метод исполнения: GUI
Нужен ли JNGP:нет
Тип цели: юнит
Результат применения: мощно ударяет указанного юнита, толкая его вперёд, летит он 2.65 секунд, и при этом ему отнимает по 2 жизни каждые 0.01 секунду.
Количество уровней: 1
Вызов заклинания на цель:
Наличие глобальных переменных: нет
4 заклинание
Название: ледянной щит
Метод исполнения: GUI
Нужен ли JNGP: нет
Тип цели:область, без цели
Результат применения: от героя начинают идти ледянные сгустки, которые через некоторое время уходят от героя который применил заклинание, нанося по 50 урона каждому кто был в области применения.
Количество уровней: 1
Вызов заклинания на цель:
Наличие глобальных переменных: нет
5 заклинание
Название: топоры
Метод исполнения: GUI
Нужен ли JNGP:нет
Тип цели: точка,
Результат применения: герой кидает 2 топора, один наносит 150 урона, летят на радиус 1650, наносит в 350 области от топоров.
Количество уровней: 1
Вызов заклинания на цель:
Наличие глобальных переменных: нет
эскалибур добавил:
Сделал ещё 2 заклинания...
1 заклинание
Название: воздушный удар
Метод исполнения: GUI
Нужен ли JNGP:нет
Тип цели: юнит
Результат применения: юнит прыгает на врага, нанося ему 5 ударов, один наносит 70 урона.
Количество уровней: 1
Вызов заклинания на цель:
Наличие глобальных переменных:нет
2 заклинание
Название: смертельный круг
Метод исполнения: GUI
Нужен ли JNGP: нет
Тип цели: область, без цели
Результат применения: От героя начинают идти бураны, нанося по 3 урона каждые 0.02 секунды.
Количество уровней: 1
Вызов заклинания на цель:
Наличие глобальных переменных: нет

Отредактировано эскалибур, 16.03.2013 в 20:27.
Старый 16.03.2013, 20:33
просто Юрок
...
offline
Опыт: 11,271
Активность:
Старый 17.03.2013, 09:01
Borodach

offline
Опыт: 5,785
Активность:
просто Юрок, шутишь? судя по этому
Результат применения: От героя начинают идти бураны, нанося по 3 урона каждые 0.02 секунды.
Количество уровней: 1
Вызов заклинания на цель:
Наличие глобальных переменных: нет
там без муи и с утечками
Старый 17.03.2013, 09:05
эскалибур

offline
Опыт: 547
Активность:
я незнаю что это такое... какие утечки?
эскалибур добавил:
скоро новое заклинание
эскалибур добавил:
Название: Телекинез
Метод исполнения: GUI
Нужен ли JNGP: нет
Тип цели: юнит
Результат применения: герой подбрасывает юнита в воздух, при чём через несколько секунд он падает, отталкивая и нанося урон вокруг себя, также он оглушится на 2.65 секунд.
Количество уровней: 1
Вызов заклинания на цель:
Наличие глобальных переменных:нет
Прикрепленные файлы
Тип файла: w3x TELEkinezzzzz.w3x (20.7 Кбайт, 29 просмотров )
Старый 17.03.2013, 09:39
ShamaN26

offline
Опыт: 9,546
Активность:
эскалибур, посмотри на ТО, что тут выкладывают люди, твои скилы не плохи, но любой может сделать такие, советую начать учить jass ибо тригерные скилы сейчас не один уважающий себя модмекер не использует.
Удачи! (xgm.ru/p/wc3/jass_introduction)
Старый 17.03.2013, 10:13
Ответ

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

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

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

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



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