Ejemplo n.º 1
0
        private static bool ServerKillPlayerPatch(PlayableScps.Scp173 __instance, ReferenceHub target)
        {
            try
            {
                var scp    = __instance.GetPlayer();
                var player = target.GetPlayer();

                if (target == __instance.Hub || player.ClassManager.IsAnyScp() || player.ClassManager.CurClass == RoleType.Spectator)
                {
                    return(false);
                }

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

                SynapseController.Server.Events.Scp.InvokeScpAttack(scp, player, Api.Enum.ScpAttackType.Scp173_Snap, out var allow);

                return(allow);
            }
            catch (Exception e)
            {
                Synapse.Api.Logger.Get.Error($"Synapse-Event: ScpAttackEvent(Scp173) failed!!\n{e}");
                return(true);
            }
        }
Ejemplo n.º 2
0
        private static bool DistanceChanged(SinkholeEnvironmentalHazard __instance, ReferenceHub player)
        {
            try
            {
                var synapseplayer = player.GetPlayer();

                if (Vector3.Distance(synapseplayer.Position, __instance.transform.position) <= __instance.DistanceToBeAffected)
                {
                    var allow = true;
                    if (__instance.SCPImmune && !SynapseExtensions.CanHarmScp(synapseplayer, false) || synapseplayer.GodMode)
                    {
                        allow = false;
                    }

                    Synapse.Api.Events.EventHandler.Get.Player.InvokeSinkhole(synapseplayer, __instance, ref allow);

                    if (allow)
                    {
                        synapseplayer.GiveEffect(Api.Enum.Effect.SinkHole);
                        return(false);
                    }
                }

                synapseplayer.GiveEffect(Api.Enum.Effect.SinkHole, 0);

                return(false);
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: PlayerWalkOnSinkholeEvent failed!!\n{e}");
                return(true);
            }
        }
Ejemplo n.º 3
0
 public void OnDamage(PlayerDamageEventArgs ev)
 {
     if (ev.Killer.RoleID == 682 && SynapseExtensions.CanHarmScp(ev.Killer, false))
     {
         if (SCP682.Config.can_kill_on_oneshot)
         {
             ev.Victim.Kill();
         }
         ev.Killer.Heal(SCP682.Config.heal_hp_when_eat);
     }
 }
Ejemplo n.º 4
0
        private static bool BodyInteract(PlayableScps.Scp049 __instance, byte num, GameObject go)
        {
            if (num != 0)
            {
                return(true);
            }

            try
            {
                if (!__instance._interactRateLimit.CanExecute(true))
                {
                    return(false);
                }
                if (go == null || __instance.RemainingServerKillCooldown > 0f)
                {
                    return(false);
                }

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

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

                if (Vector3.Distance(scp.Position, player.Position) >= PlayableScps.Scp049.AttackDistance * 1.25f)
                {
                    return(false);
                }

                if (Physics.Linecast(scp.Position, player.Position, InventorySystem.Items.MicroHID.MicroHIDItem.WallMask))
                {
                    return(false);
                }

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

                player.PlayerStats.DealDamage(new ScpDamageHandler(scp.Hub, 4949f, DeathTranslations.Scp049));
                GameCore.Console.AddDebugLog("SCPCTRL", "SCP-049 | Sent 'death time' RPC", MessageImportance.LessImportant, false);
                scp.Hub.scpsController.RpcTransmit_Byte(0);
                __instance.RemainingServerKillCooldown = PlayableScps.Scp049.KillCooldown;
                return(false);
            }
            catch (Exception e)
            {
                Synapse.Api.Logger.Get.Error($"Synapse-Event: ScpAttackEvent(Scp049) failed!!\n{e}");
                return(true);
            }
        }
Ejemplo n.º 5
0
        private static bool OnContain(CharacterClassManager __instance)
        {
            try
            {
                if (!NonFacilityCompatibility.currentSceneSettings.enableStandardGamplayItems)
                {
                    return(false);
                }

                foreach (var player in Server.Get.Players)
                {
                    if (player.Hub.isDedicatedServer || !player.Hub.Ready)
                    {
                        continue;
                    }
                    if (Vector3.Distance(player.Position, __instance._lureSpj.transform.position) >= 1.97f)
                    {
                        continue;
                    }
                    if (player.RoleType == RoleType.Spectator || player.Team == Team.SCP)
                    {
                        continue;
                    }
                    if (player.GodMode || !SynapseExtensions.CanHarmScp(player))
                    {
                        continue;
                    }

                    var allow      = true;
                    var closeFemur = FemurBrokePeople + 1 >= Server.Get.Configs.synapseConfiguration.RequiredForFemur;

                    SynapseController.Server.Events.Player.InvokePlayerEnterFemurEvent(player, ref allow, ref closeFemur);

                    if (!allow)
                    {
                        continue;
                    }
                    player.PlayerStats.DealDamage(new UniversalDamageHandler(10000, DeathTranslations.UsedAs106Bait));
                    FemurBrokePeople++;
                    if (closeFemur)
                    {
                        __instance._lureSpj.SetState(__instance._lureSpj.allowContain, true);
                    }
                }

                return(false);
            }
            catch (Exception e)
            {
                SynapseController.Server.Logger.Error($"Synapse-Event: PlayerEnterFemur failed!!\n{e}");
                return(true);
            }
        }
Ejemplo n.º 6
0
 private static bool CheckFF(out bool __result, ReferenceHub attacker, ReferenceHub victim, bool ignoreConfig = false)
 {
     try
     {
         __result = SynapseExtensions.GetHarmPermission(attacker.GetPlayer(), victim.GetPlayer(), ignoreConfig);
         return(false);
     }
     catch (Exception e)
     {
         Synapse.Api.Logger.Get.Error($"Synapse-API: GetShootPermission  failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
         __result = true;
         return(true);
     }
 }
Ejemplo n.º 7
0
        private static bool Prefix(CharacterClassManager __instance)
        {
            try
            {
                if (!NetworkServer.active)
                {
                    return(false);
                }
                if (!NonFacilityCompatibility.currentSceneSettings.enableStandardGamplayItems)
                {
                    return(false);
                }

                foreach (var player in Server.Get.Players)
                {
                    if (!(Vector3.Distance(player.Position, __instance._lureSpj.transform.position) <
                          1.97f))
                    {
                        continue;
                    }
                    if (player.RoleType == RoleType.Spectator || player.GodMode || !SynapseExtensions.CanHarmScp(player))
                    {
                        continue;
                    }
                    var allow = player.Team != Team.SCP;

                    var closeFemur = FemurBrokePeople + 1 >= Server.Get.Configs.SynapseConfiguration.RequiredForFemur;

                    SynapseController.Server.Events.Player.InvokePlayerEnterFemurEvent(player, ref allow, ref closeFemur);

                    if (!allow)
                    {
                        continue;
                    }
                    player.Hurt(10000, DamageTypes.Lure);
                    FemurBrokePeople++;
                    if (closeFemur)
                    {
                        __instance._lureSpj.SetState(true);
                    }
                }

                return(false);
            }
            catch (Exception e)
            {
                SynapseController.Server.Logger.Error($"Synapse-Event: PlayerEnterFemur failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                return(true);
            }
        }
Ejemplo n.º 8
0
        private static bool HurtPlayer(Scp049_2PlayerScript __instance, GameObject plyObj)
        {
            try
            {
                if (!__instance._iawRateLimit.CanExecute(true) || plyObj == null)
                {
                    return(false);
                }

                var scp    = __instance.GetPlayer();
                var player = plyObj?.GetPlayer();

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

                if (!__instance.iAm049_2 || Vector3.Distance(scp.Position, player.Position) > __instance.distance * 1.5f)
                {
                    return(false);
                }

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

                ev.Get.Scp.InvokeScpAttack(scp, player, Api.Enum.ScpAttackType.Scp0492_Scratch, out var allow);

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

                player.PlayerStats.DealDamage(new ScpDamageHandler(scp.Hub, __instance.damage, DeathTranslations.Zombie));
                Hitmarker.SendHitmarker(scp.Connection, 1f);
                scp.ClassManager.RpcPlaceBlood(player.Position, 0, player.RoleType == RoleType.Spectator ? 1.3f : 0.5f);
                return(false);
            }
            catch (Exception e)
            {
                Synapse.Api.Logger.Get.Error($"Synapse-Event: ScpAttackEvent(Scp049-2) failed!!\n{e}");
                return(true);
            }
        }
Ejemplo n.º 9
0
        private static bool Scp939Attack(PlayableScps.Scp939 __instance, GameObject target, out bool __result)
        {
            __result = false;
            try
            {
                var scp = __instance.GetPlayer();

                if (target.TryGetComponent <BreakableWindow>(out var window))
                {
                    window.Damage(50f, new ScpDamageHandler(scp.Hub, 50f, DeathTranslations.Scp939), Vector3.zero);
                    __result = true;
                }
                else
                {
                    var targetplayer = target.GetPlayer();

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

                    ev.Get.Scp.InvokeScpAttack(scp, targetplayer, Api.Enum.ScpAttackType.Scp939_Bite, out var allow);

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

                    targetplayer.PlayerStats.DealDamage(new ScpDamageHandler(scp.Hub, 50f, DeathTranslations.Scp939));
                    scp.ClassManager.RpcPlaceBlood(targetplayer.Position, 0, 2f);

                    targetplayer.PlayerEffectsController.EnableEffect <CustomPlayerEffects.Amnesia>(3f, true);
                    __result = true;
                }

                return(false);
            }
            catch (Exception e)
            {
                Synapse.Api.Logger.Get.Error($"Synapse-Event: ScpAttackEvent(Scp939) failed!!\n{e}");
                return(true);
            }
        }
Ejemplo n.º 10
0
        private static bool OnDamage(HitboxIdentity __instance, DamageHandlerBase handler)
        {
            try
            {
                if (handler is AttackerDamageHandler ahandler)
                {
                    var ply      = __instance.TargetHub.GetPlayer();
                    var attacker = ahandler.Attacker.GetPlayer();
                    Logger.Get.Debug($"{ply == null} - {attacker == null}");
                    return(SynapseExtensions.GetHarmPermission(attacker, ply));
                }
            }
            catch (Exception ex)
            {
                Logger.Get.Error($"Synapse-FF: PlayerDamage failed!!\n{ex}");
            }

            return(true);
        }
Ejemplo n.º 11
0
        private static bool Contain106(PlayerInteract __instance)
        {
            try
            {
                var player = __instance.GetPlayer();
                if (!SynapseExtensions.CanHarmScp(player) || !__instance.CanInteract)
                {
                    return(false);
                }

                var allow = true;
                EventHandler.Get.Scp.Scp106.InvokeScp106ContainmentEvent(player, ref allow);
                return(allow);
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: Scp106Containment failed!!\n{e}");
                return(true);
            }
        }
Ejemplo n.º 12
0
        private void Pickup(Synapse.Api.Events.SynapseEventArguments.PlayerPickUpItemEventArgs ev)
        {
            if (IsScp035Item(ev.Item))
            {
                if (!SynapseExtensions.CanHarmScp(ev.Player) || ev.Player.RoleID == (int)RoleType.Tutorial)
                {
                    ev.Player.SendBroadcast(8, PluginClass.Translation.ActiveTranslation.ScpPickup035);
                }
                else
                {
                    ev.Allow = false;

                    var players = Server.Get.GetPlayers(x => x.RoleID == (int)RoleType.Spectator && !x.OverWatch);

                    if (players.Count == 0)
                    {
                        ev.Player.SendBroadcast(8, PluginClass.Translation.ActiveTranslation.Survived035);
                        RemoveScp035Items(true);
                        return;
                    }

                    players = players.OrderBy(x => x.DeathTime).ToList();

                    Player player;

                    if (PluginClass.Config.DeathTime)
                    {
                        player = players.FirstOrDefault();
                    }
                    else
                    {
                        player = players.ElementAt(UnityEngine.Random.Range(0, players.Count));
                    }

                    player.CustomRole = new Scp035PlayerScript(ev.Player);
                    RemoveScp035Items(true);
                }
            }
        }
Ejemplo n.º 13
0
        private static bool DealDamagePatch(PlayerStats __instance, DamageHandlerBase handler)
        {
            try
            {
                if (!__instance._hub.characterClassManager.IsAlive ||
                    __instance._hub.characterClassManager.GodMode)
                {
                    return(false);
                }

                var standardhandler = handler as StandardDamageHandler;
                var type            = handler.GetDamageType();
                var victim          = __instance.GetPlayer();
                var attacker        = handler is AttackerDamageHandler ahandler?ahandler.Attacker.GetPlayer() : null;

                var damage = standardhandler.Damage;

                if (type == DamageType.PocketDecay)
                {
                    attacker = Server.Get.Players.FirstOrDefault(x => x.Scp106Controller.PocketPlayers.Contains(victim));
                    if (attacker != null && !SynapseExtensions.GetHarmPermission(attacker, victim))
                    {
                        return(false);
                    }
                }

                SynapseController.Server.Events.Player.InvokePlayerDamageEvent(victim, attacker, ref damage, type, out var allow);
                standardhandler.Damage = damage;

                return(allow);
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: PlayerDamage event failed!!\n{e}");
                return(true);
            }
        }
Ejemplo n.º 14
0
        private static bool DistanceChanged(TantrumEnvironmentalHazard __instance, ReferenceHub player)
        {
            try
            {
                if (player == null || __instance.DisableEffect || __instance._correctPosition == null)
                {
                    return(false);
                }

                var synapseplayer = player.GetPlayer();

                if (Vector3.Distance(player.transform.position, __instance._correctPosition.position) > __instance.DistanceToBeAffected)
                {
                    return(false);
                }

                var allow = true;

                if ((__instance.SCPImmune && synapseplayer.Team == (int)Team.SCP) || !SynapseExtensions.CanHarmScp(synapseplayer, false) || synapseplayer.GodMode)
                {
                    allow = false;
                }

                Synapse.Api.Events.EventHandler.Get.Player.InvokeTantrum(synapseplayer, __instance, ref allow);

                if (allow)
                {
                    Synapse.Api.Logger.Get.Debug("ALLOW TANTRUM");
                    synapseplayer.PlayerEffectsController.EnableEffect <CustomPlayerEffects.Stained>(2f, false);
                }

                return(false);
            }
            catch (Exception ex)
            {
                Synapse.Api.Logger.Get.Error("Synapse-Event: PlayerWalkOnSinkholeEvent failed!!\n" + ex);
                return(true);
            }
        }
        public static bool Prefix(Generator079 __instance, GameObject person)
        {
            try
            {
                var player    = person.GetPlayer();
                var generator = __instance.GetGenerator();

                if (player.VanillaInventory == null || __instance._doorAnimationCooldown > 0f || __instance._deniedCooldown > 0f)
                {
                    return(false);
                }

                if (!generator.Locked)
                {
                    var allow = true;
                    if (!generator.Open)
                    {
                        Server.Get.Events.Player.InvokePlayerGeneratorInteractEvent(player, generator, GeneratorInteraction.OpenDoor, ref allow);
                    }
                    else
                    {
                        Server.Get.Events.Player.InvokePlayerGeneratorInteractEvent(player, generator, GeneratorInteraction.CloseDoor, ref allow);
                    }

                    if (!allow)
                    {
                        __instance.RpcDenied();
                        return(false);
                    }

                    generator.Open = !generator.Open;
                    return(false);
                }

                if (!SynapseExtensions.CanHarmScp(player))
                {
                    __instance.RpcDenied();
                    return(false);
                }

                //Unlock The Generator
                var flag = player.Bypass;

                var items = new List <Synapse.Api.Items.SynapseItem>();
                if (Server.Get.Configs.SynapseConfiguration.RemoteKeyCard)
                {
                    items.AddRange(player.Inventory.Items.Where(x => x.ItemCategory == ItemCategory.Keycard));
                }
                else if (player.ItemInHand != null && player.ItemInHand.ItemCategory == ItemCategory.Keycard)
                {
                    items.Add(player.ItemInHand);
                }


                foreach (var item in items)
                {
                    var keycardcanopen = false;
                    var permissions    = player.VanillaInventory.GetItemByID(item.ItemType).permissions;

                    foreach (var t in permissions)
                    {
                        if (t == "ARMORY_LVL_2")
                        {
                            keycardcanopen = true;
                        }
                    }

                    try
                    {
                        Server.Get.Events.Player.InvokePlayerItemUseEvent(player, item, Api.Events.SynapseEventArguments.ItemInteractState.Finalizing, ref keycardcanopen);
                    }
                    catch (Exception e)
                    {
                        Logger.Get.Error($"Synapse-Event: PlayerItemUseEvent(Keycard) failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                    }

                    if (keycardcanopen)
                    {
                        flag = true;
                        break;
                    }
                }

                Server.Get.Events.Player.InvokePlayerGeneratorInteractEvent(player, generator, GeneratorInteraction.Unlocked, ref flag);

                if (flag)
                {
                    generator.Locked = false;
                    return(false);
                }
                __instance.RpcDenied();

                return(false);
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: DoorInteract failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                return(true);
            }
        }
        private static bool Prefix(Generator079 __instance, GameObject person, PlayerInteract.Generator079Operations command)
        {
            try
            {
                var player    = person.GetPlayer();
                var generator = __instance.GetGenerator();

                switch (command)
                {
                case PlayerInteract.Generator079Operations.Tablet:

                    if (generator.IsTabletConnected || !generator.Open || __instance._localTime <= 0f || Generator079.mainGenerator.forcedOvercharge || !SynapseExtensions.CanHarmScp(player))
                    {
                        return(false);
                    }

                    Inventory component = person.GetComponent <Inventory>();

                    using (SyncList <Inventory.SyncItemInfo> .SyncListEnumerator enumerator = component.items.GetEnumerator())
                    {
                        while (enumerator.MoveNext())
                        {
                            Inventory.SyncItemInfo syncItemInfo = enumerator.Current;
                            if (syncItemInfo.id == ItemType.WeaponManagerTablet)
                            {
                                bool allow2 = true;
                                var  item   = syncItemInfo.GetSynapseItem();
                                Server.Get.Events.Player.InvokePlayerGeneratorInteractEvent(player, generator, GeneratorInteraction.TabletInjected, ref allow2);
                                Server.Get.Events.Player.InvokePlayerItemUseEvent(player, item, Api.Events.SynapseEventArguments.ItemInteractState.Finalizing, ref allow2);
                                if (!allow2)
                                {
                                    break;
                                }

                                generator.ConnectedTablet = item;
                                break;
                            }
                        }
                    }
                    return(false);

                case PlayerInteract.Generator079Operations.Cancel:
                    if (!generator.IsTabletConnected)
                    {
                        return(false);
                    }

                    bool allow = true;
                    Server.Get.Events.Player.InvokePlayerGeneratorInteractEvent(player, generator, GeneratorInteraction.TabledEjected, ref allow);
                    return(allow);
                }
                return(true);
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: PlayerGenerator failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                return(true);
            }
        }
Ejemplo n.º 17
0
        private static bool HitObject(PlayableScps.Scp096 __instance, GameObject target, out bool __result)
        {
            try
            {
                __result = false;

                if (target.TryGetComponent <BreakableWindow>(out var window))
                {
                    __result = window.Damage(500f, new Scp096DamageHandler(__instance, 500f, Scp096DamageHandler.AttackType.Slap), target.transform.position);
                    return(false);
                }

                if (target.TryGetComponent <DoorVariant>(out var door) && (object)door is IDamageableDoor damageable && !door.IsConsideredOpen())
                {
                    __result = damageable.ServerDamage(250f, DoorDamageType.Scp096);
                    return(false);
                }

                if (!ReferenceHub.TryGetHub(target, out var hub) || hub == null || hub == __instance.Hub || hub.characterClassManager.IsAnyScp())
                {
                    return(false);
                }

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

                if (Physics.Linecast(scp.Position, player.Position, PlayableScps.Scp096._solidObjectMask))
                {
                    return(false);
                }

                if (Vector3.Distance(scp.Position, player.Position) > 5f)
                {
                    return(false);
                }

                if (!SynapseExtensions.GetHarmPermission(scp, player))
                {
                    return(false);
                }
                try
                {
                    ev.Get.Scp.InvokeScpAttack(scp, player, Api.Enum.ScpAttackType.Scp096_Tear, out var allow);
                    if (!allow)
                    {
                        return(false);
                    }
                }
                catch (Exception e)
                {
                    Synapse.Api.Logger.Get.Error($"Synapse-Event: ScpAttackEvent(Scp096-Charge) failed!!\n{e}");
                }

                if (hub.playerStats.DealDamage(new Scp096DamageHandler(__instance, 9696f, Scp096DamageHandler.AttackType.Slap)))
                {
                    __instance._targets.Remove(hub);
                    NetworkServer.SendToAll(default(PlayableScps.Messages.Scp096OnKillMessage), 0, false);
                }

                __result = true;
                return(false);
            }
            catch (Exception e)
            {
                Synapse.Api.Logger.Get.Error($"Synapse-Event: ScpAttackEvent(HitObject) failed!!\n{e}");
                __result = false;
                return(true);
            }
        }
Ejemplo n.º 18
0
        private static bool OnInteract(Scp079Generator __instance, ReferenceHub ply, byte colliderId)
        {
            try
            {
                var gen    = __instance.GetGenerator();
                var player = ply.GetPlayer();

                if (__instance._cooldownStopwatch.IsRunning && __instance._cooldownStopwatch.Elapsed.TotalSeconds < __instance._targetCooldown)
                {
                    return(false);
                }

                if (colliderId != 0 && !gen.Open)
                {
                    return(false);
                }

                __instance._cooldownStopwatch.Stop();

                switch (colliderId)
                {
                case 0:
                    if (!gen.Locked)
                    {
                        var allow = true;
                        Server.Get.Events.Player.InvokePlayerGeneratorInteractEvent(player, gen,
                                                                                    gen.Open ? GeneratorInteraction.CloseDoor : GeneratorInteraction.OpenDoor, ref allow);

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

                        gen.Open = !gen.Open;
                        __instance._targetCooldown = __instance._doorToggleCooldownTime;
                    }
                    else
                    {
                        if (!SynapseExtensions.CanHarmScp(player))
                        {
                            __instance.RpcDenied();
                            return(false);
                        }

                        var items = new List <SynapseItem>();
                        if (player.ItemInHand.ID != -1)
                        {
                            items.Add(player.ItemInHand);
                        }

                        if (Server.Get.Configs.synapseConfiguration.RemoteKeyCard)
                        {
                            items.AddRange(player.Inventory.Items.Where(x => x != player.ItemInHand));
                        }

                        var canOpen = false;

                        foreach (var item in items.Where(x => x.ItemCategory == ItemCategory.Keycard))
                        {
                            if ((item.ItemBase as KeycardItem).Permissions.HasFlagFast(__instance._requiredPermission))
                            {
                                canOpen = true;
                                Server.Get.Events.Player.InvokePlayerItemUseEvent(player, item, Api.Events.SynapseEventArguments.ItemInteractState.Finalizing, ref canOpen);
                                break;
                            }
                        }

                        Server.Get.Events.Player.InvokePlayerGeneratorInteractEvent(player, gen, GeneratorInteraction.Unlocked, ref canOpen);

                        if (canOpen)
                        {
                            gen.Locked = false;
                        }
                        else
                        {
                            __instance.RpcDenied();
                        }

                        __instance._targetCooldown = __instance._unlockCooldownTime;
                    }
                    break;

                case 1:
                    if ((__instance.Activating || SynapseExtensions.CanHarmScp(player)) && !__instance.Engaged)
                    {
                        var allow = true;
                        Server.Get.Events.Player.InvokePlayerGeneratorInteractEvent(player, gen,
                                                                                    gen.Active ? GeneratorInteraction.Disabled : GeneratorInteraction.Activated, ref allow);

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

                        __instance.Activating = !__instance.Activating;

                        if (__instance.Activating)
                        {
                            __instance._leverStopwatch.Restart();
                        }

                        __instance._targetCooldown = __instance._doorToggleCooldownTime;
                    }
                    break;

                case 2:
                    if (__instance.Activating && !__instance.Engaged)
                    {
                        var allow = true;
                        Server.Get.Events.Player.InvokePlayerGeneratorInteractEvent(player, gen,
                                                                                    GeneratorInteraction.Disabled, ref allow);

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

                        gen.Active = false;
                        __instance._targetCooldown = __instance._unlockCooldownTime;
                    }
                    break;


                default:
                    __instance._targetCooldown = 1;
                    break;
                }

                __instance._cooldownStopwatch.Restart();

                return(false);
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: PlayerGeneratorInteract event failed!!\n{e}");
                return(true);
            }
        }
Ejemplo n.º 19
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);
            }
        }
Ejemplo n.º 20
0
        private static bool TransmitData(PlayerPositionManager __instance)
        {
            try
            {
                __instance._frame++;

                if (__instance._frame != __instance._syncFrequency)
                {
                    return(false);
                }

                __instance._frame = 0;

                var players = Server.Get.Players;
                players.AddRange(Synapse.Api.Map.Get.Dummies.Select(x => x.Player));
                __instance._usedData = players.Count;

                if (__instance.ReceivedData == null || __instance.ReceivedData.Length < __instance._usedData)
                {
                    __instance.ReceivedData = new PlayerPositionData[__instance._usedData * 2];
                }

                for (var i = 0; i < __instance._usedData; i++)
                {
                    __instance.ReceivedData[i] = new PlayerPositionData(players[i].Hub);
                }

                if (__instance._transmitBuffer == null || __instance._transmitBuffer.Length < __instance._usedData)
                {
                    __instance._transmitBuffer = new PlayerPositionData[__instance._usedData * 2];
                }

                foreach (var player in players)
                {
                    if (player.Connection == null)
                    {
                        continue;
                    }

                    Array.Copy(__instance.ReceivedData, __instance._transmitBuffer, __instance._usedData);
                    for (int k = 0; k < __instance._usedData; k++)
                    {
                        var showinvoid   = false;
                        var playerToShow = players[k];
                        if (playerToShow == player)
                        {
                            continue;
                        }

                        var vector = __instance._transmitBuffer[k].position - player.Position;

                        if (player.RoleType == RoleType.Spectator)
                        {
                            continue;
                        }

                        if (player.RoleType == RoleType.Scp173)
                        {
                            if (player.Scp173Controller.IgnoredPlayers.Contains(playerToShow))
                            {
                                showinvoid = true;
                                goto AA_001;
                            }
                            else if ((playerToShow.RealTeam == Team.SCP && player.CustomRole != null && !Server.Get.Configs.synapseConfiguration.ScpTrigger173) || Server.Get.Configs.synapseConfiguration.CantLookAt173.Contains(playerToShow.RoleID) || player.Scp173Controller.TurnedPlayers.Contains(playerToShow) || playerToShow.Invisible)
                            {
                                var posinfo = __instance._transmitBuffer[k];
                                var rot     = Quaternion.LookRotation(playerToShow.Position - player.Position).eulerAngles.y;
                                __instance._transmitBuffer[k] = new PlayerPositionData(posinfo.position, rot, posinfo.playerID);
                            }
                        }
                        else if (player.RoleID == (int)RoleType.Scp93953 || player.RoleID == (int)RoleType.Scp93989)
                        {
                            if (__instance._transmitBuffer[k].position.y < 800f && SynapseExtensions.CanHarmScp(playerToShow, false) && playerToShow.RealTeam != Team.RIP && !playerToShow.GetComponent <Scp939_VisionController>().CanSee(player.PlayerEffectsController.GetEffect <CustomPlayerEffects.Visuals939>()))
                            {
                                showinvoid = true;
                                goto AA_001;
                            }
                        }

                        if (playerToShow.Invisible && !player.HasPermission("synapse.see.invisible"))
                        {
                            showinvoid = true;
                            goto AA_001;
                        }

                        if (Math.Abs(vector.y) > 35f)
                        {
                            showinvoid = true;
                            goto AA_001;
                        }
                        else
                        {
                            var sqrMagnitude = vector.sqrMagnitude;
                            if (player.Position.y < 800f)
                            {
                                if (sqrMagnitude >= 1764f)
                                {
                                    showinvoid = true;
                                    goto AA_001;
                                }
                            }
                            else if (sqrMagnitude >= 7225f)
                            {
                                showinvoid = true;
                                goto AA_001;
                            }

                            if (playerToShow != null)
                            {
                                var scp = player.Hub.scpsController.CurrentScp as Scp096;

                                if (scp != null && scp.Enraged && !scp.HasTarget(playerToShow.Hub) && SynapseExtensions.CanHarmScp(playerToShow, false))
                                {
                                    showinvoid = true;
                                    goto AA_001;
                                }
                                if (playerToShow.Hub.playerEffectsController.GetEffect <Invisible>().IsEnabled)
                                {
                                    var flag = false;
                                    if (scp != null)
                                    {
                                        flag = scp.HasTarget(playerToShow.Hub);
                                    }

                                    if (player.RoleType == RoleType.Scp079 || flag)
                                    {
                                        if (Server.Get.Configs.synapseConfiguration.Better268)
                                        {
                                            showinvoid = true;
                                        }
                                    }
                                    else
                                    {
                                        showinvoid = true;
                                    }
                                }
                            }
                        }


AA_001:

                        var posData = __instance._transmitBuffer[k];
                        var rotation = posData.rotation;
                        var pos      = posData.position;

                        Server.Get.Events.Server.InvokeTransmitPlayerDataEvent(player, playerToShow, ref pos, ref rotation, ref showinvoid);

                        if (showinvoid)
                        {
                            __instance._transmitBuffer[k] = new PlayerPositionData(Vector3.up * 6000f, 0.0f, playerToShow.PlayerId);
                        }
                        else
                        {
                            __instance._transmitBuffer[k] = new PlayerPositionData(pos, rotation, playerToShow.PlayerId);
                        }
                    }


                    var conn = player.Connection;
                    if (__instance._usedData <= 20)
                    {
                        conn.Send(new PositionPPMMessage(__instance._transmitBuffer, (byte)__instance._usedData, 0), 1);
                    }
                    else
                    {
                        byte b = 0;
                        while ((int)b < __instance._usedData / 20)
                        {
                            conn.Send(new PositionPPMMessage(__instance._transmitBuffer, 20, b), 1);
                            b += 1;
                        }

                        byte b2 = (byte)(__instance._usedData % (int)(b * 20));

                        if (b2 > 0)
                        {
                            conn.Send(new PositionPPMMessage(__instance._transmitBuffer, b2, b), 1);
                        }
                    }
                }

                return(false);
            }
            catch (Exception e)
            {
                Api.Logger.Get.Error($"Synapse-InvisibleMode: TransmitData failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                return(true);
            }
        }
Ejemplo n.º 21
0
        private static bool Prefix(PlayerStats __instance, out bool __result, PlayerStats.HitInfo info, GameObject go, bool noTeamDamage = false, bool IsValidDamage = true)
        {
            try
            {
                __result = false;
                var player = go?.GetPlayer();
                var killer = __instance?.GetPlayer();
                if (player == null)
                {
                    return(false);
                }

                if (info.GetDamageType() == DamageTypes.Grenade)
                {
                    killer = SynapseController.Server.GetPlayer(info.PlayerId);
                }
                else if (info.GetDamageType() == DamageTypes.Pocket)
                {
                    killer = Server.Get.Players.FirstOrDefault(x => x.Scp106Controller.PocketPlayers.Contains(player));

                    if (SynapseExtensions.CanNotHurtByScp(player))
                    {
                        return(false);
                    }
                }

                bool         flag         = false;
                bool         flag2        = false;
                bool         flag3        = go == null;
                ReferenceHub referenceHub = flag3 ? null : ReferenceHub.GetHub(go);

                if (info.Amount < 0f)
                {
                    if (flag3)
                    {
                        info.Amount = Mathf.Abs(999999f);
                    }
                    else
                    {
                        info.Amount = ((referenceHub.playerStats != null) ? Mathf.Abs(referenceHub.playerStats.Health + referenceHub.playerStats.syncArtificialHealth + 10f) : Mathf.Abs(999999f));
                    }
                }

                if (__instance._burned.Enabled)
                {
                    info.Amount *= __instance._burned.DamageMult;
                }

                if (info.Amount > 2.14748365E+09f)
                {
                    info.Amount = 2.14748365E+09f;
                }

                if (info.GetDamageType().isWeapon&& referenceHub.characterClassManager.IsAnyScp() && info.GetDamageType() != DamageTypes.MicroHid)
                {
                    info.Amount *= __instance.weaponManager.weapons[(int)__instance.weaponManager.curWeapon].scpDamageMultiplier;
                }

                if (flag3)
                {
                    __result = false;
                    return(false);
                }

                PlayerStats           playerStats           = referenceHub.playerStats;
                CharacterClassManager characterClassManager = referenceHub.characterClassManager;

                if (playerStats == null || characterClassManager == null)
                {
                    __result = false;
                    return(false);
                }

                if (characterClassManager.GodMode)
                {
                    __result = false;
                    return(false);
                }

                if (__instance.ccm.CurRole.team == Team.SCP && __instance.ccm.Classes.SafeGet(characterClassManager.CurClass).team == Team.SCP && __instance.ccm != characterClassManager)
                {
                    __result = false;
                    return(false);
                }

                if (characterClassManager.SpawnProtected && !__instance._allowSPDmg)
                {
                    __result = false;
                    return(false);
                }

                bool flag4 = !noTeamDamage && info.IsPlayer && referenceHub != info.RHub && referenceHub.characterClassManager.Fraction == info.RHub.characterClassManager.Fraction;

                if (flag4)
                {
                    info.Amount *= PlayerStats.FriendlyFireFactor;
                }

                float health = playerStats.Health;

                if (__instance.lastHitInfo.Attacker == "ARTIFICIALDEGEN")
                {
                    playerStats.unsyncedArtificialHealth -= info.Amount;
                    if (playerStats.unsyncedArtificialHealth < 0f)
                    {
                        playerStats.unsyncedArtificialHealth = 0f;
                    }
                }
                else
                {
                    var allow = true;
                    try
                    {
                        Server.Get.Events.Player.InvokePlayerDamageEvent(player, killer, ref info, out allow);
                    }
                    catch (Exception e)
                    {
                        SynapseController.Server.Logger.Error($"Synapse-Event: PlayerDamage Event failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                    }

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

                    if (playerStats.unsyncedArtificialHealth > 0f)
                    {
                        float num  = info.Amount * playerStats.artificialNormalRatio;
                        float num2 = info.Amount - num;
                        playerStats.unsyncedArtificialHealth -= num;
                        if (playerStats.unsyncedArtificialHealth < 0f)
                        {
                            num2 += Mathf.Abs(playerStats.unsyncedArtificialHealth);
                            playerStats.unsyncedArtificialHealth = 0f;
                        }
                        playerStats.Health -= num2;
                        if (playerStats.Health > 0f && playerStats.Health - num <= 0f && characterClassManager.CurRole.team != Team.SCP)
                        {
                            __instance.TargetAchieve(characterClassManager.connectionToClient, "didntevenfeelthat");
                        }
                    }
                    else
                    {
                        playerStats.Health -= info.Amount;
                    }

                    if (playerStats.Health < 0f)
                    {
                        playerStats.Health = 0f;
                    }

                    playerStats.lastHitInfo = info;
                }
                PlayableScpsController component = go.GetComponent <PlayableScpsController>();
                if (component != null && (object)component.CurrentScp is PlayableScps.Interfaces.IDamagable damagable)
                {
                    damagable.OnDamage(info);
                }

                if (playerStats.Health < 1f && characterClassManager.CurClass != RoleType.Spectator)
                {
                    if (component != null && (object)component.CurrentScp is PlayableScps.Interfaces.IImmortalScp immortalScp && !immortalScp.OnDeath(info, __instance.gameObject))
                    {
                        __result = false;
                        return(false);
                    }
                    foreach (Scp079PlayerScript scp079PlayerScript in Scp079PlayerScript.instances)
                    {
                        Scp079Interactable.ZoneAndRoom otherRoom = go.GetComponent <Scp079PlayerScript>().GetOtherRoom();
                        bool flag5 = false;
                        foreach (Scp079Interaction scp079Interaction in scp079PlayerScript.ReturnRecentHistory(12f, __instance._filters))
                        {
                            foreach (Scp079Interactable.ZoneAndRoom zoneAndRoom in scp079Interaction.interactable.currentZonesAndRooms)
                            {
                                if (zoneAndRoom.currentZone == otherRoom.currentZone && zoneAndRoom.currentRoom == otherRoom.currentRoom)
                                {
                                    flag5 = true;
                                }
                            }
                        }

                        if (flag5)
                        {
                            scp079PlayerScript.RpcGainExp(ExpGainType.KillAssist, characterClassManager.CurClass);
                        }
                    }

                    if (RoundSummary.RoundInProgress() && RoundSummary.roundTime < 60 && IsValidDamage)
                    {
                        __instance.TargetAchieve(characterClassManager.connectionToClient, "wowreally");
                    }

                    if (__instance.isLocalPlayer && info.PlayerId != referenceHub.queryProcessor.PlayerId)
                    {
                        RoundSummary.Kills++;
                    }

                    flag = true;

                    if (characterClassManager.CurClass == RoleType.Scp096)
                    {
                        ReferenceHub hub = ReferenceHub.GetHub(go);

                        if (hub != null && hub.scpsController.CurrentScp is PlayableScps.Scp096 && (hub.scpsController.CurrentScp as PlayableScps.Scp096).PlayerState == PlayableScps.Scp096PlayerState.Enraging)
                        {
                            __instance.TargetAchieve(characterClassManager.connectionToClient, "unvoluntaryragequit");
                        }
                    }
                    else if (info.GetDamageType() == DamageTypes.Pocket)
                    {
                        __instance.TargetAchieve(characterClassManager.connectionToClient, "newb");
                    }
                    else if (info.GetDamageType() == DamageTypes.Scp173)
                    {
                        __instance.TargetAchieve(characterClassManager.connectionToClient, "firsttime");
                    }
                    else if (info.GetDamageType() == DamageTypes.Grenade && info.PlayerId == referenceHub.queryProcessor.PlayerId)
                    {
                        __instance.TargetAchieve(characterClassManager.connectionToClient, "iwanttobearocket");
                    }
                    else if (info.GetDamageType().isWeapon)
                    {
                        Inventory inventory = referenceHub.inventory;
                        if (characterClassManager.CurClass == RoleType.Scientist)
                        {
                            Item itemByID = inventory.GetItemByID(inventory.curItem);
                            if (itemByID != null && itemByID.itemCategory == ItemCategory.Keycard && __instance.GetComponent <CharacterClassManager>().CurClass == RoleType.ClassD)
                            {
                                __instance.TargetAchieve(__instance.connectionToClient, "betrayal");
                            }
                        }

                        if (Time.realtimeSinceStartup - __instance._killStreakTime > 30f || __instance._killStreak == 0)
                        {
                            __instance._killStreak     = 0;
                            __instance._killStreakTime = Time.realtimeSinceStartup;
                        }

                        if (__instance.GetComponent <WeaponManager>().GetShootPermission(characterClassManager, true))
                        {
                            __instance._killStreak++;
                        }

                        if (__instance._killStreak >= 5)
                        {
                            __instance.TargetAchieve(__instance.connectionToClient, "pewpew");
                        }

                        if ((__instance.ccm.CurRole.team == Team.MTF || __instance.ccm.Classes.SafeGet(__instance.ccm.CurClass).team == Team.RSC) && characterClassManager.CurClass == RoleType.ClassD)
                        {
                            __instance.TargetStats(__instance.connectionToClient, "dboys_killed", "justresources", 50);
                        }
                    }
                    else if (__instance.ccm.CurRole.team == Team.SCP && go.GetComponent <MicroHID>().CurrentHidState != MicroHID.MicroHidState.Idle)
                    {
                        __instance.TargetAchieve(__instance.connectionToClient, "illpassthanks");
                    }

                    if (player.RealTeam == Team.RSC && player.RealTeam == Team.SCP)
                    {
                        __instance.TargetAchieve(__instance.connectionToClient, "timetodoitmyself");
                    }

                    bool flag6 = info.IsPlayer && referenceHub == info.RHub;
                    flag2 = flag4;

                    if (flag6)
                    {
                        ServerLogs.AddLog(ServerLogs.Modules.ClassChange, string.Concat(new string[]
                        {
                            referenceHub.LoggedNameFromRefHub(),
                            " playing as ",
                            referenceHub.characterClassManager.CurRole.fullName,
                            " committed a suicide using ",
                            info.GetDamageName(),
                            "."
                        }), ServerLogs.ServerLogType.Suicide, false);
                    }
                    else
                    {
                        ServerLogs.AddLog(ServerLogs.Modules.ClassChange, string.Concat(new string[]
                        {
                            referenceHub.LoggedNameFromRefHub(),
                            " playing as ",
                            referenceHub.characterClassManager.CurRole.fullName,
                            " has been killed by ",
                            info.Attacker,
                            " using ",
                            info.GetDamageName(),
                            info.IsPlayer ? (" playing as " + info.RHub.characterClassManager.CurRole.fullName + ".") : "."
                        }), flag2 ? ServerLogs.ServerLogType.Teamkill : ServerLogs.ServerLogType.KillLog, false);
                    }

                    if (info.GetDamageType().isScp || info.GetDamageType() == DamageTypes.Pocket)
                    {
                        RoundSummary.kills_by_scp++;
                    }

                    else if (info.GetDamageType() == DamageTypes.Grenade)
                    {
                        RoundSummary.kills_by_frag++;
                    }

                    try
                    {
                        Server.Get.Events.Player.InvokePlayerDeathEvent(player, killer, info);
                    }

                    catch (Exception e)
                    {
                        SynapseController.Server.Logger.Error($"Synapse-Event: PlayerDeath Event failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                    }

                    if (!__instance._pocketCleanup || info.GetDamageType() != DamageTypes.Pocket)
                    {
                        referenceHub.inventory.ServerDropAll();
                        PlayerMovementSync playerMovementSync = referenceHub.playerMovementSync;
                        if (characterClassManager.Classes.CheckBounds(characterClassManager.CurClass) && info.GetDamageType() != DamageTypes.RagdollLess)
                        {
                            __instance.GetComponent <RagdollManager>().SpawnRagdoll(go.transform.position, go.transform.rotation, (playerMovementSync == null) ? Vector3.zero : playerMovementSync.PlayerVelocity, (int)characterClassManager.CurClass, info, characterClassManager.CurRole.team > Team.SCP, go.GetComponent <Dissonance.Integrations.MirrorIgnorance.MirrorIgnorancePlayer>().PlayerId, referenceHub.nicknameSync.DisplayName, referenceHub.queryProcessor.PlayerId);
                        }
                    }
                    else
                    {
                        referenceHub.inventory.Clear();
                    }

                    characterClassManager.NetworkDeathPosition = go.transform.position;

                    if (characterClassManager.CurRole.team == Team.SCP)
                    {
                        if (characterClassManager.CurClass == RoleType.Scp0492)
                        {
                            NineTailedFoxAnnouncer.CheckForZombies(go);
                        }
                        else
                        {
                            GameObject x = null;
                            foreach (GameObject gameObject in PlayerManager.players)
                            {
                                if (gameObject.GetComponent <RemoteAdmin.QueryProcessor>().PlayerId == info.PlayerId)
                                {
                                    x = gameObject;
                                }
                            }
                            if (x != null)
                            {
                                NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, string.Empty);
                            }
                            else
                            {
                                DamageTypes.DamageType damageType = info.GetDamageType();
                                if (damageType == DamageTypes.Tesla)
                                {
                                    NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, "TESLA");
                                }
                                else if (damageType == DamageTypes.Nuke)
                                {
                                    NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, "WARHEAD");
                                }
                                else if (damageType == DamageTypes.Decont)
                                {
                                    NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, "DECONTAMINATION");
                                }
                                else if (characterClassManager.CurClass != RoleType.Scp079)
                                {
                                    NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, "UNKNOWN");
                                }
                            }
                        }
                    }

                    playerStats.SetHPAmount(100);
                    characterClassManager.SetClassID(RoleType.Spectator);

                    player.CustomRole = null;
                    foreach (var larry in Server.Get.Players.Where(x => x.Scp106Controller.PocketPlayers.Contains(player)))
                    {
                        larry.Scp106Controller.PocketPlayers.Remove(player);
                    }
                }
                else
                {
                    Vector3 pos  = Vector3.zero;
                    float   num3 = 40f;
                    if (info.GetDamageType().isWeapon)
                    {
                        GameObject playerOfID = __instance.GetPlayerOfID(info.PlayerId);
                        if (playerOfID != null)
                        {
                            pos  = go.transform.InverseTransformPoint(playerOfID.transform.position).normalized;
                            num3 = 100f;
                        }
                    }
                    else if (info.GetDamageType() == DamageTypes.Pocket)
                    {
                        PlayerMovementSync component2 = __instance.ccm.GetComponent <PlayerMovementSync>();
                        if (component2.RealModelPosition.y > -1900f)
                        {
                            component2.OverridePosition(Vector3.down * 1998.5f, 0f, true);
                        }
                    }
                    __instance.TargetBloodEffect(go.GetComponent <NetworkIdentity>().connectionToClient, pos, Mathf.Clamp01(info.Amount / num3));
                }
                Respawning.RespawnTickets singleton = Respawning.RespawnTickets.Singleton;
                Team team = characterClassManager.CurRole.team;
                byte b    = (byte)team;
                if (b != 0)
                {
                    if (b == 3)
                    {
                        if (flag)
                        {
                            Team team2 = __instance.ccm.Classes.SafeGet(characterClassManager.CurClass).team;
                            if (team2 == Team.CDP && team2 == Team.CHI)
                            {
                                singleton.GrantTickets(Respawning.SpawnableTeamType.ChaosInsurgency, __instance._respawn_tickets_ci_scientist_died_count, false);
                            }
                        }
                    }
                }
                else if (characterClassManager.CurClass != RoleType.Scp0492)
                {
                    for (float num4 = 1f; num4 > 0f; num4 -= __instance._respawn_tickets_mtf_scp_hurt_interval)
                    {
                        float num5 = (float)playerStats.maxHP * num4;
                        if (health > num5 && playerStats.Health < num5)
                        {
                            singleton.GrantTickets(Respawning.SpawnableTeamType.NineTailedFox, __instance._respawn_tickets_mtf_scp_hurt_count, false);
                        }
                    }
                }

                if (component != null && (object)component.CurrentScp is PlayableScps.Interfaces.IDamagable damagable2)
                {
                    damagable2.OnDamage(info);
                }

                if (!flag4 || FriendlyFireConfig.PauseDetector || PermissionsHandler.IsPermitted(info.RHub.serverRoles.Permissions, PlayerPermissions.FriendlyFireDetectorImmunity))
                {
                    __result = flag;
                    return(false);
                }

                if (FriendlyFireConfig.IgnoreClassDTeamkills && referenceHub.characterClassManager.CurRole.team == Team.CDP && info.RHub.characterClassManager.CurRole.team == Team.CDP)
                {
                    __result = flag;
                    return(false);
                }

                if (flag2)
                {
                    if (info.RHub.FriendlyFireHandler.Respawn.RegisterKill())
                    {
                        __result = flag;
                        return(false);
                    }
                    if (info.RHub.FriendlyFireHandler.Window.RegisterKill())
                    {
                        __result = flag;
                        return(false);
                    }
                    if (info.RHub.FriendlyFireHandler.Life.RegisterKill())
                    {
                        __result = flag;
                        return(false);
                    }
                    if (info.RHub.FriendlyFireHandler.Round.RegisterKill())
                    {
                        __result = flag;
                        return(false);
                    }
                }

                if (info.RHub.FriendlyFireHandler.Respawn.RegisterDamage(info.Amount))
                {
                    __result = flag;
                    return(false);
                }

                if (info.RHub.FriendlyFireHandler.Window.RegisterDamage(info.Amount))
                {
                    __result = flag;
                    return(false);
                }

                if (info.RHub.FriendlyFireHandler.Life.RegisterDamage(info.Amount))
                {
                    __result = flag;
                    return(false);
                }

                info.RHub.FriendlyFireHandler.Round.RegisterDamage(info.Amount);
                __result = flag;
                return(false);
            }
            catch (Exception e)
            {
                SynapseController.Server.Logger.Error($"Synapse-Event: PlayerDamage Patch failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                __result = false;
                return(true);
            }
        }
Ejemplo n.º 22
0
 public void SendRAConsoleMessage(string message, bool success = true, RaCategory type = RaCategory.None) => SynapseExtensions.RaMessage(CommandSender, message, success, type);
Ejemplo n.º 23
0
        private static bool TriggerEnter(PocketDimensionTeleport __instance, Collider other)
        {
            try
            {
                var component = other.GetComponent <NetworkIdentity>();
                if (component == null)
                {
                    return(false);
                }

                var type   = __instance._type;
                var player = component.GetPlayer();
                var pos    = Vector3.zero;
                if (player == null)
                {
                    return(false);
                }

                var forceEscape = !SynapseExtensions.CanHarmScp(player, false);
                if (player.Hub.scp106PlayerScript.GrabbedPosition == Vector3.zero)
                {
                    player.Hub.scp106PlayerScript.GrabbedPosition = new Vector3(0f, -1997f, 0f);
                }

                var identifier = MapGeneration.RoomIdUtils.RoomAtPosition(player.Hub.scp106PlayerScript.GrabbedPosition);
                if (identifier.Zone == FacilityZone.Surface)
                {
                    foreach (var player2 in Server.Get.Players)
                    {
                        if (player2.RoleType == RoleType.Scp106)
                        {
                            Vector3 objPos = (player2 == null)
                                ? Vector3.zero
                                : player2.PlayerMovementSync.RealModelPosition;
                            SafeTeleportPosition componentInChildren = identifier.GetComponentInChildren <SafeTeleportPosition>();
                            float num  = Vector3.Distance(objPos, componentInChildren.SafePositions[0].position);
                            float num2 = Vector3.Distance(objPos, componentInChildren.SafePositions[1].position);
                            pos = (num2 < num) ? componentInChildren.SafePositions[0].position : componentInChildren.SafePositions[1].position;
                            break;
                        }
                    }
                }
                else
                {
                    var hashSet = MapGeneration.RoomIdUtils.FindRooms(MapGeneration.RoomName.Unnamed, identifier.Zone, MapGeneration.RoomShape.Undefined);

                    /*hashSet.RemoveWhere((MapGeneration.RoomIdentifier room) =>
                     * room.Name == MapGeneration.RoomName.Hcz106 || room.Name == MapGeneration.RoomName.EzGateA ||
                     * room.Name == MapGeneration.RoomName.EzGateB || room.Name == MapGeneration.RoomName.EzEvacShelter ||
                     * (room.Zone == MapGeneration.FacilityZone.LightContainment && room.Shape == MapGeneration.RoomShape.Curve) ||
                     * room.Zone == MapGeneration.FacilityZone.None || room.Name == MapGeneration.RoomName.Pocket ||
                     * room.Name == MapGeneration.RoomName.HczTesla);*/

                    try
                    {
                        while (hashSet.Count > 0)
                        {
                            MapGeneration.RoomIdentifier roomIdentifier2 = hashSet.ElementAt(UnityEngine.Random.Range(0, hashSet.Count));
                            var safepos      = roomIdentifier2.transform.position;
                            var safeTeleport = roomIdentifier2.GetComponentInChildren <SafeTeleportPosition>();
                            if (safeTeleport != null && safeTeleport.SafePositions?.Length != 0)
                            {
                                safepos = safeTeleport.SafePositions[UnityEngine.Random.Range(0, safeTeleport.SafePositions.Length)].position;
                            }

                            if (PlayerMovementSync.FindSafePosition(safepos, out pos, false, true))
                            {
                                break;
                            }
                            hashSet.Remove(roomIdentifier2);
                        }
                    }
                    catch (Exception ex)
                    {
                        //I don't know how but for some Reason this fails sometimes and the method is called a second time
                        //Logger.Get.Debug(ex);
                        return(false);
                    }
                }
                EventHandler.Get.Scp.Scp106.InvokePocketDimensionLeaveEvent(player, ref pos, ref type, out var allow);

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

                if (!forceEscape && (type == PocketDimensionTeleport.PDTeleportType.Killer || Synapse.Api.Nuke.Get.Detonated))
                {
                    player.PlayerStats.DealDamage(new UniversalDamageHandler(-1f, DeathTranslations.PocketDecay));
                    return(false);
                }
                else
                {
                    player.Position = pos;
                    player.PlayerEffectsController.EnableEffect <CustomPlayerEffects.Disabled>(10f, true);
                    player.PlayerEffectsController.GetEffect <CustomPlayerEffects.Corroding>().Intensity = 0;
                    Achievements.AchievementHandlerBase.ServerAchieve(component.connectionToClient, AchievementName.LarryFriend);
                }
                MapGeneration.ImageGenerator.pocketDimensionGenerator.GenerateRandom();

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