生命周期 Events
挂游戏帧、绘制与实体构造析构回调(SA 为主)
shared/Events.h · plugin::Events
把逻辑挂在游戏生命周期上。不要在 DllMain 里碰游戏对象。 文档以 SA 为主;III / VC 的同名事件以 Events.h 为准。
注册回调
+= / before / after / -= 的签名必须与事件一致。在 静态全局对象的构造函数 里 +=;全局实例必须存在,否则构造不会执行。
event += callback;
event.before += callback;
event.after += callback;
event -= callback;阶段速查
| 阶段 | 适合 | 避免 |
|---|---|---|
| 静态构造 | +=、读自己的 ini | FindPlayerPed、刷车 |
initRwEvent | 贴图、Pattern、配置 | 假定已有玩家 |
initPoolsEvent | 按池分配 Extender | 遍历尚不存在的实体 |
processScriptsEvent | 逻辑、Command、按键 | 重 IO |
drawing / drawHud | 2D 绘制 | 创建 / 删除实体 |
*RenderEvent | 矩阵、材质 | 删除实体 |
*DtorEvent | 释放附属数据 | 之后继续用指针 |
d3dLost / Reset | 释放 / 重建 GPU 资源 | Lost 后继续 Draw |
重开游戏
restartGameEvent
void()
新开一局时清理插件自身状态。
plugin::Events::restartGameEvent += [] {
// clear flags / caches
};RenderWare 初始化与关闭
initRwEvent / shutdownRwEvent
void()
RW 就绪后加载贴图与资源;关闭前释放。
plugin::Events::initRwEvent += [] {
// load sprites / pattern / ini
};
plugin::Events::shutdownRwEvent += [] {
// clear sprites
};对象池
initPoolsEvent / shutdownPoolsEvent
void()
池建好后分配 Extender;池销毁时释放。
plugin::Events::initPoolsEvent += [] {};
plugin::Events::shutdownPoolsEvent += [] {};进游戏与再初始化
initGameEvent / reInitGameEvent
void()
进入游戏,以及读档后的再初始化。
plugin::Events::initGameEvent += [] {};
plugin::Events::reInitGameEvent += [] {};脚本系统就绪
initScriptsEvent
void()
脚本系统起来之后。
plugin::Events::initScriptsEvent += [] {};每帧逻辑
processScriptsEvent
void()
每帧逻辑的主入口:按键、Command、改实体状态。
#include "common.h"
plugin::Events::processScriptsEvent += [] {
CPed* ped = FindPlayerPed();
if (!ped) {
return;
}
ped->m_fHealth = ped->m_fMaxHealth;
};主循环钩子
gameProcessEvent
void()
主循环上的另一钩子。改脚本 / 实体状态时优先 processScriptsEvent。
plugin::Events::gameProcessEvent += [] {};2D 绘制
drawingEvent / drawHudEvent / drawAfterFadeEvent / drawFontsEvent
void()
只做绘制,不要在这里创建或删除实体。
plugin::Events::drawingEvent += [] {
// gamefont / sprite
};
plugin::Events::drawHudEvent += [] {};
plugin::Events::drawAfterFadeEvent += [] {};
plugin::Events::drawFontsEvent += [] {};雷达绘制
drawRadarEvent / drawBlipsEvent / drawRadarOverlayEvent
plugin::Events::drawRadarEvent += [] {};
plugin::Events::drawBlipsEvent += [] {};
// SA: void(bool)
plugin::Events::drawRadarOverlayEvent += [](bool flag) {
(void)flag;
};暂停菜单绘制
drawMenuBackgroundEvent / menuDrawingEvent
参数类型以当前游戏头文件为准。
plugin::Events::drawMenuBackgroundEvent += [](void*) {};
plugin::Events::menuDrawingEvent += [](CMenuManager* menu) {
(void)menu;
};3D 场景与特效
renderSceneEvent / renderEffectsEvent
void()
可以改矩阵、材质;不要在这里删除实体。
plugin::Events::renderSceneEvent += [] {};
plugin::Events::renderEffectsEvent += [] {};镜子渲染(SA)
renderMirrorEvent
void() · SA
需要画进镜面内容时使用;不要在这里改游戏逻辑状态。
plugin::Events::renderMirrorEvent += [] {
// mirror pass extras
};行人构造与析构
pedCtorEvent / pedDtorEvent
void(CPed*)
构造后初始化附属数据;析构前释放。dtor 之后不要再使用该指针。
plugin::Events::pedCtorEvent += [](CPed* ped) {
if (!ped) {
return;
}
};
plugin::Events::pedDtorEvent += [](CPed* ped) {
(void)ped;
};载具构造与析构
vehicleCtorEvent / vehicleDtorEvent
void(CVehicle*)
plugin::Events::vehicleCtorEvent += [](CVehicle* veh) {
(void)veh;
};
plugin::Events::vehicleDtorEvent += [](CVehicle* veh) {
(void)veh;
};物体构造与析构
objectCtorEvent / objectDtorEvent
void(CObject*)
plugin::Events::objectCtorEvent += [](CObject* obj) {
(void)obj;
};
plugin::Events::objectDtorEvent += [](CObject* obj) {
(void)obj;
};实体渲染前
pedRenderEvent / vehicleRenderEvent / objectRenderEvent
适合改骨骼矩阵;不要删除实体。
plugin::Events::pedRenderEvent += [](CPed* ped) {
if (!ped || !ped->m_pRwClump) {
return;
}
};
plugin::Events::vehicleRenderEvent += [](CVehicle*) {};
plugin::Events::objectRenderEvent += [](CObject*) {};换模型后
pedSetModelEvent / vehicleSetModelEvent
// void(CPed*, int) / void(CVehicle*, int)
plugin::Events::pedSetModelEvent += [](CPed* ped, int model) {
(void)ped;
(void)model;
};
plugin::Events::vehicleSetModelEvent += [](CVehicle*, int) {};D3D 设备丢失与重置
d3dLostEvent / d3dResetEvent
void()
设备丢失时释放 GPU 资源,重置后重建。
plugin::Events::d3dLostEvent += [] {};
plugin::Events::d3dResetEvent += [] {};全局静音与恢复
onPauseAllSounds / onResumeAllSounds
签名以头文件为准。
plugin::Events::onPauseAllSounds += [](void* p) {
(void)p;
};
plugin::Events::onResumeAllSounds += [](void*) {};挂 RenderWare 插件
attachRwPluginsEvent
bool()
plugin::Events::attachRwPluginsEvent += [] {
return true;
};组合示例
#include "plugin.h"
#include "common.h"
#include "extensions/KeyCheck.h"
class Plugin {
public:
Plugin() {
plugin::Events::processScriptsEvent += [] {
KeyCheck::Update();
if (!KeyCheck::CheckJustDown(VK_F7)) {
return;
}
CPed* ped = FindPlayerPed();
if (!ped) {
return;
}
ped->m_fHealth = ped->m_fMaxHealth;
};
}
} g_plugin;