RedM Natives

ADD_STATE_BAG_CHANGE_HANDLER

Adds a handler for changes to a state bag.

Hash0x5BA35AAF
Runtime nameAddStateBagChangeHandler
NamespaceCFX
SideClient + server
NameOfficial
Docs

Signature

int ADD_STATE_BAG_CHANGE_HANDLER(char* keyFilter, char* bagFilter, func handler);

Parameters

NameTypeDescription
keyFilterchar*

The key to check for, or null for no filter.

bagFilterchar*

The bag ID to check for such as entity:65535, or null for no filter.

handlerfunc

The handler function.

Returns int — A cookie to remove the change handler.

Description

Cfx.re native reference

Adds a handler for changes to a state bag.

The function called expects to match the following signature:

function StateBagChangeHandler(bagName: string, key: string, value: any, reserved: number, replicated: boolean);
  • bagName: The internal bag ID for the state bag which changed. This is usually player:Source, entity:NetID or localEntity:Handle.
  • key: The changed key.
  • value: The new value stored at key. The old value is still stored in the state bag at the time this callback executes.
  • reserved: Currently unused.
  • replicated: Whether the set is meant to be replicated.

At this time, the change handler can't opt to reject changes.

If bagName refers to an entity, use GET_ENTITY_FROM_STATE_BAG_NAME to get the entity handle If bagName refers to a player, use GET_PLAYER_FROM_STATE_BAG_NAME to get the player handle

Usage

Lua
local retval = AddStateBagChangeHandler(keyFilter, bagFilter, handler)

-- always works, by hash
local retval = Citizen.InvokeNative(0x5ba35aaf, keyFilter, bagFilter, handler, Citizen.ResultAsInteger())
JavaScript and C#
JavaScript
const retval = AddStateBagChangeHandler(keyFilter, bagFilter, handler);

// by hash
const retval = Citizen.invokeNative('0x5ba35aaf', keyFilter, bagFilter, handler, Citizen.returnResultAnyway(), Citizen.resultAsInteger());
C#
int retval = Function.Call<int>((Hash)0x5ba35aaf, keyFilter, bagFilter, handler);

Examples

JS · Cfx.re native reference
AddStateBagChangeHandler("blockTasks", null, async (bagName, key, value /* boolean */) => {
    let entity = GetEntityFromStateBagName(bagName);
    // Whoops, we don't have a valid entity!
    if (entity === 0) return;
    // We don't want to freeze the entity position if the entity collision hasn't loaded yet
    while (!HasCollisionLoadedAroundEntity(entity)) {
        // The entity went out of our scope before the collision loaded
        if (!DoesEntityExist(entity)) return;
        await Delay(250);
    }
    SetEntityInvincible(entity, value)
    FreezeEntityPosition(entity, value)
    TaskSetBlockingOfNonTemporaryEvents(entity, value)
})
LUA · Cfx.re native reference
AddStateBagChangeHandler("blockTasks", nil, function(bagName, key, value) 
    local entity = GetEntityFromStateBagName(bagName)
    -- Whoops, we don't have a valid entity!
    if entity == 0 then return end
    -- We don't want to freeze the entity position if the entity collision hasn't loaded yet
    while not HasCollisionLoadedAroundEntity(entity) do
        -- The entity went out of our scope before the collision loaded
        if not DoesEntityExist(entity) then return end
        Wait(250)
    end
    SetEntityInvincible(entity, value)
    FreezeEntityPosition(entity, value)
    TaskSetBlockingOfNonTemporaryEvents(entity, value)
end)
CS · Cfx.re native reference
AddStateBagChangeHandler("blockTasks", null,
    new Action<string, string, object, int, bool>
    (async (bagName, key, value, res, rep) =>
    {
        bool val = (bool)value;

        var entity = GetEntityFromStateBagName(bagName);
        //-- Whoops, we don't have a valid entity!
        if (entity == 0) return;
        //-- We don't want to freeze the entity position if the entity collision hasn't loaded yet
        while (!HasCollisionLoadedAroundEntity(entity))
        {
            //--The entity went out of our scope before the collision loaded
            if (!DoesEntityExist(entity)) return;

            await Delay(250);
        }
        SetEntityInvincible(entity, val);
        FreezeEntityPosition(entity, val);
        TaskSetBlockingOfNonTemporaryEvents(entity, val);
    }));

See also

Sources

Cfx.re native reference

Something wrong or missing? Contribute a verified note — corrections ship through pull requests.