1
0
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:
Sandu Liviu Catalin 2016-05-24 19:26:43 +03:00
parent e628428ab7
commit f05e562708
4 changed files with 248 additions and 107 deletions

View File

@ -38,9 +38,6 @@ extern void TerminateRoutines();
extern void InitializeCmdManager(); extern void InitializeCmdManager();
extern void TerminateCmdManager(); extern void TerminateCmdManager();
// ------------------------------------------------------------------------------------------------
extern Object & ReloadPayload();
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
Core Core::s_Inst; Core Core::s_Inst;
@ -58,6 +55,8 @@ Core::Core()
, m_Players() , m_Players()
, m_Vehicles() , m_Vehicles()
, m_CircularLocks(0) , m_CircularLocks(0)
, m_ReloadHeader(0)
, m_ReloadPayload()
, m_IncomingNameBuffer(nullptr) , m_IncomingNameBuffer(nullptr)
, m_IncomingNameCapacity(0) , m_IncomingNameCapacity(0)
{ {
@ -340,7 +339,7 @@ void Core::Terminate()
// Release all resources from command manager // Release all resources from command manager
TerminateCmdManager(); TerminateCmdManager();
// In case there's a payload for reload // 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 // Release null objects in case any reference to valid objects is stored in them
NullArray().Release(); NullArray().Release();
NullTable().Release(); NullTable().Release();
@ -362,7 +361,7 @@ void Core::Terminate()
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
bool Core::Reload(Int32 header, Object & payload) bool Core::Reload()
{ {
// Are we already reloading? // Are we already reloading?
if (m_CircularLocks & CCL_RELOAD_SCRIPTS) if (m_CircularLocks & CCL_RELOAD_SCRIPTS)
@ -374,7 +373,7 @@ bool Core::Reload(Int32 header, Object & payload)
// Allow reloading by default // Allow reloading by default
Core::Get().SetState(1); Core::Get().SetState(1);
// Emit the reload event // Emit the reload event
Core::Get().EmitScriptReload(header, payload); Core::Get().EmitScriptReload(m_ReloadHeader, m_ReloadPayload);
// Are we allowed to reload? // Are we allowed to reload?
if (!Core::Get().GetState()) if (!Core::Get().GetState())
{ {
@ -382,18 +381,10 @@ bool Core::Reload(Int32 header, Object & payload)
} }
// Terminate the current VM and release resources // Terminate the current VM and release resources
Terminate(); Terminate();
// Attempt to initialize it the central core // Reset the reload header after termination
if (!Initialize()) m_ReloadHeader = -1;
{ // Attempt to initialize the central core and load resources
return false; // Reload failed! return (Initialize() && Execute());
}
// Attempt to load resources
else if (!Execute())
{
return false; // Reload failed!
}
// At this point the reload is complete
return true;
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------

View File

@ -372,6 +372,10 @@ private:
// -------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------
Uint32 m_CircularLocks; // Prevent events from triggering themselves. 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. CStr m_IncomingNameBuffer; // Name of an incomming connection.
size_t m_IncomingNameCapacity; // Incomming connection name size. size_t m_IncomingNameCapacity; // Incomming connection name size.
@ -404,7 +408,7 @@ public:
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Reload the plug-in core. * Reload the plug-in core.
*/ */
bool Reload(Int32 header, Object & payload); bool Reload();
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* Modify the current plug-in state. * Modify the current plug-in state.
@ -461,6 +465,40 @@ public:
return (m_CircularLocks & lock); 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. * Adds a script to the load queue.
*/ */

View File

@ -6,49 +6,8 @@
namespace SqMod { namespace SqMod {
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
extern void EnableReload(Int32 header, Object & payload); extern bool GetReloadStatus();
extern void DisableReload(); extern void SetReloadStatus(bool toggle);
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);
}
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
static void BindEvent(Int32 id, Object & env, Function & func) 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); 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() static Int32 GetState()
{ {
return Core::Get().GetState(); return Core::Get().GetState();
} }
// ------------------------------------------------------------------------------------------------
static void SetState(Int32 value) static void SetState(Int32 value)
{ {
return Core::Get().SetState(value); return Core::Get().SetState(value);
@ -79,39 +78,172 @@ static CSStr GetOption(CSStr name)
return Core::Get().GetOption(name); return Core::Get().GetOption(name);
} }
// ------------------------------------------------------------------------------------------------
static CSStr GetOptionOr(CSStr name, CSStr value) static CSStr GetOptionOr(CSStr name, CSStr value)
{ {
return Core::Get().GetOption(name, value); return Core::Get().GetOption(name, value);
} }
// ------------------------------------------------------------------------------------------------
static void SetOption(CSStr name, CSStr value) static void SetOption(CSStr name, CSStr value)
{ {
return Core::Get().SetOption(name, 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()); STHROWF("Out of range blip identifier: %d", id);
}
else
{
DisableReload();
} }
// 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) .Bind(_SC("SqCore"), Table(vm)
.Func(_SC("Bind"), &BindEvent) .Func(_SC("Bind"), &BindEvent)
.Func(_SC("CustomEvent"), &CustomEvent) .Func(_SC("CustomEvent"), &CustomEvent)
.Func(_SC("Reload"), &SetReload) .Func(_SC("Reload"), &SqSetReloadStatus)
.Func(_SC("ReloadBecause"), &SetReloadBecause) .Func(_SC("Reloading"), &SqGetReloadStatus)
.Func(_SC("Reloading"), &IsReloading) .Func(_SC("ReloadBecause"), &SqReloadBecause)
.Func(_SC("SetReloadInfo"), &SqSetReloadInfo)
.Func(_SC("GetReloadHeader"), &SqGetReloadHeader)
.Func(_SC("GetReloadPayload"), &SqGetReloadPayload)
.Func(_SC("GetState"), &GetState) .Func(_SC("GetState"), &GetState)
.Func(_SC("SetState"), &SetState) .Func(_SC("SetState"), &SetState)
.Func(_SC("GetOption"), &GetOption) .Func(_SC("GetOption"), &GetOption)

View File

@ -10,50 +10,27 @@
namespace SqMod { namespace SqMod {
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
static bool g_Reload = false; static bool g_Reload = false;
static Int32 g_ReloadHeader = -1;
static Object g_ReloadPayload;
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
extern void InitExports(); extern void InitExports();
extern void ProcessRoutines(); 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? * Will the scripts be reloaded at the end of the current event?
*/ */
bool ReloadEnabled() bool GetReloadStatus()
{ {
return g_Reload; 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. * Helper class to make sure that the reload is disabled and the payload is released.
*/ */
@ -61,7 +38,7 @@ struct ReloadGuard
{ {
~ReloadGuard() ~ReloadGuard()
{ {
DisableReload(); g_Reload = false;
} }
}; };
@ -75,10 +52,10 @@ void DoReload()
{ {
return; // Don't even bother! 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; const ReloadGuard rg;
// Tell the central core to attempt to reload // 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"); LogFtl("Unable to reload scripts");
} }