From b88a650cefe9a81fa579ccfa50d27a4d7fc17fd4 Mon Sep 17 00:00:00 2001 From: DefinitelyNotNoah <35615266+DefinitelyNotNoah@users.noreply.github.com> Date: Sat, 11 Nov 2023 21:42:59 -0600 Subject: [PATCH] Add routing bucket detection Used state bag functionality to transfer routing bucket information to clients. Now clients only update players that are in the same routing bucket. --- Client/Client.cs | 19 +++++++++++++++++-- Server/Server.cs | 4 ++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Client/Client.cs b/Client/Client.cs index 6a9265d..17d234b 100644 --- a/Client/Client.cs +++ b/Client/Client.cs @@ -68,13 +68,28 @@ public void ReceivePlayerDataClientEvent(ExpandoObject playerData) // Loop through all the positions that are being sent to the client every x amount of seconds. foreach (var entry in playerData) { + object[]? entryData = (object[])entry.Value; + + if (Game.Player.State["bucket"] != Convert.ToInt32(entryData[4])) + { + // In the event that the player's routing bucket changes while they exist in _blipData, + // we'll search for them and remove them. + if (_blipData.TryGetValue(Convert.ToInt32(entry.Key), out BlipData player)) + { + int coordBlip = player.CoordBlip; + Natives.RemoveBlip(ref coordBlip); + _blipData.Remove(Convert.ToInt32(entry.Key)); + } + continue; + } + // If the current iterated player is equal to the client's handle, skip the current loop and continue. + // We will also ensure that we're only checking for players inside the client's routing bucket. if (Convert.ToInt32(entry.Key) == Game.Player.ServerId) { continue; } - - object[]? entryData = (object[])entry.Value; + Vector3 position = (Vector3)entryData[0]; float heading = (float)entryData[1]; string name = (string)entryData[2]; diff --git a/Server/Server.cs b/Server/Server.cs index 28e79bd..a2e520e 100644 --- a/Server/Server.cs +++ b/Server/Server.cs @@ -26,7 +26,11 @@ private void SendPlayerData() player.Character.Heading, player.Name, Natives.GetEntityModel(vehicle), + Natives.GetEntityRoutingBucket(player.Character.Handle) }; + + // Update player state bags to make routing buckets known client-side. + player.State["bucket"] = Natives.GetEntityRoutingBucket(player.Character.Handle); } Events.TriggerAllClientsEvent("PlayerBlips-Client:ReceivePlayerData", playerData); }