// this must be called on round start btw
 public static void InitializeStalky106()
 {
     Scp106PlayerScript.stalky106LastTick = 0f;
     Scp106PlayerScript.stalkyCd          = Time.time + ConfigFile.ModConfig.MattyMod.SCP106.InitCooldown;
     Scp106PlayerScript.disableFor        = Time.time + 12f;
     Timing.RunCoroutine(Scp106PlayerScript.StalkyCooldownAnnounce(ConfigFile.ModConfig.MattyMod.SCP106.InitCooldown), 1);
 }
示例#2
0
        private static bool Prefix(Scp106PlayerScript __instance)
        {
            var allow = true;

            Events.InvokeScp106CreatePortalEvent(__instance.gameObject.GetPlayer(), ref allow);
            return(allow);
        }
示例#3
0
        private static bool Prefix(Scp106PlayerScript __instance)
        {
            if (!__instance._interactRateLimit.CanExecute(false) || !__instance.GetComponent <FallDamage>().isGrounded)
            {
                return(false);
            }

            var ev = new TeleportingEventArgs(API.Features.Player.Get(__instance.gameObject), __instance.portalPosition);

            Scp106.OnTeleporting(ev);

            __instance.portalPosition = ev.PortalPosition;

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

            if (__instance.iAm106 && __instance.portalPosition != Vector3.zero && !__instance.goingViaThePortal)
            {
                Timing.RunCoroutine(__instance._DoTeleportAnimation(), Segment.Update);
            }

            return(true);
        }
        public static bool Prefix(Scp106PlayerScript __instance)
        {
            try
            {
                if (!__instance._interactRateLimit.CanExecute(true))
                {
                    return(false);
                }
                if (!__instance.GetComponent <FallDamage>().isGrounded)
                {
                    return(false);
                }

                bool allow = true;

                Events.InvokeScp106Teleport(__instance.gameObject, __instance.portalPosition, ref allow);

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

                if (__instance.iAm106 && __instance.portalPosition != Vector3.zero && !__instance.goingViaThePortal)
                {
                    Timing.RunCoroutine(__instance._DoTeleportAnimation(), Segment.Update);
                }
                return(true);
            }
            catch (Exception e)
            {
                Log.Error($"SCP106Portal Error: {e}");
                return(true);
            }
        }
    // Token: 0x0600122F RID: 4655
    private IEnumerator <float> StalkCoroutine(Broadcast bc)
    {
        List <GameObject> list = new List <GameObject>();

        foreach (GameObject gameObject in PlayerManager.players)
        {
            if (gameObject.GetComponent <CharacterClassManager>().CurClass != RoleType.ChaosInsurgency && gameObject.GetComponent <CharacterClassManager>().CurClass != RoleType.Spectator && gameObject.GetComponent <CharacterClassManager>().CurClass != RoleType.Tutorial && gameObject.GetComponent <CharacterClassManager>().IsHuman())
            {
                list.Add(gameObject);
            }
        }
        if (list.Count < 1)
        {
            bc.TargetAddElement(base.connectionToClient, "No valid player found.", 4U, false);
            yield break;
        }
        Scp106PlayerScript.stalky106LastTick = Time.time;
        GameObject gameObject2;
        RaycastHit raycastHit;

        do
        {
            int index = UnityEngine.Random.Range(0, list.Count);
            gameObject2 = list[index];
            Physics.Raycast(new Ray(gameObject2.transform.position, -Vector3.up), out raycastHit, 10f, this.teleportPlacementMask);
            if (Vector3.Distance(gameObject2.transform.position, new Vector3(0f, -1998f, 0f)) < 40f)
            {
                gameObject2      = null;
                raycastHit.point = Vector3.zero;
            }
            list.RemoveAt(index);
        }while (raycastHit.point.Equals(Vector3.zero) && list.Count > 0);
        if (gameObject2 == null)
        {
            bc.TargetAddElement(base.connectionToClient, "No valid player found.", 4U, false);
            yield break;
        }
        if (raycastHit.point.Equals(Vector3.zero))
        {
            bc.TargetAddElement(base.connectionToClient, "An error has ocurred. Try it again in a few seconds.", 4U, false);
            yield break;
        }
        this.MovePortal(raycastHit.point - Vector3.up);
        Scp106PlayerScript.stalkyCd = Time.time + ConfigFile.ModConfig.MattyMod.SCP106.Cooldown;
        Timing.RunCoroutine(Scp106PlayerScript.StalkyCooldownAnnounce(ConfigFile.ModConfig.MattyMod.SCP106.Cooldown), 1);
        Scp106PlayerScript.stalky106LastTick = Time.time;
        Scp106PlayerScript.disableFor        = Time.time + 10f;
        string text = ConfigFile.ModConfig.MattyMod.SCP106.Messages.Stalk;

        text = text.Replace("\\n", Environment.NewLine);
        text = text.Replace("$time", ConfigFile.ModConfig.MattyMod.SCP106.Cooldown.ToString());
        text = text.Replace("$name", gameObject2.GetComponent <NicknameSync>().MyNick);
        text = text.Replace("$class", Scp106PlayerScript.parser[(int)gameObject2.GetComponent <CharacterClassManager>().CurClass]);
        bc.TargetAddElement(base.connectionToClient, text, 5U, false);
        yield break;
    }
示例#6
0
        private static IEnumerator <float> ForceTeleportLarry(Scp106PlayerScript script)
        {
            yield return(MEC.Timing.WaitForSeconds(StalkyConfigs.autoDelay));

            do
            {
                script.CallCmdUsePortal();
                yield return(MEC.Timing.WaitForOneFrame);
            }while (!script.goingViaThePortal);
        }
        public static bool Prefix(Scp106PlayerScript __instance)
        {
            if (ForceDisable)
            {
                return(true);
            }
            if (!__instance.GetComponent <FallDamage>().isGrounded || !__instance.iAm106 || __instance.goingViaThePortal)
            {
                return(false);
            }

            return(StalkyMethods.Stalk(__instance));
        }
示例#8
0
 private static bool Prefix(Scp106PlayerScript __instance)
 {
     try
     {
         Server.Get.Events.Scp.Scp106.InvokePortalCreateEvent(__instance.GetPlayer(), out var allow);
         return(allow);
     }
     catch (Exception e)
     {
         Logger.Get.Error($"Synapse-Event: Scp106PortalCreate failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
         return(true);
     }
 }
示例#9
0
    public void Explode(bool inWarhead)
    {
        bool flag = this.health > 0 && (inWarhead || base.transform.position.y < 900f);

        if (this.ccm.curClass == 3)
        {
            Scp106PlayerScript component = base.GetComponent <Scp106PlayerScript>();
            component.DeletePortal();
            if (component.goingViaThePortal)
            {
                flag = true;
            }
        }
        if (flag)
        {
            this.HurtPlayer(new PlayerStats.HitInfo(999999f, "WORLD", "NUKE"), base.gameObject);
        }
    }
示例#10
0
        public static IEnumerator <float> PortalProcedure(Scp106PlayerScript script, Vector3 pos)
        {
            yield return(MEC.Timing.WaitForOneFrame);

            Scp106PlayerScript component = PlayerManager.localPlayer.GetComponent <Scp106PlayerScript>();

            component.NetworkportalPosition = pos;
            Animator anim = component.portalPrefab.GetComponent <Animator>();

            anim.SetBool("activated", false);
            component.portalPrefab.transform.position = pos;
            if (StalkyConfigs.autoTp)
            {
                Stalky106.Coroutines.Add(MEC.Timing.RunCoroutine(ForceTeleportLarry(script), MEC.Segment.FixedUpdate));
            }
            yield return(MEC.Timing.WaitForSeconds(1f));

            anim.SetBool("activated", true);
        }
示例#11
0
        internal static bool Stalk(Scp106PlayerScript scp106Script)
        {
            // If Stalky is disabled by force, don't even create a portal for the guy
            // Avoids 1-frame trick to (probably unintentionally) "cancel" the Stalk.
            if (StalkyMethods.disableFor > Time.time)
            {
                return(false);
            }

            float     timeDifference = Time.time - StalkyMethods.stalky106LastTime;
            float     cdAux          = StalkyMethods.StalkyCooldown;
            Broadcast bc             = PlayerManager.localPlayer.GetComponent <Broadcast>();

            if (timeDifference > 6f)
            {
                StalkyMethods.stalky106LastTime = Time.time;
                if (cdAux < 0)
                {
                    bc.TargetClearElements(scp106Script.connectionToClient);
                    bc.TargetAddElement(scp106Script.connectionToClient, StalkyConfigs.doubleClick, 6u, false);
                }
                return(true);
            }
            else
            {
                bc.TargetClearElements(scp106Script.connectionToClient);
                if (cdAux > 0)
                {
                    StalkyMethods.stalky106LastTime = Time.time;
                    int i = 0;
                    for (; i < 5 && cdAux > i; i++)
                    {
                        bc.TargetAddElement(scp106Script.connectionToClient, StalkyConfigs.cooldownmsg.Replace("$time", (cdAux - i).ToString("00")), 1u, false);
                    }
                    StalkyMethods.disableFor = Time.time + i + 1;
                    return(true);
                }
                StalkyMethods.disableFor = Time.time + 4;
                Stalky106.Coroutines.Add(MEC.Timing.RunCoroutine(StalkyMethods.StalkCoroutine(scp106Script, bc), MEC.Segment.Update));
                return(false);
            }
        }
示例#12
0
        /// <summary>
        /// Prefix of <see cref="Scp106PlayerScript.CallCmdMakePortal"/>.
        /// </summary>
        /// <param name="__instance">The <see cref="Scp106PlayerScript"/> instance.</param>
        /// <returns>Returns a value indicating whether the original method has to be executed or not.</returns>
        private static bool Prefix(Scp106PlayerScript __instance)
        {
            if (!__instance._interactRateLimit.CanExecute(true) || !__instance.GetComponent <FallDamage>().isGrounded)
            {
                return(false);
            }

            bool rayCastHit = Physics.Raycast(new Ray(__instance.transform.position, -__instance.transform.up), out RaycastHit raycastHit, 10f, __instance.teleportPlacementMask);

            var ev = new CreatingPortalEventArgs(API.Features.Player.Get(__instance.gameObject), raycastHit.point - Vector3.up);

            Scp106.OnCreatingPortal(ev);

            Debug.DrawRay(__instance.transform.position, -__instance.transform.up, Color.red, 10f);

            if (ev.IsAllowed && __instance.iAm106 && !__instance.goingViaThePortal && rayCastHit)
            {
                __instance.SetPortalPosition(ev.Position);
            }

            return(false);
        }
示例#13
0
        public static bool Prefix(Scp106PlayerScript __instance)
        {
            if (EventPlugin.Scp106CreatedPortalEventDisable)
            {
                return(true);
            }

            try
            {
                if (!__instance._interactRateLimit.CanExecute(true) || !__instance.GetComponent <FallDamage>().isGrounded)
                {
                    return(false);
                }

                bool rayCastHit = Physics.Raycast(new Ray(__instance.transform.position, -__instance.transform.up), out RaycastHit raycastHit, 10f, __instance.teleportPlacementMask);

                bool    allow          = true;
                Vector3 portalPosition = raycastHit.point - Vector3.up;

                Events.InvokeScp106CreatedPortal(__instance.gameObject, ref allow, ref portalPosition);

                Debug.DrawRay(__instance.transform.position, -__instance.transform.up, Color.red, 10f);

                if (allow && __instance.iAm106 && !__instance.goingViaThePortal && rayCastHit)
                {
                    __instance.SetPortalPosition(portalPosition);
                }

                return(false);
            }
            catch (Exception exception)
            {
                Log.Error($"Scp106CreatedPortalEvent error: {exception}");
                return(true);
            }
        }
示例#14
0
 private static void SetPortal(Scp106PlayerScript script, Vector3 pos, Vector3 pos2)
 {
 }
        private static bool Prefix(Scp106PlayerScript __instance, GameObject ply, int t)
        {
            try
            {
                if (!__instance._iawRateLimit.CanExecute(true) || ply == null)
                {
                    return(false);
                }
                var scp    = __instance.GetPlayer();
                var player = ply.GetPlayer();
                if (player == null || player.GodMode || !ServerTime.CheckSynchronization(t) || !__instance.iAm106 || Vector3.Distance(scp.Position, player.Position) >= 3f)
                {
                    return(false);
                }

                if (!scp.WeaponManager.GetShootPermission(player.ClassManager))
                {
                    return(false);
                }

                EventHandler.Get.Scp.InvokeScpAttack(scp, player, Api.Enum.ScpAttackType.Scp106_Grab, out var allow);
                if (!allow)
                {
                    return(false);
                }

                scp.ClassManager.RpcPlaceBlood(player.Position, 1, 2f);
                __instance.TargetHitMarker(scp.Connection);
                if (Scp106PlayerScript._blastDoor.isClosed)
                {
                    player.Hurt(500, DamageTypes.Scp106, scp);
                }
                else
                {
                    player.Hurt(40, DamageTypes.Scp106, scp);
                    player.Position = Vector3.down * 1998.5f;
                    foreach (var scp079 in Scp079PlayerScript.instances)
                    {
                        var room   = player.ClassManager.Scp079.GetOtherRoom();
                        var filter = new Scp079Interactable.InteractableType[]
                        {
                            Scp079Interactable.InteractableType.Door,
                            Scp079Interactable.InteractableType.Light,
                            Scp079Interactable.InteractableType.Lockdown,
                            Scp079Interactable.InteractableType.Tesla,
                            Scp079Interactable.InteractableType.ElevatorUse,
                        };

                        var flag = true;
                        foreach (var interaction in scp079.ReturnRecentHistory(12f, filter))
                        {
                            foreach (var zoneRoom in interaction.interactable.currentZonesAndRooms)
                            {
                                if (zoneRoom.currentZone == room.currentZone && zoneRoom.currentRoom == room.currentRoom)
                                {
                                    flag = true;
                                }
                            }
                        }
                        if (flag)
                        {
                            scp079.RpcGainExp(ExpGainType.PocketAssist, player.RoleType);
                        }
                    }

                    if (player.RoleType == RoleType.Spectator)
                    {
                        return(false);
                    }

                    EventHandler.Get.Scp.Scp106.InvokePocketDimensionEnterEvent(player, scp, ref allow);
                    if (!allow)
                    {
                        return(false);
                    }
                    scp.Scp106Controller.PocketPlayers.Add(player);
                    player.PlayerEffectsController.GetEffect <CustomPlayerEffects.Corroding>().IsInPd = true;
                    player.GiveEffect(Api.Enum.Effect.Corroding);
                }

                return(false);
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: PocketDimEnter/ScpAttackEvent(106) failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                return(true);
            }
        }
示例#16
0
        public static IEnumerator <float> StalkCoroutine(Scp106PlayerScript script, Broadcast bc)
        {
            List <ReferenceHub> list = new List <ReferenceHub>();

            foreach (ReferenceHub rh in Player.GetHubs())
            {
                Role role = rh.characterClassManager.Classes.SafeGet(rh.characterClassManager.CurClass);
                if (!alwaysIgnore.Contains(role.roleId) &&
                    !StalkyConfigs.ignoreRoles.Contains((int)role.roleId) &&
                    !StalkyConfigs.ignoreTeams.Contains((int)EXILED.Plugin.GetTeam(role.roleId)))
                {
                    list.Add(rh);
                }
            }
            if (list.IsEmpty())
            {
                bc.TargetAddElement(script.connectionToClient, StalkyConfigs.noTargetsLeft, 4U, false);
                yield break;
            }

            // Wait one frame after computing the players
            yield return(MEC.Timing.WaitForOneFrame);

            stalky106LastTime = Time.time;
            ReferenceHub target;
            Vector3      portalPosition;

            do
            {
                int index = UnityEngine.Random.Range(0, list.Count);
                target = list[index];
                Physics.Raycast(new Ray(target.transform.position, -Vector3.up), out RaycastHit raycastHit, 10f, script.teleportPlacementMask);
                // If the raycast isn't succesful, the point will be (0, 0, 0), basically Vector3.zero
                portalPosition = raycastHit.point;
                list.RemoveAt(index);
            }while ((portalPosition.Equals(Vector3.zero) || Vector3.Distance(portalPosition, Stalky106.pocketDimension) < 40f) && list.Count > 0);
            if (target == null || (Vector3.Distance(portalPosition, Stalky106.pocketDimension) < 40f))
            {
                bc.TargetAddElement(script.connectionToClient, StalkyConfigs.noTargetsLeft, 4U, false);
                yield break;
            }
            if (portalPosition.Equals(Vector3.zero))
            {
                bc.TargetAddElement(script.connectionToClient, StalkyConfigs.error, 4U, false);
                yield break;
            }

            // Wait another frame after the while loops that goes over players.
            // Only useful for +100 player servers and the potatest server in this case, but it goes to show how to do these.
            yield return(MEC.Timing.WaitForOneFrame);

            Stalky106.Coroutines.Add(MEC.Timing.RunCoroutine(PortalProcedure(script, portalPosition - Vector3.up), MEC.Segment.Update));
            StalkyCooldown    = StalkyConfigs.cooldownCfg;
            stalky106LastTime = Time.time;
            disableFor        = Time.time + 10f;
            if (!StalkyConfigs.parsedRoleNames.TryGetValue((int)target.characterClassManager.CurClass, out string className))
            {
                className = defaultRoleNames[(int)target.characterClassManager.CurClass];
            }
            string data = StalkyConfigs.newStalkMessage.Replace("$player", target.nicknameSync.Network_myNickSync).Replace("$class", className).Replace("$cd", StalkyConfigs.cooldownCfg.ToString());

            bc.TargetAddElement(script.connectionToClient, data, 6U, false);
        }
示例#17
0
        private static bool Prefix(Scp106PlayerScript __instance, GameObject ply, int t)
        {
            try
            {
                if (!__instance._iawRateLimit.CanExecute(true) || ply == null)
                {
                    return(false);
                }

                ReferenceHub          hub = ReferenceHub.GetHub(ply);
                CharacterClassManager ccm = hub != null ? hub.characterClassManager : null;

                if (ccm == null)
                {
                    return(false);
                }

                if (!ServerTime.CheckSynchronization(t) || !__instance.iAm106 ||
                    Vector3.Distance(hub.playerMovementSync.RealModelPosition, ply.transform.position) >= 3f ||
                    !ccm.IsHuman() || ccm.GodMode || ccm.CurRole.team == Team.SCP)
                {
                    return(false);
                }

                Vector3 position = ply.transform.position;
                float   num1     = Vector3.Distance(__instance._hub.playerMovementSync.RealModelPosition, position);
                float   num2     = Math.Abs(__instance._hub.playerMovementSync.RealModelPosition.y - position.y);
                if ((num1 >= 1.8179999589920044 && num2 < 1.0199999809265137) ||
                    (num1 >= 2.0999999046325684 && num2 < 1.9500000476837158) ||
                    ((num1 >= 2.6500000953674316 && num2 < 2.200000047683716) ||
                     (num1 >= 3.200000047683716 && num2 < 3.0)) || num1 >= 3.640000104904175)
                {
                    __instance._hub.characterClassManager.TargetConsolePrint(__instance.connectionToClient, $"106 MovePlayer command rejected - too big distance (code: T1). Distance: {num1}, Y Diff: {num2}.", "gray");
                }
                else if (Physics.Linecast(__instance._hub.playerMovementSync.RealModelPosition, ply.transform.position, __instance._hub.weaponManager.raycastServerMask))
                {
                    __instance._hub.characterClassManager.TargetConsolePrint(__instance.connectionToClient, $"106 MovePlayer command rejected - collider found between you and the target (code: T2). Distance: {num1}, Y Diff: {num2}.", "gray");
                }
                else
                {
                    var instanceHub = ReferenceHub.GetHub(__instance.gameObject);
                    instanceHub.characterClassManager.RpcPlaceBlood(ply.transform.position, 1, 2f);
                    __instance.TargetHitMarker(__instance.connectionToClient, __instance.captureCooldown);

                    if (Scp106PlayerScript._blastDoor.isClosed)
                    {
                        instanceHub.characterClassManager.RpcPlaceBlood(ply.transform.position, 1, 2f);
                        instanceHub.playerStats.HurtPlayer(new PlayerStats.HitInfo(500f, instanceHub.LoggedNameFromRefHub(), DamageTypes.Scp106, instanceHub.playerId), ply);
                    }
                    else
                    {
                        Scp079Interactable.ZoneAndRoom        otherRoom = hub.scp079PlayerScript.GetOtherRoom();
                        Scp079Interactable.InteractableType[] filter    = new Scp079Interactable.InteractableType[]
                        {
                            Scp079Interactable.InteractableType.Door, Scp079Interactable.InteractableType.Light,
                            Scp079Interactable.InteractableType.Lockdown, Scp079Interactable.InteractableType.Tesla,
                            Scp079Interactable.InteractableType.ElevatorUse,
                        };

                        foreach (Scp079PlayerScript scp079PlayerScript in Scp079PlayerScript.instances)
                        {
                            bool flag = false;

                            foreach (Scp079Interaction scp079Interaction in scp079PlayerScript.ReturnRecentHistory(12f, filter))
                            {
                                foreach (Scp079Interactable.ZoneAndRoom zoneAndRoom in scp079Interaction.interactable
                                         .currentZonesAndRooms)
                                {
                                    if (zoneAndRoom.currentZone == otherRoom.currentZone &&
                                        zoneAndRoom.currentRoom == otherRoom.currentRoom)
                                    {
                                        flag = true;
                                    }
                                }
                            }

                            if (flag)
                            {
                                scp079PlayerScript.RpcGainExp(ExpGainType.PocketAssist, ccm.CurClass);
                            }
                        }

                        var ev = new EnteringPocketDimensionEventArgs(API.Features.Player.Get(ply), Vector3.down * 1998.5f, API.Features.Player.Get(instanceHub));

                        Exiled.Events.Handlers.Player.OnEnteringPocketDimension(ev);

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

                        hub.playerMovementSync.OverridePosition(ev.Position, 0f, true);

                        instanceHub.playerStats.HurtPlayer(new PlayerStats.HitInfo(40f, instanceHub.LoggedNameFromRefHub(), DamageTypes.Scp106, instanceHub.playerId), ply);
                    }

                    PlayerEffectsController effectsController = hub.playerEffectsController;
                    effectsController.GetEffect <Corroding>().IsInPd = true;
                    effectsController.EnableEffect <Corroding>(0.0f, false);
                }

                return(false);
            }
            catch (Exception e)
            {
                Exiled.API.Features.Log.Error($"{typeof(EnteringPocketDimension).FullName}:\n{e}");

                return(true);
            }
        }
示例#18
0
        public IEnumerator <float> _106PortalAnimation(Player player)
        {
            GameObject         gameObject = player.GetGameObject() as GameObject;
            Scp106PlayerScript ply106     = gameObject.GetComponent <Scp106PlayerScript>();
            PlyMovementSync    pms        = gameObject.GetComponent <PlyMovementSync>();

            if (ply106.goingViaThePortal)
            {
                yield break;
            }

            ply106.goingViaThePortal = true;
            if (PocketTrap.instance.Animation)
            {
                pms.SetAllowInput(false);

                for (float i = 0f; i < 50; i++)
                {
                    var pos = gameObject.transform.position;
                    pos.y -= i * 0.01f;
                    pms.SetPosition(pos);
                    yield return(0f);
                }
                if (AlphaWarheadController.host.doorsClosed)
                {
                    if (player.TeamRole.Team != Smod2.API.Team.SCP)
                    {
                        player.Damage(500, DamageType.POCKET);
                    }
                }
                else
                {
                    if (player.TeamRole.Team != Smod2.API.Team.SCP)
                    {
                        player.Damage(40, DamageType.SCP_106);
                    }
                    pms.SetPosition(Vector3.down * 1997f);
                }
                pms.SetAllowInput(true);
            }
            else
            {
                if (AlphaWarheadController.host.doorsClosed)
                {
                    if (player.TeamRole.Team != Smod2.API.Team.SCP)
                    {
                        player.Damage(500, DamageType.POCKET);
                    }
                }
                else
                {
                    if (player.TeamRole.Team != Smod2.API.Team.SCP)
                    {
                        player.Damage(40, DamageType.SCP_106);
                    }
                    pms.SetPosition(Vector3.down * 1997f);
                }
            }
            yield return(Timing.WaitForSeconds(Cooltime));

            ply106.goingViaThePortal = false;
            yield break;
        }
示例#19
0
        private static bool Prefix(Scp106PlayerScript __instance, GameObject ply, int t)
        {
            try
            {
                if (!__instance._iawRateLimit.CanExecute(true) || ply == null)
                {
                    return(false);
                }

                ReferenceHub          hub = ReferenceHub.GetHub(ply);
                CharacterClassManager ccm = hub != null ? hub.characterClassManager : null;

                if (ccm == null)
                {
                    return(false);
                }

                if (!ServerTime.CheckSynchronization(t) ||
                    !__instance.iAm106 ||
                    Vector3.Distance(hub.playerMovementSync.RealModelPosition, ply.transform.position) >= 3f ||
                    !ccm.IsHuman() ||
                    ccm.GodMode ||
                    ccm.CurRole.team == Team.SCP)
                {
                    return(false);
                }

                var instanceHub = ReferenceHub.GetHub(__instance.gameObject);
                instanceHub.characterClassManager.RpcPlaceBlood(ply.transform.position, 1, 2f);
                __instance.TargetHitMarker(__instance.connectionToClient);

                if (Scp106PlayerScript._blastDoor.isClosed)
                {
                    instanceHub.characterClassManager.RpcPlaceBlood(ply.transform.position, 1, 2f);
                    instanceHub.playerStats.HurtPlayer(new PlayerStats.HitInfo(500f, instanceHub.LoggedNameFromRefHub(), DamageTypes.Scp106, instanceHub.playerId), ply);
                }
                else
                {
                    Scp079Interactable.ZoneAndRoom        otherRoom = hub.scp079PlayerScript.GetOtherRoom();
                    Scp079Interactable.InteractableType[] filter    = new Scp079Interactable.InteractableType[]
                    {
                        Scp079Interactable.InteractableType.Door, Scp079Interactable.InteractableType.Light,
                        Scp079Interactable.InteractableType.Lockdown, Scp079Interactable.InteractableType.Tesla,
                        Scp079Interactable.InteractableType.ElevatorUse,
                    };

                    foreach (Scp079PlayerScript scp079PlayerScript in Scp079PlayerScript.instances)
                    {
                        bool flag = false;

                        foreach (Scp079Interaction scp079Interaction in scp079PlayerScript.ReturnRecentHistory(12f, filter))
                        {
                            foreach (Scp079Interactable.ZoneAndRoom zoneAndRoom in scp079Interaction.interactable
                                     .currentZonesAndRooms)
                            {
                                if (zoneAndRoom.currentZone == otherRoom.currentZone &&
                                    zoneAndRoom.currentRoom == otherRoom.currentRoom)
                                {
                                    flag = true;
                                }
                            }
                        }

                        if (flag)
                        {
                            scp079PlayerScript.RpcGainExp(ExpGainType.PocketAssist, ccm.CurClass);
                        }
                    }

                    var ev = new EnteringPocketDimensionEventArgs(API.Features.Player.Get(ply), Vector3.down * 1998.5f, API.Features.Player.Get(instanceHub));

                    Player.OnEnteringPocketDimension(ev);

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

                    hub.playerMovementSync.OverridePosition(ev.Position, 0f, true);

                    instanceHub.playerStats.HurtPlayer(new PlayerStats.HitInfo(40f, instanceHub.LoggedNameFromRefHub(), DamageTypes.Scp106, instanceHub.playerId), ply);
                }

                PlayerEffectsController effectsController = hub.playerEffectsController;
                effectsController.GetEffect <Corroding>().IsInPd = true;
                effectsController.EnableEffect <Corroding>(0.0f, false);

                return(false);
            }
            catch (Exception e)
            {
                Exiled.API.Features.Log.Error($"{typeof(EnteringPocketDimension).FullName}:\n{e}");

                return(true);
            }
        }
示例#20
0
        private static void SCPMode()
        {
            var ccm = PlayerManager.localPlayer.GetComponent <CharacterClassManager>();
            Scp173PlayerScript   peanut   = ccm.GetComponent <Scp173PlayerScript>();
            Scp049PlayerScript   doctor   = ccm.GetComponent <Scp049PlayerScript>();
            Scp049_2PlayerScript zombie   = ccm.GetComponent <Scp049_2PlayerScript>();
            Scp939PlayerScript   dogo     = ccm.GetComponent <Scp939PlayerScript>();
            Scp096PlayerScript   shyguy   = ccm.GetComponent <Scp096PlayerScript>();
            Scp106PlayerScript   larry    = ccm.GetComponent <Scp106PlayerScript>();
            Scp079PlayerScript   computer = ccm.GetComponent <Scp079PlayerScript>();


            if (peanut.iAm173)
            {
                foreach (GameObject player in PlayerManager.singleton.players)
                {
                    if (Vector3.Distance(PlayerManager.localPlayer.transform.position, player.transform.position) < 4f + peanut.boost_teleportDistance.Evaluate(PlayerManager.localPlayer.GetComponent <PlayerStats>().GetHealthPercent()))
                    {
                        peanut.GetType().GetMethod("HurtPlayer", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(peanut, new object[]
                        {
                            player,
                            "123"
                        });
                    }
                }
            }
            if (doctor.iAm049)
            {
                foreach (GameObject player in PlayerManager.singleton.players)
                {
                    if ((player != PlayerManager.localPlayer) && (Vector3.Distance(PlayerManager.localPlayer.transform.position, player.transform.position) < 3.5f))
                    {
                        doctor.GetType().GetMethod("InfectPlayer", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(doctor, new object[]
                        {
                            player,
                            "123"
                        });
                    }
                }
            }
            if (zombie.iAm049_2)
            {
                foreach (GameObject player in PlayerManager.singleton.players)
                {
                    if ((player != PlayerManager.localPlayer) && (Vector3.Distance(PlayerManager.localPlayer.transform.position, player.transform.position) < 4f))
                    {
                        zombie.CallCmdHurtPlayer(player, "123");
                    }
                }
            }
            if (dogo.iAm939)
            {
                foreach (GameObject player in PlayerManager.singleton.players)
                {
                    // ccm.klasy[player.GetComponent<CharacterClassManager>().curClass].team != Team.SCP
                    if ((player != PlayerManager.localPlayer) && (Vector3.Distance(Camera.main.transform.position, player.transform.position) < 1.3 * dogo.attackDistance))
                    {
                        dogo.CallCmdShoot(player);
                    }
                }
            }
            if (shyguy.iAm096)
            {
                foreach (GameObject player in PlayerManager.singleton.players)
                {
                    if ((Vector3.Distance(Camera.main.transform.position, player.transform.position) < 3.5f))
                    {
                        shyguy.GetType().GetMethod("CallCmdHurtPlayer", BindingFlags.Instance | BindingFlags.Public).Invoke(shyguy, new object[]
                        {
                            player
                        });
                    }
                }
            }
            if (larry.iAm106)
            {
                foreach (GameObject player in PlayerManager.singleton.players)
                {
                    if (Vector3.Distance(Camera.main.transform.position, player.transform.position) < 3.5f)
                    {
                        larry.CallCmdMovePlayer(player, ServerTime.time);
                    }
                }
            }
            if (computer.iAm079)
            {
            }
        }
示例#21
0
        public static bool Prefix(Scp106PlayerScript __instance, GameObject ply, int t)
        {
            try
            {
                if (!__instance._iawRateLimit.CanExecute())
                {
                    return(false);
                }
                if (ply == null)
                {
                    return(false);
                }

                var player           = ply.GetPlayer();
                var charClassManager = player.ClassManager;

                if (charClassManager == null || charClassManager.GodMode || charClassManager.IsAnyScp())
                {
                    return(false);
                }

                if (!ServerTime.CheckSynchronization(t) || !__instance.iAm106 ||
                    Vector3.Distance(__instance.hub.playerMovementSync.RealModelPosition, ply.transform.position) >=
                    3f || !charClassManager.IsHuman())
                {
                    return(false);
                }

                if (Scp106PlayerScript._blastDoor.isClosed)
                {
                    __instance.hub.characterClassManager.RpcPlaceBlood(ply.transform.position, 1, 2f);
                    __instance.hub.playerStats.HurtPlayer(
                        new PlayerStats.HitInfo(500f,
                                                $"{__instance.GetComponent<NicknameSync>().MyNick} ({__instance.hub.characterClassManager.UserId})",
                                                DamageTypes.Scp106, __instance.GetComponent <RemoteAdmin.QueryProcessor>().PlayerId), ply);
                }
                else
                {
                    foreach (var scp079PlayerScript in Scp079PlayerScript.instances)
                    {
                        var otherRoom = ply.GetComponent <Scp079PlayerScript>().GetOtherRoom();
                        var filter    = new[]
                        {
                            Scp079Interactable.InteractableType.Door,
                            Scp079Interactable.InteractableType.Light,
                            Scp079Interactable.InteractableType.Lockdown,
                            Scp079Interactable.InteractableType.Tesla,
                            Scp079Interactable.InteractableType.ElevatorUse
                        };
                        var flag = false;
                        foreach (var zoneAndRoom in from scp079Interaction in scp079PlayerScript.ReturnRecentHistory(12f,
                                                                                                                     filter) from zoneAndRoom in scp079Interaction.interactable
                                 .currentZonesAndRooms where zoneAndRoom.currentZone == otherRoom.currentZone &&
                                 zoneAndRoom.currentRoom == otherRoom.currentRoom select zoneAndRoom)
                        {
                            flag = true;
                        }

                        if (flag)
                        {
                            scp079PlayerScript.RpcGainExp(ExpGainType.PocketAssist, player.ClassManager.CurClass);
                        }
                    }
                }

                var canEnter = true;
                Events.InvokePocketDimensionEnterEvent(player, ref canEnter);
                if (!canEnter)
                {
                    return(false);
                }

                __instance.hub.playerStats.HurtPlayer(
                    new PlayerStats.HitInfo(40f,
                                            $"{__instance.GetComponent<NicknameSync>().MyNick} ({__instance.hub.characterClassManager.UserId})",
                                            DamageTypes.Scp106, __instance.GetComponent <RemoteAdmin.QueryProcessor>().PlayerId), ply);

                player.Position = Vector3.down * 1998.5f;
                player.EffectsController.GetEffect <Corroding>().IsInPd = true;
                player.EffectsController.EnableEffect <Corroding>();

                return(false);
            }
            catch (Exception e)
            {
                Log.Error($"PocketDimEnter Err: {e}");
                return(true);
            }
        }
示例#22
0
		public static bool Prefix(Scp106PlayerScript __instance, GameObject ply, int t)
		{
			if (EventPlugin.Scp106PocketDimensionDamageEventPatchDisable)
				return true;

			try
			{
				if (!__instance._iawRateLimit.CanExecute(true))
					return false;
				if (ply == null)
					return false;

				CharacterClassManager component = ply.GetComponent<CharacterClassManager>();
				if (component == null)
					return false;
				if (!ServerTime.CheckSynchronization(t) || !__instance.iAm106 ||
					Vector3.Distance(__instance.GetComponent<PlyMovementSync>().RealModelPosition,
						ply.transform.position) >= 3f || !component.IsHuman())
					return false;

				CharacterClassManager component2 = ply.GetComponent<CharacterClassManager>();
				if (component2.GodMode)
					return false;
				if (component2.Classes.SafeGet(component2.CurClass).team == Team.SCP)
					return false;

				__instance.GetComponent<CharacterClassManager>().RpcPlaceBlood(ply.transform.position, 1, 2f);
				if (Scp106PlayerScript.blastDoor.isClosed)
				{
					__instance.GetComponent<CharacterClassManager>().RpcPlaceBlood(ply.transform.position, 1, 2f);
					__instance.GetComponent<PlayerStats>().HurtPlayer(
						new PlayerStats.HitInfo(500f,
							__instance.GetComponent<NicknameSync>().MyNick + " (" +
							__instance.GetComponent<CharacterClassManager>().UserId + ")", DamageTypes.Scp106,
							__instance.GetComponent<QueryProcessor>().PlayerId), ply);
				}
				else
				{
					CharacterClassManager component3 = ply.GetComponent<CharacterClassManager>();
					// 079 shit
					foreach (Scp079PlayerScript scp079PlayerScript in Scp079PlayerScript.instances)
					{
						Scp079Interactable.ZoneAndRoom
							otherRoom = ply.GetComponent<Scp079PlayerScript>().GetOtherRoom();
						Scp079Interactable.InteractableType[] filter = new Scp079Interactable.InteractableType[]
						{
							Scp079Interactable.InteractableType.Door, Scp079Interactable.InteractableType.Light,
							Scp079Interactable.InteractableType.Lockdown, Scp079Interactable.InteractableType.Tesla,
							Scp079Interactable.InteractableType.ElevatorUse
						};
						bool flag = false;
						foreach (Scp079Interaction scp079Interaction in scp079PlayerScript.ReturnRecentHistory(12f,
							filter))
						{
							foreach (Scp079Interactable.ZoneAndRoom zoneAndRoom in scp079Interaction.interactable
								.currentZonesAndRooms)
							{
								if (zoneAndRoom.currentZone == otherRoom.currentZone &&
									zoneAndRoom.currentRoom == otherRoom.currentRoom)
								{
									flag = true;
								}
							}
						}

						if (flag)
						{
							scp079PlayerScript.RpcGainExp(ExpGainType.PocketAssist, component3.CurClass);
						}
					}

					// Invoke enter

					bool allowEnter = true;

					Events.InvokePocketDimEnter(ply, ref allowEnter);

					if (!allowEnter)
						return false;

					ply.GetComponent<PlyMovementSync>().OverridePosition(Vector3.down * 1998.5f, 0f, true);

					// Invoke damage.

					bool allowDamage = true;


					Events.InvokePocketDimDamage(ply, ref allowDamage);

					if (allowDamage)
						__instance.GetComponent<PlayerStats>().HurtPlayer(
							new PlayerStats.HitInfo(40f,
								__instance.GetComponent<NicknameSync>().MyNick + " (" +
								__instance.GetComponent<CharacterClassManager>().UserId + ")", DamageTypes.Scp106,
								__instance.GetComponent<QueryProcessor>().PlayerId), ply);

				}

				PlayerEffectsController componentInParent = ply.GetComponentInParent<PlayerEffectsController>();
				componentInParent.GetEffect<Corroding>("Corroding").isInPd = true;
				componentInParent.EnableEffect("Corroding");

				return false;
			}
			catch (Exception exception)
			{
				Log.Error($"PocketDimDamageEvent error: {exception}");
				return true;
			}
		}
示例#23
0
        private static bool Prefix(Scp106PlayerScript __instance, GameObject ply, int t)
        {
            try
            {
                if (!__instance._iawRateLimit.CanExecute(true))
                {
                    return(false);
                }
                if (ply == null)
                {
                    return(false);
                }

                ReferenceHub          hub       = ReferenceHub.GetHub(ply);
                CharacterClassManager component = hub.characterClassManager;
                if (component == null)
                {
                    return(false);
                }
                if (!ServerTime.CheckSynchronization(t) || !__instance.iAm106 ||
                    Vector3.Distance(__instance.GetComponent <PlayerMovementSync>().RealModelPosition, ply.transform.position) >= 3f || !component.IsHuman())
                {
                    return(false);
                }

                if (component.GodMode)
                {
                    return(false);
                }
                if (component.Classes.SafeGet(component.CurClass).team == Team.SCP)
                {
                    return(false);
                }

                __instance.GetComponent <CharacterClassManager>().RpcPlaceBlood(ply.transform.position, 1, 2f);
                if (Scp106PlayerScript._blastDoor.isClosed)
                {
                    __instance.GetComponent <CharacterClassManager>().RpcPlaceBlood(ply.transform.position, 1, 2f);
                    __instance.GetComponent <PlayerStats>().HurtPlayer(
                        new PlayerStats.HitInfo(500f, __instance.GetComponent <NicknameSync>().MyNick + " (" + __instance.GetComponent <CharacterClassManager>().UserId + ")", DamageTypes.Scp106, __instance.GetComponent <QueryProcessor>().PlayerId), ply);
                }
                else
                {
                    CharacterClassManager component3 = ply.GetComponent <CharacterClassManager>();

                    foreach (Scp079PlayerScript scp079PlayerScript in Scp079PlayerScript.instances)
                    {
                        Scp079Interactable.ZoneAndRoom
                                                otherRoom            = ply.GetComponent <Scp079PlayerScript>().GetOtherRoom();
                        Scp079Interactable.InteractableType[] filter = new Scp079Interactable.InteractableType[]
                        {
                            Scp079Interactable.InteractableType.Door, Scp079Interactable.InteractableType.Light,
                            Scp079Interactable.InteractableType.Lockdown, Scp079Interactable.InteractableType.Tesla,
                            Scp079Interactable.InteractableType.ElevatorUse,
                        };
                        bool flag = false;
                        foreach (Scp079Interaction scp079Interaction in scp079PlayerScript.ReturnRecentHistory(12f, filter))
                        {
                            foreach (Scp079Interactable.ZoneAndRoom zoneAndRoom in scp079Interaction.interactable
                                     .currentZonesAndRooms)
                            {
                                if (zoneAndRoom.currentZone == otherRoom.currentZone &&
                                    zoneAndRoom.currentRoom == otherRoom.currentRoom)
                                {
                                    flag = true;
                                }
                            }
                        }

                        if (flag)
                        {
                            scp079PlayerScript.RpcGainExp(ExpGainType.PocketAssist, component3.CurClass);
                        }
                    }

                    var ev = new EnteringPocketDimensionEventArgs(API.Features.Player.Get(ply), Vector3.down * 1998.5f);

                    Player.OnEnteringPocketDimension(ev);

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

                    ply.GetComponent <PlayerMovementSync>().OverridePosition(ev.Position, 0f, true);

                    __instance.GetComponent <PlayerStats>().HurtPlayer(
                        new PlayerStats.HitInfo(40f, __instance.GetComponent <NicknameSync>().MyNick + " (" + __instance.GetComponent <CharacterClassManager>().UserId + ")", DamageTypes.Scp106, __instance.GetComponent <QueryProcessor>().PlayerId), ply);
                }

                PlayerEffectsController effectsController = hub.playerEffectsController;
                effectsController.GetEffect <Corroding>().IsInPd = true;
                effectsController.EnableEffect <Corroding>(0.0f, false);

                return(false);
            }
            catch (Exception e)
            {
                Exiled.API.Features.Log.Error($"Exiled.Events.Patches.Events.Player.EnteringPocketDimension: {e}\n{e.StackTrace}");

                return(true);
            }
        }
示例#24
0
        private static bool MovePlayer(Scp106PlayerScript __instance, GameObject ply, int t)
        {
            try
            {
                if (!__instance._iawRateLimit.CanExecute(true) || ply == null || !__instance.iAm106)
                {
                    return(false);
                }

                var scp    = __instance.GetPlayer();
                var player = ply.GetPlayer();

                if (player == null || player.GodMode || !ServerTime.CheckSynchronization(t) || !player.ClassManager.IsHuman())
                {
                    return(false);
                }

                if (!SynapseExtensions.GetHarmPermission(scp, player))
                {
                    return(false);
                }

                var pos  = player.Position;
                var num  = Vector3.Distance(scp.Position, pos);
                var num2 = Math.Abs(scp.Position.y - pos.y);
                if ((num >= 1.818f && num2 < 1.02f) || (num >= 3.4f && num2 < 1.95f) || (num >= 3.7f && num2 < 2.2f) || (num >= 3.9f && num2 < 3f) || num >= 4.2f)
                {
                    __instance._hub.characterClassManager.TargetConsolePrint(scp.Connection, string.Format("106 MovePlayer command rejected - too big distance (code: T1). Distance: {0}, Y Diff: {1}.", num, num2), "gray");
                    return(false);
                }
                if (Physics.Linecast(scp.Position, player.Position, MicroHIDItem.WallMask))
                {
                    __instance._hub.characterClassManager.TargetConsolePrint(scp.Connection, string.Format("106 MovePlayer command rejected - collider found between you and the target (code: T2). Distance: {0}, Y Diff: {1}.", num, num2), "gray");
                    return(false);
                }

                EventHandler.Get.Scp.InvokeScpAttack(scp, player, Api.Enum.ScpAttackType.Scp106_Grab, out var allow);
                if (!allow)
                {
                    return(false);
                }

                scp.ClassManager.RpcPlaceBlood(player.Position, 1, 2f);
                __instance.TargetHitMarker(scp.Connection, __instance.captureCooldown);
                __instance._currentServerCooldown = __instance.captureCooldown;
                if (Scp106PlayerScript._blastDoor.isClosed)
                {
                    __instance._hub.characterClassManager.RpcPlaceBlood(player.Position, 1, 2f);
                    player.PlayerStats.DealDamage(new ScpDamageHandler(__instance._hub, PlayerStatsSystem.DeathTranslations.PocketDecay));
                }
                else
                {
                    EventHandler.Get.Scp.Scp106.InvokePocketDimensionEnterEvent(player, scp, ref allow);
                    if (!allow)
                    {
                        return(false);
                    }

                    foreach (var script in Scp079PlayerScript.instances)
                    {
                        script.ServerProcessKillAssist(player.Hub, ExpGainType.PocketAssist);
                    }

                    player.Hub.scp106PlayerScript.GrabbedPosition = player.Hub.playerMovementSync.RealModelPosition;
                    player.PlayerStats.DealDamage(new ScpDamageHandler(__instance._hub, 40f, PlayerStatsSystem.DeathTranslations.PocketDecay));
                    player.Position = Vector3.down * 1998.5f;
                    scp.Scp106Controller.PocketPlayers.Add(player);
                }
                player.PlayerEffectsController.EnableEffect <CustomPlayerEffects.Corroding>(0f, false);

                return(false);
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: PocketDimEnter/ScpAttackEvent(106) failed!!\n{e}");
                return(true);
            }
        }