注:本文含有大量文字及少量图片
先上图
其中有3-4k的时长都在研究和修改BOT
------------------------------------------------------
导语
想必每个CSGO玩家在游玩的时候都出现过打不过的对手(亦或是队友),无论是C+选手,还是天才少年,那为什么不能是BOT呢?
BOT,国内人称机器人,从CSGO最初的版本就已经存在,至今经过多次的修改,BOT的强度肉眼可见的有所降低,早期的狙神维塔利能够1vN,武器大师Gunner,狙击二哥Kyle等等,如今却只是蹲在角落老六的一个"复活点",早期的BOT会瞄准脖子,如今的bot只会瞄下半身,当然这也是V社为了兼顾新手玩家所做的一部分妥协,那么在没有办法触及到BOT源代码的情况下是否存在某种办法让BOT再度强力起来呢?
注:本文有部分结论引用于上方链接
进入正题
答案是有的,
不使用插件的方法
有简单的也有复杂的,以下排序顺序为从易到难
- 控制台输入mp_damage_headshot_only 1(最简易也是最无趣的方法)
- 修改botprofile.db文件(强烈建议,也是本篇文章着重介绍的方法)
- 配合部分控制台指令增强bot某些能力
- 修改bt_config.kv3、bt_default.kv3(难度颇大,缺少修改的参考文本导致难以摸透)
首先得从了解每个文件夹的意思及其内部的文件对应的作用是什么
1.maps文件夹(存放地图bsp的文件夹也是存放BOT nav路径的地方)
框内nav后缀的文件即为炙热沙城II的bot路径文件
2.scripts(存放bot的行为文件,仅死亡竞赛中会默认启用,在csgo\cfg\gamemode_deathmatch.cfg中,对应指令是mp_bot_ai_bt ai\deathmatch\bt_config.kv3,细化bot的所有行为(包括主动瞄头和蹲下压枪),这也是为什么死亡竞赛的bot要显得更厉害的原因)
从上到下依次为合作模式、死亡竞赛、守卫模式、行为文件
3.botprofile.db(BOT最核心的文件,相当于BOT的个人简历,可自定义bot名字、激进性、交流频率、反应时间、技巧性、团队协作能力、武器偏好等)
图中即为分组为Elite定位为Rifle,名为Twistzz的BOT配置
4.bt_config.kv3、bt_default.kv3(类似于树状图的树干,负责引用modules文件夹中存放的行为文件)
如图,当载入了bt_default.kv3后,检测到血量低于60的时候,先会尝试切换出回血针后等待1s后触发扳机(即点下鼠标左键)
至此,修改教程正式开始!
------------------------------------------------------
botprofile.db文件修改
一、通用参数解释
在文件最起始的地方,你会看到这些
1.Skill(技巧性)
数字越大 在对抗远处敌人的时候越喜欢单点同时急停也越稳
数字越小 对抗近处敌人越喜欢速点或扫射,同时枪法也有一定的下降
经过测试
Skill值低于35时会时常性老六卖队友
Skill值低于49时遇到火雷闪不会躲避
Skill值低于65时被闪光弹白到时会瞎开枪
SkIll值为100时近远距离都以单点为主,急停稳定,距离特别近才会扫射
个人建议60-100区间内
注:Skill值过高时有时可能会出现一种奇怪的问题 详情如图
背闪了或者被白了会暂时对眼前的敌人失去敌对性
2.Aggression(激进性)
顾名思义,数值范围为0-100,数值越高通常越喜欢前压或者冲锋,当然bot开局前压和冲锋的决策不仅仅是由激进性决定的,还有地图nav路径是否为bot预留蹲点和Teamwork值也会有影响,总体上这个值对bot影响不大,(你调成0他也照样扎堆前压,你调成100照样蹲点架狙)
3.ReactionTime(反应时间)、AttackDelay(看到人以后多久后开枪)
最低0,最高貌似无上限
4.Teamwork(团队协作)
范围0-100,表面看着是Teamwork,其实更多影响的是会不会帮忙补枪补位,以及听不听话(例如无线电发gogogo的时候总会有人negative或者no的就是Teamwork值影响了)
5.AimFocusInitial(瞄准前准星的移动幅度)、AimFocusDecay(瞄准时准星的移动幅度)、AimFocusOffsetScale(准星移动的偏差度)、AimfocusInterval(准星移动间隔)
这四个AimFocus的准确定义我也拿不准,只是通过个人测试得出的结果
皆为越低越好,除了AimFocusDecay不能调0以外其他都可以调成0
6.LookAngleMaxAccelNormal(闲逛时视角转向速度)、LookAngleStiffnessNormal(闲逛时视角移动幅度)
LookAngleDampingNormal(闲逛时视角瞄准的垂直角度)、LookAngleMaxAccelAttacking(对枪时视角转向速度)、LookAngleStiffnessAttacking(对枪时视角移动幅度)、LookAngleDampingAttacking(对枪时视角移动幅度)
注:这里幅度和速度不是一个意思(幅度近似于定位准确度,速度近似于定位所需时间)
两个MaxAccelAttacking和StiffnessAttacking皆为越大越好(无上限,999999都可以)
LookAngleDampingNormal和LookAngleDampingAttacking这两个参数是角度值,以瞄准地面斜向45度角为起始位置面对视角前方向上的仰角,设置成-45时瞄地,设置成135时瞄天(角度值设置的好的话有奇效,在我的b站视频中有体现)
PS.Cost(花费程度)、VoicePitch(交流频率)、Skin(皮肤)、Rank(段位分值)
这几个参数是在1.6时代传下来的,在CSGO中没有任何用处
二、通用模板解释
1.Weapon Preference Templates(武器偏好)
排序中越靠上的bot会越优先拾起
澄清一个大部分教程贴没搞清的事实:WeaponPreference部分其实不是从贵到便宜,bot在起枪的时候会把列表全部检查一遍,之后优先买最贵的那一把,例如把deagle写在ak前面 如果钱够的话它也会起ak,主要影响的是持有优先度,例如把aug写在m4a4前面,但是bot只有3100,所以只能起m4a4,当他走过地上的aug附近的时候就会自动换成aug
以下为一套武器偏好的完整模板
Template [名字]
WeaponPreference = [武器代码]
WeaponPreference = [武器代码]
Skill = [数字]
End
图中为名字为Rifle,Skill值为100,拥有一套枪械优先顺序表的偏好
这是我的写法,vest早以就失效了不用管,3000+经济的时候会强起ak/m4,2000+经济的时候起咖喱/法玛斯,1500+经济的时候大概率起吹风机/小蜜蜂,偶尔会抬出鸟狙
2.Skill Templates(难度划分)----近似于bot的分组
以下为一个划分的模板
Template [命名]
Skill = [数值]
Aggression = [数值]
ReactionTime = [数值]
AttackDelay = [数值]
Difficulty = [对应难度](EXPERT、HARD、NORMAL、EASY)
VoicePitch = [数值]
AimFocusInitial = [数值]
AimFocusDecay = [数值]
AimFocusOffsetScale = [数值]
AimfocusInterval = [数值]
End
图中为我个人修改的使用例(专家难度中分组为Elite的bot会套用此模板)
------------------------------------------------------
和bot相关的一些控制台参数
bot_autodifficulty_threshold_high [数值] (当bot得分比玩家高时难度动态调整值,范围为-20至20)
bot_autodifficulty_threshold_low [数值](当bot得分比玩家低时难度动态调整值,范围为-20至20)
这两项参数的根据是玩家计分板中的分数,建议都调为0
bot_max_hearing_distance_override [数值](bot听到声音的最大距离,最小值为0最大值无限)
bot_max_vision_distance_override [数值](bot最大视距,最小值为0最大值无限)
bot_max_visible_smoke_length [数值](bot对于烟雾的可见程度,默认为-1,最大值无限)
这项参数调的过大的话bot直接成透视,隔着烟直接对枪
sv_bot_buy_grenade_chance [数值](bot购买投掷物的概率,范围为0-100)
sv_bot_buy_hegrenade_weight [数值](bot购买高爆手雷的概率,范围为0-100)
sv_bot_buy_flash_weight [数值](bot购买闪光的概率,范围为0-100)
sv_bot_buy_molotov_weight [数值](bot购买燃烧瓶/弹的概率,范围为0-100)
sv_bot_buy_smoke_weight [数值](bot购买烟雾弹的概率,范围为0-100)
sv_bot_buy_decoy_weight [数值](bot购买诱饵弹的概率,范围为0-100)
注:bot最多只会购买一个投掷物
以上参数以sv_bot_buy_grenade_chance为基准,若此指令参数为0的话下面的指令调100也没作用
bot_join_after_player [数值](bot是否在玩家选择阵营后加入,可填参数为0/1)
sv_auto_adjust_bot_difficulty [数值](服务器是否会自动调整bot难度,可填参数为0/1)
sv_bots_get_harder_after_each_wave [数值](bot在每一波之后是否会变得更困难,可填参数为0/1)
------------------------------------------------------
maps路径文件修改
从老cs系列将bot系统引进以来,每个地图都需要有其对应的nav路径文件以便于bot在复杂多样的地图中行走,从1.6之后若系统检测到地图内没有nav文件则会尝试自动生成路径文件,在CSGO中其存放位置为csgo\maps
如图,图中即为炙热沙城II的路径文件
在csgo\cfg中,存放着nav_bindings.cfg和navedit.cfg
一个nav路径文件,决定着bot在地图中可以自主决定行走的路线多少,制作精细的nav文件可以使bot做出更多操作(Mirage白车跳B2、A1箱跳跳台等)和多样化的决策
在游戏中控制台输入"exec 文件名"以载入cfg文件
注意:套用cfg文件后会覆盖大部分按键的功能,一定一定要预留自己的cfg文件,自己的设置cfg存放在Steam\userdata\[自己的64位数字ID]\730\local\cfg\config.cfg中
下面只作对cfg内部各项命令的解释,具体nav编辑方法太过繁琐且暂且略过
这里在 https://www.mafengs.com/bbs/topics/10290 和 https://www.docin.com/p-2785707922.html 的基础上作少许补充,上述两个链接对于nav相关指令的说明已经极为详细了
注:下方所有指令皆为对路径区域作的标记
nav_avoid(尽可能让bot少行走到此区域)
nav_crouch(bot行走到此区域时会蹲下)
nav_dont_hide(bot不会在此区域停留)
nav_jump(bot行走到此区域时会跳跃)
nav_no_jump(禁止bot在此区域中跳跃)
nav_precise(让bot行走的更为仔细精确,如在Mirage VIP洞口就需要定一个)
nav_run(bot在此区域中不会静步蹲下 除了回防)
nav_stand(禁止bot在此区域中蹲下)
nav_transient(标记为临时区域)
------------------------------------------------------
修改bt_config.kv3、bt_default.kv3
这个是最麻烦也是最深奥的办法,在19年时V社更新了scripts文件夹,其中就有这两个文件,相信19年以来接触过大行动的玩家都知道守护模式的bot有多强力吧,其正是这次更新后带来的提升
在csgo\scripts\ai\guardian中,存放着守护模式所有的bot行为文件,bot将会严格按照其中的编写执行动作
此处为csgo\scripts\ai\deathmatch,仅仅存放着可怜的两个文件,这也是死亡竞赛中会默认套用的文件
关于scripts文件夹内部文件的修改教程及格式等,V社并没有给出确切的教程和指示,故给修改带来了非常大的困难,以下是帖主对bt_config.kv3做了浅浅加强后的作业,有dalao懂这个的话务必和我沟通
elite =
{
aim_target_acquisition_lerp_time = 0
aim_target_acquisition_lerp_time_deviation = 0
aim_target_acquisition_angle_penalty = 1
aim_target_acquisition_angle_penalty_deviation = 0
aim_target_acquisition_angle_penalty_reduction_ratio = 0
aim_target_acquisition_angle_tolerance = 1.0
aim_target_acquisition_angle_lerp_bias = 0
aim_target_tracking_lerp_time = 0
aim_target_tracking_lerp_time_deviation = 0
aim_target_tracking_focus_interval = 0
aim_target_tracking_focus_interval_deviation = 0
aim_target_tracking_angle_lerp_bias = 0
aim_ready_angle_tolerance = 1.0
aim_new_target_angle_tolerance = 30.0
aim_max_duration = 1.1
aim_max_duration_deviation = 0
aim_punch_angle_reaction_chance = 1
look_around_awareness_yaw_range = 360
look_around_awareness_pitch_range = 360
look_around_focus_interval = 0
look_around_focus_interval_deviation = 0
look_around_lerp_time = 0
look_around_lerp_time_deviation = 0
look_around_lerp_bias = 0.2
reaction_time = 0
combat_crouch_chance = 0.9
combat_dodge_command_duration = 0.95
combat_dodge_command_duration_deviation = 0.15
attack =
[
// duration, duration deviation, cadence, cooldown, cooldown deviation
// KNIFE PISTOL SUBMACHINEGUN
[ -1.0, -1.0, -1.0, -1.0, -1.0 ], [ 0.95, 0.25, 0.2, 0.05, 0.0 ], [ 0.425, 0.075, 0.0, 0.125, 0.025 ],
// RIFLE SHOTGUN SNIPER_RIFLE
[ 0.155, 0.035, 0.0, 0.15, 0.05 ], [ 0.3, 0.0, 0.0, 0.25, 0.05 ], [ 0.22, 0.07, 0.0, 2.0, 0.0 ],
// MACHINEGUN C4 TASER
[ 0.9, 0.3, 0.0, 0.15, 0.05 ], [ -1.0, -1.0, -1.0, -1.0, -1.0 ], [ -1.0, -1.0, -1.0, -1.0, -1.0 ],
// GRENADE EQUIPMENT STACKABLEITEM
[ -1.0, -1.0, -1.0, -1.0, -1.0 ], [ -1.0, -1.0, -1.0, -1.0, -1.0 ], [ -1.0, -1.0, -1.0, -1.0, -1.0 ],
// FISTS BREACHCHARGE BUMPMINE
[ -1.0, -1.0, -1.0, -1.0, -1.0 ], [ -1.0, -1.0, -1.0, -1.0, -1.0 ], [ -1.0, -1.0, -1.0, -1.0, -1.0 ],
// TABLET MELEE SHIELD
[ -1.0, -1.0, -1.0, -1.0, -1.0 ], [ -1.0, -1.0, -1.0, -1.0, -1.0 ], [ -1.0, -1.0, -1.0, -1.0, -1.0 ],
// WEAPONTYPE_ZONE_REPULSOR UNKNOWN
[ -1.0, -1.0, -1.0, -1.0, -1.0 ], [ -1.0, -1.0, -1.0, -1.0, -1.0 ]
]
}
帖主在这里也尝试过将死亡竞赛的bot文件直接套用到其他模式中,发现V社只预留了安包的行为文件没有预留拆包的行为文件,之后按照安包的行为文件大致写了一个拆包的行为文件,但是没有作用,在这里也放出来给评论区的dalao指点指点
{
type = "decorator_sensor"
entity_type_filter = "CLASSNAME"
orphan_only = 1
output = "BombPlanted"
class_name = "plant_c4"
priority = 1
child =
{
type = "condition_is_empty"
input = "BombPlanted"
negated = 1
child =
{
type = "sequencer"
children =
[
{
type = "action_move_to"
destination = "BombPlanted"
movement_type = "BT_ACTION_MOVETO_RUN"
route_type = "BT_ACTION_MOVETO_FASTEST_ROUTE"
hiding_spot = "HidingSpot"
threat = "NearestThreatMemory"
nearest_area_distance_threshold = 20
arrival_epsilon = 35
},
{
type = "action_look_at"
input_location = "BombPlanted"
},
{
type = "action_wait"
wait_time_min = 1
wait_time_max = 1
},
{
type = "decorator_repeat"
child =
{
type = "action_use"
}
}
]
}
}
}
------------------------------------------------------
最后将我个人的修改成果视频放出
https://www.bilibili.com/video/BV16B4y1v7b1
https://www.bilibili.com/video/BV1mW4y1m7uX
此文耗时三个月实际五天
有更多不懂的或者更多可以私信我,我会一一回复