public void UnsafeSend(InnerNetObject netObject, UnsafeCustomRpc customRpc, object data, bool immediately = false, int targetClientId = -1) { if (netObject == null) { throw new ArgumentNullException(nameof(netObject)); } if (customRpc == null) { throw new ArgumentNullException(nameof(customRpc)); } if (data == null) { throw new ArgumentNullException(nameof(data)); } if (customRpc.Id == null) { throw new InvalidOperationException("Can't send unregistered CustomRpc"); } if (customRpc.LocalHandling == RpcLocalHandling.Before) { customRpc.UnsafeHandle(netObject, data); } var writer = immediately switch { false => AmongUsClient.Instance.StartRpc(netObject.NetId, CallId, SendOption.Reliable), true => AmongUsClient.Instance.StartRpcImmediately(netObject.NetId, CallId, SendOption.Reliable, targetClientId) }; if (PluginIdMap.TryGetValue(customRpc.PluginId, out var pluginId)) { writer.WritePacked(pluginId); } else { writer.Write(customRpc.PluginId); } writer.WritePacked(customRpc.Id !.Value); customRpc.UnsafeWrite(writer, data); if (immediately) { AmongUsClient.Instance.FinishRpcImmediately(writer); } else { writer.EndMessage(); } if (customRpc.LocalHandling == RpcLocalHandling.After) { customRpc.UnsafeHandle(netObject, data); } }
private bool AddNetObject(InnerNetObject obj) { if (_allObjectsFast.ContainsKey(obj.NetId)) { return(false); } _allObjects.Add(obj); _allObjectsFast.Add(obj.NetId, obj); return(true); }
private void RemoveNetObject(InnerNetObject obj) { var index = _allObjects.IndexOf(obj); if (index > -1) { _allObjects.RemoveAt(index); } _allObjectsFast.Remove(obj.NetId); obj.NetId = uint.MaxValue; }
public void UnsafeSend(InnerNetObject netObject, object data, bool immediately = false, int targetClientId = -1) { if (netObject == null) { throw new ArgumentNullException(nameof(netObject)); } if (Manager == null) { throw new InvalidOperationException("Can't send unregistered CustomRpc"); } if (LocalHandling == RpcLocalHandling.Before) { UnsafeHandle(netObject, data); } var writer = immediately switch { false => AmongUsClient.Instance.StartRpc(netObject.NetId, CustomRpcManager.CallId, SendOption), true => AmongUsClient.Instance.StartRpcImmediately(netObject.NetId, CustomRpcManager.CallId, SendOption, targetClientId) }; var pluginNetId = ModList.GetById(PluginId).NetId; writer.WritePacked(pluginNetId); writer.WritePacked(Id); writer.StartMessage(0); UnsafeWrite(writer, data); writer.EndMessage(); if (immediately) { AmongUsClient.Instance.FinishRpcImmediately(writer); } else { writer.EndMessage(); } if (LocalHandling == RpcLocalHandling.After) { UnsafeHandle(netObject, data); } } }
private async ValueTask OnDestroyAsync(InnerNetObject netObj) { switch (netObj) { case InnerLobbyBehaviour: { GameNet.LobbyBehaviour = null; break; } case InnerGameData: { GameNet.GameData = null; break; } case InnerVoteBanSystem: { GameNet.VoteBan = null; break; } case InnerShipStatus: { GameNet.ShipStatus = null; break; } case InnerPlayerControl control: { // Remove InnerPlayerControl <-> IClientPlayer. if (TryGetPlayer(control.OwnerId, out var player)) { player.Character = null; } await _eventManager.CallAsync(new PlayerDestroyedEvent(this, player, control)); break; } } }
public static bool Prefix(InnerNetObject __instance, [HarmonyArgument(0)] byte callId, [HarmonyArgument(1)] MessageReader reader) { if (callId == CallId) { var manager = PluginSingleton <ReactorPlugin> .Instance.CustomRpcManager; var customRpcs = manager.Map[__instance.GetType()]; var pluginNetId = reader.ReadPackedUInt32(); var id = reader.ReadPackedUInt32(); var pluginId = ModList.GetByNetId(pluginNetId).Id; var customRpc = customRpcs.Single(x => x.PluginId == pluginId && x.Id == id); customRpc.UnsafeHandle(__instance, customRpc.UnsafeRead(reader.ReadMessage())); return(false); } return(true); }
public static bool Prefix(InnerNetObject __instance, [HarmonyArgument(0)] byte callId, [HarmonyArgument(1)] MessageReader reader) { if (callId == CallId) { var manager = PluginSingleton <ReactorPlugin> .Instance.CustomRpcManager; var customRpcs = manager.Map[__instance.GetType()]; var lengthOrShortId = reader.ReadPackedInt32(); var pluginId = lengthOrShortId < 0 ? manager.PluginIdMapReversed[lengthOrShortId] : ReadString(reader, lengthOrShortId); var id = reader.ReadPackedInt32(); var customRpc = customRpcs.Single(x => x.PluginId == pluginId && x.Id == id); customRpc.UnsafeHandle(__instance, customRpc.UnsafeRead(reader)); return(false); } return(true); }
public void SendTo(InnerNetObject netObject, int targetId, TData data) { UnsafeSend(netObject, data, true, targetId); }
public void Send(InnerNetObject netObject, TData data, bool immediately = false) { UnsafeSend(netObject, data, immediately); }
public override void UnsafeHandle(InnerNetObject innerNetObject, object data) { Handle((TInnerNetObject)innerNetObject, (TData)data); }
public static void Send <TCustomRpc>(this InnerNetObject netObject, object data, bool immediately = false) { PluginSingleton <ReactorPlugin> .Instance.CustomRpcManager.Send <TCustomRpc>(netObject, data, immediately); }
private async ValueTask OnSpawnAsync(InnerNetObject netObj) { switch (netObj) { case InnerLobbyBehaviour lobby: { GameNet.LobbyBehaviour = lobby; break; } case InnerGameData data: { GameNet.GameData = data; break; } case InnerVoteBanSystem voteBan: { GameNet.VoteBan = voteBan; break; } case InnerShipStatus shipStatus: { GameNet.ShipStatus = shipStatus; break; } case InnerPlayerControl control: { // Hook up InnerPlayerControl <-> IClientPlayer. if (!TryGetPlayer(control.OwnerId, out var player)) { throw new ImpostorException("Failed to find player that spawned the InnerPlayerControl"); } player.Character = control; player.DisableSpawnTimeout(); // Hook up InnerPlayerControl <-> InnerPlayerControl.PlayerInfo. control.PlayerInfo = GameNet.GameData.GetPlayerById(control.PlayerId) !; if (control.PlayerInfo == null) { GameNet.GameData.AddPlayer(control); } if (control.PlayerInfo != null) { control.PlayerInfo !.Controller = control; } await _eventManager.CallAsync(new PlayerSpawnedEvent(this, player, control)); break; } case InnerMeetingHud meetingHud: { await _eventManager.CallAsync(new MeetingStartedEvent(this, meetingHud)); break; } } }
public static void SendTo <TCustomRpc>(this InnerNetObject netObject, int targetId, object data) { PluginSingleton <ReactorPlugin> .Instance.CustomRpcManager.SendTo <TCustomRpc>(netObject, targetId, data); }
public static void SendTo <TCustomRpc>(this InnerNetObject netObject, int targetId, object data) where TCustomRpc : UnsafeCustomRpc { Rpc <TCustomRpc> .Instance.UnsafeSend(netObject, data, true, targetId); }
public static void Add(InnerNetObject netObj) { entities.Add(netObj.NetId, netObj); }
public void SendTo <TCustomRpc>(InnerNetObject netObject, int targetId, object data) { UnsafeSend(netObject, List.Single(x => x.GetType() == typeof(TCustomRpc)), data, true, targetId); }
public void Send <TCustomRpc>(InnerNetObject netObject, object data, bool immediately = false) { UnsafeSend(netObject, List.Single(x => x.GetType() == typeof(TCustomRpc)), data, immediately); }
public abstract void UnsafeHandle(InnerNetObject innerNetObject, object data);
public static void Send <TCustomRpc>(this InnerNetObject netObject, object data, bool immediately = false) where TCustomRpc : UnsafeCustomRpc { Rpc <TCustomRpc> .Instance.UnsafeSend(netObject, data, immediately); }