Почему при частом использовании этого скилла xgm.guru/files/100/297223/Multi_Shot_Spell_v0.2.w3x со временем начинает сильно падать фпс. Заметил проблему в Loop триггере исправить не получается.
Еще сильнее эта проблема заметна в моей карте во время нескольких тестов из за это триггера сильно падает фпс.

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

jasonrus96, да уж, гуишный код отличается ужасающим исполнением. Все таки его комп делает.
Но тем не менее, нужно в конце удалить группу Arrow Group, а вот точка утекает без следов, поэтому точку нужно записать в глобальную переменную. Точку, которая Position of Arrow[Arrow integer], а в конце удалить её. Через destroy group и remove location, соответственно. И с припиской udg_название_название.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
29
1 год назад
0
на jass пока сильно не заглядываюсь сложные системки пока не даются.
Что в этом сложного?
Загруженные файлы
0
8
1 год назад
0
function Trig_qwr_Func001C takes nothing returns boolean
    if ( ( UnitHasItemOfTypeBJ(udg_MainHero[GetConvertedPlayerId(Player(0))], 'I00K') == true ) ) then
        return true
    endif
    if ( ( UnitHasItemOfTypeBJ(udg_MainHero[GetConvertedPlayerId(Player(1))], 'I00K') == true ) ) then
        return true
    endif
    if ( ( UnitHasItemOfTypeBJ(udg_MainHero[GetConvertedPlayerId(Player(2))], 'I00K') == true ) ) then
        return true
    endif
    if ( ( UnitHasItemOfTypeBJ(udg_MainHero[GetConvertedPlayerId(Player(3))], 'I00K') == true ) ) then
        return true
    endif
    return false
endfunction

function Trig_qwr_Conditions takes nothing returns boolean
    if ( not Trig_qwr_Func001C() ) then
        return false
    endif
    return true
endfunction

function Trig_qwr_Func002Func001Func001Func004001001003001 takes nothing returns boolean
    return ( IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(udg_Arrow[udg_Arrow_Integer])) == true )
endfunction

function Trig_qwr_Func002Func001Func001Func004001001003002001 takes nothing returns boolean
    return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false )
endfunction

function Trig_qwr_Func002Func001Func001Func004001001003002002001 takes nothing returns boolean
    return ( IsUnitAliveBJ(GetFilterUnit()) == true )
endfunction

function Trig_qwr_Func002Func001Func001Func004001001003002002002 takes nothing returns boolean
    return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING) == false )
endfunction

function Trig_qwr_Func002Func001Func001Func004001001003002002 takes nothing returns boolean
    return GetBooleanAnd( Trig_qwr_Func002Func001Func001Func004001001003002002001(), Trig_qwr_Func002Func001Func001Func004001001003002002002() )
endfunction

function Trig_qwr_Func002Func001Func001Func004001001003002 takes nothing returns boolean
    return GetBooleanAnd( Trig_qwr_Func002Func001Func001Func004001001003002001(), Trig_qwr_Func002Func001Func001Func004001001003002002() )
endfunction

function Trig_qwr_Func002Func001Func001Func004001001003 takes nothing returns boolean
    return GetBooleanAnd( Trig_qwr_Func002Func001Func001Func004001001003001(), Trig_qwr_Func002Func001Func001Func004001001003002() )
endfunction

function Trig_qwr_Func002Func001Func001C takes nothing returns boolean
    if ( not ( CountUnitsInGroup(GetUnitsInRangeOfLocMatching(50.00, GetUnitLoc(udg_Arrow[udg_Arrow_Integer]), Condition(function Trig_qwr_Func002Func001Func001Func004001001003))) > 0 ) ) then
        return false
    endif
    return true
endfunction

function Trig_qwr_Func002Func001C takes nothing returns boolean
    if ( not ( IsUnitInGroup(udg_Arrow[udg_Arrow_Integer], udg_Arrow_Group) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_qwr_Func004A takes nothing returns nothing
    call SetUnitPathing( GetEnumUnit(), false )
    call SetUnitPositionLoc( GetEnumUnit(), PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), I2R(udg_Speed), GetUnitFacing(GetEnumUnit())) )
endfunction

function Trig_qwr_Actions takes nothing returns nothing
    set udg_Arrow_Integer = 1
    loop
        exitwhen udg_Arrow_Integer > udg_AI
        if ( Trig_qwr_Func002Func001C() ) then
            if ( Trig_qwr_Func002Func001Func001C() ) then
                // Kill Arrow
                call KillUnit( udg_Arrow[udg_Arrow_Integer] )
                call EnableTrigger( gg_trg_Arrow_DiesSpas1 )
            else
            endif
        else
        endif
        set udg_Arrow_Integer = udg_Arrow_Integer + 1
    endloop
    // Move Unit
    call ForGroupBJ( udg_Arrow_Group, function Trig_qwr_Func004A )
endfunction

//===========================================================================
function InitTrig_qwr takes nothing returns nothing
    set gg_trg_qwr = CreateTrigger(  )
    call DisableTrigger( gg_trg_qwr )
    call TriggerRegisterTimerEventPeriodic( gg_trg_qwr, 0.02 )
    call TriggerAddCondition( gg_trg_qwr, Condition( function Trig_qwr_Conditions ) )
    call TriggerAddAction( gg_trg_qwr, function Trig_qwr_Actions )
endfunction


nazarpunk, глаза на лоб лезут
0
18
1 год назад
Отредактирован EugeAl
0
jasonrus96, да уж, гуишный код отличается ужасающим исполнением. Все таки его комп делает.
Но тем не менее, нужно в конце удалить группу Arrow Group, а вот точка утекает без следов, поэтому точку нужно записать в глобальную переменную. Точку, которая Position of Arrow[Arrow integer], а в конце удалить её. Через destroy group и remove location, соответственно. И с припиской udg_название_название.
Принятый ответ
0
29
1 год назад
Отредактирован nazarpunk
0
глаза на лоб лезут
Переписал на маке, так что хз, скомпилится ли. Но по идее должно работать.
native UnitAlive takes unit u returns boolean
//! zinc
    library MyMissileSpell {
        group g = CreateGroup();
        real x, y;
        unit ua, uf;
        integer count = 0;

        function onInit() {
            TimerStart(CreateTimer(), .025, true, function() {
                local integer i = 1;
                while (1 <= udg_AI) {
                    ua = udg_Arrow[i];
                    if (IsUnitInGroup(ua, udg_Arrow_Group)) {
                        x = GetUnitX(ua);
                        y = GetUnitY(ua);
                        count = 0;
                        GroupEnumUnitsInRange(g, x, y, 50.00, Condition(function() {
                            uf = GetFilterUnit();
                            if (!UnitAlive(uf)) {
                                return false;
                            }
                            if (!IsUnitEnemy(uf, GetOwningPlayer(ua))) {
                                return false;
                            }
                            if (!IsUnitType(uf, UNIT_TYPE_STRUCTURE)) {
                                return false;
                            }
                            if (!IsUnitType(uf, UNIT_TYPE_FLYING)) {
                                return false;
                            }
                            count += 1;
                        }));

                        if (count > 0) {
                            KillUnit(ua);
                            EnableTrigger( gg_trg_Arrow_DiesSpas1 );
                        }
                    }
                    i += 1;
                }

                ForGroup(udg_Arrow_Group, function() {
                    real a;
                    ua = GetEnumUnit();
                    a = GetUnitFacing(ua) * bj_DEGTORAD;
                    SetUnitPathing(ua, false);
                    SetUnitX(ua, GetUnitX(ua) + udg_Speed * Cos(a));
                    SetUnitY(ua, GetUnitY(ua) + udg_Speed * Sin(a));
                });

            });
        }
    }
//! endzinc
0
18
1 год назад
0
nazarpunk, Не скомпилится из за intefer, плюс куда автор поста будет это вставлять? если про точку и группу пришлось столько объяснять, что уж говорить про zinc?
1
29
1 год назад
1
плюс куда автор поста будет это вставлять?
Прям туда же, откуда он взял исходный код триггера.
0
29
1 год назад
0
что уж говорить про zinc?
А что про него говорить то? Им пользоваться нужно.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.