|
发表于 2011-10-15 22:40:27
|
显示全部楼层
首先。。。LZ不要多连。。。
这个在GA是有点“犯法”的。。当然没那么严重……
短时间内或LX没有人回复的话可以考虑合并楼层~
然后。。不是我吐槽。。。LZ这个J明显是T转的……
如果看着一整句代码换行很不爽的话请切换“宽版模式”,在页面的右上角那里~
[jass]
function Trig_NewTrigger_Conditions takes nothing returns boolean
return GetIssuedOrderId() == UnitId("attack") and IsUnitType(GetTriggerUnit(),UNIT_TYPE_HERO)
endfunction
function Trig_NewTrigger_Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
local integer i = GetUnitUserData(u)
local trigger trg = GetTriggeringTrigger()
if i==7 then
call AdjustPlayerStateBJ( 58,GetTriggerPlayer(), PLAYER_STATE_RESOURCE_GOLD)
call SetUnitUserData( u, 0 )
else
call SetUnitUserData( u, i+1 )
endif
call DestroyTrigger(trg)
endfunction
function TargetGetHurt takes nothing returns nothing
local trigger trg = CreateTrigger()
local unit u = GetOrderTargetUnit()
call TriggerRegisterUnitEvent( trg, u, EVENT_UNIT_DAMAGED )
call TriggerAddCondition( trg, Condtion(function Trig_NewTrigger_Actions) )
set trg = null
set u = null
endfunction
//==== Init Trigger NewTrigger ====
function InitTrig_Attack_Get_money takes player witchPlayer returns nothing
local trigger array trg
local integer n = 0
loop
exitwhen n = 13
call TriggerRegisterPlayerUnitEvent(trg[n], Player(n), EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, null)
call TriggerAddCondition(trg[n], Condition(function Trig_NewTrigger_Conditions))
call TriggerAddAction(trg[n], function TargetGetHurt)
set trg[n] = null
set n = n+1
endloop
endfunction
[/jass]
额。。上面是赶急赶出来的。。仅仅提供一个思路。。
如果用玩家单位事件的话就要看有多少玩家了,每个玩家注册一遍,为了缩短代码果断使用循环;
事件的话不要选“攻击单位”,这样就得不到攻击目标了,而且这个事件的缺点就是老远距离就可以发布,并且如果有别的命令打断攻击的话还是会触发(典型的比如S),也就是只要不停地S就可以不停地攻击,相当于非常短的时间内就能得到N多钱。。。(莫非LZ就要这个效果……);
所以我用发布命令代替,这样可以得到目标单位,然后动态创建触发注册目标受伤事件;
这样就只有当目标受到伤害后才会增加攻击次数的累积;
然后为了要所有玩家英雄可以累积以及为了方便……我改成单位的自定义值了。。不过别的地方就不能再用这个了,每个单位只有一个自定义值;
以上代码绝对不完美,比如发布别的命令打断攻击命令我没写。。
打断这么处理吧,在动态创建目标受伤触发时将触发器与单位绑定,然后若命令被打断,可以获得发布命令的单位,也就是之前攻击的单位,然后读取触发器,最后直接删除该触发器即可~ |
|