找回密码
 点一下
查看: 629|回复: 4

弱弱地来GA请教大神关于对战原对战地图jass中的此类函数是否能简化成一个?

[复制链接]
发表于 2014-2-12 12:55:58 | 显示全部楼层 |阅读模式
本帖最后由 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要保持一一对应才不出问题?

发表于 2014-2-12 13:11:34 | 显示全部楼层
当然可以合并。。
不过你要是没完全理解就随意合并的话自然就会出逻辑问题

点评

应该没有理解上的逻辑错误。因为地图做好后直接在j文件里修改的缘故,测试时出现了玩家游戏几分钟后偶然断线(直接断线没有读秒)和游戏开始后内存出错弹出的问题,j文件主要就是修改某些区域判断是否有单位,及单位  详情 回复 发表于 2014-2-12 13:21
回复

使用道具 举报

 楼主| 发表于 2014-2-12 13:21:30 | 显示全部楼层
chyj4747 发表于 2014-2-12 13:11
当然可以合并。。
不过你要是没完全理解就随意合并的话自然就会出逻辑问题

应该没有理解上的逻辑错误。因为地图做好后直接在j文件里修改的缘故,测试时出现了玩家游戏几分钟后偶然断线(直接断线没有读秒)和游戏开始后内存出错弹出的问题,j文件主要就是修改某些区域判断是否有单位,及单位类型后,再创建单位。(创建单位有包含单位死亡事件掉落物品的触发)。所以不知道是不是这部分出的问题,正在一点一点排查。感谢龙哥的回答!
回复

使用道具 举报

发表于 2014-2-12 16:41:13 | 显示全部楼层
自己模拟野怪掉落物品
回复

使用道具 举报

发表于 2014-2-14 23:29:09 | 显示全部楼层
没必要合并……手工合并花费太高
如果会,可以自己写工具合并……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-10 14:12 , Processed in 0.266246 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表