Add OnStart & OnFinish and rework some things

This commit is contained in:
rtldg 2025-03-26 13:13:39 +00:00
parent 4cd43629b3
commit 791cf0de2c
2 changed files with 88 additions and 45 deletions

View File

@ -243,6 +243,11 @@ public void OnPluginStart()
if (gB_Late)
{
Shavit_OnChatConfigLoaded();
if (gB_VScript && VScript_IsScriptVMInitialized())
{
VScript_OnScriptVMInitialized();
}
}
}
@ -2284,25 +2289,25 @@ public any Native_SaveCheckpointCache(Handle plugin, int numParams)
public void VScript_OnScriptVMInitialized()
{
delete gH_VScript_Timer_OnCheckpointSave;
delete gH_VScript_Timer_OnCheckpointLoadPre;
delete gH_VScript_Timer_OnCheckpointLoadPost;
// ::Timer_OnCheckpointSave <- function(player)
if (VScript_GetGlobalFunction("Timer_OnCheckpointSave"))
gH_VScript_Timer_OnCheckpointSave = new VScriptExecute(HSCRIPT_RootTable.GetValue("Timer_OnCheckpointSave"));
else
gH_VScript_Timer_OnCheckpointSave = view_as<VScriptExecute>(Address_Null);
// ::Timer_OnCheckpointLoadPre <- function(player)
if (VScript_GetGlobalFunction("Timer_OnCheckpointLoadPre"))
gH_VScript_Timer_OnCheckpointLoadPre = new VScriptExecute(HSCRIPT_RootTable.GetValue("Timer_OnCheckpointLoadPre"));
else
gH_VScript_Timer_OnCheckpointLoadPre = view_as<VScriptExecute>(Address_Null);
// ::Timer_OnCheckpointLoadPost <- function(player)
if (VScript_GetGlobalFunction("Timer_OnCheckpointLoadPost"))
gH_VScript_Timer_OnCheckpointLoadPost = new VScriptExecute(HSCRIPT_RootTable.GetValue("Timer_OnCheckpointLoadPost"));
else
gH_VScript_Timer_OnCheckpointLoadPost = view_as<VScriptExecute>(Address_Null);
// function Timer_SetCheckpointCustomData(player, key, value)
if (!gH_VScript_Timer_SetCheckpointCustomData)
{
gH_VScript_Timer_SetCheckpointCustomData = VScript_CreateFunction();
gH_VScript_Timer_SetCheckpointCustomData.SetScriptName("Timer_SetCheckpointCustomData");
gH_VScript_Timer_SetCheckpointCustomData.Return = FIELD_VOID;
@ -2310,19 +2315,23 @@ public void VScript_OnScriptVMInitialized()
gH_VScript_Timer_SetCheckpointCustomData.SetParam(2, FIELD_CSTRING);
gH_VScript_Timer_SetCheckpointCustomData.SetParam(3, FIELD_CSTRING);
gH_VScript_Timer_SetCheckpointCustomData.SetFunctionEmpty();
gH_VScript_Timer_SetCheckpointCustomData.Register();
gH_VScript_Timer_SetCheckpointCustomData.CreateDetour().Enable(Hook_Pre, Detour_Timer_SetCheckpointCustomData);
}
gH_VScript_Timer_SetCheckpointCustomData.Register();
// function Timer_GetCheckpointCustomData(player, key, value)
if (!gH_VScript_Timer_GetCheckpointCustomData)
{
gH_VScript_Timer_GetCheckpointCustomData = VScript_CreateFunction();
gH_VScript_Timer_GetCheckpointCustomData.SetScriptName("Timer_GetCheckpointCustomData");
gH_VScript_Timer_GetCheckpointCustomData.Return = FIELD_CSTRING;
gH_VScript_Timer_GetCheckpointCustomData.SetParam(1, FIELD_HSCRIPT);
gH_VScript_Timer_GetCheckpointCustomData.SetParam(2, FIELD_CSTRING);
gH_VScript_Timer_GetCheckpointCustomData.SetFunctionEmpty();
gH_VScript_Timer_GetCheckpointCustomData.Register();
gH_VScript_Timer_GetCheckpointCustomData.CreateDetour().Enable(Hook_Pre, Detour_Timer_GetCheckpointCustomData);
}
gH_VScript_Timer_GetCheckpointCustomData.Register();
}
MRESReturn Detour_Timer_SetCheckpointCustomData(DHookParam params)
{

View File

@ -62,10 +62,8 @@ DynamicHook gH_TeleportDhook = null;
Address gI_TF2PreventBunnyJumpingAddr = Address_Null;
// vscript (non-checkpoint natives)
#if 0
VScriptExecute gH_VScript_OnStart;
VScriptExecute gH_VScript_OnEnd;
#endif
VScriptExecute gH_VScript_OnFinish;
VScriptFunction gH_VScript_Timer_GetTime;
VScriptFunction gH_VScript_Timer_GetStatus;
@ -135,6 +133,7 @@ bool gB_ReplayPlayback = false;
bool gB_Rankings = false;
bool gB_HUD = false;
bool gB_AdminMenu = false;
bool gB_VScript = false;
TopMenu gH_AdminMenu = null;
TopMenuObject gH_TimerCommands = INVALID_TOPMENUOBJECT;
@ -452,6 +451,11 @@ public void OnPluginStart()
OnClientPutInServer(i);
}
}
if (gB_VScript && VScript_IsScriptVMInitialized())
{
VScript_OnScriptVMInitialized();
}
}
}
@ -648,6 +652,10 @@ public void OnLibraryAdded(const char[] name)
{
gB_AdminMenu = true;
}
else if (StrEqual(name, "vscript"))
{
gB_VScript = true;
}
}
public void OnLibraryRemoved(const char[] name)
@ -678,6 +686,10 @@ public void OnLibraryRemoved(const char[] name)
gH_AdminMenu = null;
gH_TimerCommands = INVALID_TOPMENUOBJECT;
}
else if (StrEqual(name, "vscript"))
{
gB_VScript = false;
}
}
public void OnMapStart()
@ -2032,6 +2044,15 @@ public int Native_FinishMap(Handle handler, int numParams)
Call_PushCell(timestamp);
Call_Finish();
if (gB_VScript)
{
if (gH_VScript_OnFinish)
{
gH_VScript_OnFinish.SetParam(1, FIELD_HSCRIPT, VScript_EntityToHScript(client));
gH_VScript_OnFinish.Execute();
}
}
StopTimer(client);
return 1;
}
@ -2610,6 +2631,15 @@ void StartTimer(int client, int track, bool skipGroundCheck)
Call_PushCell(client);
Call_PushCell(track);
Call_Finish();
if (gB_VScript)
{
if (gH_VScript_OnStart)
{
gH_VScript_OnStart.SetParam(1, FIELD_HSCRIPT, VScript_EntityToHScript(client));
gH_VScript_OnStart.Execute();
}
}
}
#if 0
else if(result == Plugin_Handled || result == Plugin_Stop)
@ -3895,37 +3925,41 @@ void UpdateStyleSettings(int client)
public void VScript_OnScriptVMInitialized()
{
#if 0
delete gH_VScript_OnStart;
delete gH_VScript_OnFinish;
// ::Timer_OnStart <- function(player)
if (VScript_GetGlobalFunction("Timer_OnStart"))
gH_VScript_OnStart = new VScriptExecute(HSCRIPT_RootTable.GetValue("Timer_OnStart"));
else
gH_VScript_OnStart = view_as<VScriptExecute>(Address_Null);
// ::Timer_OnEnd <- function(player)
if (VScript_GetGlobalFunction("Timer_OnEnd"))
gH_VScript_OnEnd = new VScriptExecute(HSCRIPT_RootTable.GetValue("Timer_OnEnd"));
else
gH_VScript_OnEnd = view_as<VScriptExecute>(Address_Null);
#endif
// ::Timer_OnFinish <- function(player)
if (VScript_GetGlobalFunction("Timer_OnFinish"))
gH_VScript_OnFinish = new VScriptExecute(HSCRIPT_RootTable.GetValue("Timer_OnFinish"));
// function Timer_GetTime(player) // returns a float
if (!gH_VScript_Timer_GetTime)
{
gH_VScript_Timer_GetTime = VScript_CreateFunction();
gH_VScript_Timer_GetTime.SetScriptName("Timer_GetTime");
gH_VScript_Timer_GetTime.Return = FIELD_FLOAT;
gH_VScript_Timer_GetTime.SetParam(1, FIELD_HSCRIPT);
gH_VScript_Timer_GetTime.SetFunctionEmpty();
gH_VScript_Timer_GetTime.Register();
gH_VScript_Timer_GetTime.CreateDetour().Enable(Hook_Pre, Detour_Timer_GetTime);
}
gH_VScript_Timer_GetTime.Register();
// function gH_VScript_Timer_GetStatus(player) // returns a int -- 0=stopped, 1=running, 2=paused
if (!gH_VScript_Timer_GetStatus)
{
gH_VScript_Timer_GetStatus = VScript_CreateFunction();
gH_VScript_Timer_GetStatus.SetScriptName("Timer_GetStatus");
gH_VScript_Timer_GetStatus.Return = FIELD_INTEGER;
gH_VScript_Timer_GetStatus.SetParam(1, FIELD_HSCRIPT);
gH_VScript_Timer_GetStatus.SetFunctionEmpty();
gH_VScript_Timer_GetStatus.Register();
gH_VScript_Timer_GetStatus.CreateDetour().Enable(Hook_Pre, Detour_Timer_GetStatus);
}
gH_VScript_Timer_GetStatus.Register();
}
MRESReturn Detour_Timer_GetTime(DHookReturn hret, DHookParam params)
{