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

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

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

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

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

Ответ
 
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
ScorpioT1000, Идея хорошая, но разве ваших сил господа модеры маловато будет?
Старый 24.01.2013, 18:00
ScorpioT1000
Работаем
offline
Опыт: отключен
500 заклинаний много =(
Старый 24.01.2013, 23:45
HolyMoon
Hly shit!
offline
Опыт: 6,986
Активность:
ScorpioT1000, 281, с частично отфильтрованным мусором
Старый 25.01.2013, 17:55
Алексей Андреич
Криворукожоп 80 Lvl
offline
Опыт: 80,082
Активность:
ScorpioT1000:
Есть предложение набрать добровольцев и разложить заклинания по полочкам на сайте.
Создать категории, к какому типа (урон, лечение итп) и стихии относится.
Должно получиться примерно как тут: xgm.ru/p/wc3/model-categories
идея хорошая, порядок везде нужен..)
потом ещё составить список, чтоб быстро найти нужный спел можно было бы, обновлять его постоянно...
вообще здорово будет...
ScorpioT1000:
500 заклинаний много =(
сортировать собрались только эту тему или ещё и "заклинания на заказ"..?
Старый 25.01.2013, 18:03
HolyMoon
Hly shit!
offline
Опыт: 6,986
Активность:
я, собственно, могу скинуть все это дело архивом для дальнейшей обработки
там разложено в общем виде по стихиям, везде подписаны авторы
HolyMoon добавил:
заклинания на заказ упорешься сортирвать
HolyMoon добавил:
и еще мне не понравилось, что в библиотеке я встретил овер 10-15 выложенных заклинаний от bee, и ни в одном из этих 10-15 постов, соответственно, не было приложенного файла =\
Старый 25.01.2013, 18:14
Алексей Андреич
Криворукожоп 80 Lvl
offline
Опыт: 80,082
Активность:
HolyMoon:
заклинания на заказ упорешься сортирвать
ну мы же упоротые... :3
а вообще по-хорошему надо бы...
Старый 25.01.2013, 18:24
HolyMoon
Hly shit!
offline
Опыт: 6,986
Активность:
Андреич, впринципе можно, но лучше тогда группой это делать. по 100 страниц на человека, допустим. Так и быстрее, и легче.
Учитывая, что процентов двадцать заказов - "сделайте как в доте", еще столько же - на различные отталкивания и т.п. - можно и разрулить
Старый 25.01.2013, 18:34
ScorpioT1000
Работаем
offline
Опыт: отключен
HolyMoon, я могу подготовить категории, тогда на сайт заливать сможете сами, проект варкрафт, в режиме "не публикуется"
я думаю там 3 категории дб
1 тип: урон, восстановление, перемещение, отталкивание, оглушение, призыв, сопротивление, усиление, ослабление, превращение, невидимость
2 стихия: я в трактире гдето описывал =)
3 цель: сам персонаж, одиночная цель, указанная область, вокруг себя
Старый 25.01.2013, 18:46
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
ScorpioT1000, Добавьте категории по мимо гуи и jass еще Сомнительный способ исполнения (ну или метку такую) для скиллов сделанных не муи или с утечками и ссылку на норм вариант если имеется....
Старый 26.01.2013, 06:58
Алексей Андреич
Криворукожоп 80 Lvl
offline
Опыт: 80,082
Активность:
quq_CCCP:
ля скиллов сделанных не муи или с утечками
а не проще ли такие вообще не добавлять..?
Старый 26.01.2013, 07:36
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
ScorpioT1000:
цель: сам персонаж, одиночная цель, указанная область, вокруг себя
Без цели, точка, юнит, область
Старый 26.01.2013, 08:30
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
Андреич:
а не проще ли такие вообще не добавлять..?
Автора и гуишников обидишь....
Старый 26.01.2013, 08:46
ScorpioT1000
Работаем
offline
Опыт: отключен
Clamp, а предмет, декорация, типы аля "нова" или веер лезвий куда девать ? не надо мыслить варкрафтом.
ScorpioT1000 добавил:
quq_CCCP, зачем добавлять сомнительные =) вот про рб стоит добавить
Старый 29.01.2013, 18:30
Алексей Андреич
Криворукожоп 80 Lvl
offline
Опыт: 80,082
Активность:
ScorpioT1000:
типы аля "нова" или веер лезвий
это вроде бы без указания цели...
но не суть...
определяйтесь уже с категориями..)
ScorpioT1000:
не надо мыслить варкрафтом.
+...
Старый 29.01.2013, 18:31
ScorpioT1000
Работаем
offline
Опыт: отключен
Андреич, да, но их стоит разделить, чтобы потом было просто нажать на метку и показались все новы, например.
Сейчас создам тогда категорию, есть еще что дополнить?
ScorpioT1000 добавил:
Сделал, но надо подождать, пока утвердят метку.
Старый 29.01.2013, 19:13
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
ScorpioT1000, помочь вам чтоли переписать с рб на хештаблицы.... там такие классные скиллы были, но надо и оставить оригинал, чтобы не обижать автора - просто сделать ссылку на современную версию...
Старый 30.01.2013, 07:14
ScorpioT1000
Работаем
offline
Опыт: отключен
Можешь попробовать пока что здесь, прямо в постах, дописывая что-то типа "Исправлено на 1.24+", выдадим модера. Потом как "соавтор" добавишься)
Старый 30.01.2013, 17:16
ScorpioT1000
Работаем
offline
Опыт: отключен
Сюда не надо это делать, делать надо прямо в постах.
Старый 31.01.2013, 13:52
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
ScorpioT1000, я посты то как буду чужие редактировать?
Это тока кет может...
Старый 31.01.2013, 13:57
ScorpioT1000
Работаем
offline
Опыт: отключен
quq_CCCP, выдали модера, редактируй, дозаливай карты с постфиксом _1_24, никаких точечек пробельчиков. Внизу поста дописывай то что выше дописывал.
Так будет потом проще - в отдельных сообщениях смотреть.
Старый 31.01.2013, 16:07
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
ScorpioT1000, ок...
Старый 31.01.2013, 17:31
ScorpioT1000
Работаем
offline
Опыт: отключен
Сколько уже готово? Когда надоест - скажи, где остановился.
Старый 01.02.2013, 13:50
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
ScorpioT1000, 6 - готово, буду по 3-4 в день делать, некоторые очень мудрёные....
Ну собственно можешь попробовать сам, сразу помёшь =)
Старый 01.02.2013, 14:05
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
Cosonic5, Народ что то все расфлудились, давайте делится скиллами и обсуждать их а не спорить, муи гуи т тд...
Старый 07.02.2013, 06:26
ScorpioT1000
Работаем
offline
Опыт: отключен
Ну что там как результаты?
Старый 18.02.2013, 23:48
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
ScorpioT1000, то что стоило исправил, щя думаю исправлять уг и вату, сделанной на уровни гуи с помощью Custom Value, все хочу с сайте скопипастить сюда всяких Seal Master и другие скилыы или херо скилл паки...
Старый 19.02.2013, 04:22
ScorpioT1000
Работаем
offline
Опыт: отключен
С сайта сюда не надо, надо прямо там, я выдам доступы. Ты текущие поправь что еще стоящее =)
Старый 19.02.2013, 04:29
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
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,024
Активность:
krosaf4eg, циклы помедленнее, чем последовательные действия, хотя-бы только по тому что там постоянно вызывается условия выхода из цикла и есть счётчик цикла, уже 2 операции как минимум... Но это заметно на сотнях шагов цикла, для создание событий в триггерах циклы самое то.
quq_CCCP добавил:
p.s вытаскивал скиллы пeджа из версии на ретурн баге, сделано было так себе с локейшинами и кучей бж, а как же сделан хук сейчас?
Старый 21.02.2013, 05:50
ScorpioT1000
Работаем
offline
Опыт: отключен
krosaf4eg все правильно сделал, не упарывайтесь.
Старый 21.02.2013, 13:21
Extremator

offline
Опыт: 39,403
Активность:
я плох смотрел?
или 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,767
Активность:
просто Юрок, шутишь? судя по этому
Результат применения: От героя начинают идти бураны, нанося по 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
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
эскалибур, да твоих 10-15 скилов и проект будет уничтожен))
Старый 17.03.2013, 10:24
ShamaN26

offline
Опыт: 9,546
Активность:
эскалибур, Наличие глобальных переменных:нет
мир, дверь, мяч...
ps ты хоть знаешь, что такое переменная?)
Миниатюры
Кликните на картинку для увеличения
Название:  1.PNG
Просмотров: 84
Размер:  8.4 Кбайт  
Старый 17.03.2013, 11:41
эскалибур

offline
Опыт: 547
Активность:
у меня русские триггеры... а джаз я вобще непонимаю... хотя и смотрел всякие там ученья... да и вобще, в триггерах я неособо то разбираюсь...
ладно, подучусь... где это скачать ? sample locs.w3x?
Cosonic5, это почему? нормальные скилы...
Старый 17.03.2013, 12:19
DualShock

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

offline
Опыт: 547
Активность:
Создал новую способность! точнее пасивку! вот такую вот:
Название: Огненая атака
Метод исполнения: GUI
Нужен ли JNGP: нет
Тип цели: без цели
Результат применения: При атаке по герою враг потеряет 75 жизней, при чём не только он, а и те кто рядом с ним в области 225 от него.
Количество уровней:1
Вызов заклинания на цель:
Наличие глобальных переменных: нет
Не очень ругайте, делал пасивный триггер только в 3 раз.
Прикрепленные файлы
Тип файла: w3x Ognenaya atacka.w3x (12.2 Кбайт, 41 просмотров )
Старый 17.03.2013, 17:35
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
эскалибур, ну это легко ее каждый 2й сделает))
Старый 17.03.2013, 18:47
Praytic

offline
Опыт: 17,168
Активность:
Так это в редакторе объектов стандартный скил "Сокрушение".
Старый 17.03.2013, 19:01
просто Юрок
...
offline
Опыт: 11,271
Активность:
Praytic, сокрушение не отнимает здоровье, а наносит урон, да есть разница.
Старый 18.03.2013, 00:43
SANTIMEL

offline
Опыт: 12,871
Активность:
krosaf4eg,
» Dismember
Классно. Но с аганимом подстава. Лучше бы от силы лечился без него.
Старый 22.04.2013, 08:57
просто Юрок
...
offline
Опыт: 11,271
Активность:
Простой скилл на гуи (естественно не муи), но, тем не менее, может быть поможет новичкам.
Уровни: можно ставить сколько угодно
Наличие глобальных переменных: да
Описание: от героя разлетаются 5 снарядов, наносящих врагу урон, если он им попадётся.
Легко настроить под свои нужды.
Миниатюры
Кликните на картинку для увеличения
Название:  Безымянный.png
Просмотров: 51
Размер:  781.1 Кбайт  Кликните на картинку для увеличения
Название:  Безымянный0.png
Просмотров: 90
Размер:  457.7 Кбайт  
Прикрепленные файлы
Тип файла: w3x Test spirits.w3x (19.7 Кбайт, 47 просмотров )
Старый 26.04.2013, 18:06
DimanTOoBS

offline
Опыт: 5,791
Активность:
просто Юрок, зачем сюда выкладывать
естественно не муи
Старый 26.04.2013, 19:29
просто Юрок
...
offline
Опыт: 11,271
Активность:
DimanTOoBS, ну есть те кто и такого не знает.
Старый 27.04.2013, 07:08
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
просто Юрок:
Простой скилл на гуи (естественно не муи), но, тем не менее, может быть поможет новичкам.
Быстро переделать на муи без утечек с локейшенами, или исправлю я и напишу что автор делает как не надо делать, то учат писать по уродски, самым примитивным способом, 2013 год, давно пора вводить новые нормы даже для гуи...
Старый 27.04.2013, 15:26
просто Юрок
...
offline
Опыт: 11,271
Активность:
quq_CCCP, ну читал я статью про локалки, но до меня всё так "хорошо" доходит, что толку ноль (поэтоу изучать Jass для меня что-то невыполнимое, пытался раза 3). Конечно, препешите на муи, я лишь показал, что можно сделать.
Старый 27.04.2013, 15:50
HolyMoon
Hly shit!
offline
Опыт: 6,986
Активность:
можно и на гуи сделать многоразовый скил, если уж так неимется -_-
Старый 27.04.2013, 15:55
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
просто Юрок:
quq_CCCP, ну читал я статью про локалки, но до меня всё так "хорошо" доходит, что толку ноль (поэтоу изучать Jass для меня что-то невыполнимое, пытался раза 3). Конечно, препешите на муи, я лишь показал, что можно сделать.
От тебя требуется гуи скилл, где не будет утечек (то есть удаляться будут локейшены и прочая чепуха) а так же мультиплетность...
Старый 27.04.2013, 15:57
эскалибур

offline
Опыт: 547
Активность:
Ребят, меня только разбинили. Так вот, при сокрушение там когда герой АТАКУЕТ урон наносится, а тут когда враг бьёт ПО тебе.
Старый 04.05.2013, 23:06
эскалибур

offline
Опыт: 547
Активность:
Название Проклятие земли
Тип цели юнит
Результат применения Юнит кидает на цель-юнит заклинания проклятие, от которого тот будет каждую секунду будет наносить по 25 урона, при чём оглушая на 0.5 секунд. Время действия 10 секун.
Количество уровней 1
Прикрепленные файлы
Тип файла: w3x Проклятие.w3x (14.5 Кбайт, 21 просмотров )
Старый 05.05.2013, 15:53
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
эскалибур, Прошу удалить утечки (локейшены) а так же доработать дамми юнита (как он будет кидать молот бурь в юнита который вышел из поля зрения война и даммика (мб дамика каждый раз телепортировать к цели...
Старый 05.05.2013, 16:09
эскалибур

offline
Опыт: 547
Активность:
quq_CCCP, я незнаю как и что такое утечки и как избавлятся от них.
Старый 05.05.2013, 17:49
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,024
Активность:
эскалибур, ку как бы рассказывать сдесь такое толсто, но намекну про статьи и то то обьект Location (точка) не удаляется при создании дамми юнита, сначала вычисли точку и запиши её в переменную, затем создай в ней даммика, после удали точку этим действием:
((код jass
call RemoveLocation( udg_Имя_переменной )
))
Старый 05.05.2013, 17:54
эскалибур

offline
Опыт: 547
Активность:
quq_CCCP, а разве не
call RemoveUnit( udg_Имя_переменной )? Просто зачем мне локатион то? Я не запоминал точек.
Старый 05.05.2013, 18:05
просто Юрок
...
offline
Опыт: 11,271
Активность:
эскалибур, ну, как уже сказал quq_CCCP, сначало надо создать точку, запомнить её, и потом уже дамми в ней.
Старый 05.05.2013, 18:32
DualShock

offline
Опыт: 5,023
Активность:
эскалибур, могу дать лишь советы:
» кат
  • у дамми юнита есть тень ( убери ее )
  • даммик кастует стан не мгновенно, что бы исправить это смотри тут
  • даммик может стопить других юнитов, убери физ размер и тип летающий
  • первый стан идет от героя, зачем? если можно все сделать даммиком
  • не использовать вэйты ( это самое главное, изза них все глюки и утечки ) , юзай таймеры ( на гуи ими пользоваться к сожелению трудно ) ( на этот пункт и следующий новички обычно плюют )
  • спелл не муи ( работает только у одного юнита) , используй массивы или хэштейбл примеров куча
  • перед очередным станом двигай дамми юнита в позицию цели
  • ну и локэйшены удалять ( в этом спеле не столь критично, ибо переодик 1 сек )
  • и еще разные мелочи, например как уже говорили стан не прокатит, если враг в тумане ( как ни странно это лечится ( добавление даммику видимости - не выход!) )
сори за орфографию
Старый 05.05.2013, 23:15
эскалибур

offline
Опыт: 547
Активность:
DualShock, спасибо, буду знать ( особенно про таймер).
эскалибур добавил:
Таймер почемуто не работает.
эскалибур добавил:
  1. Название способности: Здоровье воина
  2. Относится к: Герою
  3. Тип цели: Пассивная способность
  4. Метод исполнения: GUI
  5. Мультиприменяемость: Да
  6. Описание способности в общем виде: Дополнительное здаровье %.
  7. Описание способности - уровни: сам напишу уже в своей карте=)
Уровень 1 - увеличение здоровья 2%
Уровень 2 - увеличение здоровья 4%
Уровень 3 - увеличение здоровья 6%
Уровень 4 - увеличение здоровья 8%
Уровень 5 - увеличение здоровья 10%
Автор - Imba
Прикрепленные файлы
Тип файла: w3x 1487_ukA.w3x (9.9 Кбайт, 47 просмотров )
Старый 06.05.2013, 17:30
Borodach

offline
Опыт: 5,767
Активность:
DualShock, :
не использовать вэйты ( это самое главное, изза них все глюки и утечки )
вейт не создает утечку и глюки.
Старый 06.05.2013, 21:36
Desgul2
Гость
Опыт: n/a
эскалибур, Добовляет не проценты а по 200 хп каждый уровень в процентах нужна системка, так как для меня это делали я просил=)
________________
пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ...
Старый 07.05.2013, 02:59
эскалибур

offline
Опыт: 547
Активность:
Desgul, ясно) Ну нечего
Старый 07.05.2013, 22:37
DimanTOoBS

offline
Опыт: 5,791
Активность:
Название: Темное обращение
Метод исполнения: GUI+CS (MUI)
Нужен ли JNGP: нет
Тип цели: без цели выключаемое ("Жар преисподней")
Результат применения: Меняет запасы здоровья и маны местами пока действует заклинание, даруя заклинателю большую выживаемость. Если герой подбирает предмет или повышает уровень меняются противоположные параметры, например поднял предмет на силу изменился запас МП и наоборот. Регенерация осталась прежней.
Количество уровней: 1
Наличие глобальных переменных: да
Прикрепленные файлы
Тип файла: w3x Shadow Conversion.w3x (16.8 Кбайт, 36 просмотров )
Старый 09.05.2013, 12:43
nvc123
new status
offline
Опыт: 59,284
Активность:
вейты неточны в отличие от таймеров
кроме того вейт паузит поток а таймер создаёт новый поток
Старый 09.05.2013, 13:35
эскалибур

offline
Опыт: 547
Активность:
Когда герой делает спел Гальванизацию, всем вызванным юнитам добавляется +500 к максимальному здоровью
Число можно вписать свое.
Создал - Imba
Прикрепленные файлы
Тип файла: w3x 1752_bLs.w3x (11.4 Кбайт, 10 просмотров )
Старый 18.05.2013, 12:34
nvc123
new status
offline
Опыт: 59,284
Активность:
Название: перемещение под землёй
Метод исполнения: vjass (MUI)
Нужен ли JNGP: да
Тип цели: без цели
Результат применения: закапывает юнита под землю при этом над землёй появляется дами юнит которого видит только тот игрок чей юнит под землёй(юнит через гетлокалплеер так что мх не увидят) вы можете перемещаться дами юнитом по карте а при нажатие способности у дами на его месте появляется закопавшийся юнит
Количество уровней: 1
Наличие глобальных переменных: да
при переносе на свою карту перекопируйте код из кустом скрипт, дами юнитов (называются оба дами) и дами скилы(закопаться и откопаться) и занесите их равкоды в раздел глобалс(там указано какие куда)
nvc123 добавил:
всё вроде написал
Прикрепленные файлы
Тип файла: w3x ungr.w3x (17.9 Кбайт, 26 просмотров )
Старый 18.05.2013, 16:05
Hate
конь вакуумный
offline
Опыт: 43,030
Активность:
умоляю, прочтите и примите к сведению
Старый 18.05.2013, 16:22
влад10011

offline
Опыт: 2,337
Активность:
nvc123:
вейты неточны в отличие от таймеров
кроме того вейт паузит поток а таймер создаёт новый поток
Вейт, это простая функция sleep в системной библиотеке, она тормозит только тот поток в котором была вызвана, как правило, чем больше число тем больше погрешность в вейте, если юзать цикл(при значениях <=1), то этой погрешности можно избежать. Так что вейт можно спокойно юзать.
Старый 19.05.2013, 08:36
nvc123
new status
offline
Опыт: 59,284
Активность:
вобще то вейт в цикле при значение меньше 1 ошибается не хило а при значениях меньше 0,1 погрешность может достигать 1 секунды
nvc123 добавил:
хотя как правило при 0,1 погрешность колеблется от 0,3 до 0,8
Старый 19.05.2013, 11:26
Hate
конь вакуумный
offline
Опыт: 43,030
Активность:
вы меньше 0.15 не сделаете, хоть разбейтесь
Старый 19.05.2013, 11:26
nvc123
new status
offline
Опыт: 59,284
Активность:
если бы вейт так хорошо работал в циклах то для скилов бы почти не использовались таймеры и ненужны были бы всякие записи в хэш по хэндлу таймера или атач числа к таймеру
nvc123 добавил:
согласен
Старый 19.05.2013, 11:33
эскалибур

offline
Опыт: 547
Активность:
Как обычная способность "Молот бурь" только цели наносится 100 ед. урона,а кастеру восполняется 100 ед. здоровья.Эффект такой:когда молот долетает до цели то на кастере появляется эффект как у способности "Благодать".
1.Молот света
  1. Относится:К воину
  2. цель: Боевая единица
  3. Исполнение: GUI
  4. Мульти:Да
6.Да
7.Как обычная способность "Молот бурь" только цели наносится 100 ед. урона,а кастеру восполняется 100 ед. здоровья.Эффект такой:когда молот долетает до цели то на кастере появляется эффект как у способности "Благодать".
Автор - KopBuH
Прикрепленные файлы
Тип файла: w3x 1669_holy_bolt.w3x (17.4 Кбайт, 33 просмотров )

Отредактировано эскалибур, 19.05.2013 в 18:55.
Старый 19.05.2013, 15:15
nvc123
new status
offline
Опыт: 59,284
Активность:
я думал это библиотека заклинаний а не конкурс сделай сам
Старый 19.05.2013, 16:07
эскалибур

offline
Опыт: 547
Активность:
nvc123, ну а что тут по твоему выкладывают то?
Старый 19.05.2013, 16:17
nvc123
new status
offline
Опыт: 59,284
Активность:
скилы готовые
а не идеи
Старый 19.05.2013, 17:08
эскалибур

offline
Опыт: 547
Активность:
nvc123, так это библиотека заклинаний! Вот и скилы готовые выкладывают. Идеи - твоя задача. Осуществить - можно попросить в Заклинаниях на заказ.
Старый 19.05.2013, 17:20
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
эскалибур,
так это библиотека заклинаний! Вот и скилы готовые выкладывают. Идеи - твоя задача. Осуществить - можно
попросить в Заклинаниях на заказ.
Вообще-то нет.
Старый 19.05.2013, 17:55
nvc123
new status
offline
Опыт: 59,284
Активность:
так ты сам скил не залил, только описание
Старый 19.05.2013, 18:38
эскалибур

offline
Опыт: 547
Активность:
nvc123, забыл вставить в текст... Щас, отредактирую.
Старый 19.05.2013, 18:53
nvc123
new status
offline
Опыт: 59,284
Активность:
я могу залить пару скилов только их придётся отредактировать
nvc123 добавил:
то-есть добавить коменты и прочее
Старый 19.05.2013, 19:01
Амбидекстрия
Silenced by ScorpioT1000
offline
Опыт: 8,237
Активность:
Название: Второе дыхание.
Метод исполнения: vJass, хоть сколько юнитов могут юзать способность.
Нужен ли JNGP: +
Тип цели: Пассивное.
Результат применения: Юнит излечивается на определённое количество здоровья.
Количество уровней: сколько влезет.
Вызов заклинания на цель: баффа нету.
Наличие глобальных переменных: Чтобы спелл работал, у вас должна быть инициализированная хэш-таблица с названием hash( у меня она записана в глобалку, поэтому в коде используется udg_hash)
Простенький, легко настраиваемый код. Спелл - Аналог варовского Второго дыхания из WOW, когда юнит атакован( у меня событие именно атакован, а не получает урон) и у него менее x% хп, то запускается процесс лечения. Все настройки внутри кода с помощью глобалок.
» код

library restlife initializer init

globals 
   private boolean current = false 
//Настройка способности:
   private constant integer abilitycode = 'A00E' // Вместо A00e поставьте равкод вашей способности-пустышки, без которой юнит не получит лечение
   private constant real lifepercent = 35// значение, при котором начнется восстановление здоровья, например: 35 значит, что если юнит атакован и у него меньше 35% здоровья, то начнется лечение.
   private constant real cooldown = 30 //перезарядка способности в секундах
   private constant real healpercent = 10 //сколько процентов здоровья будет восстанавливать способность от максимального здоровья юнита за уровень способности
   private constant integer healtime = 15 // время, за которое юнит восстановит здоровье
   private constant string eff = "Abilities\\Spells\\NightElf\\Rejuvenation\\RejuvenationTarget.mdl" // спецэффект, который будет сопровождать лечение
endglobals

private function RestCondition takes nothing returns boolean
   return GetUnitState(GetTriggerUnit(),UNIT_STATE_LIFE)<0.01*lifepercent*GetUnitState(GetTriggerUnit(),UNI​T_STATE_MAX_LIFE) and GetUnitAbilityLevel(GetTriggerUnit(), abilitycode)>0 and not (current==true)
endfunction

private function Cooldown takes nothing returns nothing
   set current = false
   call DestroyTimer(GetExpiredTimer())
endfunction

private function Healing takes nothing returns nothing
   local timer t = GetExpiredTimer()
   local integer h = GetHandleId(t)
   local unit un = LoadUnitHandle(udg_hash, h, 0)
   local real maxlife = LoadReal(udg_hash, h, 1)
   local integer count = LoadInteger(udg_hash, h, 2)
   local integer level = LoadInteger(udg_hash, h, 3)
   local real currenthp = GetUnitState(un,UNIT_STATE_LIFE)
   call SetUnitState(un, UNIT_STATE_LIFE, currenthp+(maxlife*0.01*(level*healpercent))/healtime)
   count++
   call SaveInteger(udg_hash,h,2,count)
   if count==0 then
      set un=null
      call DestroyEffect(LoadEffectHandle(udg_hash,h,4))
      call DestroyTimer(t)
      call FlushChildHashtable(udg_hash,h)
      set t = null
   endif
endfunction   

private function RestStart takes nothing returns nothing
   local unit un = GetTriggerUnit()
   local timer t = CreateTimer()
   local timer cd = CreateTimer()
   local integer h =  GetHandleId(t)
   local real maxlife = GetUnitState(un, UNIT_STATE_MAX_LIFE)
   local integer count = healtime
   local integer level = GetUnitAbilityLevel(un, abilitycode)
   set current = true
   call SaveUnitHandle(udg_hash, h, 0, un)
   call SaveReal(udg_hash, h, 1, maxlife)
   call SaveInteger(udg_hash, h, 2, count)
   call SaveInteger(udg_hash, h, 3, level)
   call SaveEffectHandle(udg_hash,h,4,AddSpecialEffectTarget(eff, un,"chest"))
   call TimerStart(t,1.,true, function Healing)
   call TimerStart(cd, cooldown, false, function Cooldown)
   set un = null
   set t = null 
   set cd = null
endfunction

//===========================================================================
function init takes nothing returns nothing
    local trigger tr = CreateTrigger()
    local integer i = 0
    loop
        call TriggerRegisterPlayerUnitEvent(tr, Player(i), EVENT_PLAYER_UNIT_ATTACKED, null)
         i++
        exitwhen i == bj_MAX_PLAYER_SLOTS
    endloop
    call TriggerAddCondition( tr, Condition( function RestCondition ) )
    call TriggerAddAction( tr, function RestStart )
endfunction

endlibrary

Отредактировано Амбидекстрия, 11.06.2013 в 11:36.
Старый 10.06.2013, 15:16
Goodie

offline
Опыт: 2,825
Активность:
Амбидекстрия, Код не оптимизирован, советую почитать статьи по оптимизации
Goodie добавил:
Старый 10.06.2013, 19:07
Амбидекстрия
Silenced by ScorpioT1000
offline
Опыт: 8,237
Активность:
Goodie:
Амбидекстрия, Код не оптимизирован, советую почитать статьи по оптимизации
Goodie добавил:
Lol, если не обнуление пары переменных это уже у тебя считается не оптимизированным кодом, то это странно, в любом случае, все исправил, код максимально безутечный.
Старый 10.06.2013, 20:25
Goodie

offline
Опыт: 2,825
Активность:
Goodie, Спасибо за понимание)
Кстати некоторые переменные можно переделать в дефайны
Goodie добавил:
((код jass
set count=count--
может быть так?
set count-=1
или так
set count--
или так
set count = count - 1
))
Старый 11.06.2013, 08:41
Амбидекстрия
Silenced by ScorpioT1000
offline
Опыт: 8,237
Активность:
Goodie:
Goodie, Спасибо за понимание)
Кстати некоторые переменные можно переделать в дефайны
можно, но хотел не прибегать к использованию макросов, т.к. cJass многим непонятен, а глобалки - привычное дело. Можно даже все переписать под cJass, что сократит количество символов в полтора раза)
Goodie добавил:
((код jass
set count=count--
может быть так?
set count-=1
или так
set count--
или так
set count = count - 1
))
да, точно, но правда все эти варианты равнозначны, так что можно юзать любой, переделаю в count--

Отредактировано Амбидекстрия, 11.06.2013 в 11:13.
Старый 11.06.2013, 11:04
Ice_Arrow

offline
Опыт: 12
Активность:
Land Mine
Установка "мины" в центре указанной области которая срабатывает если вражеский юнит [или группа юнитов] перемещается неподалеку от неё. Если мина не зарегистрировала достаточное количество "перемещений" то она не детонирует . Насколько"мина" близка к детонации можно судить по её цвету [ Зелёный-Красный]. Если враги не двигаются, то и мина не реагирует.
Способность создана на основе спелла "Канал" и имеет 1 уровень, но это исправимо.
Выполнен на Jass'e без использования всяких нано технологий.
Комменты, подсказки и инструкция по копированию внутри мапы.
Прикрепленные файлы
Тип файла: w3x LandMine [by Ice_Arrow].w3x (30.7 Кбайт, 21 просмотров )
Старый 23.07.2013, 14:36
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
Ice_Arrow, Не оптимизировано, есть ненужные действия, есть утечки + не обнуляются локальные хендлы + таблицы хуже глобалок
Sargaraser добавил:
ещё и вейт DX + запись в переменную путем записи последнего юнита из переменной в свою переменную - бред придуманный гуями, потренируйся ещё в создании скилов + почитай статьи по оптимизу, потому глядишь мб че норм выйдет
Старый 23.07.2013, 15:27
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
Герой:Иглогрив
Метод исполнения:jass
Нужен ли JNGP: нет
Тип цели:враги,точка, сам воин
Вызов заклинания на цель:да
Наличие глобальных переменных:нет
Прикрепленные файлы
Тип файла: w3x Иглогрив.w3x (429.9 Кбайт, 50 просмотров )

Отредактировано Cosonic5, 26.08.2013 в 11:22.
Старый 24.08.2013, 20:42
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
Герой Мев
Метод исполнения:jass
Нужен ли JNGP: нет
Тип цели:враги,точка, сам воин
Вызов заклинания на цель:да
Наличие глобальных переменных:нет
Прикрепленные файлы
Тип файла: w3x Новый герой Мэв.w3x (403.5 Кбайт, 57 просмотров )
Старый 26.08.2013, 11:21
LordSerga

offline
Опыт: 3,809
Активность:
Название: Смертельный скачок
Метод исполнения: jass
Нужен ли JNGP: нет
Тип цели: область
Результат применения: Телепортация на небольшое расстояние, позволяющая мгновенно приблизиться к противникам или выйти из боя. На месте отправления и приземления создаются энергетические заряды, наносящие урон противникам.
Количество уровней: 1 и более (не ограничено)
Наличие глобальных переменных: нет
Телепортация на короткое расстояние не позволит нанести урон одному воину дважды. Область нанесения урона - 325 и может быть изменена, как и урон.
» код здесь (кликабельно)
function Trig_Uses_Actions takes nothing returns nothing
    local integer idspell= GetSpellAbilityId()
    local unit u= GetTriggerUnit()
    local integer lvl= GetUnitAbilityLevel(u, idspell)
    if idspell== 'AEbl' then
        set bj_lastCreatedGroup= CreateGroup()
        call GroupEnumUnitsInRange(bj_lastCreatedGroup, GetUnitX(u), GetUnitY(u), 325., null)
        set bj_groupAddGroupDest= CreateGroup()
        call GroupEnumUnitsInRange(bj_groupAddGroupDest, GetSpellTargetX(), GetSpellTargetY(), 325., null)
        loop
            set bj_lastCreatedUnit= FirstOfGroup(bj_groupAddGroupDest)
        exitwhen bj_lastCreatedUnit== null
            if IsPlayerEnemy(GetOwningPlayer(u), GetOwningPlayer(bj_lastCreatedUnit)) and IsUnitType(bj_lastCreatedUnit, UNIT_TYPE_STRUCTURE)== false and GetUnitState(bj_lastCreatedUnit, UNIT_STATE_LIFE)>=.405 then
                call GroupAddUnit(bj_lastCreatedGroup, bj_lastCreatedUnit)
            endif
            call GroupRemoveUnit(bj_groupAddGroupDest, bj_lastCreatedUnit)
        endloop
        call DestroyGroup(bj_groupAddGroupDest)
        loop
            set bj_lastCreatedUnit= FirstOfGroup(bj_lastCreatedGroup)
        exitwhen bj_lastCreatedUnit== null
            if GetPlayerId(GetOwningPlayer(bj_lastCreatedUnit))== 5 then
                call UnitDamageTarget(u, bj_lastCreatedUnit, 90.+ lvl*40., true, true, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
            endif
            call GroupRemoveUnit(bj_lastCreatedGroup, bj_lastCreatedUnit)
        endloop
        call DestroyGroup(bj_lastCreatedGroup)
    endif
    set u= null
endfunction

Отредактировано LordSerga, 03.09.2013 в 22:46.
Старый 03.09.2013, 19:35
DualShock

offline
Опыт: 5,023
Активность:
LordSerga, твой код плохо читается + некоторые юниты не фильтруются, предлагаю более крутой вариант:
function cond takes nothing returns boolean
    return GetSpellAbilityId() == 'AEbl'
endfunction

function act takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local unit first
    local group g = CreateGroup()
    local integer lvl = GetUnitAbilityLevel(u, 'AEbl')

    call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 325., null)
    call GroupEnumUnitsInRange(g, GetSpellTargetX(), GetSpellTargetY(), 325., null)
    
    loop
        set first = FirstOfGroup(g)
        exitwhen first == null
        if длинные фильтры then
            call UnitDamageTarget(u, first , 90. + lvl * 40., true, true, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
        endif
        call GroupRemoveUnit(g, first)
    endloop
    
    call DestroyGroup(g)

    set u = null
    set g = null
    set first = null
endfunction
в идеале еще нужны глобалки
Старый 03.09.2013, 21:43
LordSerga

offline
Опыт: 3,809
Активность:
DualShock:
LordSerga, твой код плохо читается + некоторые юниты не фильтруются, предлагаю более крутой вариант:
» код скрыт под катом (кликабельно)
function cond takes nothing returns boolean
    return GetSpellAbilityId() == 'AEbl'
endfunction

function act takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local unit first
    local group g = CreateGroup()
    local integer lvl = GetUnitAbilityLevel(u, 'AEbl')

    call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 325., null)
    call GroupEnumUnitsInRange(g, GetSpellTargetX(), GetSpellTargetY(), 325., null)
    
    loop
        set first = FirstOfGroup(g)
        exitwhen first == null
        if длинные фильтры then
            call UnitDamageTarget(u, first , 90. + lvl * 40., true, true, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
        endif
        call GroupRemoveUnit(g, first)
    endloop
    
    call DestroyGroup(g)

    set u = null
    set g = null
    set first = null
endfunction
в идеале еще нужны глобалки
Зачем это еще?
Я от глобалок уходил, чтобы в одном триггере делать множество действий с разными способностями. Вот пример:
PS: Отдельный Condition для триггера (как и boolexpr для группы) тратит больше ресурсов процессора и ОЗУ (работает намного медленнее, чем простое условие), нежели приведенная ниже система.
if idspell== 'AEbl' then
	run AEbl
elseif idspell== 'A000' then
	run A000
elseif idspell== 'A001' then
	set bj_lastStartedTimer= CreateTimer()
	call SaveUnitHandle(...)
	call TimerStart(.., function A001)
endif
А на счет этого
	call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 325., null)
	call GroupEnumUnitsInRange(g, GetSpellTargetX(), GetSpellTargetY(), 325., null)
Нет гарантии, что при двойном вызове GroupEnum...() данные о первом вызове функции не затрутся.
Я использовал 2 группы, с помощью цикла проверял отсутствие юнита из Group2 в Group1. Если юнит отсутствует - я его добавляю в Group1. Таким образом нет утерянных юнитов, которые должны получить урон.
твой код плохо читается
На хабре постоянно выкладывают статьи с примерами оформления кода, увидел некоторые примеры именно в таком оформлении, стал оформлять так же.
Усложнять фильтр нужно, только если есть какие особенности на карте. К прмеру, катапальта, которая должна получать меньше урона (хотя это можно реализовать через таблицу получения урона в зависимости от типа защиты [в игровых константах], с учетом, разумеется, типа брони и атаки)
if IsPlayerEnemy(GetOwningPlayer(u), GetOwningPlayer(bj_lastCreatedUnit)) and IsUnitType(bj_lastCreatedUnit, UNIT_TYPE_STRUCTURE)== false and GetUnitState(bj_lastCreatedUnit, UNIT_STATE_LIFE)>=.405 then

Отредактировано LordSerga, 03.09.2013 в 22:42.
Старый 03.09.2013, 22:22
DualShock

offline
Опыт: 5,023
Активность:
LordSerga:
call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 325., null)
call GroupEnumUnitsInRange(g, GetSpellTargetX(), GetSpellTargetY(), 325., null)
ну тут да, я дно D:
LordSerga:
Я от глобалок уходил, чтобы в одном триггере делать множество действий с разными способностями. Вот пример:
PS: Отдельный Condition для триггера (как и boolexpr для группы) тратит больше ресурсов процессора и ОЗУ (работает намного медленнее, чем простое условие), нежели приведенная ниже система.
if idspell== 'AEbl' then
	run AEbl
elseif idspell== 'A000' then
	run A000
elseif idspell== 'A001' then
	set bj_lastStartedTimer= CreateTimer()
	call SaveUnitHandle(...)
	call TimerStart(.., function A001)
endif
Это не критично, лишние байты ничего не решат и бегать за ними глупо. У любого современного компьютера достаточно производительности что бы справиться с этим, будь их хоть 500, есть более важные вещи на которые нужно обращать внимание. Глобалки нужны для того что бы удобно настраивать способности. А вот этот код который выше вообще бред, это будет все разбито на кучу частей, в таком коде быстро разобраться сможет только тот кто его написал.
DualShock добавил:
if GetPlayerId(GetOwningPlayer(bj_lastCreatedUnit))== 5 then
вот я еще не понял для чего это
Старый 04.09.2013, 00:21
Extremator

offline
Опыт: 39,403
Активность:
Кое-что придумал
сделал, и решил выложить тут! ^^
По-мойму в кой-то веки сделал нечто необычное! хД

Bounty Greed

Тип применения: Точка (эффект задевает всех вокруг точки / курсор имеет вид области)
Цели заклинания: Враги в указанной области (в радиусе до 400/600/800 AoE от точки применения)
Описание: Делает всех подверженных заклинанию врагов личной добычей героя.
Это означает что убийство любого из них будет засчитываться этому самому герою!
Результат применения: Делает так, что любой умирающий юнит приносит золото/опыт тому кто применил это заклинание.
Вешает на всех врагов (не героев и не здания) в области 400/600/800 АоЕ от точки применения заклинания бафф,
который длится 10/20/30 секунд. Любой умирающий юнит (не естественной смертью) становится добычей героя
(получает золото и опыт как-будто он сам его убил, при этом опыт может быть не получен,
если герой был слишком далеко от этого юнита - это стандарт распределения опыта в варкрафте).
Для героя: Да
Количество уровней: 3 уровня
Тип исполнения: GUI (MUI)
Вызов заклинания на цель (buff): Да, особый триггерный бафф на основе ауры (на себя). Не перебивается другими стандартными баффами.
Прикрепленные файлы
Тип файла: w3x Bounty Greed.w3x (13.5 Кбайт, 37 просмотров )

Отредактировано Extremator, 02.10.2013 в 02:41.
Старый 02.10.2013, 02:29
Ответ

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

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

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

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



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