签到天数: 18 天 [LV.4]阿拉德玩家
阿拉德菜鸟
- 积分
- 128
- 怒气
- 13
- 声望
- 39
- 战力
- 17
|
本帖最后由 爱吃土豆丶 于 2023-4-9 11:56 编辑
《Df Plugin开发文档》
作者:sidyhe
概述
dp 全称为 df plugin
它是一款服务器插件, 使用补丁技术扩展其功能
并内置 lua 脚本系统使得各功能自由定制, 以满足各种需求
目前仅支持 dfgame 进程, 其他进程暂无需求
本插件不适合小白用户, 如果你不了解 linux 常用命令和 lua 编程, 建议放弃
PS: 由于 2.6 版本对 fac 做了一些不兼容的修改, 所以 2.5 的代码无法直接使用
使用前提
请确保服务器可以正常运行, 再安装插件!!!
问题反馈
anywaies@hotmail.com
安装步骤
把提供的 dp2 目录复制到服务器根目录下
目录位置及名称不可修改, 否则无法正常工作
核心文件
/dp2/libdp2pre.so | 加载器 1 | /dp2/libGeoIP.so.1 | 加载器 2 | /dp2/libdp2.so | 插件框架 | /dp2/libdp2.xml | 插件框架配置 | /dp2/lib/ | 额外模块目录 | /dp2/lua/ | 脚本库目录 (第一优先级) | /dp2/lua2/ | 用户脚本库目录 (第二优先级) |
一般来说用户不需要修改 lua 目录下的文件, 版本更新时删掉原有的 lua 目录, 再覆盖新的!
而 lua2 目录属于用户代码, 自行编写的功能放在这里, 安装包内默认为空主要文件
适用于 df_game_r 的插件扩展模块
安装方法
本插件提供两种加载方式(两种加载器), 选择其中 1 种即可
PS: 不要看到什么模块用了 LD_PRELOAD 就蒙圈, 第二种加载方式也可以!
加载器 1
本节使用 LD_PRELOAD 方式加载插件
首先, 关闭 selinux 功能, 若已关闭, 忽略
在 root 权限下输入
注意这种方法是临时关闭, 系统重启后会恢复
若需永久关闭, 请自行查阅资料
调整启动命令
在启动 dfgame 命令行(常见一键端是 run 文件)中, 添加 LD_PRELOAD 启动参数
如
- ./df_game_r cain01 start &
复制代码
变成
- LD_PRELOAD=/dp2/libdp2pre.so ./df_game_r cain01 start &
复制代码
即在最前面新增
- LD_PRELOAD=/dp2/libdp2pre.so
复制代码
注意每一块参数之间的空格
加载器 2
本节使用替换依赖库的方式加载插件
这种方式只适用于 dfgame 进程, 若需其他进程支持插件, 参阅上一节替换文件
在 root 权限下依次执行如下命令
- cd /usr/lib
- rm -f libGeoIP.so.1
- ln -s /dp2/libGeoIP.so.1
复制代码
或者
- cd /usr/local/lib
- rm -f libGeoIP.so.1
- ln -s /dp2/libGeoIP.so.1
复制代码
搞定
启动流程
选择 1 种加载器安装插件之后, 会统一加载核心模块 libdp2.so,而核心模块会去/dp2/libdp2.xml 读取配置
根据当前进程的文件名, 加载配置中对应的插件扩展
- 确定当前进程名称, 找到 xml 节点
- 读取 deps 节点, 并按顺序加载 so 模块 (用于解决后续 so 的符号依赖)
- 读取 script 节点内容, 并暂存
- 读取 plugin 节点, 加载并启动这个模块
以 dfgame 为例
df_game_r 启动, 加载器加载 libdp2.so
libdp2.so 初始化并加载配置文件 /dp2/libdp2.xml
libdp2.so 查找配置文件中 "df_game_r" 的项, 加载依赖, 加载扩展 (libdp2game.so)
libdp2game.so 初始化并向核心模块索要 lua 主文件路径 (配置)
libdp2game.so 执行 lua 文件注意事项
直到扩展模块初始化之前, 是没有日志系统的
也就是说如果产生异常或错误, 消息日志会输出在控制台上
建立日志系统之后, 消息会输出至文件中, 文件存放于进程位置的 log 目录下
在 dfgame 扩展中, 位于 log/cain01/dp-${date}.log, 日志文件每天滚动
其中 cain01 是启动 dfgame 时的第二个参数
查看日志是一个好习惯, 能够很好的解决问题
PS: 常见一键端 dfgame 的 dp 日志位于 /home/dxf/game/log/ 中
开发文档
由于失误, 删除了 2.5 的文档源文件
又因为更新文档繁琐, 故采用代码文档的方式, 需要安装 idea 和 immylua 插件
插件开放的接口仅存在于_DP 和_DPX 全局模块内
_DP
通用功能, 与游戏逻辑无关的方法
_DPX
特定功能, 与具体进程有关的方法
文档怎么看
首先安装开发环境, 参见 开发文档.pdf
本插件的所有 sdk 内容位于 lua/df 中
插件的_DP 和_DPX 接口位于 lua/df/doc 中
其他扩展接口都以 lua 源码的形式实现, 参见 lua/df/ 内的所有文件
另外, 插件也附带了很多通用 lua 模块, 参见 lua/readme.md
如果你有能力自行编译 lua 模块, 压缩包内也提供 lua 的头文件, 链接 liblua53.so 即可关键点 (非常重要)
- 在 lua 中会以某些方式获得游戏对象指针(lightuserdata), 叫做原始指针: cptr
- 原始指针可以被 ffi 库使用 (luaffi 和 lua-alien)
- luaffi 使用的指针需要经过一次 cast 转换, 叫做: fptr. 但 alien 可以直接使用 cptr
- 内置的 fac 库可以把 cptr 包装成 lua 对象, lua 对象内部持有 cptr 和 fptr
- 如 user 的 fac 库, 就是把 cptr 进行包装, 看起来像是 lua 对象, 其本质是通过 ffi 调用游戏内自有的 C/C++函数, 结合 lua 逻辑, 共同实现功能扩展.
- 插件自身除了使用 C++实现了部分关键功能, 其他绝大部分逻辑都由 lua+ffi 实现
注意: 在 lua 中小心使用任何 cptr 和 fptr!
常见问题
Q: 对服务端有要求吗?
A: 无, 能正常启动并跑五国即可
Q: 为什么按照步骤安装插件却毫无效果?
A: 先看有没有 dp 日志, 若没有, 则启动环境配置有误, 否则查看日志确定问题
Q: 如何修改 dp 默认位置?
A: 有三件事情, 如下:
- 设置环境变量 DP2SO 修改 libdp2.so 路径
- 设置环境变量 DP2XML 修改 libdp2.xml 路径
- 主 lua 脚本第一件事是修改 lua 的 search path 变量 (或自行编译 liblua53.so, 更麻烦)
Q: 出现 ERROR: ld.so: object '/dp2/libdp2pre.so' from LD_PRELOAD cannot be preloaded:ignored., 如何解决?
A: 这是由于使用 lua 调用外部程序导致的. 原理是使用了 LD_PRELOAD 加载 dp, 而 dp 和游戏服务器是 32 位进程, 系统为 64 位, 且 LD_PRELOAD 有继承机制(即 64 位进程想加载 32 位模块被拒绝). 解决方法: 使用加载器 2, 或者忽略它, 不影响.
更新历史
v2.8.0 – 20230330
- 去除用户登录提示
- fac.user 添加 点券/代币/胜点 操作
- 添加 dpx.quest.has 接口用于判断玩家是否已接受某任务
- 添加 frida 支持 (参见 dp2/lua/df/frida.lua)
v2.7.10 - 20221111
- 增加接口: set_drop_amplify_level(), 修改掉落时随机赋予红字的装备最低等级
- 增加接口: glob_count(), 统计玩家道具数量(可选 装备/背包/角色仓库/账号金库)
- 添加 HookType: DungeonAfterLoading, 副本开始时触发
- 添加一些 fac.user 接口
- 添加查询 pvf 道具接口: query_by_id/query_by_name
- 修复已知问题…
v2.7.6 - 20220512
- 完善与新增 sdk
- 修复 lua-lfs 模块
- 添加 mgr: environment
- 添加 Hook: TradeEvent, 玩家交易通知
- 添加接口: dpx.set_item_unlock_time(), 设置装备解锁时长
- 添加接口: user:SetItemEffect(), 设置道具效果 (服务器给 buff 且不消耗道具)
- 添加接口: dpx.log_time(), 使 history 日志带时间前缀
- 添加接口: user:IncCharacSlotLimit(),支持扩展额外 3 个角色槽位 (最大 24)
- 添加接口: logger.null(), 临时注释掉日志
- 新增接口: dpx.skip_setrlimit()
- 新增接口: dpx.unregister_custom_dispatcher(), 撤销自定义收包
- 重写 dispatch 线程以替换原版实现, 解决之前版本偶尔死锁的问题
- (有个未公开的 2.6.11 版本, 觉得重写分发逻辑属于大更新, 所以 2.6.3 以后都归到 2.7 了)
- 修复其他已知问题…
v2.6.3 - 20220310
- 修复收包 BUG(handleType=1 时)
- 增加一些 user 实用接口
- 增加转职觉醒接口 ChangeGrowType修正上一版示例中的代码错误
v2.6.1 - 20220213
- 增加代码文档
- 升级 lua 版本至 5.3.6
- dp.patch 改名为 dp.mem
- 当 lua 错误时输出调用栈
- 重写 game.fac, 优化效率(不兼容 2.5 版本)
- dpx.hook 支持二次设置, 便于热更新
- 增加装备继承功能 (仅限强化/增幅)
- 增加强制接受任务功能 (用于制作悬赏令)
- 重写 GameEvent Hook
- 添加自定义虚弱 Hook
- 添加随机数方法 dp.rand
- 重写 dpx.mail 接口, 支持发送多道具邮件
- 添加 deps 配置用于解决 so 依赖
- 添加 lua-luv 库, 以及其他各种 lua 库
- 删除 timer 和 worker 模块
- 扩展 fac 中各种对象的接口
- 添加获得经验 Hook
- 修改 dp.set_unload_handler 为 dp.add_unload_handler, 支持多个回调
- 增加 logger 模块, 打日志更方便
- 增加 GmInput Hook 用于处理自定义指令 (不再局限于 GM 权限)
- 完善自定义收发包
- 增加 dp.mem.read 用于读取内存, 支持多级偏移
- 移除一些 HookType, 因为和 GameEvent 冲突
- 添加 lua-redis/mysql/sqlite3 支持
- 等等以及太多记不过来了, 看文档和自行研究吧 !
v2.5 - 20210730
- 添加 lua2 作为用户私有库
- 扩展瞬间移动药剂
- 过滤使用烟火类道具 (如 ID 为 7576 的道具)
- 道具支持
- 任务支持
- 装备跨界
- 异界重置v2.3 - 20210623
- 重构框架, 部分功能不兼容旧版本写法, 以后会趋于稳定
- 添加过滤: 保存城镇 ID
- 添加过滤: 道具掉落
- 添加过滤: 回购
- 添加过滤: 副本开启
- 添加过滤: 玩家登录/登出
- 添加功能: 创建缔造者
- 添加功能: 关闭安全检查
- 添加功能: 开启 GM 功能
- 添加功能: 取消新账户契约邮件
- 添加功能: 取消交易限制
- 添加功能: 拍卖行相关修复
- 添加功能: 自定义收包
v2.1 - 20210305
- 移除 lua lanes 库 (死锁)
- 添加 lua json 库
- 封装 lua 对象工厂 (wrapper)
- 完善等级上限逻辑
- 添加创建角色过滤
- 添加副本通关过滤 (反外挂)
- 添加 lua unload/update 支持
- HookType 名称有变更, 注意兼容
v2.0 - 20200109
v1.0 - 20200406
仅供技术研究
请勿用于商业用途
相关教程
|
|