mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-01-19 12:07:13 +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;
|
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
|
} // Namespace:: SqMod
|
||||||
|
|
||||||
#endif // _CORE_HPP_
|
#endif // _CORE_HPP_
|
||||||
|
@ -8,6 +8,9 @@ namespace SqMod {
|
|||||||
extern bool GetReloadStatus();
|
extern bool GetReloadStatus();
|
||||||
extern void SetReloadStatus(bool toggle);
|
extern void SetReloadStatus(bool toggle);
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
SQMODE_DECL_TYPENAME(CoreStateTypename, _SC("SqCoreState"))
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
static SQInteger SqLoadScript(HSQUIRRELVM vm)
|
static SQInteger SqLoadScript(HSQUIRRELVM vm)
|
||||||
{
|
{
|
||||||
@ -308,8 +311,20 @@ static bool DelVehicle(Int32 id, Int32 header, LightObj & payload)
|
|||||||
// ================================================================================================
|
// ================================================================================================
|
||||||
void Register_Core(HSQUIRRELVM vm)
|
void Register_Core(HSQUIRRELVM vm)
|
||||||
{
|
{
|
||||||
RootTable(vm)
|
Table corens(vm);
|
||||||
.Bind(_SC("SqCore"), Table(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("Reload"), &SqSetReloadStatus)
|
||||||
.Func(_SC("Reloading"), &SqGetReloadStatus)
|
.Func(_SC("Reloading"), &SqGetReloadStatus)
|
||||||
.Func(_SC("ReloadBecause"), &SqReloadBecause)
|
.Func(_SC("ReloadBecause"), &SqReloadBecause)
|
||||||
@ -340,8 +355,9 @@ void Register_Core(HSQUIRRELVM vm)
|
|||||||
.Func(_SC("OnPostLoad"), &SqGetPostLoadEvent)
|
.Func(_SC("OnPostLoad"), &SqGetPostLoadEvent)
|
||||||
.Func(_SC("OnUnload"), &SqGetUnloadEvent)
|
.Func(_SC("OnUnload"), &SqGetUnloadEvent)
|
||||||
.SquirrelFunc(_SC("LoadScript"), &SqLoadScript)
|
.SquirrelFunc(_SC("LoadScript"), &SqLoadScript)
|
||||||
.SquirrelFunc(_SC("On"), &SqGetEvents)
|
.SquirrelFunc(_SC("On"), &SqGetEvents);
|
||||||
);
|
|
||||||
|
RootTable(vm).Bind(_SC("SqCore"), corens);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // Namespace:: SqMod
|
} // Namespace:: SqMod
|
||||||
|
@ -78,7 +78,7 @@ void DoReload()
|
|||||||
static uint8_t OnServerInitialise(void)
|
static uint8_t OnServerInitialise(void)
|
||||||
{
|
{
|
||||||
// Mark the initialization as successful by default
|
// Mark the initialization as successful by default
|
||||||
Core::Get().SetState(SQMOD_SUCCESS);
|
const CoreState cs(SQMOD_SUCCESS);
|
||||||
// Attempt to forward the event
|
// Attempt to forward the event
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -198,7 +198,7 @@ static void OnServerFrame(float elapsed_time)
|
|||||||
static uint8_t OnPluginCommand(uint32_t command_identifier, CCStr message)
|
static uint8_t OnPluginCommand(uint32_t command_identifier, CCStr message)
|
||||||
{
|
{
|
||||||
// Mark the initialization as successful by default
|
// Mark the initialization as successful by default
|
||||||
Core::Get().SetState(SQMOD_SUCCESS);
|
const CoreState cs(SQMOD_SUCCESS);
|
||||||
// Attempt to forward the event
|
// Attempt to forward the event
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -216,7 +216,7 @@ static uint8_t OnIncomingConnection(CStr player_name, size_t name_buffer_size,
|
|||||||
CCStr user_password, CCStr ip_address)
|
CCStr user_password, CCStr ip_address)
|
||||||
{
|
{
|
||||||
// Mark the initialization as successful by default
|
// Mark the initialization as successful by default
|
||||||
Core::Get().SetState(SQMOD_SUCCESS);
|
const CoreState cs(SQMOD_SUCCESS);
|
||||||
// Attempt to forward the event
|
// Attempt to forward the event
|
||||||
try
|
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)
|
static uint8_t OnPlayerRequestClass(int32_t player_id, int32_t offset)
|
||||||
{
|
{
|
||||||
// Mark the initialization as successful by default
|
// Mark the initialization as successful by default
|
||||||
Core::Get().SetState(SQMOD_SUCCESS);
|
const CoreState cs(SQMOD_SUCCESS);
|
||||||
// Attempt to forward the event
|
// Attempt to forward the event
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -297,7 +297,7 @@ static uint8_t OnPlayerRequestClass(int32_t player_id, int32_t offset)
|
|||||||
static uint8_t OnPlayerRequestSpawn(int32_t player_id)
|
static uint8_t OnPlayerRequestSpawn(int32_t player_id)
|
||||||
{
|
{
|
||||||
// Mark the initialization as successful by default
|
// Mark the initialization as successful by default
|
||||||
Core::Get().SetState(SQMOD_SUCCESS);
|
const CoreState cs(SQMOD_SUCCESS);
|
||||||
// Attempt to forward the event
|
// Attempt to forward the event
|
||||||
try
|
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)
|
static uint8_t OnPlayerRequestEnterVehicle(int32_t player_id, int32_t vehicle_id, int32_t slot_index)
|
||||||
{
|
{
|
||||||
// Mark the initialization as successful by default
|
// Mark the initialization as successful by default
|
||||||
Core::Get().SetState(SQMOD_SUCCESS);
|
const CoreState cs(SQMOD_SUCCESS);
|
||||||
// Attempt to forward the event
|
// Attempt to forward the event
|
||||||
try
|
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)
|
static uint8_t OnPlayerMessage(int32_t player_id, CCStr message)
|
||||||
{
|
{
|
||||||
// Mark the initialization as successful by default
|
// Mark the initialization as successful by default
|
||||||
Core::Get().SetState(SQMOD_SUCCESS);
|
const CoreState cs(SQMOD_SUCCESS);
|
||||||
// Attempt to forward the event
|
// Attempt to forward the event
|
||||||
try
|
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)
|
static uint8_t OnPlayerCommand(int32_t player_id, CCStr message)
|
||||||
{
|
{
|
||||||
// Mark the initialization as successful by default
|
// Mark the initialization as successful by default
|
||||||
Core::Get().SetState(SQMOD_SUCCESS);
|
const CoreState cs(SQMOD_SUCCESS);
|
||||||
// Attempt to forward the event
|
// Attempt to forward the event
|
||||||
try
|
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)
|
static uint8_t OnPlayerPrivateMessage(int32_t player_id, int32_t target_player_id, CCStr message)
|
||||||
{
|
{
|
||||||
// Mark the initialization as successful by default
|
// Mark the initialization as successful by default
|
||||||
Core::Get().SetState(SQMOD_SUCCESS);
|
const CoreState cs(SQMOD_SUCCESS);
|
||||||
// Attempt to forward the event
|
// Attempt to forward the event
|
||||||
try
|
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)
|
static uint8_t OnPickupPickAttempt(int32_t pickup_id, int32_t player_id)
|
||||||
{
|
{
|
||||||
// Mark the initialization as successful by default
|
// Mark the initialization as successful by default
|
||||||
Core::Get().SetState(SQMOD_SUCCESS);
|
const CoreState cs(SQMOD_SUCCESS);
|
||||||
// Attempt to forward the event
|
// Attempt to forward the event
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user