public static bool PlayerModifiersValid(int mod1, int mod2) { bool flag = true; bool[] serverFilters = new bool[8]; RUtility.BitmaskToBoolArray(MPModPrivateData.ModifierFilterMask, ref serverFilters); for (int i = 0; i < 4; i++) { // Only verify modifier 1 if there's an enabled lobby selection in left column if (serverFilters[i]) { flag &= serverFilters[mod1]; break; } } for (int j = 4; j < 8; j++) { // Only verify modifier 2 if there's an enabled lobby selection in right column if (serverFilters[j]) { flag &= serverFilters[mod2 + 4]; break; } } return(flag); }
static void ReadControlDataFromStream(StreamReader sr) { string text = sr.ReadLine(); // 1 if (!RUtility.StringStartsWith(text, Controls.CONFIG_KEY)) { Debug.Log("olmod controls config save file has an incorrect key: " + text); return; } int numControllers = int.Parse(sr.ReadLine()); int[] controllers = new int[numControllers]; for (int i = 0; i < numControllers; i++) { string controllerName = sr.ReadLine(); int numAxes = int.Parse(sr.ReadLine()); for (int j = 0; j < numAxes; j++) { Controllers.controllers[i].axes[j].deadzone = float.Parse(sr.ReadLine()); Controllers.controllers[i].axes[j].sensitivity = float.Parse(sr.ReadLine()); Controllers.SetAxisDeadzone(i, j, Controllers.controllers[i].axes[j].deadzone); Controllers.SetAxisSensitivity(i, j, Controllers.controllers[i].axes[j].sensitivity); } } }
static void Postfix(PlayerShip __instance) { if (NetworkMatch.InGameplay()) { __instance.gameObject.SetActive(false); RUtility.DestroyGameObjectDelayed(__instance.gameObject, true, 0); } }
//public static bool CanSeePoint(Vector3 pos1, Vector3 pos2) //{ // bool raycast_result; // int layer_mask; // RaycastHit hit; // // Want to check only level. For now, don't assume level layer has been correctly set. // layer_mask = (1 << 0) | (1 << (int)UnityObjectLayers.LEVEL) | (1 << (int)UnityObjectLayers.LAVA) | (1 << (int)UnityObjectLayers.DOOR); // Vector3 td_vec = RUtility.Vec3Normalized(pos2 - pos1); // raycast_result = Physics.Raycast(pos1, td_vec, out hit, (pos2 - pos1).magnitude, layer_mask); // return !raycast_result; //} public static bool CanSeePointSphere(Vector3 pos1, Vector3 pos2, float radius) { bool raycast_result; int layer_mask; RaycastHit hit; // Want to check only level. For now, don't assume level layer has been correctly set. layer_mask = (1 << 0) | (1 << (int)UnityObjectLayers.LEVEL) | (1 << (int)UnityObjectLayers.LAVA) | (1 << (int)UnityObjectLayers.DOOR); Vector3 td_vec = RUtility.Vec3Normalized(pos2 - pos1); raycast_result = Physics.SphereCast(pos1, radius, td_vec, out hit, (pos2 - pos1).magnitude, layer_mask); return(!raycast_result); }
static void Prefix() { bool[] serverFilters = new bool[8]; RUtility.BitmaskToBoolArray(MPModPrivateData.ModifierFilterMask, ref serverFilters); foreach (KeyValuePair <int, LoadoutDataMessage> keyValuePair in NetworkMatch.m_player_loadout_data.Where(x => x.Key > 0)) { if (!serverFilters.Take(4).Any(x => x)) { keyValuePair.Value.m_mp_modifier1 = -1; } if (!serverFilters.Skip(4).Take(4).Any(x => x)) { keyValuePair.Value.m_mp_modifier2 = -1; } } }
public static void PatchModPrivateData(MatchmakerPlayerRequest matchmakerPlayerRequest) { if (!MenuManager.m_mp_lan_match) // LAN includes internet match { return; } MPModPrivateData.MatchMode = MenuManager.mms_mode; MPModPrivateData.RearViewEnabled = RearView.MPMenuManagerEnabled; MPModPrivateData.JIPEnabled = MPJoinInProgress.MenuManagerEnabled || MPJoinInProgress.SingleMatchEnable; MPModPrivateData.TeamCount = MPTeams.MenuManagerTeamCount; MPModPrivateData.LapLimit = ExtMenuManager.mms_ext_lap_limit; MPModPrivateData.MatchNotes = MPServerBrowser.mms_match_notes; MPModPrivateData.SniperPacketsEnabled = true; MPModPrivateData.ScaleRespawnTime = Menus.mms_scale_respawn_time; MPModPrivateData.ModifierFilterMask = RUtility.BoolArrayToBitmask(MPModifiers.mms_modifier_filter); MPModPrivateData.ClassicSpawnsEnabled = Menus.mms_classic_spawns; MPModPrivateData.CtfCarrierBoostEnabled = Menus.mms_ctf_boost; MPModPrivateData.AlwaysCloaked = Menus.mms_always_cloaked; MPModPrivateData.AllowSmash = Menus.mms_allow_smash; MPModPrivateData.MatchTimeLimit = Menus.mms_match_time_limit == 0 ? int.MaxValue : Menus.mms_match_time_limit; MPModPrivateData.AssistScoring = Menus.mms_assist_scoring; if (Menus.mms_mp_projdata_fn == "STOCK") { MPModPrivateData.CustomProjdata = string.Empty; } else { try { MPModPrivateData.CustomProjdata = System.IO.File.ReadAllText(Menus.mms_mp_projdata_fn); } catch (Exception) { Debug.Log("Unable to read custom projdata file: " + Menus.mms_mp_projdata_fn); MPModPrivateData.CustomProjdata = String.Empty; } } var mpd = (PrivateMatchDataMessage)AccessTools.Field(typeof(NetworkMatch), "m_private_data").GetValue(null); MPModPrivateData.HasPassword = mpd.m_password.Contains('_'); matchmakerPlayerRequest.PlayerAttributes["mod_private_data"] = MPModPrivateData.Serialize().ToString(Newtonsoft.Json.Formatting.None); }
public static string GetDisabledModifiers() { string result = String.Empty; List <int> disabled = new List <int>(); bool[] serverFilters = new bool[8]; RUtility.BitmaskToBoolArray(MPModPrivateData.ModifierFilterMask, ref serverFilters); for (int i = 0; i < 8; i++) { if (!serverFilters[i]) { disabled.Add(i); } } result = String.Join(", ", disabled.Select(x => Player.GetMpModifierName(x < 4 ? x : x - 4, x < 4 ? true : false)).ToArray()); return(result); }
public static void PatchModPrivateData(MatchmakerPlayerRequest matchmakerPlayerRequest) { if (!MenuManager.m_mp_lan_match) // LAN includes internet match { return; } MPModPrivateData.MatchMode = MenuManager.mms_mode; MPModPrivateData.RearViewEnabled = RearView.MPMenuManagerEnabled; MPModPrivateData.JIPEnabled = MPJoinInProgress.MenuManagerEnabled || MPJoinInProgress.SingleMatchEnable; MPModPrivateData.TeamCount = MPTeams.MenuManagerTeamCount; MPModPrivateData.LapLimit = ExtMenuManager.mms_ext_lap_limit; MPModPrivateData.MatchNotes = MPServerBrowser.mms_match_notes; MPModPrivateData.SniperPacketsEnabled = true; MPModPrivateData.ScaleRespawnTime = Menus.mms_scale_respawn_time; MPModPrivateData.ModifierFilterMask = RUtility.BoolArrayToBitmask(MPModifiers.mms_modifier_filter); MPModPrivateData.ClassicSpawnsEnabled = Menus.mms_classic_spawns; MPModPrivateData.CtfCarrierBoostEnabled = Menus.mms_ctf_boost; var mpd = (PrivateMatchDataMessage)AccessTools.Field(typeof(NetworkMatch), "m_private_data").GetValue(null); MPModPrivateData.HasPassword = mpd.m_password.Contains('_'); matchmakerPlayerRequest.PlayerAttributes["mod_private_data"] = MPModPrivateData.Serialize().ToString(Newtonsoft.Json.Formatting.None); }
public static string ApplySetting(string key, string value) { string[] keyParts = key.Split('.'); if (keyParts[0] == "proj" && Enum.IsDefined(typeof(ProjPrefab), keyParts[1])) { var obj = ProjectileManager.proj_info[(int)Enum.Parse(typeof(ProjPrefab), keyParts[1])]; var oldValue = obj.GetType().GetField(keyParts[2]).GetValue(obj).ToString(); RUtility.ReadField(obj, keyParts[2], value); return(oldValue); } if (key == "ctf.returntimer" && float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out float valFloat)) { var oldValue = CTF.ReturnTimeAmount.ToStringInvariantCulture(); CTF.ReturnTimeAmount = valFloat; CTF.ShowReturnTimer = true; return(oldValue); } if (key == "item.pickupcheck" && bool.TryParse(value, out bool valBool)) { MPPickupCheck.PickupCheck = valBool; return(Boolean.TrueString); } return(null); }
static void Prefix() { if (!Overload.NetworkManager.IsServer()) { return; } bool[] serverFilters = new bool[8]; RUtility.BitmaskToBoolArray(MPModPrivateData.ModifierFilterMask, ref serverFilters); foreach (var player in NetworkMatch.m_player_loadout_data.Where(x => x.Key > 0)) { if (!MPModifiers.PlayerModifiersValid(player.Value.m_mp_modifier1, player.Value.m_mp_modifier2)) { var conn = NetworkServer.connections[player.Key]; if (conn != null) { NetworkServer.SendToClient(conn.connectionId, 86, new StringMessage("This match has disabled modifiers: " + GetDisabledModifiers())); NetworkMatch.RemoveConnectionId(conn.connectionId); GameManager.m_gm.StartCoroutine(DisconnectCoroutine(conn.connectionId)); } } } }
private static void Prefix() { // Check mode, bail if not Anarchy or Team Anarchy. var mode = NetworkMatch.GetMode(); if (mode != MatchMode.ANARCHY && mode != MatchMode.TEAM_ANARCHY) { return; } // Bail if we have spawn points. if (MPRespawn.spawnPointDistances.Count > 0) { return; } // If enabled, get all of the item spawn points and check to see if they can be reused as player spawn points. if (MPRespawn.EnableItemSpawnsAsPlayerSpawns) { for (int i = 0; i < GameManager.m_level_data.m_item_spawn_points.Length; i++) { // TODO: Figure out how to bail when supers are involved. // if (spawn point is super) { // continue; // } var itemSpawnPoint = GameManager.m_level_data.m_item_spawn_points[i]; float largestDistance = 0f; Quaternion largestQuaternion = Quaternion.identity; for (float angle = 0f; angle < 360f; angle += 15f) { var quaternion = Quaternion.Euler(0, angle, 0); if (Physics.Raycast(itemSpawnPoint.position, quaternion * Vector3.forward, out RaycastHit hitInfo, 9999f)) { var distance = hitInfo.distance; if (distance > largestDistance) { largestDistance = distance; largestQuaternion = quaternion; } } } if (largestDistance > 20f) { MPRespawn.spawnPointsFromItems.Add(new MPRespawn.ItemSpawnPoint(i, largestQuaternion)); } } } // Generate a lookup of the distance between spawn points. var spawnPoints = new List <LevelData.SpawnPoint>(); spawnPoints.AddRange(MPRespawn.spawnPointsFromItems.Select(s => s.spawnPoint)); spawnPoints.AddRange(GameManager.m_level_data.m_player_spawn_points); foreach (var spawn1 in spawnPoints) { var position = spawn1.position; var segnum = GameManager.m_level_data.FindSegmentContainingWorldPosition(position); MPRespawn.spawnPointDistances.Add(spawn1, new Dictionary <LevelData.SpawnPoint, float>()); foreach (var spawn2 in spawnPoints) { if (spawn1 == spawn2) { continue; } var position2 = spawn2.position; var segnum2 = GameManager.m_level_data.FindSegmentContainingWorldPosition(position2); var distance = RUtility.FindVec3Distance(position - position2); MPRespawn.spawnPointDistances[spawn1].Add(spawn2, distance); } } }
public static Dictionary <LevelData.SpawnPoint, float> GetRespawnPointScores(MpTeam team, List <LevelData.SpawnPoint> candidates, bool randomness = false) { var m_player_pos = (List <Vector3>)_NetworkSpawnPoints_m_player_pos_Field.GetValue(null); var m_player_team = (List <MpTeam>)_NetworkSpawnPoints_m_player_team_Field.GetValue(null); m_player_pos.Clear(); m_player_team.Clear(); for (int i = 0; i < NetworkManager.m_Players.Count; i++) { if ((float)NetworkManager.m_Players[i].m_hitpoints > 0f && !NetworkManager.m_Players[i].m_spectator) { m_player_pos.Add(NetworkManager.m_Players[i].c_player_ship.c_transform.position); m_player_team.Add(NetworkManager.m_Players[i].m_mp_team); } } m_player_rot.Clear(); for (int i = 0; i < NetworkManager.m_Players.Count; i++) { if ((float)NetworkManager.m_Players[i].m_hitpoints > 0f && !NetworkManager.m_Players[i].m_spectator) { m_player_rot.Add(NetworkManager.m_Players[i].c_player_ship.c_transform.rotation); } } var distances = new Dictionary <LevelData.SpawnPoint, List <float> >(); var playerPositions = (List <Vector3>)_NetworkSpawnPoints_m_player_pos_Field.GetValue(null); var max = float.MinValue; for (int i = 0; i < candidates.Count; i++) { var dist = new List <float>(); var position = candidates[i].position; for (int j = 0; j < playerPositions.Count; j++) { var distance = RUtility.FindVec3Distance(position - playerPositions[j]); if (distance > max) { max = distance; } dist.Add(distance); } for (int j = 0; j < candidates.Count; j++) { if (i == j) { continue; } var distance = MPRespawn.spawnPointDistances[candidates[i]][candidates[j]]; if (distance > max) { max = distance; } } distances.Add(candidates[i], dist); } var scores = new Dictionary <LevelData.SpawnPoint, float>(); for (int i = 0; i < candidates.Count; i++) { var respawnPointScore = GetRespawnPointScore(team, candidates[i], distances[candidates[i]], max); if (randomness) { respawnPointScore *= UnityEngine.Random.Range(0.95f, 1.05f); } scores.Add(candidates[i], respawnPointScore); } return(scores); }