Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        private bool AddNetObject(InnerNetObject obj)
        {
            if (_allObjectsFast.ContainsKey(obj.NetId))
            {
                return(false);
            }

            _allObjects.Add(obj);
            _allObjectsFast.Add(obj.NetId, obj);
            return(true);
        }
Exemplo n.º 3
0
        private void RemoveNetObject(InnerNetObject obj)
        {
            var index = _allObjects.IndexOf(obj);

            if (index > -1)
            {
                _allObjects.RemoveAt(index);
            }

            _allObjectsFast.Remove(obj.NetId);

            obj.NetId = uint.MaxValue;
        }
Exemplo n.º 4
0
        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);
            }
        }
    }
Exemplo n.º 5
0
        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;
            }
            }
        }
Exemplo n.º 6
0
            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);
            }
Exemplo n.º 7
0
            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);
            }
Exemplo n.º 8
0
 public void SendTo(InnerNetObject netObject, int targetId, TData data)
 {
     UnsafeSend(netObject, data, true, targetId);
 }
Exemplo n.º 9
0
 public void Send(InnerNetObject netObject, TData data, bool immediately = false)
 {
     UnsafeSend(netObject, data, immediately);
 }
Exemplo n.º 10
0
 public override void UnsafeHandle(InnerNetObject innerNetObject, object data)
 {
     Handle((TInnerNetObject)innerNetObject, (TData)data);
 }
Exemplo n.º 11
0
 public static void Send <TCustomRpc>(this InnerNetObject netObject, object data, bool immediately = false)
 {
     PluginSingleton <ReactorPlugin> .Instance.CustomRpcManager.Send <TCustomRpc>(netObject, data, immediately);
 }
Exemplo n.º 12
0
        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;
            }
            }
        }
Exemplo n.º 13
0
 public static void SendTo <TCustomRpc>(this InnerNetObject netObject, int targetId, object data)
 {
     PluginSingleton <ReactorPlugin> .Instance.CustomRpcManager.SendTo <TCustomRpc>(netObject, targetId, data);
 }
Exemplo n.º 14
0
 public static void SendTo <TCustomRpc>(this InnerNetObject netObject, int targetId, object data) where TCustomRpc : UnsafeCustomRpc
 {
     Rpc <TCustomRpc> .Instance.UnsafeSend(netObject, data, true, targetId);
 }
Exemplo n.º 15
0
 public static void Add(InnerNetObject netObj)
 {
     entities.Add(netObj.NetId, netObj);
 }
Exemplo n.º 16
0
 public void SendTo <TCustomRpc>(InnerNetObject netObject, int targetId, object data)
 {
     UnsafeSend(netObject, List.Single(x => x.GetType() == typeof(TCustomRpc)), data, true, targetId);
 }
Exemplo n.º 17
0
 public void Send <TCustomRpc>(InnerNetObject netObject, object data, bool immediately = false)
 {
     UnsafeSend(netObject, List.Single(x => x.GetType() == typeof(TCustomRpc)), data, immediately);
 }
Exemplo n.º 18
0
 public abstract void UnsafeHandle(InnerNetObject innerNetObject, object data);
Exemplo n.º 19
0
 public static void Send <TCustomRpc>(this InnerNetObject netObject, object data, bool immediately = false) where TCustomRpc : UnsafeCustomRpc
 {
     Rpc <TCustomRpc> .Instance.UnsafeSend(netObject, data, immediately);
 }