Кто может помочь переделать триггерную способность - Автодобыча , без потери функционала..
Создает кучу точек которые не удаляются.
Способность работает так : нажал - появился баф и юнит пошел добывать ресурсы+бить разрушаемые объекты.
Если нажать еще раз на скил автодобыча прекращается.
function Trig_SahterRudokop_Func001Func001Func002Func002Func002Func001Func002C takes nothing returns boolean
	if(not(GetItemTypeId(udg_item01)=='I000' or GetItemTypeId(udg_item01)=='I002'))then  //  Только 2 предмета не ITEM_TYPE_POWERUP
		return false
	endif
	if(not((UnitInventorySizeBJ(udg_unit01)-UnitInventoryCount(udg_unit01))>0))then
		return false
	endif
	return true
endfunction

function Trig_SahterRudokop_Func001Func001Func002Func002Func002Func001C takes nothing returns boolean
	if((GetItemType(udg_item01)==ITEM_TYPE_POWERUP))then
		return true
	endif
	if(Trig_SahterRudokop_Func001Func001Func002Func002Func002Func001Func002C())then
		return true
	endif
	return false
endfunction

function Trig_SahterRudokop_Func001Func001Func002Func002Func002C takes nothing returns boolean
	if(not Trig_SahterRudokop_Func001Func001Func002Func002Func002Func001C())then
		return false
	endif
	return true
endfunction

function Trig_SahterRudokop_Func001Func001Func002Func002A takes nothing returns nothing
	set udg_item01=GetEnumItem()
	if(Trig_SahterRudokop_Func001Func001Func002Func002Func002C())then
		call IssueTargetItemOrder(udg_unit01,"smart",udg_item01)
		set udg_integer01=2
	endif
endfunction


function Trig_SahterRudokop_Func001Func001Func002Func003Func002A takes nothing returns nothing
	set udg_destructable01=GetEnumDestructable() // udg_destructable01 - все нужные разрушаемые объекты
	if(GetDestructableTypeId(udg_destructable01)!='B003' and IsDestructableAliveBJ(udg_destructable01)==true)then  //  Ненужный объект
		if(DistanceBetweenPoints(GetDestructableLoc(udg_destructable01),GetUnitLoc(udg_unit01))<DistanceBetweenPoints(GetDestructableLoc(udg_destructable03),GetUnitLoc(udg_unit01)))then
			set udg_integer01=1
			set udg_destructable03=udg_destructable01
		endif
	endif
endfunction


function Trig_SahterRudokop_Func001Func001Func002C takes nothing returns boolean
	if(not(UnitHasBuffBJ(udg_unit01,'BUF1')==true or UnitHasBuffBJ(udg_unit01,'BUF2') or UnitHasBuffBJ(udg_unit01,'BUF3')))then // Баф на юните при вкл.скила
		return false
	endif
	if(not(OrderId2StringBJ(GetUnitCurrentOrder(udg_unit01))==""))then
		return false
	endif
	return true
endfunction

function Trig_SahterRudokop_Func001Func001A takes nothing returns nothing
	set udg_unit01=GetEnumUnit()
	if(Trig_SahterRudokop_Func001Func001Func002C())then
		set udg_integer01=0
		if((GetUnitTypeId(udg_unit01)=='UNT1' or GetUnitTypeId(udg_unit01)=='UNT2' or GetUnitTypeId(udg_unit01)=='UNT3'))then  //  около 20 юнитов
		call EnumItemsInRectBJ(RectFromCenterSizeBJ(GetUnitLoc(udg_unit01),600.00,600.00),function Trig_SahterRudokop_Func001Func001Func002Func002A)
		endif
		if(udg_integer01==0)then
			call EnumDestructablesInCircleBJ(700.00,GetUnitLoc(udg_unit01),function Trig_SahterRudokop_Func001Func001Func002Func003Func002A)
		endif
		if(udg_integer01==0)then
			call IssuePointOrderLocBJ(udg_unit01,"move",GetRandomLocInRect(RectFromCenterSizeBJ(GetUnitLoc(udg_unit01),600.00,600.00)))
		endif
		if(udg_integer01==1)then
			if(DistanceBetweenPoints(GetDestructableLoc(udg_destructable03),GetUnitLoc(udg_unit01))<250.00)then
				call IssueTargetDestructableOrder(udg_unit01,"attack",udg_destructable03)
			else
				call IssuePointOrderLocBJ(udg_unit01,"move",GetDestructableLoc(udg_destructable03))
			endif
		endif
	endif
endfunction

function Trig_SahterRudokop_Actions takes nothing returns nothing  //  Автодобыча для всех игроков ( скилл только у некоторых юнитов )
	set bj_forLoopAIndex=1
	loop
		exitwhen bj_forLoopAIndex>11
		call ForGroupBJ(GetUnitsOfPlayerAll(ConvertedPlayer(bj_forLoopAIndex)),function Trig_SahterRudokop_Func001Func001A)
		set bj_forLoopAIndex=bj_forLoopAIndex+1
	endloop
endfunction
//===========================================================================
function InitTrig_SahterRudokop takes nothing returns nothing
    set gg_trg_SahterRudokop = CreateTrigger(  )
	call TriggerRegisterTimerEventPeriodic(gg_trg_SahterRudokop,0.50)
    call TriggerAddAction( gg_trg_SahterRudokop, function Trig_SahterRudokop_Actions )
endfunction

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

Вот, держи. Правда не тестил ибо писал на маке.
Нет мастурбации с созданием и удалением групп и ректов. Используется одна группа и рект.
Нет локалок, чтоб не париться с утечками.
Правда может не скомпилиться, но это уже дело третье.
native UnitAlive takes unit u returns boolean
//! zinc
    library MinerMiner {
        group g = CreateGroup();
        unit u;
        integer uid, action, itid, did;
        rect r = Rect(0, 0, 0, 0);
        real ux, uy, dx, dy;
        item it;
        destructable d, dt;

        function distance(destructable d, unit u) -> real {
            real dx = GetUnitX(u) - GetDestructableX(d);
            real dy = GetUnitY(u) - GetDestructableY(d);
            return dx * dx + dy * dy;
        }

        function onInit() {
            trigger t = CreateTrigger();
            TriggerRegisterTimerEventPeriodic(t, .5);
            TriggerAddAction( t, function() {
                integer i = 0;
                for (0 <= i < bj_MAX_PLAYER_SLOTS) {
                    GroupEnumUnitsOfPlayer(g, Player(i), null);
                    ForGroup(g, function() {
                        u = GetEnumUnit();
                        uid = GetUnitTypeId(u);
                        ux = GetUnitX(u);
                        uy = GetUnitY(u);
                        if (!UnitAlive(u)) {
                            return;
                        }
                        // Баф на юните при вкл.скила
                        if (GetUnitAbilityLevel(u, 'BUF1') == 0 && GetUnitAbilityLevel(u, 'BUF2') == 0 && GetUnitAbilityLevel(u, 'BUF3') == 0) {
                            return;
                        }
                        if (GetUnitCurrentOrder(u) != 0) {
                            return;
                        }
                        action = 0;

                        //  около 20 юнитов
                        if(uid == 'UNT1' || uid == 'UNT2' || uid == 'UNT3') {
                            SetRect(r, ux - 300, uy - 300, ux + 300, uy + 300);
                            EnumItemsInRect(r, null, function() {
                                it = GetEnumItem();
                                itid = GetItemTypeId(it);
                                //  Только 2 предмета не ITEM_TYPE_POWERUP
                                if (GetItemType(it) != ITEM_TYPE_POWERUP && itid != 'I000' && itid != 'I002') {
                                    return;
                                }
                                if(UnitInventorySize(u) - UnitInventoryCount(u) <= 0) {
                                    return;
                                }
                                IssueTargetOrder(u, "smart", it);
                                action = 2;                            
                            });
                        }

                        if (action == 0) {
                            SetRect(r, ux - 700, uy - 700, ux + 700, uy + 700);
                            dt = null;
                            EnumDestructablesInRect(r, null, function() {
                                d = GetEnumDestructable();
                                did = GetDestructableTypeId(d);
                                dx = GetDestructableX(d);
                                dy = GetDestructableY(d);

                                //  Ненужный объект
                                if (GetDestructableLife(d) <= 0 && did != 'B003') {
                                    return;
                                }

                                if (dt == null || distance(d, u) < distance(dt, u)) {
                                    action = 1;
                                    dt = d;
                                }
                            });
                        }

                        if (action == 0) {
                            IssuePointOrder(u, "move", GetRandomReal(ux - 300, ux + 300), GetRandomReal(uy - 300, uy + 300));
                        }

                        if (action == 1) {
                            if (distance(dt, u) < 62500) {
                                IssueTargetOrder( u, "attack", dt);
                            } else {
                                IssuePointOrder(u, "move", GetDestructableX(dt), GetDestructableY(dt));
                            }
                        }
                    });
                }
            });
            t = null;
        }
    }
//! endzinc
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
1
1 год назад
Отредактирован Electr0_H0use
0
rsfghd: да, там есть еще триггеры которые создают утечки но автодобыча - это основная утечка. Я засекал по Handle Counter и он дает прирост по цифрам только спустя 2минуты игры по немногу даже если ничего не делать(с старым триггером автодобычи или без него), а если включить с триггером как ты сделал он дает небольшой прирост постоянно после запуска карты даже если не юзать скил. Но если юзать новый триггер с большим количеством юнитов с автодобычей то утечек во много раз меньше...
nazarpunk , Спасибо, но не смог затестить, пишет ошибку при сохранении - Syntax Error (Unexpected: "or"? и подсвечивает if(uid == 'h00Y' or uid == 'h018' or uid == 'h019') { - юниты с автодобычей
По редактору:
Ласт версия JNGP от Prometheus Edition.
Данная карта открывается только с русификатором триггеров ..)
Как я понимаю для cJass триггера может быть любое название триггера.
Загруженные файлы
1
29
1 год назад
1
Спасибо, но не смог затестить, пишет ошибку при сохранении
Исправил ошибки компиляции, только вот логику я не понял, так что исправил на глаз.
Данная карта открывается только с русификатором триггеров ..)
Грусть тоска.
Как я понимаю для cJass триггера может быть любое название триггера.
Сижасс отстой, выключай его по возможности.
0
27
1 год назад
0
Да, у него на скрине JNGPшная Load Template.
А, упс))
0
1
1 год назад
0
nazarpunk,
теперь работает, но юниты не подбирают предметы. Скил работает даже у тех юнитов которые не прописаны в условии if(uid == 'h00Y' || uid == 'h018' || uid == 'h019') , это норм. По цифрам в Handle Counter все Ок. Глянь плз еще раз чтобы юниты предметы подбирали...
1
29
1 год назад
Отредактирован nazarpunk
1
Глянь плз еще раз чтобы юниты предметы подбирали...
Это гадание на кофейной гуще, поправил код на глаз. И проверь равкоды в этой строчке:
if (GetItemType(it) != ITEM_TYPE_POWERUP && itid != 'I000' && itid != 'I002') {
 return;
}
0
1
1 год назад
0
Глянь плз еще раз чтобы юниты предметы подбирали...
Это гадание на кофейной гуще, поправил код на глаз. И проверь равкоды в этой строчке:
if (GetItemType(it) != ITEM_TYPE_POWERUP && itid != 'I000' && itid != 'I002') {
 return;
}
Теперь все работает ! Равкоды проверял. Большое спасибо !
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.