生命周期 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;

阶段速查

阶段适合避免
静态构造+=、读自己的 iniFindPlayerPed、刷车
initRwEvent贴图、Pattern、配置假定已有玩家
initPoolsEvent按池分配 Extender遍历尚不存在的实体
processScriptsEvent逻辑、Command、按键重 IO
drawing / drawHud2D 绘制创建 / 删除实体
*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;

On this page