Esempio n. 1
0
        private static void Postfix(NetworkMessage msg)
        {
            var connId = msg.conn.connectionId;

            if (connId == 0) // ignore local connection
            {
                return;
            }
            if (!MPTweaks.ClientInfos.TryGetValue(connId, out var clientInfo))
            {
                clientInfo = MPTweaks.ClientCapabilitiesSet(connId, new Dictionary <string, string>());
            }
            Debug.Log("MPTweaks: conn " + connId + " OnLoadoutDataMessage clientInfo is now " + clientInfo.Capabilities.Join());
            if (!MPTweaks.ClientHasMod(connId) && MPTweaks.MatchNeedsMod())
            {
                //LobbyChatMessage chatMsg = new LobbyChatMessage(connId, "SERVER", MpTeam.ANARCHY, "You need OLMOD to join this match", false);
                //NetworkServer.SendToClient(connId, CustomMsgType.LobbyChatToClient, chatMsg);
                NetworkServer.SendToClient(connId, 86, new StringMessage("This match requires OLMod to play."));
                GameManager.m_gm.StartCoroutine(DisconnectCoroutine(connId));
            }
            if ((NetworkMatch.GetMatchState() != MatchState.LOBBY && NetworkMatch.GetMatchState() != MatchState.LOBBY_LOAD_COUNTDOWN) && !ClientLoadoutValid(connId))
            {
                NetworkServer.SendToClient(connId, 86, new StringMessage("This match has disabled modifiers.  Please disable these modifiers and try again: " + MPModifiers.GetDisabledModifiers()));
                GameManager.m_gm.StartCoroutine(DisconnectCoroutine(connId));
            }
            if (!clientInfo.Capabilities.ContainsKey("ClassicWeaponSpawns") && (MPClassic.matchEnabled || MPModPrivateData.ClassicSpawnsEnabled))
            {
                NetworkServer.SendToClient(connId, 86, new StringMessage("This match has classic weapon spawns and requires OLMod 0.3.6 or greater."));
                GameManager.m_gm.StartCoroutine(DisconnectCoroutine(connId));
            }
            if (clientInfo.Capabilities.ContainsKey("ModPrivateData"))
            {
                MPModPrivateDataTransfer.SendTo(connId);
            }
        }
Esempio n. 2
0
        static bool Prefix(ProjPrefab ___m_type, Projectile __instance, bool damaged_something)
        {
            if (!GameplayManager.IsMultiplayerActive ||
                (___m_type != ProjPrefab.missile_creeper && ___m_type != ProjPrefab.missile_timebomb && (!MPSniperPackets.enabled || (___m_type != ProjPrefab.missile_devastator && ___m_type != ProjPrefab.missile_smart))) || // Extend to devastators and novas when sniper packets are enabled.
                __instance.m_projectile_id == -1 || __instance.RemainingLifetime() < -4f)                                                                                                                                       // unlinked/timeout: probably stuck, explode anyway
            {
                return(true);
            }
            if (!Server.IsActive()) // ignore explosions on client if creeper-sync active
            {
                return(m_allow_explosions);
            }
            var msg = new ExplodeMsg();

            msg.m_id  = __instance.m_projectile_id;
            msg.m_pos = __instance.c_transform.position;
            msg.m_damaged_something = damaged_something;
            foreach (var conn in NetworkServer.connections)
            {
                if (conn != null && MPTweaks.ClientHasNetVersion(conn.connectionId, MPCreeperSync.NET_VERSION_CREEPER_SYNC))
                {
                    NetworkServer.SendToClient(conn.connectionId, MessageTypes.MsgExplode, msg);
                }
            }
            return(true);
        }
 private static IEnumerator InformClientAboutOlmod(int connectionId, bool customLevel, int delaySeconds)
 {
     if (!MPTweaks.ClientHasMod(connectionId))
     {
         yield return(GameManager.m_gm.StartCoroutine(WaitForMPTweaks(connectionId, 3, 1)));
     }
     if (!NetworkMatch.m_players.ContainsKey(connectionId)) // disconnected?
     {
         yield break;
     }
     if (!MPTweaks.ClientHasMod(connectionId))
     {
         // client does not have olmod
         LobbyChatMessage lmsg = null;
         if (customLevel)
         {
             Debug.LogFormat("client {0} doesn't seem to have olmod, but we use a custom level, warning it", connectionId);
             lmsg = new LobbyChatMessage(connectionId, "Server", MpTeam.TEAM0, "Joining this match might be impossible without OLMod!", false);
             NetworkServer.SendToClient(connectionId, 75, lmsg);
         }
         else
         {
             lmsg = new LobbyChatMessage(connectionId, "Server", MpTeam.TEAM0, "Please install OLMod for enhanced multiplayer experience!", false);
             NetworkServer.SendToClient(connectionId, 75, lmsg);
         }
         lmsg = new LobbyChatMessage(connectionId, "Server", MpTeam.TEAM0, "See olmod.overloadmaps.com for instructions...", false);
         NetworkServer.SendToClient(connectionId, 75, lmsg);
         if (delaySeconds > 0)
         {
             yield return(new WaitForSecondsRealtime((float)(delaySeconds * 10)));
         }
     }
 }
Esempio n. 4
0
        public static bool Prefix(Player send_to_player)
        {
            m_snapshot_buffer.m_num_snapshots = 0;
            foreach (Player player in Overload.NetworkManager.m_Players)
            {
                if (!(player == null) && !player.m_spectator && !(player == send_to_player))
                {
                    NewPlayerSnapshot playerSnapshot = m_snapshot_buffer.m_snapshots[m_snapshot_buffer.m_num_snapshots++];
                    playerSnapshot.m_net_id = player.netId;
                    playerSnapshot.m_pos    = player.transform.position;
                    playerSnapshot.m_rot    = player.transform.rotation;
                    playerSnapshot.m_vel    = player.c_player_ship.c_rigidbody.velocity;
                    playerSnapshot.m_vrot   = player.c_player_ship.c_rigidbody.angularVelocity;
                }
            }
            if (m_snapshot_buffer.m_num_snapshots > 0)
            {
                if (!MPNoPositionCompression.enabled || !MPTweaks.ClientHasTweak(send_to_player.connectionToClient.connectionId, "nocompress_0_3_6"))
                {
                    send_to_player.connectionToClient.SendByChannel(64, m_snapshot_buffer.ToOldSnapshotMessage(), 1);
                    return(false);
                }

                send_to_player.connectionToClient.SendByChannel(MessageTypes.MsgNewPlayerSnapshotToClient, m_snapshot_buffer, 1);
            }
            return(false);
        }
        static void ReportPlayerDeath(Player player, int num, int num2)
        {
            Player          killer, assister = null;
            var             killer_id   = default(NetworkInstanceId);
            var             assister_id = default(NetworkInstanceId);
            PlayerLobbyData playerLobbyData;

            if (num2 != -1 && NetworkMatch.m_players.TryGetValue(num2, out playerLobbyData))
            {
                killer = Server.FindPlayerByConnectionId(playerLobbyData.m_id);
                if (killer != null)
                {
                    killer_id = killer.netId;
                }
            }
            if (num != -1 && NetworkMatch.m_players.TryGetValue(num, out playerLobbyData))
            {
                assister = Server.FindPlayerByConnectionId(playerLobbyData.m_id);
                if (assister != null)
                {
                    assister_id = assister.netId;
                }
            }

            // Send stats to client and clear out
            if (MPTweaks.ClientHasTweak(player.connectionToClient.connectionId, "deathreview"))
            {
                NetworkServer.SendToClient(player.connectionToClient.connectionId, MessageTypes.MsgDeathReview, new DeathReviewMessage {
                    m_killer_id = killer_id, m_assister_id = assister_id, players = ServerDamageLog.GetSummaryForDeadPlayer(player)
                });
            }
            ServerDamageLog.Clear(player.netId);
        }
Esempio n. 6
0
        private static void OnClientCapabilities(NetworkMessage rawMsg)
        {
            var msg = rawMsg.ReadMessage <TweaksMessage>();

            Debug.LogFormat("MPTweaks: received client capabilities {0}: {1}", rawMsg.conn.connectionId, msg.m_settings.Join());
            MPTweaks.ClientCapabilitiesSet(rawMsg.conn.connectionId, msg.m_settings);
        }
Esempio n. 7
0
        static void Postfix(float ___m_refire_missile_time, Player ___c_player)
        {
            if (!GameplayManager.IsMultiplayerActive ||
                !Server.IsActive() ||
                !(___m_refire_missile_time == 1f &&
                  ___c_player.m_old_missile_type != MissileType.NUM &&
                  ___c_player.m_missile_ammo[(int)___c_player.m_old_missile_type] == 0)) // just switched?
            {
                return;
            }

            // make sure ammo is also zero on the client
            ___c_player.CallRpcSetMissileAmmo((int)___c_player.m_old_missile_type, 0);

            // workaround for not updating missle name in hud
            ___c_player.CallRpcSetMissileType(___c_player.m_missile_type);
            ___c_player.CallTargetUpdateCurrentMissileName(___c_player.connectionToClient);

            // make sure alternating missle fire is equal
            int connectionId = ___c_player.connectionToClient.connectionId;

            if (MPTweaks.ClientHasNetVersion(connectionId, MPCreeperSync.NET_VERSION_CREEPER_SYNC))
            {
                var msg = new IntegerMessage(___c_player.c_player_ship.m_alternating_missile_fire ? 1 : 0);
                NetworkServer.SendToClient(connectionId, CreeperSyncMsg.MsgSetAlternatingMissleFire, msg);
            }
        }
Esempio n. 8
0
        private static void Postfix()
        {
            if (!GameplayManager.IsDedicatedServer())
            {
                return;
            }
            Debug.Log("MPTweaksLoadScene");
            RobotManager.ReadMultiplayerModeFile();
            Debug.Log("MPTweaks loaded mode file");
            var tweaks = new Dictionary <string, string>()
            {
            };

            if (NetworkMatch.GetMode() == CTF.MatchModeCTF)
            {
                tweaks.Add("ctf.returntimer", CTF.ReturnTimeAmountDefault.ToStringInvariantCulture());
            }
            if (!MPCustomModeFile.PickupCheck)
            {
                tweaks.Add("item.pickupcheck", Boolean.FalseString);
            }
            tweaks.Add("nocompress.reliable_timestamps", Boolean.TrueString);
            if (tweaks.Any())
            {
                Debug.LogFormat("MPTweaks: sending tweaks {0}", tweaks.Join());
                MPTweaks.Set(tweaks);
                MPTweaks.Send();
            }
        }
Esempio n. 9
0
 private static void Postfix()
 {
     //Debug.Log("MPTweaksStartLevel");
     if (!GameplayManager.IsMultiplayerActive)
     {
         MPTweaks.Reset();
     }
     MPTweaks.Apply();
 }
Esempio n. 10
0
        private static void SendSnapshotsToPlayer(Player player)
        {
            if (!MPNoPositionCompression.enabled || !MPTweaks.ClientHasTweak(player.connectionToClient.connectionId, "nocompress"))
            {
                player.connectionToClient.SendByChannel(64, player.m_snapshot_buffer, 1);
                return;
            }

            player.connectionToClient.SendByChannel(MessageTypes.MsgNewPlayerSnapshotToClient, (NewPlayerSnapshotToClientMessage)player.m_snapshot_buffer, 1);
        }
Esempio n. 11
0
        public static void SendAddMpStatus(string status)
        {
            var msg = new StringMessage(status);

            foreach (var conn in NetworkServer.connections)
            {
                if (conn != null && MPTweaks.ClientHasMod(conn.connectionId)) // do not send unsupported message to stock game
                {
                    conn.Send(MessageTypes.MsgAddMpStatus, msg);
                }
            }
        }
Esempio n. 12
0
        static void Postfix()
        {
            var proj_list = ProjectileManager.proj_list[(int)ProjPrefab.missile_creeper].Union(ProjectileManager.proj_list[(int)ProjPrefab.missile_timebomb]).ToList();

            if (proj_list.Count > msg.m_proj_info.Length)
            {
                msg.m_proj_info = new ProjInfo[proj_list.Count];
            }
            var proj_info = msg.m_proj_info;
            int count     = 0;

            if (++frame_num == UPDATE_INTERVAL)
            {
                frame_num = 0;
            }
            foreach (var proj in proj_list)
            {
                if (proj.m_alive)
                {
                    var c_proj = proj.c_proj;
                    int id     = c_proj.m_projectile_id;
                    if ((id & (UPDATE_INTERVAL - 1)) != frame_num)
                    {
                        continue;
                    }
                    proj_info[count].m_id  = id;
                    proj_info[count].m_pos = c_proj.transform.position;
                    proj_info[count].m_vel = c_proj.c_rigidbody.velocity;
                    count++;
                }
            }

            if (count == 0)
            {
                return;
            }

            msg.m_num_proj_info = count;
            foreach (var conn in NetworkServer.connections)
            {
                if (conn != null && MPTweaks.ClientHasNetVersion(conn.connectionId, MPCreeperSync.NET_VERSION_CREEPER_SYNC))
                {
                    conn.SendByChannel(MessageTypes.MsgCreeperSync, msg, 3); // channel 3 has QosType.StateUpdate
                }
            }
        }
Esempio n. 13
0
        private static void Postfix(NetworkMessage msg)
        {
            int connectionId = msg.conn.connectionId;

            if (!MPTweaks.ClientHasMod(connectionId) && MPTweaks.MatchNeedsMod())
            {
                return;
            }

            if (NetworkMatch.GetMatchState() == MatchState.PLAYING)
            {
                GameManager.m_gm.StartCoroutine(MatchStart(connectionId));
            }
            else if (NetworkMatch.GetMatchState() == MatchState.PREGAME && NetworkMatch.m_pregame_countdown_active)
            {
                SendPreGame(connectionId, NetworkMatch.m_pregame_countdown_seconds_left);
            }
        }
Esempio n. 14
0
        private static void Postfix(NetworkMessage msg)
        {
            var connId = msg.conn.connectionId;

            if (connId == 0) // ignore local connection
            {
                return;
            }
            if (!MPTweaks.ClientInfos.TryGetValue(connId, out var clientInfo))
            {
                clientInfo = MPTweaks.ClientCapabilitiesSet(connId, new Dictionary <string, string>());
            }

            /*
             * if (!clientInfo.SupportsTweaks.Contains("proj") && !MPTweaks.IncompatibleMatchReported)
             * {
             *  MPTweaks.IncompatibleMatchReported = true;
             *  string name = NetworkMatch.m_players.TryGetValue(connId, out var playerData) ? playerData.m_name : connId.ToString();
             *  var text = "DISABLED HUNTER SPEED CHANGE! OLD OLMOD: " + name;
             *  Debug.LogFormat("MPTweaks: IncompatibleMatchReported {0}", text);
             *  JIPClientHandlers.SendAddMpStatus(text);
             * }
             */
            Debug.Log("MPTweaks: conn " + connId + " OnLoadoutDataMessage clientInfo is now " + clientInfo.Capabilities.Join());
            if (!MPTweaks.ClientHasMod(connId) && MPTweaks.MatchNeedsMod())
            {
                //LobbyChatMessage chatMsg = new LobbyChatMessage(connId, "SERVER", MpTeam.ANARCHY, "You need OLMOD to join this match", false);
                //NetworkServer.SendToClient(connId, CustomMsgType.LobbyChatToClient, chatMsg);
                NetworkServer.SendToClient(connId, 86, new StringMessage("You need OLMOD to join this match."));
                GameManager.m_gm.StartCoroutine(DisconnectCoroutine(connId));
            }
            if ((NetworkMatch.GetMatchState() != MatchState.LOBBY && NetworkMatch.GetMatchState() != MatchState.LOBBY_LOAD_COUNTDOWN) && !ClientLoadoutValid(connId))
            {
                NetworkServer.SendToClient(connId, 86, new StringMessage("This match has disabled modifiers: " + MPModifiers.GetDisabledModifiers()));
                GameManager.m_gm.StartCoroutine(DisconnectCoroutine(connId));
            }
            if (clientInfo.Capabilities.ContainsKey("ModPrivateData"))
            {
                MPModPrivateDataTransfer.SendTo(connId);
            }
        }
        private static IEnumerator WaitForMPTweaks(int connectionId, int maxSeconds, int informAfter = -1)
        {
            int cnt = 0;

            while (!MPTweaks.ClientHasMod(connectionId) && cnt < maxSeconds * 10)
            {
                cnt++;
                yield return(new WaitForSecondsRealtime(0.1f));

                if (!NetworkMatch.m_players.ContainsKey(connectionId)) // disconnected?
                {
                    yield break;
                }
                if (cnt == informAfter * 10)
                {
                    // it's already unlikely to be a modded client.
                    LobbyChatMessage lmsg = new LobbyChatMessage(connectionId, "Server", MpTeam.TEAM0, "This server uses OLMod", false);
                    NetworkServer.SendToClient(connectionId, 75, lmsg);
                }
            }
        }
        private static IEnumerator SendSceneLoad(int connectionId)
        {
            // wait until we've received the loadout
            while (!NetworkMatch.m_player_loadout_data.ContainsKey(connectionId))
            {
                if (!NetworkMatch.m_players.ContainsKey(connectionId)) // disconnected?
                {
                    yield break;
                }
                yield return(null);
            }
            string level       = MPJoinInProgress.NetworkMatchLevelName();
            bool   customLevel = (level != null)? level.Contains(':') : false;

            if (customLevel && !MPTweaks.ClientHasMod(connectionId))
            {
                // client seems not to have olmod, warn it
                yield return(GameManager.m_gm.StartCoroutine(InformClientAboutOlmod(connectionId, customLevel, 8)));

                if (!NetworkMatch.m_players.ContainsKey(connectionId)) // disconnected?
                {
                    yield break;
                }
            }

            StringMessage levelNameMsg = new StringMessage(level);

            NetworkServer.SendToClient(connectionId, CustomMsgType.SceneLoad, levelNameMsg);
            Debug.Log("JIP: sending scene load " + levelNameMsg.value);

            if (NetworkMatch.GetMatchState() == MatchState.LOBBY_LOADING_SCENE)
            {
                yield break;
            }

            StringMessage sceneNameMsg = new StringMessage(GameplayManager.m_level_info.SceneName);

            NetworkServer.SendToClient(connectionId, CustomMsgType.SceneLoaded, sceneNameMsg);
            Debug.Log("JIP: sending scene loaded " + sceneNameMsg.value);
        }
Esempio n. 17
0
        private static void Postfix()
        {
            if (!GameplayManager.IsDedicatedServer())
            {
                return;
            }
            Debug.Log("MPTweaksLoadScene");
            RobotManager.ReadMultiplayerModeFile();
            Debug.Log("MPTweaks loaded mode file");
            bool nobodySupportsProj = !NetworkMatch.m_players.Keys.Any(connId =>
                                                                       MPTweaks.ClientInfos.TryGetValue(connId, out var clientInfo) &&
                                                                       clientInfo.SupportsTweaks.Contains("proj"));
            var tweaks = new Dictionary <string, string>()
            {
            };

            if (nobodySupportsProj) // use stock hunters for all stock client match
            {
                Debug.LogFormat("MPTweaks: not tweaking hunter: unsupported by all clients");
            }
            else
            {
                tweaks.Add("proj.missile_hunter.m_init_speed_min", "17.5");
            }
            if (NetworkMatch.GetMode() == CTF.MatchModeCTF)
            {
                tweaks.Add("ctf.returntimer", CTF.ReturnTimeAmountDefault.ToStringInvariantCulture());
            }
            if (!MPCustomModeFile.PickupCheck)
            {
                tweaks.Add("item.pickupcheck", Boolean.FalseString);
            }
            if (tweaks.Any())
            {
                Debug.LogFormat("MPTweaks: sending tweaks {0}", tweaks.Join());
                MPTweaks.Set(tweaks);
                MPTweaks.Send();
            }
        }
Esempio n. 18
0
 static void Postfix(NetworkMessage msg)
 {
     MPTweaks.ClientCapabilitiesRemove(msg.conn.connectionId);
 }
Esempio n. 19
0
        private static IEnumerator MatchStart(int connectionId)
        {
            if (!MPTweaks.ClientHasMod(connectionId) && MPTweaks.MatchNeedsMod())
            {
                yield break;
            }
            var newPlayer = Server.FindPlayerByConnectionId(connectionId);

            if (newPlayer.m_mp_name.StartsWith("OBSERVER"))
            {
                Debug.LogFormat("Enabling spectator for {0}", newPlayer.m_mp_name);
                newPlayer.Networkm_spectator = true;
                Debug.LogFormat("Enabled spectator for {0}", newPlayer.m_mp_name);
            }

            int pregameWait = newPlayer.Networkm_spectator ? 0 : 3;

            //Debug.Log("SendLoadoutDataToClients: " + NetworkMatch.m_player_loadout_data.Join());
            // restore lobby_id which got wiped out in Client.OnSetLoadout
            foreach (var idData in NetworkMatch.m_player_loadout_data)
            {
                idData.Value.lobby_id = idData.Key;
            }
            Server.SendLoadoutDataToClients();
            IntegerMessage durationMsg = new IntegerMessage(pregameWait * 1000);

            NetworkServer.SendToClient(connectionId, CustomMsgType.StartPregameCountdown, durationMsg);
            Debug.Log("JIP: sending start pregame countdown");
            yield return(new WaitForSeconds(pregameWait));

            IntegerMessage modeMsg = new IntegerMessage((int)NetworkMatch.GetMode());

            NetworkServer.SendToClient(connectionId, CustomMsgType.MatchStart, modeMsg);
            SendMatchState(connectionId);
            NetworkSpawnPlayer.Respawn(newPlayer.c_player_ship);
            MPTweaks.Send(connectionId);
            if (!newPlayer.m_spectator && RearView.MPNetworkMatchEnabled)
            {
                newPlayer.CallTargetAddHUDMessage(newPlayer.connectionToClient, "REARVIEW ENABLED", -1, true);
            }
            CTF.SendJoinUpdate(newPlayer);
            Race.SendJoinUpdate(newPlayer);
            foreach (Player player in Overload.NetworkManager.m_Players)
            {
                if (player.connectionToClient.connectionId == connectionId)
                {
                    continue;
                }
                // Resend mode for existing player to move h2h -> anarchy
                NetworkServer.SendToClient(player.connectionToClient.connectionId, CustomMsgType.MatchStart, modeMsg);

                if (!newPlayer.m_spectator)
                {
                    player.CallTargetAddHUDMessage(player.connectionToClient, String.Format(Loc.LS("{0} JOINED MATCH"), newPlayer.m_mp_name), -1, true);
                }

                //Debug.Log("JIP: spawning on new client net " + player.netId + " lobby " + player.connectionToClient.connectionId);
                NetworkServer.SendToClient(connectionId, CustomMsgType.Respawn, new RespawnMessage
                {
                    m_net_id     = player.netId,
                    lobby_id     = player.connectionToClient.connectionId,
                    m_pos        = player.transform.position,
                    m_rotation   = player.transform.rotation,
                    use_loadout1 = player.m_use_loadout1
                });
            }
            ServerStatLog.Connected(newPlayer.m_mp_name);
        }
Esempio n. 20
0
        private static void OnMPTweaksSet(NetworkMessage rawMsg)
        {
            var msg = rawMsg.ReadMessage <TweaksMessage>();

            MPTweaks.Set(msg.m_settings);
        }
Esempio n. 21
0
 private static void Postfix()
 {
     MPTweaks.InitMatch();
 }
Esempio n. 22
0
        private static IEnumerator MatchStart(int connectionId)
        {
            var newPlayer = Server.FindPlayerByConnectionId(connectionId);

            float pregameWait = 3f;

            if (!newPlayer.m_mp_name.StartsWith("OBSERVER"))
            {
                foreach (Player player in Overload.NetworkManager.m_Players)
                {
                    if (MPTweaks.ClientHasTweak(player.connectionToClient.connectionId, "jip"))
                    {
                        NetworkServer.SendToClient(player.connectionToClient.connectionId, MessageTypes.MsgJIPJustJoined, new JIPJustJoinedMessage {
                            playerId = newPlayer.netId, ready = false
                        });
                    }
                }
                MPJoinInProgress.SetReady(newPlayer, false);
            }

            pregameWait = SendPreGame(connectionId, pregameWait);
            yield return(new WaitForSeconds(pregameWait));

            Server.SendLoadoutDataToClients();

            if (newPlayer.m_mp_name.StartsWith("OBSERVER"))
            {
                Debug.LogFormat("Enabling spectator for {0}", newPlayer.m_mp_name);
                newPlayer.Networkm_spectator = true;
                Debug.LogFormat("Enabled spectator for {0}", newPlayer.m_mp_name);

                yield return(null); // make sure spectator change is received before sending MatchStart
            }
            else
            {
                foreach (Player player in Overload.NetworkManager.m_Players)
                {
                    if (MPTweaks.ClientHasTweak(player.connectionToClient.connectionId, "jip"))
                    {
                        NetworkServer.SendToClient(player.connectionToClient.connectionId, MessageTypes.MsgJIPJustJoined, new JIPJustJoinedMessage {
                            playerId = newPlayer.netId, ready = true
                        });
                    }
                }
                MPJoinInProgress.SetReady(newPlayer, true);
            }

            if (NetworkMatch.GetMatchState() != MatchState.PLAYING)
            {
                yield break;
            }

            IntegerMessage modeMsg = new IntegerMessage((int)NetworkMatch.GetMode());

            NetworkServer.SendToClient(connectionId, CustomMsgType.MatchStart, modeMsg);
            SendMatchState(connectionId);

            NetworkSpawnPlayer.Respawn(newPlayer.c_player_ship);
            MPTweaks.Send(connectionId);
            //if (!newPlayer.m_spectator && RearView.MPNetworkMatchEnabled)
            //    newPlayer.CallTargetAddHUDMessage(newPlayer.connectionToClient, "REARVIEW ENABLED", -1, true);
            CTF.SendJoinUpdate(newPlayer);
            Race.SendJoinUpdate(newPlayer);
            foreach (Player player in Overload.NetworkManager.m_Players)
            {
                if (player.connectionToClient.connectionId == connectionId)
                {
                    continue;
                }
                // Resend mode for existing player to move h2h -> anarchy
                NetworkServer.SendToClient(player.connectionToClient.connectionId, CustomMsgType.MatchStart, modeMsg);

                if (!newPlayer.m_spectator)
                {
                    player.CallTargetAddHUDMessage(player.connectionToClient, String.Format(Loc.LS("{0} JOINED MATCH"), newPlayer.m_mp_name), -1, true);
                }

                //Debug.Log("JIP: spawning on new client net " + player.netId + " lobby " + player.connectionToClient.connectionId);
                NetworkServer.SendToClient(connectionId, CustomMsgType.Respawn, new RespawnMessage
                {
                    m_net_id     = player.netId,
                    lobby_id     = player.connectionToClient.connectionId,
                    m_pos        = player.transform.position,
                    m_rotation   = player.transform.rotation,
                    use_loadout1 = player.m_use_loadout1
                });
            }
            ServerStatLog.Connected(newPlayer.m_mp_name);
        }
Esempio n. 23
0
        private static void SendMatchState(int connectionId)
        {
            if (NetworkMatch.IsTeamMode(NetworkMatch.GetMode()))
            {
                foreach (var team in MPTeams.ActiveTeams)
                {
                    NetworkServer.SendToClient(connectionId, CustomMsgType.SetScoreForTeam, new ScoreForTeamMessage
                    {
                        team  = (int)team,
                        score = NetworkMatch.m_team_scores[(int)team]
                    });
                }
            }
            //if (!MPTweaks.ClientHasMod(connectionId))
            //    return;

            // Process any disconnected scoreboard entries, add them to active pilot, and remove stale scoreboard objects
            foreach (var player in Overload.NetworkManager.m_Players)
            {
                // Add any previous records for pilot on join
                var playersSameName = Overload.NetworkManager.m_PlayersForScoreboard.Where(x => !String.IsNullOrEmpty(x.m_mp_name) && x.m_mp_name == player.m_mp_name).ToList();
                player.m_kills   = playersSameName.Sum(x => x.m_kills);
                player.m_deaths  = playersSameName.Sum(x => x.m_deaths);
                player.m_assists = playersSameName.Sum(x => x.m_assists);

                // Remove previously DC'd players of same name from server scoreboard list
                playersSameName.Where(x => x != player).ToList().ForEach(x => Overload.NetworkManager.m_PlayersForScoreboard.Remove(x));
            }

            var n   = Overload.NetworkManager.m_Players.Count;
            var msg = new MatchStateMessage()
            {
                m_match_elapsed_seconds = NetworkMatch.m_match_elapsed_seconds,
                m_player_states         = new PlayerMatchState[n]
            };
            int i = 0;

            foreach (var player in Overload.NetworkManager.m_Players)
            {
                msg.m_player_states[i++] = new PlayerMatchState()
                {
                    m_net_id  = player.netId,
                    m_kills   = player.m_kills,
                    m_deaths  = player.m_deaths,
                    m_assists = player.m_assists
                }
            }
            ;
            NetworkServer.SendToClient(connectionId, MessageTypes.MsgSetMatchState, msg);

            // Send disconnected pilot stats as separate message
            if (MPTweaks.ClientHasTweak(connectionId, "jip"))
            {
                var dcPlayers = Overload.NetworkManager.m_PlayersForScoreboard.Where(x => !Overload.NetworkManager.m_Players.Contains(x));
                var dcmsg     = new DisconnectedPlayerMatchStateMessage()
                {
                    m_player_states = new DisconnectedPlayerMatchState[dcPlayers.Count()]
                };
                int j = 0;
                foreach (var player in dcPlayers)
                {
                    dcmsg.m_player_states[j++] = new DisconnectedPlayerMatchState()
                    {
                        m_net_id  = NetworkInstanceId.Invalid,
                        m_kills   = player.m_kills,
                        m_deaths  = player.m_deaths,
                        m_assists = player.m_assists,
                        m_mp_name = player.m_mp_name,
                        m_mp_team = player.m_mp_team
                    };
                }
                NetworkServer.SendToClient(connectionId, MessageTypes.MsgSetDisconnectedMatchState, dcmsg);
            }
        }
        private static IEnumerator MatchStart(int connectionId)
        {
            var        newPlayer      = Server.FindPlayerByConnectionId(connectionId);
            MPBanEntry newPlayerEntry = new MPBanEntry(newPlayer);

            // prevent banned players from JIP into our match
            // there is already a delayed Disconnect going on, just
            // prevent this player from entering the JIP code
            if (MPBanPlayers.IsBanned(newPlayerEntry))
            {
                yield break;
            }

            float pregameWait = 3f;

            if (!newPlayer.m_mp_name.StartsWith("OBSERVER"))
            {
                foreach (Player player in Overload.NetworkManager.m_Players)
                {
                    if (MPTweaks.ClientHasTweak(player.connectionToClient.connectionId, "jip"))
                    {
                        NetworkServer.SendToClient(player.connectionToClient.connectionId, MessageTypes.MsgJIPJustJoined, new JIPJustJoinedMessage {
                            playerId = newPlayer.netId, ready = false
                        });
                    }
                }
                MPJoinInProgress.SetReady(newPlayer, false, true); // special case: do not disable the player completely, as this would prevent this player to be sent to new clients joining before we finally switch to ready
            }

            pregameWait = SendPreGame(connectionId, pregameWait);
            yield return(new WaitForSeconds(pregameWait));

            Server.SendLoadoutDataToClients();

            if (newPlayer.m_mp_name.StartsWith("OBSERVER"))
            {
                Debug.LogFormat("Enabling spectator for {0}", newPlayer.m_mp_name);
                newPlayer.Networkm_spectator = true;
                Debug.LogFormat("Enabled spectator for {0}", newPlayer.m_mp_name);

                yield return(null); // make sure spectator change is received before sending MatchStart
            }
            else
            {
                foreach (Player player in Overload.NetworkManager.m_Players)
                {
                    if (MPTweaks.ClientHasTweak(player.connectionToClient.connectionId, "jip"))
                    {
                        NetworkServer.SendToClient(player.connectionToClient.connectionId, MessageTypes.MsgJIPJustJoined, new JIPJustJoinedMessage {
                            playerId = newPlayer.netId, ready = true
                        });
                    }
                }
                MPJoinInProgress.SetReady(newPlayer, true);
            }

            if (NetworkMatch.GetMatchState() != MatchState.PLAYING)
            {
                yield break;
            }

            IntegerMessage modeMsg = new IntegerMessage((int)NetworkMatch.GetMode());

            NetworkServer.SendToClient(connectionId, CustomMsgType.MatchStart, modeMsg);
            SendMatchState(connectionId);

            NetworkSpawnPlayer.Respawn(newPlayer.c_player_ship);
            MPTweaks.Send(connectionId);
            //if (!newPlayer.m_spectator && RearView.MPNetworkMatchEnabled)
            //    newPlayer.CallTargetAddHUDMessage(newPlayer.connectionToClient, "REARVIEW ENABLED", -1, true);
            CTF.SendJoinUpdate(newPlayer);
            Race.SendJoinUpdate(newPlayer);
            foreach (Player player in Overload.NetworkManager.m_Players)
            {
                if (player.connectionToClient.connectionId == connectionId)
                {
                    continue;
                }
                // Resend mode for existing player to move h2h -> anarchy
                NetworkServer.SendToClient(player.connectionToClient.connectionId, CustomMsgType.MatchStart, modeMsg);

                if (!newPlayer.m_spectator)
                {
                    player.CallTargetAddHUDMessage(player.connectionToClient, String.Format(Loc.LS("{0} JOINED MATCH"), newPlayer.m_mp_name), -1, true);
                }

                //Debug.Log("JIP: spawning on new client net " + player.netId + " lobby " + player.connectionToClient.connectionId);
                NetworkServer.SendToClient(connectionId, CustomMsgType.Respawn, new RespawnMessage
                {
                    m_net_id     = player.netId,
                    lobby_id     = player.connectionToClient.connectionId,
                    m_pos        = player.transform.position,
                    m_rotation   = player.transform.rotation,
                    use_loadout1 = player.m_use_loadout1
                });
            }
            ServerStatLog.Connected(newPlayer.m_mp_name);
            MPBanPlayers.ApplyAllBans(); // make sure the newly connected player gets proper treatment if he is BANNED
        }