30

» WarCraft 3 / Как сделать спелл - Рыкок

ledoed:
а пусть кидает не видимый молот бурь пока ты летишь и кокраз скорость снаряду назначишь,а когда подлетит твой чел ему и стан и урон
Молоток и дамми кастом в цель можно бросить, когда чел подлетит к цели. Так проще будет.
30

» WarCraft 3 / Иногда не создаётся плавающий текст

Принятый ответ
Выводите все текстаги через функцию и посчитайте их. Возможно где-то они в цикл попадают и превышают лимит
function TT takes ...
	udg_TextTagCount = udg_TextTagCount + 1
	BJDebugMsg(I2S(udg_TextTagCount))
	...
endfunction
Перенесите скрипты отвечающие за текстаг в отдельную карту и повторить проблему. Если появится прикрепите эту карту к сообщению.
30

» WarCraft 3 / Как сделать спелл - Рыкок

профи по лору, балансу и ландшафту
Ну коли сделали прыжок, вынесите его в отдельную карту и прикрепите к сообщению. Заменить тип урона дело несложное.
30

» WarCraft 3 / Помогите с созданием этого спелла

GetLocalPlayer, это сработает, если у игрока только один герой с этой способностью. Тогда можно упростить задачу выдавая ему даммика с временем жизни. Ну а каст по приказу можно отследить и прерывать станом на .1сек.
30

» WarCraft 3 / Помогите с созданием этого спелла

Ну так вы покажите свои попытки ибо тупые интернет тролли не любят задарма время терять.
30

» WarCraft 3 / Когда-то уже просил найти утечки тут, и через годы... Снова...

Вот, набросал библиотеку. Под себя заточить несложно
zinc
//! zinc
library NeutralPassiveTalk {
    /* настройки */
    constant real FontSize = 8.;
    constant real FontTime = 1.5;
    constant real Range = 500.;
    constant string Effect = "Abilities\\Spells\\Human\\InnerFire\\InnerFireTarget.mdl";
    
    //функция спецэффекта
    function Eff(player p, unit u) {
        string e = "";
        if (p == GetLocalPlayer()) {
            e = Effect;
        }
		DestroyEffect(AddSpecialEffectTarget(Effect, u, "overhead"));
    }
    
    // функция текстага
    function TextTag(player p, unit u, string s){
        texttag tt = CreateTextTag();
        SetTextTagText(tt,s,FontSize*.0023);
        SetTextTagPosUnit(tt, u, 20.);
        SetTextTagVelocity(tt, .05325 * Cos(1.570795), .05325 * Sin(1.570795));
        SetTextTagPermanent(tt, false);
        SetTextTagLifespan(tt, FontTime);
        SetTextTagFadepoint(tt, 0.);
        
        //скрываем от всех
        SetTextTagVisibility(tt, false);
        
        //показываем локальному игроку
        if (p == GetLocalPlayer()){
            SetTextTagVisibility(tt, true);
        }
        
        //утечки
        tt = null;
    }
    
    // применяем действия
    function Actions(player p, unit u1, unit u2,real angle){
        integer id = GetUnitTypeId(u2);
        string s = null;
        
        //проверяем юнитов
        if (id == 'hfoo'){
            s = "я бью";
        } else if (id == 'hsor') {
            s = "я колдую";
        } else if (id == 'hrif') {
            s = "у меня ружжо";
        } else if (id == 'earc') {
            s = "я стреляю";
        } else if (id == 'ugho') {
            KillUnit(u2);
        }
        
        // создаём текстаг, поворачиваем юнита и накидываем спецэффеты 
        if (s != null){
            // поворачиваем юнита
            SetUnitFacingTimed( u2, angle, 0. );
            
            // показываем текстаг
            TextTag(p, u2, s);
            
            // аттачим эффект
            Eff(p, u2);
            
            // шаманим с LocalPlayer
            if (p == GetLocalPlayer()){
                //говорим от юнита, возможен десинк, нужно проверить!
                SetCinematicScene(id, GetPlayerColor(GetOwningPlayer(u2)), GetUnitName(u2), s, I2R(StringLength(s)) * .3, .0);
                //мигаем индикатор, возможен десинк, нужно проверить!
                AddIndicator(u2, 255, 255, 255, 255);
            }
        }
    }
    
    // условия триггера
    function Cond() -> boolean {
        return (GetOwningPlayer(GetOrderTargetUnit()) == Player(PLAYER_NEUTRAL_PASSIVE) && GetIssuedOrderId() == 851971);
    }

    // инициализация
    function onInit(){
        trigger t = CreateTrigger();
        integer i;
        
        // вешаем событие только играющим людям
        for (0 <= i < 12) {
            if (GetPlayerController(Player(i)) == MAP_CONTROL_USER && GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING) {
                TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, null);
            }
        }
        
        // вешаем условие
        TriggerAddCondition( t, Condition( function Cond));
        
        // вешаем действие
        TriggerAddAction( t, function(){
            unit u1 = GetTriggerUnit(); //юнит отдавший приказ
            unit u2 = GetOrderTargetUnit(); // юнит - цель приказа
            real x1 = GetUnitX(u1);
            real y1 = GetUnitY(u1);
            real x2 = GetUnitX(u2);
            real y2 = GetUnitY(u2);
            real dx = x2 - x1;
            real dy = y2 - y1;
            real angle = bj_RADTODEG * Atan2(y1 - y2, x1 - x2);
            real distance = SquareRoot(dx * dx + dy * dy);
            player p = GetOwningPlayer(u1);
            
            // применяем действия
            if (distance <= Range) {
                Actions(p,u1,u2,angle);
            }
                        
            // утечки
            u1 = null;
            u2 = null;
        });
    }
}
//! endzinc
Загруженные файлы
30

» WarCraft 3 / Когда-то уже просил найти утечки тут, и через годы... Снова...

ScopteRectuS:
Msey, эту локальную переменную можно не обнулять, она ссылается на статичный триггер, который будет висеть в памяти до конца игры. Другое дело, если бы это был динамичный триггер...
И зачем вам лишний handle, который вы не сможете дальше использовать?
30

» WarCraft 3 / Когда-то уже просил найти утечки тут, и через годы... Снова...

Alexey103:
Obelick, Ты не прав, я проверил заменив детектор расстояния между юнитами сообщением в чат, события и условия не утекают.
biridius, NazarPunk, Obelick, ScopteRectuS, Sergarr, Msey,
Путём исключения безутечных частей триггера удалось локализовать область поиска утечек до вот такого маленького участка, кто-нибудь может теперь понять что там не так, или просто написать джасс замену этого участка без утечек, хотя там и так всё на кастом скрипте. Я вообще удивляюсь, у меня такая-же проблема была в аналогичном триггере только в системе генерации мобов для карты, и там тоже никто толком не помог. Видимо гет енам юнитс нифига не безутечный, судя по хендл каунтеру. Или я не знаю как обьяснить его рост.
Внесите проблемный триггер в отдельную карту и прикрепите сообщение. Сложно разбираться по картинкам.
NazarPunk, Там же нейтрально пассивный цель отданного приказа.
Что-то недоглядел.
30

» WarCraft 3 / Когда-то уже просил найти утечки тут, и через годы... Снова...

Obelick:
Само событие утекает. Оно реагирует абсолютно на всех юнитов, которые "отдают" приказ в цель (даже если поставить условие). Для этих событий желательно устанавливать конкретного юнита, это меньшее зло.
Как событие может утекать то? Событие происходит и дёргает всех "слушателей" которые на него повешены. И чем больше "слушателей", тем хуже.
Мне вот интересно, когда нейтрально пассивный Order("smart") отдаёт?
30

» XGM Конкурсы / Конкурс ландшафтеров: Механизмы (HIVE)

Araders:
Кристофер, а если модель не в открытом доступе? Да и в правилах я ни где не вижу ограничение на модели.
Из поста на Хайве
Only publicly available resources may be used. A link must be provided if it isn't found in the Hive or WC3C database.
30

» WarCraft 3 / Новые нативные функции в 1.29

GetLocalPlayer, SetAbilityTooltip() же не устанавливает требования. Для этого к каждому заклинанию неплохо было бы поле добавить Стоимость: жизни
30

» WarCraft 3 / Новые нативные функции в 1.29

uranus, так можно ввести новый тип
set udg_IsDungeonBossKilled = CreateRequirement()
call SetRequirementName(udg_IsDungeonBossKilled,"Убить босса в подземелье")
call SetRequirementStateForPlayer(udg_IsDungeonBossKilled,Player(0),false)
call SetRequirementFotUnitTypeForPlayer(Player(0),'hfoo',udg_IsDungeonBossKilled)
30

» WarCraft 3 / Новые нативные функции в 1.29

SetAbilityTooltip()
добавили, а вот SetAbilityRequirements(),SetUnitRequirements(),SetItemRequirements() пожалели. А как удобно было бы
SetItemRequirementsForPlayer(Player(0),'ward',udg_IsDungeonBossKilled,"Убить босса в подземелье")
Вместо создания кучи даммиков ради одной красивой строчки.
А на HideUIButtonForUnit(GetTriggerUnit(),'Move') я даже не надеюсь((
30

» WarCraft 3 / Новые нативные функции в 1.29

Doc:
Кастом UI прекрасно стандартными средствами реализуется
Ага, с залоченной камерой и постоянными сбросами селекшна))
И ещё не работающий при камере смотрящей строго вверх/вниз))
Но реализовывать нативно RenderEdge близы явно не будут. Надеюсь они хоть нормальную подсветку JASS сделали, а то без JGNP на него смотреть невозможно.
30

» WarCraft 3 / Новые нативные функции в 1.29

Кастом UI прекрасно стандартными средствами реализуется
Смотрю близы начали доедать мёртвого оленя. Надеюсь они вкатят вразумительных функций, но что-то мне слабо верится. Пока что мемхак реализует бльше возможностей.
Думаю врятли дождёмся SetMouseX/Y (в координатах монитора), а уж тем более MouseHover event.
А шутан с мемхаком очень просто реализуется
30

» WarCraft 3 / Как сделать что бы за тобой бегали мобы как в жизне на арене7

Принятый ответ
Сделать их нейтрально враждебными и поставить дальность получения приказа на максимум.
При смерти юнита считать количество живых юнитов принадлежащих нейтрально враждебному. Если 0 то спавнить волну.
30

» WarCraft 3 / Как разложить всё по полочкам?

Напишите нестандартный инвентарь или используйте этот
При таком подходе, всю конфигурацию вместе с описанием можно держать в одном файле, а предметы только пустышки.