BetterBot插件的一些说明
简介
BetterBot(For CSGO)是一个开源的Sourcemod插件,用于大幅度加强CSGO的Bot瞄准能力,该插件由Manicoming在起源论坛于2019开始发布,后转为Github更新。
授人以鱼不如授人以渔!因为诸多原因我现在自己用的版本不一定适合大家各自的服务器,直接教学大家如何进行一些基本的修改,以及分析源代码(主要是botstuff.sp)的内容。
首先原始插件地址:
https://github.com/manicogaming/CSGOBetterBots
Sourmod API教程:https://sm.alliedmods.net/new-api/
可能需要科学的上网。
原作者说因为各种原因觉得麻烦不想宣传,所以关于源码的含义啥的网上是完全没有教程的。
那下面我就开始解释吧。
安装方法就是下载所有前置插件(你得先装好sourcemod和metamod等),全部完成后启动进入云服务器,控制台输入sm plugins应该能看到当前运行的插件。在srcd控制台中也有相关信息,加上会生成log日志文件,在sourcemod/log中。
装好以后我们要自己diy的最重要的文件就在
addons/sourcemod/scripting/bot_stuff.sp
当前版本已经和botmimic的5人协同demo爆弹方式切割,改为定点爆了,孰好孰坏说不清。
解读文件内容(6.2官方版):

开局是一堆全局变量,作者的命名还是很规范的,下面是一些重要的数组。
底下几个enum分别是bot移动的方式,看东西的状态等,操作优先级等,这些都很显然,也有一些注释。

BOT丢手雷是有几个状态的,可以理解为“不丢”“预准备”“瞄准”“丢好了”

可以看到bot的行为有这么多的情况,对应的如字面意思,比如在拆包,被火烧了在跑,原地蹲蹲,跟随等等。这些都是bot在实战中遇到的具体状态,他们会自己切换状态,似乎不可以直接给他进行状态的赋值。(可能是CSGO内部代码,动不了,属于只读的变量)

这里作者定义了最基本的一些事件,还有我们的team函数,用过该插件就知道team g2 t;这种类似的写法用来加入完整队伍的机器人队友。
HookEventEx是触发事件相关的,不需要改。

Team指令读取一个iArg的字符串,并通过简单的if循环枚举判断是否有这个队伍存在,存在的话就根据第二个参数加入对应名称的bot。例如我输入team heroic t,首先第一个参数“heroic”会一个一个对比下去,找到确实存在X队以后,根据我的“t”参数把cadian、teses等五个bot加入t边。这里ServerCommand就是游戏控制台内部形式,跟你自己按~然后输入是一个效果的。
由于队伍数量诸多,这个函数一直到3250行才结束。

这里没啥,也不用改,就是读取现在的地图,准备一下他的单个爆弹,判断一下是炸弹图还是人质图,最后给Bot加颜色(小地图显示黄色蓝色啥的)。
Timer_CheckPlayer看着好长一串,但是思路很简单,下面我慢慢解释。

首先上来是一个针对client参数的for循环(这里用的是变量i),为啥要这么做呢,因为不管是bot还是人甚至gotv,在服务器的诸位都会被分配一个编号,这个值就是client的固定参数,在一把比赛中一般是固定的。因为Bot需要服务器发指令去操作,所以肯定是一个一个client编号循环过来的,但是我们不能影响正常玩家,也不需要操作GOTV,更不用考虑死亡的bot,所以这里会有一些限定条件。
由于这里是在写BOT开局买枪的逻辑,跟人类没关系的,所以条件是有效且Fake(就是虚拟人bot,不是人类)且活着的。是不是很容易想到呢。
下面作者开始定义一些变量,比如iAccout是账户的钱,逻辑变量bInBuyZone判断是不是在购买区域,iTeam是这个client对应的Bot的队伍……bHasDefuser就是有没有钳子。


IsItMyChance是个作者自己写的概率参数。

稍微看一下就知道了,随机生成一个浮点数然后赋值给flRand,如果函数参数小于0.0直接给false。后面正常判定就是你给的参数fChance是不是大于等于随机得到的flRand,显然可以知道我们正常使用的fChance可以是0.0-100.0,给的越大,事情发生的概率就越大,给100.0那就是必然发生事件了。因为检视没必要一直按着,他给了1.0。
这个函数下面就没啥复杂的,就是怎么买枪,怎么买道具。
有人私信我说BOT好烦啊道具乱买乱扔,那你可以把这里的几行给他删了。

FakeClientCommand是给bot用的指令(因为bot不会真的去控制台输入buy ak47)。
这个switch直接删掉,就不会买那么多道具了。

也很简单,开局还是一样的for循环,毕竟要操作bot行动。
然后判断是bot了,因为是回防的逻辑,先判断是不是存在plantedc4(埋下去的包),以及是不是CT的bot。
然后直接变量设置为c4位置,让bot过去。作者是让他们切刀一路跑的(看到人会切主武器),但我觉得这纯呆呆鸟,你要是觉得没意思就把GetPlayerWeaponSlot里面的knife改成primary,会拿着主武器回防(手枪局除外)。
或者用BotEquipBestWeapon也可以。但是这样40s回防一般都不够时间的,可以宽容点控制台给个mp c4_timer 50。多给10s机会。

这函数主要是在让bot去捡地上更好的枪,还有就是敌人全死了就切刀之类的小事。

这函数是让bot开局发枪,不需要改。

这个函数比较玄学,他读取了botprofile的一些参数在这里重新赋值了,你如果觉得不喜欢他自作主张导致bot变菜,把底下涉及随机的那部分改成自己botprofile同样的参数就好。

作者为了让森载尼更厉害还给他们的参数单独赋值了,你觉得不喜欢就把这些删了,改自己的。这里其实每个client(就是每个bot)的参数都可以不一样的,想diy的话按照他的格式就可以了。
然后最底下设置bot的队伍,这样你TAB才看到 FAZE broky这种格式,也会读取他们的准星然后赋值进去,这些数据库我之前的视频解释了,不再赘述。
底下的g_bUseUSP啥的是开局用usp还是p2000,a4还是a1这些的概率,不改也行,改也可以。


大家应该都有经验了,看到for循环加上这个三连击的且就是要对bot参数操作了,事实上也确实是这样的,这里就是在回合开始前先把一些全局变量给到初始值,比如对于i号bot,开局正常情况肯定是不丢枪,不扔雷啥的。在过去的版本还有要不要执行demo方式五人爆弹什么的,现在被删掉了。
底下在设置i号bot的这个moraleoffset,我也不是很清楚是啥,士气?挺抽象的。

这是回合结束的函数,第一个while计算一回合打完,全局变量g_iTScore就是T得到的分,CT也一样。
for循环是让还在mimic丢道具的bot别扔了,回合都结束了,也是很合理。
第二个for循环把丢道具的时间戳清零一下,下回合正常用。

freezetime就是开局你站在那买枪的那段时间,因为动不了所以叫freezetime,这里就只是读取一下游戏时间,宣布回合开始。

没必要改。

这一坨还是买武器,不过是主武器,所以没什么好看的。


这个函数我不是特别明白,因为我不会dhook的具体操作,但是大概知道混烟,混噪音背后敌人,还有丢道具啥的跟这个有些关系。

Bot在每个时刻都会存在一个任务,比如说现在他的任务就是把我的角色打死,那么打死以后他不能继续维持这个状态,不然就是宕机了。所以就得给他发一个Ignored的值,如果我还没打死就继续把我设置为目标。
g_fTargetPos可以理解为目标的三维坐标,他有两个参数,第一个是client编号,第二个是位置。

这里是定义bot移动的方式,&=~是跑,|=是走。如果你觉得,诶,那我t可以莽一点吧,可以多跑,也是ok的,你可以加到if条件里面,比如GetClientTeam(client)==CS_TEAM_T&&!g_bBombPlanted啥的,自己看着办吧。

说白了。这个思路很简单,BotMove让bot走到要爆的地方了,然后看看距离<25.0很近了,就直接开始瞄准,后面就从文件读取这个道具爆的方式了(就是个小规模的demo重放,比起自己动不容易丢歪)

第一个if,如果很安全或者都死光了可以跑。
第二个if,从实体Entity属性中检索浮点值。(不重要)
下面开始重头戏了,大伙都喜欢的。
关于瞄准和爆头率艺术:

先找到这里。
这个函数决定爆头率,头就是spine_3。

在能看见头的情况下,这里的IsItMyChance就在控制每一次瞄准要不要打头,iDefIndex是武器的编号,具体之前有个表但我找不到了。
如果想要自定义爆头率,改变if内的条件,加入自定义函数控制全局变量。比如我的写法是加一个g_fHeadShotT对于T爆头率,每个回合开始前随机在0.0-100.0产生,然后赋值。这样一局下来就比较合理。或者你自己设置几个档位,按照TEAM的那种写法对全局变量操作就行,很简单。
其他就没了,投掷物投掷方面还没研究,因为我用的还是旧版全局mimic,我觉得那个真比现在是这个强度大吧。
其他问题欢迎评论区留言