跳到正文
Server Changelog

服务器更新记录

插件、地图、规则改动记录,从 GitHub 同步;拉不到就用本地缓存。

缓存时间:2026-10-14 18:54 当前使用缓存 查看 GitHub 原文

2026年10月5日 Tank 投石时机与石头保护(ai_tank3 2.3.2 / l4d_rock_lagcomp 2.2-anne)

  • 石头保持固定 100 血。离手无敌时间在全档增加 0.1 秒的基础上,非音理五档再增加 0.05 秒,改为 0.15 / 0.20 / 0.25 / 0.30 / 0.35 / 0.35 秒,AI 与玩家 Tank 通用;插件默认值为 0.25 秒,不再叠加额外的血量或距离保护。按前五档出手速度 800、音理 1000 的低仰角近似,无敌期水平位移约为 120 / 160 / 200 / 240 / 280 / 350 单位,实际取决于出手速度和仰角。
  • 普通 AI 投石起手范围改为 200~450 单位(含边界),从范围内选择最近的可见有效目标。当前追击目标太远或太近时允许另选投石目标;没有合适候选就不起手。出手时重新选择范围内目标,若已无人符合则保留原生弹道,已起手的石头仍会飞出。反头顶卡、骑头的强制投石保留原规则。普通连跳能力、投石间隔和命中生还伤害未调整。
  • 移除投石起手时额外向上加速的跳砖逻辑,并删除 ai_tank3_jump_rock 开关及六档配置项。普通连跳保持原规则,仍可能在连跳途中投石;投石动画不再额外触发起跳。
  • 石头保护与命中历史使用同一射手时间,回滚改用 outgoing 延迟加插值,并受 sv_maxunlag 和有效历史限制;近似准星射线增加遮挡检测,只结算最近一颗石头。
  • 默认 sm_rock_native_shotgun 1 使用引擎实际霰弹命中伤害,不再把全部弹丸伤害集中在一条准星射线上。霰弹不使用本插件的位置回滚;设为 0 可回退旧近似。
  • 重新编译 ai_tank3.smx、l4d_rock_lagcomp.smx,同步六档配置和文档;保护边界、回滚历史、霰弹计伤及投石时机回归测试通过。尚未部署实服,实际命中率与高延迟场景待验证。

2026年10月3日 战役图转对抗的 Boomer 模型初始化修复

  • 地图投票升级到 0.9.4-custom,在 OnMapInit 重新注入 versus 任务信息,并清除上一张图的注入缓存。修复 Utopia 首章初始化模型时任务查询为空、Boomer 列表缺项导致的生成崩溃,保留男、女两种模型。
  • 沿用 l4d2_mapvote_versus_from_coop 开关;开关需在载图前生效,更新插件后重新载图。无需设置 no_female_boomers 或修改 NAV。

2026年10月3日 纯战役地图对抗机关兼容

  • 新增 l4d2_coop_versus_compat.smx,在地图载入前将纯战役三方地图 info_gamemode 的 OnCoop / OnCoopPostIO 连接改接到对应的对抗输出,保留参数、延迟与触发次数;不伪造游戏模式或触发全局 OnCoop。
  • 默认自动识别缺少原生 versus 声明的 coop 地图,保护官方图及原生对抗图;支持 configs/l4d2_coop_versus_compat.cfg 逐图启用或排除,控制台 sm_coop_versus_status 查看结果。加载插件或更改配置后需重新载图。
  • 地图投票升级到 0.9.3-custom,战役章节补入对抗的默认范围扩大到所有配置(l4d2_mapvote_versus_from_coop 2)。兼容插件不修复 NAV、脚本内模式判断或自定义救援,具体地图仍需验证换边、切关和结算。
  • 增加仅服务器控制台使用的 sm_mapvote_list,直接读取玩家菜单构造出的三方战役条目。云35实测 Utopia:versus 下关闭注入时不显示,开启后显示,三章均可载入并正确识别章节及终局;真人交互、自然换边和救援结算未验证。另确认服务端 VPK 文件名中扩展名前的小数点会导致该服引擎漏挂载,临时无额外小数点软链接可解决挂载。测试后已恢复服务器,详情见 docs/coop_versus_cloud35_test_2026-10-03.md。

2026年10月1日 网络质量提示:choke 漏检、丢包方向修复

  • network_quality_hint 升级到 1.1.7。引擎给出的 loss/choke 只是最近约 1 秒的滑动平均,旧版每 5 秒才读一次,等于随机抽一秒;尸潮、大量实体时那种一两秒的 choke 基本抽不中,聊天提醒还要求连续 3 次超标,所以 choke 几乎从不触发。
  • 现在每秒探测一次,每个检测周期(nqh_check_interval,默认 5 秒)按窗口平均值判断 ping/loss/choke;超时只要窗口内出现过就算。阈值不变:聊天提醒 choke 5%,网站异常事件 choke 20%。
  • 上报网站的 avg/p95 用每个窗口的平均值,max 用窗口内最高的一秒,短时尖峰不会再漏掉。
  • 丢包改为统计玩家发给服务器的方向(和 status 里的 loss 是同一个数)。服务器不知道自己发出去的包丢没丢,旧版统计的「服务器发给玩家」方向丢包恒为 0,所以丢包提醒和网站异常从来没触发过。
  • 新增 nqh_report_loss_limit(默认 5%):窗口平均丢包高于它才记网站异常事件;聊天提醒仍用 nqh_loss_limit(2%,连续 3 个窗口)。
  • !net 的检测口径说明补上丢包方向;提醒里的异常原因和「[网络]」标签改走翻译文件,六种语言都会按玩家语言显示。
  • 重新编译 network_quality_hint.smx。网站后台对应改动见 NewAnneWeb:丢包列改显示玩家发给服务器方向,连接异常记录显示原因(loss / ping / choke / timing_out)。

2026年9月26日 RPG 菜单加入物品光束设置

  • !rpg / !buy 主菜单在「命中反馈菜单」后面新增「物品光束设置」,点进去就是 !beam 的光束设置菜单。只在加载了 l4d_random_beam_item 的模式里显示(该插件现在注册了同名库,rpg.smx 用它判断)。
  • 重新编译 rpg.smx 和 l4d_random_beam_item.smx。

2026年9月26日 止痛药光束调小

  • data/l4d_random_beam_item.cfg 里止痛药光束的高度从 250 改为 100,宽度从 15 改为 10;颜色(绿色)、HDR 亮度和透墙光晕不变。这是服务器默认值,玩家用 !beam 调过长度、宽度的,按新的默认值换算百分比。

2026年9月25日 数据库连接收敛:新增 anne_db 连接中心

  • 新增 extend/anne_db.smx,在 cfg/generalfixes.cfg 第一行加载。同一个数据库只保留一条共享 MySQL 连接,各插件拿到的是这条连接的副本。每台服的数据库连接从最多约 22 条降到 3 条(Anne 模式 5 条)。SourceMod 的线程查询本来就在同一个数据库线程里排队,共享连接不影响速度。
  • 已接入:l4d_stats、rpg、l4d2_hitsound、l4d2_damage_show、l4d2_scripted_hud、l4d2_blacklist、global_chat、chatlog、lilac、l4d_player_count_unload_mode、l4d_random_beam_item、annehappy_dynamic_ai_difficulty、anne_traitor_quota、spawn_vote_menu、sbpp_main、sbpp_comms、sbpp_checker、sbpp_sleuth。没有加载 anne_db 时,各插件自动回到原来的独立连接。
  • 数据库断网时不再卡服:连接失败后 30 秒内直接返回,不在主线程反复等待;游戏过程中的按需重连不再阻塞主线程。databases.cfg 里 MySQL 的连接超时从默认 60 秒改为 15 秒。
  • 连接中心每 120 秒保活一次(MySQL wait_timeout 为 600 秒),空闲后的第一条查询不会再失败。插件各自的保活和每张图断开重连已去掉。
  • 修复:l4d_player_count_unload_mode 多个 cvar 连续变化时会泄漏数据库连接;l4d_stats 清空统计改用 SourceMod 事务,不会再把其他插件的查询卷进同一个事务;l4d_stats 读取影响行数时的竞态。
  • 新增管理员控制台命令 sm_annedb_status,查看各数据库连接状态。
  • 数据库插件的写法要求已写入 AGENTS.md。

2026年9月25日 物品光束改为玩家可自定义(l4d_random_beam_item 1.1.0)

  • 标准光束:data/l4d_random_beam_item.cfg 原来的 default 段改为 standard(标准光束:长 100、宽 6、HDR 2.0、白色、无光晕),每个物品只写和标准不同的部分;所有物品改为固定的类别颜色,不再随机。这个文件现在只是服务器默认:默认显示的仍然只有止痛药(绿色、长 250、宽 15、带光晕)和侏儒(白色、长 30、宽 5),和之前一样。
  • 物品分组:物品按 14 组归类(止痛药、肾上腺素、医疗包、电击器、投掷物、升级弹药包、T1 武器、T2 武器、特殊武器、手枪、近战、弹药堆和升级、可搬运物品、其他),分组和菜单顺序在数据文件的 group / groups 里配置。
  • 玩家设置:输入 !beam 打开菜单,只改变自己看到的效果:
  • 全部物品:显示(默认 / 全部隐藏)、长度、宽度(标准的 50%–300%)、颜色(9 种)、光晕(开 / 关)。
  • 按物品设置:每组单独设置显示(显示 / 隐藏)、长度、宽度、颜色、光晕;没设置的项跟随「全部物品」,单独设置过的组在菜单里标 [自定义]。
  • 快捷样式:明显(长宽 150%、开光晕)、简洁(长 50%、宽 75%、关光晕)、全部关闭、默认;只改「全部物品」,倍率可在数据文件 styles 段调整。也可以直接输入 !beam bright/subtle/off/default,!beam reset 全部恢复默认。
  • 默认不显示的物品也能打开:比如有人把「肾上腺素」设为显示,服务器就给肾上腺素建光束,但只对选了显示的玩家打开,其他人看不到;没有玩家需要时这些光束会删除。服务器实体数达到 l4d_random_beam_item_player_edict_limit(默认 1900)后不再新建这类光束,并提示玩家;设为 0 可以关掉这个功能。所有物品的光束都会动态生成(物理道具 prop_physics 除外,它的数量太多)。
  • MySQL 保存:玩家设置存到 databases.cfg 的 rpg 库,新表 beam_item_prefs(按 Steam2 ID),插件启动时自动建表,database.sql 同步加入。进服时读取,改设置后 3 秒写入,离开服务器时再补存一次。数据库不可用时设置只在本次连接有效,并提示玩家。
  • 实现:用 SendProxy 扩展(sendproxy2)按玩家改写每条光束下发的开关、长度、宽度、颜色和光晕,服务器上的光束本身不变;客户端只在创建光束时读取颜色和光晕,所以改设置后会对这个玩家先关掉光束 0.3 秒再打开。只有和服务器值不同的属性才会改写,默认设置的玩家不增加额外的打包开销。服务器没加载 SendProxy 扩展时,所有人按数据文件显示,!beam 提示暂不可用。
  • sm_beamreload 重新加载数据文件时,在线玩家的设置按分组名保留。
  • 聊天提示和菜单支持简体中文、繁体中文、英语、日语、韩语、越南语。
  • docs/plugin_commands.md 补上 sm_beam;重新编译 l4d_random_beam_item.smx。

2026年9月23日 Tank 目标跑到身后改为掉头跳(ai_tank3 2.3.0)

  • 问题:直追时被人从身边闪过,或者换成了身后的目标,Tank 的速度方向和目标方向夹角一超过 89°,空中修正就不再转向(共享移动代码的上限)。落地时又按 1.x 的叠加规则起跳:原来的速度全部保留,只朝目标加一份推力,所以还是顺着原方向跳,每跳只慢几十。看起来就是盯着人连续往后跳好几跳,要等速度掉到 200 以下或者前面撞墙才停下来掉头。
  • 空中刹车:直追起的这一跳,要去的方向一落到身后,就按 ai_tank3_bhop_reverse_brake(默认 1500 单位/秒²)把水平速度刹到跑速,只减速不改方向。刹车前会按刹车后的速度重查剩余路线,落点不安全(断层、坑边)就不刹。
  • 落地掉头跳:落地时目标仍在身后 89° 以外,ai_tank3_bhop_reverse_hop(默认 1)会改成掉头跳:直接对准目标、按跑速起跳,这一跳不给加速度,也不左右侧跳。连跳不中断,但攒下的速度清零,之后照常逐跳加速。被闪过的代价从“往回跑出去好几秒”变成“丢掉攒下的连跳速度”。
  • 往回跳只剩当前这一跳没飞完的部分(一跳最长约 0.77 秒),不会再连续往后跳。目标在身前 89° 以内的直追(包括左右连跳和 45°~60° 的修正门槛)、沿路径连跳都不变。
  • 两项不参与动态难度分档;设 ai_tank3_bhop_reverse_hop 0、ai_tank3_bhop_reverse_brake 0 可恢复旧行为。ai_tank3_log_level 2 时控制台会打印 reverse hop 日志,方便实测。
  • 同步 docs/annehappy_dynamic_ai_difficulty.md 和 Tank 情景图鉴(docs/ai_tank3_scenarios_2026-09-14.html),重新编译 ai_tank3.smx。

2026年9月23日 药役刷药位置控制(confoglcompmod ItemTracking)

  • 普通 / 硬核 / 喷子药役(以及共用普通药役配置的 WitchParty、牛牛冲刺)现在只在地图进度 30%–90% 之间刷药:confogl_pills_flow_min 0.3、confogl_pills_flow_max 0.9。这是上游 ItemTracking 已有的进度窗口,之前药役没有打开。药的数量仍按 confogl_pills_limit / mapinfo 的 pain_pills,在 30%–90% 之间按进度均匀挑选。
  • 新增 confogl_pills_flow_max_detour(药役设为 300):药只保留在起点到终点的主路线上。插件先量出起点到终点安全屋的最短可走路线长度,再检查每瓶药绕去拿它要多走多少:走在主路上顺手就能拿到的药绕路接近 0,深度为 d 的侧屋、死胡同或岔路里的药绕路约为 d,超过 300 的删除。这一步在药间距和数量筛选之前执行,所以留下的药都从主路上的点位里挑。
  • 新增 confogl_pills_flow_fill(药役设为 1):筛完后药数不够上限时,不拿侧屋里的药凑数,而是在进度 40%–80% 的主路线上补刷(confogl_pills_flow_fill_min 0.4、confogl_pills_flow_fill_max 0.8,并且不会超出上面的 30%–90%)。缺几瓶就把 40%–80% 等分成几段,每段随机取一个进度,在离这个进度最近的主路线导航区(带 ESCAPE_ROUTE 标记,排除出生点、安全屋和救援区域)里随机找落点:要有地面、放得下、离其他药至少 128 单位,并且不在 mapinfo 标出的起点 / 终点安全屋范围内。每个进度最多试 32 个导航区,还不够就在 40%–80% 里再随机试几次。原图一瓶药都没有也会补。这一步不寻路。补刷的药会记进 ItemTracking,团灭重开后位置不变;没补满时日志里会记下补了几瓶。
  • 药的光束调明显:data/l4d_random_beam_item.cfg 里止痛药的光束从白色、高 20 改为绿色、高 250、宽 15,并打开底部光晕(光晕可以透墙看到)。这个文件 Anne 战役、绝境也在用,那边的药光束也一起变了。
  • 新增 anne_pill_hint.smx(普通 / 硬核 / 喷子药役、WitchParty、牛牛冲刺加载):第一个生还者出安全屋时,在聊天栏告诉所有人这一关路上一共几瓶药、分别在多少进度,例如“38%、52%×2、71%”。安全屋里的药不算;进度用药所在导航区的进度值,和删药时的算法一致。提示支持简体中文、繁体中文、英语、日语、韩语。
  • 个别地图可以在 mapinfo 里用 pillflow_min、pillflow_max、pillflow_max_detour、pillflow_fill、pillflow_fill_min、pillflow_fill_max 单独调整;confogl_pills_flow_visualize 1 不删药,只用发光标出结果(白色 = 保留,绿色 = 补刷,红色 = 进度窗口外,品红 = 不在主路上,橙色 = 离上一瓶太近,青色 = 超出数量)。救援关默认不做这些筛选(confogl_pills_flow_finale 0)。
  • 重新编译 confoglcompmod.smx,新编译 anne_pill_hint.smx。

2026年9月23日 Charger 连跳空中转向收紧(ai_charger3 1.0.1.18)

  • 空中转向预算:新增 ai_charger3_air_turn_budget。牛每次离地时记下起跳方向,这一跳在空中最多只能偏离这个方向这么多度,用完就按惯性落地。接近阶段的空中修正和冲锋前的空中追踪共用这一份预算。原来冲锋前那一跳在空中每 0.05 秒朝你的预测位置修正一次,最小阈值只有 1 度,看到牛起跳再横移基本躲不掉;现在横移出预算就能让它扑空。六档为 12 / 16 / 20 / 30 / 40 / 45 度,侧向连跳(S 形蛇皮)的摆幅也被这个预算封顶。
  • 转得越多,加速越少:每次起跳的连跳加速度按 加速度 × (1 − θ / 90) 折算,θ 超过 90 按 90 算(不加速)。θ 是起跳改向角,也就是起跳前在地面的速度方向和这一跳方向的夹角;如果是落地后紧接着的那一跳,再加上上一跳在空中偏离起跳方向的最大角度。边蛇皮边追踪边加速、落地瞬间急转弯都不再是免费的。近战博弈里的后跳基本是掉头,折算后大多只剩跑速。
  • 冲锋前最后一跳:原先直接加满额连跳加速度,从跑动中起跳也能白拿一整份;现在和其他连跳同一套规则(第一跳按 ai_charger3_bhop_first_hop_ratio 折算,再按转角折算)。一跳够到冲锋距离的情况变少,更多时候要多跑一段。
  • 高档位速度上限:ai_charger3_bhop_max_speed 极限档(level5)600 → 500,音理档(level6)700 → 600。
  • 调试日志:Path / Direct 起跳日志里的 landing hop 以前恒为 0(在消费落地标记之后才读取),已修正;四种起跳的日志都会打印这一跳计入的转角和加速度折算系数。
  • 重新编译 ai_charger3.smx。

2026年9月22日 所有档位禁止 Smoker 在梯子上拉人

  • 修复 Neri 档 Smoker 可以在梯子上吐舌拉人、拉住后还一边拖人一边继续往上爬的问题。Neri 开启的 l4d_air_abilities_patch_neri 为了让 Smoker 能在空中吐舌、空中拉人,去掉了原版舌头两处“必须站在地面”的判断:CTongue::IsAbilityReadyToFire 的吐舌条件,以及 CTongue::OnUpdateAttachedToTargetState 里“离地就断舌”的处理。爬梯子同样不算站在地面,所以 Smoker 在梯子上也能吐舌,拉住之后舌头也不会断。原版拉人时靠 GetRunTopSpeed 把 Smoker 的移动速度压到 1 来定身,但爬梯用的是固定爬梯速度,不受这个限制,AI 的爬梯动作就接着执行,把人一路往上拖;l4d2_ai_ladder_boost 的爬梯加速又把这个速度放大了几倍。
  • 空拉是空拉,不是梯子拉:l4d_air_abilities_patch 现在不分档位、也不看 Neri 补丁是否开启,只要 Smoker 处于爬梯状态,舌头一律视为未就绪,AI 和真人都吐不出舌头;已经拉住人的 Smoker 一旦进入爬梯状态就立即松舌(走原版断舌同一个 ReleaseTongueVictim 流程,照常进入冷却)。原版虽然要求站在地面才能出舌,但刚攀上梯子底部、脚还贴着地面时仍算落地,这种情况现在也一并禁止。Neri 档的空中吐舌、空中拉人不受影响。
  • 拉人期间真正定身:原版所谓“拉住人不能动”,只是舌头伸出期间把 Smoker 的跑速上限压到 1、再去掉跳和蹲(CTerrorGameMovement::CheckParameters),前进键和移动输入都还在。上梯子只看有没有朝梯子方向的移动输入、离梯子是否在 2 个单位以内,所以 AI 走到梯子底下正要爬时在地面拉到人,寻路还在往梯子里顶,就会直接挂上梯子,按固定爬梯速度往上爬(原版会因为离地断舌,Neri 档则一路拖着人爬)。现在从舌头伸出到收回(m_tongueState 非 0,和原版定身用的是同一个判定),所有 Smoker 的移动键和移动输入都会被清掉,真正一动不动,根本挂不上梯子,这一口也不会因为强制松舌白白浪费;“拉着人上了梯子就松舌”保留作兜底。ai_smoker3 在这段时间里也不再连跳、不做空中速度修正,因为这两样是直接改速度,会绕开定身。
  • ai_smoker3_jump_pull 原来用“没有落地实体”来判断是否在空中,梯子上同样满足,AI 会在梯子上一直按吐舌键。现在排除爬梯状态。
  • l4d2_air_data.txt 新增 CTongue::IsAbilityReadyToFire 的 DHooks 函数定义;重新编译 l4d_air_abilities_patch.smx 和 ai_smoker3.smx(1.0.1.5)。

2026年9月22日 Tank 换目标放宽、被喷降权、通背拳不补刀倒地(ai_tank3 2.2.0)

  • 修复 Tank 经常死追一个人、很难换目标的问题。原因叠了三层:一是寻路估距只在游戏调用 ChooseVictim 时顺带刷新、每次只刷一个人,走近的生还者还顶着之前更远的估距;二是估距直接取命中档的上限,1.15 倍档和 1.5 倍档之间一跳就差 30%;三是为了压住这些噪声,换目标门槛定得很高(得分低 25% 且至少低 150、间隔 2 秒),生还者挤在一两百单位内时基本换不动。
  • 估距改为在 OnPlayerRunCmd 里独立刷新:每只 Tank 每 0.5 秒轮到每个生还者一次(走不到的 1 秒),全插件每 tick 最多算一个人;命中分档后在“上一档走不通、这一档走得通”的区间里再二分到 64 单位以内取中点。得分 = 当前直线距离 × 绕路系数,两次刷新之间跟着实际距离实时变化。
  • 同一层换目标改为:新目标得分 ≤ 当前 × 0.85(ai_tank3_target_switch_ratio),且至少低 75(新增 ai_tank3_target_switch_gain),距上次换目标 1 秒(ai_tank3_target_commit_time);新目标得分不到当前一半时不等这 1 秒(新增 ai_tank3_target_decisive_ratio,0 关闭)。75 大于两人估距误差之和的上限 64,估距噪声不会自己触发换目标;梯子窗口和爬梯期间照旧冻结。
  • 被 Boomer 喷到的生还者,选目标得分倍率从 1.25 提到 2.0。同样的寻路距离下 Tank 会绕开被喷的人,只有附近实在没有别人时才追。
  • 说明一下口径差异:l4d_target_override 的 Tank 条目是 order 1,2 加 voms2 0,被喷的人在候选阶段就被整个挡掉,order 2 其实永远匹配不到;插件这边保留为软性降权,避免身边只剩被喷的人时 Tank 站着发呆。
  • docs/ai_tank3_scenarios_2026-09-14.html 不再标注为历史对照:“高台上的人 vs 地面上的人”情景和选目标计算器改按 2.2.0 的规则计算(估距二分、被喷 ×2,四个换目标 cvar 可以在页面上直接改),其余情景仍按 2.0 的判定绘制,“同一层空地追人”“前方是高台边沿”两张补注了 2.1 的变化;同时修正 1.x 对照里被喷生还者的描述(voms2 0 在候选阶段就把人挡掉,轮不到 order 2)。当前参数见 docs/annehappy_dynamic_ai_difficulty.md。
  • 通背拳不再给倒地/挂边的人补刀:范围内还有人站着时,额外的 SweepFist 只扫站着的,周围全倒了才照常扫。原来这段循环只判断“活着、看得见、128 以内”,Tank 站定打一个人时,脚边倒地的队友每一拳都要白挨一次,几拳就被打死(1.x 同一段循环也是这样)。
  • 重新编译 ai_tank3.smx。

2026年9月19日 修复跳舞时有人开安全门导致卡死

  • 修复跳舞期间别人离开安全区/打开安全门后,跳舞的人回不了正常状态、开不了枪也做不了任何操作的问题。跳舞开始时 fornite_l4d 会把 m_hActiveWeapon 置为 -1 并记下原武器实体,而 l4d2_med_dynamic 在 player_left_start_area 时会给每个生还者删掉旧医疗包再发新的。被删掉的正好是跳舞者藏起来的那把时,WeaponUnblock() 的实体引用已失效,判断直接跳过,m_hActiveWeapon 就永远停在 -1。
  • fornite_l4d 现在用 EventHookMode_Pre 挂 player_left_start_area 和 door_open(仅安全门),抢在发放物品的 Post 处理之前让所有人结束跳舞。
  • 跳舞开始时除了武器实体,还记下它所在的槽位。WeaponUnblock() 的兜底顺序改为:原武器实体 → 原槽位上现在的武器 → 身上任意一把(只在手上确实空着时),这样拿医疗包跳舞的人恢复后手上还是医疗包,不会被切成主武器。恢复时一并清掉 m_flNextAttack / m_flNextPrimaryAttack / m_bInReload,避免直接改写 m_hActiveWeapon 后仍然打不出子弹。
  • StopEmote() 原来只在舞蹈实体仍然有效时才恢复视角、武器和 MOVETYPE_WALK,实体先一步消失就只清标志位不恢复状态;TerminateEmote()(round_start、进服、断线都会走)则完全没有恢复移动方式。两者现在统一调用新增的 RestoreEmoteState(),无论舞蹈实体在不在都会解除父实体、复原视角、武器和移动方式。
  • 增加兜底自愈:OnPlayerRunCmd 发现玩家已经不在跳舞但状态没还原时立即补恢复,卡住的玩家不需要等到死亡或换关。
  • 重新编译 fornite_l4d.smx。

2026年9月19日 修复 1vht 命中率统计时有时无

  • 1v1_skeetstats 的开火计数依赖 player_left_start_area 事件置位的 bPlayerLeftStartArea,而每次 round_start 都会把它清零。该事件漏发、或者出安全屋之后再来一次 round_start,整局的开火数就一直是 0,准确度那一行只输出"没开枪",而不受这个门禁限制的击杀数、空爆数却照常显示。现在改用 left4dhooks 的 L4D_HasAnySurvivorLeftSafeArea() 直接问 director,并补上 L4D_OnFirstSurvivorLeftSafeArea_Post。
  • 修复命中率可能超过 100% 的问题:player_hurt 里的命中不受上述门禁限制,weapon_fire 里的开火却受限制。现在两边用同一个条件。
  • iClientPlaying 原来只在 round_start 和 player_left_start_area 赋值,中途接手生还者位置的玩家不会被统计,GetCurrentSurvivor() 还可能选到占位的 bot。现在按需重新解析并跳过 bot。
  • 1vht 跑在 versus 下且 versus_round_restarttimer 2,round_start 会赶在延迟 3 秒的报告之前清空所有计数器,导致整段统计打印成 0 或者干脆不打印。现在在 round_end 先把数据快照下来再打印,延迟同时缩短到 2 秒。
  • 重新编译 1v1_skeetstats.smx。

2026年9月19日 修复 Hunter 空中凭空转向

  • 修复 Hunter 在飞扑途中可以反复重新起扑、凭空改变方向的问题。高难度档把 z_lunge_interval、z_lunge_cooldown、z_pounce_crouch_delay 归零并启用 l4d2_hunter_patch_crouch_pounce 2 之后,AI 会在空中逐 tick 重新起扑,引擎用新向量覆盖当前速度。现在 ai_hunter_2 和 ai_hunter_new 在飞扑途中都会屏蔽攻击键。
  • ai_hunter_2 的 angleLunge() 按“当前位置 → 目标当前位置”整条重算飞扑向量,一旦在空中被触发就会让 Hunter 重新瞄准并拿到一条满速新向量。现在只有刚从地面起扑(离地 0.25 秒以内)才允许改写 m_queuedLunge,ai_hunter_new 同样处理。
  • 修复 ai_hunter_2 算出 ignoreCrouch 却从未使用的问题:l4d2_hunter_patch_crouch_pounce 2 时 Hunter 不会下蹲,原本会让无视野起扑排队和飞扑前挠人完全不触发。
  • 重新编译 ai_hunter_2.smx 和 ai_hunter_new.smx。

2026年9月17日 Tank 追人转向门槛恢复

  • 将 ai_tank3_airvec_modify_degree 六档恢复为 60 / 55 / 50 / 45 / 45 / 45°,ai_tank3_airvec_modify_degree_max 全档恢复 135°;插件默认值恢复 45° / 135°。
  • 实际允许的方向偏差仍由共享移动代码限制在 89°以内;保留从 1° 开始的路径跟随、空中路径续接、左右连跳、安全下落和石头保护分档。
  • 同步 3D 演示和参数说明,重新编译 ai_tank3.smx。

2026年9月17日 Charger 主动破门(ai_charger3 1.0.1.16)

  • 修复普通门挡住目标视野后,Charger 贴门卡住、不主动挥拳的问题。地面低速受阻时,在爪击射程内沿移动方向检测普通门,并优先用正常挥拳破门。
  • 保留墙体、玩家及其他实体的遮挡;跳过安全门、不可破坏门,以及空中、梯子、硬直、冲锋和控人状态。
  • 增加破门行为回归检查;重新编译 ai_charger3.smx。

2026年9月16日 Tank 石头出手保护(l4d_rock_lagcomp 2.1-anne)

  • 石头实际出手后的无敌时间按简单 / 普通 / 困难 / 专家 / 极限 / 音理六档设为 0 / 0.05 / 0.10 / 0.15 / 0.20 / 0.25 秒,随动态难度配置应用;保护针对石头实体,AI 与玩家 Tank 通用。
  • 新增 sm_rock_release_godframes(默认 0.15,设为 0 恢复出手即能打碎)。原 sm_rock_godframes 1.7 仍只负责出手回调缺失时从实体生成开始计时的兜底,两个计时独立;半透明提示与实际保护同步。
  • 计时边界回归检查通过;重新编译 Anne 版 l4d_rock_lagcomp.smx。

2026年9月16日 Tank 安全下落连续跳跃

  • 路径明确且落差不超过 256 单位的普通下落,安全检查通过后不再提前减速停跳,改为保速跃出、惯性下落、落地立即续跳并获得完整连跳推力。
  • 按实际落差计算更长的滞空时间,检查全程墙体/顶棚和落点四角支撑;边沿不主动蛇形或跳砖,更深落差、梯子、跳跃间隙及不安全路线仍保留限制。
  • 更新 3D 对比演示,保留 2.0 的提前减速处理;移动回归检查通过,重新编译 ai_tank3.smx。

2026年9月15日 Tank 空中跟随与左右连跳(ai_tank3 2.1.0)

  • 空中每 0.05 秒刷新安全路径前瞻,飞过旧点后继续跟随下一段;追人修正门槛六档降为 10 / 8 / 6 / 5 / 4 / 3°,路径跟随从 1° 开始,保留平滑转向与 89° 上限。
  • 恢复原生左右按键的侧向推力;新增距离目标 600 以外的主动左右连跳,六档偏角为 8 / 10 / 12 / 15 / 18 / 20°,首跳随机方向,确认落地后逐跳换边。偏角设为 0 可关闭。
  • 侧跳仅用于可视、同层、路径支持的安全直追;近身、拐弯或侧路受阻时回到正常追踪。转向前按脚下地面和剩余滞空时间,用实际碰撞体分段检查抛物线上的墙体/顶棚,并检查断层及特殊路径段,保留梯子让行、速度上限与落地加速规则。
  • 重新编译 ai_tank3.smx;增加移动逻辑回归检查,覆盖小角度横移、路径续接、侧向受阻回退、左右交替与地形拒绝。

2026年9月15日 AI 行为审核修复

  • Spitter 的补吐记录在首次落地时立即消费;失去视野、技能未就绪或进入其他提前返回分支时直接丢弃,不再跨到下一跳自动吐痰。
  • Tank 的路径前瞻探测改为每只每 tick 独立最多 3 次,并沿路径从近到远检查;遇到遮挡或预算耗尽时保留已确认可达的点,避免远处弯道或其他 Tank 耗尽预算后丢失连跳路径。
  • 重新编译:ai_spitter_3.smx、ai_tank3.smx。

2026年9月15日 Spitter 落地补吐(ai_spitter_3 3.0.11)

  • 现象:简单~专家四档的 AI Spitter 几乎吐不出痰,看起来像不会用技能。
  • 根因:ai_spitter3_air_spit 为 0 时,空中的 IN_ATTACK 是直接丢弃(不排队也不延后),能吐的只有 FL_ONGROUND 那一帧;而插件自己在 ai_SpitterBhopStartDistance(Anne 三套配置里是 2500)以内每次落地立刻再起跳,z_spit_range 远小于这个值,吐痰射程整个包在连跳半径里面。一跳滞空 sqrt(2 × 56 / sv_gravity) × 2,TickrateFixes 把 sv_gravity 锁在 750,约 0.77 秒;100 tick 下就是 77 帧滞空 + 1 帧落地,地面帧占比约 1/78。等于 98% 以上的帧攻击键被清掉,剩下不到 2% 还得正好撞上 AI 的出手时机。极限/音理档没这个问题,是因为空吐开着,走的是 buttons |= IN_JUMP 的跳吐分支,根本不判断地面。
  • 落地补吐:空中被清掉的那一口记下时间(SPIT_OWE_TTL 1 秒,比一跳滞空稍长,只认当前这一跳欠下的),落地第一帧如果还看得见目标、技能也还能放,就由插件补按攻击并跳过这一帧的起跳。只停这一帧,下一帧照常连跳——离落地才 1 tick,仍在 0.15 秒的落地推力窗口内,连跳链不断、推力照拿满。补按用的是 AI 自己的视角:函数开头 if (buttons & (IN_ATTACK | IN_ATTACK2)) AIPathMovement_Reset(spitter); 已经关掉了这一跳的路径修正,AlignFacing 不会再改朝向,插件只替它按键、不替它瞄。
  • 吐完立刻恢复连跳:地面那条攻击分支原来只要 IN_ATTACK 按着就抹掉 IN_JUMP,AI 按住不放时 Spitter 会一直黏在地上。现在用 spitReadyToFire()(m_nextActivationTimer 的时间戳已过)做条件:只有痰还没放出去时才压住起跳,已经进前摇或冷却就不再理会按键,照常连跳。
  • 不加 cvar、不分档:这是修 bug,不是削弱。极限与音理档 ai_spitter3_air_spit 为 1,走原来的跳吐分支,行为不变。
  • 重新编译:ai_spitter_3.smx。

2026年9月9日 zonemod_anne 去掉会挡特感的新增 stripper 实体

  • zonemod 上游用 stripper add: 补 clip、blocker、实心模型和梯子。Anne 没有跟着改对应 nav,特感仍按旧网格走,会撞上这些新实体卡住。
  • 只动三方图:从 cfg/stripper/zonemod_anne 去掉这些图上 2026 年 5 月同步 zonemod 之后新加的梯子/实心模型等会挡特感的几何,包括 City 17、No Echo m3、Carried Off、Dark Carnival Remix、Parish Overgrowth 等。官图 c1–c14 的 nav 已经过完,stripper 几何 add: 全部还原,不改。env_physics_blocker 和 env_player_blocker 都保留,并把 BlockType 改成只挡生还(1)。
  • 三方图仍保留 filter/modify、道具/药包 add:、nav_fixes 的 logic_auto,以及更早已经在 anne 里的 clip。以后同步三方图时,没有对应 nav 就不要再复制梯子/实心模型这类会挡特感的 add:。

2026年9月9日 Charger 连跳分档削弱(仅配置,无插件改动)

  • 为什么只动连跳:牛的跑速和生还者一样是 220,它能不能压到人身上完全靠连跳。所以连跳参数就是牛的压制力本身,而且这一整套都只改「怎么跳」,不改「跳不跳」——牛看起来仍然在主动扑人,只是更好打、更容易被躲开,不会变成站着发呆的傻牛。全部改动都在 dynamic_ai_difficulty.cfg 六档里,插件源码和 smx 行为不变,音理档(level6)的取值全部等于插件默认值,与改动前完全一致。
  • 侧向连跳(性价比最高的一项):ai_charger3_bhop_strafe_mindeg / maxdeg 六档 8~18 / 14~28 / 20~38 / 25~46 / 28~52 / 30~55 度。振幅是 tan(random(mindeg, maxdeg)),30~55 度对应 0.58~1.43,压到 8~18 度只剩 0.14~0.32,牛的进场路线基本变成直线。它一点没变慢,只是不再靠 S 形蛇皮躲枪线,枪法好的人在它进场路上就能打死它。配合 ai_charger3_bhop_strafe_mindist 六档 800 / 700 / 600 / 500 / 420 / 400,低档位等于「只有很远才蛇皮,进了 800 就直线冲」。
  • 停止连跳的距离:ai_charger3_bhop_min_dist 六档 170 / 150 / 130 / 115 / 105 / 100,小于该值退出 APPROACH 进 BAIT,也就是不再连跳。这里要注意 CHARGE_GUARANTEED_MAX_DIST(110)已经封住了保命中下限,调大它不会让牛在 170 距离开冲,只会让最后 60 单位改用 220 跑速走完——玩家因此拿到一段看得见的助跑时间,而不是被一跳怼脸。
  • 无视野连跳:ai_charger3_bhop_no_vision 六档 0 / 1 / 1 / 1 / 1 / 1,ai_charger3_bhop_nvis_maxang 六档 35 / 35 / 50 / 65 / 80 / 90。简单档要求牛先看见目标才能起跳提速;无视野时 executeGroundBhop 直接返回,回退到原生地面移动,不会卡状态机。去掉的是「从看不见的拐角后面用 400 速突然窜出来」,牛的爆发现在是被看见之后才开始的。
  • 空中转向:ai_charger3_airvec_modify_min_deg / max_deg 六档 65~70 / 60~74 / 55~78 / 50~83 / 47~89 / 45~89 度。方向修正只在这个角度带内生效,抬高 min = 小幅走位它不跟,压低 max = 偏差太大直接放弃。简单档只剩 65~70 度这条很窄的带,等于起跳之后基本按原方向飞完,落点更容易被走位躲掉。侧向连跳回归路径用的是 AIR_CORRECTION_MIN_TARGET_DEG(1.0)而不是这个 min,S 形曲线本身不受影响。
  • 速度轴顺手再收一档:ai_ChagrerBhopSpeed 30/40/50/60/80 → 20/30/42/55/70,ai_charger3_bhop_max_speed 400/400/400/500/700 → 330/360/390/450/600,ai_charger3_bhop_first_hop_ratio 0.2/0.3/0.4/0.5/0.6 → 0.0/0.15/0.3/0.45/0.55。简单档第一跳给 0 表示从跑动直接起跳只改方向不加速。音理档三项均不变。
  • 没有动的:ai_charger3_bhop_before_charge(冲锋前最后一跳)全档保持 1。关掉之后 CHARGING 在 (commitDist, bhopMinDist + 50] 的容差带里会退回 APPROACH,有 APPROACH ↔ CHARGING 反复横跳的观感风险,而收益只是开冲距离从约 150 压到约 110,不值。想再削一档可以先拿它试。
  • 无需重新编译。

2026年9月8日 Charger 近战后跳正常化(ai_charger3 1.0.1.15)

  • 现象:连跳接近拿近战的生还者时,牛会在空中突然减速停住再竖直掉下来;落地后跳的速度也对不上,普通玩家做不出那种后跳。
  • 空中急停:Approach 进近战博弈区、以及 Bait 里非后跳的空中帧,会把水平速度 TeleportEntity 清零,只留下落。玩家做不到空中把 400 速瞬间抹掉,所以看起来像物理学不存在。现在这两处都不清水平速度,这一跳按动量落地,落地后再后跳。
  • 后跳速度:原先按生还者追速 × 1.2 叠在跑速上,一跳就能到 400+。改成和 Path / Direct 连跳同一套:已有的远离分量留下,朝目标飞来的速度转身时丢掉,再加落地加速度,并用连跳上限封顶。
  • 重新编译:ai_charger3.smx。

2026年9月8日 Charger 近战博弈抽搐与无限对峙修复(ai_charger3 1.0.1.14)

  • 现象:牛残血、生还者手持近战时,牛在博弈带里「按一下马上停止、按一下马上停止」地抽搐,而且可以无限对峙下去。
  • 抽搐的直接原因:maintainMeleeBaitDistance 是个 bang-bang 控制器——dist < baitZoneMin 满速后退、dist > baitZoneMax 满速前进、中间 35 单位死区每帧 TeleportEntity 把水平速度硬清零。误差 1 单位和 30 单位都用 runTopSpeed,牛 3~5 个 tick 就穿过整条带,于是稳定收敛成「全速蹦出去 → 速度瞬间归零 → 玩家逼一步 → 再蹦」。
  • 距离控制改为迟滞 + 比例 + 最短驻留:一旦开始移动就走到博弈带中心才松手(方向翻转要跨半个带宽);速度按到带中心的误差线性缩放,误差达到 BAIT_MOVE_SPEED_RAMP 才用满速,下限 35%;同一方向至少维持 BAIT_MOVE_HOLD_TIME(0.25 秒)。
  • 死区内不再硬清零,改为逐帧 0.7 衰减,观感上是滑停而不是卡停。
  • 后跳落地后加 0.45 秒锁定,期间不允许距离控制立刻掉头前进,堵掉「后跳出去 → 落地即前进 → 又太近 → 再后跳」的每帧互搏。
  • 紧急后跳阈值倒挂:紧急线原来写死 melee_range + 20(90),落在了博弈带(85–120)内部——博弈带最里面 5 个单位永远处于「紧急」状态,死区在那一段被紧急后跳直接压过,牛刚退到 85 就立刻又被判定要后跳。现在紧急线压到博弈带内侧(melee_range + min(20, baitZoneMinRange × 0.5) = 77.5),整条 35 单位的博弈带才真正可以站住。
  • 兜底强冲从来没生效:isTargetVulnerable 里那条 ai_charger3_bait_max_duration(7 秒)兜底挂在 Bait 状态的 getStateDuration 上,而状态 startTime 每次 transitionTo 都会重置——后跳一次就飞出 Bait 退出线,走一轮 Bait → Approach → Bait 就把计时清零,僵局因此可以无限持续。现在僵持计时改为绑定「目标 + 连续近战博弈」,只要两次近战博弈间隔小于 2 秒就继续累加,Approach ↔ Bait 的来回抖动不清零。
  • 残血牛的决策空间:shouldChargeInMeleeBait 的三条路里,「血量高于近战斩杀线」这条在大削之后恒假,isTargetVulnerable 内部对近战目标嵌的又是同一个血量判断,只剩「玩家扭头」一条。isTargetVulnerable 里确实有一条通用的攻击间隔判断,但它对所有武器统一用「下次攻击 > 现在 + 0.5 秒」,可用窗口 = 武器挥击间隔 − 0.5 秒——挥击间隔越短窗口越窄,快速近战(挥击间隔 ≤ 0.5 秒)窗口直接是 0,一次都不会触发。现在新增一条抓挥空后摇,对近战目标单独用 0.2 秒阈值,每种近战都能留出实打实的窗口,残血牛也有一个凭本事进场的机会。
  • 僵持升级阶梯:超过 ai_charger3_bait_max_duration 后按 诱骗 → 强冲 → 换目标 逐级升级。诱骗是主动往里顶一下逼目标出刀(顶到紧急线就交回常规逻辑后跳拉开),把「进一步退一步」变成有节奏、有目的的假动作,目标挥空后由上一条抓后摇冲锋;诱骗次数用完就强冲——撞倒一个人再被砍死是划算的,站在原地抖不划算。技能在 CD 只是「现在还撞不了」,不算无解,不会因为 CD 就换人。
  • 新增 cvar:
  • ai_charger3_melee_bait_orbit(默认 1):博弈带内沿目标切向绕圈代替原地站定,把「原地抽搐」变成「绕着你转圈找机会」;绕圈方向被墙挡住会换向重试,两个方向都不安全时老实站住而不是把控制权交回原生寻路(交回去 PathFollower 会直接把牛往人身上送,反而更抖)。设 0 恢复原地站定。
  • ai_charger3_melee_bait_stalemate_switch(默认 0):僵持阶梯最后一级,技能就绪却依然撞不过去(高度不可达 / 冲锋路径被挡)时改打别人。默认关闭,先观察前面几项的观感再决定要不要开。
  • ai_charger3_melee_bait_blacklist_dur(默认 10.0):因僵持放弃某个目标后的选目标黑名单时长。没有这个黑名单,L4D2_OnChooseVictim 按距离会立刻把同一个近战玩家选回来(他往往就是最近的那个),换目标本身又变成新的抖动。黑名单只是偏好,极端情况下 getClosestSurvivorAndValid 不看黑名单,保证不会没有目标。
  • 重新编译:ai_charger3.smx。

2026年9月4日 刷点回退 Director 兜底修复(infected_control + anne_spawn_accel 1.5.0)

  • 问题:2026-09-02.1 上线后大量特感改走 Director API 兜底、刷点散。云8/云4 两台空服的 5% 矩阵 A/B 复现并定位:默认名额下差异不大(云8:1.24% vs 0.88%;云4:4/480 vs 0/480),但名额收紧到生产常见的"上一波活体还占着账本"的状态后立刻爆开——云8 SI_target_limit_manual 2 下 12.78% vs 基线 1.94%,云4 同配置 80/480(16.7%)vs 基线 0/480。单变量隔离:换回 target_override 2.27 反而更差(14.44%),只换回旧 infected_control 立刻回落到 2.22%——罪魁是 infected_control 新加的「待锁定预留」把名额瞬间扣光,SpawnAccel_CollectEligibleTeamTargets() 按容量硬剔 owner 直到集合为空,spawn_core.inc 在 owner 集合为空时静默返回 SpawnSearch_Exhausted(无日志、ownerCapacity 恒为 0),TryNormalSpawnOnce 每帧 band++,10 帧内走完全部 Nav 分层直接进 Director。inf_spawn_nav_band_timeout 那条 3 秒超时完全没参与。
  • 扩展 anne_spawn_accel 升级到 1.5.0:团队快照仍按完整队伍构建/缓存,但额外保留每名生还者一层有向距离场;新增 AnneSpawn_NavCandidatesCollectTeamEx(..., excludedClients, excludedCount),分页取候选时把已满的生还者传进去,扩展按"其余生还者里最近的那个"逐行重算距离与 owner,只被排除者可达的行直接跳过;排除集合变化不重建快照、不 Pending。全员都满时按无排除处理。Linux 32 位 .so 在 pve 上用 Docker(Ubuntu 22.04 + hl2sdk-l4d2 + SM 1.12 + AMBuild)构建,nav_graph_test 通过。首版构建动态链接了新 GCC 的 libgcc(需要 GCC_7.0.0 符号版本),srcds 强制使用 Valve 自带的老 bin/libgcc_s.so.1,真机 dlopen 失败且 sm exts unload/load 会静默复用常驻的 1.4.4 镜像——已在 AMBuilder 加 -static-libgcc 重建(新 .so 不再依赖 libgcc_s,readelf -V 无 GCC_*/GLIBCXX_* 需求);换扩展后必须用 sm exts info 核对版本,必要时重启容器。Windows .dll 未重编(老扩展下插件自动退回"不排除")。
  • infected_control.smx 升级到 2026-09-04.1:团队 owner 集合只看存活/可动,容量不再决定成员资格;排除列表在 EnsureCursor 时算好,变化只重新分页;热循环只跳过被显式排除的 owner,不再直接看 IsAtCapacity;IsAtCapacity 硬口径只看 target_override 真实账本,预留只进 ChooseTargetSurvivor 的加权(TTL 2.5→1.5 秒,且只对控制类职业记账);commit 不再让团队集合缓存失效;早退路径新增 [FIND EARLY-EXHAUSTED] 节流日志与计数。
  • 验证:云4(4 图 × 10 个进度点,12 SI)新版在默认名额与收紧名额下均为 480/480 Nav 直刷、0 次 Director,波次耗时均值 245ms(基线 249ms),线上版同配置 80 次 Director;云8 全量 1083 格(docs/infected_control_refactor/NAV_WAVE_MATRIX_20260904_TEAM_EXCLUDE_FULL.md)12984/12984 零缺失,Nav 99.445%,Director Range 118→72,[FIND EARLY-EXHAUSTED] 与 ownerCapacity 全程 0,均值 364.6→332.4ms。注意这两轮因上述装载问题实际都跑在扩展 1.4.4 上,验收的是插件侧修复在老扩展下的"不排除"退回路径。重建后的扩展 1.5.0 在云8 以临时文件名装载、正式路径覆盖后 docker restart 两次核对 sm exts info 均为 1.5.0(docs/infected_control_refactor/NAV_WAVE_MATRIX_20260904_TEAM_EXCLUDE_EXT150.md):名额收紧复现 480/480 Nav、0 Director(线上版同组 80/480),全量 1083 格 12906 Nav / 77 Director、均值 359.8ms,与 1.4.4 那轮在噪声范围内持平、相对 08-26 基线的收益全部保住。默认名额下每人容量 5、没人会满,排除列表恒为空,这份矩阵只能证明 1.5.0 无回归,量不出快路径收益;且 1.5.0 下被排除 owner 的候选在 native 内改归属,热循环 ownerCapacity 恒为 0 属正常,改看新增的 [TEAM EXCLUDE] 日志。测试后云4/云8 均已恢复生产文件(哈希核对)、cvar 复位。
  • 刷特时序(击杀阶段 + 独立 16 秒倒计时 + Anti-Bait)本次及 09-02 均未改动;体感"变成固定 24 秒"是远处兜底刷出的特感迟迟不死、提前启动条件达不到的副作用。
  • scripts/run_nav_wave_matrix.py:看守狗重启 srcds 后只重载 infected_control 和夹具、静默漏掉 SI_Target_limit/l4d_target_override(云8 首次全量因此作废重跑)。现在把这两个记为伴随插件:矩阵开始时在运行的,恢复时按加载顺序在 infected_control 之前重新加载。
  • 重新编译:infected_control.smx;重新构建:anne_spawn_accel.ext.2.l4d2.so(-static-libgcc)。

2026年9月3日 特感连跳第一跳加速度比例 + 梯顶误判修复

  • 新增「第一跳加速度比例」cvar:ai_charger3_bhop_first_hop_ratio、ai_tank3_bhop_first_hop_ratio、ai_BoomerBhopFirstHopRatio、ai_SpitterBhopFirstHopRatio,范围 0.0–1.0。从跑动直接起跳的第一跳拿到 加速度 × 比例,落地后紧接着的起跳仍拿完整加速度;0 即上一条的「第一跳不加速」,1 等于旧行为。共享 AIPathMovement_GetHopImpulse 增加可选参数 firstHopRatio,默认 0 保持兼容。
  • 为什么要这个旋钮:第一跳不加速造成的起链滞后 ≈ 0.75 秒 × (1 − 比例) × (连跳上限 − 跑速),与加速度大小无关,调 BhopSpeed / impulse 无法补偿;而高档上限更高,被削得反而最多(音理档 Charger 0.48 秒、Boomer 0.62 秒,简单档只有 0.28 / 0.53 秒),难度阶梯是反的。
  • 动态 AI 难度 dynamic_ai_difficulty.cfg 六档写入:Charger、Boomer、Spitter 统一 0.2 / 0.3 / 0.4 / 0.5 / 0.6 / 0.8,Tank 0 / 0.2 / 0.4 / 0.6 / 0.8 / 1.0(Tank 是被削最轻的职业,起链只多一跳,音理档直接保留旧的第一跳满加速)。修正后滞后随档位单调递减(音理档 Charger 0.10 秒、Tank 0 秒、Boomer 0.12 秒、Spitter 0.12 秒)。除 Tank 外顶档不给满 1.0,避免 Boomer / Spitter 250 推力的「第一跳突然加速」原样回来。插件默认值按音理档取 0.8 / 1.0 / 0.8 / 0.8,与这四个插件其余 cvar 默认值接近顶档的惯例一致。
  • 修复梯顶 dismount 误判落地:AIPathMovement_NotifyGrounded(client, onLadder) 记录上一次登记是否在梯子上;爬到梯顶时引擎有一小段既不在梯子也不在地面的 dismount,之后踩地不再算落地,爬完梯子后的第一跳不会白拿一份加速度。四个插件全部传入 onLadder。
  • ai_boomer_3 升级到 3.0.10:地面/梯子登记前移到 m_customAbility 无效的提前返回之前,否则那一帧漏登记会把站在地上的 Boomer 误判成滞空落地;round_start 同步重置连跳链。
  • ai_spitter_3 升级到 3.0.9:挂接 player_spawn 重置连跳链,与 Boomer / Charger 对齐。
  • ai_charger3 升级到 1.0.1.13、ai_tank3 升级到 1.0.0.13:Path / Direct / 博弈后跳(Charger)与普通 / Path 连跳(Tank)起跳后都调用 AIPathMovement_MarkHopStart 消费落地授权,与 Boomer / Spitter 一致。
  • 重新编译:ai_charger3.smx、ai_tank3.smx、ai_boomer_3.smx、ai_spitter_3.smx。

2026年9月3日 特感连跳第一跳不再加速

  • 定位:共享空中修正 ai_path_movement.inc 本身从不加速(只把速度托底到不高于起跳速度、转向还扣速),四只特感看起来「第一跳在空中突然提速」全部来自离地那一帧:Path / Direct 起跳直接把速度替换成 跑速 + 整份加速度(Charger 250→350,+40%;Boomer 175→325,+86%,且 ClientPush 还会把 ≤250 的速度硬抬到 251),而不是像人类连跳那样落地才涨。
  • ai_path_movement.inc 新增连跳链跟踪:AIPathMovement_NotifyGrounded 在地面或梯子上每帧尽早登记,离开地面至少 0.1 秒后重新踩地即记为一次落地——不区分插件起跳、引擎跳跃还是沿路径走下落差,高处坠落同样算落地且不设滞空上限,落下来带着的速度照常保留并在落地那跳追加加速度;AIPathMovement_GetHopImpulse 只在「落地后 0.15 秒内再起跳」时返回完整加速度,从地面直接起跳的第一跳返回 0,只改方向不加速;AIPathMovement_MarkHopStart 在每次起跳时消费掉落地授权(BeginPathHop 内自动调用),引擎拒跳后下一帧仍站在原地中间没有离地,不算落地,原地反复尝试起跳不会每帧白拿加速度。梯子按地面处理,爬完梯子之后的第一跳不加速。
  • ai_charger3 升级到 1.0.1.12:Path 与 Direct 地面起跳改用落地加速,冲锋前最后一跳登记起跳以便回到接近状态后接上链;新 Charger / 重生时重置连跳链。调试日志补上地面速度与是否落地跳。
  • ai_tank3 升级到 1.0.0.12:普通连跳(前/后/侧向冲量)与 Path 前瞻连跳同样改为落地加速;回合开始与进服时重置连跳链。
  • ai_boomer_3 升级到 3.0.9:推力改为落地追加;起跳速度先构造再统一用于路线检查与 Teleport(原来路线检查只看单独的推力向量,第一跳没有推力时会退化成零长度检查);251 最低连跳速度只在真正追加推力的那一跳兜底,不再借它给第一跳偷偷加速。
  • ai_spitter_3 升级到 3.0.8:推力改为落地追加,spitterDoBhop 直接写回已通过路线检查的起跳速度,不再在 Teleport 前重新算一份。
  • 四个插件的加速度 cvar 描述同步改为「落地后紧接着再起跳时追加,从跑动直接起跳的第一跳不加」。整条加速链只是整体后移一跳,上限、空中修正与转向损速逻辑不变。
  • 重新编译:ai_charger3.smx、ai_tank3.smx、ai_boomer_3.smx、ai_spitter_3.smx。

2026年9月2日 特感目标上限联动修复(infected_control / SI_Target_limit / l4d_target_override)

  • infected_control.smx 升级到 2026-09-02.1。修复跑男状态只在开启时通知外部的回归:跑男解除(归队、波次/回合重置、机关事件)时现在会发 OnDetectRushman(0),SI_Target_limit 不再在一次跑男之后整张图停留在「全体放开目标上限」。解除带确认窗口:新增 inf_antibait_runner_off_confirm(默认 2.3 秒),跑男只是回到判定阈值以内(差距缩小、队友靠近)需要持续满足这么久才解除,避免队友短暂追上又拉开时目标上限反复开关;跑男死亡/倒地/被控/掉线仍立即解除。波次重置不再单独清掉 gAB.runner 而留下 gST.bPickRushMan,两处跑男状态保持一致。
  • 刷特侧容量口径升级为「剩余名额」:刚刷出、还没跑过 ChooseVictim 的特感会按导向目标记一笔待锁定预留(账本登记或 2.5 秒后释放),同一帧连刷多只不再全部导向同一个人;随机选目标改为按剩余名额加权,队首 ×2 自然拿到更高权重。
  • 传送补位队列的职业若活体额度已被普通队列/内鬼预留占满,改为换成还有额度的职业继续补位;所有职业都满时整体退避 1 秒,不再逐帧空转。
  • SI_Target_limit.smx 升级到 1.9。新增 SI_target_rushman_scope(默认 1):跑男时只放开跑男本人的按人上限(SetTargetedCap),其余生还者保持正常保护;0 为旧行为(全体抬到特感总上限)。SI_target_enable 现在真正生效(关闭时清空 target_override 的 targeted 选项,所有 native 返回不限制)。上限重算改为算一次、推一次,不再对 66 个槽位各推一遍职业级选项;手动模式初始化也会推送。补齐 survivor_rescued / defibrillator_used / player_team / 生还者 player_spawn 触发点,并每秒校验一次:可动人数变化或 target_override 重载配置(sm_to_reload 会把 targeted 归零)导致的漂移自动纠正。infected_control 重载后不再重复挂钩 l4d_infected_limit;si_target_limit.inc 里的库名改为与 RegPluginLibrary 一致的小写。
  • l4d_target_override.smx 升级到 2.28。新增 ChooseVictim 的 post detour:pre 阶段把决定交回游戏时(type=1 视野内没人、职业未启用覆盖、forward 返回 Handled)也把引擎选中的受害者登记进 targeted 账本,GetValue(VALUE_INDEX_TOTAL) 不再系统性低估;SetLastVictim 登记的目标会保留 wait/dist 语义而不是下一次调用就丢掉重选;修复 forward 返回 Plugin_Handled 时 ArrayList 句柄泄漏。
  • 重新编译:infected_control.smx、SI_Target_limit.smx、l4d_target_override.smx。

2026年9月2日 spechud 坦克面板修复

  • spechud 升级到 3.10.1。坦克面板(tankhud)只发给旁观者和特感玩家,撤掉之前为 versus_coop 加的生还者接收分支;也去掉了试图用 CancelClientMenu 在转队时收回面板的代码——SourceMod 这个函数只清服务端状态、不会给客户端发包,radio 面板还是要等 3 秒超时自己消失,那段代码没有实际效果。
  • 修复 AI 坦克目标一直显示「搜索中」:原先只读 l4d_target_override 记录的受害者,但坦克实际改靶走的是 left4dhooks 的 L4D2_OnChooseVictim(ai_tank3、SI_Target_limit 都在这条通道上),target_override 里经常是空的。现在 spechud 自己监听 L4D2_OnChooseVictim 按 userid 缓存每只坦克最近选中的目标,target_override 有记录时仍然优先。
  • 坦克面板文案全部改走翻译文件,并按每个接收人的客户端语言逐个构建;服务器默认语言为 chi,未匹配语言的玩家看到中文。新增短语补齐 en/chi/zho/jp/ko/vi/es 七份 spechud.phrases.txt。
  • scripts/spcomp-docker.sh 改为 tar 流式把源码送到远端、smx 从 stdout 传回本地,不再依赖 bind mount。默认通过 SSH 在 pve-yma 主机上原生运行 spcomp64(SPCOMP_SSH_HOST 可改主机),SPCOMP_BACKEND=docker 切回 docker 容器;本地 Mac 无 docker daemon 也能编译。
  • 重新编译:spechud.smx。

2026年9月2日 Scripted HUD 显示语言菜单

  • l4d2_scripted_hud 升级到 1.7.0。!hud 菜单新增「语言」项,也可以直接用 !lang / !hudlang 打开,在「跟随游戏语言」、English、简体中文、繁體中文、日本語、한국어、Tiếng Việt 之间切换。菜单只列出 languages.cfg 里服务器真正认识的语言,缺的条目直接不显示,而不是选了没反应。
  • 选择按 SteamID 存进 scripted_hud_prefs 新列 lang_code,同时写一份独立 Cookie l4d2_scripted_hud_lang_v1,沿用其余 HUD 偏好那套 revision 合并规则,换服、重连、数据库暂时不可用都能接上。
  • 语言通过 SetClientLanguage 生效,所以 HUD、HUD 菜单,以及其他插件发给这名玩家的聊天翻译会一起切过去。SourceMod 在客户端改设置时会重新读一次 cl_language,因此每次构建该玩家的 HUD 时会顺带校验并重新写回这个覆盖值。
  • !hud 里的「恢复默认设置」不会重置语言——那一项决定的是菜单本身用什么语言显示,重置掉会让人读不回来;要还原用语言菜单里的「跟随游戏语言」。
  • 已知限制:HUD2 的模式标签([普通药役] 等)和 AI 难度名仍是全局共享的硬编码中文,不随这个设置切换。
  • docs/plugin_commands.md 补上 sm_hudlang / sm_lang 两条。
  • 重新编译:l4d2_scripted_hud.smx。

2026年9月1日 AI Smoker 速清冷却与逃跑修复

  • ai_smoker3 升级到 1.0.1.4。舌头命中后被砍断/速清时,Actions 扩展会结束残留的 SmokerTongueVictim,保留原生 SmokerRetreatToCover,并在回调栈外下达一个远离受害者的 Nav 移动命令;技能恢复后 RESET 回原生 AI。事件延后一帧确认 m_tongueVictim 已清空,不会把拉到面前转绞杀误判为速清。
  • Anne、硬核、喷子和 Alone 模式恢复加载 Zonemod 的 l4d2_tongue_timer.smx。生还者速清后的冷却至少 4 秒;Tank 伤害速清 Anne 系模式下调为 1 秒(Zonemod 上游仍为 8 秒),避免 AI Tank 的拳/石头误伤反而重罚自家 Smoker;拉空仍按 tongue_miss_delay,简单到专家 7 秒、极限/音理 3 秒,正常命中松舌仍为 tongue_hit_delay 13。
  • l4d2_tongue_timer 升级到 1.3-anne.1:按受害者记录实际拉人的 Smoker,Tank 速清不再误把 8 秒冷却加给场上第一只 Smoker;任一舌头松开也只清理对应关系,支持多 Smoker 同时拉人。
  • 重新编译:ai_smoker3.smx、l4d2_tongue_timer.smx。

2026年9月1日 Charger 先锤后撞按键与博弈修复

  • ai_charger3 升级到 1.0.1.11。持枪贴脸挥爪和围殴被控目标改回 IN_ATTACK2(左键是冲锋能力),原先按 IN_ATTACK 会罚站 2.5 秒一拳不出。
  • 持枪组合技只在目标没盯着自己、Charger 血量高于近战斩杀线、且对方没有换弹/推 CD 时才开锤,避免 500 血贴脸站桩挨枪。
  • 两锤预测改为只计算第二锤的 0.85 秒后撤;保命中冲锋下限钳在 110,横向速度 ≥ 150 时不再抬高 commit 距离。
  • 挥拳计数新增有效基线标志,m_flNextPrimaryAttack 初值为 0 或爪武器短暂不可用时也不会漏记第一拳;爪距属性装载失败时每图最多间隔重试 3 次,避免每帧重复 native 查询和刷 Left4DHooks 错误日志。
  • 重新编译:ai_charger3.smx。

2026年9月1日 2026-08 AI 平衡调整

  • ai_charger3 升级到 1.0.1.10。新增 Charger 专用 CVar ai_charger3_air_speed_floor_ratio(默认 0.50):Path / Direct 起跳时把空中方向修正登记的 hopSpeed 改为实际起跳速度乘此比例,m_flLastHopSpeed 仍保留真实起跳速度。
  • 动态难度六档削弱 Charger:加速度 30/40/50/60/80/100,上限 400/400/400/500/700/700,空中插值 0.10/0.15/0.20/0.25/0.30/0.40,转向损速 0.50/0.39/0.325/0.26/0.195/0.13,保速下限 0.50/0.60/0.65/0.70/0.80/0.80。简单档损速取现有硬上限 0.50。
  • ai_spitter_3 升级到 3.0.7。新增 ai_spitter3_air_spit(默认 0):仅极限与音理档为 1,允许 AI Spitter 空中吐痰;简单到专家禁止空中吐痰,地面吐痰照常且不会被插件带起跳。不限制玩家 Spitter。
  • Smoker tongue_fly_speed 六档全部显式为 1000(极限/音理由 1200 下调)。
  • 重新编译:ai_charger3.smx、ai_spitter_3.smx。

2026年8月31日 提交前审核修复

  • 补编译 ai_charger3.smx:此前产物停在 1.0.1.8,1.0.1.9 的「先锤后撞」、持枪保命中区 resolveChargeCommitDist、控制类上限改靶闸和连跳上限登记都没进二进制,跑的仍是已经删掉的概率冲锋逻辑。
  • 修 ai_boomer_3 / ai_spitter_3 推力归一化的除零:水平分量为零时(目标正上 / 正下方、视角俯仰 ±90)归一化会退化成纯垂直向量,等于把特感直接推上天——正是本次要修的「飞天」的另一条触发路径。新增共享的 AIPathMovement_NormalizeHorizontal(),零向量时跳过本次推力。
  • getChargerClawRange() 的缓存改为随换图失效,且读到越界值时不写缓存:原实现用函数内 static 永久缓存,若首次调用早于武器脚本装载,70.0 兜底值会被锁死到进程结束。
  • spechud 的 FillTankInfo 改用定长数组,去掉 HUD 绘制路径上每次构建面板都做的 new int[MaxClients] 堆分配。
  • sm_navtest 在目标生还者不可用时改用 GetTargetAnchorPos 兜底,不再拿候选点跟自己比高度(高度分恒为 0),顺带修掉 targetEye 未初始化。
  • 五个特感 AI 插件在 #include <si_target_limit> 之后补回 #define REQUIRE_PLUGIN,与 ai_tank3.sp 一致,把可选依赖限制在这一条 include 上。
  • si_target_limit.inc 传递包含 l4d_target_override 时保持调用方的 REQUIRE_PLUGIN 状态,避免第三方插件被静默塞进一条硬依赖。
  • 清理 infected_control.sp 中扇区系统删除后残留的 5 个无引用宏,并订正 PEN_LIMIT_SCALE_LO 的注释。
  • .gitignore 去重,并删掉已被 /test_results 覆盖的 9 条具体路径。
  • 补齐 anne_server_redirect 的 jp / ko / vi 三语翻译,与其余 Anne 插件的六语覆盖对齐。
  • 文档订正:README_SPAWN_ARCHITECTURE.md 的分散度两条、annehappy_dynamic_ai_difficulty.md 的反应时间行 / Tank 行 / 新增的两个连跳上限 cvar、ai_charger3/readme.md 里仍在描述概率冲锋的四处。顺带修正五档表里 Charger 连跳速度(旧文档写 45/60/75/90/150,配置实际是 40/50/60/70/100)。

2026年8月30日 AI 反应时间六档统一

  • dynamic_ai_difficulty.cfg 里 z_acquire_far_time / z_acquire_near_time 从简单到专家四档的 5.0 / 0.5 改为 0.0 / 0.0,与本来就是 0.0 / 0.0 的极限 / 音理档一致。目标锁定延迟不再作为难度轴,难度差异全部由各职业行为 cvar 表达。
  • 纯配置调整,无需重编译。docs/annehappy_dynamic_ai_difficulty.md 的「反应时间」行同步更新。

2026年8月30日 高特刷点排斥放宽

  • infected_control.smx 升级到 2026-08-30.1。高特时后半波容易被「生成后排斥」挤出近带:核密度把已经贴脸的存活特感也当成排斥源,且不随特感上限缩放;硬分散半径又按上限缩放,高特时反而收得更紧。
  • 距任意生还者不足 400 的存活特感不再计入核密度。特感上限缩放从分值挪到核半径上(inf_spawn_kernel_radius × 缩放系数):低特推得开、高特只防叠,避免高特时整条曲线一起压平而失去区分度;inf_spawn_kernel_points 默认从 30 提到 50。
  • 扇区分散轴整套删除(recentSectors、波内扇区配额、inf_spawn_sector_quota_bonus),方向偏好统一由连续战术几何分表达,分散度分只剩核密度一项。
  • 硬分散改为固定半径,不再随特感上限或波内占用缩放——这一条只回答「能不能刷在这」;inf_spawn_sep_radius 默认从 120 降到 100。波次时序契约不变。

2026年8月30日 Charger 持枪贴脸先锤后撞

  • ai_charger3 升级到 1.0.1.9。连跳进 ai_charger3_bhop_min_dist(默认 100)后,持枪目标视为保命中:不再概率等待,冲锋窗口也不再被压到 36–95。
  • 若爪击距离内两锤之内目标跑不掉,先锤两下再撞;锤不到、对方正在后撤、或锤击超过 2.5 秒,改为直接冲。霰弹仍是进 100 立刻撞。近战博弈不变。
  • 重新编译:ai_charger3.smx。

2026年8月30日 内鬼登记可取消与内鬼 Tank 移除

  • infected_control.smx 升级到 2026-08-30。新增 !itcancel(等价 !neiguicancel):波次释放前可随时取消内鬼登记;已有登记时再开 !it 菜单只显示「取消内鬼登记」项;取消后不再立即用 AI 补发该槽位。释放窗口已开启(SpawnAllowed)后不可取消,会提示登记窗口已关闭。
  • 内鬼类型移除 Tank:可选类型改由当前刷特池决定,Tank 不再可登记;inf_traitor_class_mask 的默认值与上限仍是 127(bit 64 保留只为回滚兼容,实际不会生效),z_max_player_zombies 不再为内鬼 Tank 预留额外槽位。
  • 内鬼可选类型改为与当前刷特池取交集:被 inf_*_limit 0 关闭的职业不可登记;allcharger / allhunter 模式下只能登记 Charger / Hunter。
  • inf_traitor_max_slots 生效值钳制为 l4d_infected_limit - 1,保证每波至少留一个 AI 刷特预算。内鬼自动连跳改由 OnPlayerRunCmd 通道处理(内部重构,行为不变)。usage 与菜单文案六语翻译同步更新。
  • 版本回滚配置 Anne26-07 / Anne25-11 / Anne25-10 补回 smart_ai_rock.smx 加载(此前 unloadall.cfg 卸载后回滚版本缺失 Tank 智能投石)。

2026年8月30日 Tank 各难度连跳上限下调

  • 动态 AI 难度中 ai_tank3_bhop_max_speed 各档整体下调 200 并封顶 800:简单 500、普通 600、困难 700、专家 800、极限 800(850 触顶);音理档保持 1000。纯配置调整(dynamic_ai_difficulty.cfg),无需重编译;插件默认值(不走动态难度时)维持 1000。

2026年8月29日 AI 特感 path 连跳「飞天大跳」修复

  • 修复 path 连跳偶发单跳飞出极远距离、像飞天一样的问题。根因有三:ai_spitter_3 / ai_boomer_3 的起跳推速是「叠加到当前速度」且完全没有上限,长直路连跳时每跳 +100/+150 无限滚雪球;共享空中修正以起跳速度为下限整段滞空保速,撞墙被引擎减速后还会拉回尖峰值;推力向量带垂直分量(Boomer 朝高处路径点、Spitter 沿视线俯仰),叠加跳跃本身的 Z 速度形成「飞天」。
  • ai_spitter_3 升级到 3.0.6,新增 ai_SpitterBhopMaxSpeed;ai_boomer_3 升级到 3.0.8,新增 ai_BoomerBhopMaxSpeed。叠加推速后按水平速度封顶,推力向量只保留水平分量,垂直高度交给跳跃本身;起跳安全检查使用的速度与实际推出的速度保持一致。
  • 两个新上限遵循「Charger 上限 +200」的规则:插件默认值 1000(= ai_charger3_bhop_max_speed 默认 800 + 200);动态 AI 难度 dynamic_ai_difficulty.cfg 六档分别写入 600 / 600 / 700 / 800 / 1000 / 1000(对应 Charger 每档 400 / 400 / 500 / 600 / 800 / 800)。
  • 共享模块 ai_path_movement.inc:AIPathMovement_BeginPathHop 新增最大速度参数,空中修正维持的速度不再超过各特感自己的连跳上限,外力推出的速度尖峰不会被整段滞空保持。
  • ai_smoker3 升级到 1.0.1.3、ai_tank3 升级到 1.0.0.11:起跳那一帧同样按 ai_smoker3_bhop_max_speed / ai_tank3_bhop_max_speed 限速(原来只在空中帧限速,起跳瞬间可超限)。ai_charger3 升级到 1.0.1.8,其地面/Direct 连跳原本已有封顶,本次把上限登记进共享空中修正。
  • 重新编译:ai_smoker3.smx、ai_boomer_3.smx、ai_spitter_3.smx、ai_tank3.smx、ai_charger3.smx。Jockey 每跳本就有 400+80 封顶、Hunter 无连跳逻辑,无需改动。

2026年8月30日 Jockey 被推抑制按 AI 难度分档

  • ai_JockeyShovedCooldown 接入动态 AI 难度:dynamic_ai_difficulty.cfg 六档分别为简单 3.0、普通 2.5、困难 2.0、专家 1.5、极限/音理 1.0 秒。切档由 annehappy_dynamic_ai_difficulty.smx 统一应用并在换档时恢复基线,不会残留。
  • 插件默认值 3.0 即简单档强度,未加载动态难度插件的模式自动落在最宽松档。

2026年8月29日 AI Jockey 被推抑制修复

  • ai_jockey_2.smx 升级到 2026.08.29。修复「推开猴子这一下反而武装惩罚分支」的漏洞:生还者最近一次挥推如果推中的是猴子自己,不再触发「推 CD 内直接扑」的惩罚加速;该机制只对真正浪费推(推空、推到其他特感)的生还者生效。
  • 被推抑制时长不再复用 z_jockey_leap_time(Anne 配置为 0.4 秒),新增独立 cvar ai_JockeyShovedCooldown(默认 3.0 秒,对齐对抗规则中被推 Jockey 的 jumpcap 封锁标准时长)。抑制期内插件不做任何连跳/扑跳增强,并压制原生 AI 的扑技能按键,防止 0.9 秒硬直一结束就空中二次扑;猴子仍可正常移动逃跑。jumpcap 补丁的 AI 豁免与硬直配置维持不变。

2026年8月28日 Scripted HUD 槽位按队伍显示

  • Scripted HUD 升级到 1.6.0。!hudmenu 每个槽位新增「显示队伍」子菜单,可任选生还/旁观/特感组合(至少保留一个),比如把某个槽位设成只在旁观时显示。选择随 Cookie 与数据库保存(scripted_hud_prefs 新增 slot_team_masks 列,自动迁移),旧偏好默认全部队伍显示。
  • 敏感内容源的队伍白名单从硬编码改为 cvar l4d2_scripted_hud_source_teams(格式 源:队伍掩码,位 1=旁观 2=生还 4=特感)。默认 2:5,7:5,13:5 与旧行为一致——特感血量、下一波倒计时、刷新队列仅旁观/特感可见;改成 13:1 之类即可收紧为仅旁观。菜单里的「(旁观/特感)」标签改为按实际配置动态生成,六语翻译同步补齐。
  • 被队伍限制隐藏的槽位不再向客户端下发文本(此前只是不渲染,字符串仍随网络数据传输);换队即时刷新可见性。

2026年8月29日 控制类特感独立目标上限

  • SI_Target_limit.smx 升级到 1.7:舌头 / 猎人 / 猴子 / 牛共用独立锁定上限,公式为「控制类预算 / 可动生还 + 1」。预算取已启用控制职业的 z_* / inf_* 上限之和,并钳在 l4d_infected_limit 内。Boomer / Spitter / Tank 不占这个池。
  • l4d_target_override.smx 升级到 2.26:新增 targeted_mask,计数只统计控制类锁定,避免 Boomer 占坑。队首 ×2 与跑男放开上限保持原语义。
  • Anne 各模式 shared_settings.cfg 显式写入 SI_enable_option 53。
  • l4d_target_override.smx 升级到 2.27:新增 L4D_TargetOverride_SetLastVictim,供各特感 AI 插件把 L4D2_OnChooseVictim 通道的改靶结果登记进同一份锁定计数;并修复 L4D_OnTargetOverride forward 改写目标后计数不同步的问题。
  • SI_Target_limit.smx 升级到 1.8:新增 IsClassTargetLimited native 与 sm_targetlimit_status 管理员调试命令;修复 1.7 源码更新注释提前闭合导致无法编译的问题。
  • 账本统一接入特感 AI:ai_hunter_2 / ai_jockey_2 / ai_charger3 改靶前尊重控制类上限(新目标已锁满则不换靶),ai_spitter_3 / ai_boomer_3 / ai_tank3 改靶后登记账本;ai_smoker3 不改写目标无需接入。
  • 人数自适应:公式在 4 人、5-8 人多人和单人残局下自动缩放——总容量恒为「控制类预算 + 可动生还人数」,永远大于场上控制类特感数;单人或少人时上限自动放开,不会出现特感找不到合法目标。
  • 版本回滚配置 Anne25-11 / Anne25-10 / Anne24-5 / Anne23-1 补回 SI_Target_limit.smx 加载(此前 unloadall.cfg 卸载后这些版本不再加载它,目标上限静默失效)。

2026年8月19日 Tank 骑头与爬梯掉落

  • ai_tank3 升级到 1.0.0.9。头顶卡拆成两类:站在 Tank 碰撞体上的骑头,以及够不着的高台停滞。
  • 骑头不再等 2 秒停步,也不再拉黑换人。挥拳时对骑头者额外向上 SweepFist;持续 3 秒仍在头上则原地强制投石,不再要求先拉开 250。近距离投石直接瞄向目标,避免弹道公式在水平距接近 0 时除零。骑头时禁止跳砖。
  • 高台停滞仍用 2 秒位移窗口。立案后有其他人则换目标(站着的优先,其次被控,再次倒地);没有替代目标时原地投石,不再对同一人 CommandABot RESET(这是爬同一架梯子再掉下来的主因之一)。梯子附近禁止 RESET。
  • Tank 在梯子上时把俯仰拉平,并按 m_climbableNormal 把朝向锁到梯子,减轻原版“爬梯时抬头看人然后掉下来”的循环。

2026年8月20日 Tank 骑头判定补嵌模型

  • ai_tank3 升级到 1.0.0.10。骑头仍以 m_hGroundEntity == Tank 为第一证据,避免把相邻高台/楼梯当成骑头。
  • 地面实体不是 Tank 时,改为「水平碰撞投影重叠 + 脚向下 hull 实际打到 Tank」,用来覆盖嵌进模型、地面仍是 world 的骑头,不再用中心射线没撞墙当证据。

2026年8月23日 帽子选项双层持久化

  • l4d_hats.smx 升级到 1.47.0:帽子型号、穿戴开关、第一人称看自己、第三人称看自己、显示其他玩家帽子五项均写入 clientprefs Cookie,不再受 l4d_hats_save 0 阻止读取。
  • rpg.smx 升级到 2.1.0:配置了 databases.cfg 的 rpg MySQL 时,以 RPG 表为主存储四项开关;MySQL 不可用或字段迁移失败时自动使用 clientprefs 的 SQLite 数据。旧账号仅在 Cookie 就绪后把 NULL 列迁移到 MySQL,避免默认值抢先覆盖。
  • 每个重建的帽子实体都会持续挂载按观察者过滤的 SetTransmit;隐藏其他玩家帽子的设置跨回合立即生效。新增幂等迁移 20260823_hat_preferences.sql,插件也会自动补齐相同字段。

2026年8月23日 公共音效库与全类型任选

  • l4d2_hitsound.smx 升级到 2.8.0。将套餐配置中的 25 个非空引用按实际路径去重为 22 个稳定公共音效 S01..S22,套餐 1/3 的三条重复音频只保留一份;下载与预缓存也按唯一声音处理。
  • 爆头、命中、击杀、爆头击杀四个单项菜单现在都显示完整公共音效库,任一声音均可用于任一事件并可即时试听。预设页直接显示四项实际映射,例如套餐 9 为 [头:S21 中:关 杀:关 爆杀:S22]。
  • 旧 DB/KV 的正数套餐来源无需迁移;新的公共选择用 -1..-127 保存,因此四个音效列必须为有符号整数。仓库默认 schema 已符合要求;20260823_hitsound_sound_catalog.sql 可幂等修正误建为 UNSIGNED 的生产表。

2026年8月23日 命中反馈单项音效重构

  • l4d2_hitsound.smx 升级到 2.7.0。音效套装改为“预设”:只应用该预设真实存在的成员,空成员自动关闭;套装 9 因此明确应用为爆头音与爆头击杀专用音,命中/击杀不再显示成已开启。
  • 普通玩家现在可分别选择爆头、命中、击杀和爆头击杀的实际声音来源;每页只列出对应样本非空的选项,选中后立即试听。爆头击杀 0 继续表示跟随普通爆头音。
  • 修复普通感染者 infected_hurt 扣血前事件导致最后一发额外播放命中音、管理员关闭单项却清空三项、偏好首载期间覆盖数据库、认证时序、快速连续保存乱序及动态总开关失效等问题;旧 DB/KV 值会在加载时规范化。本次重构不新增列;尚无 hitsound_stack_mode / hitsound_headkill 两列的数据库仍需执行既有的 20260820_hitsound_personal_prefs.sql 一次(可重复执行)。

2026年8月20日 命中反馈叮叮叮套装更接近老 killsound

  • l4d2_hitsound.smx 升级到 2.6.0。音效套装可选键收成三项:headshot_kill(爆头击杀专用音)、stack(同帧叠加/合并)、apply_special_only(选中时写入音效范围)。致死只由死亡事件播一声,不再为超杀补第二声;播放一律 SNDCHAN_AUTO。火、燃烧弹、DMG_DIRECT、爆炸和 weapon_id==0 的过滤不变。
  • 音效套装现在统一设置爆头、命中、击杀、爆头击杀四项;玩家也可将爆头击杀单独设为 0..N(0=回退普通爆头音)。该套装ID和播放模式写入 RPG 表,并从旧 SoundSelect.txt 一次性迁移。删除重复的「覆盖图标一键开关」及 sm_hitui,图标套装 0 即为关闭。
  • 套装 9「原叮投票插件」:爆头命中叮、爆头击杀钟、非爆头不响;选中后自动改为全部感染者。

2026年8月19日 Scripted HUD 恢复生还者「几特几秒」

  • Scripted HUD 升级到 1.5.1。1.4.2 把 HUD2 的「特感数量/间隔」和特感血量、下一波倒计时、刷新队列一起当成旁观/特感情报藏掉了。[N特M秒] 只是房间公开配置(和 hostname 同一项),不是场上情报。现在生还者重新显示该字段,并与内置 CS 击杀 HUD 共存:击杀列表仍只占用该玩家的引擎槽 8–14。
  • 特感血量、下一波倒计时、下一波刷新队列仍仅旁观/特感可见。

2026年8月19日 Anti-Bait 低血无药关断

  • infected_control.smx 升级到 2026-08-19.1。全体站立生还者实血都低于 inf_antibait_lowhp(默认 40),且存活队员都没有医疗包、电击器、止痛药或针时,Anti-Bait 整机进入 Paused:残局容错已经很低,不再拦波或加压。倒地血不计入实血。阈值设为 0 可关闭。

2026年8月15日 移除尸体溶解投票

  • 删除各模式菜单中的“开关击杀溶解尸体”投票,以及 cfg/vote/dissolve_on.cfg、cfg/vote/dissolve_off.cfg 配置。

2026年8月15日 Scripted HUD 内置 CS 击杀 HUD

  • Scripted HUD 升级到 1.5.0:删除独立的 l4d2_cs_kill_hud.smx 和旧 kill HUD 投票,CS 风格击杀列表改为内置功能。每位玩家默认关闭,可在 !hudmenu 中独立切换,不依赖服务器级开关。
  • 玩家开启击杀 HUD 后,SendProxy 只对该玩家接管引擎槽位 8–14(菜单显示为 HUD 9–15),这些槽位不再出现在该玩家的可配置槽位菜单中;关闭的玩家继续透传原生击杀列表,并保留自己的槽位配置。
  • !hudmenu 重构为 CS 击杀 HUD、核心 HUD(1–4)、扩展 HUD(5–8)、更多 HUD(9–15)、屏幕布局和 HUD 2 字段等分组;击杀 HUD 开关和槽位配置均按玩家保存。

2026年8月15日 Scripted HUD 下一波状态修复

  • infected_control.smx 升级到 2026-08-15.2,新增可区分击杀阶段、独立基础倒计时与 Anti-Bait 拦截的波次状态 native;旧 ETA native 保持兼容。
  • Scripted HUD 升级到 1.4.4:只在基础倒计时阶段显示精确秒数,击杀阶段与 Anti-Bait 拦截显示明确的六语状态;2026-07 及更老版本没有状态接口时显示 --,不再展示误差约 8 秒的估算值。

2026年8月15日 新玩家内鬼状态残留修复

  • infected_control.smx 升级到 2026-08-15.1:玩家进入服务器时显式清理其 client slot 的内鬼登记。即使上一位占用该 slot 的玩家断线清理未完成,新玩家也默认按非内鬼处理,join.smx 能正常将误入感染者队的玩家转回旁观;玩家之后正常登记内鬼不受影响。

2026年8月15日 Actions 炸服修复

  • 修复 actions.ext 销毁 Action 时把不存在的 user-data key 重新插入、且从不清理三组 Action 指针缓存的问题;Linux 扩展标记为 3.7.6-anne.2,销毁时改为真正移除 user-data、identity-data 与 actor 缓存。
  • 修复 Actions 方法传播在没有监听器时仍为每个 Action 创建空的 pre/post listener 哈希项、销毁时只清空内层表却保留 Action 指针键的问题;同时补齐候选 Action 的 pending 标记清理。
  • ai_charger3 升级到 1.0.1.7;ChargerEvade 的 CommandABot(MOVE) 延迟到下一帧执行,不再从 Actions OnUpdate 回调中同步重组 NextBot 行为树。

2026年8月14日 玩家可见文本六语对齐

  • !xx 状态行最后一项改为「版本」,不再误写成「电信服」;英语 Tank stall / HP return 与日语专家、连跳译名对齐。
  • 内鬼与 Anti-Bait 提示按源码语义区分守点、拦截中、放行;日/韩/越补全漏翻并统一内鬼译名。
  • 默认 Scripted HUD 玩家状态按客户端语言生成,表头「倒地」改为「倒地次数」。
  • 黑白 Hint 走短语,并写明再倒地即死;!ht 菜单补日/韩/越;技能播报中文职业名与内鬼/统计对齐。

2026年8月14日 网络质量上报以丢包为主

  • network_quality_hint.smx 升级到 1.1.5。网站异常事件以丢包为主:choke 未高于 nqh_report_choke_limit(默认 20%)不再上报异常;本地聊天提醒仍用 nqh_choke_limit(默认 5%)。
  • 异常事件原因:超时单独记 timing_out;其余优先记 loss,其次 ping,choke 仅在高于上报阈值时记录。

2026年8月13日 刷特分散度与职业多样性

  • infected_control.smx 升级到 2026-08-13.11:再压一档 Hunter / Jockey / Charger 后方生成。硬拒绝 -5→-4(inf_score_behind_reject_gap_hjc),落后扣分倍率 2.0→2.5;Flow 后锚收到 -4/-3。Hunter rear 0.15→0.05,Jockey 不再吃 rear。同进度点仍可评分。Smoker / Spitter / Boomer 与波次时序不变。
  • infected_control.smx 升级到 2026-08-13.10:继续压低 Hunter / Jockey / Charger 刷在生还者后方的几率。这三类后方硬拒绝从全局 -8 收到 -5(inf_score_behind_reject_gap_hjc),落后扣分按 inf_score_behind_hjc_scale(默认 2.0)加倍;Flow 曲线后锚从 -10/-9 收到 -5/-4,同进度点仍可评分。Hunter 战术质量减少 rear、改偏侧翼/边缘;Jockey rear 权重 0.15→0.05。Smoker / Spitter / Boomer 的全局后方规则不变。波次时序契约不变。
  • infected_control.smx 升级到 2026-08-13.9:硬分散再降一档。inf_spawn_sep_radius 150→120,inf_spawn_sep_ttl 2.5→1.5;同 Nav 冷却 NAV_CD_SECS 保持 1.0 秒。波次时序契约不变。
  • infected_control.smx 升级到 2026-08-13.8:Hunter 准备突袭距离略往外放。首选档 350–750 改为 350–850,距离甜点从环的 38%(约 500)改到 48%(约 590),仍落在中距带,不回到原来的 950 远点。牛 / Jockey 档位不变。波次时序契约不变。
  • infected_control.smx 升级到 2026-08-13.7:收一点分散度,避免牛 / Jockey / Hunter 经常落到过远的点。Hunter 首选档 350–950 收成 350–750,距离甜点从环的 45% 改到 38%(约 500),高点距离折减 0.90→0.95、高点补偿上限 800→450,减少“远处高台折算成中距”的远点。Jockey 首选档 250–700 收成 250–550,牛 250–600,甜点略前移;两者分散度权重 1.15/1.00→0.75/0.65。全局硬分散半径 180→150、核惩罚 40→30;评分名额近/中/远 6/4/2 改为 6/5/1。波次时序契约不变。
  • infected_control.smx 升级到 2026-08-13.6:距离档位从 10 档收回 6 档(stage 0 仍是完整首选区间,其后 5 档在首选上界与最远上界之间线性扩圈)。10 档时单环只有一两百单位,再切近/中/远没有区分度;6 档让每一环宽到三分位有明确距离含义。近/中/远改为按当前档搜索环(本档 scanMin..maxRange)三等分,不再用当前页 min/max,避免第一页只覆盖环的近端时把“近”再切成近中远。扇区配额仍是前 2/3 档受限(0..3)、后 1/3 放开(4..5)。波次时序契约不变。
  • infected_control.smx 升级到 2026-08-13.5:评分名额由“每 tick 先到先得的 8 个合格点”改为当前候选页按路径距离三分位分配 近 6 / 中 4 / 远 2(合计 12)。页内按 3:2:1 交错消费,三分位满额后跳过昂贵可见/路径检查;某一档没有剩余候选时名额溢出到其它档,避免空档拖慢出特。inf_spawn_nav_expensive_per_slice 默认 16→24,给满额 12 个评分点留出精判次数。CVar:inf_spawn_budget_near/mid/far(全 0 关闭三分位,退回整页名额+洗牌)。ranked 高点通道组内仍保序,只做三分位交错。波次时序契约不变。
  • 距离档位由 6 档细分为 10 档:各职业首选档(stage 0,如 Smoker 500–1200)保持不切分,避免刷点整体更贴脸;失败后的扩圈在首选上界与最远上界之间线性插值(Smoker 每档 +200 至 3000),每次升档只多扫一小环,距离升级更平滑,单环候选也更容易被一页洗牌完整覆盖。扇区配额相应改为“前 2/3 档受限、后 1/3 放开”。
  • 有向候选分页读取后页内洗牌(inf_spawn_candidate_shuffle,默认开):原实现按路径距离升序消费候选、每次尝试最多接受 8 个合格点,等于永远只在“最近的一小簇”里选优;洗牌后进入评分的候选覆盖整个距离带。ranked 高点通道不洗牌,保留其排序收益。
  • 硬分散参数 CVar 化并加强:inf_spawn_sep_radius(默认 180,原硬编码 80)与 inf_spawn_sep_ttl(默认 2.5 秒,原 0.5 秒),仍随特感上限缩放。
  • 分散度评分新增连续核密度惩罚:对存活特感与最近刷点按 exp(-d/r) 累加扣分(inf_spawn_kernel_radius 默认 280、inf_spawn_kernel_points 默认 40),弥补“只记最近 3 次扇区”的粗粒度记忆;扇区惩罚保留。
  • 新增波内扇区配额:单波单扇区落点数 ≤ ceil(特感上限/扇区数)+inf_spawn_sector_quota_bonus(默认 +1,设 -1 关闭);只约束前四个距离带,远带与导演兜底不受限,狭长地形不会因配额刷不出特感。
  • 高点优先改走扩展 ranked 有向候选:重新启用 inf_nav_high_sort_scale(新默认 Smoker 0.85 / Hunter 0.90),高于目标 inf_nav_high_sort_min_height(默认 64)以上的候选按折减距离前置进入有限的评分名额,高位点不再只能靠评分在近地面簇里“事后加分”。
  • 职业多样性:选类稀缺度加入 ±inf_class_scarcity_jitter(默认 0.06)的小幅随机抖动,打散占用率接近的职业之间的固定轮转;支援闸门(Boomer/Spitter 需先刷压制类)每波按 inf_support_gate_waive_prob(默认 0.15)随机放宽一波,Breach 波不参与放宽。
  • [SCORE-CHOSEN] 调试日志与 sm_navdebug 评分演算输出新增核密度项(kern)。

2026年8月13日 Scripted HUD 15 槽全开

  • extend/l4d2_scripted_hud.smx 升级到 1.4.0:L4D2 EMS 的 15 个引擎槽位全部可由玩家在 !hudmenu →「全部 15 个 HUD 槽位」里指定显示内容(服务器默认 / 未使用 / 生还者状态 / 特感血量 / 击杀统计 / 延迟 / 坦克伤害榜 / 队伍道具 / 下一波 / 速度 / 回合计时 / 女巫预警 / 进度坦克女巫 / 服务器状态)。
  • HUD 1–4 默认行为不变;槽位 5–8(引擎 4–7)默认隐藏,选内容后出现在左侧栏。槽位 9–15(引擎 8–14)默认透传引擎击杀列表;只有自己把内容绑到该槽时才会覆盖对应击杀行,并移到右侧下方以免挡住准星。
  • 偏好写入 Cookie 与 scripted_hud_prefs(hud_mask 扩为 smallint,新增 slot_sources;旧 6 段 Cookie 和 hud3/hud4 列仍可读取)。六语菜单/槽位名已补全。
  • 1.4.1:槽位坐标按屏幕比例排版。!hudmenu →「屏幕布局」可选 16:9 / 16:10 / 4:3 / 21:9。额外槽左侧 4–9、右侧 10–14 分行间距加大,避开 HUD1–4、击杀列表、准星和武器栏;4:3 收窄防右裁切,21:9 收到中间 16:9 安全区。每人通过 SendProxy 用自己的布局,不互相覆盖。
  • 1.4.2:特感血量、下一波倒计时、下一波刷新队列,以及 HUD2 的「特感数量/间隔」只给旁观和特感看,生还者整槽隐藏;菜单用「(旁观/特感)」标注。新增「下一波刷新队列」内容源,读取 infected_control 的 InfectedControl_GetSpawnQueue(旧插件显示 --)。同列额外槽按实际行数向下堆叠,额外槽最多 4 行、HUD3/4 最多 6 行,避免长文本互相重叠。

2026年8月13日 Scripted HUD 扩展内容源

  • extend/l4d2_scripted_hud.smx 升级到 1.3.0:HUD 3 / HUD 4 内容菜单新增六项,均可按槽位自选并写入 Cookie/数据库。
  • 坦克伤害榜:按本场对坦克伤害排序(最多 4 人,带百分比);坦克死后保留榜单直到下一场坦克,无坦克时显示“当前无坦克”。
  • 队伍道具:每位生还者一行压缩显示投掷物/医疗/临时补给(火/管/胆、包/电/燃/爆、药/针,空为 -)。
  • 下一波特感:读取 infected_control 的 GetNextSpawnTime native(插件未加载时显示 --),并附场上小特数/上限。
  • 速度/连跳:显示自己(旁观则跟随观察目标)的水平速度与本次连跳峰值;落地走稳约 0.25 秒后清峰值。
  • 回合计时+尸潮:从 round_start 起算 mm:ss;create_panic_event 的 60 秒滚动窗口内显示“进行中”,否则显示导演尸潮倒计时(L4D2CT_MobSpawnTimer)。
  • 女巫距离预警:最近一只女巫的米制距离与状态(静/近/警觉/激怒),15 米内标“近”;多只时另计剩余数量。全部新增短语走六语翻译。

2026年8月13日 Scripted HUD 自定义槽位与白框修复

  • extend/l4d2_scripted_hud.smx 升级到 1.2.0:HUD 3 / HUD 4 支持玩家自选显示内容,!hudmenu 新增“HUD 3/4 显示内容”子菜单,可在“跟随服务器默认 / 生还者状态 / 特感血量 / 击杀统计 / 玩家延迟”之间切换;选择写入 Cookie 与 scripted_hud_prefs 数据库(旧表自动 ALTER 迁移新列),跨服保留。
  • 特感血量页显示存活特感数/上限、每只小特(舌/胖/猎/口/猴/牛)的当前血量、Tank 当前/最大血量与女巫数量;击杀统计页按生还者统计本回合特感/普感击杀;延迟页列出真人玩家 ping(生还者优先)。全部文字走翻译短语(简中/繁中/英/日/韩/越)。
  • 加固“打开 hudmenu 时偶发三个白色描边空矩形”的问题:这类空框是 EMS 脚本 HUD 槽位在“可见但缺 NOBG/TEXT 标志”瞬态下画出的空背景面板。per-client flags 现在按服务器权威 flags 重建,ResetHUD 刷新窗口不再可能把 flags 清成 0 下发;地图开始时显式隐藏两个 HUD 插件都不用的 EMS 槽位 4–7,杜绝遗留槽位数据画空框。
  • HUD 面板高度按每位玩家实际文本行数个性化(新增 m_fScriptedHUDHeight sendproxy),多行自定义内容不再被裁切;l4d2_scripted_hud_hud3_team 默认从 2(仅感染者可见)改为 0(全体),生还者自选的 HUD 3 内容现在真正可见。
  • HUD 2 新增"团灭次数"字段:读取 server.smx 发布的 anne_round_wipe_count(当前地图团灭数,切图/通关清零),团灭 ≥1 次时在 HUD 2 末尾显示 [团灭xN],只进 HUD 不写入房间名;可在 !hudmenu → "HUD 2 显示字段" 单独开关。已保存过 HUD 2 偏好的老玩家该字段默认关闭,需在菜单中手动开启一次;新玩家默认开启。

2026年8月13日 server_name AI 难度标签残留

  • server_name.smx 升级到 1.4.8:[AI:专家] 这类房间名标签只在 annehappy_dynamic_ai_difficulty.smx 实际加载且已定档时显示。
  • 动态难度插件卸载后,SourceMod 会留下 ah_ai_dynamic_current_level;旧逻辑只要看到残留 1-6 档就会继续写进 hostname / sn_main_name。现在改为检测插件是否在跑,并清掉已经写进房间名的 [AI:...]。
  • annehappy_dynamic_ai_difficulty.smx 升级到 2026.08.13.1:注册 annehappy_dynamic_ai_difficulty 库,卸载时把 current_level / current_mode / current_ppm / current_locked 清回 0,避免 HUD、!xx 和刷特策略继续读到旧档位。

2026年8月13日 水中减速提示翻译

  • 修正 l4d2_slowdown_control 的 Tank 在场/离场水中减速聊天提示:英语不再使用中文直译(如 “tank generation”),越南语不再把 Tank 误译成“xe tăng”,日语两条提示的插件名也不再前后不一致。
  • 简中、繁中、英、日、韩、越六种语言统一为上游原意:Tank 在场时水中减速减弱,Tank 离场后恢复正常。

2026年8月13日 Anne Tank 刷新提示翻译

  • optional/AnneHappy/l4d2_tank_announce.smx 升级到 1.0.1.1:聊天、Hint、中央文字全部走 i18n;玩家/AI 前缀按客户端语言生成,英语玩家不再看到硬编码的“(玩家)”。
  • 英语不再使用中文直译(“has been generated / controller”),并补齐 Hint 短语;西语补上原先缺失的 Anne 专用条目。
  • 顺带统一对抗版 Spawned 短语的日/韩/越/繁中用词,Tank 专有名词保留。

2026年8月13日 l4d_stats 聊天栏 i18n

  • l4d_stats.smx 升级到 1.5.6:聊天栏剩余硬编码英文改为翻译短语,简中/繁中/英/日/韩/越 315 条短语已对齐;语言子目录不再只有地图记录那 13 条。
  • 特感击杀、舌头/猎人救援、秒牛救人、Tank 石击等公告按玩家语言显示职业名(如简中舌头/胖子/猎人/口水/猴子/牛/坦克/女巫),真人玩家仍显示其昵称。
  • 地图记录队伍回退名、控制台 [RANK] 前缀一并走 i18n;global_chat.smx 升级到 1.1.1,全服地图记录广播使用同一套队伍名翻译。

2026年8月13日 Survivor MVP 翻译

  • survivor_mvp.smx 升级到 0.3.4:回合 MVP/LVP、个人排名和机器人前缀不再写死中文,改为按客户端语言输出;英语玩家不会再看到“特感/小僵尸/友伤/[机器人]”。
  • 日/韩/越去掉把“特感、黑枪、药役”机翻成“特殊感觉、黑色枪、药品”的错误;西班牙语补上原先缺失的 Tag 与药役统计条目。

2026年8月13日 text 插件状态提示翻译

  • optional/AnneHappy/text.smx 的 !xx / 进服 / 回合开始状态行改为按客户端语言输出,不再向英语玩家打印“特感、连跳、动态难度、回血”等硬编码中文。
  • 英语不再使用“does not exceed 10 special”这类直译;日语不再把 AnneHappy 误译成“アンハッピー”。

2026年8月13日 全员新人组队加成

  • l4d_stats.smx 升级到 1.5.6:当场上真人幸存者都是新人且人数达到 4 人时,全员获得 1.5 倍新人组队加成,不再因为“新人本身不吃带新倍率”而谁都拿不到。
  • 1~3 名新人时仍维持原规则:只有非新人幸存者按 1.1 / 1.3 / 1.5 吃带新倍率。
  • 新增 l4d_stats_newbie_bonus_all_newbie_multiplier(默认 1.5)和 l4d_stats_newbie_bonus_all_newbie_min(默认 4);出门、过关和救援关提示按语言说明这是全员组队加成。

2026年8月13日 帽子/皮肤保存修复

  • l4d_hats.smx 升级到 1.46.1:新增 Hats_SetClientHat / Hats_GetClientHat native,RPG 回戴不再走 sm_hatclient 控制台命令。
  • 关闭帽子时 L4D_OnHatLoadSave 改为回传 -1,不再和第一顶帽子的 0 号索引冲突;Cookie 删除与自动回戴改为跟随帽子菜单权限(含前 100),并等待积分缓存就绪,避免把已保存帽子清掉。
  • rpg.smx 升级到 2.0.1:数据库加载完成后再回戴帽子、皮肤和轮廓;积分排行榜尚未就绪时不再把帽子/皮肤清成 0。
  • 第一顶帽子用 -2 存库,避免 HAT=0 既表示“没帽子”又表示“第一顶”;进服先选帽子再读到旧数据时,不会把刚选的帽子覆盖掉。
  • 皮肤存在同样的“数据库异步加载后不回戴、排行榜未就绪就清除”问题,已一并修复;称号、后坐力、伤害 HUD、命中音效等走各自加载完成回调或独立 Cookie/数据库,没有同样的回戴空洞。

2026年8月13日 网络质量上报

  • network_quality_hint.smx 升级到 1.1.4。插件源码仍默认 nqh_report_enable "0",本地 ping/loss/choke 检测不依赖上报;本仓库在 cfg/sourcemod/network_quality_hint.cfg 为网站白名单内的 Anne 游戏服显式打开上报。
  • 上报需要 SteamWorks。未安装 SteamWorks 时插件仍可加载并做本地提示,但不会向 nqh_report_url 发送数据。
  • 未进网站白名单的社区服请保持或改回 nqh_report_enable "0"。

2026年8月13日 命中反馈音效套装定制化

  • l4d2_hitsound.smx 音效套装新增两个可选配置键,用于自定义“何时响”:headshot_kill 为爆头击杀指定专用音效(留空则沿用 headshot 音,即旧行为);stack 控制该套装是否每个命中/击杀事件立即独立播放(可同帧叠加)。stack 缺省为 1(叠加),显式写 stack 0 才启用“同帧只播一条、击杀>爆头>命中”的优先级合并。
  • 套装 9“原叮投票插件”借此复刻老 killsound(Dingshot) 的触发手感:爆头命中=叮(littlereward)、爆头击杀=钟声(bell_normal)、非爆头命中/击杀不响;霰弹一枪多杀恢复逐次叮声叠加。
  • !snd 主菜单向所有玩家开放两项个人播放设置(仅存本服 KV,不入数据库):“爆头击杀专用音 开/关”(关闭时爆头击杀回退普通爆头音)与“音效播放模式”三态切换(跟随套装/强制叠加/强制合并),切换回执使用翻译短语(新增中/繁/英/日/韩/越 5 条短语)说明各模式含义。

2026年8月13日 AI3 特感插件审核修复

  • ai_tank3 升级到 1.0.0.8:OnPlayerRunCmd 现在聚合各子逻辑的返回值再返回,修复扔石头距离限制、反头顶卡强制投石与连跳跳跃按键修改被引擎丢弃的问题;挥拳锁视角改为统一使用 GameTime 时钟;投石出手高度改为按动画活动名解析而非依赖序列号与枚举数值巧合;tank_swing_range 变更钩子不再随换图重复挂载。
  • ai_charger3 升级到 1.0.1.6:修复状态机 transitionTo 中旧状态 OnExit 因先判断后读取而永远不会执行的问题,空中急停、后跳与人为冲锋延时标记现在会在状态切换时正确重置;player_spawn 事件改为 Post 钩子;梯子上清除跳/蹲输入后正确返回 Plugin_Changed。
  • ai_boomer_3 升级到 3.0.6:L4D_OnVomitedUpon 增加 attacker 有效性校验,修复胆汁弹等 attacker 为 0 的场景每次触发报错的问题;已存在转喷队列时不再重复构建,避免强喷递归导致目标重复膨胀;修复目标选择提前返回时的 trace 句柄泄漏与强制被喷循环中标错玩家的问题;最近生还者查询增加 0.2 秒缓存以降低每帧排序开销。
  • ai_spitter_3 升级到 3.0.4:修复“人多处”目标策略误用被控目标坐标(含 -1 索引报错)的复制粘贴错误;修复 getTargetByPriority 在有人被控或仅剩单人时的 ArrayList 句柄泄漏;场上仅剩 1 名生还者时也能正确按路程选为目标;人群目标累加距离前显式清零,移除条件恒假的射线过滤器死代码。
  • 射线开销优化:ai_path_movement.inc 新增起跳安全检查失败节流——因撞墙/断层/落点危险导致的检查失败在 0.1 秒冷却内不再重试,四个 AI 的地面起跳尝试统一接入,特感被地形卡住时的 hull/ray trace 开销降为原来的约 1/6(60 tick 下),多牛阵容收益最明显;AIPathMovement_IsJumpRouteSafe 将零射线的无视野角度拒绝提前到 hull trace 之前,被拒绝的尝试不再产生任何 trace。

2026年8月13日 infected_control 审计修复

  • infected_control.smx 升级到 2026-08-13.2,修复一轮全量代码审计发现的计数与状态问题;波次时序契约(击杀阶段、独立 16 秒基础倒计时、Anti-Bait 无上限保持)行为不变。
  • 修复特感存活计数双重统计:RecalcSiCapFromAlive 等全图清点现在跳过踢出队列中的临时实体,避免传送踢出期间职业/总量上限被提前打满。
  • 修复动态 Nav 拓扑(电梯等)重建后进度导出失败会让找位永远停在 Pending 的死锁;现在清除等待标记并回退旧版 Flow 分桶,导演兜底恢复可用。
  • 修复跨图缓存污染:生还者进度回退值与分桶存活特感计数缓存在回合/换图时复位,不再因新图 GetGameTime 回落而沿用上一张图的数据;构建分桶时泄漏的两个列表句柄已释放。
  • Nav 分桶磁盘缓存更健壮:元数据匹配但没有任何有效区域的残缺缓存会被删除并触发重建;导出失败时清理半截文件,避免下次误加载。
  • 修复传送监督两处问题:出生时间未知不再被当作永久出生宽限(看门狗硬恢复后的存活特感现在可以被正常传送,收编时会补盖出生时间戳);Smoker 技能未就绪期间照常累计隐身计时,就绪后即可传送,无需重新攒满秒数。
  • GetNextSpawnTime native 在击杀阶段返回“剩余检查窗口 + 完整基础倒计时”的上界估算,暂停时无记录也按冻结时钟继续估算,不再把击杀阶段耗时折算进基础倒计时。
  • Anti-Bait 状态机重设计:散开解除保持改为需要持续确认——新增 inf_antibait_spread_confirm(默认 3 秒),队形必须连续散开这么久才会从 Pressure 降级;“稍微走一步马上回来”的假走位不再能骗掉强化保持,散开也不再重置停滞时钟。武装窗口内重新集结且仍停滞的队伍会直接重返 Pressure,视作同一次保持的延续。
  • Anti-Bait 进度快照解耦:生还者 flow 读取失败(电梯、坏 Nav)不再被算作“脆弱成员”而错误阻止/解除保持,位置照常参与队形统计,仅进度统计跳过;flow 恢复可读时补建基线,同样不重置停滞时钟。
  • 内鬼实体化不再受 totalSI 上限限制:处于放行状态且已到释放波的内鬼(名额已在开波时从该波 AI 预算中扣除),即使残存 AI 暂时占满上限也可实体化,AI 补位在超编期间自动暂停。
  • create_panic_event 改为 60 秒滚动窗口:每收到新的 panic 事件即刷新,panic_event_finished 立即清除;防止三方图只发开始事件不发结束事件导致 Anti-Bait 整回合被静默旁路,连续/无限尸潮脚本会持续刷新窗口不受影响。
  • sm_wavestatus 与 Nav 调试命令回执改用翻译短语(新增中/繁/英/日/韩/越 12 条短语),不再硬编码中文。
  • 提前触发倒计时的“生还者健康 + 无 Tank”仁慈门控确认为有意设计,已写入 AGENTS.md 行为契约(连同散开确认与内鬼豁免语义)。

2026年8月10日 Boomer/Spitter Path Follow 连跳

  • anne_nextbot 原生扩展升级到 1.3.0,继续作为唯一的 PathFollower::Update detour,并在原生层直接复制有界路径节点值;Tank、Charger、Boomer、Spitter 统一通过 native 读取快照,SourcePawn 不再接收或读取 PathFollower/PathSegment 指针。公共路径签名与虚表偏移也统一收口到 anne_nextbot.games.txt。
  • Tank ai_tank3 升级到 1.0.0.4,Charger ai_charger3 升级到 1.0.1.4,既有路径连跳已接入同一 native 快照;各自 gamedata 只保留爪击、冲撞和 locomotion 等专用调用,不再重复维护公共 PathFollower 定义。
  • Boomer 升级为 ai_boomer_3.smx 3.0.4,Spitter 升级为 ai_spitter_3.smx 3.0.2;连跳会优先沿有效路径前视点前进,路径过期、被遮挡或前方存在攀爬/跳缝等特殊移动时自动保留原生 AI/直线行为。
  • 四个 AI 统一使用 ai_path_movement.inc 的滞空时间预测、墙体/落点/局部断层安全检查和渐进式空中速度修正;Charger 的冲锋、重寻路和侧向博弈仍由其状态机负责。
  • Boomer 在拐角等暂时失去直视的场景仍可依靠有效 PathFollower 路径继续接近,同时保留 26-07 AI2 的喷吐仰角修复。
  • 当前 2026-08 AnneHappy、Hardcore 和 Shotgun 配置加载 AI3;Anne26-07.cfg 继续加载未修改的 ai_boomer_2.smx 与 ai_spitter_2.smx,作为 26-07 回滚版本。

2026年7月26日地图记录 v2

  • l4d_stats.smx 新增通用 ruleset_key、规则版本、记录策略和计时/难度档案;Anne 系模式保持最佳成绩榜,合作/生存等模式也可独立记录,对抗、写实对抗和清道夫改为不比最快的回合历史。
  • 新增 map_runs、map_run_players、legacy_map_bests 表和可重复执行的迁移/回滚脚本;旧 timedmaps/timedmap_runs 保留,并区分“旧玩家最佳”与“真实局”。
  • NewAnneWeb 已按玩法、版本、难度/档位、队伍人数和 Anne 刷特参数读取 v2 记录,个人页、地图列表和详情页已同步;部署步骤见 docs/map_records_v2_migration.md。

2026年7月23日 FastDL 过图稳定性修复

  • 移除 l4d2_blackscreen_fix.smx 对引擎私有 CNetworkStringTable::DeleteAllStrings() 的调用,避免在过图加载期间清空 downloadables 字符串表导致服务器崩溃或被守护程序重启。
  • 下载调度改为纯追加:每张图只加入反馈优先资源,实际过关时通过 SourceMod 官方 AddFileToDownloadsTable() 追加 3 个跳舞模型和一组随机舞曲,不再删除、覆盖或恢复任何字符串表项目。
  • fornite_l4d.smx 保留原有的全部跳舞资源下载登记,并新增默认关闭的 sm_emotes_add_downloads 开关;当前服务器由全局加载的 l4d2_blackscreen_fix.smx 管理分组下载,其他服务器可开启该开关恢复一次性下载。

2026年7月22日动态难度 PPM 修复

  • 修复自动难度在 round_start 过早锁定队伍 PPM,导致随后切到旁观的玩家仍留在本回合定档快照中的问题。
  • 回合开始时的自动档位现在仅作临时结果;安全区内生还者名单变化会使临时 PPM 失效,第一名生还者出门时再按当时仍在生还者队伍的真人重新计算并锁档。旁观者和 Bot 均不参与队伍 PPM。

2026年7月16日新玩家下载优化

  • 重构 l4d2_blackscreen_fix.smx 的 FastDL 调度:新玩家首次连接时优先下载命中反馈图标和非内置反馈音效,跳舞资源改为过关换图时补齐。
  • restrict_strings.cfg 现在是首进优先下载清单,共包含 44 个反馈材质文件和 17 个去重后的反馈音效文件;跳舞模型不再首进下载。
  • 新增 deferred_strings.cfg,将 60 首跳舞歌曲默认分成 8 组;每次实际 changelevel 随机加入一组,同一轮 8 组全部出现前不会重复,轮完后重新洗牌。可通过 sm_fixscreen_deferred_group_count 调整分组数量,客户端已有文件会由游戏缓存自动跳过。
  • 3 个相互依赖的跳舞模型文件会在玩家第一次过关换图时一起下载,避免只下载部分模型后出现错误模型;同次换图还会下载一组随机歌曲,之后按随机无重复顺序继续补齐。
  • 当前 124 个反馈、模型和舞曲资源已按原目录生成 .bz2 并迁入 NewAnneWeb 文件管理,FastDL 切换到 http://anne.trygek.com/fastdl/left4dead2,由 Cloudflare 缓存加速。

2026年7月15日动态难度修复

  • 修复受控 CVar 基线扫描可能遗漏后续难度章节的问题;现在明确扫描 level1 至 level6,切回专家及以下时不会残留极限或音理独有参数。
  • 修复旧 ai_boomer_2 在动态档位启用上抬/转向后仍可能保留向下俯角,导致 Boomer 朝地面喷吐的问题;首次瞄准和多目标转向现在都至少保留 5 度仰角,不改变连跳与跳喷参数。
  • 清理动态难度配置中当前 AI 插件未注册的 4 个旧 CVar;保留可由 SourceMod 查找和修改的 3 个隐藏/launcher CVar。
  • 修复从固定难度切回自动时,在 PPM 数据暂不可用的情况下仍保留音理/高难 CVar 的问题;现在会先应用简单档作为安全基线,统计可用后再自动定档。
  • 修复服务器控制台/RCON 执行 sm_aidiff 仍被出门锁定逻辑延迟到下一回合、导致运维切档看似未生效的问题;控制台/RCON 现在立即应用,玩家出门后执行管理员命令仍从下一回合生效。
  • 为 Boomer2 新增默认关闭的 ai_BoomerJumpVomit,为 Smoker3 新增默认关闭的空中吐舌开关;两者仅在音理档开启,原连跳逻辑照常执行,不额外强制起跳,只允许已经处于空中的 AI 使用能力,不延迟地面攻击或改变原触发距离。

2026年7月14日动态难度热修复

  • 修复动态难度硬编码 level0 把 AnneHappy 参数覆盖到 1vHunters、Alone、WitchParty 等模式的问题;插件改为在各模式配置执行完成后记录实际 CVar 基线,并在切档、换图和卸载时恢复。
  • 删除错误补入简单至专家档的 z_lunge_up 0、z_lunge_interval 0.08、z_lunge_cooldown 0 等伪基线,修复旧 ai_hunter_2 下 Hunter 原地飞、反复磕头的问题,同时避免 Jockey、Tank、Boomer 参数被错误重置。
  • 极限与音理档仍保留各自明确配置;退出高难档时由运行时基线恢复当前模式原值,避免高难参数残留。

2026年6月12日-7月3日更新记录

Anne 模式与刷特系统

  • 修复 Anne 对抗模式无法使用第三人称的问题,!tp 和第三人称相关 cvar 已按 Anne 系模式写入共享配置。
  • infected_control.smx 持续重构并优化:加入 Left4DHooks PVS/可见性辅助、刷点性能配置、队列和波次决策优化,减少重构版异常刷特、双舌头和过快补波问题。
  • 新增 anne_cvar_shield.smx,保护 Anne 关键 cvar,避免插件或投票残留把本局难度串到其他模式。
  • 新增 26-7 测试配置 Anne25-11.cfg,保留旧版 infected_control25-11.smx 作为回退,并同步动态难度说明。
  • 修复极限难度参数影响其他难度的问题,动态难度切换时会更明确地重置 Tank、Hunter 等档位参数。
  • 修复部分情况下安全室近战没有掉落的问题,并整理 MeleeInTheSafeRoom 逻辑。
  • 刷特投票菜单 spawn_vote_menu.smx 回退为 SourceMod 老菜单实现,移除外部菜单依赖;Anne/战役刷特数量、间隔、自动模式、传送检测等设置改为选择一项就发起一次单项投票,预设仍按整套配置投票。
  • 新增并整理 not0721 系列 coop/community/mutation 模式、dirspawn preset、武器配置和 SI limit 配置。
  • infected_control 增加叛徒模式相关逻辑、刷特预设表和多语言短语,便于后续扩展玩法。

玩家体验、投票与反馈

  • hextags_lite.smx 替换旧 hextags,修复称号颜色问题,隐藏管理员命令,配置改为 hextags_lite.cfg。
  • global_chat.smx、join.smx 和相关翻译补齐更多多语言提示,加入全服聊天状态、找队友接收状态等短语。
  • l4d_stats.smx 修复季度排名和持久化细节,补充回合状态记录,降低部分数据库和高峰期状态写入问题。
  • l4d_stats.smx 调整三方图积分结算:普通三方图实际计时超过 5 分钟才发放安全屋过关分和强势通过分,官方地图维持原有积分;三方救援关不发团队过关分,但地图计时、地图记录和特感统计照常保存。
  • l4d2_hitsound.smx 合并原 killsound/叮叮叮音效投票能力,删除 sound_on/off 旧投票文件,把命中、击杀、爆头音效与图标统一到反馈插件管理。
  • spechud.sp 更新旁观 HUD:显示 ping,调整奖励百分比拆分,并修复旁观延迟显示问题。
  • 禁用 basevotes.smx,删除无蓄力 Hunter 直投入口,减少和 Anne 动态难度/投票菜单冲突。
  • server_name.smx 不再直接改写 SourceBans description,相关展示交给外部 proxy 程序处理。
  • 高峰期卸载与 NPC 管理降低检测/提示频率,减少高峰期额外开销。
  • 隐藏部分管理员命令输出,减少普通玩家聊天区干扰。

上游同步、地图与核心依赖

  • 更新 Left4DHooks、gamedata、include 与测试源码,补齐新 native/forward,并同步重新编译相关插件。
  • 更新 ai_tank3.smx,修复 RPG 分数权限错误和极限难度回调/参数问题,调整 Tank 行为配置。
  • 同步上游地图和 stripper 修复:Dead Center 2025、City 17、No Echo m3、Carried Off cwm1_intro 等,并把适用的 zonemod 更新同步到 zonemod_anne。
  • 同步 cwm1_intro hittable/clipwall 等修复,补齐多个模式的 mapinfo.txt。
  • 删除仓库内 Rust 刷服器工具和 Docker 部署 README,相关能力迁移到外部工具/网页链路维护。
  • 更新 basevotes.smx 位置、SourceMod 配置、数据库表字段和若干文档,保持插件包结构更清晰。

2026年5月17日更新记录

AnneHappy 动态特感难度

  • 新增 annehappy_dynamic_ai_difficulty.smx,根据当前生还者队伍的 l4d_stats PPM 自动定档,并在生还者离开安全门前完成计算;出门后本回合难度锁定,不再随投票或数据变化即时调整。
  • 队伍定档 PPM 使用当前真人生还者的个人 PPM 算术平均,每个玩家权重一致,避免高积分或长时长玩家单独把整队难度拉高。
  • 动态难度分为简单、普通、困难、专家、极限 5 档,默认阈值采用当前可用样本分位:P60=30.89、P75=43.23、P90=63.70、P95=77.57。
  • 当前季度 PPM 因季度时长晚于季度分数上线而失真,默认关闭季度优先;保留 ah_ai_dynamic_use_quarter_stats,后续完整季度可改为“季度样本 >= 5 小时使用季度 PPM,否则回退总榜 PPM”。
  • 支持从数据库表 ai_dynamic_ppm_thresholds 读取每日预计算分位阈值;网页或定时任务可每天凌晨 4 点写入,插件只读取已计算好的结果,读取失败或过期时回退本地 cfg 阈值。
  • 新增 addons/sourcemod/configs/AnneHappy/dynamic_ai_difficulty.cfg,将各档特感和 Tank 属性拆成独立配置,方便后续不用改源码直接调档位数值。
  • 动态难度只调整特感和 Tank 行为属性,不改刷特数量、刷特间隔、刷点距离、传送检测等章节固定节奏。
  • 动态难度锁定后会按 ah_ai_dynamic_enforce_interval 定期重刷当前档位 cvar,防止旧投票或手动 sm_cvar 把普通/简单档覆盖成极限属性。
  • 投票菜单移除旧的 hard_on/hard_off 和 crouch_on/crouch_off 直改 cvar 入口,统一通过 固定特感难度 分类管理档位。
  • Tank、Boomer、Charger、Spitter、Jockey、Hunter、Smoker 按档位区分关键行为参数;Jockey 抢控保持关闭,由 target_override 控制目标。
  • 极限档 Hunter 启用 l4d2_hunter_patch 的 convert_leap=1 和 crouch_pounce=2,非极限档固定关闭该强化,避免档位切换后状态残留。
  • ai_hunter_2.smx 增加对 l4d2_hunter_patch 开关变化的监听,动态难度运行时切换极限档时会同步刷新 Hunter 蹲扑兼容参数。
  • 极限档 Tank 从最初高压参数略微削弱,降低贴脸停跳压迫、连跳速度上限/冲量;投石距离和翻越/爬梯速率回到专家档,减少卡住或动画状态异常风险。
  • 删除旧 AITank3 已无效或不再使用的配置项,例如 ai_TankSneakTime、ai_TankAirAngleRestrict、ai_Tank_Bhop。
  • 新增命令 sm_aippm 查看当前 PPM、阈值来源和锁定状态;新增 sm_aidiff 0-5 支持自动/固定简单/固定普通/固定困难/固定专家/固定极限。

投票菜单与模式加载

  • AnneHappy、AnneHappy Hardcore、AnneHappy Shotgun、多人模式、单人模式的投票菜单新增独立分类 固定特感难度,可直接投票执行 sm_aidiff 0-5;coop 模式不启用该投票项。
  • 出门前投票固定难度会立即影响当前回合;出门后投票只记录为下一回合设置,当前回合保持锁定难度不变。
  • 动态难度插件已加入 AnneHappy、AnneHappy Hardcore、AnneHappy Shotgun、AllCharger、Alone、Hunters、WitchParty 等相关模式加载流程,避免投票菜单中 sm_aidiff 命令不可用。

text 插件显示

  • text.smx 增加动态难度显示,!xx、回合开始提示和玩家进服提示会显示 动态难度[自动-专家] 或 动态难度[固定-极限]。
  • 动态难度插件新增当前难度状态 cvar:ah_ai_dynamic_current_level、ah_ai_dynamic_current_mode、ah_ai_dynamic_current_ppm、ah_ai_dynamic_current_locked,供 text.smx 和后续其他插件读取。

l4d_stats 接口

  • l4d_stats 新增季度游玩时间 native,动态难度可在未来完整季度中使用季度积分 / 季度时长计算玩家 PPM。
  • 季度排名数据结构增加 playtime 字段,并在季度查询与写入流程中同步维护。

文档与配置

  • 新增 docs/annehappy_dynamic_ai_difficulty.md,记录 PPM 分档、数据库阈值表结构、动态难度配置说明、投票/命令用法和特感属性差异。
  • 新增 cfg/sourcemod/annehappy_dynamic_ai_difficulty.cfg 作为默认 cvar 配置,方便服务器直接调整阈值来源、季度统计开关和固定难度模式。

2026年5月19日更新记录

l4d_stats 与 global_chat

  • global_chat.smx 新增 GlobalChat_Broadcast native,允许其他插件写入全服广播消息;广播消息不再额外套普通全服聊天前缀。
  • l4d_stats.smx 地图时间记录适配 AnneHappy 动态难度:自动难度不再作为独立难度比较,而是按本回合自动选定后的固定档位记录和查询最快时间。
  • Anne 普通药役、硬核药役、喷子药役在刷新对应地图记录时支持全服通告;通告限定为当前模式、当前地图、当前特感数量、16 秒刷新、不使用商店、当前动态难度档位的最快纪录。
  • 地图记录通告格式调整为:[普通药役/硬核药役/喷子药役地图记录刷新通告]: 玩家名 在 [地图] 刷新 几特16秒无商店难度记录,新纪录为 时间。
  • 修正 AnneHappy Shotgun HardCore 模式的地图记录模式识别顺序,避免喷子药役被提前识别为普通药役或硬核药役。
  • l4dstats_AddClientScore / l4dstats_AdddClientScore native 增加第三个可选 reason 参数,可把外部插件加分理由写入 score_log.reason。

后续修复

  • 修复切换模式、更换地图时部分数据库插件可能崩服的问题。
  • 修复部分插件数据库错误日志过多的问题,减少无意义报错。
  • 调整动态难度配置和 docs/annehappy_dynamic_ai_difficulty.md,补充最新参数说明。

2026年5月20日-5月22日更新记录

大厅管理与模式加载

  • 新增 l4d2_lobby_match_manager.smx 和 l4d2_vote_returnlobby_patch.smx,把大厅人数管理和回大厅投票补丁从原有插件逻辑中拆出独立处理。
  • 修复大厅只能进入 3 个人的问题,并同步重新编译 l4d2_lobby_match_manager.smx。
  • join.smx、slots_vote.smx、specrates.smx、text.smx 及相关源码配合大厅管理调整,删除部分旧逻辑。
  • 多个模式的 shared_cvars.cfg、shared_settings.cfg、confogl.cfg、server.cfg 和 sharedplugins.cfg 同步更新,保证大厅管理、回大厅补丁和模式加载一致。

数据库与统计插件

  • chatlog.smx、global_chat.smx、l4d2_blacklist.smx、l4d2_damage_show.smx、l4d2_hitsound.smx、l4d_stats.smx、rpg.smx 等插件回退并清理手动数据库重连逻辑,改为交给 SourceMod 引擎处理连接恢复,避免大量数据库连接失败和换图/切模式崩服。
  • l4d_stats.smx、global_chat.smx、fornite_l4d.smx、l4d_player_count_unload_mode.smx 降低数据库压力,减少高峰期状态和统计写入相关开销。
  • 删除部分插件内对 SQL 结构的自动修改逻辑,数据库主体改为依赖外部 SQL 初始化脚本和配置自行创建,降低插件运行时改表风险。
  • addons/sourcemod/configs/databases.cfg 和 .gitignore 同步整理,删除仓库中的 .DS_Store 等无关文件。

AnneHappy 动态难度与 Tank 修复

  • ai_tank3.smx 调整无视野跳相关处理,并修复极限难度回调错误值;addons/sourcemod/gamedata/l4d2_ai_tank3.txt 和动态难度配置同步更新。
  • 修复单人装逼模式因为动态特感难度导致 Tank 一直连跳的问题,单人模式加载流程和 docs/annehappy_dynamic_ai_difficulty.md 同步说明。
  • l4d2_blacklist.smx、l4d2_hitsound.smx、l4d_stats.smx、specrates.smx 等插件补充小修复并重新编译。

上游同步与地图修复

  • 同步上游 l4d2_fix_tank_rock_handoff 的 IsTank 判断修复,避免未进游戏客户端触发错误判断。
  • 同步上游 l4d2_weapon_attributes 修复。
  • 新增并同步 Parish Overgrowth 的 PR1_Waterfront_F、PR5_Bridge_F / pr5_bridge_f stripper 修复,并修正 PR5_Bridge_F.cfg。
  • 同步 Dark Carnival Remix 的 dkr_m2_carnival、dkr_m3_tunneloflove 梯子修复。

Rust 刷服器与 GitHub Actions

  • 新增 tools/l4d2_server_browser,提供 Rust 编写的 L4D2 刷服/查服工具,支持 Steam Master Server、手动分组和 SourceBans 订阅来源。
  • 刷服器支持 A2S_INFO 查询、分组输出、服务器名/地图/人数/延迟/VAC/标签显示、JSON 输出、名称/地图过滤和配置文件加载。
  • 增加原生 GUI,可添加服务器和 SourceBans 订阅、刷新服务器列表、执行 RCON 命令,并读取 CVAR 或公开 rules。
  • 新增 .github/workflows/l4d2_server_browser.yml,用于构建 Linux、macOS、Windows 多平台产物,并支持通过 l4d2-browser-v* tag 创建 GitHub Release。

2026年5月26日更新记录

管理菜单与 RPG 回合有效性

  • basecommands.smx 修复管理员踢人菜单的特感 Bot 显示规则:管理员免疫等级 <=90 时不显示感染者 Bot,免疫等级 >90 时仍可显示并处理。
  • rygive.smx 修复 RPG 插件先于 rygive 加载时 g_bRPG 没有正确初始化的问题,并修正 RPG library 卸载判断,保证处死特感等功能能正确更新 RPG 回合有效性。
  • rpg.smx 修复 L4D_RPG_SetGlobalValue(INDEX_VALID/INDEX_USEBUY, ...) 只改变量但不返回成功、也不触发 forward 的问题;现在统一走 setter,并在状态变化时通知监听插件。
  • 已同步重新编译并替换 addons/sourcemod/plugins/basecommands.smx、addons/sourcemod/plugins/extend/rygive.smx 和 addons/sourcemod/plugins/extend/rpg.smx。

2026年6月2日更新记录

插件与源码目录整理

  • 按上游 SourceMod 插件目录重新整理 .smx 与 .sp:运行插件位于 addons/sourcemod/plugins/,源码按相同相对路径放在 addons/sourcemod/scripting/,方便 release 重新编译后直接覆盖。
  • 更新 GitHub Actions 与 scripts/spcomp-docker.sh 编译流程,支持按插件路径查找对应源码;SourceMod 官方自带插件源码保留在 addons/sourcemod/scripting/sourcemod/ 作为例外。
  • 补齐一批原二进制插件源码;保留 AI_HardSI_2_old.smx、ai_charger_boomer.smx、l4d2_tank_throw.smx 以及 infected_control* 历史版本作为二进制保留项。
  • 删除确认不用的 l4d2_server_update_checker.smx、l4d2_mapchanger.smx、l4d2_abbw_votemap.smx 等旧插件,并移除相关模式加载项。

AnneHappy 重复插件统一

  • 合并 servercleanup.smx、1v1.smx、survivor_mvp.smx、1v1_skeetstats.smx、l4d2_melee_spawn_control.smx 的 optional/AnneHappy 重复副本,统一使用 plugins/optional/ 根目录版本。
  • survivor_mvp.smx 合并 AnneHappy 轻量 [药役MVP统计] 输出,保留 sm_mvp / sm_kills 统计功能,并重新编译覆盖根目录插件。
  • alone、hunters 改用 optional/1v1_skeetstats.smx,并在模式配置中显式写入 sm_skeetstat_counttank、sm_skeetstat_countwitch、sm_skeetstat_brevity。
  • annehappy、coop 及相关 Anne 系模式改用 optional/l4d2_melee_spawn_control.smx,并在 shared_settings 中写入 l4d2_melee_spawn、l4d2_add_melee,保持原 AnneHappy 默认近战解锁行为。
  • 修正迁移后的配置路径:l4d_tongue_block_fix.smx 改为从 fixes/ 加载,deadman 中的 l4d2_lagcomp_manager.smx 也改为从 fixes/ 加载。

2026年6月3日-6月6日更新记录

刷特插件 infected_control.smx

  • 修正重构后刷特节奏过快的问题。新版重构后会在满足开波条件时用 CreateTimer(0.1) 异步开下一波,这个 0.1s 本身只是避免回调内直接嵌套开波;真正导致体感过快的是普通补波 floor 太低。
  • inf_ai_wave_floor_ratio 默认值从 1.35 1.25 1.12 1.00 1.00 调整为 1.50 1.40 1.25 1.15 1.10。以 16 秒刷特间隔为例,简单/普通/困难/专家/极限的普通补波最早时间分别为 24.0 / 22.4 / 20.0 / 18.4 / 17.6 秒,用来恢复旧版实战节奏。
  • GetNextSpawnTime() 不再在没有长定时器时固定返回基础刷新间隔,而是返回当前难度 floor 剩余时间,方便 text 或其他插件显示更接近真实的下一波等待时间。
  • 删除 anti-baiter Pressure 里可能造成误解的冗余开波分支,明确 Pressure 不会绕过普通补波 floor;inf_antibait_fast_tp 只用于不可见存活特感快速传送换点,不等于新增普通补波。
  • 修正刷特评分权重说明里的特感顺序,统一按 S,B,H,P,J,C 解释距离、高度、流程和分散度权重,避免调参时把 Boomer/Hunter 顺序看错。
  • 修复部分翻译颜色显示问题,infected_control.sp 引入 colors,相关调试、提示和短语颜色按 SourceMod 彩色聊天格式重新整理。
  • 新增 docs/infected_control_spawn_timing_audit_2026-06-03.md,记录本次刷特节奏问题的原因、修复范围、各难度时序和验证方式。
  • 新增 docs/infected_control_refactor_bug_audit_2026-06-04.md,按 P1/P2/P3 重新审计重构后的刷特生命周期、队列、传送、低存活阈值、nb_assault、anti-baiter debug、flow fallback 等潜在问题。
  • 新增 docs/infected_control_flow_visual_2026-06-04.html,用可视化页面说明 StartWave -> OnGameFrame -> MaintainSpawnQueueOnce -> TryNormalSpawnOnce/TryTeleportSpawnOnce -> FindSpawnPosViaNavArea -> DoSpawnAt 的主流程和 Pressure 分支,方便之后继续查刷特 bug。
  • 已重新编译并替换 addons/sourcemod/plugins/optional/AnneHappy/infected_control.smx。

特感爬梯加速

  • l4d2_ai_ladder_boost.sp 升级到 1.1.0,把原 l4d2_si_ladder_booster.smx 的固定爬梯加速能力合并进新的可视检测爬梯加速插件。
  • 新增兼容旧插件的 cvar:l4d2_ai_ladder_boost 控制 AI 特感固定爬梯加速,l4d2_pz_ladder_boost 控制真人特感固定爬梯加速,l4d2_boost_multiplier 控制旧式固定加速倍率。
  • 保留新版“未被生还者看见才加速”的逻辑,并继续使用 l4d2_ladder_boost_enabled、l4d2_ladder_boost_multiplier、l4d2_ladder_boost_detection、l4d2_ladder_boost_cooldown 等参数控制。
  • 新增 l4d2_ladder_boost_tank,默认不让通用爬梯加速插件处理 Tank,避免和 ai_tank3 的 Tank 爬梯/翻越逻辑互相覆盖。
  • 重写运行时 hook 和 timer 管理:AI 通过固定检查 timer 保持稳定,真人特感可继续用 SDKHook 即时检测;开关或倍率变化时会重新刷新 hook,并把已经加速的玩家恢复到正确速度。
  • 记录每个玩家当前实际加速倍率,管理员 sm_ladder_debug、sm_ladder_status 输出会显示 AI/真人、Tank、冷却、当前速度和倍率,排查爬梯异常更直观。
  • allcharger、alone、annehappy、annehappy_hardcore、annehappy_shotgun、hunters、witchparty 的 confogl_plugins.cfg 注释掉旧的 l4d2_si_ladder_booster.smx,避免同一功能重复加载。
  • 已重新编译并替换 addons/sourcemod/plugins/optional/AnneHappy/l4d2_ai_ladder_boost.smx。

全服聊天与多语言翻译

  • global_chat.sp 的 !qfmenu 菜单从写死中文改为完整走 i18n 短语,菜单标题、普通全服接收状态、找队友提示接收状态、管理员锁定提示都改为翻译 key。
  • 新增全服聊天菜单短语:GlobalChat_StatusReceive、GlobalChat_StatusBlock、GlobalChat_MenuTitle、GlobalChat_MenuReceiveNormal、GlobalChat_MenuBlockNormal、GlobalChat_MenuReceiveLFG、GlobalChat_MenuBlockLFG、GlobalChat_MenuLFGLocked。
  • 调整全服聊天提示格式,普通全服聊天和找队友提示切换后只显示最终状态,不再把“接收/屏蔽”硬拼进中文句子里,避免其他语言语序不自然。
  • 大量整理 addons/sourcemod/translations 多语种短语文件,覆盖简中 chi、繁中 zho、英语、日语、韩语、越南语等目录;补齐部分插件缺失翻译,并修正颜色标签、#format 类型、技能提示、禁言/静音菜单、RPG、暂停、Boss 投票、MVP、SourceComms 等常见文本。
  • l4d2_skill_detect 重点修正空爆、推停、秒牛、舌头自救、死亡冲锋、连跳、警报车等提示的中文语义和参数类型,减少翻译看不懂或参数颜色错位的问题。
  • sourcecomms 相关翻译统一“禁言/静音/禁言加静音”的表达,避免 gag/mute/silence 混成“堵嘴、沉默”等机器翻译词。
  • 同步重新编译受影响插件,包括 chat-processor.smx、global_chat.smx 以及前面提到的刷特、爬梯插件二进制。

近战与武器配置

  • 修复部分模式出门后没有近战的问题。l4d2_melee_spawn_control.sp 在当前模式找不到近战配置时会依次 fallback 到 coop、versus,减少自定义模式名导致第一章近战池读取失败的情况。
  • confoglcompmod 的 confogl_addcvar 处理从单一 64 字符长度拆分为 cvar 名 64 字符、cvar 值 256 字符,避免较长参数值被截断后影响模式配置。
  • AnneHappy.cfg、Coop.cfg、ShotgunOnly.cfg 的喷子散布配置恢复中心弹丸,sgspread_center_pellet 从 0 改为 1。
  • 已重新编译并替换 confoglcompmod.smx 和 l4d2_melee_spawn_control.smx。

Docker 部署与 A2S 说明

  • 新增 scripts/l4d2-docker.README.md,说明 Docker 一键部署脚本的适用场景、配置文件、旧脚本迁移、首次安装、日常更新、重启、状态查看、地图上传器、Go Proxy、A2S 防火墙和 Master SNAT。
  • 文档补充从旧 sqproxy 脚本迁移到 a2s-proxy-go 的变量映射,说明旧 SERVER_IP、GAME_PORTS、BACKEND_PORTS、MySQL、RCON、Steam 组等变量如何转为新版 L4D2_* 配置。
  • 端口模式说明改为 front-proxy 和 a2s-only 两类:front-proxy 兼容旧前置代理行为,a2s-only 让 srcds 直接监听公网游戏端口,只把 A2S 查询交给 Go Proxy。
  • 明确从旧 sqproxy 迁移时默认推荐 a2s-only;如果旧配置残留 L4D2_GO_PROXY_TRANSPARENT_REDIRECT=false,在默认 L4D2_GO_PROXY_MODE=a2s-only 下会自动改回 true。
  • 补充 A2S 防火墙默认限速参数:L4D2_A2S_INFO_RATE/BURST、L4D2_A2S_PLAYER_RATE/BURST、L4D2_A2S_RULES_RATE/BURST、L4D2_A2S_BAN_HITCOUNT、L4D2_A2S_BAN_SECONDS,默认值按单机 8 个求生服放宽,优先保证 Steam 组页面能正常扫到服务器。
  • .gitignore 同步加入 Docker 部署文档相关忽略项,避免本地部署说明或临时调整误进仓库。

2026年4月16日-5月16日更新记录

基础环境与上游同步

  • SourceMod 更新到 1.12.0.7230,同步 bin、extensions、基础插件和 spcomp 编译器。
  • left4dhooks 更新到 1.166,同步 gamedata、include、插件主体和测试/forwards/natives 相关源码。
  • 更新 SourceScramble 扩展和 include。
  • ZoneMod 更新到 2.9.1a,同步 matchmodes、zonemod/zoneretro/zonehunters/zh/zm 等模式配置。
  • 同步 confoglcompmod 更新,修复 confogl_addcvar 在 Windows 下的问题,并更新 BossSpawning 逻辑。
  • 新增 scripts/spcomp-docker.sh,方便 macOS 下通过 Docker 编译 SourcePawn 插件。
  • 更新 GitHub Actions 检查与编译流程,包括 check_plugins.yml 和 CompetitiveWithAnne.yml。

通用修复插件

  • l4d2_fix_changelevel.smx 切换为 Forgetest 版本,支持部分地图名解析,并替换原 l4d2_changelevel 相关 gamedata/include/插件加载项。
  • 新增并加载 l4d2_fix_tank_rock_handoff.smx,修复 Tank Rocks 在控制权转移时的问题,后续补了一次小修。
  • 新增 l4d2_block_autoaim.smx,用于 Patch Aim Assist,并加入 cfg/generalfixes.cfg。
  • l4d2_hittable_control.smx 修复 hittable 伤害错误作用到 common 的问题,并增加 breakable hittable fallback。
  • l4d_prop_touching_rules.txt 更新。
  • l4d2util 的 SurvivorCharacter enum 重命名,避免和 left4dhooks 冲突;同步影响到 l4d2_ellis_hunter_bandaid_fix、l4d2_getup_slide_fix 及 archive 里的相关源码。
  • lerpmonitor.smx 修复通过把 lerp 改到 101 解除硬直的操作,并同步 allcharger、alone、AnneHappy、AnneHappy Hardcore、hunters、witchparty 的相关 shared_settings。
  • 1v1.smx 简化逻辑并修复单人模式问题;同步 1v1_skeetstats、l4d2_skill_detect、l4d_boss_percent、match_vote 的翻译和小修复。

AnneHappy 与扩展插件

  • l4d_stats.smx 大幅重构,拆分为多个 include 模块,新增带新奖励、无商店奖励、分数日志、季度排名、回合状态、玩家状态和数据库持久化等模块。
  • l4d_stats.smx 修复保护队友分数翻倍、部分刷分选项、PPM/KPM 重置和地图记录名单不完整的问题。
  • l4d_stats.smx 优化季度排名显示,地图记录增加完整玩家名单,数据库结构和 database.sql 同步更新。
  • 新增 database_performance_migration.sql,优化数据库性能,降低统计插件和高峰期插件的数据库压力。
  • rpg.smx 调整评分逻辑,去除牛牛冲锋和 witchparty 的强势通过分,并修复可能导致刷分的选项。
  • global_chat.smx 新增全服聊天插件,接入数据库配置,优化全服输出格式,修复全服聊天问题;新增 !qfmenu 让玩家控制是否查看全服信息,并增加找队友限制。
  • join.smx 修复赞助页面和赞助流程,新增 anne_donate.cfg,优化 IP 页面显示;fantasydong 组和 Anne 电信服免除广告。
  • l4d2_door_lock.smx 新增锁门相关功能,增加玩家加载锁安全帽设置,修复强行开始问题,并增加出门前不允许 Bot 活动的限制。
  • network_quality_hint.smx 新增网络延迟检测插件,方便玩家切换到正确运营商的三线 IP,并优化 cfg/sourcemod/network_quality_hint.cfg、cfg/confogl_rates.cfg 和 cfg/server.cfg 参数。
  • l4d_player_count_unload_mode.smx 优化高峰期判定,改为统计有效服务器中有玩家服务器占比达到 70% 时触发;新增 l4d_server_status.is_good_server 标记,好服务器始终保留给 4 人及以上多人模式,高峰期普通服务器也不开放单人模式,并细化卸载提示。
  • l4d2_hitsound.smx 新增只对特感生效的开关,并修复命中反馈配置有时整关丢失的问题。
  • l4d2_blacklist.smx 修复未使用数据库的问题。
  • chatlog.smx、l4d2_damage_show.smx、veterans.smx、server.smx 修复数据库错误或增加数据库重连处理。
  • server_name.smx 修复单人模式错误,并减少 SteamWorks_SetGameDescription 调用,避免疑似调用过多导致的崩服问题。
  • rygive.smx 修复可能导致刷分的相关逻辑。

地图、Stripper 与 Nav

  • 同步 2026 年 4 月地图更新和后续 stripper review,覆盖 zonemod、zonemod_anne、nextmod、deadman、acemodrv、neomod、apex、eq、pmelite 等多个目录的大量地图 cfg。
  • zonemod_anne 同步上游 zonemod 地图改动,包含官图、三方图和多种自定义战役地图的 stripper 更新。
  • Carried Off 更新:同步 cwm1_intro、cwm2_warehouse、cwm3_drain、cwm4_building,并新增 cwm1_intro_navfixes.nut、cwm2_warehouse_navfixes.nut。
  • Open Road 3 更新:修复 x1m3_city,新增 x1m3_city_navfixes.nut。
  • Detour Ahead 3 更新:修复 cdta_03warehouse 导航、fire escape pathing 和 sewer drop tank ban,新增 cdta_03warehouse_navfixes.nut,并同步相关 mapinfo。
  • 更新 OutSkirts.cfg、versus_3.cfg、x1m3_city.cfg、cdta_03warehouse.cfg 等单图修复。
  • 同步 cfg/cfgogl/*/mapinfo.txt 和多个模式的 shared_plugins/confogl_plugins,保证地图、插件加载和模式配置一致。

配置、广告与文档

  • 更新 README.md 和相关说明,配合 ZoneMod 版本与默认网页显示调整。
  • 更新 addons/sourcemod/configs/advertisements*.txt,增加赞助引导语。
  • 更新 addons/sourcemod/configs/databases.cfg,配合全服聊天、统计、伤害显示等插件的数据库连接与重连。
  • 更新 .gitignore,减少无关文件进入版本管理。

2026年6月10日-6月11日更新记录

私有玩家武器属性系统

  • 新增私有 per-player 枪械/近战属性实验链路,包含 l4d2_private_license.smx、l4d2_pwa_native_attrs.smx、l4d2_pma_native_attrs.smx、l4d2_pma_trace_attrs.smx、l4d2_pma_attackseg_attrs.smx、l4d2_player_attr_db.smx、l4d2_weaponinfo_dump.smx。
  • l4d2_private_license.smx 新增 DB 授权守卫,所有私有武器属性插件启动时会校验 license key、feature、server_id、port 和过期时间;缺少授权时直接加载失败,避免插件文件外流后被普通服务器直接使用。
  • 枪械层支持按玩家覆盖伤害、射速、换弹/部署/循环、弹夹、子弹数、散布/后坐/穿透/射程、衰减、Tank 伤害倍率等已验证字段;native 字段通过 detour 极短窗口 apply/restore,避免多人同 tick 串值。
  • 近战层拆成基础属性、Trace 轨迹和 Attack Segment 三层:基础属性处理伤害、挥速、idle、伤害类型;Trace 处理范围、方向缩放、yaw 偏移;Attack Segment 处理脚本攻击段里的 start/end dir、命中窗口、duration、动画和 force_dir。
  • l4d2_player_attr_db.smx 接入 NewAnneWeb 数据库,玩家进服/换配置时读取缓存后的属性表,插件不依赖游戏服之间共享本地文件。
  • 管理员枪械手感 preset 改为按当前 vote 武器配置的基线做百分比增强,避免 Anne/coop/其他模式已经改过的武器被原生默认值覆盖;当前 preset 为后坐降低 5%、蹲下准确率增加 5%、衰减降低 3%。
  • 管理员原版小刀 preset 改为严格按 【武器】恢复原版小刀.vpk 的 scripts/melee/knife.txt 写入 attackseg 覆盖:主攻击窗口 0.05-0.35 并使用 AXE 动画,副攻击 .7 / 0.08-0.4 并使用 AXE 副攻击动画;写入前会清理所有模式旧的管理员小刀 PMA/Trace/AttackSeg 覆盖,不再写伤害、挥速或 trace 距离增强。
  • weaponinfo_dump 用于只读 dump weapon info、melee info、trace/attack segment 默认值,方便后续补齐反编译字段和做实机审计。

NewAnneWeb 后台与私有部署

  • NewAnneWeb 新增“默认值”和“玩家武器属性”后台入口,可查看枪械默认值、近战默认值、近战轨迹默认值,并按玩家、模式、武器、属性新增/修改/删除覆盖。
  • 前台玩家页同步开放武器默认值查看入口;后台额外提供管理员小刀轨迹 preset、管理员枪械手感 preset 和 vote 武器默认值编辑。
  • NewAnneWeb 私有 Updater 镜像新增 private/Anne_Updater_PlayerWeaponAttrs.txt,用于只给白名单服务器下发玩家武器属性相关插件;私有文件登记到后台文件管理并保持前台隐藏。
  • join.smx 支持私有更新链接部署,anne2 已验证能通过 join_autoupdate=2 下载并 reload 私有插件。
  • 因 anne2 的 addons/sourcemod/gamedata 目录当前不可写,私有 Updater 清单只下发 .smx;gamedata、cfg、sql 支持文件仍保存在 NewAnneWeb 私有镜像中,由人工或后续权限修复后再下发。

2025-10月更新

其他

  • 同步上游全部更新
  • l4dtoolz更改为fdxx版本
  • 增加战役模式和写实模式,其中战役模式占用了写实模式(Anne.vpk更改了写实模式的base模式,从realism改为了coop,所以纯净写实模式实际为纯净战役模式),所以战役模式左上角会显示写实模式,在steam大厅里会显示AnneCoop,写实模式依旧用的写实模式,不过在coop基础上把写实的convar写到了shared_cvar.cfg文件中
  • 优化了shared_plugin.cfg里的部分插件增减,增加Coop枪械
  • 部分没有源码插件功能合并到server.smx插件里(黑白提醒),join.smx(屏蔽SM平台提示),l4d_info_editor名称不对,应该为l4d2_melee_spawn_control
  • 更新sourcemod到1.12.7195版本
  • 还有很多细小更新已经不太记得了,有兴趣可以翻找commit log。

更换地图插件更改

  • 不再启用 l4d2_mapchoose.smx(切图)和l4d2_abbw_votemap.smx(换写死的三方)
  • 管理员菜单增加adminmenu_mission_list.smx,可以方便更换三方图。 thanks Hoongdou
  • 增加l4d2_nativevote.smx,l4d2_source_keyvalues.smx作为更换三方图的前置插件
  • l4d2_map_vote.smx为投票下一张三方图插件,map_changer.smx为切换地图插件,两者相辅相成

Anne刷特插件infected_control.smx

  • 本次刷特插件改动特别大,基本已经抛弃了原Caibiii的找点框架,换成了fdxx的找点框架,并且在fdxx框架里尽可能恢复原Anne插件的功能,然后优化了fdxx的找点框架,大幅降低运行开销,增加了评分系统,分散度系统,高度,距离权重,后面会跟着一篇AI写的详细介绍。

战役刷特 l4d2_dirspawn.smx

  • 采用脚本刷特,可以更改特感数量和特感最低刷新时间,支持按照人数增减特感

黑名单插件 l4d2_blacklist.smx

  • 普通玩家有3个人的屏蔽名额
  • 管理员玩家有10个人的屏蔽名额
  • 屏蔽是双向的
  • 本次对局内新加的屏蔽人不会直接踢出,只有屏蔽人自己退出对局后再次加入才会设计屏蔽检查

rpg插件 rpg.smx

  • 增加了很多插件的调度和个性化保存,包括伤害显示、命中反馈、枪械抖动设置

积分插件 l4dstat.smx

  • 修改了很多评分细则
  • 旁观和娱乐模式不增加在线时长(除了Anne和Anne硬核计入时长)
  • 娱乐模式分数平衡
  • 硬核模式暂时免疫团灭分

ai_tank3.smx

  • 同步树树子上游更新

ai_smoker3.smx

  • 同步树树子上游更新

2023-03月更新

其他

  • 同步zonemod 2.8.1更新
  • Anne武器:喷子没改,机枪换弹时间设定同步zonemod
  • Anne地图:c7m1 改为固定克,第二节车厢门在第一节车厢门打开之后20秒自动打开

2023年1月1日更新记录

infected_control插件

  • 增加一个ConVar inf_EnableAutoSpawnTime来控制是否开启自动增加时间
  • 自动增加时间效果为,当特感数量低于特感上限/4向下取整+1的数量,或者猴子猎人牛全死或者达到刷特间隔/2时间后,再开启刷特,杀的越快,刷的波数越多,鼓励玩家更有变化的玩,而不是死站桩,站桩依旧有效,但是会面临更多的波数(相当于保底是以前的刷特难度)
  • 固定时间效果为: 刷特间隔1.5倍后刷特,16s的话,和原来难度是一样的,24s刷特(原来是小于9s+4s,否则加8s)
  • 两种模式可以投票选择,默认自动时间刷特
  • 刷特仁慈一点,有tank的时候或者倒地或死亡的人数过半刷特时间不小于设置时间*1.25(16s就是20s)
  • 支持暂停功能
  • 修复新版本获取下一波特感时间的功能

text插件

  • 适配新版刷特,提示为固定6特16秒或者自动6特16秒
  • 更换模式检测方式

ai_boomer_2

  • 强喷功能更新,大大降低胖子喷不到人的几率,而且让胖子转动,显得很合理(其实真合理,不过用插件改变不了胖子的喷射路径,只能用这种办法
  • 有高度差计算不准确的问题也修了,站高处也能被强制喷了
  • 2023/1/8日更新,将胖子喷到第一人后选取喷吐范围内目标按距离升序排序更改为按照胖子视角与当前生还方向角度升序排序
  • 2023/1/14日更新,修复四个生还者扎堆无法喷完所有生还者的情况,增加强制被喷前的二次检测
  • 2023/1/17日更新,增加每个目标按照角度动态计算喷吐帧数功能

ai_jockey_2

  • 继续降低高跳角度,降低高跳速度
  • 更改冻结之后高跳的速度向量,不要跳太高,而且不要跳过头,推CD加一个限制条件看能否限制猴子落地后快速起跳

rpg

  • 自动检测有没有数据库,有无数据库都可以运行,修复因为无数据库导致的崩服问题
  • 无数据库的缺点,每次进服都需要自己设置出门近战武器

l4d_stats

  • 更换模式检测方式
  • 增加lastannemode列,方便网页显示玩家正在玩的具体模式
  • 增加auto列,方便anne23-01版本排行榜写成
  • AnneHappy模式关闭tank连跳,无法获得额外加分

ai_tank_2

  • 恢复检测会不会摔死,但是不消耗情况下不检测是不是会撞墙
  • 狡猾tank改为刷特时间的一半或者8s,主要防止时间断情况下消耗能力可能不恢复的问题

l4d_hats

  • 将排名插件改为可选插件,无排名插件的情况下也能正常运行

ai_spitter_2

  • 更新ai_spitter_2
  • 基于 1.0 版本改造更新,精简代码,优化部分逻辑,增加被控目标优先级功能
  • ai_SpitterPinnedPr:6,3,1,5 被控目标的优先级,口水会优先吐优先级高的目标,如果看不到目标则使用默认目标(特感编号,逗号分割)

text

  • text插件增加生还满人自动关闭高级人机功能
  • 增加卸载action拓展功能

server

  • 增减一个delbot管理员命令,用于多人装逼模式里删除bot的能力
  • 对addbot命令增加限制

l4d_tongue_block_fix

  • 增加smoker可以穿过si拉人,一旦拉成功,可以穿过si和tank的能力

l4d_tank_damage_announce

  • Tank Damage Announce 2.0, 2023/1/17 日重写,支持显示真正吃铁的情况
  • tank_damage_enable:1 是否开启坦克伤害统计
  • tank_damage_force_kill_announce:0 坦克被卡死或强制处死是否显示坦克伤害统计
  • tank_damage_print_livetime:1 伤害统计是否显示坦克存活时间
  • tank_damage_failed_announce:1 生还者团灭时且坦克在场是否显示伤害统计
  • tank_damage_print_zero:1 显示坦克伤害统计时是否允许显示对坦克零伤的玩家

注: 2.0 版本中的铁指具有 m_hasTankGlow 属性且 m_hasTankGlow 属性值为 1,在坦克视野中有光圈显示的物品,如警报车、垃圾桶等 已兼容多坦克情况

SpecListener

  • 增加一个插件方便旁观者知道谁在说话

show_mic

  • 旁观者显示正在讲话的所有人
  • 生还者只显示正在说话的旁观者

remove

  • 如果是救援图,先把包改为药,然后再根据情况处理药和电击器
  • 非救援图先处理药,再对包和电击进行修改

其他

  • 修改特感增强里检测是否在地面的方式
  • 修正一点翻译错误
  • 同步上游更新
  • 同步率更改为0.024(小僵尸再也看不出有闪现异样),对抗模式保持正常0.014【如果你服务器卡请继续增加同步频率,到你服务器不卡的程度】
  • 不加载fixes/l4d2_shove_fix.smx插件

2022年12月15日更新记录

infected_control插件

  • 特感进度在生还者前或者和最近可移动生还者很近(小于特感生成距离)都不传送
  • 确认为跑男的距离由1000更改为1200,更改刷特插件踢出死亡特感方式(感谢树树子)
  • 跑男增加一个判定条件,最远那个人如果超过所有特感大于1200也会开启跑男模式
  • 跑男模式下只要没被看到就能传送
  • 传送检测函数增加限制,必须隔生还者超过或者位置在于最远生还者后方才可以使用
  • 刷特不允许在CHECKPOINT的nav属性里刷

ai_jockey_2插件

  • 同步上游更新并修改合理设置

l4d_stats 插件

  • 地图记录功能数据库新增5列,分别是sinum(特感数量), sitime(特感生成时间), mode(1 Anne 2 WitchParty 3 AllCharger 4 Alone 5 1vht), usebuy(1用了商店, 0没用商店), anneversion 完成使用的Anne版本
  • 未开局团灭不扣分
  • 有效检查更改为rpg插件的native

rpg插件

  • 增加一个forward,如果有玩家b数小于500发出
  • 增加2个native,方便其他插件查看用户属性和全局属性

L4d2-Si-Push-When-Spawn

  • 测试一个插件,特感生成在高出跳出来

1v1 1vai

  • 1v1插件支持pve模式,1vai删除无关代码

specrates

specrates插件增加一个convar设置100tick旁观人数 vote插件增加限制旁观tick投票

l4d2_tank_announce

l4d2_tank_announce增大tank生成时的声音

join插件

  • 更新链接控制Cvar更改为0-4,0为不自动更新

survivor_mvp

  • 友伤出安全门清空
  • join插件增加一个convar控制大厅属性,默认不开启

ai_tank_2

  • 增加狡猾tank,tank会在特感生成前8秒内才会压制,和消耗冲突

punch_angle

  • 枪械抖动增加rpg属性限制,也是通过rpg插件的native函数限制

其他

  • 更新Leftdhooks
  • 1-3人运动僵尸量减少,5-8人不变(单人在1v1zonemod基础上下调40%小僵尸,双人在2v2基础上降低30%小僵尸,三人在3v3基础上降低25%僵尸量,4人在4v4基础上降低20%僵尸量,5人在正常药役大概增加15-20%,6人在正常药役大概增加30-35%,7人在正常药役大概增加50%,且有双口水,8人在正常药役大概增加65-70%,且有双口水)

witchparty 和 allcharger模式在普通药役的基础上小僵尸再减少17-23%

  • 同步上游更新
  • 数据库创表文件因为地图记录增加选项需要更改

2022年12月8日更新记录

infected_control插件

  • 删除传送最小距离Convar,传送最小距离和生成最小距离一样,为了增加传送进程的特感生成速度,把特感传送当前距离改为每tick增加20距离快速找位置(生成为每tick增加5距离)
  • 增加一个Native(float GetNextSpawnTime()),提供下一次特感生成时间,方便其他插件调用
  • 修复1vht和witchparty模式可能少特的问题

text插件

  • 适配新版infected_control插件,增加狡猾tank的开启关闭显示

join插件

  • 增加踢出家庭共享账户的功能,需要SteamWorks拓展
  • 增加大厅自动删除的Convar

specrates插件

  • 修改旁观插件的分数插件依赖处理不正确的问题

ai_jockey_2插件

  • 修改jocker2的一些设置,减低向后跳概率,增加高跳概率

l4d_boss_vote插件

  • 修复9特以上无法投票的功能

其他

  • 增加大量对抗插件的i18n翻译

2022年11月30日更新记录

mapinfo更改

  • 官图增加很多阴间位置tank的流程ban,同步上游对抗的map和stripper更新

ai_jockey_2

  • 猴子更改为树树子猴子2.0,修了一点bug,削弱了猴子一部分属性

ai_boomer_2

  • 胖子更改为树树子胖子2.0

specrates

  • 修复4人旁观情况下30w积分玩家没有100tick旁观问题

l4d2_stats

  • 修复因提出特感导致的ht血量错误的问题

server

  • 增加团灭次数显示

rpg

  • 恢复因新版coop_base_versus模式引起的每回合白嫖资格消失,增加被黑伤害显示插件

l4d_boss_vote

  • tank位置投票增加限制,8特以下需要团灭5次才能投票(管理员免疫)

infected_control

  • 刷特插件传送距离改为动态的,防止部分地方600距离找不到刷新位置导致刷特进程卡住

2022年11月17日更新记录

刷特插件infected_control.smx

  • 修复一个位置多刷引起的刷很多同种类特感问题,跑男针对模式

hitstatic survivor_mvp l4d_stats

  • 更改灭团处理方式,新的versus_coop_mode引起

l4d2_script_hud 插件

  • 如果tank或者witch不生成,不显示他的进度为固定,而是直接不显示,Static改为固定,进度加上%分号

ai_jockey_new更新

  • 进攻性更强

ai_hunter_new更新

  • 顺便可以开启无蓄力hunter

join插件

  • 增加自动更新插件开关

SI_Target_limit

  • 适配刷特插件的跑男针对

L4D2 Weapon Attributes

  • 同步上游更新,去除l4d2_smg_reload_tweak.smx

其他

  • 救援关全部关闭流程克,只启用第一个事件克,三方图使用server插件更改,同步上游fix更新,单人模式传送时间改为默认3秒

2022年11月10日更新记录

刷特插件infected_control.smx

  • 修复刷特插件传送出现问题

ai_tank_2.smx插件

  • 修复delete handle产生的报错
  • 修改梯子检测方式

survivor_mvp

  • 删除团灭更换模式

userhook.smx

  • 拓展测试插件增减usermessage hook 插件

confoglcompmod.smx

  • 已经取消隐藏的处理

还有一些小修复,具体看commit log

versus_coop_mode.smx

对抗模式玩战役,完美修复,谢谢钵钵鸡大佬 倾力支持 PS:这种处理方式相比原来的换成写实处理有以下几点好处

  • 永远是对抗模式地图,比如c5m3会一直是pathA,而且对抗的梯子或者nav修复都存在
  • hunter的属性会为对抗属性,原来的改为写实处理第二回合会导致hunter变为战役属性,会使hunter特别难爆
  • 可以更改回合重启时间,加快坐牢速度(建议改为1,太低了玩家能在包被删除前偷包)
  • 回合结算时能看到整章节的数据,谁偷懒一目了然

2022年11月6日更新记录

刷特插件infected_control.smx

  • 修改传送时生成位置错误的逻辑
  • 增加sdkcalls限制[默认5个],这个参数很多特的时候消耗比较大,谨慎添加更多!这个代表最多5只特感可以进入传送找位流程,以后可能不会单独用sdkcall处理传送,会先处死,然后进入传送队列,放到ongameframe中处理

ai_tank_2.smx插件

  • tank插件优化了梯子处理逻辑,将在生还者出安全区的时候遍历所有entity找到所有梯子实体,保存好梯子的起始位置,去除高度的影响下来判断距离,距离小于150的就处在梯子附近,tank将无法锁定视角

l4d2_Anne_stuck_tank_teleport插件

  • 新版本的可见函数对于tank无效,改回原来的逻辑

结构优化

  • 多人模式将共用annehappy模式的shared_cvar.cfg和shared_plugins.cfg
  • 单人模式将共用alone模式的map_cvar
  • 卸载大部分annehappy不需要的插件
  • server的网络参数设置将只应用与annehappy比赛模式,对抗的网络参数强制使用cfg/confogl_rates.cfg文件,对抗原来的gamemode参数已经加到confogl_personalize.cfg,原来的对抗模式参数anne.vpk基本已经删除完

特感加智插件

  • 特感处于stargger状态下不进行操作

server_name插件

  • 服务器名插件模式检测更改为对l4d_ready_cfg_name cvar的检测,不再使用sv_tags处理,适配对抗的readyup插件名字设置

join插件

  • 增加了服务器核心插件自动更新功能,不过还是建议多看看插件包是不是有更新

插件汉化

  • 不少插件增加汉化显示

地图修改

  • 部分同步上游地图参数导致牢房减弱,修改回来

confoglcompmod.smx

  • 防打服狗,我在这个插件增加了平时服务器默认隐藏的参数,有人加载模式后就会删除隐藏,如果高防服务器可以修改源码重新编译一下,等打服狗死了我会用自动更新把这个插件修改为正常
  • 还有一些小修复,具体看commit log

advertisement.smx

  • 不同模式的广告文本加载不同

vote.cfg

  • 支持不同模式选用不同的投票cfg文件

2022年11月更新记录

前言

新插件包的目的是为了更快的获取上游更新,降低我的维护成本,当第一版本插件完成后,我的更新就只需要更新特感等功能性插件 其他的插件来源于上游的更新,可以更专注于摸鱼 社区插件的更新能够得到马上的同步

插件更新记录

  • ai_tank2.sp 增加了梯子检测功能,并且删除了tank后退动作的连跳处理,修复了tank可能会纵云梯大跳的问题
  • ai_jockey_new.sp 修复了猴子被推后马上就能通过使用跳跃功能来恢复重新使用技能导致的问题
  • infected_control.smx 将5种模式的4种刷特合并为1个插件处理,
    适配目标选择插件,选择生还者构建刷特坐标系的时候不能选目标已满的玩家
    特感的生成顺序改为由队列进行处理,解决一波可能刷同样的特感[主要是boomer和spitter]的问题
    原来的射线刷特方法取消,改为获取"logic_script"的值来判断[也还是射线处理,但是效率比原来快,而且效果更好]
    检测env_physics_blocker的阻拦属性,原来不能生成的地方现在很大可能也能生成了
    射线类型改变,由MASK_NPCSOLID_BRUSHONLY类型更改为MASK_PLAYERSOLID,能最大程度上增加可刷特位置
    修复原来刷特IsPlayerStuck的射线过滤器的bug,会导致新版插件把射线改为MASK_PLAYERSOLID后导致的卡在新加的物件上
    倒地玩家的视线不会影响特感的传送(相当于倒地生还视线不如狗)
    增加最大刷特距离的控制
  • server.smx 分开为2个插件join.smx 和 server.smx,其中join.smx主要处理加入游戏后换队的问题,server.smx处理Anne等模式下特殊的一些功能
  • l4d_target_override.smx 升级为最新版本,增加了targeted功能,能限制生还者被选为目标的数量
  • SI_Target_limit.smx 目标选择插件适配新版l4d_target_override插件,自动控制控制型特感选相同生还者为目标的数量
  • vote.smx 投票cfg插件增加cvar来控制投票文件
  • l4d2_Anne_stuck_tank_teleport.smx 救援关不启用跑男惩罚
  • text.smx插件会进行Cvar的检测,一次来避免插件加载顺序导致的无法启动的问题
  • rpg.smx 增加皮肤功能,且增加自动检测依赖启用不同功能的能力,修复关闭帽子无法保存到数据库的问题
  • specrates, hextags, rpg, l4d_hats,l4d2_item_hint.smx ,veterans增加检测积分插件的功能,没有积分插件也不影响使用
  • l4d2_weapon_attributes.smx 增加霰弹枪装填速度的Cvar控制,需要WeaponHandling作为前置插件(加载顺序无影响)
  • 对抗插件全部更新最新版本,部分插件改用i18n汉化,英语汉语翻译都有(具体汉化插件和i18n汉化请看项目)
  • AnneHappy、AnneHappyPlus枪械uzi削弱

当前版本武器伤害具体如下 AnneHappy AnneHappyPlus ZoneMod

一些重要特感和生还数据:

生还者速度:220 坦克速度: 225 坦克连跳加速度: 60 坦克停止距离: 135 坦克近战攻击距离: 75 小僵尸数量:z_common_limit 24 (大于原AnneHappy的21只,小于zonemod的30只) 被胖子喷产生的小僵尸数量: 1个 13 2个 25 3个35 4个45 尸潮发生时同时存在的小僵尸数量: 45 (大于原AnneHappy的50只,小于zonemod的50只) 其他不太重要数据请在对应模式的shared_cvars.cfg文件 特感增强的数据在对应模式的shared_settings.cfg文件

性能问题

当前刷特版本不多人运动情况下,开20T服务器依旧在90帧以上,最小帧1%也在60帧以上 但是一旦超过4人,20T根本就无法稳定了,8人运动基本在12~14T能基本在90帧以上,最小帧1%在50以上 以上性能测试为r5 3900x 测试,云服高特情况可能还要打个7折起步 综上,正常情况下刷特应该已经不成为性能瓶颈,6人运动腾讯轻量云服12t基本达到瓶颈(预估)

结论

目前版本的难度还是相当大的,4特带一个新手的压力都不小,5特带一个新手难度就比较大了,6特带一个新手不靠卡克基本很难通过c2 所以建议新手玩家多玩玩4,5特之后再去6特混野 各个服主也可以根据自己喜好设置不同的难度,大部分的都可以通过控制Cvar来控制难度 部分可能需要源码的,所有源码也已经开源,其中AnneHappy为主的插件在scripts/AnneHappy/文件夹 拓展性为主的插件在scripts/extend/文件夹 如果发现有问题,请发issue