1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2025-06-16 07:07:13 +02:00

Implement pickup option change event and expose the functions to use it.

Fix bitflags declaration for circular locks (huge mistake here).
This commit is contained in:
Sandu Liviu Catalin
2018-06-28 22:06:23 +03:00
parent 1e24f55e94
commit 877e1a38cc
11 changed files with 121 additions and 22 deletions

View File

@ -13,7 +13,7 @@ namespace SqMod {
enum CheckpointCircularLocks
{
CHECKPOINTCL_EMIT_CHECKPOINT_WORLD = (1 << 0),
CHECKPOINTCL_EMIT_CHECKPOINT_RADIUS = (2 << 0)
CHECKPOINTCL_EMIT_CHECKPOINT_RADIUS = (1 << 1)
};
/* ------------------------------------------------------------------------------------------------

View File

@ -132,6 +132,60 @@ bool CPickup::IsStreamedFor(CPlayer & player) const
return _Func->IsPickupStreamedForPlayer(m_ID, player.GetID());
}
// ------------------------------------------------------------------------------------------------
bool CPickup::GetOption(Int32 option_id) const
{
// Attempt to obtain the current value of the specified option
const bool value = _Func->GetPickupOption(m_ID, static_cast< vcmpPickupOption >(option_id));
// Check for errors
if (_Func->GetLastError() == vcmpErrorArgumentOutOfBounds)
{
STHROWF("Invalid option identifier: %d", option_id);
}
// Return the requested value
return value;
}
// ------------------------------------------------------------------------------------------------
void CPickup::SetOption(Int32 option_id, bool toggle)
{
// Attempt to obtain the current value of the specified option
const bool value = _Func->GetPickupOption(m_ID, static_cast< vcmpPickupOption >(option_id));
// Attempt to modify the current value of the specified option
if (_Func->SetPickupOption(m_ID, static_cast< vcmpPickupOption >(option_id),
toggle) == vcmpErrorArgumentOutOfBounds)
{
STHROWF("Invalid option identifier: %d", option_id);
}
else if (!(m_CircularLocks & PICKUPCL_EMIT_PICKUP_OPTION))
{
// Prevent this event from triggering while executed
BitGuardU32 bg(m_CircularLocks, PICKUPCL_EMIT_PICKUP_OPTION);
// Now forward the event call
Core::Get().EmitPickupOption(m_ID, option_id, value, 0, NullLightObj());
}
}
// ------------------------------------------------------------------------------------------------
void CPickup::SetOptionEx(Int32 option_id, bool toggle, Int32 header, LightObj & payload)
{
// Attempt to obtain the current value of the specified option
const bool value = _Func->GetPickupOption(m_ID, static_cast< vcmpPickupOption >(option_id));
// Attempt to modify the current value of the specified option
if (_Func->SetPickupOption(m_ID, static_cast< vcmpPickupOption >(option_id),
toggle) == vcmpErrorArgumentOutOfBounds)
{
STHROWF("Invalid option identifier: %d", option_id);
}
else if (!(m_CircularLocks & PICKUPCL_EMIT_PICKUP_OPTION))
{
// Prevent this event from triggering while executed
BitGuardU32 bg(m_CircularLocks, PICKUPCL_EMIT_PICKUP_OPTION);
// Now forward the event call
Core::Get().EmitPickupOption(m_ID, option_id, value, header, payload);
}
}
// ------------------------------------------------------------------------------------------------
Int32 CPickup::GetWorld() const
{
@ -469,6 +523,9 @@ void Register_CPickup(HSQUIRRELVM vm)
.Prop(_SC("PosZ"), &CPickup::GetPositionZ, &CPickup::SetPositionZ)
// Member Methods
.Func(_SC("StreamedFor"), &CPickup::IsStreamedFor)
.Func(_SC("GetOption"), &CPickup::GetOption)
.Func(_SC("SetOption"), &CPickup::SetOption)
.Func(_SC("SetOptionEx"), &CPickup::SetOptionEx)
.Func(_SC("Refresh"), &CPickup::Refresh)
.Func(_SC("SetPos"), &CPickup::SetPositionEx)
.Func(_SC("SetPosition"), &CPickup::SetPositionEx)

View File

@ -12,10 +12,11 @@ namespace SqMod {
*/
enum PickupCircularLocks
{
PICKUPCL_EMIT_PICKUP_WORLD = (1 << 0),
PICKUPCL_EMIT_PICKUP_ALPHA = (2 << 0),
PICKUPCL_EMIT_PICKUP_AUTOMATIC = (3 << 0),
PICKUPCL_EMIT_PICKUP_AUTOTIMER = (4 << 0)
PICKUPCL_EMIT_PICKUP_OPTION = (1 << 0),
PICKUPCL_EMIT_PICKUP_WORLD = (1 << 1),
PICKUPCL_EMIT_PICKUP_ALPHA = (1 << 2),
PICKUPCL_EMIT_PICKUP_AUTOMATIC = (1 << 3),
PICKUPCL_EMIT_PICKUP_AUTOTIMER = (1 << 4)
};
/* ------------------------------------------------------------------------------------------------
@ -188,6 +189,21 @@ public:
*/
bool IsStreamedFor(CPlayer & player) const;
/* --------------------------------------------------------------------------------------------
* Retrieve the current option value of the managed pickup entity.
*/
bool GetOption(Int32 option_id) const;
/* --------------------------------------------------------------------------------------------
* Modify the current option value of the managed pickup entity.
*/
void SetOption(Int32 option_id, bool toggle);
/* --------------------------------------------------------------------------------------------
* Modify the current option value of the managed pickup entity.
*/
void SetOptionEx(Int32 option_id, bool toggle, Int32 header, LightObj & payload);
/* --------------------------------------------------------------------------------------------
* Retrieve the world in which the managed pickup entity exists.
*/

View File

@ -14,15 +14,15 @@ namespace SqMod {
enum PlayerCircularLocks
{
PLAYERCL_EMIT_PLAYER_OPTION = (1 << 0),
PLAYERCL_EMIT_PLAYER_ADMIN = (2 << 0),
PLAYERCL_EMIT_PLAYER_WORLD = (3 << 0),
PLAYERCL_EMIT_PLAYER_TEAM = (4 << 0),
PLAYERCL_EMIT_PLAYER_SKIN = (5 << 0),
PLAYERCL_EMIT_PLAYER_MONEY = (6 << 0),
PLAYERCL_EMIT_PLAYER_SCORE = (7 << 0),
PLAYERCL_EMIT_PLAYER_WANTED_LEVEL = (8 << 0),
PLAYERCL_EMIT_PLAYER_IMMUNITY = (9 << 0),
PLAYERCL_EMIT_PLAYER_ALPHA = (10 << 0)
PLAYERCL_EMIT_PLAYER_ADMIN = (1 << 1),
PLAYERCL_EMIT_PLAYER_WORLD = (1 << 2),
PLAYERCL_EMIT_PLAYER_TEAM = (1 << 3),
PLAYERCL_EMIT_PLAYER_SKIN = (1 << 4),
PLAYERCL_EMIT_PLAYER_MONEY = (1 << 5),
PLAYERCL_EMIT_PLAYER_SCORE = (1 << 6),
PLAYERCL_EMIT_PLAYER_WANTED_LEVEL = (1 << 7),
PLAYERCL_EMIT_PLAYER_IMMUNITY = (1 << 8),
PLAYERCL_EMIT_PLAYER_ALPHA = (1 << 9)
};
/* ------------------------------------------------------------------------------------------------

View File

@ -13,13 +13,13 @@ namespace SqMod {
enum VehicleCircularLocks
{
VEHICLECL_EMIT_VEHICLE_OPTION = (1 << 0),
VEHICLECL_EMIT_VEHICLE_WORLD = (2 << 0),
VEHICLECL_EMIT_VEHICLE_IMMUNITY = (3 << 0),
VEHICLECL_EMIT_VEHICLE_PARTSTATUS = (4 << 0),
VEHICLECL_EMIT_VEHICLE_TYRESTATUS = (5 << 0),
VEHICLECL_EMIT_VEHICLE_DAMAGEDATA = (6 << 0),
VEHICLECL_EMIT_VEHICLE_RADIO = (7 << 0),
VEHICLECL_EMIT_VEHICLE_HANDLINGRULE = (8 << 0)
VEHICLECL_EMIT_VEHICLE_WORLD = (1 << 1),
VEHICLECL_EMIT_VEHICLE_IMMUNITY = (1 << 2),
VEHICLECL_EMIT_VEHICLE_PARTSTATUS = (1 << 3),
VEHICLECL_EMIT_VEHICLE_TYRESTATUS = (1 << 4),
VEHICLECL_EMIT_VEHICLE_DAMAGEDATA = (1 << 5),
VEHICLECL_EMIT_VEHICLE_RADIO = (1 << 6),
VEHICLECL_EMIT_VEHICLE_HANDLINGRULE = (1 << 7)
};
/* ------------------------------------------------------------------------------------------------