function Trig_GTrain_Actions takes nothing returns nothing local integer i=0 local integer r=0 local unit u=GetTriggerUnit() local unit t=GetTrainedUnit() local unit e local integer id=GetHandleId(t) local group g=CreateGroup() call UnitAddAbility(t,'A000') loop exitwhen i==4 set e=CreateUnit(GetOwningPlayer(GetTriggerUnit()),GetUnitTypeId(t),GetWidgetX(u),GetWidgetY(u),bj_UNIT_FACING) call GroupAddUnit(g,e) call RemoveGuardPosition(e) call UnitAddAbility(e,'A001') set i=i+1 endloop call SaveUnitHandle(hash,id,1,t) call SaveGroupHandle(hash,id,2,g) set u=null set t=null set e=null set g=null endfunction //=========================================================================== function InitTrig_GTrain takes nothing returns nothing set gg_trg_GTrain = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_GTrain, EVENT_PLAYER_UNIT_TRAIN_FINISH ) call TriggerAddAction( gg_trg_GTrain, function Trig_GTrain_Actions ) endfunction
Code
function Trig_GMove_Actions takes nothing returns nothing local integer oid = GetIssuedOrderId() local unit t = GetTriggerUnit() local integer id = GetHandleId(t) local group g = LoadGroupHandle(hash,id,2) local unit ou = GetOrderedUnit() local unit l=LoadUnitHandle(hash,id,1)
if IsUnitType(ou,UNIT_TYPE_STRUCTURE) == false and ou == l then if GetTriggerEventId() == EVENT_PLAYER_UNIT_ISSUED_ORDER then call GroupImmediateOrderById(g,id) elseif GetTriggerEventId() == EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER then call GroupPointOrderById(g,oid,GetOrderPointX(),GetOrderPointY()) elseif GetTriggerEventId() == EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER then call GroupTargetOrderById(g,oid,GetOrderTarget()) endif endif set t = null set g = null set ou = null endfunction //=========================================================================== function InitTrig_GMove takes nothing returns nothing set gg_trg_GMove = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_GMove, EVENT_PLAYER_UNIT_ISSUED_ORDER ) call TriggerRegisterAnyUnitEventBJ( gg_trg_GMove, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER ) call TriggerRegisterAnyUnitEventBJ( gg_trg_GMove, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER ) call TriggerAddAction( gg_trg_GMove, function Trig_GMove_Actions ) endfunction
Code
function Trig_GLeaderdies_Actions takes nothing returns nothing local unit t=GetTriggerUnit() local integer id=GetHandleId(t) local integer i local group g=LoadGroupHandle(hash,id,2) local unit u call GroupRemoveUnit(g,t) if t == LoadUnitHandle(hash,id,1) then call GroupRemoveUnit(g,LoadUnitHandle(hash,id,1)) set u = GroupPickRandomUnit(g) set id=GetHandleId(u) call SaveUnitHandle(hash,id,1,u) call SaveGroupHandle(hash,id,2,g) call UnitAddAbility(u,'A000') call SelectUnitAddForPlayer(u,GetOwningPlayer(u)) endif set u=null set g=null set t=null endfunction
//=========================================================================== function InitTrig_GLeaderdies takes nothing returns nothing set gg_trg_GLeaderdies = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_GLeaderdies, EVENT_PLAYER_UNIT_DEATH ) call TriggerAddAction( gg_trg_GLeaderdies, function Trig_GLeaderdies_Actions ) endfunction
Суть такова.Когда умирает Лидер отряда в триггере GLeaderDies устанавливаеться новый случайный лидер. Но когда отдаешь приказ о движении с новым лидером,то вар вылетает\\Что делать?
function Trig_GMove_Actions takes nothing returns nothing local integer oid = GetIssuedOrderId() local unit t = GetTriggerUnit() local integer id = GetHandleId(t) local group g = LoadGroupHandle(hash,id,2) local unit ou = GetOrderedUnit() local unit l=LoadUnitHandle(hash,id,1)
if IsUnitType(ou,UNIT_TYPE_STRUCTURE) == false and ou == l then if GetTriggerEventId() == EVENT_PLAYER_UNIT_ISSUED_ORDER then call GroupImmediateOrderById(g,oid) elseif GetTriggerEventId() == EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER then call GroupPointOrderById(g,oid,GetOrderPointX(),GetOrderPointY()) elseif GetTriggerEventId() == EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER then call GroupTargetOrderById(g,oid,GetOrderTarget()) endif endif set t = null set g = null set ou = null endfunction //=========================================================================== function InitTrig_GMove takes nothing returns nothing set gg_trg_GMove = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_GMove, EVENT_PLAYER_UNIT_ISSUED_ORDER ) call TriggerRegisterAnyUnitEventBJ( gg_trg_GMove, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER ) call TriggerRegisterAnyUnitEventBJ( gg_trg_GMove, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER ) call TriggerAddAction( gg_trg_GMove, function Trig_GMove_Actions ) endfunction
В IssueImmediateOrderById ты им приказываешь хендл. Ох лол... Проверяй. З.Ы.: поправил это.
На соседний сайт не заходишь, ладно, здесь напишу.
1. При отдаче приказа (в триггере GMove) происходит зацикливание (юниту отдается приказ -> активируется событие отдачи приказа -> юниту отдается приказ -> активируется событие и т. д.)
2. При тренировке юнита-лидера (в триггере GTrain) он не добавляется в группу. Однако он зачем-то удаляется из группы (в триггере GLeaderDies), причем зачем-то ДВА раза. Тем не менее, вновь выбранный лидер не удаляется из группы, из-за чего происходит пункт 1.
3. Непонятно, что за способности с равкодами 'A000' и 'A001'. Можно предположить, что первая дается лидеру, а вторая - подчиненным в группе. Тогда почему не удаляется вторая способность с вновь выбранного лидера? И почему бы не сделать проверку на наличие способностей, вместо того, чтобы записывать/читать из хеша юнита?
. При отдаче приказа (в триггере GMove) происходит зацикливание (юниту отдается приказ -> активируется событие отдачи приказа -> юниту отдается приказ -> активируется событие и т. д.)
Как испарвить?
Добавлено (06-04-2011, 15:47) --------------------------------------------- swdn, там же приказ отдаеться только членам группы
Dreii, пункт 1 - проблема, пункт 2 - причина, пункт 3 - как исправить.
Если нужно с минимумом изменений, то попробуй так:
Code
function Trig_GLeaderdies_Actions takes nothing returns nothing local unit t = GetTriggerUnit() local integer id = GetHandleId(t) //local integer i // это не нужно, так как не используется local group g = LoadGroupHandle(hash, id, 2) local unit u = null //call GroupRemoveUnit(g,t) // это не нужно if t == LoadUnitHandle(hash, id, 1) then //call GroupRemoveUnit(g,LoadUnitHandle(hash,id,1)) // это не нужно set u = GroupPickRandomUnit(g) set id = GetHandleId(u) call GroupRemoveUnit(g, u) // удаляем нового лидера из группы call SaveUnitHandle (hash, id, 1, u) call SaveGroupHandle(hash, id, 2, g) call UnitAddAbility (u, 'A000') call SelectUnitAddForPlayer(u, GetOwningPlayer(u)) endif set u = null set g = null set t = null endfunction
//=========================================================================== function InitTrig_GLeaderdies takes nothing returns nothing set gg_trg_GLeaderdies = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_GLeaderdies, EVENT_PLAYER_UNIT_DEATH ) call TriggerAddAction( gg_trg_GLeaderdies, function Trig_GLeaderdies_Actions ) endfunction
Насчет работоспособности не уверен, поэтому если не получится, сделай тестовую карту и вынеси туда всю систему отрядов. На ощупь разбираться проблематично.
Да, и лучше будет переписать код с учётом пункта 3.