Одну не знаю как удалить, а вторую не могу найти, подробности на скрине.

Принятый ответ

Alexey103, посмотрел карту которую ты скинул
отключая по строчке выяснил что утечка возникает при установке переменной playergroup
т.е. утекает группа игроков
это происходит из за не обнулённой переменной в бж функции
чтобы исправить надо не использовать эту бж функцию
желательно перейти на джасс
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
12
6 лет назад
0
biridius:
код этой гуишной функции которая поворачивает юнита к точке (отключенная на скрине под коментом "тут утечка как удалить")
как видно на скрине не обнуляется локалка
как исправить - заменить на установку угла поворота равным углу между точками вместо этой функции
как всегда не редактируются вложения ну почините уже плиз
Еще надо не забыть удалить оба эти Position of (unit), т.к. они тоже точки создают. На ГУИ проще всего будет сперва записать их в переменные типа Temp_Loc1, Temp_Loc2, произвести действия триггера, а затем их удалить.
0
17
6 лет назад
0
Sergarr, Это очевидно, и не нужно создавать переменных, они у меня уже там созданы
NazarPunk, Там же нейтрально пассивный цель отданного приказа.
2
29
6 лет назад
Отредактирован Msey
2
впервые такое слышу..
    private function init takes nothing returns nothing
     local trigger t=CreateTrigger()
        call TriggerAddCondition(t, Condition( function spellIdMatch) )
        call TriggerAddAction(t,    function onSpellCast)
        call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_CAST )

     set t=null
    endfunction
Возможно он имел ввиду триггер, который висит в памяти, после регистрации событий и условий с действиями соответственно. Код выше его обнуляет, чего в гуи нет.
0
17
6 лет назад
0
Obelick, Ты не прав, я проверил заменив детектор расстояния между юнитами сообщением в чат, события и условия не утекают.
biridius, NazarPunk, Obelick, ScopteRectuS, Sergarr, Msey,
Путём исключения безутечных частей триггера удалось локализовать область поиска утечек до вот такого маленького участка, кто-нибудь может теперь понять что там не так, или просто написать джасс замену этого участка без утечек, хотя там и так всё на кастом скрипте. Я вообще удивляюсь, у меня такая-же проблема была в аналогичном триггере только в системе генерации мобов для карты, и там тоже никто толком не помог. Видимо гет енам юнитс нифига не безутечный, судя по хендл каунтеру. Или я не знаю как обьяснить его рост.
Загруженные файлы
2
29
6 лет назад
2
Alexey103:
Obelick, Ты не прав, я проверил заменив детектор расстояния между юнитами сообщением в чат, события и условия не утекают.
biridius, NazarPunk, Obelick, ScopteRectuS, Sergarr, Msey,
Путём исключения безутечных частей триггера удалось локализовать область поиска утечек до вот такого маленького участка, кто-нибудь может теперь понять что там не так, или просто написать джасс замену этого участка без утечек, хотя там и так всё на кастом скрипте. Я вообще удивляюсь, у меня такая-же проблема была в аналогичном триггере только в системе генерации мобов для карты, и там тоже никто толком не помог. Видимо гет енам юнитс нифига не безутечный, судя по хендл каунтеру. Или я не знаю как обьяснить его рост.
Внесите проблемный триггер в отдельную карту и прикрепите сообщение. Сложно разбираться по картинкам.
NazarPunk, Там же нейтрально пассивный цель отданного приказа.
Что-то недоглядел.
0
21
6 лет назад
Отредактирован scopterectus
0
Msey, эту локальную переменную можно не обнулять, она ссылается на статичный триггер, который будет висеть в памяти до конца игры. Другое дело, если бы это был динамичный триггер...
0
29
6 лет назад
0
ScopteRectuS:
Msey, эту локальную переменную можно не обнулять, она ссылается на статичный триггер, который будет висеть в памяти до конца игры. Другое дело, если бы это был динамичный триггер...
И зачем вам лишний handle, который вы не сможете дальше использовать?
0
21
6 лет назад
0
NazarPunk, ну так set t = null не освободит handle. Handle освободится, когда объект будет удалён и всё ссылки на него стёрты. А так как триггер статичный, он будет висеть в памяти до конца игры.
0
28
6 лет назад
Отредактирован nvc123
0
Alexey103, в редакторе триггеров вверху нажми правка --> конвертировать в текст
твой триггер преобразуется в джасс код
кинь этот код сюда
так же не забудь использовать форматирование код при вставке кода в комментарий
2
29
6 лет назад
2
Вот, набросал библиотеку. Под себя заточить несложно
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
Загруженные файлы
0
17
6 лет назад
0
Загруженные файлы
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.