Implemented player scripts.

This commit is contained in:
ZZYZX 2017-02-02 20:46:10 +02:00
parent 19d2f6a4db
commit 39355cf45d
6 changed files with 45 additions and 11 deletions

View file

@ -61,6 +61,7 @@ Everything that is changed is marked (maybe commented) with "Added by MC"
#include "d_netinf.h" #include "d_netinf.h"
#include "d_player.h" #include "d_player.h"
#include "doomerrors.h" #include "doomerrors.h"
#include "events.h"
static FRandom pr_botspawn ("BotSpawn"); static FRandom pr_botspawn ("BotSpawn");
@ -418,6 +419,9 @@ void FCajunMaster::RemoveAllBots (bool fromlist)
} }
} }
} }
// [ZZ] run event hook
E_PlayerDisconnected(i);
//
FBehavior::StaticStartTypedScripts (SCRIPT_Disconnect, players[i].mo, true, i, true); FBehavior::StaticStartTypedScripts (SCRIPT_Disconnect, players[i].mo, true, i, true);
ClearPlayer (i, !fromlist); ClearPlayer (i, !fromlist);
} }

View file

@ -337,10 +337,15 @@ void E_WorldThingDestroyed(AActor* actor)
handler->WorldThingDestroyed(actor); handler->WorldThingDestroyed(actor);
} }
void E_PlayerEntered(int num) void E_PlayerEntered(int num, bool fromhub)
{ {
// this event can happen during savegamerestore. make sure that local handlers don't receive it.
// actually, global handlers don't want it too.
if (savegamerestore && !fromhub)
return;
for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next)
handler->PlayerEntered(num); handler->PlayerEntered(num, fromhub);
} }
void E_PlayerRespawned(int num) void E_PlayerRespawned(int num)
@ -540,7 +545,7 @@ static DWorldEvent* E_SetupWorldEvent()
static DWorldEvent* e = nullptr; static DWorldEvent* e = nullptr;
if (!e) e = (DWorldEvent*)RUNTIME_CLASS(DWorldEvent)->CreateNew(); if (!e) e = (DWorldEvent*)RUNTIME_CLASS(DWorldEvent)->CreateNew();
e->IsSaveGame = savegamerestore; e->IsSaveGame = savegamerestore;
e->IsReopen = level.FromSnapshot; e->IsReopen = level.FromSnapshot && !savegamerestore; // each one by itself isnt helpful, but with hub load we have savegamerestore==0 and level.FromSnapshot==1.
e->Thing = nullptr; e->Thing = nullptr;
e->Inflictor = nullptr; e->Inflictor = nullptr;
e->Damage = 0; e->Damage = 0;
@ -710,11 +715,11 @@ static DPlayerEvent* E_SetupPlayerEvent()
static DPlayerEvent* e = nullptr; static DPlayerEvent* e = nullptr;
if (!e) e = (DPlayerEvent*)RUNTIME_CLASS(DPlayerEvent)->CreateNew(); if (!e) e = (DPlayerEvent*)RUNTIME_CLASS(DPlayerEvent)->CreateNew();
e->PlayerNumber = -1; e->PlayerNumber = -1;
e->IsReturn = level.FromSnapshot; e->IsReturn = false;
return e; return e;
} }
void DStaticEventHandler::PlayerEntered(int num) void DStaticEventHandler::PlayerEntered(int num, bool fromhub)
{ {
IFVIRTUAL(DStaticEventHandler, PlayerEntered) IFVIRTUAL(DStaticEventHandler, PlayerEntered)
{ {
@ -722,6 +727,7 @@ void DStaticEventHandler::PlayerEntered(int num)
if (func == DStaticEventHandler_PlayerEntered_VMPtr) if (func == DStaticEventHandler_PlayerEntered_VMPtr)
return; return;
DPlayerEvent* e = E_SetupPlayerEvent(); DPlayerEvent* e = E_SetupPlayerEvent();
e->IsReturn = fromhub;
e->PlayerNumber = num; e->PlayerNumber = num;
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr);

View file

@ -42,7 +42,7 @@ void E_WorldTick();
// called on each render frame once. // called on each render frame once.
void E_RenderFrame(); void E_RenderFrame();
// this executes when a player enters the level (once). PlayerEnter+inhub = RETURN // this executes when a player enters the level (once). PlayerEnter+inhub = RETURN
void E_PlayerEntered(int num); void E_PlayerEntered(int num, bool fromhub);
// this executes when a player respawns. includes resurrect cheat. // this executes when a player respawns. includes resurrect cheat.
void E_PlayerRespawned(int num); void E_PlayerRespawned(int num);
// this executes when a player dies (partially duplicating worldthingdied, but whatever) // this executes when a player dies (partially duplicating worldthingdied, but whatever)
@ -112,7 +112,7 @@ public:
virtual void RenderFrame(); virtual void RenderFrame();
// //
virtual void PlayerEntered(int num); virtual void PlayerEntered(int num, bool fromhub);
virtual void PlayerRespawned(int num); virtual void PlayerRespawned(int num);
virtual void PlayerDied(int num); virtual void PlayerDied(int num);
virtual void PlayerDisconnected(int num); virtual void PlayerDisconnected(int num);

View file

@ -91,6 +91,7 @@
#include "g_hub.h" #include "g_hub.h"
#include "g_levellocals.h" #include "g_levellocals.h"
#include "events.h"
static FRandom pr_dmspawn ("DMSpawn"); static FRandom pr_dmspawn ("DMSpawn");
@ -1791,6 +1792,8 @@ void G_DoPlayerPop(int playernum)
// [RH] Make the player disappear // [RH] Make the player disappear
FBehavior::StaticStopMyScripts(players[playernum].mo); FBehavior::StaticStopMyScripts(players[playernum].mo);
// [ZZ] fire player disconnect hook
E_PlayerDisconnected(playernum);
// [RH] Let the scripts know the player left // [RH] Let the scripts know the player left
FBehavior::StaticStartTypedScripts(SCRIPT_Disconnect, players[playernum].mo, true, playernum, true); FBehavior::StaticStartTypedScripts(SCRIPT_Disconnect, players[playernum].mo, true, playernum, true);
if (players[playernum].mo != NULL) if (players[playernum].mo != NULL)

View file

@ -1256,6 +1256,10 @@ void G_FinishTravel ()
FPlayerStart *start; FPlayerStart *start;
int pnum; int pnum;
//
APlayerPawn* pawns[MAXPLAYERS];
int pawnsnum = 0;
next = it.Next (); next = it.Next ();
while ( (pawn = next) != NULL) while ( (pawn = next) != NULL)
{ {
@ -1347,16 +1351,30 @@ void G_FinishTravel ()
{ {
pawn->Speed = pawn->GetDefault()->Speed; pawn->Speed = pawn->GetDefault()->Speed;
} }
if (level.FromSnapshot) // [ZZ] we probably don't want to fire any scripts before all players are in, especially with runNow = true.
{ pawns[pawnsnum++] = pawn;
FBehavior::StaticStartTypedScripts (SCRIPT_Return, pawn, true);
}
} }
// [ZZ] fire the reopen hook.
if (level.FromSnapshot) if (level.FromSnapshot)
{ {
// [Nash] run REOPEN scripts upon map re-entry // [Nash] run REOPEN scripts upon map re-entry
FBehavior::StaticStartTypedScripts(SCRIPT_Reopen, NULL, false); FBehavior::StaticStartTypedScripts(SCRIPT_Reopen, NULL, false);
for (int i = 0; i < pawnsnum; i++)
{
// [ZZ] fire the enter hook.
E_PlayerEntered(pawns[i]->player - players, true);
//
FBehavior::StaticStartTypedScripts(SCRIPT_Return, pawns[i], true);
}
}
else
{
for (int i = 0; i < pawnsnum; i++)
{
E_PlayerEntered(pawns[i]->player - players, false);
}
} }
bglobal.FinishTravel (); bglobal.FinishTravel ();

View file

@ -610,6 +610,9 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags)
// [RH] Death messages // [RH] Death messages
ClientObituary (this, inflictor, source, dmgflags); ClientObituary (this, inflictor, source, dmgflags);
// [ZZ] fire player death hook
E_PlayerDied(player - players);
// Death script execution, care of Skull Tag // Death script execution, care of Skull Tag
FBehavior::StaticStartTypedScripts (SCRIPT_Death, this, true); FBehavior::StaticStartTypedScripts (SCRIPT_Death, this, true);