Open
Description
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)
- Spawn at pos ~(0, 0, 70)
- Perform
createVeh
command - Repeat several times
restream
command and check console, there is will beFirst tunning apply
always
(right behavior)
- Spawn at pos ~(0, 0, 70)
- Perform
createVehDelayed
command and wait ~1s - Repeat several times
restream
command and check console, there is will beFirst tunning apply
only at first stream
-
Extra:
server build 6464 win32
fivem build 6464 canary
mono v1