简介:这份资源是 AMXX 1.8.1 的中文(简体)、繁体中文与英文三语版本,面向 Half-Life 系列游戏服务器的插件开发者、服主以及希望定制游戏模式的玩家。AMXX 基于 MetaMod 构建插件,支持自定义游戏模式、角色能力调整和流程控制等脚本编写;三语支持尤为重要的是降低了国内及繁体中文用户的使用门槛,也便于对照英文原版查阅接口说明。压缩包内共 203 个文件,约 3.4MB,涵盖 sma 源码、inc 头文件、amxx 已编译插件、dll 动态库、ini 与 cfg 配置、txt 文档及 exe 工具等,基本覆盖从编译开发到服务端部署的完整链路,并附有 statsx、admincmd、plmenu、miscstats 等示例插件可供参考。目前已有 532 人浏览学习,适合希望快速上手 AMXX 脚本、对照示例理解插件结构并搭建个性化服务器的初、中级开发者。
1. 装 AMXX 1.8.1 之前:先搞清楚它挂在哪一层
第一次装 AMXX 1.8.1 中文 繁體中文 英文版,出错的原因一般不是命令写错,而是把它当成解压就能用的整合包,直接丢进服务端根目录。AMXX 不是独立服务端,它挂在 Metamod 下面,属于元模块,路径差一层,服务端要么起不来,要么能起来但控制台敲meta list一片空白。1.8.1 这个版本号有点特殊:它足够老,老到和后来重编译的 HLDS 偶尔不兼容,但也足够耐用,到现在还有一批服在跑。这篇按一台空服务端的顺序,把版本怎么对、三语包怎么放、modules.ini 怎么开口子、坏了怎么救过一遍。适合第一次搭 GoldSrc 服务端的人,也适合手里有旧整合包想重装的人。
2. 版本与环境对齐:HLDS、Metamod 1.19 与 AMXX 1.8.1 三语包的搭配
动手前先花十分钟确认三件事:服务端是哪一版 HLDS、Metamod 用哪个小版本、三语包里的文件是不是齐的。这三件事任意一件对不上,后面改多少配置文件都不会生效,只会让你在日志里来回翻。
2.1 先把服务端骨架摆正:addons 的落点只有一处
AMXX 的所有文件都落在 mod 目录下的addons里。CS 1.6 的 mod 目录叫cstrike,所以路径是cstrike/addons/amxmodx,这是安装位置固定、不能临时改的地方。很多人出问题就出在这一步:把压缩包解出来的amxmodx放到cstrike根下,或者在外面多套一层目录叫amxmodx181,Metamod 按路径找不到.so,只会在日志里留下一行不容易注意到的错误。
先看清楚自己手上的目录结构,再决定往哪拷:
# 站在服务端根目录看两层目录就够了,别急着拷文件 cd /srv/hlds tree -L 2 -d . | head -20 # 期望能看到: # ├── cstrike <- mod 目录,所有插件都往里放 # │ ├── addons <- 元模块专用目录 # │ └── maps # ├── hlds_run <- Linux 启动脚本 # └── steam.inf确认结构没问题之后,把addons下缺的两个目录先建出来,避免后面拷到一半才发现父目录不存在:
cd /srv/hlds/cstrike/addons mkdir -p amxmodx metamod ls -ld amxmodx metamod # 常见做法是让这两个目录和 hlds 运行用户同属主, # 后面 amxx 要往 logs/ 和 data/ 里写文件,属主不对会在启动阶段就失败| 路径 | 放什么 | 要不要改 |
|---|---|---|
cstrike/addons/amxmodx/dlls/ | amxmodx_mm_i386.so(Linux)/amxmodx_mm.dll(Windows) | 不改名 |
cstrike/addons/amxmodx/modules/ | fun、engine、cstrike等模块二进制 | 不改名 |
cstrike/addons/amxmodx/configs/ | amxx.cfg、modules.ini、plugins.ini、users.ini | 要改 |
cstrike/addons/amxmodx/plugins/ | .amxx插件 | 按需加 |
cstrike/addons/amxmodx/data/lang/ | 三语语言文件 | 要核对编码 |
cstrike/addons/amxmodx/logs/ | 运行日志 | 保证可写 |
提示:
dlls和modules是两个不同目录。前者只有一个元模块入口,后者是功能模块;拷错位置的典型症状是meta list里有 amxmodx,但amxx modules全是 bad load。
2.2 Metamod 用 1.19 还是 1.20:1.8.1 的兼容边界
AMXX 自己不直接被 HLDS 加载,中间隔着 Metamod。1.8.1 时代的常见搭配是 Metamod 1.19 系列(1.19、1.19p32)或 1.20,两者都能挂上,差别在细节:1.19 的plugins.ini格式更老派,路径容错也低,但坑少、行为可预期;1.20 对路径和大小写的容忍度高一点,日志也更清楚。手上一台老服务端跑着别的元模块时,不要为了“升级”换 Metamod 小版本,先把 AMXX 挂上去再考虑升级。
另一个需要提前想清楚的是 HLDS 的版本。1.8.1 是 2007 年前后的产物,2013 年之后 HLDS 被重新编译过一轮,部分老模块在新 build 上会出现加载失败或进服即崩的情况。常见做法是:新 build 先在一台小号测试服上装一遍,确认amxx modules没有 bad load、玩家能进服能看菜单,再考虑放到正式服;正式服本来跑着老 build(比如 4554、5758 这类)并且没别的问题,就别顺手升级。
2.3 三语包的取舍:中文、繁體中文、英文各压在哪
所谓“中文 繁體中文 英文版”,指的是同一个 AMXX 1.8.1 核心里带了三种语言的data/lang文件。它不是三个不同的安装包,也不需要装三遍;语言是运行期按客户端选的语言去取字符串的。所以安装只做一次,三语共存靠语言文件齐全加上multilingual.amxx这个插件。
| 语言 | 语言代号(常见) | 影响范围 |
|---|---|---|
| 简体中文 | cn | 玩家菜单、管理命令回显、聊天提示 |
| 繁體中文 | zh | 同上 |
| 英文 | en | 默认语言,缺失的键会回落到这里 |
代号只是文件和配置里用的标识,真正起作用的是data/lang/*.txt里有没有对应的节。拿到包之后先扫一眼data/lang里common.txt、admincmd.txt、plmenu.txt这几个文件打开看看有没有多语言节,比在服务端反复重启快得多。
3. 正式安装:把 AMXX 1.8.1 挂进 addons 并让 modules.ini 生效
前面是准备工作,这一章是真正的安装动作。顺序不能乱:先落文件、再挂 Metamod、然后开模块、最后开插件。任何一步跳过去,后面排查都会多花一倍时间。
3.1 解压与落位:路径改名是第一个坑
拷文件这一步只有两个要求:不改名、不拍平。-a参数保留权限和符号链接,比cp -r更适合拷这种带二进制模块的目录:
cd /srv/hlds/cstrike/addons # 把包里解出来的 amxmodx 整个放进来,目录名保持 amxmodx cp -a /root/amxx181/amxmodx ./ # 属主换成 hlds 运行用户,否则 logs/ 和 data/ 写不进去 chown -R hlds:hlds amxmodx # 目录要能进、.so 要能读能执行 find amxmodx -type d -exec chmod 755 {} \; find amxmodx -name "*.so" -exec chmod 755 {} \; find amxmodx -maxdepth 1 -type d逻辑不复杂:cp -a是为了不丢权限位;chown是因为 hlds 一般不用 root 跑;chmod 755只给目录和.so,配置文件保持 644 就够。拷完立刻ls addons/amxmodx/dlls确认里面是amxmodx_mm_i386.so,不是压缩包里套的第二层同名目录——套一层是解压工具最容易造成的“翻车”点。
3.2 挂载 Metamod:liblist.gam 和 plugins.ini 两处都要动
Metamod 的挂载分两步。第一步告诉 HLDS“游戏 DLL 换成 metamod”,改的是cstrike/liblist.gam:
// /srv/hlds/cstrike/liblist.gam // 这个文件是 Quake 风格文本,注释用 //,不是 ; gamedll "addons/metamod/dlls/metamod.dll" gamedll_linux "addons/metamod/dlls/metamod_i386.so"第二步告诉 Metamod“再去加载 amxmodx”,改的是addons/metamod/plugins.ini:
; /srv/hlds/cstrike/addons/metamod/plugins.ini ; 格式:平台 + 相对 cstrike 的路径,一行一个 linux addons/amxmodx/dlls/amxmodx_mm_i386.so win32 addons/amxmodx/dlls/amxmodx_mm.dll参数说明只有两条值得强调:路径一律相对cstrike写,不要写绝对路径;平台前缀 Linux 必须写linux,写成win32在 Linux 上不会报“找不到”,只会安静地不加载。改完这两个文件,重启服务端,控制台敲meta list,看到amxmodx且状态是RUNNING才算挂上。
注意:
liblist.gam里gamedll_linux和gamedll两行都要留,很多整合包只改了一行,Windows 侧或 Linux 侧总有一边起不来。
3.3 modules.ini 和 plugins.ini:先跑核心,再逐个加功能
模块比插件先加载,模块坏了,依赖它的插件全是红字。所以第一次装不要一次开满,先把这几个打开:
; /srv/hlds/cstrike/addons/amxmodx/configs/modules.ini ; 分号开头是注释,取消注释即启用 fun engine fakemeta ; cstrike ; 只在用到 CS 相关 native 时开;开了以后别随意关,部分插件行为会变 ; hamsandwich ; geoip ; 要按地区做限制才开,还需要额外的数据文件 ; sockets插件这边同理,先只保留基础项,跑通再加自定义插件:
; /srv/hlds/cstrike/addons/amxmodx/configs/plugins.ini admincmd.amxx ; amx_map / amx_kick 这些基础命令 adminhelp.amxx ; 玩家端 /help 菜单 adminslots.amxx ; 预留通道 multilingual.amxx ; 三语切换靠它,装中文/繁體中文版必须保留 menufront.amxx plmenu.amxx mapsmenu.amxxmultilingual.amxx这一行是最容易被整合包删掉的。删了以后语言文件还在、配置也对,但客户端就是切不了语言,排查起来特别费时间。文件名一律带.amxx后缀,写成admincmd会静默跳过——插件不会加载,也不会报错,只在amxx plugins里少一行。
3.4 amxx.cfg:装完立刻要改的六个值
configs/amxx.cfg是 AMXX 的主配置,几百行里第一次只需要动六处:
; /srv/hlds/cstrike/addons/amxmodx/configs/amxx.cfg amx_default_access "z" ; 普通玩家的默认权限,z 表示只有最基础的权限 amx_password_field "_pw" ; 客户端 setinfo 里存密码的字段名,改名后老玩家要重设 amx_mode 1 ; 1 = 按 users.ini 校验密码;0 = 不校验 amx_show_activity 2 ; 管理操作是否广播,2 = 匿名广播,避免公开管理员名字 amx_language "cn" ; 服务端默认语言,没选过语言的客户端走这一档 amx_client_languages 1 ; 允许客户端自己切语言,关掉就只能用默认语言改这几个值的逻辑是:默认权限给最小、密码字段别乱改、模式先开校验、广播注意隐私、语言先定默认再放开客户端自选。键名在不同小版本里偶有出入,以你包里amxx.cfg自带的注释为准,不要照抄网上别版本的片段覆盖整段配置。
4. 三语共存配置:lang 目录、编码和两层语言设置
三语包能不能用,八成看编码,两成看语言设置。语言文件本身是纯文本,但 AMXX 读取时对编码敏感,这一点在中文服上体现得特别明显。
4.1 data/lang 结构:语言代号和文件的对应关系
data/lang下是一堆.txt,每个文件内部按[语言代号]分节。核心的几个文件决定了玩家看到的大部分文字:
cd /srv/hlds/cstrike/addons/amxmodx/data/lang ls | head -20 # 三语包里最该核对的是这几个: # common.txt 权限不足、命令用法这类通用提示 # admincmd.txt 管理命令的回显 # plmenu.txt 玩家菜单项 # mapsmenu.txt 换图菜单打开common.txt看一眼节头,正常长这样:
; addons/amxmodx/data/lang/common.txt(节选) [en] NO_ACCESS = You do not have access to this command [cn] NO_ACCESS = 你没有权限使用这个命令 [zh] NO_ACCESS = 你沒有權限使用這個指令如果只有[en]一节,说明这份包是英文原版,中文部分没打进去;如果[cn]里有内容但显示乱码,先别怀疑 AMXX,直接查编码。
4.2 编码:UTF-8 无 BOM,不要用记事本另存为 ANSI
语言文件必须是 UTF-8 且不带 BOM。BOM 会让文件里第一个键读不到,症状很隐蔽:其他提示都正常,只有某一句话显示成键名。GBK 更直接,整段中文变问号。查编码用两条命令就够:
cd /srv/hlds/cstrike/addons/amxmodx/data/lang # 看文件声明的字符集 file -i common.txt # 期望:text/plain; charset=utf-8 # 异常:charset=unknown-8bit(多半是 GBK/ANSI) # 看开头三个字节,确认没有 BOM head -c 3 common.txt | xxd # 期望不是 efbbbf确认是 GBK 之后,用iconv转一遍,转完再重启服务端:
# 先备份,编码转换是不可逆操作 cp common.txt common.txt.bak iconv -f GBK -t UTF-8 common.txt.bak -o common.txt file -i common.txt转完记得把整个data/lang目录扫一遍,一个文件坏掉就够让玩家觉得“中文版是假的”。改语言文件不需要重新编译任何东西,重启服务端或换图后生效。
4.3 服务端和客户端两层语言设置
语言有两层:服务端定默认,客户端自己选。服务端那层在amxx.cfg的amx_language "cn",客户端那层靠multilingual.amxx提供的菜单和命令。玩家进服后在控制台敲amx_language zh就能切成繁體中文,敲amx_language en切回英文;不记得命令的话,用amx_help翻一遍菜单也能找到语言入口。
自定义插件想支持三语,不能把中文直接写死在代码里,要用register_dictionary加%L:
// addons/amxmodx/scripting/cn_welcome.sma #include <amxmodx> public plugin_init() { register_plugin("CN Welcome", "1.0", "anon") // 不注册字典,%L 找不到键,客户端只会看到键名本身 register_dictionary("cn_welcome.txt") register_clcmd("say /cn", "cmd_cn") } public cmd_cn(id) { // %L 会让 AMXX 按这个客户端自己选的语言去 lang 文件里取串 client_print(id, print_chat, "%L", id, "CN_WELCOME") }对应的语言文件放在data/lang/cn_welcome.txt,文件名和register_dictionary里的名字必须一致,节名用en/cn/zh。编译用包里自带的编译器,别用新版本编译器产物:
cd /srv/hlds/cstrike/addons/amxmodx/scripting # -o 指定输出到 plugins 目录,编译产物才和 1.8.1 的核心匹配 ./amxxpc cn_welcome.sma -o../plugins/cn_welcome.amxx编译完在plugins.ini里加一行cn_welcome.amxx,换图,进服敲say /cn,三种语言各看一遍——这一步同时也是验证语言链路是否通的最快手段。
4.4 管理员配置:users.ini 的中文名和账号类型
管理员写在configs/users.ini,一行一个,四段用引号包起来:
; addons/amxmodx/configs/users.ini ; "名字" "密码" "权限串" "账号类型" ; 最后的 a 表示密码输错就直接断开,避免有人反复试密码 "值班管理员" "换成你自己的口令" "abcdefghijklmnopqrstu" "a"两个容易踩的点。一是名字带中文时,users.ini也必须是 UTF-8,用 GBK 保存会导致按名字认人失败,表现为“密码没错但就是没权限”。二是账号类型那一位决定服务端按什么认人——按名字加密码、按 IP 还是按 SteamID,含义写在文件顶部注释里,照抄网上老例子经常对不上。改完不用重启,控制台执行amx_reloadadmins重载即可,这比反复重启服务端安全得多。
5. 常见问题排查:起不来、插件不加载、中文变问号
装 AMXX 出问题的表现高度集中,就那么几类。下面五条是我自己踩过、也帮别人看过最多的,按“现象 → 原因 → 解决”记,遇到时逐条对。
5.1 服务端起不来、AMXX 挂不上
现象:服务端能启动,但控制台meta list里只有 metamod 一行,没有 amxmodx;或者启动日志里出现failed to load后面跟着addons/amxmodx/dlls/amxmodx_mm_i386.so。
原因:三种可能——metamod/plugins.ini里平台前缀写成了win32;路径少一层或多一层,比如写成addons/amxmodx/amxmodx_mm_i386.so;.so的属主或权限不对,hlds 用户读不到。
解决:先按 3.2 的相对cstrike路径逐字符核对,再执行ls -l addons/amxmodx/dlls/看权限位,最后chown -R hlds:hlds addons/amxmodx重启。三步走完基本都能挂上。
现象:meta list里有 amxmodx,但状态是BADF或PAUSED,玩家进服报错。
原因:多半是modules.ini里开了不存在的模块,或者logs/目录不可写导致核心初始化中断。
解决:amxx modules看哪个模块 bad load,先把modules.ini回退到 3.3 的最小集合;再确认logs/和data/属主正确、目录权限 755。不要图省事上 777,出问题时反而查不清是谁写的。
5.2 插件不加载、语言不生效
现象:amxx plugins里插件名后写着unknown或error,日志里出现Plugin uses an unknown function。
原因:插件是用更高版本 AMXX 编译的,引用了 1.8.1 没有的 native 函数。这是版本不一致最常见的表现形式。
解决:用包里自带的amxxpc重新编译.sma,或者换一份明确标注 1.8.1 的.amxx。编译前先看源码的#include里有没有你用不到的模块。
现象:中文显示成问号、方块,或者干脆显示成CN_WELCOME这样的键名。
原因:语言文件存成了 GBK 或带 BOM;客户端没设语言,走了[en]节;自定义插件忘了register_dictionary。
解决:按 4.2 用file -i和xxd查编码并iconv转换;客户端敲amx_language cn再试;插件源码里补上字典注册后重新编译。
现象:玩家能进服,管理员账号也写了,但命令提示“没有权限”。
原因:users.ini用 GBK 保存导致中文名匹配失败;改完没重载;账号类型那一位和实际登录方式不匹配。
解决:file -i configs/users.ini确认 UTF-8,控制台amx_reloadadmins,再进服试一次。还不行就把名字临时改成纯英文验证,能通就说明是编码问题,不通就回去检查权限串。
6. 装完怎么验证:四条命令加一张自检表
验证不要靠“感觉能玩”,要靠输出。我的习惯是从服务端控制台往客户端方向走一遍,四条命令按层递进:
# 第一层:元模块有没有挂上,amxmodx 必须是 RUNNING meta list # 第二层:功能模块有没有坏,重点看有没有 bad load amxx modules # 第三层:插件加载数量对不对,有没有 error / unknown amxx plugins # 第四层:版本号确认,避免旧文件覆盖导致实际跑的不是 1.8.1 amxx version四条都干净之后,再做一次客户端侧验证:进服敲amx_language zh看菜单是不是繁體中文,敲amx_language cn看简体,敲amx_language en看英文,最后say /cn看自定义字典有没有生效。三种语言来回切两遍,比只看一种可靠得多——很多编码问题是单文件级的,只测一种语言根本发现不了。
| 检查项 | 命令 | 期望结果 | 不符合时看哪里 |
|---|---|---|---|
| 元模块 | meta list | amxmodx状态RUNNING | metamod/plugins.ini、.so |
本文还有配套的精品资源,点击获取