我的第一个模组
This page either contains information that is only partially or incorrectly translated, or there isn't a translation yet.
If this page cannot be translated for some reason, or is left untranslated for an extended period of time after this notice is posted, the page should be requested to be deleted.
Also, please make sure the article complies with the alternate languages guide.
此教程会教您如何建立一个简单的mod。这个mod中我们会修改Half-Life 2的火箭速度。本教程使用Source SDK 2007但是同样应用于Source SDK 2013。
创建项目
我们将本教程mod叫做「Mymod」。您自己的mod可以随意叫任何名字(如「Quickmod」「TreasureTroll」「Old Man With Melons Mod」等。)
注意我们要求最新版本的源码,请通过refresh the SDK content来获取。
创建mod项目:
- 打开Source SDK,它位于Steam的Tools菜单里面。
- 请选择Source Engine 2007的版本。
- 打开Create A Mod从Utilities组。
- 请选择modify Half-Life 2 Single Player或 modify Half-Life 2 Multiplayer。
- 选择mod的路径安装(即
C:\Mymod)。 - 输入您的mod名字,本教程使用「Mymod」。
- 完成剩下的步骤。
然后Steam将把源代码复制到您选择的目录,现在可以开始修改之旅了。
准备解决方案
- 请参阅Compiling under VS2008 / 2005 / 2010 / 2012 / 2015,并以适当者为准。
- 参阅Launching from Visual Studio。
改变火箭的速度
如果您修改的是Half-Life 2: Singleplayer在解决方案浏览器,打开文件Server Episodic > Source Files > HL2 DLL > weapon_rpg.cpp。
否则打开hl2mp_dll/weapon_rpg.cpp。
在开头您可以找到以下定义:
#define RPG_SPEED 1500
改变它:
#define RPG_SPEED 400
通过修改这个数字,我们便告诉了火箭的速度是400单位(或者33英尺或10米)。先前则是1500单位(125 ft/s, 38 m/s)。当您启动mod的时候您会直观的感受到速度的变化。
编译项目
现在我们准备编译项目了。选择 Build->Build Solution 开始。请求的编译完成后会出现一个server.dll和client.dll文件,位于Mymod/bin 目录。(即C:\Mymod\Mymod\Bin)。这是我们的mod客户端和服务器的自定义DLL,也是未来游戏发布的一部分。
启动mod
在启动之前,我们需要确保一些重要的东西启用。默认的,新mod会使用 AppId 215(半条命2第一章)或218(橙盒)。这会加载目前版本的Source SDK Base,您可以在mod目录的这个地方GameInfo.txt file修改它。
SDK Base 仅提供与 Half-Life 2(半条命2) 共享的资产,但如果你想要使用特定游戏的资产或者HL2地图,你需要更改 AppId 为你想要的游戏的APPID。 如果你想"挂载"其他资产的游戏 你可以挂载。除非你知道你在做什么,否则你应该避免使用。该页面有关于此的解释
在你创建你的mod的目录里, 会有一个叫 run_mod.bat的Windows 批处理文件。 先别用这个bat文件启动你的mod,因为它还没被更新到SDK Base里面。启动你的mod的最好方式是在Visual Studio按F5,或者重启你的Steam并从游戏列表启动 (它应该会出现 - 若没有,检查AppId)。
你的单人mod里面没有任何地图,,你可以使用 GCFScape复制些Half-Life 2的地图至 SteamApps/Sourcemods/你的mod/maps/ 里。 使用控制台键入 "map " (包含空格) 然后选择地图加载,例如: (e.g. map d1_canals_01) 然后继续在控制台键入 "impulse 101" 使你得到一堆武器。
现在你有资产可以加载了,启动游戏。当引擎加载完毕后,你的游戏将会加载标题屏幕。 若收到关于资产缺失的内容,例如maplist.txt,无需在意。
在"设置", "键盘",里的"高级", 勾选“启用开发者控制台”. 按波浪键 (~) 打开控制台 Developer Console. 此控制台会为你提供许多工具来帮助你为起源引擎(Source engine)创建资产内容。
steamapps\[你的Steam ID]\half-life 2\hl2\maps被找到
sv_cheats 1"使"impulse 101" 指令有效
选择RPG,発射!!!看看火箭有没有改变速度。
调试技术
你在使用发布的模组配置时候难免会出现一些疑问。陷入问题时候更改为调试模式(Debug)。在继续之前, 我(不是指译者,但是我也赞同)必须告诉你改起源代码来学C++是非常难的。 你会更好地受益于那些为学习C++设计的大量教程,然后应用于你修改的代码中。
导航代码:RPG_SPEED是什么鬼?!?!?
在游戏代码里, 右击RPG_SPEED然后选择Find all references...(找到所有的引用)。然后就会显示Find Symbol Results pane(查找标志结果窗)。点击加号(plus)使结果详细。第一个显然是定义,之前一直在玩的部分。 其他两个是RPG_SPEED实际在哪个位置被使用。 双击最后一个。
此操作将给你一个名为void CMissile::IgniteThink()的函数。当火箭第一次被発射时,此函数不会启动。这段代码被用于给火箭点火,或者 “被执行”, 来启动火箭。所在的代码行是:
SetAbsVelocity( vecForward * RPG_SPEED );
设置火箭的速度参数 (方向和速度)。 如果你不知道某些代码或者什么的,多使用Find all references...(找到所有的引用), Go to Definition(前往定义),然后 Go to Declaration(前往声明)这些工具。它从哪来,又在干什么。 这些工作可以很好地帮助你理解这些代码。
默认情况下,RPG_SPEED 被设置为1500。
使用断点(Break Point)
在这行代码左侧的灰色空白处点击鼠标左键。如果你觉得很怪或者什么也没发生,你也可按 F9 或使用Debug Menu > Toggle Breakpoint。此操作将会在空白处放置一个被称为断点的红色点。断点是用来暂停执行的项目,这似乎是一个很奇怪的概念。 所以需要些观点来解释。
在特定时间看发生什么事情总是非常管用的。当程序开始运行这个代码行时,程序会被停止。 所 有 在程序的代码将被停止运行。 3D视图,鼠标输入,甚至连点击关闭的按钮都被停止。 这允许你仔细检查程序在特定时期的的状态 / 数据。 若此mod还没运行,按F5启动。加载地图然后拿些武器,选择RPG,発射!!!
检查与修复状态
当火箭尝试発射的瞬间,Visual Studio应该弹出,然后标题栏应显示 Paused。光标将会移动到代码行上,同时空白区会有个箭头. 移动鼠标到 vecForward 然后将会有个窗口给你展示vecForward的X Y Z轴值。 这些值目前非常小 (这是一个单位向量,但你需要去另一个教程查看)。若点击Plus(加号)展开数值,你还可以修改里面的值, 以改变程序内部状态
去 Debug Menu(调试模式) > Windows (视窗)> Autos(自动).此操作将自动展示当前代码在使用的变量,若数值改变了,更改项会显示为红色。
逐步执行
我们已经“暂停执行”这些代码了,它是一个使用SetAbsVelocity函数的指令, 而且还向函数传输给了些数据: vecForward * RPG_SPEED。
键入F11。或者去 Debug Menu (调试模式)> Step Into(进行任务)又或者在工具栏中找到相同图标的按钮。再次注意灰色空白处的黄色箭头。这个箭头说明程序下次要执行的的下一条指令
现在可以查看SetAbsVelocity函数了。检查vecAbsVelocity的值。你会注意到此时的值比vecForward之前大很多,因为这个值被乘以了RPG_SPEED。然后检查m_vecAbsVelocity,这是火箭实际保存的速度。现在速度值还是十分小,那是因为火箭刚被启动,没有增加速度。按F10与按F11有点相似,区别是不会进入函数的 内部 。
若你在之前按了F10,黄色箭头不会移动至SetAbsVelocity函数。反而会移动到SetAbsVelocity(vecForward*RPG_SPEED)的后面。调用SetAbsVelocity的情况仍旧会发生,但发生得非常快以至于连看都看不清楚。多按几次F10直到到达代码行:
m_vecAbsVelocity = vecAbsVelocity;
若再次检查两个变量,就会发现变量还没转变。按F11 (或者按F10。因为此函数没在执行任务,所以效果大差不差) 一次. 然后检查m_vecAbsVelocity。你会发现vecAbsVelocity的值已被指定,或者复制到此。 此操作是非常强的调试技术。可以让我们看到程序从一行到下一行的状态改变,如果部分没有按照我们的预期完成,我们可以查看发生什么了并且追踪哪里出错了。你也可以反向追踪。从观察到的错误开始追踪,并且检查状态。若部分状态(例如变量:variable)不对, 回到变量可能变异常的部分 (最后被赋值的变量的地方)。使用Go to Definition(前往定义),或者使用Find all References(找到所有的引用)来帮助你追踪可能出错的地方。重复上述步骤直到锁定错误来源之处。
更多的调试技术
Visual Studio里有很多特点可以帮助你更高效地调试。你可以放个断点并设为仅在特定条件下可断开。查看调用栈(调用到当前位置的函数链), 和其他许多小工具。如果你想编程一个超nb( )的mod, 掌握C++变成是必不可少的。调试C++,然后如何让你的IDE (通常是 VS)被充分运用。
你现在有了自己的第一个mod. 然后要怎么做?
你已经设置,创建,并且调试了你的第一个mod,从今开始不断实验和检查你的mod,让你mod变优秀需要锲而不舍,身体力行。若你有相关代码的问题,这里有个叫 HLCODERS 的新闻组。如果你对mod编程入了魔,坚持就是胜利,保持下去!这里也有很多集中于修改Half-Life2(半条命2)的模组,大多数都有编程论坛,教程等东西。
从一个单调而且无聊的mod走向多元又有趣激烈的地图制作,请参见:What makes a good level?