Exemplo n.º 1
0
        public static void Prefix(Assets._Scripts.Dissonance.DissonanceUserSetup __instance, bool value)
        {
            if (!Configs.scp_can_talk_to_humans)
            {
                return;
            }

            CharacterClassManager ccm = __instance.gameObject.GetComponent <CharacterClassManager>();

            if (ccm.IsAnyScp() && ccm.CurClass != RoleType.Scp079)
            {
                __instance.MimicAs939 = value;
            }

            return;
        }
Exemplo n.º 2
0
        public static bool Prefix(Scp096 __instance)
        {
            if (__instance._flash.IsEnabled)
            {
                return(false);
            }

            Vector3 vector = __instance.Hub.transform.TransformPoint(Scp096._headOffset);

            foreach (KeyValuePair <GameObject, ReferenceHub> keyValuePair in ReferenceHub.GetAllHubs())
            {
                ReferenceHub          value = keyValuePair.Value;
                CharacterClassManager characterClassManager = value.characterClassManager;
                if (characterClassManager.CurClass != RoleType.Spectator &&
                    !value.isDedicatedServer &&
                    !(value == __instance.Hub) &&
                    !characterClassManager.IsAnyScp() &&
                    Vector3.Dot((value.PlayerCameraReference.position - vector).normalized, __instance.Hub.PlayerCameraReference.forward) >= 0.1f)
                {
                    VisionInformation visionInformation = VisionInformation.GetVisionInformation(value, vector, -0.1f, 60f, true, true, __instance.Hub.localCurrentRoomEffects, 0);
                    bool toEnrage = visionInformation.IsLooking;

                    //Add touch check
                    if (!toEnrage && SanyaPlugin.Instance.Config.Scp096TouchEnrageDistance > visionInformation.Distance)
                    {
                        toEnrage = !Physics.Linecast(value.PlayerCameraReference.position, vector, VisionInformation.VisionLayerMask);
                    }

                    if (toEnrage)
                    {
                        float delay = visionInformation.LookingAmount / 0.25f * (visionInformation.Distance * 0.1f);
                        if (!__instance.Calming)
                        {
                            __instance.AddTarget(value.gameObject);
                        }
                        if (__instance.CanEnrage && value.gameObject != null)
                        {
                            __instance.PreWindup(delay);
                        }
                    }
                }
            }

            return(false);
        }
Exemplo n.º 3
0
 public static bool Prefix(PlayableScps.Scp096 __instance)
 {
     if (((PlayableScp)__instance).isLocalPlayer)
     {
         __instance._abilityManager.RunInputs();
         CursorManager.ChangeMouseVisibility(LockReason.Scp096, (__instance.Charging || (__instance.TryingNotToCry || __instance.PryingGate)) ? MouseVisibilityType.InvisibleButCantMove : MouseVisibilityType.Invisible, false);
         if (!__instance.PlayerState.IsOffensive() && !__instance._visionTargets.IsEmpty <TargetComponent>())
         {
             foreach (TargetComponent component in __instance._visionTargets)
             {
                 if (component != null)
                 {
                     component.IsTarget = false;
                 }
             }
             __instance._visionTargets.Clear();
         }
         if (__instance.TryingNotToCry && (__instance.Hub.fpc.PlySpeed != Vector2.zero))
         {
             Scp096InputMessage message = new Scp096InputMessage
             {
                 InputState = Scp096InputState.None
             };
             NetworkClient.Send <Scp096InputMessage>(message, 0);
         }
     }
     if (NetworkServer.active)
     {
         __instance.UpdateShield();
         __instance.UpdateEnrage();
         __instance.UpdateCharging();
         __instance.UpdatePry();
         foreach (GameObject obj2 in PlayerManager.players)
         {
             CharacterClassManager manager = obj2.GetComponent <CharacterClassManager>();
             if (manager == null || ((manager.CurClass != RoleType.Spectator) && !manager.IsAnyScp()))
             {
                 Player player = Player.Get(obj2);
                 if (player != null && Tracking.PlayersWithSubclasses.ContainsKey(player) &&
                     Tracking.PlayersWithSubclasses[player].Abilities.Contains(AbilityType.Disable096Trigger))
                 {
                     continue;
                 }
                 VisionInformation visionInformation = __instance.GetVisionInformation(obj2);
                 if (visionInformation.Looking)
                 {
                     __instance.ParseVisionInformation(visionInformation);
                 }
             }
         }
         foreach (KeyValuePair <GameObject, Door> pair in PlayableScps.Scp096.takenDoors)
         {
             if (pair.Value.isOpen)
             {
                 PlayableScps.Scp096 scp = PlayableScps.Scp096.Get096FromPlayerObject(pair.Key);
                 if (scp != null)
                 {
                     if (pair.Key == null)
                     {
                         PlayableScps.Scp096.takenDoors.Remove(pair.Key);
                     }
                     else
                     {
                         scp.ResetState();
                     }
                     break;
                 }
             }
         }
     }
     return(false);
 }
        public static bool Prefix(SinkholeEnvironmentalHazard __instance, GameObject player)
        {
            // Check if player has a connection to the server.
            if (!NetworkServer.active)
            {
                return(false);
            }

            PlayerEffectsController componentInParent = player.GetComponentInParent <PlayerEffectsController>();

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

            componentInParent.GetEffect <CustomPlayerEffects.SinkHole>();

            // Check if the player walking into a sinkhole is an SCP or not.
            if (__instance.SCPImmune)
            {
                CharacterClassManager component = player.GetComponent <CharacterClassManager>();
                if (component == null || component.IsAnyScp())
                {
                    return(false);
                }
            }

            // Check if player is in god mode.
            Player ply = Player.Get(player);

            if (ply.IsGodModeEnabled)
            {
                return(false);
            }

            // If a player is out of a sinkhole's range.
            if (Vector3.Distance(player.transform.position, __instance.transform.position) > (double)__instance.DistanceToBeAffected * BetterSinkholes.config.SlowDistance)
            {
                // If player doesn't have a sinkhole effect don't remove it.
                if (player.TryGetComponent(out PlayerEffectsController pec))
                {
                    CustomPlayerEffects.SinkHole SinkholeEffect = pec.GetEffect <CustomPlayerEffects.SinkHole>();

                    // // If the player has the sinkhole effect, remove it.
                    if (SinkholeEffect != null && SinkholeEffect.Enabled)
                    {
                        componentInParent.DisableEffect <CustomPlayerEffects.SinkHole>();
                    }

                    return(false);
                }

                return(false);
            }

            // Check distance from the sinkhole's center.
            if (Vector3.Distance(player.transform.position, __instance.transform.position) < (double)__instance.DistanceToBeAffected * BetterSinkholes.config.TeleportDistance)
            {
                // Remove Sinkhole effect once falling into a sinkhole.
                componentInParent.DisableEffect <CustomPlayerEffects.SinkHole>();

                // Teleport player once walking too close to the center of a sinkhole.
                ReferenceHub referenceHub = ReferenceHub.GetHub(player);
                referenceHub.playerMovementSync.OverridePosition(Vector3.down * 1998.5f, 0f, true);

                // Apply corrosion effect.
                PlayerEffectsController playerEffectsController = referenceHub.playerEffectsController;
                playerEffectsController.GetEffect <CustomPlayerEffects.Corroding>().IsInPd = true;
                playerEffectsController.EnableEffect <CustomPlayerEffects.Corroding>(0f, false);

                // Send player a broadcast specified in the configs. Default: "" for 0U duration.
                QueryProcessor.Localplayer.GetComponent <Broadcast>().TargetAddElement(player.gameObject.GetComponent <NetworkIdentity>().connectionToClient, BetterSinkholes.config.TeleportMessage, BetterSinkholes.config.TeleportMessageDuration, Broadcast.BroadcastFlags.Normal);
                return(false);
            }

            componentInParent.EnableEffect <CustomPlayerEffects.SinkHole>(0f, false);
            return(false);
        }
Exemplo n.º 5
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);
        }