예제 #1
0
 public static void SetClass(CharacterClassManager player, RoleType role, Vector3 position)
 {
     player.NetworkCurClass = role;
     player.GetComponent <PlayerStats>().health = player.Classes.SafeGet(role).maxHP *(player.GetComponent <HealthChangedComponent>().ActualHealthPercentage / 100);
     player.GetComponent <PlayerStats>().maxHP  = Mathf.RoundToInt(player.Classes.SafeGet(role).maxHP *(player.GetComponent <HealthChangedComponent>().ActualHealthPercentage / 100));
     player.GetComponent <PlyMovementSync>().OverridePosition(position, 0f, false);
 }
예제 #2
0
        public static void OldRefreshPlyModel(this CharacterClassManager ccm, GameObject player, RoleType classId = RoleType.None)
        {
            ReferenceHub hub = ReferenceHub.GetHub(player);

            hub.GetComponent <AnimationController>().OnChangeClass();
            if (ccm.MyModel != null)
            {
                UnityEngine.Object.Destroy(ccm.MyModel);
            }
            Role role = ccm.Classes.SafeGet((classId < RoleType.Scp173) ? ccm.CurClass : classId);

            if (role.team != Team.RIP)
            {
                GameObject gameObject = UnityEngine.Object.Instantiate <GameObject>(role.model_player, ccm.gameObject.transform, true);
                gameObject.transform.localPosition = role.model_offset.position;
                gameObject.transform.localRotation = Quaternion.Euler(role.model_offset.rotation);
                gameObject.transform.localScale    = role.model_offset.scale;
                ccm.MyModel = gameObject;
                AnimationController component = hub.GetComponent <AnimationController>();
                if (ccm.MyModel.GetComponent <Animator>() != null)
                {
                    component.animator = ccm.MyModel.GetComponent <Animator>();
                }
                FootstepSync    component2 = ccm.GetComponent <FootstepSync>();
                FootstepHandler component3 = ccm.MyModel.GetComponent <FootstepHandler>();
                if (component2 != null)
                {
                    component2.FootstepHandler = component3;
                }
                if (component3 != null)
                {
                    component3.FootstepSync        = component2;
                    component3.AnimationController = component;
                }
                if (ccm.isLocalPlayer)
                {
                    if (ccm.MyModel.GetComponent <Renderer>() != null)
                    {
                        ccm.MyModel.GetComponent <Renderer>().enabled = false;
                    }
                    Renderer[] componentsInChildren = ccm.MyModel.GetComponentsInChildren <Renderer>();
                    for (int i = 0; i < componentsInChildren.Length; i++)
                    {
                        componentsInChildren[i].enabled = false;
                    }
                    foreach (Collider collider in ccm.MyModel.GetComponentsInChildren <Collider>())
                    {
                        if (collider.name != "LookingTarget")
                        {
                            collider.enabled = false;
                        }
                    }
                }
            }
            ccm.GetComponent <CapsuleCollider>().enabled = (role.team != Team.RIP);
            if (ccm.MyModel != null)
            {
                ccm.GetComponent <WeaponManager>().hitboxes = ccm.MyModel.GetComponentsInChildren <HitboxIdentity>(true);
            }
        }
예제 #3
0
        public static bool Prefix(CharacterClassManager __instance)
        {
            try
            {
                if (EventPlugin.CheckEscapeEventPatchDisable)
                {
                    return(true);
                }

                if (!__instance._interactRateLimit.CanExecute(true) ||
                    (double)Vector3.Distance(__instance.transform.position,
                                             __instance.GetComponent <Escape>().worldPosition) >= (double)(Escape.radius * 2))
                {
                    return(false);
                }

                bool allow = true;
                Events.InvokeCheckEscape(__instance.gameObject, ref allow);
                return(allow);
            }
            catch (Exception e)
            {
                Log.Error($"CheckEscape Error: {e}");
                return(true);
            }
        }
예제 #4
0
        static bool Prefix(PlayerPositionManager __instance)
        {
            List <PlayerPositionData> posData = new List <PlayerPositionData>();
            List <GameObject>         players = PlayerManager.singleton.players.ToList();
            bool smGhostMode = ConfigFile.GetBool("sm_enable_ghostmode", false);

            foreach (GameObject player in players)
            {
                posData.Add(new PlayerPositionData(player));
            }

            __instance.ReceiveData(posData.ToArray());

            foreach (GameObject gameObject in players)
            {
                CharacterClassManager component = gameObject.GetComponent <CharacterClassManager>();
                int pid1 = gameObject.GetComponent <QueryProcessor>().PlayerId;

                if (smGhostMode && gameObject != __instance.gameObject && component.curClass >= 0)
                {
                    for (int i = 0; i < posData.Count; i++)
                    {
                        if (players[i] == gameObject)
                        {
                            continue;
                        }

                        CharacterClassManager component2 = players[i].GetComponent <CharacterClassManager>();
                        int pid2 = players[i].GetComponent <QueryProcessor>().PlayerId;
                        if (component2.smGhostMode && component2.curClass >= 0 && component2.curClass != 2 && (component.curClass != 2 || (!component2.smVisibleToSpec && component.curClass == 2)) && (!component2.smVisibleWhenTalking || (component2.smVisibleWhenTalking && !component2.GetComponent <Radio>().NetworkisTransmitting)))
                        {
                            posData[i] = new PlayerPositionData
                            {
                                position = Vector3.up * 6000f,
                                rotation = 0f,
                                playerID = posData[i].playerID
                            }
                        }
                        ;

                        if (Methods.CheckHidden(pid1, pid2))
                        {
                            ServerConsole.AddLog("Returned true for " + pid1 + " " + pid2);
                            posData[i] = new PlayerPositionData
                            {
                                position = Vector3.up * 6000f, rotation = 0f, playerID = posData[i].playerID
                            };
                        }
                    }
                }

                switch (component.curClass)
                {
                case 16:
                case 17:
                {
                    List <PlayerPositionData> posData939 = new List <PlayerPositionData>(posData);

                    for (int i = 0; i < posData939.Count; i++)
                    {
                        CharacterClassManager component2 = players[i].GetComponent <CharacterClassManager>();
                        if (posData939[i].position.y < 800f && component2.klasy[component2.curClass].team != Team.SCP && component2.klasy[component2.curClass].team != Team.RIP && !players[i].GetComponent <Scp939_VisionController>().CanSee(component.GetComponent <Scp939PlayerScript>()))
                        {
                            posData939[i] = new PlayerPositionData
                            {
                                position = Vector3.up * 6000f,
                                rotation = 0f,
                                playerID = posData939[i].playerID
                            }
                        }
                        ;
                    }
                    __instance.CallTargetTransmit(gameObject.GetComponent <NetworkIdentity>().connectionToClient, posData939.ToArray());
                    break;
                }

                default:
                    __instance.CallTargetTransmit(gameObject.GetComponent <NetworkIdentity>().connectionToClient, posData.ToArray());
                    break;
                }
            }

            return(false);
        }
예제 #5
0
        private static bool Prefix(CharacterClassManager __instance)
        {
            try
            {
                //Ratelimit Check
                if (!__instance._interactRateLimit.CanExecute())
                {
                    return(false);
                }

                //Position Check
                if (Vector3.Distance(__instance.transform.position, __instance.GetComponent <Escape>().worldPosition) >=
                    Escape.radius * 2)
                {
                    return(false);
                }

                //Event vars
                var player     = __instance.GetPlayer();
                var spawnRole  = player.RoleType;
                var cufferRole = RoleType.None;
                var allow      = true;
                var isCuffed   = false;

                //Cuff Check
                var flag = false;
                if (player.Cuffer != null)
                {
                    cufferRole = player.Cuffer.RoleType;
                    isCuffed   = true;

                    if (ConfigFile.ServerConfig.GetBool("cuffed_escapee_change_team", true))
                    {
                        switch (player.RoleType)
                        {
                        case RoleType.Scientist when(cufferRole == RoleType.ChaosInsurgency || cufferRole == RoleType.ClassD):
                        case RoleType.ClassD when(player.Cuffer.Team == Team.MTF || cufferRole == RoleType.Scientist):
                            flag = true;

                            break;
                        }
                    }
                }

                //TeamCheck
                var singleton = Respawning.RespawnTickets.Singleton;
                switch (player.Team)
                {
                case Team.CDP when flag:
                    spawnRole = RoleType.NtfCadet;
                    break;

                case Team.CDP:
                case Team.RSC when flag:
                    spawnRole = RoleType.ChaosInsurgency;
                    break;

                case Team.RSC:
                    spawnRole = RoleType.NtfScientist;
                    break;
                }

                //PlayerEscapeEvent
                SynapseController.Server.Events.Player.InvokePlayerEscapeEvent(player, ref spawnRole, cufferRole, ref allow, isCuffed);

                if (!allow)
                {
                    return(false);
                }

                if (spawnRole == RoleType.None || spawnRole == player.RoleType)
                {
                    return(false);
                }
                player.ClassManager.SetPlayersClass(spawnRole, player.gameObject, false, true);
                switch (player.Team)
                {
                case Team.MTF:
                    RoundSummary.escaped_scientists++;
                    singleton.GrantTickets(Respawning.SpawnableTeamType.NineTailedFox, ConfigFile.ServerConfig.GetInt("respawn_tickets_mtf_classd_cuffed_count", 1));
                    break;

                case Team.CHI:
                    RoundSummary.escaped_ds++;
                    singleton.GrantTickets(Respawning.SpawnableTeamType.ChaosInsurgency, ConfigFile.ServerConfig.GetInt("respawn_tickets_ci_classd_count", 1));
                    break;
                }

                return(false);
            }
            catch (Exception e)
            {
                SynapseController.Server.Logger.Error($"Synapse-Event: PlayerEscape failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                return(true);
            }
        }
예제 #6
0
        public static bool Prefix(PlayerPositionManager __instance)
        {
            try
            {
                List <GameObject> players = PlayerManager.players;
                __instance.usedData = players.Count;
                if (__instance.receivedData == null || __instance.receivedData.Length < __instance.usedData)
                {
                    __instance.receivedData = new PlayerPositionData[__instance.usedData * 2];
                }
                for (int index = 0; index < __instance.usedData; ++index)
                {
                    __instance.receivedData[index] = new PlayerPositionData(players[index]);
                }
                if (__instance.transmitBuffer == null || __instance.transmitBuffer.Length < __instance.usedData)
                {
                    __instance.transmitBuffer = new PlayerPositionData[__instance.usedData * 2];
                }
                foreach (GameObject gameObject in players)
                {
                    CharacterClassManager component1 = gameObject.GetComponent <CharacterClassManager>();
                    Array.Copy(__instance.receivedData, __instance.transmitBuffer, __instance.usedData);

                    if (component1.CurClass == RoleType.Scp096 || component1.CurClass == RoleType.Scp173)
                    {
                        for (int i = 0; i < __instance.usedData; i++)
                        {
                            ReferenceHub hub = Plugin.GetPlayer(__instance.transmitBuffer[i].playerID.ToString());
                            if (hub.characterClassManager.CurClass != RoleType.Tutorial)
                            {
                                continue;
                            }
                            Scp049PlayerScript script   = hub.GetComponent <Scp049PlayerScript>();
                            Vector3            fwd      = script.plyCam.transform.forward;
                            Vector3            pos      = script.gameObject.transform.position;
                            Vector3            position = component1.gameObject.transform.position;
                            float angle = Vector3.Angle(fwd,
                                                        (pos - position).normalized);
                            Vector3    dir = (pos - position).normalized;
                            Quaternion rot = Quaternion.LookRotation(dir);
                            if (angle <= 80f)
                            {
                                __instance.transmitBuffer[i] = new PlayerPositionData(__instance.transmitBuffer[i].position, Quaternion.Inverse(rot).y, __instance.transmitBuffer[i].playerID, __instance.transmitBuffer[i].uses268);
                            }
                        }
                    }

                    if (component1.CurClass.Is939())
                    {
                        for (int index = 0; index < __instance.usedData; ++index)
                        {
                            if (__instance.transmitBuffer[index].position.y < 800.0)
                            {
                                CharacterClassManager component2 = players[index].GetComponent <CharacterClassManager>();
                                if (component2.Classes.SafeGet(component2.CurClass).team != Team.SCP &&
                                    component2.Classes.SafeGet(component2.CurClass).team != Team.RIP && !players[index]
                                    .GetComponent <Scp939_VisionController>()
                                    .CanSee(component1.GetComponent <Scp939PlayerScript>()))
                                {
                                    __instance.transmitBuffer[index] = new PlayerPositionData(Vector3.up * 6000f, 0.0f,
                                                                                              __instance.transmitBuffer[index].playerID);
                                }
                            }
                        }
                    }
                    else if (component1.CurClass == RoleType.Scp096)
                    {
                        Scp096PlayerScript script = component1.GetComponent <Scp096PlayerScript>();
                        if (script.Networkenraged == Scp096PlayerScript.RageState.Enraged || script.Networkenraged == Scp096PlayerScript.RageState.Panic)
                        {
                            for (int i = 0; i < __instance.usedData; i++)
                            {
                                if (!Plugin.Scp096Targets.Contains(__instance.transmitBuffer[i].playerID))
                                {
                                    __instance.transmitBuffer[i] = new PlayerPositionData(Vector3.up * 6000f, 0f, __instance.transmitBuffer[i].playerID);
                                }
                            }
                        }
                    }
                    else if (component1.CurClass != RoleType.Scp079 && component1.CurClass != RoleType.Spectator)
                    {
                        for (int index = 0; index < __instance.usedData; ++index)
                        {
                            if (__instance.transmitBuffer[index].uses268 || EXILED.EventPlugin.GhostedIds.Contains(__instance.transmitBuffer[index].playerID))
                            {
                                __instance.transmitBuffer[index] = new PlayerPositionData(Vector3.up * 6000f, 0.0f,
                                                                                          __instance.transmitBuffer[index].playerID);
                            }
                        }
                    }

                    NetworkConnection networkConnection = component1.netIdentity.isLocalPlayer
                                                ? NetworkServer.localConnection
                                                : component1.netIdentity.connectionToClient;
                    if (__instance.usedData <= 20)
                    {
                        networkConnection.Send(
                            new PlayerPositionManager.PositionMessage(__instance.transmitBuffer,
                                                                      (byte)__instance.usedData, 0), 1);
                    }
                    else
                    {
                        byte part;
                        for (part = (byte)0; (int)part < __instance.usedData / 20; ++part)
                        {
                            networkConnection.Send(
                                new PlayerPositionManager.PositionMessage(__instance.transmitBuffer, 20, part),
                                1);
                        }
                        byte count = (byte)(__instance.usedData % (part * 20));
                        if (count > 0)
                        {
                            networkConnection.Send(
                                new PlayerPositionManager.PositionMessage(__instance.transmitBuffer, count, part), 1);
                        }
                    }
                }

                return(false);
            }
            catch (Exception e)
            {
                Plugin.Info($"TransmitData Error. {e}");
                return(true);
            }
        }
예제 #7
0
        public static bool Prefix(CharacterClassManager __instance, bool lite = false, bool escape = false)
        {
            if (EventPlugin.PlayerSpawnEventPatchDisable)
            {
                return(true);
            }

            try
            {
                Role role = __instance.Classes.SafeGet(__instance.CurClass);
                if (!__instance._wasAnytimeAlive && __instance.CurClass != RoleType.Spectator && __instance.CurClass != RoleType.None)
                {
                    __instance._wasAnytimeAlive = true;
                }
                __instance.InitSCPs();
                __instance.AliveTime = 0f;
                switch (role.team)
                {
                case Team.MTF:
                    AchievementManager.Achieve("arescue");
                    break;

                case Team.CHI:
                    AchievementManager.Achieve("chaos");
                    break;

                case Team.RSC:
                case Team.CDP:
                    __instance.EscapeStartTime = (int)Time.realtimeSinceStartup;
                    break;
                }
                __instance.GetComponent <Inventory>();
                try
                {
                    __instance.GetComponent <FootstepSync>().SetLoudness(role.team, role.roleId.Is939());
                }
                catch
                {
                }
                if (NetworkServer.active)
                {
                    Handcuffs component = __instance.GetComponent <Handcuffs>();
                    component.ClearTarget();
                    component.NetworkCufferId = -1;
                }
                if (role.team != Team.RIP)
                {
                    if (NetworkServer.active && !lite)
                    {
                        Vector3 constantRespawnPoint = NonFacilityCompatibility.currentSceneSettings.constantRespawnPoint;
                        if (constantRespawnPoint != Vector3.zero)
                        {
                            __instance._pms.OnPlayerClassChange(constantRespawnPoint, 0f);
                        }
                        else
                        {
                            GameObject randomPosition = CharacterClassManager.SpawnpointManager.GetRandomPosition(__instance.CurClass);
                            Vector3    spawnPoint     = new Vector3(0f, 0f, 0f);
                            float      rotY           = 0f;
                            if (randomPosition != null)
                            {
                                spawnPoint = randomPosition.transform.position;
                                rotY       = randomPosition.transform.rotation.eulerAngles.y;
                                AmmoBox component2 = __instance.GetComponent <AmmoBox>();
                                if (escape && __instance.KeepItemsAfterEscaping)
                                {
                                    Inventory component3 = PlayerManager.localPlayer.GetComponent <Inventory>();
                                    for (ushort num = 0; num < 3; num += 1)
                                    {
                                        if (component2.GetAmmo(num) >= 15)
                                        {
                                            component3.SetPickup(component2.types[num].inventoryID, component2.GetAmmo(num), randomPosition.transform.position, randomPosition.transform.rotation, 0, 0, 0);
                                        }
                                    }
                                }
                                component2.SetAmmoAmount();
                            }
                            else
                            {
                                spawnPoint = __instance.DeathPosition;
                                rotY       = 0f;
                            }
                            Events.InvokePlayerSpawn(__instance, __instance.CurClass, ref spawnPoint, ref rotY);
                            __instance._pms.OnPlayerClassChange(spawnPoint, rotY);
                        }
                        if (!__instance.SpawnProtected && __instance.EnableSP && __instance.SProtectedTeam.Contains((int)role.team))
                        {
                            __instance.GodMode        = true;
                            __instance.SpawnProtected = true;
                            __instance.ProtectedTime  = Time.time;
                        }
                    }
                    if (!__instance.isLocalPlayer)
                    {
                        __instance.GetComponent <PlayerStats>().maxHP = role.maxHP;
                    }
                }
                __instance.Scp049.iAm049    = (__instance.CurClass == RoleType.Scp049);
                __instance.Scp0492.iAm049_2 = (__instance.CurClass == RoleType.Scp0492);
                __instance.Scp096.iAm096    = (__instance.CurClass == RoleType.Scp096);
                __instance.Scp106.iAm106    = (__instance.CurClass == RoleType.Scp106);
                __instance.Scp173.iAm173    = (__instance.CurClass == RoleType.Scp173);
                __instance.Scp939.iAm939    = __instance.CurClass.Is939();
                __instance.RefreshPlyModel();

                return(false);
            }
            catch (Exception exception)
            {
                Log.Error($"PlayerSpawnEvent error: {exception}");
                return(true);
            }
        }
예제 #8
0
        public static bool Prefix(PlayerPositionManager __instance)
        {
            if (EventPlugin.GhostmodePatchDisable)
            {
                return(true);
            }

            try
            {
                List <GameObject> players = PlayerManager.players;
                __instance.usedData = players.Count;
                if (__instance.receivedData == null || __instance.receivedData.Length < __instance.usedData)
                {
                    __instance.receivedData = new PlayerPositionData[__instance.usedData * 2];
                }
                for (int index = 0; index < __instance.usedData; ++index)
                {
                    __instance.receivedData[index] = new PlayerPositionData(players[index]);
                }
                if (__instance.transmitBuffer == null || __instance.transmitBuffer.Length < __instance.usedData)
                {
                    __instance.transmitBuffer = new PlayerPositionData[__instance.usedData * 2];
                }

                foreach (GameObject gameObject in players)
                {
                    CharacterClassManager component1 = gameObject.GetComponent <CharacterClassManager>();
                    Array.Copy(__instance.receivedData, __instance.transmitBuffer, __instance.usedData);

                    if (component1.CurClass == RoleType.Scp096 || component1.CurClass == RoleType.Scp173)
                    {
                        for (int i = 0; i < __instance.usedData; i++)
                        {
                            ReferenceHub hub = Player.GetPlayer(__instance.transmitBuffer[i].playerID);
                            if (hub.characterClassManager.CurClass != RoleType.Tutorial)
                            {
                                continue;
                            }
                            Scp049PlayerScript script   = hub.GetComponent <Scp049PlayerScript>();
                            Vector3            fwd      = script.plyCam.transform.forward;
                            Vector3            pos      = script.gameObject.transform.position;
                            Vector3            position = component1.gameObject.transform.position;
                            float      angle            = Vector3.Angle(fwd, (pos - position).normalized);
                            Vector3    dir = (pos - position).normalized;
                            Quaternion rot = Quaternion.LookRotation(dir);

                            if (angle >= 100f)
                            {
                                float newAngle = Vector3.Angle(new Vector3(fwd.x, fwd.y + 180f, fwd.z),
                                                               (pos - position).normalized);
                                if (component1.CurClass == RoleType.Scp096 && EventPlugin.Scp096Fix || component1.CurClass == RoleType.Scp173 && EventPlugin.Scp173Fix)
                                {
                                    __instance.transmitBuffer[i] = new PlayerPositionData(__instance.transmitBuffer[i].position, newAngle, __instance.transmitBuffer[i].playerID);
                                }
                            }
                        }
                    }

                    if (component1.CurClass.Is939())
                    {
                        for (int index = 0; index < __instance.usedData; ++index)
                        {
                            if (__instance.transmitBuffer[index].position.y < 800.0)
                            {
                                CharacterClassManager component2 = players[index].GetComponent <CharacterClassManager>();
                                if (component2.Classes.SafeGet(component2.CurClass).team != Team.SCP &&
                                    component2.Classes.SafeGet(component2.CurClass).team != Team.RIP && !players[index]
                                    .GetComponent <Scp939_VisionController>()
                                    .CanSee(component1.GetComponent <Scp939PlayerScript>()))
                                {
                                    __instance.transmitBuffer[index] = new PlayerPositionData(Vector3.up * 6000f, 0.0f,
                                                                                              __instance.transmitBuffer[index].playerID);
                                }
                            }
                        }
                    }
                    else if (component1.CurClass != RoleType.Scp079 && component1.CurClass != RoleType.Spectator)
                    {
                        for (int index = 0; index < __instance.usedData; ++index)
                        {
                            if (__instance.transmitBuffer[index].uses268 || EventPlugin.GhostedIds.Contains(__instance.transmitBuffer[index].playerID))
                            {
                                __instance.transmitBuffer[index] = new PlayerPositionData(Vector3.up * 6000f, 0.0f,
                                                                                          __instance.transmitBuffer[index].playerID);
                            }
                        }
                    }

                    if (EventPlugin.TargetGhost.ContainsKey(gameObject.GetPlayer()))
                    {
                        for (int i = 0; i < __instance.usedData; i++)
                        {
                            if (EventPlugin.TargetGhost[gameObject.GetPlayer()]
                                .Contains(__instance.transmitBuffer[i].playerID))
                            {
                                __instance.transmitBuffer[i] = new PlayerPositionData(Vector3.up * 6000f, 0.0f, __instance.transmitBuffer[i].playerID);
                            }
                        }
                    }

                    NetworkConnection networkConnection = component1.netIdentity.isLocalPlayer
                                                ? NetworkServer.localConnection
                                                : component1.netIdentity.connectionToClient;
                    if (__instance.usedData <= 20)
                    {
                        networkConnection.Send(
                            new PlayerPositionManager.PositionMessage(__instance.transmitBuffer,
                                                                      (byte)__instance.usedData, 0), 1);
                    }
                    else
                    {
                        byte part;
                        for (part = 0; part < __instance.usedData / 20; ++part)
                        {
                            networkConnection.Send(
                                new PlayerPositionManager.PositionMessage(__instance.transmitBuffer, 20, part),
                                1);
                        }
                        byte count = (byte)(__instance.usedData % (part * 20));
                        if (count > 0)
                        {
                            networkConnection.Send(
                                new PlayerPositionManager.PositionMessage(__instance.transmitBuffer, count, part), 1);
                        }
                    }
                }

                return(false);
            }
            catch (Exception exception)
            {
                Log.Error($"GhostmodePatch error: {exception}");
                return(true);
            }
        }
예제 #9
0
        public static bool Prefix(CharacterClassManager __instance)
        {
            try
            {
                //RateLimit Check
                if (!__instance._interactRateLimit.CanExecute())
                {
                    return(false);
                }

                //Position Check
                if (Vector3.Distance(__instance.transform.position, __instance.GetComponent <Escape>().worldPosition) >=
                    Escape.radius * 2)
                {
                    return(false);
                }

                //Event vars
                var player     = __instance.GetPlayer();
                var spawnRole  = player.Role;
                var cufferRole = RoleType.None;
                var allow      = true;
                var isCuffed   = false;

                //Cuff Check
                var flag      = false;
                var component = __instance.GetComponent <Handcuffs>();
                if (component.CufferId >= 0)
                {
                    var component2 = component.GetCuffer(component.CufferId).GetComponent <CharacterClassManager>();

                    cufferRole = component2.NetworkCurClass;
                    isCuffed   = true;

                    if (ConfigFile.ServerConfig.GetBool("cuffed_escapee_change_team", true))
                    {
                        switch (__instance.CurClass)
                        {
                        case RoleType.Scientist when(component2.CurClass == RoleType.ChaosInsurgency || component2.CurClass == RoleType.ClassD):
                        case RoleType.ClassD when(component2.CurRole.team == Team.MTF || component2.CurClass == RoleType.Scientist):
                            flag = true;

                            break;
                        }
                    }
                }

                //TeamCheck
                var singleton = Respawning.RespawnTickets.Singleton;
                var team      = __instance.CurRole.team;
                switch (team)
                {
                case Team.CDP when flag:
                    spawnRole = RoleType.NtfCadet;
                    break;

                case Team.CDP:
                case Team.RSC when flag:
                    spawnRole = RoleType.ChaosInsurgency;
                    break;

                case Team.RSC:
                    spawnRole = RoleType.NtfScientist;
                    break;
                }

                //PlayerEscapeEvent
                Events.InvokePlayerEscapeEvent(player, ref allow, ref spawnRole, cufferRole, isCuffed);

                if (!allow)
                {
                    return(false);
                }

                if (spawnRole == RoleType.None || spawnRole == __instance.NetworkCurClass)
                {
                    return(false);
                }
                __instance.SetPlayersClass(spawnRole, __instance.gameObject, false, true);
                switch (__instance.CurRole.team)
                {
                case Team.MTF:
                    RoundSummary.escaped_scientists++;
                    singleton.GrantTickets(Respawning.SpawnableTeamType.NineTailedFox, ConfigFile.ServerConfig.GetInt("respawn_tickets_mtf_classd_cuffed_count", 1));
                    break;

                case Team.CHI:
                    RoundSummary.escaped_ds++;
                    singleton.GrantTickets(Respawning.SpawnableTeamType.ChaosInsurgency, ConfigFile.ServerConfig.GetInt("respawn_tickets_ci_classd_count", 1));
                    break;
                }

                return(false);
            }
            catch (Exception e)
            {
                Log.Error($"PlayerEscapeEvent Error: {e}");
                return(true);
            }
        }
예제 #10
0
        public static void UpgradePlayer(Scp914Machine instance, CharacterClassManager player, IEnumerable <CharacterClassManager> players)
        {
            var c = PluginConfig.Cfg;

            if (!c.RoughCoarseDamageSCP && player.IsScpButNotZombie())
            {
                TeleportPlayer(instance, player);
                return;
            }

            if (CheckPercent(c.InvUpgradeChance) && !player.IsAnyScp())
            {
                Inventory inv = player.GetComponent <Inventory>();
                if (inv.items.Count > 0)
                {
                    var index    = inv.items.Count > 1 ? Random.Range(0, inv.items.Count - 1) : 0;
                    var itemInfo = inv.items[index];
                    var item     = GetItem(instance.knobState, itemInfo.id);
                    if (item < 0)
                    {
                        inv.items.RemoveAt(index);
                    }
                    else
                    {
                        itemInfo.id      = item;
                        inv.items[index] = itemInfo;
                        Scp914Machine.TryFriendshipAchievement(item, player, players);
                    }
                }
            }

            if (c.ChangePlayerHealth)
            {
                if (!player.GodMode && player.CurClass != RoleType.Spectator)
                {
                    HealthChangedComponent component = player.GetComponent <HealthChangedComponent>();
                    var stats = player.GetComponent <PlayerStats>();
                    if (component == null)
                    {
                        component = player.gameObject.AddComponent <HealthChangedComponent>();
                        component.OriginalHealthAmmount  = stats.maxHP;
                        component.ActualHealthPercentage = 100;
                    }
                    var newPercent = component.ActualHealthPercentage;

                    if (instance.knobState == Scp914Knob.Rough)
                    {
                        if (CheckPercent(c.RoughDamageChance) || (CheckPercent(c.RoughDamageChance * c.SCPDamageChanceMultiplier) && player.IsScpButNotZombie()))
                        {
                            if (player.IsScpButNotZombie())
                            {
                                HurtPlayer(stats.maxHP * ((c.RoughDamageAmmout / 2) / 100), stats, player);
                            }
                            else
                            {
                                newPercent -= c.RoughDamageAmmout;
                            }
                        }
                    }
                    else if (instance.knobState == Scp914Knob.Coarse)
                    {
                        if (CheckPercent(c.CoarseDamageChance) || (CheckPercent(c.CoarseDamageChance * c.SCPDamageChanceMultiplier) && player.IsScpButNotZombie()))
                        {
                            if (player.IsScpButNotZombie())
                            {
                                HurtPlayer(stats.maxHP * ((c.CoarseDamageAmmout / 2) / 100), stats, player);
                            }
                            else
                            {
                                newPercent -= c.CoarseDamageAmmout;
                            }
                        }
                    }
                    else if (instance.knobState == Scp914Knob.Fine && !player.IsScpButNotZombie())
                    {
                        if (CheckPercent(c.FineHealChance))
                        {
                            newPercent += c.FineHealAmmout;
                        }
                    }
                    else if (instance.knobState == Scp914Knob.VeryFine && !player.IsScpButNotZombie())
                    {
                        if (CheckPercent(c.VeryFineHealChance))
                        {
                            newPercent += c.VeryFineHealAmmout;
                        }
                    }
                    newPercent = Constrain(newPercent, 100 - c.RoughDamageAmmout, 100 + c.VeryFineHealAmmout);
                    Log.Info("newPercent: " + newPercent + "%");
                    if (newPercent <= 0)
                    {
                        HurtPlayer(stats.maxHP + 1f, stats, player);
                        if (stats.health > 0)
                        {
                            newPercent = 5f;
                        }
                        else
                        {
                            Object.Destroy(component);
                        }
                    }
                    if (newPercent >= 100)
                    {
                        var prev = stats.maxHP;
                        stats.maxHP = Mathf.RoundToInt(component.OriginalHealthAmmount * (newPercent / 100));
                        if (prev > stats.maxHP)
                        {
                            stats.health = stats.maxHP < stats.health ? stats.maxHP : stats.health;
                        }
                        else if (!player.IsScpButNotZombie())
                        {
                            stats.HealHPAmount(999999f);
                        }
                    }
                    component.ActualHealthPercentage = newPercent;
                    Log.Info(component.ActualHealthPercentage + "% " + stats.maxHP + "HP " + stats.health + "health");
                }
            }
            TeleportPlayer(instance, player);
        }
예제 #11
0
        private static bool Prefix(CharacterClassManager __instance)
        {
            var ev = new ExtendedEscapingEventArgs(Player.Get(__instance._hub));

            EventHandlers.OnEscaping(ev); // i can do that now, neato
            Exiled.Events.Handlers.Player.OnEscaping(ev);

            if (!ev.IsAllowed)
            {
                return(false);
            }

            var cuffed = false;

            foreach (DisarmedPlayers.DisarmedEntry entry in DisarmedPlayers.Entries.Where(entry =>
                                                                                          entry.DisarmedPlayer == __instance._hub.networkIdentity.netId))
            {
                if (entry.Disarmer == 0U)
                {
                    cuffed = CharacterClassManager.ForceCuffedChangeTeam;
                    break;
                }

                if (ReferenceHub.TryGetHubNetID(entry.Disarmer, out ReferenceHub hub))
                {
                    CharacterClassManager characterClassManager = hub.characterClassManager;
                    if (__instance.Faction == Faction.FoundationStaff &&
                        characterClassManager.Faction == Faction.FoundationEnemy ||
                        __instance.Faction == Faction.FoundationEnemy &&
                        characterClassManager.Faction == Faction.FoundationStaff)
                    {
                        cuffed = true;
                    }
                }
                else
                {
                    break;
                }
            }

            RespawnTickets singleton = RespawnTickets.Singleton;

            switch (__instance.CurRole.team)
            {
            case Team.RSC:
                if (cuffed)
                {
                    ++RoundSummary.EscapedClassD;
                    singleton.GrantTickets(SpawnableTeamType.ChaosInsurgency,
                                           ConfigFile.ServerConfig.GetInt("respawn_tickets_ci_scientist_cuffed_count", 2));
                    __instance.GetComponent <Escape>().TargetShowEscapeMessage(__instance.connectionToClient, isClassD: false, changeTeam: true);
                    break;
                }

                ++RoundSummary.EscapedScientists;
                singleton.GrantTickets(SpawnableTeamType.NineTailedFox,
                                       ConfigFile.ServerConfig.GetInt("respawn_tickets_mtf_scientist_count", 1));
                __instance.GetComponent <Escape>().TargetShowEscapeMessage(__instance.connectionToClient, isClassD: false, changeTeam: false);
                break;

            case Team.CDP:
                if (cuffed)
                {
                    ++RoundSummary.EscapedScientists;
                    singleton.GrantTickets(SpawnableTeamType.NineTailedFox,
                                           ConfigFile.ServerConfig.GetInt("respawn_tickets_mtf_classd_cuffed_count", 1));
                    __instance.GetComponent <Escape>().TargetShowEscapeMessage(__instance.connectionToClient, isClassD: true, changeTeam: true);

                    break;
                }

                ++RoundSummary.EscapedClassD;
                singleton.GrantTickets(SpawnableTeamType.ChaosInsurgency,
                                       ConfigFile.ServerConfig.GetInt("respawn_tickets_ci_classd_count", 1));
                __instance.GetComponent <Escape>().TargetShowEscapeMessage(__instance.connectionToClient, isClassD: true, changeTeam: false);
                break;
            }

            if (ev.ClearInventory)
            {
                ev.Player.ClearInventory();
            }
            ev.Player.SetRole(ev.NewRole, SpawnReason.Escaped);

            return(false);
        }
예제 #12
0
    private void CuffPlayer()
    {
        Ray        ray = new Ray(this.plyCam.position, this.plyCam.forward);
        RaycastHit raycastHit;

        if (Physics.Raycast(ray, out raycastHit, this.maxDistance, this.mask))
        {
            CharacterClassManager componentInParent = raycastHit.collider.GetComponentInParent <CharacterClassManager>();
            if (componentInParent != null)
            {
                Class @class = this.ccm.klasy[componentInParent.curClass];
                if (@class.team != Team.SCP && (@class.team == Team.CDP || @class.team == Team.CHI) != (this.ccm.klasy[this.ccm.curClass].team == Team.CDP || this.ccm.klasy[this.ccm.curClass].team == Team.CHI) && componentInParent.GetComponent <AnimationController>().curAnim == 0 && componentInParent.GetComponent <AnimationController>().speed == Vector2.zero)
                {
                    this.CallCmdTarget(componentInParent.gameObject);
                }
            }
        }
    }
예제 #13
0
        void ILabModUpdate.Event()
        {
            if (!dodgeball)
            {
                return;
            }
            PlayerManager.localPlayer.GetComponent <CharacterClassManager>().LaterJoinEnabled = false;
            if (!RoundSummary.RoundLock)
            {
                return;
            }
            timer  -= Time.deltaTime;
            timer2 += Time.deltaTime;
            if (timer > 0f)
            {
                return;
            }
            if (timer2 >= 60f)
            {
                foreach (var plr in PlayerManager.players)
                {
                    NineTailedFoxAnnouncer.singleton.ServerOnlyAddGlitchyPhrase(".g7 .g7", 0.5f, 0.5f);
                    plr.GetComponent <Broadcast>().RpcAddElement("You all failed! Pathetic...", 100, false);
                }
                RoundSummary.RoundLock = false;
            }

            if (timer2 >= 45f && !hasGun)
            {
                foreach (var plr in PlayerManager.players)
                {
                    plr.GetComponent <Broadcast>().RpcAddElement("GUNS!!!", 3, false);
                    plr.GetComponent <Inventory>().AddNewItem(ItemType.GunUSP);
                    plr.GetComponent <Inventory>().AddNewItem(ItemType.Ammo9mm);
                    plr.GetComponent <Inventory>().AddNewItem(ItemType.Ammo9mm);
                }
                hasGun = true;
            }
            timer = 0.5f;
            int dc_c = 0;
            CharacterClassManager win = null;

            foreach (var plr in PlayerManager.players)
            {
                if (plr.GetComponent <CharacterClassManager>().NetworkCurClass == RoleType.ClassD)
                {
                    dc_c++;
                    win = plr.GetComponent <CharacterClassManager>();
                }
            }
            if (dc_c == 0)
            {
                foreach (var plr in PlayerManager.players)
                {
                    NineTailedFoxAnnouncer.singleton.ServerOnlyAddGlitchyPhrase(".g7 .g7", 0.5f, 0.5f);
                    plr.GetComponent <Broadcast>().RpcAddElement("You all died! Pathetic...", 100, false);
                }
                RoundSummary.RoundLock = false;
            }
            if (dc_c == 1 && win != null)
            {
                foreach (var plr in PlayerManager.players)
                {
                    plr.GetComponent <Broadcast>().RpcAddElement(win.GetComponent <NicknameSync>().Network_myNickSync + " won!", 100, false);
                }
                RoundSummary.RoundLock = false;
            }
        }
예제 #14
0
        private static bool Prefix(CharacterClassManager __instance, bool lite = false, bool escape = false)
        {
            Role role = __instance.Classes.SafeGet(__instance.CurClass);

            if (!__instance._wasAnytimeAlive && __instance.CurClass != RoleType.Spectator && __instance.CurClass != RoleType.None)
            {
                __instance._wasAnytimeAlive = true;
            }

            __instance.InitSCPs();
            __instance.AliveTime = 0f;
            switch (role.team)
            {
            case Team.MTF:
                AchievementManager.Achieve("arescue");
                break;

            case Team.CHI:
                AchievementManager.Achieve("chaos");
                break;

            case Team.RSC:
            case Team.CDP:
                __instance.EscapeStartTime = (int)Time.realtimeSinceStartup;
                break;
            }

            __instance.GetComponent <Inventory>();
            try
            {
                __instance.GetComponent <FootstepSync>().SetLoudness(role.team, role.roleId.Is939());
            }
            catch
            {
            }

            if (NetworkServer.active)
            {
                Handcuffs component = __instance.GetComponent <Handcuffs>();
                component.ClearTarget();
                component.NetworkCufferId = -1;
            }

            if (role.team != Team.RIP)
            {
                if (NetworkServer.active && !lite)
                {
                    Vector3 constantRespawnPoint = NonFacilityCompatibility.currentSceneSettings.constantRespawnPoint;
                    if (constantRespawnPoint != Vector3.zero)
                    {
                        __instance._pms.OnPlayerClassChange(constantRespawnPoint, 0f);
                    }
                    else
                    {
                        GameObject randomPosition = CharacterClassManager._spawnpointManager.GetRandomPosition(__instance.CurClass);
                        Vector3    spawnPoint;
                        float      rotY;

                        if (randomPosition != null)
                        {
                            spawnPoint = randomPosition.transform.position;
                            rotY       = randomPosition.transform.rotation.eulerAngles.y;
                            AmmoBox component1 = __instance.GetComponent <AmmoBox>();
                            if (escape && __instance.KeepItemsAfterEscaping)
                            {
                                Inventory component2 = PlayerManager.localPlayer.GetComponent <Inventory>();
                                for (ushort index = 0; index < 3; ++index)
                                {
                                    if (component1[index] >= 15U)
                                    {
                                        component2.SetPickup(component1.types[index].inventoryID, component1[index], randomPosition.transform.position, randomPosition.transform.rotation, 0, 0, 0);
                                    }
                                }
                            }

                            component1.ResetAmmo();
                        }
                        else
                        {
                            spawnPoint = __instance.DeathPosition;
                            rotY       = 0f;
                        }

                        var ev = new SpawningEventArgs(API.Features.Player.Get(__instance.gameObject), __instance.CurClass, spawnPoint, rotY);

                        Player.OnSpawning(ev);

                        __instance._pms.OnPlayerClassChange(ev.Position, ev.RotationY);
                    }

                    if (!__instance.SpawnProtected && __instance.EnableSP && __instance.SProtectedTeam.Contains((int)role.team))
                    {
                        __instance.GodMode        = true;
                        __instance.SpawnProtected = true;
                        __instance.ProtectedTime  = Time.time;
                    }
                }

                if (!__instance.isLocalPlayer)
                {
                    __instance.GetComponent <PlayerStats>().maxHP = role.maxHP;
                }
            }

            __instance.Scp0492.iAm049_2 = __instance.CurClass == RoleType.Scp0492;
            __instance.Scp106.iAm106    = __instance.CurClass == RoleType.Scp106;
            __instance.Scp173.iAm173    = __instance.CurClass == RoleType.Scp173;
            __instance.Scp939.iAm939    = __instance.CurClass.Is939();
            __instance.RefreshPlyModel();

            return(false);
        }
예제 #15
0
        public static void TeleportPlayer(Scp914Machine instance, CharacterClassManager player)
        {
            Vector3 b = instance.output.position - instance.intake.position;

            player.GetComponent <PlyMovementSync>().OverridePosition(player.transform.position + b, 0f, false);
        }
예제 #16
0
        public static bool Prefix(CharacterClassManager __instance)
        {
            if (!PluginConfig.Cfg.Enabled)
            {
                return(true);
            }

            if (!__instance._interactRateLimit.CanExecute(true))
            {
                return(false);
            }
            if (Vector3.Distance(__instance.transform.position, __instance.GetComponent <Escape>().worldPosition) >= (float)(Escape.radius * 2))
            {
                return(false);
            }

            bool      flag      = false;
            Handcuffs component = __instance.GetComponent <Handcuffs>();

            if (component.CufferId >= 0 && ConfigFile.ServerConfig.GetBool("cuffed_escapee_change_team", true))
            {
                CharacterClassManager component2 = component.GetCuffer(component.CufferId).GetComponent <CharacterClassManager>();
                if (__instance.CurClass == RoleType.Scientist && (component2.CurClass == RoleType.ChaosInsurgency || component2.CurClass == RoleType.ClassD))
                {
                    flag = true;
                }
                if (__instance.CurClass == RoleType.ClassD && (component2.Classes.SafeGet(component2.CurClass).team == Team.MTF || component2.CurClass == RoleType.Scientist))
                {
                    flag = true;
                }
            }
            Team team = __instance.Classes.SafeGet(__instance.CurClass).team;

            if (team == Team.CDP)
            {
                if (flag)
                {
                    __instance.SetPlayersClass(RoleType.NtfCadet, __instance.gameObject, false, true);
                    RoundSummary.escaped_scientists++;
                    __instance.GetComponent <PlayerStats>().health = __instance.Classes.SafeGet(RoleType.NtfCadet).maxHP *((__instance.GetComponent <HealthChangedComponent>()?.ActualHealthPercentage ?? 100) / 100);
                    __instance.GetComponent <PlayerStats>().maxHP  = Mathf.RoundToInt(__instance.Classes.SafeGet(RoleType.NtfCadet).maxHP *((__instance.GetComponent <HealthChangedComponent>()?.ActualHealthPercentage ?? 100) / 100));
                    return(false);
                }
                __instance.SetPlayersClass(RoleType.ChaosInsurgency, __instance.gameObject, false, true);
                RoundSummary.escaped_ds++;
                __instance.GetComponent <PlayerStats>().health = __instance.Classes.SafeGet(RoleType.ChaosInsurgency).maxHP *((__instance.GetComponent <HealthChangedComponent>()?.ActualHealthPercentage ?? 100) / 100);
                __instance.GetComponent <PlayerStats>().maxHP  = Mathf.RoundToInt(__instance.Classes.SafeGet(RoleType.ChaosInsurgency).maxHP *((__instance.GetComponent <HealthChangedComponent>()?.ActualHealthPercentage ?? 100) / 100));
                return(false);
            }
            else if (team == Team.RSC)
            {
                if (flag)
                {
                    __instance.SetPlayersClass(RoleType.ChaosInsurgency, __instance.gameObject, false, true);
                    RoundSummary.escaped_ds++;
                    __instance.GetComponent <PlayerStats>().health = __instance.Classes.SafeGet(RoleType.ChaosInsurgency).maxHP *((__instance.GetComponent <HealthChangedComponent>()?.ActualHealthPercentage ?? 100) / 100);
                    __instance.GetComponent <PlayerStats>().maxHP  = Mathf.RoundToInt(__instance.Classes.SafeGet(RoleType.ChaosInsurgency).maxHP *((__instance.GetComponent <HealthChangedComponent>()?.ActualHealthPercentage ?? 100) / 100));
                    return(false);
                }
                __instance.SetPlayersClass(RoleType.NtfScientist, __instance.gameObject, false, true);
                RoundSummary.escaped_scientists++;
                __instance.GetComponent <PlayerStats>().health = __instance.Classes.SafeGet(RoleType.NtfScientist).maxHP *((__instance.GetComponent <HealthChangedComponent>()?.ActualHealthPercentage ?? 100) / 100);
                __instance.GetComponent <PlayerStats>().maxHP  = Mathf.RoundToInt(__instance.Classes.SafeGet(RoleType.NtfScientist).maxHP *((__instance.GetComponent <HealthChangedComponent>()?.ActualHealthPercentage ?? 100) / 100));
                return(false);
            }
            return(false);
        }
예제 #17
0
        internal static void HandleHook(PlayerPositionManager __instance)
        {
            List <PlayerPositionData> normalData = new List <PlayerPositionData>();
            List <GameObject>         players    = ((IEnumerable <GameObject>)PlayerManager.singleton.players).ToList <GameObject>();

            foreach (GameObject _player in players)
            {
                normalData.Add(new PlayerPositionData(_player));
            }
            __instance.ReceiveData(normalData.ToArray());
            foreach (GameObject gameObject in players)
            {
                CharacterClassManager component1 = gameObject.GetComponent <CharacterClassManager>();
                if (component1.curClass >= 0 && (component1.curClass == (int)Role.SCP_939_53 || component1.curClass == (int)Role.SCP_939_89))
                {
                    List <PlayerPositionData> modifiedData2 = new List <PlayerPositionData>((IEnumerable <PlayerPositionData>)normalData);
                    for (int index = 0; index < modifiedData2.Count; ++index)
                    {
                        CharacterClassManager component2 = players[index].GetComponent <CharacterClassManager>();
                        if ((double)modifiedData2[index].position.y < 800.0 && component2.curClass >= 0 && component2.klasy[component2.curClass].team != Team.SCP && (component2.klasy[component2.curClass].team != Team.RIP && !players[index].GetComponent <Scp939_VisionController>().CanSee(component1.GetComponent <Scp939PlayerScript>())))
                        {
                            modifiedData2[index] = new PlayerPositionData()
                            {
                                position = Vector3.up * 6000f,
                                rotation = 0.0f,
                                playerID = modifiedData2[index].playerID
                            };
                        }
                    }
                    __instance.CallTargetTransmit(gameObject.GetComponent <NetworkIdentity>().connectionToClient, modifiedData2.ToArray());
                }
                else
                {
                    __instance.CallTargetTransmit(gameObject.GetComponent <NetworkIdentity>().connectionToClient, normalData.ToArray());
                }

                KeyValuePair <int, List <int> > entry = pHideDict.FirstOrDefault(x => x.Key == gameObject.GetComponent <QueryProcessor>().PlayerId);
                if (PlayerManager.singleton.players.FirstOrDefault(x => x.GetComponent <QueryProcessor>().PlayerId == entry.Key && entry.Key != 0) != null)
                {
                    List <PlayerPositionData> modifiedData = new List <PlayerPositionData>((IEnumerable <PlayerPositionData>)normalData);

                    for (int index = 0; index < modifiedData.Count; ++index)
                    {
                        if (component1.curClass >= 0 && players[index] != gameObject && entry.Value.Contains(players[index].GetComponent <QueryProcessor>().PlayerId))
                        {
                            modifiedData[index] = new PlayerPositionData()
                            {
                                position = Vector3.up * 6000f,
                                rotation = 0.0f,
                                playerID = modifiedData[index].playerID
                            };
                        }
                    }
                    __instance.CallTargetTransmit(gameObject.GetComponent <NetworkIdentity>().connectionToClient, modifiedData.ToArray());
                }
            }
        }