Almost forgot: WorldTick hook, since ZScript doesn't have delays

This commit is contained in:
ZZYZX 2017-01-31 03:24:38 +02:00
parent 9a8a93fe51
commit 066b22af0a
4 changed files with 22 additions and 41 deletions

View file

@ -262,6 +262,7 @@ void E_WorldThingDestroyed(AActor* actor)
// normal event loopers (non-special, argument-less) // normal event loopers (non-special, argument-less)
DEFINE_EVENT_LOOPER(RenderFrame) DEFINE_EVENT_LOOPER(RenderFrame)
DEFINE_EVENT_LOOPER(WorldLightning) DEFINE_EVENT_LOOPER(WorldLightning)
DEFINE_EVENT_LOOPER(WorldTick)
// declarations // declarations
IMPLEMENT_CLASS(DStaticEventHandler, false, false); IMPLEMENT_CLASS(DStaticEventHandler, false, false);
@ -400,6 +401,7 @@ DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingSpawned)
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingDied) DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingDied)
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingDestroyed) DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldThingDestroyed)
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldLightning) DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldLightning)
DEFINE_EMPTY_HANDLER(DStaticEventHandler, WorldTick)
DEFINE_EMPTY_HANDLER(DStaticEventHandler, RenderFrame) DEFINE_EMPTY_HANDLER(DStaticEventHandler, RenderFrame)
// =========================================== // ===========================================
@ -500,6 +502,19 @@ void DStaticEventHandler::WorldLightning()
} }
} }
void DStaticEventHandler::WorldTick()
{
IFVIRTUAL(DStaticEventHandler, WorldTick)
{
// don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_WorldTick_VMPtr)
return;
DWorldEvent* e = E_SetupWorldEvent();
VMValue params[2] = { (DStaticEventHandler*)this, e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr);
}
}
static DRenderEvent* E_SetupRenderEvent() static DRenderEvent* E_SetupRenderEvent()
{ {
static DRenderEvent* e = nullptr; static DRenderEvent* e = nullptr;
@ -532,44 +547,3 @@ void DStaticEventHandler::OnDestroy()
E_UnregisterHandler(this); E_UnregisterHandler(this);
Super::OnDestroy(); Super::OnDestroy();
} }
/*
void DStaticRenderEventHandler::Setup()
{
ViewPos = ::ViewPos;
ViewAngle = ::ViewAngle;
ViewPitch = ::ViewPitch;
ViewRoll = ::ViewRoll;
FracTic = ::r_TicFracF;
Camera = ::camera;
}
void DStaticRenderEventHandler::RenderFrame()
{
Setup();
Super::RenderFrame();
}
void DStaticWorldEventHandler::Setup()
{
IsSaveGame = savegamerestore;
Thing = nullptr;
}
void DStaticWorldEventHandler::WorldLoaded()
{
Setup();
Super::WorldLoaded();
}
void DStaticWorldEventHandler::WorldUnloaded()
{
Setup();
Super::WorldUnloaded();
}
void DStaticWorldEventHandler::WorldThingSpawned(AActor* actor)
{
Setup();
Thing = actor;
Super::WorldThingSpawned(actor);
}*/

View file

@ -33,6 +33,8 @@ void E_WorldThingDied(AActor* actor, AActor* inflictor);
void E_WorldThingDestroyed(AActor* actor); void E_WorldThingDestroyed(AActor* actor);
// same as ACS SCRIPT_Lightning // same as ACS SCRIPT_Lightning
void E_WorldLightning(); void E_WorldLightning();
// this executes on every tick, before everything
void E_WorldTick();
// called on each render frame once. // called on each render frame once.
void E_RenderFrame(); void E_RenderFrame();
@ -86,6 +88,7 @@ public:
virtual void WorldThingDied(AActor*, AActor*); virtual void WorldThingDied(AActor*, AActor*);
virtual void WorldThingDestroyed(AActor*); virtual void WorldThingDestroyed(AActor*);
virtual void WorldLightning(); virtual void WorldLightning();
virtual void WorldTick();
virtual void RenderFrame(); virtual void RenderFrame();
}; };
class DEventHandler : public DStaticEventHandler class DEventHandler : public DStaticEventHandler

View file

@ -36,6 +36,7 @@
#include "r_utility.h" #include "r_utility.h"
#include "p_spec.h" #include "p_spec.h"
#include "g_levellocals.h" #include "g_levellocals.h"
#include "events.h"
extern gamestate_t wipegamestate; extern gamestate_t wipegamestate;
@ -125,6 +126,8 @@ void P_Ticker (void)
/*Added by MC: Freeze mode.*/!(bglobal.freeze && players[i].Bot != NULL)) /*Added by MC: Freeze mode.*/!(bglobal.freeze && players[i].Bot != NULL))
P_PlayerThink (&players[i]); P_PlayerThink (&players[i]);
// [ZZ] call the WorldTick hook
E_WorldTick();
StatusBar->Tick (); // [RH] moved this here StatusBar->Tick (); // [RH] moved this here
level.Tick (); // [RH] let the level tick level.Tick (); // [RH] let the level tick
DThinker::RunThinkers (); DThinker::RunThinkers ();

View file

@ -38,6 +38,7 @@ class StaticEventHandler : Object native
virtual native void WorldThingDied(WorldEvent e); virtual native void WorldThingDied(WorldEvent e);
virtual native void WorldThingDestroyed(WorldEvent e); virtual native void WorldThingDestroyed(WorldEvent e);
virtual native void WorldLightning(WorldEvent e); // for the sake of completeness. virtual native void WorldLightning(WorldEvent e); // for the sake of completeness.
virtual native void WorldTick(WorldEvent e);
virtual native void RenderFrame(RenderEvent e); virtual native void RenderFrame(RenderEvent e);
} }