03-24-2026, 08:45 PM
(此帖子最后修改于: 03-24-2026, 08:52 PM 由 小鸟unsigned.)
圣安地列斯联机二十年:SA:MP 与 open.mp 历史
2026 年。GTA6 即将在今年 11 月发售,新的时代正在敲门。
也是在这一年,《侠盗猎车手:圣安地列斯》PC 版上市整整二十年,SA:MP 的第一个可玩版本也已走过二十个年头。
一座从未被设计为联机游戏的城市,有人在这里认识了一辈子的朋友。有人在这里第一次学会了写代码。有人在角色扮演服务器里扮演一个JC或一个黑帮头目。有人在一个无聊的下午打开了游戏,然后就再也没有那个下午了。
SA:MP 从来不是一个精致的产品。它是一群人强行塞进一款单人游戏里的多人世界。它有数不清的 bug,有争议不断的管理者,有过漫长的停滞与分裂——它也有 open.mp,有一批不肯让它消失的开发者,有如今可以在手机上随时上线的客户端,不管你还记不记得服务器的 IP,不管你当年是服主、脚本开发者,还是只是一个普通的玩家——你在这里的时间是真实的。
GTA6 会带来它的世界。但圣安地列斯的街道,还在。服务器还在跑,玩家还在上线,有人还在第一次输入 /register。
前言
引用:本文以客观事实为准绳。所有关键事件、人物声明、原始帖文,均完整收录于正文之中,不以外部链接替代实质内容。链接仅作考证索引,供读者溯源查验,不构成叙述本身的一部分。
凡引用原文处,均以引用块标注,并注明来源与时间。凡转述处,均忠实于原意,不加渲染,不作价值评判。
这是一部关于热爱、控制、背叛与重建的故事,也是一个游戏社区在二十年间走过的记录。
卷首语:一个不该有多人模式的游戏
2004 年 10 月 26 日,《侠盗猎车手:圣安地列斯》(Grand Theft Auto: San Andreas)在 PlayStation 2 平台正式发售。2005 年 6 月 10 日,PC 版本上市。
这款游戏从未被设计为多人联机。Rockstar Games 为它设计了一个宏大的单人故事——主角 CJ 在帮派、JC与腐败之间挣扎求生,横跨三座城市、一片乡野。游戏没有联机大厅,没有服务器浏览器,没有任何供多人游玩的接口。
然而在 GTA 模组社区里,有一批人从不接受"这不可能"这个答案。
他们是一群来自世界各地的年轻人,大多数有着普通的日间生活——学生、程序员、上班族——他们一点一点地撬开这款游戏的外壳,试图将它改造成一个可以容纳数百人同时在线的多人世界。
这便是 SA:MP 的起点。
第一卷:诞生(2004–2006)
第一章 从 Vice City 到 San Andreas
在《圣安地列斯》PC 版尚未发售之前,GTA 模组社区已经有人在为《GTA 罪恶都市》(Vice City)制作多人联机改造,这个项目被命名为 VC:MP(Vice City Multiplayer)。
领导这支早期团队的,是一个网名叫 kyeman 的开发者,真名 Kye Bitossi。他在 GTA 模组社区中颇有声望,是公认的技术核心人物。
2005 年 4 月初,kyeman 在全球最大的 GTA 社区论坛 GTAForums 上发布了一篇帖子,正式宣布 SA:MP 项目的存在。帖子标题是:
引用:"[WIP] SA-MP: Multiplayer for San Andreas PC"
——kyeman,GTAForums,2005年4月3日
消息一出,社区立刻沸腾。预告视频和截图开始在各大 GTA 论坛流传,项目的小型社区论坛在尚未开放任何测试的情况下,已吸引了约 120 名注册用户。
公开 beta 测试期间,服务器承载能力远不及涌入的测试者数量,进入测试服务器需要排队等候,等待时间往往很长。这种盛况,是对整个项目最好的背书。
进入开发团队的成员,来自 GTA 模组社区的各个方向,过去的SA-MP 0.2开发者和测试者包括:kyeman、spookie、Y_Less、mike、jax、Mike、Cam、adamcs、bakasan、Born Acorn、Dalpura、Damian、Delfi、dexx、DrAke$、Drift、ECLiPSE、f3llah1n、him selfe、illspirit、littlewhitey、MrJax、njr1489、Posty、PsYcHoGoD、Shizz、Simon、sockx、squiddy、Static、steve-m、The Azer、Trix、Wacko、XcR、[ULK]Crack,其中许多人既是开发者也是测试员。
他们大多是业余爱好者,利用业余时间共同推进这个无人出资的项目。
第二章 合作模式的争议与团队第一次动荡
然而,SA:MP 从一开始便并非一片和谐。
开发团队内部,关于游戏核心玩法的方向,爆发了一场至今仍被一些老玩家提起的根本性争论:
一部分人主张将 SA:MP 建设为一款合作模式(Co-op)游戏,设想最多 6 名玩家共同游玩,保留完整的 NPC 行为、警察追捕系统与任务流程,让多人体验尽可能接近单人游戏的质感;
另一方,以 kyeman 为首,坚持将其建设为一个能够容纳大量玩家同时在线的大规模死亡竞技(Deathmatch)式多人服务器。
这场分歧并未在内部平息,而是溢出到了 GTANet 社区论坛,引发了玩家的大量公开讨论与批评,负面声音之多,令整个项目团队承受了巨大压力。
2005 年 9 月 18 日,kyeman 在持续的内外压力下,宣布因个人事务无暇继续领导项目,将主导权移交给团队二号核心开发者 spooky。
spooky 接手后,将项目更名为 GTA:Multiplayer(GTA:M),以示风格与管理方式的转变。
然而,约一个月后,kyeman 重新归队。合作模式方案在此期间被彻底搁置,项目名称最终改回 San Andreas Multiplayer(SA:MP),方向确定为大规模多人在线游戏。
关于"Grand Theft Auto"字样是否应出现在项目名称中,团队在命名时也有过考量——使用 Rockstar 的商标可能引发法律风险,最终以缩写"SA:MP"作为正式名称,在一定程度上规避了这一问题。
第三章 2006 年:第一个可玩版本
在经历了那段动荡之后,SA:MP 于 2006 年 发布了第一个向公众开放的可玩版本。
从技术层面看,这是一项相当可观的成就:开发者们在完全没有官方支持的前提下,用逆向工程的方式强行将联机功能"嵌入"进一款从未被设计为多人联机的作品,使其能够支持最多 1000 名玩家同时在线,在同一片虚拟的圣安地列斯地图中驾车、射击、竞速。
服务器使用 Pawn 作为脚本语言,服务器主可以自行编写游戏模式(GameMode)与过滤脚本(FilterScript)。这一设计赋予了整个生态极高的开放性——任何人只要学会 Pawn,就可以在圣安地列斯的地图上建造出属于自己的世界。
0.2.2 版本是这一阶段的代表版本,也是现存有据可查的最早可玩 SA:MP 版本记录之一。
第二卷:黄金时代与暗流(2006–2009)
第四章 版本迭代与社区的兴盛
2006 年至 2014 年,是 SA:MP 最活跃的开发阶段。Kalcor(此时 kyeman 已开始使用这个网名)陆续发布了一系列重要版本:
0.2 系列(2006–2008)期间,SA:MP 奠定了基本架构,确立了 Pawn 脚本语言作为游戏模式开发的标准。这段时间并非全然顺利——一次大规模安全漏洞爆发,险些让整个团队就此放弃。而最终让他们坚持下来的,是一份在线请愿:短短时间内,数以千计的玩家签名支持 SA:MP 继续存在。这份来自社区的温度,让开发者重新燃起了动力。
0.3a(约 2010 年)是 SA:MP 历史上最具里程碑意义的版本之一。单服务器玩家上限从原来的数百人扩展至 500 人(后续版本更高),引入了鼠标驱动的记分板与聊天界面,增加了可编程的 NPC 机器人系统(允许服务器创建可驾驶火车、飞机的脚本机器人),网络同步质量大幅改善。
此后数年,0.3c、0.3d、0.3e、0.3x、0.3z 相继发布,带来了音频流媒体支持、延迟补偿模式、自定义对象渲染距离、新的安全更新等功能。每一个版本的发布,都在 SA:MP 官方论坛的"新闻与更新"板块留下了一条由 Kalcor 亲自发布的公告。
2015 年 5 月 1 日,Kalcor 发布了 SA:MP 0.3.7,这是 SA:MP 有史以来最后一个带有实质性新功能的正式版本。0.3.7 新增了超过 500 个物体 ID(含特技物件与地形物件)、界面字体大小调整选项、若干新版警察皮肤、服务端对车门与车窗的控制权、为未标记警车添加警报灯的能力,以及一个简单的静态 NPC actor 系统。
这个版本在此后数年间成为整个 SA:MP 生态的事实标准,直至今日仍是服务器主最常使用的版本。
与此同时,这个社区在技术之外也在野蛮生长。角色扮演(RP)服务器在这段时期走向成熟,玩家们在 SA:MP 的世界中建构起了拥有经济系统、帮派政治、法律体系的虚拟社会。来自世界各地大型服务器先后崛起。SA:MP 不再只是一个小众模组,它已经成为一个真实的、活跃的、跨越语言与国境的国际社区。
第五章 Y_Less 的双重身份与 YSI 的诞生
在 SA:MP 的所有社区开发者中,有一个人的名字几乎是无可回避的:Y_Less,真名 Alex Cole。
Y_Less 最初以 beta 测试员的身份加入 SA:MP 团队,随后正式成为开发团队成员,主要负责 Pawn 脚本语言相关的功能开发。然而,他与 Kalcor 之间的分歧,从他正式入队的第一天起便已埋下。
用 Y_Less 自己后来的话说:
引用:"加入开发团队之后,我开始开发 Pawn,但我发现自己能做的事被 Kye 严重限制。我们之间存在重大的意见分歧:他认为 90% 的开发精力应该投入同步(sync)工作,Pawn 几乎只是顺手提供一点额外功能的附属品。而我认为,虽然同步很重要,但他已经把同步覆盖得很好了,我更想专注于 Pawn 的功能与函数。然而他是老板,说了算,严重限制了我被允许做的事。此外,他有个坏习惯——每次版本迭代之后,只要在某个细枝末节的测试中有任何不稳定,就要来指责我,尽管测试本来就是我们有 beta 测试团队的原因。不用说,这不是一个好的工作环境,但我仍然喜欢 SA:MP 这个产品本身。"
在这种压抑的工作环境中,YLess 于 2007 年 开始独立开发 YSI(YLess' Server/Script Includes)。
YSI 最初是他此前若干工具的整合与升级,同时也是他在 Kalcor 的管控边界之外,以纯 Pawn 脚本的方式,实现他认为 SA:MP 脚本系统应当具备的扩展能力。他在这个过程中也加入了一些辅助性的函数,例如 player objects 功能,最初是专门为了支撑他的对象流式传输器
e_objects 而写的。用 Y_Less 自己的话说:
引用:"2007 年,我开始开发 YSI。这部分是对若干早期工具的更新与整合,部分也是在 Kye 的控制之外,以 Pawn 能力范围内的方式带来我认为 Pawn 所需的扩展功能——尽管以纯 Pawn 来做,能实现的事情自然有其上限。YSI 成为我的主要项目这一事实惹恼了 Kye,因为他认为这说明我没有把时间花在 SA:MP 上,尽管我实际上一直都在。"
YSI 涵盖了命令处理(ycommands)、玩家迭代器(yiterate)、钩子机制(yhooks)、INI 文件读写(yini)、多语言支持(y_languages)等数十个子模块,是当时 SA:MP 社区功能最全面、使用最广泛的第三方脚本库。
至于"YSI"到底代表什么,连 Y_Less 本人也说不清:
引用:"最初的想法是'Y[i]Less' Server Includes',但 Server 和 Script 经常被混用,而且现在参与的开发者不止 YLess 一人,所以'Y'就变成了一个递归缩写,代表'YSI'本身。"[/i]
第六章 2008 年底:GTANet 风波与团队大出走
2008 年底,SA:MP 开发团队内部爆发了一场与 GTANet 社区相关的严重矛盾。关于这场风波的具体细节,现有的公开资料已难以完整还原,但其结果是清晰且影响深远的:Mike、aru 和 Peter 等多名核心开发者相继以此为由宣布离队。
Y_Less 在日后的声明中这样描述这段经历:
引用:"2008 年底,GTANet 风波爆发,Mike、aru 和 Peter 因此离开,我也因为团队氛围实在太差,加之大家都在走,便也一同离开了。"
这一波出走之后,SA:MP 的开发工作几乎完全落回 Kalcor 一人肩上,这进一步强化了整个项目对他个人的高度依赖,也使得社区的任何集体意见都更加难以产生实质影响。
然而事情并未就此平息。Y_Less 出走后,出于他自己也说不清的原因,重新回归了团队。他在后来的声明中写道:
引用:"不知为何,真的记不清了,我之后又重新加入了团队。那时候 Kye 想要关闭 SA:MP,我提出愿意接手,他拒绝了。然后我再次退出——不是因为我没接手到,这一点需要说明——于是 Kye 决定封禁我的论坛账号,而且不只是封号,而是彻底抹除——删掉了我所有的帖子。这意味着原版《实用函数》帖没了,旧版 FAQ 帖没了,大量迷你教程没了,《Pawn 关键词》帖也没了——我只有在非常必要的时候才发帖,那些帖子都有其存在的价值,它们的消失被大量用户注意到并提出了强烈抗议。"
这便是 2008 年底那次"第一次封号"事件的始末——相对低调,但已经是一个信号。真正震动整个社区的风波,还在后面。
第七章 2009 年 1 月:YSF 封号事件
从团队再度离开之后,YLess 没有停止为社区创作工具。他开发了 YSF(YLess' Server Fixes)——一个以服务端插件形式存在的 bug 修复集合。
YSF 的设计理念很简单:SA:MP 有很多 Kalcor 长期忽略或拒绝修复的 bug,既然拿不到源代码,那就通过内存操作(memory patching)的方式,在运行时强行修正这些行为。这个方法技术上相当复杂,但效果立竿见影。
Y_Less 事后这样形容 YSF:
引用:"YSF 是我最成功的项目,因为它做到了所有人都想要的事。它本质上是一个更新版的服务端——人们总是渴望新版本带来修复和新功能,功能方面已经有其他插件(包括 YSI 插件)覆盖了,所以我选择了修复这条路(以及一些小功能——显然正是这些小功能引发了麻烦)。"
YSF 在社区中广泛流传,大量服务器安装并使用它。
2009 年 1 月 19 日,事件的直接导火索被点燃。
当天,Kalcor 私信给 Y_Less,表达了对 YSF 的不满。他的顾虑有两项:
第一,他认为 YSF 可能与 SA:MP 未来版本产生脚本兼容性问题;第二,他认为 YSF 代码中存在与 SA:MP 服务端源代码相似的内容,以
functions.cpp 中的 IsNickInvalid 函数为例。Y_Less 对此逐一作出回应。关于兼容性问题,他指出 YSF 恰恰是在让脚本对未来版本更加兼容,而非相反;关于源代码问题,他坦言:
引用:"这实际上并非盗用,但我承认看起来非常相似,因为它做的事情完全一样,而且也不是什么复杂的函数,我懒得争,就直接把它彻底重写了。"
他还顺带提到,Kalcor 自己曾主导过一些令他反对的修改决策——比如改变服务端的默认运行风格,以及在 0.3 版本中移除对象(最后改为以 IPL 文件形式替代,而非完全移除)——当初他的反对意见被 Kalcor 直接否决。
双方讨论的最终结果,表面上是达成了共识:Kalcor 表示接受了 Y_Less 的解释,YSF 可以继续存在。
然而,Y_Less 第二天登录论坛,发现自己已经被封号。
他在后来的声明中还原了这段过程:
引用:"就在我们讨论同意 YSF 可以继续存在,之后,他发现了 SetServerRule,并意识到它可以用来修改只读控制台变量——比如服务器版本号——从而让人们能够违反 SA:MP 服务条款第(g)条:'你不得人为地增加玩家数量,或向 SA:MP 查询机制提供虚假信息。'"
Kalcor 认为,Y_Less 在 YSF 中提供了这样一个功能,就等同于为违规行为提供了手段,因此必须承担责任。
封号通知的原文如下(Y_Less 在声明中直接引用):
引用:*"抱歉 ssǝן‾ʎ,你已被禁止使用本论坛!
滥用前开发者身份。入侵服务器,并为他人违反服务条款提供手段。"*
封号的同时,Kalcor 再次删除了 Y_Less 在 SA:MP 官方论坛上的全部历史帖子。大量教程、工具发布帖、FAQ 就此永久消失,众多用户注意到这些帖子的蒸发,并提出了强烈抗议。
Y_Less 随即在社区发布了一篇完整声明,以下是他原文的核心段落:
引用:"基本上,我因为 YSF 被 SA:MP 官方论坛封号了!
历史:
200x 年(实在记不清了),在与 Spookie 讨论之后,我以 beta 测试员的身份加入了 SA:MP 团队——那还是第一次公开 beta 之前的事——并开始编写 Pawn 相关的代码。
没过多久,我正式加入了开发团队,专注于 Pawn 的开发,但我很快发现自己受到 Kye 的诸多限制,做不了想做的事。我们之间存在重大分歧:他认为 90% 的开发精力应该用于同步(sync),Pawn 只是顺手提供一点额外功能的附属品;而我认为,虽然同步很重要,但他已经把同步做得很好了,我更想把时间花在 Pawn 的功能扩展上。然而他是老板,说了算,严重限制了我能做的事。更让人受不了的是,他有个习惯——每次版本迭代后,只要在某个犄角旮旯的测试里出了任何小问题,就要来责怪我,哪怕我们有 beta 测试团队本来就是为了发现这些问题的。说实话那不是一个好的工作环境,但我还是喜欢 SA:MP 这个产品本身。
2007 年,我开始开发 YSI。这一方面是对此前一批旧项目的整合升级,另一方面也是想在 Kye 的管控之外,以纯 Pawn 脚本的方式实现我认为 Pawn 所需要的扩展功能——尽管能做到的事情有限,毕竟纯 Pawn 本身有其局限(我确实额外添加了一些辅助函数,比如 player objects 功能完全是为了写我最初的对象流式传输器 e\_objects 而专门实现的)。YSI 成为我的主要项目这件事惹恼了 Kye,因为他觉得我没有把时间花在 SA:MP 上——尽管我实际上一直都在。
2008 年底,GTANet 社区风波爆发,Mike、aru 和 Peter 因此离队。我也因为团队氛围实在太差,加上大家都在走,便也跟着离开了。
不知为何(真的记不清了),我之后又重新回归了团队。那时候 Kye 想要关闭 SA:MP,我主动提出愿意接手,他拒绝了。然后我再次退出——不是因为没接手到,这一点需要说清楚——于是 Kye 决定封禁我的论坛账号,而且不只是封号,而是彻底抹除,删掉了我所有的帖子。这意味着原版《实用函数》帖没了,旧版 FAQ 帖没了,大量迷你教程没了,《Pawn 关键词》帖也没了——我只有在非常必要的时候才会发帖,那些帖子都有其价值,它们的消失被大量用户注意到并提出了抗议。
不管怎样,我还是喜欢 SA:MP 和这个社区本身(至少喜欢其中的一部分),所以我还是留了下来(现在回想起来真不知道当时为什么,深感后悔),并继续努力让 SA:MP 变得更好——尽管 Kye 的存在让这件事很难。我继续开发 YSI、写教程和帮助帖,后来又创作了 YSF。YSF 大概是我最成功的项目了,因为它做到了所有人都想要的事。它本质上就是一个改进版的服务端——人们总是渴望新版本带来修复和新功能,功能方面已经有其他插件(包括 YSI 插件)覆盖了,所以我选择了专注于修复这条路(以及一些小功能——显然正是这些小功能引发了这次麻烦)。
总之,Kye 和我一般都各自行事、互不干扰(至少我是这么以为的),有一段时间相安无事。直到 2009 年 1 月 19 日,我收到了 Kye 的消息,说他不太喜欢我在 YSF 里做的事。经过一番交涉,才明白他的顾虑在于:YSF 可能与未来版本的脚本产生兼容性问题(这话从他嘴里说出来真是讽刺——我当初就反对过他把默认运行方式改掉,以及 0.3 版本里删除对象的决定,但他否决了我;对象最后是改成了 IPL 文件的形式,而非完全删除,但也没有了 per-player objects,至少我最后听到的消息是这样)。此外,他还质疑 YSF 里有 SA:MP 服务端的源代码——他举的例子是 functions.cpp 里的 IsNickInvalid 函数。这个函数其实不是照抄的,但我承认看起来确实很像,毕竟它做的事完全一样,而且也不是什么复杂的函数,我懒得争,就直接把它彻底重写了。在我指出 YSF 并不会造成兼容性问题(恰恰相反,它让脚本对未来版本的兼容性更好),并同意日后不再使用 SA:MP 源代码(尽管我此前一直在刻意避免这样做)之后,他让步了。
第二天我上论坛,发现自己已经被封了……
原来在我们达成共识之后,他又发现了 SetServerRule 这个功能,意识到它可以用来修改只读控制台变量(比如服务器版本号),从而让人能够违反 SA:MP 服务条款第(g)条:'你不得人为地增加玩家数量,或向 SA:MP 查询机制提供虚假信息。'
我解释说,我本人根本没有这样做,这个功能的设计初衷是好的,只是不幸被人滥用了。我甚至想过反问他:他提供论坛和 IRC 频道,同样也给人们提供了违反条款(c)(d)条的方式,按他的逻辑,他也应该被封号——但我懒得说了。封号通知的原文是:
'抱歉 ssǝן‾ʎ,你已被禁止使用本论坛!滥用前开发者身份。入侵服务器,并为他人违反服务条款提供手段。'
所谓'滥用',是指我用它改善了所有人的游戏体验;所谓'入侵服务器',是指我修复了它;所谓'提供手段',意思是人们可以拿我提供的工具做坏事——但这不代表我支持或认可这种行为,这只是一个有用工具所带来的无奈副作用。
Kye 说 YSF 的事已经覆水难收,他只能发布新版本来屏蔽它,伤害已经造成,它已经广泛传播,人们正在用它黑自己的服务器,没有人能阻止,所以我必须被封。我回应说,如果我没被封,我本来可以发布最新版本,在修复拾取物 bug 的同时,加入对规则的只读标志检查——虽然这无法彻底解决问题,但能大幅减少滥用,因为几乎没有人会主动把它改回旧方式,大多数人会为了这个重要修复而升级。说到这里,他就不再回复我了(我觉得他是意识到自己断掉了快速、高效解决这件事的唯一合理途径,然后不想认账了——如果不是这样,我欢迎他来回应)。
总之,我决定把当时正在写的那段代码(YSI 的示例脚本)收个尾,毕竟我还是喜欢使用 YSI 的那些人,上传最终版本,然后就此结束。
所以,截至目前:YSI 1.0、YSF 1.0、YSI2 1.0、YPI 1.0,到此为止,我不干了。
附言:Kye 正在研究一种过滤"修改版本服务端"并将其列入黑名单的机制——我可能会发布一个不自动修改版本号的 YSF 版本,这样用它的人就不会因为我的失误被连坐;请留意这里的动态(我可能也会顺带加入拾取物修复,但不会保留只读变量相关的功能)。
附言二:IRC 才是王道,我还活跃在 GTANet 的大量频道里,包括 #YSI 和 #Y_Less,欢迎来找我。
附言三:不知道 MTA 的源代码长什么样……"
——Y_Less,2009年1月,TMS Forums
这篇声明在社区引发了强烈反响。数日后,经社区压力,Y_Less 得以解封,YSF 在不修改只读变量的前提下被允许继续使用。从表面上看,风波平息了。
但那句"附言三"——"不知道 MTA 的源代码长什么样"——如今读来,已不再只是一句无心之语。
第三卷:停滞、管控与分歧(2014–2019)
第八章 0.3.7 之后的沉寂(含源码泄漏事件)
2015 年 5 月 1 日,SA:MP 0.3.7 发布。此后,Kalcor 在新功能层面的开发近乎陷入停滞。
2018 年前后,Kalcor 发布了 SA-MP 0.3.DL——一个支持服务端向玩家客户端推送自定义模型(Download Content)的版本。这是社区长期以来最渴望的功能之一,玩家们可以在 SA:MP 服务器上看到服务器自定义的车辆、皮肤、物件模型,而不再局限于原版游戏资产。
然而 0.3.DL 的推出并不顺利:安全问题(恶意服务器可能推送损坏的模型文件危害客户端)和与旧版 0.3.7 的兼容性问题,使得相当一部分服务器拒绝迁移。SA:MP 社区自此一分为二,0.3.7 阵营与 0.3.DL 阵营长期并存。
这种分裂令社区感到困惑与沮丧。有人多次在论坛呼吁将两个版本合并,但得不到任何回应。
源码泄漏事件(2010 年起源,2018 年爆发)
在 0.3.DL 引发社区分裂的同一时期,另一条隐患也终于浮出水面。
2018 年 11 月 15 日,SA:MP 官方论坛上出现了一篇由用户 Kshishtof 发起的帖子,标题是《SA-MP 源代码泄漏》。帖子指向一个名为 rw-mp.net 的项目,该项目被认为是基于泄漏的 SA:MP 源代码构建的独立多人联机分支。
帖子引发了社区的激烈讨论。一部分人对 rw-mp 持同情甚至欣赏的态度,认为它至少在做 SA:MP 不再愿意做的事;另一部分人则斥之为对原作的窃取与侮辱。
2018 年 11 月 16 日,Kalcor 亲自在帖子中出现,发表了两段回应。第一段揭示了这批泄漏源码的来历:
引用:"SA:MP 的源代码于 2010 年被一名法国人从我们的服务器上黑掉,目的是为 IV:MP 这个 mod 服务。我记录并上报了这次入侵。
GitHub 上大约有十个副本。我一直没有把它们下架,是因为提交 DMCA 申诉需要将我的真实姓名录入 GitHub 的公开 DMCA 数据库,否则就得花钱请律师。"
第二段话语气更为强硬,是一封事实上的法律警告:
引用:"0.2.5 的源代码是通过计算机入侵从我们的服务器上盗取的。任何基于该代码发布软件的人,都涉嫌与我们作对的刑事共谋。
SA:MP 所使用的 RakNet 版本并非开源,而是通过付费许可证使用的。BASS 音频库同样是付费许可证使用的。整个游戏 mod 社区正在被那些删除原始版权信息、将他人成果冒充自己作品重新发布的蠢货所伤害。
我给他们几天时间关闭并停止任何与 SA:MP 相关的活动。"
——Kalcor,SA:MP 官方论坛,2018 年 11 月 16 日 原帖:https://sampforum.blast.hk/showthread.php?tid=660866
这段声明揭示了几个此前从未公开过的重要事实:
其一,SA:MP 源码泄漏的根源远早于 2018 年——2010 年就已经发生了一次有据可查的服务器入侵事件,是一名法国黑客为了支持 IV:MP(GTA IV 的多人 mod)而实施的。这与 Kalcor 在 2019 年 pawn.wiki 文章中所说的"R* 给 MTA 的代码被用于攻击 SA:MP"形成了完整的脉络——他所遭受的代码安全威胁,来自不止一个方向。
其二,Kalcor 之所以始终不对 GitHub 上的泄漏副本提交 DMCA,并非不知情或不在意,而是出于一个极具讽刺意味的现实顾虑:提交 DMCA 需要将他的真实姓名公开录入数据库,而他不愿意这样做。源码在网上流传的同时,他本人却因为隐私顾虑而放任不管。
这次事件在社区中引发了新一轮关于"Kalcor 应不应该直接将 SA:MP 开源"的讨论。部分社区成员认为,既然源码已经通过非法途径广泛流传,不如主动开源,至少可以让社区以合法的方式参与改进。这个声音 Kalcor 听到了,但他的答案,在两年后的 pawn.wiki 那篇文章里已经说得很清楚。
第九章 Kalcor 眼中的历史:MTA 的旧账、R\* 的源码,与闭源的真实理由
编年史至此已经写了许多关于 Kalcor 的事——他的决策、他的封号、他的沉默——却始终没有给他一个真正完整的出场。他是从哪里来的?他为什么那样做?他拒绝开源的理由究竟是什么?
2019 年 10 月 25 日,就在 Kalcor 于 SA:MP 官方论坛发布某条帖子后不久,俄语 Pawn 开发者社区 pawn.wiki 上出现了一篇由用户 m1n1vv 整理、转述并翻译的长文,标题是《SA-MP 0.3.9 与 Kalcor 的新故事》。这篇文章完整记录了 Kalcor 这篇帖子的核心内容——那是迄今为止他对自己技术履历与闭源立场最完整、最直接的一次亲口陈述。
以下是 Kalcor 在那篇帖子中所说的全部内容,经 m1n1vv 翻译并整理,原文以俄文发布于 pawn.wiki:
引用:那么,请允许我给你们讲一段历史。结论由你们自己得出。
2003 年,在 MTA 的 IRC 频道上待了一周之后,我被邀请加入 MTA:VC(Vice City Multiplayer)的开发。几个月后,我晋升为 MTA 的首席开发者。以下是一张截图,记录了我和 Si|ent 一起尝试让 MTA:VC 中的船只同步正常工作的画面,日期是 2003年12月31日。
我是 MTA:Blue 的少数开发者之一——这是 MTA 针对罪恶都市的新版本。那时候除我之外,大多数人都被现实生活拖住了。我开发了玩家上下文切换同步系统,并引入了 RakNet 库。同样的系统至今仍被 SA-MP 和 MTA:SA 所使用。
这种处境让我感到沮丧——一周又一周过去,只有我一个人在提交代码,而论坛上却有一堆"开发者"在大谈特谈一切将会如何运作。
于是我离开了 MTA 的开发。在我离开期间,另一个叫 eAi 的人加入了项目,开始研究我的代码,试图弄清楚它是怎么工作的。至少有人在做事了——他的方式是去主动联系各方,于是他通过 ICQ 找到了我,还找到了 R(Rockstar Games)开发者的电子邮件地址,并与他们取得了联系。*
那时候我对 GTA 多人联机并不感兴趣。我有一个乐队,还参与了 ipodlinux 等项目,但 eAi 似乎非常热衷于推动 MTA:Blue 取得进展。于是我重新加入了项目,持续了几个月。
以下是 2004年底 MTA:Blue 的公开宣传页面存档。
正是这件事导致了我和 MTA 其他开发者之间的决裂:我想要构建一个服务端系统——就像 VC-MP 的 ini 脚本系统,以及 SA-MP 中基于 Pawn 脚本的服务端系统;而 MTA 的开发者们则想要客户端扩展,就像那个宣传页面上描述的那样。
2005年初,我再次离开了 MTA。就在那段时间,R North 在 PS2 上发布了 GTA:SA,并正在开发 PC 版本。eAi 与 R 的技术总监有联系,还通过 ICQ 向我炫耀说,他拿到了大量 GTA:SA 源代码的头文件。我注意到,MTA 的开发者们似乎打算放弃罪恶都市版的 MTA:Blue,转战 GTA:SA。
不相信 MTA 及其开发能力,2005年中,我开始独立开发自己的多人联机。我发布了 VC-MP,基于玩家上下文切换和 RakNet。
随后,我与 jax、spooky 以及其他一些人一起开发了 SA-MP。它远比之前的 mod 庞大得多。我们与 GTANet/GTAForums——最大的 GTA 非官方粉丝站——有着较为密切的联系,这使我们获得了更大的知名度。
到 2008 年,SA-MP 的玩家数量是 MTA 的 10 到 20 倍。MTA 的开发者们感到在这种竞争环境下已无法与之抗衡,于是他们公开了自己的源代码。MTA 的开发者们从未询问过我或任何前任开发者,是否可以公开这些源代码。他们声称所有东西都已经被重写了,但事实并非完全如此。时至今日,MTA:SA 中仍然有我的代码。我没有费心去追究他们,因为他们看起来太蠢了——但我猜,这里那些呼吁公开 SA-MP 源代码的人,很可能是受到了 MTA 的启发,尽管他们或许不应该这样。
而这就是现在正在发生的事:我为 MTA 开发的"游戏"代码,以及 R\ 给 MTA 的源代码,正在被移植进 mod\so\beit——一款流行的 SA-MP 外挂工具。*
你们知道这意味着什么吗?R\ 给 MTA 的那部分源代码,有相当大一部分被用来——攻击 SA-MP!*
从一小批相当专业的 MTA 开发者起步,这件事已经演变成了极度肮脏的东西。那些想要摧毁 SA-MP 的人,对于是否违法毫不在意。
看起来,任何被公开的源代码都可能被用来攻击 SA-MP——尽管它本可以被用于提供有价值的更新。
公开 SA-MP 源代码这个决定,归根结底取决于:我们是否仍然处于这种充满敌意的环境中——人们在攻击我、想要攻击 SA-MP——还是这一切已经成为过去。我想说,这取决于 mod 的规模以及对外挂工具的需求程度。封闭源代码让我可以在每次发布时重新洗牌所有内部结构,使大量外挂工具失效。SA-MP 的许多"安全"更新,实质上就是我在重新排列数据,以清除现有的外挂工具。
最终,SA-MP 将会走到这样一个时刻:所有人都彼此友善和尊重,外挂与欺诈变得罕见——但届时玩家数量将极为稀少,我们中的大多数人也已不在了。
——Kalcor,2019年10月,SA:MP 官方论坛
(由 m1n1vv 转述并整理,经 Типичный Скриптер 译为俄文,发布于 pawn.wiki,2019年10月25日)
这篇陈述,是理解 Kalcor 其人与其决策的关键文献。
它第一次完整地揭示了他的来历:他不是凭空出现的 SA:MP 创始人,而是一个从 MTA 内部出走的人。2003 年至 2005 年间,他在 MTA 团队中担任首席开发者,亲手构建了玩家同步系统与 RakNet 架构——而他愤而离开,正是因为他坚持的"服务端脚本系统"方向遭到其他成员的反对。SA:MP 的诞生,某种程度上是一次对 MTA 的报复性创业。
它也第一次给出了 Kalcor 拒绝开源的真实逻辑:他不是在藏私,也不是单纯的控制欲作祟——在他看来,闭源是他对抗外挂工具的核心武器。他承认 SA:MP 的许多所谓"安全更新",实质只是重新排列内部数据结构,使依赖固定内存地址的外挂工具在新版本中失效。一旦开源,这条防线便彻底坍塌。
而他与 MTA 之间的积怨,在这篇文章里也首次有了完整呈现:他认为 MTA 在开源自己的代码库时,从未征得他这位最初作者的同意;更令他愤怒的是,他随后发现,R\* 曾向 MTA 提供的部分 GTA:SA 源代码头文件,辗转流入了 SA:MP 外挂工具的制作者手中——成为攻击 SA:MP 的武器。这份偏执与防御,贯穿了他此后对待社区和开源请求的所有态度。
这篇发布于 2019 年 10 月的文章,距 Kalcor 宣告放弃 SA:MP 仅剩不到一个月。这是他在离开之前,最后一次试图解释自己。


