欢迎光临散文网 会员登陆 & 注册

BetterBot插件的一些说明

2023-06-02 20:16 作者:小青鲨累了  | 我要投稿

简介

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官方版):


瞄准位置的数组,BOT身体部位

开局是一堆全局变量,作者的命名还是很规范的,下面是一些重要的数组。

底下几个enum分别是bot移动的方式,看东西的状态等,操作优先级等,这些都很显然,也有一些注释。

手雷状态

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

BOT行为状态

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

初始化函数

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

HookEventEx是触发事件相关的,不需要改。

TEAM指令具体实现

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就是有没有钳子。

用来读取i编号bot的主武器
效果是让bot会检视武器。

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

函数定义

稍微看一下就知道了,随机生成一个浮点数然后赋值给flRand,如果函数参数小于0.0直接给false。后面正常判定就是你给的参数fChance是不是大于等于随机得到的flRand,显然可以知道我们正常使用的fChance可以是0.0-100.0,给的越大,事情发生的概率就越大,给100.0那就是必然发生事件了。因为检视没必要一直按着,他给了1.0。

这个函数下面就没啥复杂的,就是怎么买枪,怎么买道具。

有人私信我说BOT好烦啊道具乱买乱扔,那你可以把这里的几行给他删了。

BOT买道具

FakeClientCommand是给bot用的指令(因为bot不会真的去控制台输入buy ak47)。

这个switch直接删掉,就不会买那么多道具了。

CT方回防

也很简单,开局还是一样的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这些的概率,不改也行,改也可以。

关于ECO经济啥的,我没改过
回合正式开始前的准备函数

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

底下在设置i号bot的这个moraleoffset,我也不是很清楚是啥,士气?挺抽象的。

一回合结束的收尾函数

这是回合结束的函数,第一个while计算一回合打完,全局变量g_iTScore就是T得到的分,CT也一样。

for循环是让还在mimic丢道具的bot别扔了,回合都结束了,也是很合理。

第二个for循环把丢道具的时间戳清零一下,下回合正常用。

回合开局freeze时间函数

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

没必要改。

主武器购买

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

“能看到掉包了吗?”函数
DHook的函数

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

寻找新目标函数

Bot在每个时刻都会存在一个任务,比如说现在他的任务就是把我的角色打死,那么打死以后他不能继续维持这个状态,不然就是宕机了。所以就得给他发一个Ignored的值,如果我还没打死就继续把我设置为目标。

g_fTargetPos可以理解为目标的三维坐标,他有两个参数,第一个是client编号,第二个是位置。

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

Bot爆单个道具

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

第一个if,如果很安全或者都死光了可以跑。

第二个if,从实体Entity属性中检索浮点值。(不重要)

下面开始重头戏了,大伙都喜欢的。

关于瞄准和爆头率艺术:


先找到这里。

这个函数决定爆头率,头就是spine_3。

爆头率控制

在能看见头的情况下,这里的IsItMyChance就在控制每一次瞄准要不要打头,iDefIndex是武器的编号,具体之前有个表但我找不到了。

如果想要自定义爆头率,改变if内的条件,加入自定义函数控制全局变量。比如我的写法是加一个g_fHeadShotT对于T爆头率,每个回合开始前随机在0.0-100.0产生,然后赋值。这样一局下来就比较合理。或者你自己设置几个档位,按照TEAM的那种写法对全局变量操作就行,很简单。

其他就没了,投掷物投掷方面还没研究,因为我用的还是旧版全局mimic,我觉得那个真比现在是这个强度大吧。

其他问题欢迎评论区留言

BetterBot插件的一些说明的评论 (共 条)

分享到微博请遵守国家法律