Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
                }
            }
        }
Beispiel #3
0
 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);
    }
Beispiel #5
0
            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;
                    }
                }
            }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
 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);
 }
Beispiel #10
0
            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));
                        }
                    }
                }
            }
Beispiel #11
0
        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);
                }
            }
        }
Beispiel #12
0
        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);
        }