|
中立敌对在被攻击的时候周围单位会一拥而上,要解决这个
通过游戏平衡常数的“战斗——救援范围”可以更改,但前提是只能改玩家或者无人控制的单位。而“战斗——救援范围(中立)”则几乎为无效项,原因在于“中立敌对”是有AI控制的。无论是怎么样改,或者让他游戏胜利失败等T出游戏等,都不能摆脱AI的控制。
所以用模拟来解决。
魔兽有0-15个玩家,这里提供一种方法用player(14)也就是中立特殊来代替 野怪。
*“中立特殊” 除了“中立无敌意”以外,所有玩家与其互相为敌,这个也可以之后在更改。
*好在这个玩家初始给予奖励打开 遵守 游戏平衡常数里的 战斗——救援范围(中立) 因此这个可以用了 还有警戒范围、警戒返回时间,但不遵守 警戒返回距离
*还有关键的一点就是 它到夜间是不会自动睡眠的,就跟我现在5点也没睡一样。而动作设置单位夜晚睡眠 玩家也只能是 中立敌对的player(12)才有效。于是就要添加一个 早6点 晚6点的触发来控制它的睡眠状态。
[jass]
function Sleep takes nothing returns nothing
call UnitRemoveAbility(GetEnumUnit(), 'Asla')
call UnitAddAbility( GetEnumUnit(), 'Asla' )
call UnitAddSleepPerm( GetEnumUnit(), GetFloatGameState(GAME_STATE_TIME_OF_DAY)>18.or GetFloatGameState(GAME_STATE_TIME_OF_DAY)<6.)
endfunction
function FilterLive takes nothing returns boolean
return GetWidgetLife(GetFilterUnit())>0. and UnitCanSleep(GetFilterUnit())
endfunction
function TimeofDay takes nothing returns nothing
local group g=CreateGroup()
local boolexpr b=Condition(function FilterLive)
call GroupEnumUnitsOfPlayer(g, Player(14), b)
call ForGroup(g,function Sleep)
call DestroyBoolExpr(b)
call DestroyGroup(g)
set g=null
set b=null
endfunction
//===========================================================================
function InitTrig_Sleep takes nothing returns nothing
local trigger t=CreateTrigger()
call TriggerRegisterGameStateEvent(t, GAME_STATE_TIME_OF_DAY, GREATER_THAN_OR_EQUAL, 6.01)
call TriggerRegisterGameStateEvent(t, GAME_STATE_TIME_OF_DAY, GREATER_THAN_OR_EQUAL,18.01)
call TriggerAddAction(t,function TimeofDay)
set t=null
endfunction
[/jass]
加了UnitCanSleep函数,因此像傀儡之类的单位夜晚也是清醒的。
而用这个方法就可以让非中立敌对的单位夜晚睡眠,当然要在物编提前设置睡眠允许
当然 中立单位重新刷怪后 也要加上UnitAddSleepPerm(bj_lastCreatedUnit, GetFloatGameState(GAME_STATE_TIME_OF_DAY)>18.or GetFloatGameState(GAME_STATE_TIME_OF_DAY)<6.)让他判断是否入睡
这种模拟方法自然醒,到点儿睡,被打返回后也继续睡,跟用中立敌对一样。
上图,里面附带简单的野怪复活系统
CreepCallForHelp.w3x
(16 KB, 下载次数: 47)
|
评分
-
查看全部评分
|