mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2024-11-08 00:37:15 +01:00
Do not overwrite the core state upon receiving recursive event calls from the server.
And allow the script to implement a similar approach.
This commit is contained in:
parent
5fa97e17d9
commit
b3cdc101a4
@ -1375,6 +1375,70 @@ public:
|
||||
SignalPair mOnScriptLoaded;
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* Structure used to preserve the core state across recursive event calls from the server.
|
||||
*/
|
||||
struct CoreState
|
||||
{
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Backup the current core state.
|
||||
*/
|
||||
CoreState()
|
||||
: m_State(Core::Get().GetState())
|
||||
{
|
||||
//...
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Backup the current core state and set the given state.
|
||||
*/
|
||||
CoreState(int s)
|
||||
: m_State(Core::Get().GetState())
|
||||
{
|
||||
Core::Get().SetState(s);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Copy constructor (disabled).
|
||||
*/
|
||||
CoreState(const CoreState & o) = delete;
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Move constructor (disabled).
|
||||
*/
|
||||
CoreState(CoreState && o) = delete;
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Destructor. Restore the grabbed core state.
|
||||
*/
|
||||
~CoreState()
|
||||
{
|
||||
Core::Get().SetState(m_State);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Copy assignment operator (disabled).
|
||||
*/
|
||||
CoreState & operator = (const CoreState & o) = delete;
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Move assignment operator (disabled).
|
||||
*/
|
||||
CoreState & operator = (CoreState && o) = delete;
|
||||
|
||||
/* --------------------------------------------------------------------------------------------
|
||||
* Retrieve the guarded state.
|
||||
*/
|
||||
int GetValue() const
|
||||
{
|
||||
return m_State;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
int m_State; // The core state at the time when this instance was created.
|
||||
};
|
||||
|
||||
} // Namespace:: SqMod
|
||||
|
||||
#endif // _CORE_HPP_
|
||||
|
@ -8,6 +8,9 @@ namespace SqMod {
|
||||
extern bool GetReloadStatus();
|
||||
extern void SetReloadStatus(bool toggle);
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
SQMODE_DECL_TYPENAME(CoreStateTypename, _SC("SqCoreState"))
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
static SQInteger SqLoadScript(HSQUIRRELVM vm)
|
||||
{
|
||||
@ -308,8 +311,20 @@ static bool DelVehicle(Int32 id, Int32 header, LightObj & payload)
|
||||
// ================================================================================================
|
||||
void Register_Core(HSQUIRRELVM vm)
|
||||
{
|
||||
RootTable(vm)
|
||||
.Bind(_SC("SqCore"), Table(vm)
|
||||
Table corens(vm);
|
||||
|
||||
corens.Bind(_SC("State"),
|
||||
Class< CoreState, NoCopy< CoreState > >(vm, CoreStateTypename::Str)
|
||||
// Constructors
|
||||
.Ctor()
|
||||
.Ctor< int >()
|
||||
// Meta-methods
|
||||
.SquirrelFunc(_SC("_typename"), &CoreStateTypename::Fn)
|
||||
// Member Properties
|
||||
.Prop(_SC("Value"), &CoreState::GetValue)
|
||||
);
|
||||
|
||||
corens
|
||||
.Func(_SC("Reload"), &SqSetReloadStatus)
|
||||
.Func(_SC("Reloading"), &SqGetReloadStatus)
|
||||
.Func(_SC("ReloadBecause"), &SqReloadBecause)
|
||||
@ -340,8 +355,9 @@ void Register_Core(HSQUIRRELVM vm)
|
||||
.Func(_SC("OnPostLoad"), &SqGetPostLoadEvent)
|
||||
.Func(_SC("OnUnload"), &SqGetUnloadEvent)
|
||||
.SquirrelFunc(_SC("LoadScript"), &SqLoadScript)
|
||||
.SquirrelFunc(_SC("On"), &SqGetEvents)
|
||||
);
|
||||
.SquirrelFunc(_SC("On"), &SqGetEvents);
|
||||
|
||||
RootTable(vm).Bind(_SC("SqCore"), corens);
|
||||
}
|
||||
|
||||
} // Namespace:: SqMod
|
||||
|
@ -78,7 +78,7 @@ void DoReload()
|
||||
static uint8_t OnServerInitialise(void)
|
||||
{
|
||||
// Mark the initialization as successful by default
|
||||
Core::Get().SetState(SQMOD_SUCCESS);
|
||||
const CoreState cs(SQMOD_SUCCESS);
|
||||
// Attempt to forward the event
|
||||
try
|
||||
{
|
||||
@ -198,7 +198,7 @@ static void OnServerFrame(float elapsed_time)
|
||||
static uint8_t OnPluginCommand(uint32_t command_identifier, CCStr message)
|
||||
{
|
||||
// Mark the initialization as successful by default
|
||||
Core::Get().SetState(SQMOD_SUCCESS);
|
||||
const CoreState cs(SQMOD_SUCCESS);
|
||||
// Attempt to forward the event
|
||||
try
|
||||
{
|
||||
@ -216,7 +216,7 @@ static uint8_t OnIncomingConnection(CStr player_name, size_t name_buffer_size,
|
||||
CCStr user_password, CCStr ip_address)
|
||||
{
|
||||
// Mark the initialization as successful by default
|
||||
Core::Get().SetState(SQMOD_SUCCESS);
|
||||
const CoreState cs(SQMOD_SUCCESS);
|
||||
// Attempt to forward the event
|
||||
try
|
||||
{
|
||||
@ -280,7 +280,7 @@ static void OnPlayerDisconnect(int32_t player_id, vcmpDisconnectReason reason)
|
||||
static uint8_t OnPlayerRequestClass(int32_t player_id, int32_t offset)
|
||||
{
|
||||
// Mark the initialization as successful by default
|
||||
Core::Get().SetState(SQMOD_SUCCESS);
|
||||
const CoreState cs(SQMOD_SUCCESS);
|
||||
// Attempt to forward the event
|
||||
try
|
||||
{
|
||||
@ -297,7 +297,7 @@ static uint8_t OnPlayerRequestClass(int32_t player_id, int32_t offset)
|
||||
static uint8_t OnPlayerRequestSpawn(int32_t player_id)
|
||||
{
|
||||
// Mark the initialization as successful by default
|
||||
Core::Get().SetState(SQMOD_SUCCESS);
|
||||
const CoreState cs(SQMOD_SUCCESS);
|
||||
// Attempt to forward the event
|
||||
try
|
||||
{
|
||||
@ -362,7 +362,7 @@ static void OnPlayerUpdate(int32_t player_id, vcmpPlayerUpdate update_type)
|
||||
static uint8_t OnPlayerRequestEnterVehicle(int32_t player_id, int32_t vehicle_id, int32_t slot_index)
|
||||
{
|
||||
// Mark the initialization as successful by default
|
||||
Core::Get().SetState(SQMOD_SUCCESS);
|
||||
const CoreState cs(SQMOD_SUCCESS);
|
||||
// Attempt to forward the event
|
||||
try
|
||||
{
|
||||
@ -597,7 +597,7 @@ static void OnPlayerAwayChange(int32_t player_id, uint8_t is_away)
|
||||
static uint8_t OnPlayerMessage(int32_t player_id, CCStr message)
|
||||
{
|
||||
// Mark the initialization as successful by default
|
||||
Core::Get().SetState(SQMOD_SUCCESS);
|
||||
const CoreState cs(SQMOD_SUCCESS);
|
||||
// Attempt to forward the event
|
||||
try
|
||||
{
|
||||
@ -614,7 +614,7 @@ static uint8_t OnPlayerMessage(int32_t player_id, CCStr message)
|
||||
static uint8_t OnPlayerCommand(int32_t player_id, CCStr message)
|
||||
{
|
||||
// Mark the initialization as successful by default
|
||||
Core::Get().SetState(SQMOD_SUCCESS);
|
||||
const CoreState cs(SQMOD_SUCCESS);
|
||||
// Attempt to forward the event
|
||||
try
|
||||
{
|
||||
@ -631,7 +631,7 @@ static uint8_t OnPlayerCommand(int32_t player_id, CCStr message)
|
||||
static uint8_t OnPlayerPrivateMessage(int32_t player_id, int32_t target_player_id, CCStr message)
|
||||
{
|
||||
// Mark the initialization as successful by default
|
||||
Core::Get().SetState(SQMOD_SUCCESS);
|
||||
const CoreState cs(SQMOD_SUCCESS);
|
||||
// Attempt to forward the event
|
||||
try
|
||||
{
|
||||
@ -765,7 +765,7 @@ static void OnObjectTouched(int32_t object_id, int32_t player_id)
|
||||
static uint8_t OnPickupPickAttempt(int32_t pickup_id, int32_t player_id)
|
||||
{
|
||||
// Mark the initialization as successful by default
|
||||
Core::Get().SetState(SQMOD_SUCCESS);
|
||||
const CoreState cs(SQMOD_SUCCESS);
|
||||
// Attempt to forward the event
|
||||
try
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user