30

» WarCraft 3 / На счёт утечек памяти

SNART:
ссылка
Нет, в jass не разбираюсь...
В общем сойдёт такой вариант,
так, как в нужной карте нагрузка на триггер будет примерно в 100 раз меньше, чем при тесте с 1000 юнитов.
Я просто поражаюсь, как вместо того, чтобы понять несколько строчек на JASS люди тратят кучу чужого и своего времени, чтобы сделать криво, но просто.
30

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

uranus:
Ну, почему самые элементарные вещи они не хотят добавлять? Т.е. сделать Ауру вампиризма настраиваемой как Ауру меткости они не могут, а заставить Смертельный удар не учитывать урон от предметов - пожалуйста. Может написать на хайв?
Потому что всем рулят эффективные менежеры, и хайп о патче важнее его работоспособности. ИМХО к концу года Бдиззы даже близко к функционалу мемхака не продвинутся.
uranus:
Clamp, это я понимаю, но в таком случае уже нельзя сослаться на техническую сложность реализации. Нативки вводят, на этом спасибо, но куда проще некоторые вещи позволить реализовать через РО.
А некоторые вещи совсем просто реализуются через
GetSLKcelll()
SetSLKcell()
Куда проще дать ко всему доступ из кода потенциально, и нет смысла размыливать не слишком большие рабочие ресурсы на лишнюю работу.
Тоесть о SetUnitModel() можно только мечть?
30

» WarCraft 3 / На счёт утечек памяти

Если атакующим дать способность, например - "дыхание холода", то возникает утечка, которая вроде бы исчезает, если удалить атакуемых.
Если исчезает при удалении юнитов, значит "дыхание холода" резервирует хэндлы для работы
Тормозов не заметил причем даже при отключенной функции - "set bj_wantDestroyGroup = true".
Попробуйте часто выбирать всех юнитов на карте и будут вам тормоза с утечками
Код
function Trig_handle_Func002002 takes nothing returns nothing
    call DoNothing()
endfunction

function Trig_handle_Actions takes nothing returns nothing
    call ForGroupBJ( GetUnitsInRectAll(GetPlayableMapRect()), function Trig_handle_Func002002 )
endfunction

function InitTrig_handle takes nothing returns nothing
    set gg_trg_handle = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_handle, 0.01 )
    call TriggerAddAction( gg_trg_handle, function Trig_handle_Actions )
endfunction
30

» WarCraft 3 / Карта FPS Mod

С мемхаком это реализуется очень просто.
RenderEdge мемхак
Warcraft 1.26a
Передвижение W,S,A,D. Режим курсора Q.
Загруженные файлы
30

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

NazarPunk, cjass
bool Temp(string s){
return true;
}
У zinc (Z Is Not C) тоже С-подобный синтаксис, но мне он не приглянулся изза того, что вылетает при ошибках, долго компилит и как сказано выше
Хоть он и деликатен в написании, суммарное количество времени на компиляцию и возню с ошибками затрачивается при 500+ запусках для отладки значительно больше.
по сути задача любого препроцессора и компилятора превратить красивый и удобный код в нечитаемое говно которое устраивает машину
JASS по сути сам является препроцессором для байткодов (Java Ass), которые и будут исполнятся игрой. И на это мы уже никак повлиять не можем.
хотя существуют уникумы которые могут писать медленно работающий непонятный код
Эти уникумы будут всегда и это ещё чудо, что их код может как-то исполняться не вызывая тотальный трындец всему, к чему дотягивается))
30

» WarCraft 3 / Меню заданий

    Events
        Player - Player 1 (Red) types a chat message containing test as An exact match
    Conditions
    Actions
        Set Player = (Triggering player)
		Quest - Create a Required quest titled Quest 1 - Killing q... with the description long long descripti..., using icon path ReplaceableTextures\CommandButtons\BTNAmbush.blp
        Quest - Disable (Last created quest)
        Custom script: if GetLocalPlayer() == udg_Player then
        Quest - Enable (Last created quest)
        Quest - Flash the quest dialog button
        Custom script: endif
30

» Моддинг / Какой файл отвечает за таблицу урона?

Мне нужно внести свой баланс в игру, реалестичный
Тоесть у вас будет перелом колена, отбор оружия, удар в пах и закидывание гнилыми помидорами?
30

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

Msey:
Adic Parser и Adic Optimizer
Достаточно просто отключить парсер. Оптимизация без него не будет работать.
То во что превращает код Adic сложно назвать оптимизацией, да и при сохранении карты он тормозит и частенько вылетает.
Мне вот пригдянулся zinc из-за простоты реализации и удобства отладки.
JASS
function Temp takes string s returns boolean r
..
return true
endfunction
против
zinc
function Temp (string s) -> boolean {
...
return true;
}
30

» WarCraft 3 / Триггерные порталы

Afterdeath, тут всё упирается в условия. Например если у юнита три портала - связывать 1 => 2 =>3 или 1 <=> 2 <=> 3? Или разрешено только два? Или...
30

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

но ошибку выдаёт при проверке.
Попробуйте обновить JGNP и pjass и выключить Adic Parser и Adic Optimizer в cjass
чтоб не полностью перейти на джасс
Что вы так JASS'а боитесь то? Если юзать его с препроцессорами, то с разрастанием карты не потеряешься в куче глобальных переменных и триггеров.
ScopteRectuS:
А зачем через группу проверять расстояние? Есть же функция IsUnitInRange( ).
Это наследие GUI, всё через глобалки сделано же.
JASS
function SpeakSystem_Actions takes nothing returns nothing
    local force f = GetPlayersByMapControl(GetPlayerController(GetOwningPlayer(GetOrderedUnit())))
    local location loc1 = GetUnitLoc(GetOrderTargetUnit())
    local location loc2 = GetUnitLoc(GetOrderedUnit())
    /* 851971 это id приказа smart, ненужно лишний раз конвертить из строки */
    if GetOwningPlayer(GetOrderTargetUnit()) == Player(PLAYER_NEUTRAL_PASSIVE)  and GetIssuedOrderId() == 851971 and  IsUnitInRange(GetOrderTargetUnit(),GetOrderedUnit(),500.) then
        // Если расстояние от юнита до цели меньше 500 то цель поворачивается и говорит в чат с подсветкой кружка
        call SetUnitFacingTimed( GetOrderTargetUnit(), AngleBetweenPoints(loc1, loc2), 0.30 )
        call TransmissionFromUnitWithNameBJ( f, GetOrderTargetUnit(), "", null, "", bj_TIMETYPE_SET, 1.00, true )
        call UnitAddIndicatorBJ( GetOrderTargetUnit(), 100, 100, 100, 0 )
        call DisplayTextToForce( f, udg_strings[GetRandomInt(0, udg_count)] )
    endif
    call ForceClear(f)
    call DestroyForce(f)
    set f = null
    call RemoveLocation(loc1)
    call RemoveLocation(loc2)
endfunction

function SpeakSystem takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer i = 0

    //вешаем только играющим
    loop
        exitwhen i > 12
        if GetPlayerController(Player(i)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then
            call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, null)
        endif
        set i = i + 1
    endloop
    call TriggerAddAction(t, function SpeakSystem_Actions)
    set t = null
endfunction 
30

» WarCraft 3 / Система пассивного чарджа/рывка

Int3r_Karma:
NazarPunk, что ты имеешь в виду под "пробегать мимо?"
Если отдать приказ двигаться в точку рядом с врагом, они добегают до точки даже если их атакуют, а потом вступают в бой и рывок не срабатывает.
30

» WarCraft 3 / Система пассивного чарджа/рывка

Int3r_Karma:
NazarPunk, спасибо! Действительно, нашел опечатку. Почистил, перезалил.
Если пробегать мимо не срабатывает.
Загруженные файлы
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, который вы не сможете дальше использовать?