Skip to content

Commit

Permalink
commit
Browse files Browse the repository at this point in the history
  • Loading branch information
MacHu-GWU committed Sep 6, 2022
1 parent 9d11cad commit 36352b6
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@

安装核心 Core Installation
==============================================================================

这一步的主要任务是将核心的源代码编译成可执行程序.
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@

用亚马逊云部署生产服务器 AWS Prod Server Deployment
==============================================================================
deploy azerothcore (AC) wotlk wow private server to AWS.


架构选择
1. 架构选择
------------------------------------------------------------------------------
- 游戏服务器: 部署在位于 VPC Public Subnet 上的 EC2 中.
- 数据库: 使用 RDS MySQL. 注意, 请不要使用 Aurora MySQL compatible version. 因为 Aurora 的 Storage engine 是完全重新设计的, 和 MySQL 的完全不同. AC 的一些 SQL 要求使用旧款的 ``MyISAM`` 存储引擎, 这是 Aurora 所不支持的.


为游戏服务器选择 EC2 类型
2. 为游戏服务器选择 EC2 Type
------------------------------------------------------------------------------
根据 AC Wiki 上 https://www.azerothcore.org/wiki/memory-usage 的说法, 当游戏玩家探索到一片地图后, 这个区域的地图就会被加载进内存, 而玩家多的时候几乎所有的地图都会被加载进内存, 这些地图至少占用 11G 左右. 而且操作系统本身大约会占用 1G 左右的内存. 而且大约每 100 个玩家需要占用 1G 内存. 你需要留给服务器大约 1 - 2G 内存左右供临时使用. 根据这篇 AC 上的讨论 https://github.com/azerothcore/azerothcore-wotlk/discussions/3891, 维护者 FrancescoBorzi 说了, CPU 一般不是瓶颈, 而 RAM 才是. < 200 个玩家的话, 16GB 内存是足够了的. 这和我们之前计算的 200 玩家 = 11G + 2G + 1G = 占用 14G 内存一致.

Expand Down Expand Up @@ -39,7 +40,7 @@
- Term contract: https://aws.amazon.com/ec2/pricing/reserved-instances/pricing/


为游戏数据库选择 Instance Type
3. 为游戏数据库选择 Instance Type
------------------------------------------------------------------------------
选择合适的数据库大小要考虑两个维度:

Expand All @@ -60,7 +61,77 @@
- Pricing: https://aws.amazon.com/rds/mysql/pricing/


配置数据库
4. 安装核心
------------------------------------------------------------------------------
这一步的主要任务是将核心的源代码编译成可执行程序.

**首先我们要 SSH 登录到 Ubuntu 服务器上**

.. code-block:: bash
# 111.111.111.111 是你的 IP
# /path/to/your/key/file.pem 是我用来存放秘钥的路径.
ssh -i /path/to/your/key/file.pem ubuntu@111.111.111.111
第一次连接的时候会问你是否要将这个服务器添加为可信服务器, 打 Y 即可. 进去以后确认此时你在 ``${HOME}`` 路径下, 你打 ``pwd`` 命令返回的是 ``/home/ubuntu`` 就说明是对的.

**然后要从 GitHub 获取 Azeroth Core 源代码**

.. code-block:: bash
git clone https://github.com/azerothcore/azerothcore-wotlk.git --branch master --single-branch azerothcore
**从源码编译游戏服务器**

.. code-block:: bash
# 移动到 azerothcore 仓库内
cd azerothcore
# 创建并移动到 build 目录
mkdir build
cd build
# 注意! 请确保你现在已经在 azerothcore/build 目录下了, 打 pwd 命令返回的应该是 /home/ubuntu/azerothcore/build
# 在运行下面 CMake 代码之前, 下面的 $HOME/azeroth-server 是编译好的服务器路径, 你可以改, 也可以不改
# 如果你改了之后, 后面的自动化代码也要跟着改
cmake ../ -DCMAKE_INSTALL_PREFIX=$HOME/azeroth-server/ -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++ -DWITH_WARNINGS=1 -DTOOLS=0 -DSCRIPTS=static -DMODULES=static
# 查看你的服务器有多少个 CPU 核心, 这个数字要作为参数用在后面的命令中
nproc --all
# 构建服务器, 这一步完成之后 $HOME/azeroth-server 里会出现一个 ``bin`` 和 ``etc`` 文件夹
make -j 4
make install
**下载并解压地图数据文件**

服务器是需要知道一些客户端数据的, 例如地图数据, 是用来判定你和目标之间是否有视野, 有没有被墙壁阻拦, 空气墙在哪里等. 这些地图数据文件很大, 不适合放在服务器代码上. 这些数据文件原本是用特殊工具从游戏客户端上提取出来的 (游戏客户端也有这些文件, 方便于在本地做计算, 客户端连上服务器后会比较服务器和自己的 MD5 值, 如果不对说明客户端作弊了) Azeroth Core 有使用这些工具的教程. 不过 Azeroth Core 团队还定期提取这些文件, 并发布供玩家下载.

.. code-block:: bash
# 回到用户主目录
cd $HOME
# 创建一个目录
mkdir azeroth-server-data
cd azeroth-server-data
# 打开 https://github.com/wowgaming/client-data/releases/ 页面
# 右键点击 data.zip 查看下载链接, 例如目前版本的是 https://github.com/wowgaming/client-data/releases/download/v15/data.zip
# 用 wget 命令下载
wget https://github.com/wowgaming/client-data/releases/download/v15/data.zip
# 安装 unzip 解压工具
sudo apt install unzip
# 解压 data.zip 文件, 此时会在 $HOME/azeroth-server-data 目录下创建 5 个文件夹
unzip data.zip
参考资料:

- https://www.azerothcore.org/wiki/linux-core-installation


5. 配置数据库
------------------------------------------------------------------------------
.. code-block:: bash
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Eluna
==============================================================================
Eluna 是一个允许你在服务端添加 Lua 脚本的模块. 本质上跟 WOW Addon 一样, 不过这是服务器端的 Lua 脚本. 功能非常强大.

- https://www.azerothcore.org/catalogue.html#/details/413964782
- https://github.com/azerothcore/mod-eluna
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
.. _module:

使用模块 Module
==============================================================================
AC 是模块化的项目. 模块定义了一些扩展功能, 每个模块相当于可插拔的功能, 类似于 Steam 上的游戏 Mod. 要使得这些模块在你的服务器上生效, 你需要在构建服务期之前, 把模块源码下载到 ``azerothcore-wotlk/modules/`` 目录, 然后再编译即可. 模块相关的配置会出现在 ``./bin/etc/modules`` 下.


目录
------------------------------------------------------------------------------
.. autotoctree::
:maxdepth: 1
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
.. _addon-development:

插件开发 Addon Development
==============================================================================


插件是如何工作的
------------------------------------------------------------------------------






插件开发的原理
------------------------------------------------------------------------------
所有的插件都是基于 "事件驱动" 的编程模型. 所谓 "事件驱动" 就是, 游戏过程中会有各种 "事件", 也叫 event. 一些 event 的例子有:

1. 别人给你发私聊
2. 你引到怪了
3. 你升级了
4. Boss 释放技能了

而你可以用 lua 编写函数, 里面可以通过调用 WOW API 来 "做一些事情". 这些 "做事情" 就叫做 action. 一些 action 的例子有:

1. 你给别人回复消息
2. 游戏界面弹出一条弹窗
3. 将动作条上的技能高亮等

而每一个 event 被触发的时候是有相关数据的 context data, 例如你升级了, 就会有你的角色的信息, 升级的等级. 而 action 则可以将这些信息作为输入, 对其进行处理. 所有的插件本质上就是 event + action 的排列组合. 我们来拿一些有名的插件当例子:

1. DBM, boss 战插件. 这里的 event 就是 战斗日志 combat log, 而这里的 action 就是根据 combat log 来自动更新提示. 例如 boss 刚进战斗, 20-30 秒后就会放一个什么技能, 那么 DBM 的 action 就是画一个计时条倒计时.
2. TitanPanel 信息插件. 这里的 event 可以是你登陆, 这里的 action 就是你一旦登录就会搜集你的人物和背包信息, 并画一个 titan bar.


关于 Protected API
------------------------------------------------------------------------------
**什么是 Protected API**

暴雪对一部分 API 做出了限制, 这些 API 只能被暴雪内部的程序, 比如编译好的客户端程序所调用, 但不允许第三方程序例如插件所调用. 这其中就包括 Target 选择目标, 以及 CastSpell 施放技能. 这是因为如果开放了这些限制, 那么就可以做出非常变态的插件, 例如自动根据战斗情况条件判断放技能, 自动治疗血少的目标等, 这就非常影响平衡性了. 如果你的插件里使用了这些 API, 那么你的插件将无法使用. (不可能就因为你用了包含被限制的 API 的插件就封你号, 这样会误封不小心下到不合法插件的玩家)

**如何绕过 Protected API 限制**

这个限制是可以被绕过的, 具体做法是对客户端程序进行反编译 (例如大名鼎鼎的 IDA pro 工具), 然后修改一些源代码, 再进行编译然后给客户端打补丁. 具体做法请参考这篇博文 https://www.romanh.de/article/Unlocking-API-Functions-in-WoW-335a-using-a-Disassembler. 然后你就可以在插件里调用这些 API 了.

**绕过限制是会被封号的**

暴雪的客户端程序在连接服务端程序时会对各个文件进行完整性检查 (比较 hash 值), 如果发现编译后的 exe 文件被修改了, 那么服务器就会认为你对客户端程序进行了篡改, 无论你进行了什么篡改, 服务器都认为这是违法的, 会将你直接封号. 这种反作弊机制叫做 Warden. 当然私服上不一定有这个选项, 如果是你自己的私服, 你可以选择将 Warden 关闭.


参考资料
------------------------------------------------------------------------------
- WOW API 文档: https://wowwiki-archive.fandom.com/wiki/World_of_Warcraft_API
- WOW UI XML 文档: https://wowwiki-archive.fandom.com/wiki/UI_XML_tutorial

0 comments on commit 36352b6

Please sign in to comment.