|
本帖最后由 bbcbbc 于 2014-2-12 12:58 编辑
昨天解开对战地图原版j文件中偶然发现一个问题,希望懂jass的大神帮帮看看。
打开j文件看到一个应该是创建中立敌对单位,杀死后掉落宝物的触发及函数。发现基本上函数内容都一样但函数名不同。是否能手动简化成一个函数。野怪杀死后掉落物品触发都触发一个函数呢?会不会出问题?
函数截取如下:多为Unit0000XXX_DropItems 的格式。
============================================================
function Unit000060_DropItems takes nothing returns nothing
local widget trigWidget=null
local unit trigUnit=null
local integer itemID=0
local boolean canDrop=true
set trigWidget=bj_lastDyingWidget
if(trigWidget==null)then
set trigUnit=GetTriggerUnit()
endif
if(trigUnit !=null)then
set canDrop=not IsUnitHidden(trigUnit)
if(canDrop and GetChangingUnit()!=null)then
set canDrop=(GetChangingUnitPrevOwner()==Player(PLAYER_NEUTRAL_AGGRESSIVE))
endif
endif
if(canDrop)then
call RandomDistReset()
call RandomDistAddItem(ChooseRandomItemEx(ITEM_TYPE_POWERUP,1),100)
set itemID=RandomDistChoose()
if(trigUnit !=null)then
call UnitDropItem(trigUnit,itemID)
else
call WidgetDropItem(trigWidget,itemID)
endif
endif
set bj_lastDyingWidget=null
call DestroyTrigger(GetTriggeringTrigger())
endfunction
function Unit000062_DropItems takes nothing returns nothing
local widget trigWidget=null
local unit trigUnit=null
local integer itemID=0
local boolean canDrop=true
set trigWidget=bj_lastDyingWidget
if(trigWidget==null)then
set trigUnit=GetTriggerUnit()
endif
if(trigUnit !=null)then
set canDrop=not IsUnitHidden(trigUnit)
if(canDrop and GetChangingUnit()!=null)then
set canDrop=(GetChangingUnitPrevOwner()==Player(PLAYER_NEUTRAL_AGGRESSIVE))
endif
endif
if(canDrop)then
call RandomDistReset()
call RandomDistAddItem(ChooseRandomItemEx(ITEM_TYPE_POWERUP,2),100)
set itemID=RandomDistChoose()
if(trigUnit !=null)then
call UnitDropItem(trigUnit,itemID)
else
call WidgetDropItem(trigWidget,itemID)
endif
endif
set bj_lastDyingWidget=null
call DestroyTrigger(GetTriggeringTrigger())
endfunction
function Unit000065_DropItems takes nothing returns nothing
local widget trigWidget=null
local unit trigUnit=null
local integer itemID=0
local boolean canDrop=true
set trigWidget=bj_lastDyingWidget
if(trigWidget==null)then
set trigUnit=GetTriggerUnit()
endif
if(trigUnit !=null)then
set canDrop=not IsUnitHidden(trigUnit)
if(canDrop and GetChangingUnit()!=null)then
set canDrop=(GetChangingUnitPrevOwner()==Player(PLAYER_NEUTRAL_AGGRESSIVE))
endif
endif
if(canDrop)then
call RandomDistReset()
call RandomDistAddItem(ChooseRandomItemEx(ITEM_TYPE_POWERUP,2),100)
set itemID=RandomDistChoose()
if(trigUnit !=null)then
call UnitDropItem(trigUnit,itemID)
else
call WidgetDropItem(trigWidget,itemID)
endif
endif
set bj_lastDyingWidget=null
call DestroyTrigger(GetTriggeringTrigger())
endfunction
==========================================================
===========================================================
function CreateNeutralHostile takes nothing returns nothing
local player p=Player(PLAYER_NEUTRAL_AGGRESSIVE)
local unit u
local integer unitID
local trigger t
local real life
set u=CreateUnit(p,'ngst',-722.2,6573.3,309.280)
call SetUnitState(u,UNIT_STATE_MANA,0)
set t=CreateTrigger()
call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_DEATH)
call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_CHANGE_OWNER)
call TriggerAddAction(t,function Unit000065_DropItems)
set u=CreateUnit(p,'nfsh',5597.5,3732.6,196.170)
call SetUnitAcquireRange(u,200.0)
set t=CreateTrigger()
call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_DEATH)
call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_CHANGE_OWNER)
call TriggerAddAction(t,function Unit000062_DropItems)
.............
..........
.........
=======================================等=====
掉落的物品都是力量提升类的。只是有1级和2级的区别。也有很多重复,我只截取了一部分。
而下面创建中立生物及被杀死掉落宝物的函数中就有触发到上面的函数。如果都掉落同一级别的随机物品,能否用都触发一个 Unit000062_DropItems 函数?而其他掉落物品如果都掉落这种物品的都触发都修改后一一指向Unit000062_DropItems 函数,其他的(如:上面的Unit000065_DropItems)都删除,是否这样手动简化?还是原生态的jass要保持一一对应才不出问题?
|
|