请问魔兽3如何使用触发器为什么可以记忆编辑电脑英雄单位AI学习和使用我添加的技能啊?

导读:为了控制AI我们使用了一个定时器(timer).我写了一个函数StartAI来获,这是演示地图中的空的AILoop函数和StartAI函数(这里给的只是一个框架,命令他移动到地图中心的生命泉水,然后命令英雄巡逻到地图的一个随机坐标,localstringh//Createalocalstringvariable//Paladin//Herewe’llinitialisethePaladin’s
local string h // Create a local string variable // Paladin // Here we’ll initialise the Paladin’s skills, repeat this for all other heroes
set h = UnitId2String('Hpal') // Store the returned value of UnitId2String(‘Hpal’) in the local
call StoreInteger(udg_GameCache, h, \'AHhb') // One of his base skills is Holy Light, store it as “BaseSkill1”
call StoreInteger(udg_GameCache, h, \Shield as “BaseSkill2”
call StoreInteger(udg_GameCache, h, \Aura as “BaseSkill3”
call StoreInteger(udg_GameCache, h, \'AHre') // Store Resurrection as his “UltimateSkill” ? // Repeat for each Hero. endfunction
接着是我的AI触发器的InitTrig部分: function InitTrig_AI takes nothing returns nothing
local integer i = 0
set gg_trg_AI = CreateTrigger(
exitwhen i > 11
call TriggerRegisterPlayerEventLeave( gg_trg_AI, Player(i) )
set i = i + 1
call TriggerAddAction( gg_trg_AI, function PlayerLeaves )
call ExecuteFunc(\endfunction
为英雄开启AI系统 为了控制AI我们使用了一个定时器(timer).我写了一个函数StartAI来获取一个单位的类型:英雄(请在演示地图中查看这个函数)。这个函数只是创建一个定时器,并且\绑定\在这个英雄身上,并且开启这个定时器。
这是演示地图中的空的AILoop函数和StartAI函数(这里给的只是一个框架,等下我们将展示一些动作函数,但是你起码必须先把function和endfunction写上去以保证WE不报错) :
function AILoop takes nothing returns nothing endfunction
function StartAI takes unit hero returns nothing
local timer m = CreateTimer()
call AttachObject(m, \
call TimerStart(m, 0, false, function AILoop)
set m = null endfunction
注意,我的这个StartAI函数通过将periodic参数设置为false来达到使定时器只执行一次的目的(以后我们还会来讨论它的).
现在,你就可以在你的英雄选择系统中当由电脑控制的玩家选择英雄时调用这个函数,并且在玩家离开游戏的时候执行这个函数。检测玩家是否拥有一个英雄,如果它拥有,调用这个函数来开启那个英雄的AI系统。例如:
function PlayerLeaves takes nothing returns nothing
local player p = GetTriggerPlayer()
call DisplayTextToForce(bj_FORCE_ALL_PLAYERS, GetPlayerName(p)+\has left the game.\
if udg_Hero[GetPlayerId(p)] != null then
call StartAI(udg_Hero[GetPlayerId(p)])
set p = null endfunction
注意:这个函数将使AI系统控制离开的玩家的英雄,但是这也不是必要的,你也可以做别的事情。
使这个AI做些什么
当定时器终止的时候我们希望它做了这些事情:
●如果英雄死亡,等待他复活。
●如果英雄将要死亡,命令他移动到地图中心的生命泉水。
●如果英雄状态良好,检测是否有敌人在附近。如果有,则命令英雄攻击它。
否则就检测是否有物品在附近,如果有的话,发送一个巧妙
的命令让英雄拣起它。然后命令英雄巡逻到地图的一个随机坐标。
●如果英雄是活着的而且有未使用的技能点,学习一个技能。
我们由变量的声明开始。注意在我函数里面的实变量\,它定义了在定时器再次启动前所经过的时间,这样我们就可以在英雄死亡的时候等待短一点的时间,而在他攻击的时候等待长一点的时间。这个变量初始化值为5。
局部变量的声明: function AILoop takes nothing returns nothing
local string a = GetAttachmentTable(GetExpiredTimer())
local unit h = GetTableUnit(a, \
local rect i
local location r
local real x = GetUnitX(h)
local real y = GetUnitY(h)
local group g
local boolexpr b
local boolexpr be
local unit f
local string o = OrderId2String(GetUnitCurrentOrder(h))
local real l = GetUnitState(h, UNIT_STATE_LIFE)
local real e = 5 ?
我们由检测英雄是否死亡开始,如果他死亡了,设置\为1.5(因为在复活以后等待5秒的时间太长了,我们并不想这样).
当英雄的生命值\为0时,设置\为1.5来使定时器更加频繁的检测英雄是否复活. ?
if l <= 0 then
set e = 1.5
接着我检测英雄的生命是否低于最大生命值的20%.如果是的,命令英雄移动到生命泉并且设置\为3. 当英雄的生命值少于最大生命值的20%时,命令英雄移动到生命泉的位置。 ?
if l < GetUnitState(h, UNIT_STATE_MAX_LIFE)/5 then
call IssuePointOrder(h, \GetUnitX(gg_unit_nfoh_0001), GetUnitY(gg_unit_nfoh_0001))
set e = 3 ?
如果英雄的状态良好,检测他是否处在一个普通命令中(防止它打断了通魔技能).如果是一个标准命令,我们再检测在500的半径内是否有敌人存在.如果存在敌人,简单的发出一个攻击命令(不要改变\的值,5秒对于这个情况刚刚好).
function AIFilterEnemyConditions takes nothing returns boolean
return GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(GetAttachedUnit(GetExpiredTimer(), \endfunction
if ((o == \or (o == \or (o == \or (o == \or (o == \
set g = CreateGroup()
set b = Condition(function AIFilterEnemyConditions)
call GroupEnumUnitsInRange(g, x, y, 500, b)
set f = FirstOfGroup(g)
if f == null then ?
call IssueTargetOrder(h, \
call DestroyGroup(g)
call DestroyBoolExpr(b)
如果没有敌人存在,再检测物品.如果发现物品,再检测是否为一个提升状态的物品.如果不是,检测英雄物品栏是否有空栏,有的话就命令英雄将它拣起来.
function AISetItem takes nothing returns nothing
set bj_lastRemovedItem=GetEnumItem() endfunction
function AIItemFilter takes nothing returns boolean
return IsItemVisible(GetFilterItem()) and GetWidgetLife(GetFilterItem()) > 0 endfunction
function AIHasEmptyInventorySlot takes unit u returns boolean
return UnitItemInSlot(u, 0) == null or UnitItemInSlot(u, 1) == null or UnitItemInSlot(u, 2) == null or UnitItemInSlot(u, 3) == null or UnitItemInSlot(u, 4) == null or UnitItemInSlot(u, 5) == null > 0 and endfunction
if f == null then
set i = Rect(x-800, y-800, x+800, y+800)
set be = Condition(function AIItemFilter)
set bj_lastRemovedItem=null
call EnumItemsInRect(i, be, function AISetItem)
if bj_lastRemovedItem != null (GetItemType(bj_lastRemovedItem) AIHasEmptyInventorySlot(h)) then
call bj_lastRemovedItem)
call RemoveRect(i)
call DestroyBoolExpr(be) ?
如果物品栏没有空位,或者没有发现物品,则命令英雄到一个随机地点寻找新的目标. ?
set r = GetRandomLocInRect(bj_mapInitialPlayableArea)
call IssuePointOrderLoc(h, \
call RemoveLocation(r) ?
linzefei 发短消息
linzefei (橙zi 174)当前离线
我从来没出现过
主题108 精华2 积分50383 阅读权限120 在线时间3947 小时 最后登录
IssueTargetOrder(h, \== ITEM_TYPE_POWERUP and or 包含总结汇报、文档下载、专业文献、IT计算机、资格考试、考试资料、旅游景点、word文档、应用文书以及魔兽争霸地图编辑器.AI制作等内容。本文共4页
相关内容搜索魔兽争霸3怎么让AI玩家会选择英雄?触发器怎么编辑?_百度知道
魔兽争霸3怎么让AI玩家会选择英雄?触发器怎么编辑?
触发器怎么编辑?
我有更好的答案
编辑器自带的AI编辑器功能是很有限的。用触发让电脑玩家选英雄的方法如下,编辑AI是很困难的事情,而且需要专门的工具.如果只选择英雄的话触发就可以了,但是你还要给他加上英雄的特殊操作的话就必须编辑AI。-单位-创建一个(电脑选择的单位类型)为了(电脑玩家)在(英雄出生点):-单位-杀死(电脑选择英雄的单位,比如羊、小精灵什么的,角度为默认,没有则不需要)-单位-杀死(你想让电脑选择的单位,如果想让电脑随机选,就必须用数组变量把所有的英雄类型存起来,再使用随机整数抽取):-事件让AI玩家会选择英雄,就是杀死你摆出来让人看的英雄,如果是酒馆选英雄则不需要..:对战初始化(如果不是一开始就要选英雄,那么事件自己定)-条件:-玩家比较-玩家1红色(选成设置了AI的电脑玩家)的控制者等于(电脑)-动作
很难啦,自己去尝试,我就是这样的
为您推荐:
其他类似问题
魔兽争霸3的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&#xe621; 上传我的文档
&#xe602; 下载
&#xe60c; 收藏
粉丝量:315
所有文档均可在线免费浏览,需要的朋友请看好是否是自己需要的文档。所有资料来源于网络,仅供大家参考学习,版权归原作者。若有侵权,敬请及时告知,本人会及时删除侵权文档,竭诚全力为您服务!!!
&#xe602; 下载此文档
正在努力加载中...
魔兽争霸地图编辑器.AI制作
下载积分:1311
内容提示:魔兽争霸地图编辑器.AI制作
文档格式:DOC|
浏览次数:278|
上传日期: 14:44:51|
文档星级:&#xe60b;&#xe60b;&#xe60b;&#xe60b;&#xe60b;
全文阅读已结束,如果下载本文需要使用
&#xe71b; 1311 积分
&#xe602;下载此文档
该用户还上传了这些文档
魔兽争霸地图编辑器.AI制作
关注微信公众号

我要回帖

更多关于 施密特触发器 的文章

 

随机推荐