Skip to content

StateBags issue #2018

Open
Open
@Marky-S

Description

@Marky-S

The problem is when i set replicated statebag from AddStateBagChangeHandler handler on client, this value is partial not replicating, i mean, all okay until entity restream, after restream this statebag value just disappearing on client and value is null.

But if in AddStateBagChangeHandler handler before setting statebag i make await Delay(1000) all works fine even after restream.

Theres is some repro code:

  • Client
    public class Entry : BaseScript
    {
        public Entry()
        {
            AddStateBagChangeHandler("tunning", null, new Action<string, string, object, int, bool>(StateBagChanged));
            AddStateBagChangeHandler("tunningDelayed", null, new Action<string, string, object, int, bool>(StateBagChangedDelayed));
        }

        private void StateBagChanged(string bagName, string key, object value, int reserved, bool replicated)
        {
            var vehicleHandle = GetEntityFromStateBagName(bagName);
            var vehicle = new Vehicle(vehicleHandle);

            if (vehicle.State.Get("tunningApplied") == true)
            {
                Debug.WriteLine("Tunning was applied earlier");
                return;
            }

            vehicle.State.Set("tunningApplied", true, true);

            Debug.WriteLine("First tunning apply");
        }

        private async void StateBagChangedDelayed(string bagName, string key, object value, int reserved, bool replicated)
        {
            var vehicleHandle = GetEntityFromStateBagName(bagName);
            var vehicle = new Vehicle(vehicleHandle);

            if (vehicle.State.Get("tunningApplied") == true)
            {
                Debug.WriteLine("Tunning was applied earlier");
                return;
            }

            await Delay(1000);

            vehicle.State.Set("tunningApplied", true, true);

            Debug.WriteLine("First tunning apply");
        }

        [Command("restream")]
        private async void OnRestreamCommand()
        {
            Game.PlayerPed.Position = new Vector3(-10_000f, -10_000f, 70f);

            await Delay(1000);

            Game.PlayerPed.Position = new Vector3(-14.03844f, 19.02692f, 70.88116f);
        }

        [Command("createVeh")]
        private async void OnCreateVehCommand()
        {
            var modelHash = GetHashKey("t20");

            var vehicleModel = new Model(modelHash);
            await vehicleModel.Request(3_000);

            TriggerServerEvent("createVehFromClient");
        }

        [Command("createVehDelayed")]
        private async void OnCreateVehDelayedCommand()
        {
            var modelHash = GetHashKey("t20");

            var vehicleModel = new Model(modelHash);
            await vehicleModel.Request(3_000);

            TriggerServerEvent("createVehFromClientDelayed");
        }
    }
  • Server
    public class Entry : BaseScript
    {
        [EventHandler("createVehFromClient")]
        private void OnCreateVehFromClient([FromSource] Player player)
        {
            var vehicleHandle = CreateVehicleServerSetter((uint)GetHashKey("t20"), "automobile", -14.03844f, 19.02692f, 70.88116f, 0);
            var vehicle = new Vehicle(vehicleHandle);

            vehicle.State.Set("tunning", true, true);
        }

        [EventHandler("createVehFromClientDelayed")]
        private void OnCreateVehFromClientDelayed([FromSource] Player player)
        {
            var vehicleHandle = CreateVehicleServerSetter((uint)GetHashKey("t20"), "automobile", -14.03844f, 19.02692f, 70.88116f, 0);
            var vehicle = new Vehicle(vehicleHandle);

            vehicle.State.Set("tunningDelayed", true, true);
        }
    }
  • Repro steps:

    (wrong behavior)

    1. Spawn at pos ~(0, 0, 70)
    2. Perform createVeh command
    3. Repeat several times restream command and check console, there is will be First tunning apply always

    (right behavior)

    1. Spawn at pos ~(0, 0, 70)
    2. Perform createVehDelayed command and wait ~1s
    3. Repeat several times restream command and check console, there is will be First tunning apply only at first stream
  • Extra:

    server build 6464 win32
    fivem build 6464 canary
    mono v1

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions