Кто может помочь переделать триггерную способность - Автодобыча , без потери функционала..
Создает кучу точек которые не удаляются.
Создает кучу точек которые не удаляются.
Способность работает так : нажал - появился баф и юнит пошел добывать ресурсы+бить разрушаемые объекты.
Если нажать еще раз на скил автодобыча прекращается.
Если нажать еще раз на скил автодобыча прекращается.
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
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован nazarpunk
Нет мастурбации с созданием и удалением групп и ректов. Используется одна группа и рект.
Нет локалок, чтоб не париться с утечками.
Отредактирован Electr0_H0use
Ласт версия JNGP от Prometheus Edition.
Данная карта открывается только с русификатором триггеров ..)
Как я понимаю для cJass триггера может быть любое название триггера.
теперь работает, но юниты не подбирают предметы. Скил работает даже у тех юнитов которые не прописаны в условии if(uid == 'h00Y' || uid == 'h018' || uid == 'h019') , это норм. По цифрам в Handle Counter все Ок. Глянь плз еще раз чтобы юниты предметы подбирали...
Отредактирован nazarpunk