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 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());
}
// ------------------------------------------------------------------------------------------------

View File

@ -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.
*/

View File

@ -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)

View File

@ -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");
}