30

» WarCraft 3 / Огненное Пламя

Rockmaf, без всякого сарказма, по сравнению с тем что было раньше, это просто шикарно. Но есть добавлю критики:
Если сюда дописать then, то заклинание будет работать на 1.26+
Избавьтесь от привычки всюду лепить вэйты:
Процитирую комментатора выше, эти действия бессмысслены
Не забивайте значения вручную, используйте константу bj_MAX_PLAYER_SLOTS ибо ваш код могут использовать на патче 1.30+ где 24 игрока.
IsUnitType(n,UNIT_TYPE_DEAD) не очень корректно работает, лучше подтянуть нативку UnitAlive()
У способности три уровня, а урон наносится фиксированный

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

//! zinc
library SpellFire {
    integer ABILITY_ID = 'A000';
    real EXPLODE_RANGE = 400;
    string EXPLODE_CENTER = "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl";
    string EXPLODE_CIRCLE = "Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralBuildingExplosion.mdl";
    integer EXPLODE_CIRCLE_COUNT = 12;
    integer DAMAGE = 100;
    
    // ---
    group g = CreateGroup();
    
    function onInit() {
        integer i;
        trigger t = CreateTrigger();
        TriggerAddCondition(t, Filter(function() -> boolean {
            return GetSpellAbilityId() == ABILITY_ID;
        }));
        for (0 <= i < bj_MAX_PLAYER_SLOTS){
            TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        }
        TriggerAddAction(t, function(){
            unit target, caster = GetSpellAbilityUnit(); // кастер
            real a = bj_PI * 2 / EXPLODE_CIRCLE_COUNT , x = GetSpellTargetX(), y = GetSpellTargetY(); // координаты области каста
            integer i;
            real damage = GetUnitAbilityLevel(caster, ABILITY_ID) * DAMAGE;
            
            DestroyEffect(AddSpecialEffect(EXPLODE_CENTER, x, y));
            for (0 < i <= EXPLODE_CIRCLE_COUNT){
                DestroyEffect(AddSpecialEffect(EXPLODE_CIRCLE, x + EXPLODE_RANGE * Cos(a*i), y + EXPLODE_RANGE * Sin(a*i)));  
            }
            GroupEnumUnitsInRange(g, x, y , EXPLODE_RANGE, null);
            while (true){
                target = FirstOfGroup(g);
                if (target == null) { break; }
                if (IsUnitEnemy(target, GetOwningPlayer(caster)) && UnitAlive(target)){
                    UnitDamageTarget(caster, target, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS); // наносим урон
                }
                GroupRemoveUnit(g, target);
            }
            caster = null;
            target = null;
        });
    }
}
//! endzinc
//! endnocjass
30

» Администрация XGM / Agren и компания

Обратная совместимость это плохо и только тормозит развитие продукта, как вот вы этого не можете понять.
Так наболело, что аж подпишусь под каждым словом.
30

» WarCraft 3 / Set Ability Integer value

я знаю функции, только которые конвертируются из ГУИ.
Все с конвертирования начинали, я тоже иногда малоиспользуемые вещи конвертацией узнаю))
А на последнем патче можно и на lua перейти. Можно набрать ключевые слова и IDE вам все варианты покажет)
Загруженные файлы
30

» WarCraft 3 / Какими способами может быть отменено прицеливание способностью?

Может не сработать в случае, если игрок отправляет героя по шифту, в конце прожимает способность и меняет выбор.
30

» WarCraft 3 / Set Ability Integer value

TeX13, так в чём проблема, абилку можете получить с помощью GetSpellAbility(). Останется только выбрать событие, при котором можно изменить данные способности. Они срабатывают в таком порядке:
  • EVENT_PLAYER_UNIT_SPELL_CHANNEL
  • EVENT_PLAYER_UNIT_SPELL_CAST
  • EVENT_PLAYER_UNIT_SPELL_EFFECT
  • EVENT_PLAYER_UNIT_SPELL_ENDCAST
  • EVENT_PLAYER_UNIT_SPELL_FINISH
30

» WarCraft 3 / Set Ability Integer value

Может и не работать, лично не проверял, но кажись 0 уровень = 1, попробуй
Все Blz* функции 0 indexed, это было в описании патча.
кто-нибудь вообще эти функции проверял?
На хайве проверяли.
TeX13, что за странная любовь к BJ? Вы бы хоть посмотрели, во что они раскрываются:
function GetInventoryIndexOfItemTypeBJ takes unit whichUnit, integer itemId returns integer
    local integer index
    local item    indexItem

    set index = 0
    loop
        set indexItem = UnitItemInSlot(whichUnit, index)
        if (indexItem != null) and (GetItemTypeId(indexItem) == itemId) then
            return index + 1
        endif

        set index = index + 1
        exitwhen index >= bj_MAX_INVENTORY
    endloop
    return 0
endfunction

function GetItemOfTypeFromUnitBJ takes unit whichUnit, integer itemId returns item
    local integer index = GetInventoryIndexOfItemTypeBJ(whichUnit, itemId)

    if (index == 0) then
        return null
    else
        return UnitItemInSlot(whichUnit, index - 1)
    endif
endfunction
30

» WarCraft 3 / Как узнать ID приказа?

хм.. значит, чтобы узнать id приказа надо использовать способности напрямую
Ну да, предмет же использует стандартные способности. Можете в JASS режиме отдать приказ
Сконвертировать в триггер
call IssueImmediateOrderBJ( null, "instant" )
И найти его в списке приказов
constant integer instant=852200
30

» WarCraft 3 / Как узнать ID приказа?

Ид приказа = "852008"
Это приказ использования предмета в слоте, а не способности
public constant integer useslot1=852008
public constant integer useslot2=852009
public constant integer useslot3=852010
public constant integer useslot4=852011
public constant integer useslot5=852012
public constant integer useslot6=852013
30

» WarCraft 3 / Как узнать ID приказа?

Отловить приказ и вывести на экран не пробовали?

Бот уже нашёл правильный ответ
public constant integer raisedead=852197
public constant integer raisedeadoff=852199
public constant integer raisedeadon=852198
30

» Администрация XGM / Agren и компания

единственная проблема в том что в инкогнито не могу зайти на сайт
Странно, часто захожу с инкогнито на чужих компах и проблем не наблюдаю.
30

» Администрация XGM / Agren и компания

А так, я конечно, подожду, когда администрация исправит ошибку доступа на сайт с win xp
Нужно не сайт исправлять, а winXP: AES-256 для Windows XP.
30

» WarCraft 3 / Юниты не перестают появляться

Нужно дополнить условие проверкой, жива ли требуемая постройка.
И не плодить утечки групп раз в 20 секунд)
30

» WarCraft 3 / Приказ Группе jass

если честно, ничего в этой записи не понимаю
Что из слов native, takes, returns вам непонятно?
30

» WarCraft 3 / Уровень моба

Всплывающий текст над головой, где указан integer уровень юнита.
Всплыващий текст обламывается лимитом в сто штук.

Берём модельку
копируем сколько нужно раз, заменяем текстурку на нужные цифирьки и выдаём способностью прям в РО. Даже думать программировать не нужно.
Загруженные файлы
30

» WarCraft 3 / Knights & Rogues COMPLETE EDITION

да я бы и сам рад откатить её на 1.26
Зачем заниматься некромантией?
30

» WarCraft 3 / Приказ Группе jass

Так сделайте переменную глобальной. А ещё лучше покажите код.
30

» WarCraft 3 / Knights & Rogues COMPLETE EDITION

А что плохого в переборах и массивах?
В том, что данном случае они не нужны.
Это зависит от карты, которую требуется сделать.
Мой пример не зависит от карты и возрождает всех героев, а дополнительные условия всегда можно дописать.
Т.е. решение ты не засчитываешь, верно?
Чисто формально, оно не работает для количества героев больше 8196))
Только потому, что ты ярый противник гуи, так?
Я противник решений, которые это гуи предлагает.
Но теперь то в чем конкретный косяк?
Чисто технически нивчём. Можешь даже наработкой на сайт опубликовать, чтоб другие не мучались)
И что плохого в периодическом событии? Это по сути всего еще один таймер.
В том, что в данном случае оно не нужно.
Это ты мне намекаешь уже на новое задание по гуи насчет снарядов?)
Это я к тому, что смерть героя обычно редкое событие при игре и лишние переборы никто не заметит. Но в случае снарядов, действия выполняются больше десяти раз в секунду и там лишние переборы могут серьёзно залагать карту.
30

» WarCraft 3 / Knights & Rogues COMPLETE EDITION

поэтому ты сможешь указать на слабые места.
Как всегда избыточные костыли GUI: периодический триггер, переборы и массивы. Потом придётся ещё костылить, чтоб работало с расставлеными на карте героями. Притом это ещё простая задача, хоть и популярная. А на движении снарядов количество костылей на GUI уже начнёт зашкаливать))
30

» WarCraft 3 / Knights & Rogues COMPLETE EDITION

В данном случае, lua лучше, чем гуи.
В данном случае это написано на zinc.
Но мне реально никогда такого не было нужно) Гуи вполне хватало.
Если пилить кинематики на вэйтах, то может и хватит. А вот если понадобятся например задержки или снаряды то гуи внезапно превращается в тыкву.
30

» WarCraft 3 / Knights & Rogues COMPLETE EDITION

будут ли пауки создаваться?
Не будут. Таймер не только создать нужно но и запустить.
Неужели, там действительно таймеры создаются динамически?
Если не разбираться ни в чём, кроме кривого GUI, то нет. Я вообще непонимаю, зачем городить костыли на гуях если можно написать несколько строчек кода.
Жаль, что не могу посмотреть карту вашу, т.к. не хочу ставить 31 патч.
На 1.26 патче кода немного больше, но всёравно так же просто:
//! nocjass
//! zinc
library HeroRevive {
    hashtable HT = InitHashtable();

    function onInit(){
        integer i;
        trigger ReviveTrigger = CreateTrigger();
        
        for (0 <= i < bj_MAX_PLAYER_SLOTS){
            TriggerRegisterPlayerUnitEvent(ReviveTrigger, Player(i), EVENT_PLAYER_HERO_REVIVABLE, null);
        }
        TriggerAddAction(ReviveTrigger, function(){
            unit u = GetTriggerUnit();
            timer t = CreateTimer();
            integer tId = GetHandleId(t);
            timerdialog td = CreateTimerDialog(t);

            SaveUnitHandle(HT, tId, 0, u);
            SaveTimerDialogHandle(HT, tId, 1, td);
            TimerDialogSetTitle(td, GetUnitName(u));
            
            TimerStart(t, GetHeroLevel(u) * 2, false, function(){
                timer t = GetExpiredTimer();
                integer tId = GetHandleId(t);
                unit u = LoadUnitHandle(HT, tId, 0);
                timerdialog td = LoadTimerDialogHandle(HT, tId, 1);
                integer loc = GetPlayerStartLocation(GetOwningPlayer(u));
                FlushChildHashtable(HT, tId);
                ReviveHero(u, GetStartLocationX(loc), GetStartLocationY(loc), true); u = null;
				DestroyTimerDialog(td); td = null;
				DestroyTimer(t); t = null;
			});
			TimerDialogDisplay(td, true);
            t = null;
            u = null;
            td = null;
		});
        ReviveTrigger = null;
    }
}
//! endzinc
//! endnocjass
Загруженные файлы
30

» WarCraft 3 / Knights & Rogues COMPLETE EDITION

Только почему не работает для таймеров превышение Раз. непонятно.
Не смотрел на 1.26, но на последнем патче InitGlobals выглядит так.
function InitGlobals takes nothing returns nothing
    local integer i= 0

    set i=0
    loop
        exitwhen ( i > 3 )
        set udg_TIMER[i]=CreateTimer()
        set i=i + 1
    endloop

endfunction
Так что должно работать.
30

» WarCraft 3 / Knights & Rogues COMPLETE EDITION

1.26.0.6401
Я же писал, что нужен последний патч.
Когда у переменной timer размер массива 1
Если вы за это поле при создании переменной
То это не размер массива, а количество установленных значений. Например для целлочисленного массива с размером 3 и значением 6 будет выглядеть так [6,6,6].
Загруженные файлы