class BaseEvent native { } // just a base class. it doesn't inherit from Object on the scripting side so you can't call Destroy() on it and break everything. class RenderEvent : BaseEvent native { native readonly Vector3 ViewPos; native readonly double ViewAngle; native readonly double ViewPitch; native readonly double ViewRoll; native readonly double FracTic; native readonly Actor Camera; } class WorldEvent : BaseEvent native { // for loaded/unloaded native readonly bool IsSaveGame; // for thingspawned/thingdied/thingdestroyed native readonly Actor Thing; // for thingdied. can be null native readonly Actor Inflictor; } class StaticEventHandler : Object native { // static event handlers CAN register other static event handlers. // unlike EventHandler.Create that will not create them. protected static native StaticEventHandler Create(class type); protected static native StaticEventHandler CreateOnce(class type); protected static native StaticEventHandler Find(Class type); // just for convenience. who knows. protected static native bool Register(StaticEventHandler handler); protected static native bool Unregister(StaticEventHandler handler); // actual handlers are here virtual native void WorldLoaded(WorldEvent e); virtual native void WorldUnloaded(WorldEvent e); virtual native void WorldThingSpawned(WorldEvent e); virtual native void WorldThingDied(WorldEvent e); virtual native void WorldThingDestroyed(WorldEvent e); virtual native void WorldLightning(WorldEvent e); // for the sake of completeness. virtual native void WorldTick(WorldEvent e); virtual native void RenderFrame(RenderEvent e); } class EventHandler : StaticEventHandler native { static native StaticEventHandler Create(class type); static native StaticEventHandler CreateOnce(class type); static native StaticEventHandler Find(class type); static native bool Register(StaticEventHandler handler); static native bool Unregister(StaticEventHandler handler); }