mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2024-11-08 00:37:15 +01:00
Move most of the reload implementation to the central core.
This commit is contained in:
parent
e628428ab7
commit
f05e562708
@ -38,9 +38,6 @@ extern void TerminateRoutines();
|
||||
extern void InitializeCmdManager();
|
||||
extern void TerminateCmdManager();
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
extern Object & ReloadPayload();
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
Core Core::s_Inst;
|
||||
|
||||
@ -58,6 +55,8 @@ Core::Core()
|
||||
, m_Players()
|
||||
, m_Vehicles()
|
||||
, m_CircularLocks(0)
|
||||
, m_ReloadHeader(0)
|
||||
, m_ReloadPayload()
|
||||
, m_IncomingNameBuffer(nullptr)
|
||||
, m_IncomingNameCapacity(0)
|
||||
{
|
||||
@ -340,7 +339,7 @@ void Core::Terminate()
|
||||
// Release all resources from command manager
|
||||
TerminateCmdManager();
|
||||
// In case there's a payload for reload
|
||||
ReloadPayload().Release();
|
||||
m_ReloadPayload.Release();
|
||||
// Release null objects in case any reference to valid objects is stored in them
|
||||
NullArray().Release();
|
||||
NullTable().Release();
|
||||
@ -362,7 +361,7 @@ void Core::Terminate()
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
bool Core::Reload(Int32 header, Object & payload)
|
||||
bool Core::Reload()
|
||||
{
|
||||
// Are we already reloading?
|
||||
if (m_CircularLocks & CCL_RELOAD_SCRIPTS)
|
||||
@ -374,7 +373,7 @@ bool Core::Reload(Int32 header, Object & payload)
|
||||
// Allow reloading by default
|
||||
Core::Get().SetState(1);
|
||||
// Emit the reload event
|
||||
Core::Get().EmitScriptReload(header, payload);
|
||||
Core::Get().EmitScriptReload(m_ReloadHeader, m_ReloadPayload);
|
||||
// Are we allowed to reload?
|
||||
if (!Core::Get().GetState())
|
||||
{
|
||||
@ -382,18 +381,10 @@ bool Core::Reload(Int32 header, Object & payload)
|
||||
}
|
||||
// Terminate the current VM and release resources
|
||||
Terminate();
|
||||
// Attempt to initialize it the central core
|
||||
if (!Initialize())
|
||||
{
|
||||
return false; // Reload failed!
|
||||
}
|
||||
// Attempt to load resources
|
||||
else if (!Execute())
|
||||
{
|
||||
return false; // Reload failed!
|
||||
}
|
||||
// At this point the reload is complete
|
||||
return true;
|
||||
// Reset the reload header after termination
|
||||
m_ReloadHeader = -1;
|
||||
// Attempt to initialize the central core and load resources
|
||||
return (Initialize() && Execute());
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
@ -372,6 +372,10 @@ private:
|
||||
// --------------------------------------------------------------------------------------------
|
||||
Uint32 m_CircularLocks; // Prevent events from triggering themselves.
|
||||
|
||||
// --------------------------------------------------------------------------------------------
|
||||
Int32 m_ReloadHeader; // The specified reload header.
|
||||
Object m_ReloadPayload; // The specified reload payload.
|
||||
|
||||
// --------------------------------------------------------------------------------------------
|
||||
CStr m_IncomingNameBuffer; // Name of an incomming connection.
|
||||
size_t m_IncomingNameCapacity; // Incomming connection name size.
|
||||
@ -404,7 +408,7 @@ public:
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Reload the plug-in core.
|
||||
*/
|
||||
bool Reload(Int32 header, Object & payload);
|
||||
bool Reload();
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Modify the current plug-in state.
|
||||
@ -461,6 +465,40 @@ public:
|
||||
return (m_CircularLocks & lock);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Set the header and payload for the reload.
|
||||
*/
|
||||
void SetReloadInfo(Int32 header, Object & payload)
|
||||
{
|
||||
m_ReloadHeader = header;
|
||||
m_ReloadPayload = payload;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Reset the header and payload for the reload.
|
||||
*/
|
||||
void ResetReloadInfo()
|
||||
{
|
||||
m_ReloadHeader = -1;
|
||||
m_ReloadPayload.Release();
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Retrieve the specified reload header.
|
||||
*/
|
||||
Int32 GetReloadHeader() const
|
||||
{
|
||||
return m_ReloadHeader;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Retrieve the specified reload header.
|
||||
*/
|
||||
Object & GetReloadPayload()
|
||||
{
|
||||
return m_ReloadPayload;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Adds a script to the load queue.
|
||||
*/
|
||||
|
@ -6,49 +6,8 @@
|
||||
namespace SqMod {
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
extern void EnableReload(Int32 header, Object & payload);
|
||||
extern void DisableReload();
|
||||
extern bool ReloadEnabled();
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static Object & GetBlip(Int32 id) { return Core::Get().GetBlip(id).mObj; }
|
||||
static Object & GetCheckpoint(Int32 id) { return Core::Get().GetCheckpoint(id).mObj; }
|
||||
static Object & GetKeybind(Int32 id) { return Core::Get().GetKeybind(id).mObj; }
|
||||
static Object & GetObject(Int32 id) { return Core::Get().GetObject(id).mObj; }
|
||||
static Object & GetPickup(Int32 id) { return Core::Get().GetPickup(id).mObj; }
|
||||
static Object & GetPlayer(Int32 id) { return Core::Get().GetPlayer(id).mObj; }
|
||||
static Object & GetVehicle(Int32 id) { return Core::Get().GetVehicle(id).mObj; }
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static bool DelBlip(Int32 id, Int32 header, Object & payload)
|
||||
{
|
||||
return Core::Get().DelBlip(id, header, payload);
|
||||
}
|
||||
|
||||
static bool DelCheckpoint(Int32 id, Int32 header, Object & payload)
|
||||
{
|
||||
return Core::Get().DelCheckpoint(id, header, payload);
|
||||
}
|
||||
|
||||
static bool DelKeybind(Int32 id, Int32 header, Object & payload)
|
||||
{
|
||||
return Core::Get().DelKeybind(id, header, payload);
|
||||
}
|
||||
|
||||
static bool DelObject(Int32 id, Int32 header, Object & payload)
|
||||
{
|
||||
return Core::Get().DelObject(id, header, payload);
|
||||
}
|
||||
|
||||
static bool DelPickup(Int32 id, Int32 header, Object & payload)
|
||||
{
|
||||
return Core::Get().DelPickup(id, header, payload);
|
||||
}
|
||||
|
||||
static bool DelVehicle(Int32 id, Int32 header, Object & payload)
|
||||
{
|
||||
return Core::Get().DelVehicle(id, header, payload);
|
||||
}
|
||||
extern bool GetReloadStatus();
|
||||
extern void SetReloadStatus(bool toggle);
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static void BindEvent(Int32 id, Object & env, Function & func)
|
||||
@ -62,12 +21,52 @@ static void CustomEvent(Int32 group, Int32 header, Object & payload)
|
||||
Core::Get().EmitCustomEvent(group, header, payload);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static bool SqGetReloadStatus()
|
||||
{
|
||||
return GetReloadStatus();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static void SqSetReloadStatus(bool toggle)
|
||||
{
|
||||
SetReloadStatus(toggle);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static void SqReloadBecause(Int32 header, Object & payload)
|
||||
{
|
||||
// Assign the reload info
|
||||
Core::Get().SetReloadInfo(header, payload);
|
||||
// Enable reloading
|
||||
SetReloadStatus(true);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static void SqSetReloadInfo(Int32 header, Object & payload)
|
||||
{
|
||||
Core::Get().SetReloadInfo(header, payload);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static Int32 SqGetReloadHeader()
|
||||
{
|
||||
return Core::Get().GetReloadHeader();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static Object & SqGetReloadPayload()
|
||||
{
|
||||
return Core::Get().GetReloadPayload();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static Int32 GetState()
|
||||
{
|
||||
return Core::Get().GetState();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static void SetState(Int32 value)
|
||||
{
|
||||
return Core::Get().SetState(value);
|
||||
@ -79,39 +78,172 @@ static CSStr GetOption(CSStr name)
|
||||
return Core::Get().GetOption(name);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static CSStr GetOptionOr(CSStr name, CSStr value)
|
||||
{
|
||||
return Core::Get().GetOption(name, value);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static void SetOption(CSStr name, CSStr value)
|
||||
{
|
||||
return Core::Get().SetOption(name, value);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static void SetReload(bool toggle)
|
||||
static Object & GetBlip(Int32 id)
|
||||
{
|
||||
if (toggle)
|
||||
// Validate the identifier first
|
||||
if (INVALID_ENTITYEX(id, SQMOD_BLIP_POOL))
|
||||
{
|
||||
EnableReload(0, NullObject());
|
||||
}
|
||||
else
|
||||
{
|
||||
DisableReload();
|
||||
STHROWF("Out of range blip identifier: %d", id);
|
||||
}
|
||||
// Return the requested information
|
||||
return Core::Get().GetBlip(id).mObj;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static void SetReloadBecause(Int32 header, Object & payload)
|
||||
static Object & GetCheckpoint(Int32 id)
|
||||
{
|
||||
EnableReload(header, payload);
|
||||
// Validate the identifier first
|
||||
if (INVALID_ENTITYEX(id, SQMOD_CHECKPOINT_POOL))
|
||||
{
|
||||
STHROWF("Out of range checkpoint identifier: %d", id);
|
||||
}
|
||||
// Return the requested information
|
||||
return Core::Get().GetCheckpoint(id).mObj;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static bool IsReloading()
|
||||
static Object & GetKeybind(Int32 id)
|
||||
{
|
||||
return ReloadEnabled();
|
||||
// Validate the identifier first
|
||||
if (INVALID_ENTITYEX(id, SQMOD_KEYBIND_POOL))
|
||||
{
|
||||
STHROWF("Out of range keybind identifier: %d", id);
|
||||
}
|
||||
// Return the requested information
|
||||
return Core::Get().GetKeybind(id).mObj;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static Object & GetObject(Int32 id)
|
||||
{
|
||||
// Validate the identifier first
|
||||
if (INVALID_ENTITYEX(id, SQMOD_OBJECT_POOL))
|
||||
{
|
||||
STHROWF("Out of range object identifier: %d", id);
|
||||
}
|
||||
// Return the requested information
|
||||
return Core::Get().GetObject(id).mObj;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static Object & GetPickup(Int32 id)
|
||||
{
|
||||
// Validate the identifier first
|
||||
if (INVALID_ENTITYEX(id, SQMOD_PICKUP_POOL))
|
||||
{
|
||||
STHROWF("Out of range blip identifier: %d", id);
|
||||
}
|
||||
// Return the requested information
|
||||
return Core::Get().GetPickup(id).mObj;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static Object & GetPlayer(Int32 id)
|
||||
{
|
||||
// Validate the identifier first
|
||||
if (INVALID_ENTITYEX(id, SQMOD_PLAYER_POOL))
|
||||
{
|
||||
STHROWF("Out of range player identifier: %d", id);
|
||||
}
|
||||
// Return the requested information
|
||||
return Core::Get().GetPlayer(id).mObj;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static Object & GetVehicle(Int32 id)
|
||||
{
|
||||
// Validate the identifier first
|
||||
if (INVALID_ENTITYEX(id, SQMOD_VEHICLE_POOL))
|
||||
{
|
||||
STHROWF("Out of range vehicle identifier: %d", id);
|
||||
}
|
||||
// Return the requested information
|
||||
return Core::Get().GetVehicle(id).mObj;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static bool DelBlip(Int32 id, Int32 header, Object & payload)
|
||||
{
|
||||
// Validate the identifier first
|
||||
if (INVALID_ENTITYEX(id, SQMOD_BLIP_POOL))
|
||||
{
|
||||
STHROWF("Out of range blip identifier: %d", id);
|
||||
}
|
||||
// Perform the requested operation
|
||||
return Core::Get().DelBlip(id, header, payload);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static bool DelCheckpoint(Int32 id, Int32 header, Object & payload)
|
||||
{
|
||||
// Validate the identifier first
|
||||
if (INVALID_ENTITYEX(id, SQMOD_CHECKPOINT_POOL))
|
||||
{
|
||||
STHROWF("Out of range checkpoint identifier: %d", id);
|
||||
}
|
||||
// Perform the requested operation
|
||||
return Core::Get().DelCheckpoint(id, header, payload);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static bool DelKeybind(Int32 id, Int32 header, Object & payload)
|
||||
{
|
||||
// Validate the identifier first
|
||||
if (INVALID_ENTITYEX(id, SQMOD_KEYBIND_POOL))
|
||||
{
|
||||
STHROWF("Out of range keybind identifier: %d", id);
|
||||
}
|
||||
// Perform the requested operation
|
||||
return Core::Get().DelKeybind(id, header, payload);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static bool DelObject(Int32 id, Int32 header, Object & payload)
|
||||
{
|
||||
// Validate the identifier first
|
||||
if (INVALID_ENTITYEX(id, SQMOD_OBJECT_POOL))
|
||||
{
|
||||
STHROWF("Out of range object identifier: %d", id);
|
||||
}
|
||||
// Perform the requested operation
|
||||
return Core::Get().DelObject(id, header, payload);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static bool DelPickup(Int32 id, Int32 header, Object & payload)
|
||||
{
|
||||
// Validate the identifier first
|
||||
if (INVALID_ENTITYEX(id, SQMOD_PICKUP_POOL))
|
||||
{
|
||||
STHROWF("Out of range blip identifier: %d", id);
|
||||
}
|
||||
// Perform the requested operation
|
||||
return Core::Get().DelPickup(id, header, payload);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static bool DelVehicle(Int32 id, Int32 header, Object & payload)
|
||||
{
|
||||
// Validate the identifier first
|
||||
if (INVALID_ENTITYEX(id, SQMOD_VEHICLE_POOL))
|
||||
{
|
||||
STHROWF("Out of range vehicle identifier: %d", id);
|
||||
}
|
||||
// Perform the requested operation
|
||||
return Core::Get().DelVehicle(id, header, payload);
|
||||
}
|
||||
|
||||
// ================================================================================================
|
||||
@ -121,9 +253,12 @@ void Register_Core(HSQUIRRELVM vm)
|
||||
.Bind(_SC("SqCore"), Table(vm)
|
||||
.Func(_SC("Bind"), &BindEvent)
|
||||
.Func(_SC("CustomEvent"), &CustomEvent)
|
||||
.Func(_SC("Reload"), &SetReload)
|
||||
.Func(_SC("ReloadBecause"), &SetReloadBecause)
|
||||
.Func(_SC("Reloading"), &IsReloading)
|
||||
.Func(_SC("Reload"), &SqSetReloadStatus)
|
||||
.Func(_SC("Reloading"), &SqGetReloadStatus)
|
||||
.Func(_SC("ReloadBecause"), &SqReloadBecause)
|
||||
.Func(_SC("SetReloadInfo"), &SqSetReloadInfo)
|
||||
.Func(_SC("GetReloadHeader"), &SqGetReloadHeader)
|
||||
.Func(_SC("GetReloadPayload"), &SqGetReloadPayload)
|
||||
.Func(_SC("GetState"), &GetState)
|
||||
.Func(_SC("SetState"), &SetState)
|
||||
.Func(_SC("GetOption"), &GetOption)
|
||||
|
@ -10,50 +10,27 @@
|
||||
namespace SqMod {
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static bool g_Reload = false;
|
||||
static Int32 g_ReloadHeader = -1;
|
||||
static Object g_ReloadPayload;
|
||||
static bool g_Reload = false;
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
extern void InitExports();
|
||||
extern void ProcessRoutines();
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* Perform a scripts reload at the end of the current event.
|
||||
*/
|
||||
void EnableReload(Int32 header, Object & payload)
|
||||
{
|
||||
g_Reload = true;
|
||||
g_ReloadHeader = header;
|
||||
g_ReloadPayload = payload;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* Do not perform a scripts reload at the end of the current event.
|
||||
*/
|
||||
void DisableReload()
|
||||
{
|
||||
g_Reload = false;
|
||||
g_ReloadHeader = -1;
|
||||
g_ReloadPayload.Release();
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* Will the scripts be reloaded at the end of the current event?
|
||||
*/
|
||||
bool ReloadEnabled()
|
||||
bool GetReloadStatus()
|
||||
{
|
||||
return g_Reload;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* Retrieve the payload that will be sent to the reload callback.
|
||||
* Toggles the reload status.
|
||||
*/
|
||||
Object & ReloadPayload()
|
||||
void SetReloadStatus(bool toggle)
|
||||
{
|
||||
return g_ReloadPayload;
|
||||
g_Reload = toggle;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* Helper class to make sure that the reload is disabled and the payload is released.
|
||||
*/
|
||||
@ -61,7 +38,7 @@ struct ReloadGuard
|
||||
{
|
||||
~ReloadGuard()
|
||||
{
|
||||
DisableReload();
|
||||
g_Reload = false;
|
||||
}
|
||||
};
|
||||
|
||||
@ -75,10 +52,10 @@ void DoReload()
|
||||
{
|
||||
return; // Don't even bother!
|
||||
}
|
||||
// Release resources at the end of this function
|
||||
// Make sure reloading is disabled at the end of this function
|
||||
const ReloadGuard rg;
|
||||
// Tell the central core to attempt to reload
|
||||
if (!Core::Get().Reload(g_ReloadHeader, g_ReloadPayload))
|
||||
if (!Core::Get().Reload())
|
||||
{
|
||||
LogFtl("Unable to reload scripts");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user