距离上一篇教程也过去一个多月了,是时候写一篇新教程了。上一篇文章主要介绍了如何选择阵容和技能的使用,在这一篇文章中,我们将介绍如何配置英雄出装和其相关的一些模块。
勘误
首先先纠正一下上一篇文章中的一些错误,在选择阵容部分,下面的table.remove函数中出现了一个错误,bad argument #2 to ‘remove’ (number expected, got string),就是第二个参数应该为数字而不是字符串。这个错误将导致已选择的英雄不能从英雄列表中移除,从而会选择出重复的英雄。
function Think()
for i,id in pairs(GetTeamPlayers(GetTeam()))
do
if(IsPlayerBot(id) and (GetSelectedHeroName(id)=="" or GetSelectedHeroName(id)==nil))
then
local num=hero_pool_my[RandomInt(1, #hero_pool_my)] --取随机数
SelectHero( id, num ); --在保存英雄名称的表中,随机选择出AI的英雄
table.remove(hero_pool_my,num) --移除这个英雄
end
end
end
所以中间几行应该修改为,这样从表中才能正确移除已经选择的英雄
local i=RandomInt(1, #hero_pool_my) --取随机数
local heroname=hero_pool_my[i] --获取英雄的名称
SelectHero( id, heroname ); --在保存英雄名称的表中,随机选择出AI的英雄
table.remove(hero_pool_my,i) --移除这个英雄
出装系统简介
在官方开发者维基中有着这样的说明:
物品购买
如果你只想重写在购买物品时的决策,你可以在文件名为item_purchase_generic.lua的文件中实现如下函数:
ItemPurchaseThink() - 每帧被调用。负责物品购买。
你也可以仅重写某个特定英雄的物品购买逻辑,比如火女(Lina),写在文件名为item_purchase_lina.lua的文件中。
在dota 2 beta\game\dota\scripts\vscripts\bots_example
V社的示例文件中,我们可以找到item_purchase_lina.lua
文件,这就是为火女配置出装的文件。
打开这个文件,我们可以看到:
--这个表用来记录AI出装的顺序
local tableItemsToBuy = {
"item_tango",
"item_tango",
"item_clarity",
"item_clarity",
"item_branches",
"item_branches",
"item_magic_stick",
"item_circlet",
"item_boots",
"item_energy_booster",
"item_staff_of_wizardry",
"item_ring_of_regen",
"item_recipe_force_staff",
"item_point_booster",
"item_staff_of_wizardry",
"item_ogre_axe",
"item_blade_of_alacrity",
"item_mystic_staff",
"item_ultimate_orb",
"item_void_stone",
"item_staff_of_wizardry",
"item_wind_lace",
"item_void_stone",
"item_recipe_cyclone",
"item_cyclone",
};
------------------------------------------------------------------------------------------
--用来实现基本的物品购买函数
function ItemPurchaseThink()
local npcBot = GetBot();
if ( #tableItemsToBuy == 0 )
then
npcBot:SetNextItemPurchaseValue( 0 );
return;
end
local sNextItem = tableItemsToBuy[1];
npcBot:SetNextItemPurchaseValue( GetItemCost( sNextItem ) ); --用于默认AI的相关函数
if ( npcBot:GetGold() >= GetItemCost( sNextItem ) ) --判断金钱是否足够
then
npcBot:Action_PurchaseItem( sNextItem ); --购买物品
table.remove( tableItemsToBuy, 1 );
end
end
大家注意到,在上面那个记录出装顺序的表中,物品的名称似乎和平时用的有所区别,其实也可以在这个页面找到。
在上面这个函数中,V社为我们提供了购买物品的基本函数,但是这只能实现在泉水的商店中购买物品,如果要去神秘商店和边路商店购买物品怎么办呢?如果要配置多种出装风格应该怎么办?如何控制信使去购买物品?那就需要靠我们自己实现了。而且如果要配置物品出装,那么需要手动填写每一个配方。不过在V社最近的api更新之后,添加了一个函数GetItemComponents(sItemName),可以直接获取物品的配方。
下面,我们开始在V社的基本函数上逐渐添加更多的功能。
在神秘商店和边路商店购买装备
由于物品购买是一个通用的功能,所以我们可以在item_purchase_generic.lua中编写函数,以便重复调用。在默认AI的框架下,有两个模式用于物品购买secret_shop和side_shop,我们需要通过在主函数中控制前往神秘商店和边路商店购买物品。(尽管将选择前往哪个商店的功能耦合在一个函数中不好。更好的方法是在其它两个模式中重新编写GetDesire()函数。)
在游戏中,一个能在神秘商店购买的物品必定不能在基地商店购买,而边路商店的物品则有可能来自于其他商店。所以便能通过IsItemPurchasedFromSideShop(sNextItem)和IsItemPurchasedFromSecretShop(sNextItem )函数来判断一个物品能在哪被购买,进而决定下一个物品的购买位置。
if(npcBot.secretShopMode~=true and npcBot.sideShopMode ~=true)
then