private static void Postfix(ref bool __result, int connection_id, int version, string player_name, string player_session_id, string player_id, string player_uid) { MPBanPlayers.JoiningPlayerIsBanned = false; MPBanPlayers.JoiningPlayerIsAnnoyed = false; MPBanPlayers.JoiningPlayerConnectionId = connection_id; MPBanPlayers.JoiningPlayerLobbyData = null; if (__result) { // the player has been accepted by the game's matchmaking MPBanEntry candidate = new MPBanEntry(player_name, connection_id, player_id); bool isCreator = false; if (!MPBanPlayers.MatchCreatorIsInGame && MPBanPlayers.PlayerWithPrivateMatchData != null && !String.IsNullOrEmpty(MPBanPlayers.PlayerWithPrivateMatchData.id) && !String.IsNullOrEmpty(candidate.id)) { if (candidate.id == MPBanPlayers.PlayerWithPrivateMatchData.id) { Debug.LogFormat("MPBanPlayers: Match creator entered the lobby: {0}", player_name); isCreator = true; MPBanPlayers.MatchCreatorIsInGame = true; } } // check if player is banned MPBanPlayers.JoiningPlayerIsBanned = MPBanPlayers.IsBanned(candidate); MPBanPlayers.JoiningPlayerIsAnnoyed = MPBanPlayers.IsBanned(candidate, MPBanMode.Annoy); if (isCreator && MPBanPlayers.JoiningPlayerIsAnnoyed) { // annoyed players are treated as Banned for creating new matches MPBanPlayers.JoiningPlayerIsBanned = true; } if (MPBanPlayers.JoiningPlayerIsBanned) { // banned player entered the lobby // NOTE: we cannot just say __accept = false, because this causes all sorts of troubles later MPBanPlayers.KickPlayer(connection_id, player_name, true); if (isCreator) { Debug.LogFormat("Creator for this match {0} is BANNED, ending match", candidate.name); GameManager.m_gm.StartCoroutine(DelayedEndMatch()); } } else { // unbanned player entered the lobby if (isCreator) { bool haveModifiedState = MPBanPlayers.HasModifiedState() || MPChatCommand.HasModifiedState(); bool doReset = true; if (MPChatCommand.CheckPermission(candidate)) { Debug.Log("MPBanPlayers: same game creator as last match, or with permissions"); doReset = false; } MPBanPlayers.MatchCreator = candidate; if (doReset) { Debug.Log("MPBanPlayers: new game creator, resetting bans and permissions"); MPBanPlayers.Reset(); MPChatCommand.Reset(); if (haveModifiedState) { MPChatTools.SendTo(true, "cleared all bans and permissions", connection_id); } } else { if (haveModifiedState) { MPChatTools.SendTo(true, "keeping bans and permissions from previous match", connection_id); } } } } } }
// Execute KICK or BAN or KICKBAN or ANNOY or BLOCKCHAT command public bool DoKickBan(bool doKick, bool doBan, MPBanMode banMode) { string op; string banOp = banMode.ToString().ToUpper(); if (doKick && doBan) { op = "KICK" + banOp; } else if (doKick) { op = "KICK"; } else if (doBan) { op = banOp; } else { return(false); } Debug.LogFormat("{0} request for {1}", op, arg); if (!SelectPlayer(arg)) { Debug.LogFormat("{0}: no player {1} found", op, arg); ReturnToSender(String.Format("{0}: player {1} not found", op, arg)); return(false); } if (IsTrustedPlayer(selectedPlayerEntry)) { ReturnToSender(String.Format("{0}: not on this server, dude!", op)); return(false); } if (selectedPlayerConnectionId >= 0 && sender_conn == selectedPlayerConnectionId) { Debug.LogFormat("{0}: won't self-apply", op, arg); ReturnToSender(String.Format("{0}: won't self-apply", op, arg)); return(false); } if (doBan) { MPBanPlayers.Ban(selectedPlayerEntry, banMode); if (banMode == MPBanMode.Annoy) { // ANNOY also implies BLOCKCHAT MPBanPlayers.Ban(selectedPlayerEntry, MPBanMode.BlockChat); } ReturnTo(String.Format("{0} player {1} by {2}", banOp, selectedPlayerEntry.name, senderEntry.name), -1, selectedPlayerConnectionId); } if (doKick) { ReturnTo(String.Format("KICK player {0} by {1}", selectedPlayerEntry.name, senderEntry.name), -1, selectedPlayerConnectionId); if (selectedPlayer != null) { MPBanPlayers.KickPlayer(selectedPlayer); } else if (selectedPlayerLobbyData != null) { MPBanPlayers.KickPlayer(selectedPlayerLobbyData); } else { MPBanPlayers.KickPlayer(selectedPlayerConnectionId, selectedPlayerEntry.name); } } return(false); }