Skip to content

Commit 67600d7

Browse files
prikolium-cfxTomGrobbe
authored andcommitted
Fix teleport to Player
1 parent 1514ebc commit 67600d7

File tree

3 files changed

+40
-19
lines changed

3 files changed

+40
-19
lines changed

vMenu/CommonFunctions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,11 @@ public static async Task TeleportToPlayer(IPlayer player, bool inVehicle = false
423423
else
424424
{
425425
playerPos = await MainMenu.RequestPlayerCoordinates(player.ServerId);
426+
if (playerPos == Vector3.Zero)
427+
{
428+
Notify.Error("Could not retrieve the coordinates of the specified player. Teleport cancelled.");
429+
return;
430+
}
426431
wasActive = false;
427432
}
428433

vMenu/MainMenu.cs

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -369,26 +369,46 @@ public void ReceivedPlayerList(IList<object> players)
369369
PlayersList?.ReceivedPlayerList(players);
370370
}
371371

372-
public static async Task<Vector3> RequestPlayerCoordinates(int serverId)
372+
struct RPCData
373373
{
374-
var coords = Vector3.Zero;
375-
var completed = false;
374+
public bool IsCompleted { get; set; }
375+
public Vector3 Coords { get; set; }
376+
}
376377

377-
// TODO: replace with client<->server RPC once implemented in CitizenFX!
378-
Func<Vector3, bool> CallbackFunction = (data) =>
378+
private static Dictionary<long, RPCData> rpcQueue = new Dictionary<long, RPCData>();
379+
private static long rpcIdCounter = 0;
380+
381+
[EventHandler("vMenu:GetPlayerCoords:reply")]
382+
public static void PlayerCoordinatesReceived(long rpcId, Vector3 coords)
383+
{
384+
if (rpcQueue.ContainsKey(rpcId))
379385
{
380-
coords = data;
381-
completed = true;
382-
return true;
383-
};
386+
var rpcItem = rpcQueue[rpcId];
387+
rpcItem.IsCompleted = true;
388+
rpcItem.Coords = coords;
389+
rpcQueue[rpcId] = rpcItem;
390+
}
391+
else
392+
{
393+
Debug.WriteLine($"[vMenu] Warning: Received player coordinates for unknown RPC ID: {rpcId}");
394+
}
395+
}
384396

385-
TriggerServerEvent("vMenu:GetPlayerCoords", serverId, CallbackFunction);
397+
public static async Task<Vector3> RequestPlayerCoordinates(int serverId)
398+
{
399+
long rpcId = rpcIdCounter++;
400+
rpcQueue.Add(rpcId, new RPCData { IsCompleted = false, Coords = Vector3.Zero });
401+
402+
TriggerServerEvent("vMenu:GetPlayerCoords", rpcId, serverId);
386403

387-
while (!completed)
404+
while (!rpcQueue[rpcId].IsCompleted)
388405
{
389406
await Delay(0);
390407
}
391408

409+
Vector3 coords = rpcQueue[rpcId].Coords;
410+
rpcQueue.Remove(rpcId);
411+
392412
return coords;
393413
}
394414
#endregion

vMenuServer/MainServer.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -912,19 +912,15 @@ internal void RequestPlayerListFromPlayer([FromSource] Player player)
912912
}
913913

914914
[EventHandler("vMenu:GetPlayerCoords")]
915-
internal void GetPlayerCoords([FromSource] Player source, int playerId, NetworkCallbackDelegate callback)
915+
internal void GetPlayerCoords([FromSource] Player source, long rpcId, int playerId, NetworkCallbackDelegate callback)
916916
{
917+
var coords = Vector3.Zero;
917918
if (IsPlayerAceAllowed(source.Handle, "vMenu.OnlinePlayers.Teleport") || IsPlayerAceAllowed(source.Handle, "vMenu.Everything") ||
918919
IsPlayerAceAllowed(source.Handle, "vMenu.OnlinePlayers.All"))
919920
{
920-
var coords = Players[playerId]?.Character?.Position ?? Vector3.Zero;
921-
922-
_ = callback(coords);
923-
924-
return;
921+
coords = Players[playerId]?.Character?.Position ?? Vector3.Zero;
925922
}
926-
927-
_ = callback(Vector3.Zero);
923+
source.TriggerEvent("vMenu:GetPlayerCoords:reply", rpcId, coords);
928924
}
929925
#endregion
930926

0 commit comments

Comments
 (0)