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); } }
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))); } } }
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); }
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); }
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); } }
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(); } }
private static void Postfix() { //Debug.Log("MPTweaksStartLevel"); if (!GameplayManager.IsMultiplayerActive) { MPTweaks.Reset(); } MPTweaks.Apply(); }
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); }
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); } } }
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 } } }
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); } }
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); }
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(); } }
static void Postfix(NetworkMessage msg) { MPTweaks.ClientCapabilitiesRemove(msg.conn.connectionId); }
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); }
private static void OnMPTweaksSet(NetworkMessage rawMsg) { var msg = rawMsg.ReadMessage <TweaksMessage>(); MPTweaks.Set(msg.m_settings); }
private static void Postfix() { MPTweaks.InitMatch(); }
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); }
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 }