예제 #1
0
        private static IEnumerator <float> SpawnGrenadesSurface()
        {
            yield return(Timing.WaitForSeconds(GrenadeRun.Instance.Config.GrenadeDelaySurface));

            while (GrenadeRun.Instance.GrenadeRound)
            {
                foreach (Exiled.API.Features.Player player in Exiled.API.Features.Player.List)
                {
                    if (player.Role == RoleType.ClassD && player.Position.y > SurfaceBound)
                    {
                        GrenadeManager  gm      = player.ReferenceHub.GetComponent <GrenadeManager>();
                        GrenadeSettings grenade = gm.availableGrenades.FirstOrDefault(g => g.inventoryID == ItemType.GrenadeFrag);
                        if (grenade == null)
                        {
                            continue;
                        }

                        Grenade component = UnityEngine.Object.Instantiate(grenade.grenadeInstance).GetComponent <Grenade>();
                        component.InitData(gm, Vector3.zero, Vector3.zero, 0f);
                        NetworkServer.Spawn(component.gameObject);
                    }
                }

                yield return(Timing.WaitForSeconds(GrenadeRun.Instance.Config.GrenadeDelaySurface));
            }
        }
예제 #2
0
 public void OnThrowGrenade(PlayerThrowGrenadeEvent ev)
 {
     //La pasiva de los cadetes de que cuando lanzan granadas flash o granadas ganan salud y con las frag ganan una flash
     if ((ev.Player.TeamRole.Role == Role.NTF_CADET) && (ev.GrenadeType == GrenadeType.FRAG_GRENADE))
     {
         ev.Player.AddHealth(20);
         ev.Player.GiveItem(ItemType.FLASHBANG);
     }
     if ((ev.Player.TeamRole.Role == Role.NTF_CADET) && (ev.GrenadeType == GrenadeType.FLASHBANG))
     {
         ev.Player.AddHealth(30);
     }
     if (ev.Player.TeamRole.Role == Role.NTF_LIEUTENANT)
     {
         if (NTFlic4.ContainsKey(ev.Player.SteamId))
         {
             if (NTFlic4[ev.Player.SteamId] == true)
             {
                 GrenadeManager grenadeManager = ((GameObject)ev.Player.GetGameObject()).GetComponent <GrenadeManager>();
                 foreach (GrenadeSettings grenade in grenadeManager.availableGrenades)
                 {
                     grenade.timeUnitilDetonation = 120f;
                 }
             }
             else
             {
                 GrenadeManager grenadeManager = ((GameObject)ev.Player.GetGameObject()).GetComponent <GrenadeManager>();
                 foreach (GrenadeSettings grenade in grenadeManager.availableGrenades)
                 {
                     grenade.timeUnitilDetonation = 6f;
                 }
             }
         }
     }
 }
예제 #3
0
        public void OnDied(DiedEventArgs ev)
        {
            if (Tracking.PlayersInvisibleByCommand.Contains(ev.Target))
            {
                Tracking.PlayersInvisibleByCommand.Remove(ev.Target);
            }
            if (Tracking.PlayersWithSubclasses.ContainsKey(ev.Target) && Tracking.PlayersWithSubclasses[ev.Target].Abilities.Contains(AbilityType.ExplodeOnDeath))
            {
                GrenadeManager  grenadeManager = ev.Target.ReferenceHub.gameObject.GetComponent <GrenadeManager>();
                GrenadeSettings settings       = grenadeManager.availableGrenades.FirstOrDefault(g => g.inventoryID == ItemType.GrenadeFrag);
                Grenade         grenade        = UnityEngine.Object.Instantiate(settings.grenadeInstance).GetComponent <Grenade>();
                grenade.fuseDuration = Tracking.PlayersWithSubclasses[ev.Target].FloatOptions.ContainsKey("ExplodeOnDeathFuseTimer") ?
                                       Tracking.PlayersWithSubclasses[ev.Target].FloatOptions["ExplodeOnDeathFuseTimer"] : 2f;
                grenade.FullInitData(grenadeManager, ev.Target.Position, Quaternion.Euler(grenade.throwStartAngle),
                                     grenade.throwLinearVelocityOffset, grenade.throwAngularVelocity);
                NetworkServer.Spawn(grenade.gameObject);
            }

            Tracking.AddPreviousTeam(ev.Target);
            Tracking.RemoveZombie(ev.Target);
            Tracking.RemoveAndAddRoles(ev.Target, true);
            Timing.CallDelayed(0.1f, () => {
                Tracking.CheckRoundEnd();
            });
        }
예제 #4
0
        public void cmd_ball(CommandInfo info)
        {
            Vector3 NULL_VECTOR = new Vector3(0, 0, 0);

            List <GameObject> playerList = GetPlayersFromString(info.commandArgs[1]);

            foreach (GameObject plr in playerList)
            {
                if (plr.GetComponent <CharacterClassManager>().CurClass == RoleType.Spectator)
                {
                    continue;
                }

                PheggPlayer pp = new PheggPlayer(plr);

                // Initialization
                GrenadeManager gm = pp.gameObject.GetComponent <GrenadeManager>();

                // Finalize creation & Spawn
                Grenade nade = Object.Instantiate <GameObject>(gm.availableGrenades[2].grenadeInstance).GetComponent <Grenade>();
                (nade).InitData(gm, NULL_VECTOR, NULL_VECTOR);
                NetworkServer.Spawn(nade.gameObject);
            }

            info.commandSender.RaReply(info.commandName.ToUpper() + $"#Spawned 018 on {(info.commandArgs[1] == "*" ? "All" : playerList.Count.ToString())} players", true, true, "");
        }
예제 #5
0
        public static void InvokeGrenadeThrown(ref GrenadeManager gm, ref int id, ref bool slow, ref double fuse, ref bool allow)
        {
            GrenadeThrown grenadeThrown = GrenadeThrownEvent;

            if (grenadeThrown == null)
            {
                return;
            }
            GrenadeThrownEvent ev = new GrenadeThrownEvent()
            {
                Player = gm.gameObject.GetPlayer(),
                Gm     = gm,
                Id     = id,
                Allow  = allow,
                Slow   = slow,
                Fuse   = fuse
            };

            grenadeThrown?.Invoke(ref ev);
            allow = ev.Allow;
            id    = ev.Id;
            gm    = ev.Gm;
            slow  = ev.Slow;
            fuse  = ev.Fuse;
        }
예제 #6
0
 public void OnPlayerDropItem(PlayerDropItemEvent ev)
 {
     if ((ev.Player.TeamRole.Role == Role.NTF_LIEUTENANT) && (ev.Item.ItemType == ItemType.WEAPON_MANAGER_TABLET))
     {
         if (NTFlic4.ContainsKey(ev.Player.SteamId))
         {
             if (NTFlic4[ev.Player.SteamId])
             {
                 GrenadeManager grenadeManager = ((GameObject)ev.Player.GetGameObject()).GetComponent <GrenadeManager>();
                 foreach (GrenadeSettings grenade in grenadeManager.availableGrenades)
                 {
                     grenade.timeUnitilDetonation = 0.2f;
                 }
                 int p = (int)System.Environment.OSVersion.Platform;
                 if ((p == 4) || (p == 6) || (p == 128))
                 {
                     MEC.Timing.RunCoroutine(C4s(ev.Player), MEC.Segment.FixedUpdate);
                 }
                 else
                 {
                     MEC.Timing.RunCoroutine(C4s(ev.Player), 1);
                 }
             }
         }
     }
 }
        private static bool Prefix(ref GrenadeManager __instance, ref IEnumerator <float> __result, ref GrenadeSettings settings, ref float forceMultiplier, ref int itemIndex, ref float delay)
        {
            try
            {
                var player = __instance.GetPlayer();

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

                var item  = __instance.hub.inventory.items[itemIndex].GetSynapseItem();
                var allow = true;

                SynapseController.Server.Events.Player.InvokePlayerItemUseEvent(player, item, ItemInteractState.Initiating, ref allow);
                SynapseController.Server.Events.Player.InvokePlayerThrowGrenadeEvent(player, item, ref settings, ref forceMultiplier, ref delay, ref allow);

                __result = ServerThrowGrenadeOverride(__instance, settings, forceMultiplier, itemIndex, delay, !allow);
            }
            catch (Exception e)
            {
                Synapse.Api.Logger.Get.Error($"Synapse-Event: PlayerThrowGrenade failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                throw;
            }

            return(false);
        }
예제 #8
0
        /// <inheritdoc/>
        public override Grenade Spawn(Vector3 position, Vector3 velocity, float fuseTime = 3, ItemType grenadeType = ItemType.GrenadeFrag, Player player = null)
        {
            if (player == null)
            {
                player = Server.Host;
            }

            GrenadeManager  grenadeManager = player.GrenadeManager;
            GrenadeSettings settings       =
                grenadeManager.availableGrenades.FirstOrDefault(g => g.inventoryID == grenadeType);

            Grenade grenade = GameObject.Instantiate(settings.grenadeInstance).GetComponent <Grenade>();

            grenade.FullInitData(grenadeManager, position, Quaternion.Euler(grenade.throwStartAngle), velocity, grenade.throwAngularVelocity, player == Server.Host ? Team.RIP : player.Team);
            grenade.NetworkfuseTime = NetworkTime.time + fuseTime;

            Tracked.Add(grenade.gameObject);

            GameObject grenadeObject = grenade.gameObject;

            UnityEngine.Object.Destroy(grenadeObject.GetComponent <Scp018Grenade>());
            grenadeObject.AddComponent <Components.Rock>().Init(player.GameObject, player.Side, FriendlyFire, ThrownDamage);
            NetworkServer.Spawn(grenadeObject);

            if (ExplodeOnCollision)
            {
                grenade.gameObject.AddComponent <CollisionHandler>().Init(player.GameObject, grenade);
            }

            return(grenade);
        }
예제 #9
0
    public void Initialize()
    {
        UIController uic = GeneralVariables.uiController;

        weaponName = uic.weaponName;
        curAmmo    = uic.curAmmoDisplay;
        ammoLeft   = uic.ammoLeftDisplay;
        ammoBar    = uic.ammoBar;

        PlayerReference pr = GeneralVariables.playerRef;

        gm  = transform.parent.GetComponent <GrenadeManager>();
        pm  = pr.GetComponent <PlayerMovement>();
        gam = pr.gam;
        wm  = pr.wm;
        acs = pr.acs;

        if (isDetonatable)
        {
            canDetonate = true;
        }

        OnSelect();
        switchToWeapon = -1;
        canThrow       = true;
    }
예제 #10
0
 internal void PlayerDeath(ref PlayerDeathEvent ev)
 {
     if (plugin.curMod.HasFlag(ModType.NONE) && plugin.enabledTypes.Contains(ModType.NONE))
     {
         return; // cuz none means none
     }
     if (plugin.curMod.HasFlag(ModType.EXPLODEONDEATH) && plugin.enabledTypes.Contains(ModType.EXPLODEONDEATH))
     {
         if (ev.Killer == null || (ev.Killer != null && ev.Killer.GetTeam() != Team.SCP && ev.Killer.GetTeam() != Team.TUT))
         {
             GrenadeManager  gm  = ev.Player.GetComponent <GrenadeManager>();
             GrenadeSettings set = gm.availableGrenades.FirstOrDefault(g => g.inventoryID == ItemType.GrenadeFrag);
             if (set == null)
             {
             }
             else
             {
                 Grenade comp = UnityEngine.Object.Instantiate(set.grenadeInstance).GetComponent <Grenade>();
                 comp.fuseDuration = 0.1f;
                 comp.InitData(gm, Vector3.zero, Vector3.zero, 10f);
                 // commented for stable release
                 //deathGrenades.Add(comp);
                 NetworkServer.Spawn(comp.gameObject);
             }
         }
     }
     if (plugin.curMod.HasFlag(ModType.CLASSINFECT) && plugin.enabledTypes.Contains(ModType.CLASSINFECT))
     {
         if (ev.Killer != null && ev.Killer != ev.Player && !plugin.noInfectRoles.Contains(ev.Killer.characterClassManager.CurClass))
         {
             Timing.RunCoroutine(InfectLate(ev.Player, ev.Killer.characterClassManager.CurClass, ev.Killer.transform.position));
         }
     }
 }
예제 #11
0
        public static void InvokeGrenadeThrown(ref GrenadeManager grenadeManager, ref int grenadeId, ref bool slow, ref double fuse, ref bool allow)
        {
            if (GrenadeThrownEvent == null)
            {
                return;
            }

            GrenadeThrownEvent ev = new GrenadeThrownEvent()
            {
                Player = grenadeManager.gameObject.GetPlayer(),
                Gm     = grenadeManager,
                Id     = grenadeId,
                Allow  = allow,
                Slow   = slow,
                Fuse   = fuse
            };

            GrenadeThrownEvent.InvokeSafely(ev);

            allow          = ev.Allow;
            grenadeId      = ev.Id;
            grenadeManager = ev.Gm;
            slow           = ev.Slow;
            fuse           = ev.Fuse;
        }
예제 #12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ThrowingGrenadeEventArgs"/> class.
 /// </summary>
 /// <param name="player"><inheritdoc cref="Player"/></param>
 /// <param name="grenadeManager"><inheritdoc cref="GrenadeManager"/></param>
 /// <param name="id"><inheritdoc cref="Id"/></param>
 /// <param name="isSlow"><inheritdoc cref="IsSlow"/></param>
 /// <param name="fuseTime"><inheritdoc cref="FuseTime"/></param>
 /// <param name="isAllowed">Indicates whether the event can be executed or not.</param>
 public ThrowingGrenadeEventArgs(Player player, GrenadeManager grenadeManager, int id, bool isSlow, double fuseTime, bool isAllowed = true)
 {
     Player         = player;
     GrenadeManager = grenadeManager;
     Id             = id;
     IsSlow         = isSlow;
     FuseTime       = fuseTime;
     IsAllowed      = isAllowed;
 }
예제 #13
0
    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.layer == LayerMask.NameToLayer("Player"))
        {
            if (gameObject.tag == "HealthPickUp")
            {
                HP playerHP = other.GetComponent <HP>();

                if (playerHP != null)
                {
                    playerHP.health         += healthIncrease;
                    playerHP.healthText.text = playerHP.health.ToString();
                    Destroy(gameObject);
                }
            }

            if (gameObject.tag == "Treasure")
            {
                ScoreCounter playerScore = other.GetComponent <ScoreCounter>();
                if (playerScore != null)
                {
                    if (pool != null)
                    {
                        playerScore.ScoreIncrease(score);
                        ReturnToPool();
                    }
                    else
                    {
                        playerScore.ScoreIncrease(score);
                        Destroy(gameObject);
                    }
                }
            }

            if (gameObject.tag == "Grenade")
            {
                PlayerController player  = other.GetComponent <PlayerController>();
                GrenadeManager   grenade = other.GetComponent <GrenadeManager>();
                if (player.grenadeCount < 3)
                {
                    player.grenadeCount++;
                    if (pool != null)
                    {
                        grenade.GrenadeRunThrough(player);
                        ReturnToPool();
                    }
                    else
                    {
                        grenade.GrenadeRunThrough(player);
                        Destroy(gameObject);
                    }
                }
            }
        }
    }
예제 #14
0
        private IEnumerator <float> C4s(Player attacker)
        {
            yield return(MEC.Timing.WaitForSeconds(1f));

            GrenadeManager grenadeManager = ((GameObject)attacker.GetGameObject()).GetComponent <GrenadeManager>();

            foreach (GrenadeSettings grenade in grenadeManager.availableGrenades)
            {
                grenade.timeUnitilDetonation = 120f;
            }
        }
예제 #15
0
        public static void SpawnGrenadeOnPlayer(Player playerToSpawnGrenade, bool useCustomTimer)
        {
            GrenadeManager gm      = playerToSpawnGrenade.ReferenceHub.gameObject.GetComponent <GrenadeManager>();
            Grenade        grenade =
                UnityEngine.Object.Instantiate(gm.availableGrenades[0].grenadeInstance.GetComponent <Grenade>());

            grenade.fuseDuration = useCustomTimer ? Instance.Config.GrenadeTimerOnDeath : 0.01f;
            grenade.FullInitData(gm, playerToSpawnGrenade.Position, Quaternion.Euler(grenade.throwStartAngle),
                                 grenade.throwLinearVelocityOffset, grenade.throwAngularVelocity, playerToSpawnGrenade.Team);
            NetworkServer.Spawn(grenade.gameObject);
        }
 private void Start()
 {
     hasKey         = false;
     pause          = GetComponent <PauseScript>();
     anim           = GetComponent <Animator>();
     speed          = stats.speed;
     lookSpeed      = stats.speed;
     rb             = GetComponent <Rigidbody>();
     canMove        = true;
     laserSight     = GetComponent <LineRenderer>();
     grenadeManager = GetComponent <GrenadeManager>();
 }
예제 #17
0
        private static bool Prefix(ref GrenadeManager __instance, ref int id, ref bool slowThrow, ref double time)
        {
            var ev = new ThrowingGrenadeEventArgs(API.Features.Player.Get(__instance.gameObject), __instance, id, slowThrow, time);

            Player.OnThrowingGrenade(ev);

            id        = ev.Id;
            slowThrow = ev.IsSlow;
            time      = ev.FuseTime;

            return(ev.IsAllowed);
        }
예제 #18
0
        public void OnCollisionEnter(Collision other)
        {
            ContactPoint point    = other.contacts[0];
            Vector3      position = point.point;

            if (thrower == null)
            {
                return;
            }
            GrenadeManager manager = thrower.GetComponent <GrenadeManager>();

            manager.CallRpcExplode(grenade.id, thrower.GetComponent <QueryProcessor>().PlayerId);
        }
        public static bool Prefix(ref GrenadeManager __instance, ref int id, ref bool slowThrow, ref double time)
        {
            try
            {
                var player = __instance.GetPlayer();
                if (player == null)
                {
                    return(true);
                }
                ItemType item;
                switch (id)
                {
                case 0:
                    item = ItemType.GrenadeFlash;
                    break;

                case 1:
                    item = ItemType.GrenadeFrag;
                    break;

                case 2:
                    item = ItemType.SCP018;
                    break;

                default:
                    Log.Error($"Invalid Grenade ID: {id}");
                    return(true);
                }

                time -= NetworkTime.time;

                Events.InvokeUseItemEvent(player, item, out var useAllow);

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

                Events.InvokePlayerThrowGrenadeEvent(player, item, ref slowThrow, ref time, out var allow);

                time += NetworkTime.time;

                return(allow);
            }
            catch (Exception e)
            {
                Log.Error($"Player Throw Grenade Error: {e}");
                return(true);
            }
        }
예제 #20
0
        private static void SpawnFlash(Player player)
        {
            Vector3 position = player.Camera.gameObject
                ? player.Camera.transform.position
                : player.ReferenceHub.scp079PlayerScript.transform.position;

            GrenadeManager  gm       = player.GrenadeManager;
            GrenadeSettings settings = gm.availableGrenades.First(g => g.inventoryID == ItemType.GrenadeFlash);
            FlashGrenade    flash    = UnityEngine.Object.Instantiate(settings.grenadeInstance).GetComponent <FlashGrenade>();

            flash.fuseDuration = 0.5f;
            flash.InitData(gm, Vector3.zero, Vector3.zero);
            flash.transform.position = position;
            NetworkServer.Spawn(flash.gameObject);
        }
예제 #21
0
        public Grenades.Grenade SpawnGrenade(Vector3 position, Vector3 velocity, float fusetime = 3f, GrenadeType grenadeType = GrenadeType.FragGrenade, Player player = null)
        {
            if (player == null)
            {
                player = Server.Host;
            }

            GrenadeManager component  = player.GrenadeManager;
            Grenade        component2 = GameObject.Instantiate(component.availableGrenades[(int)grenadeType].grenadeInstance).GetComponent <Grenades.Grenade>();

            component2.FullInitData(component, position, Quaternion.Euler(component2.throwStartAngle), velocity, component2.throwAngularVelocity, player == Server.Host ? Team.RIP : player.Team);
            component2.NetworkfuseTime = NetworkTime.time + (double)fusetime;
            NetworkServer.Spawn(component2.gameObject);

            return(component2);
        }
예제 #22
0
파일: Hmd.cs 프로젝트: RogerFK/HMD
        private float DetonateFlash(Vector3 pos)
        {
            const int   id         = 1;
            Vector3     dir        = Vector3.zero;
            const float throwForce = 0;

            GrenadeManager component1 = PlayerObject.GetComponent <GrenadeManager>();
            Grenade        component2 = UnityEngine.Object.Instantiate(component1.availableGrenades[id].grenadeInstance).GetComponent <Grenade>();

            component2.id = PlayerObject.GetComponent <QueryProcessor>().PlayerId + ":" + (component1.smThrowInteger + 4096);
            GrenadeManager.grenadesOnScene.Add(component2);
            component2.SyncMovement(component1.availableGrenades[id].GetStartPos(PlayerObject), (PlayerObject.GetComponent <Scp049PlayerScript>().plyCam.transform.forward + Vector3.up / 4f).normalized * throwForce, Quaternion.Euler(component1.availableGrenades[id].startRotation), component1.availableGrenades[id].angularVelocity);
            component1.CallRpcThrowGrenade(id, PlayerObject.GetComponent <QueryProcessor>().PlayerId, component1.smThrowInteger++ + 4096, dir, true, pos, false, 0);

            return(component1.availableGrenades[id].timeUnitilDetonation);
        }
    public override void OnInspectorGUI()
    {
        GrenadeManager     gm  = target as GrenadeManager;
        GrenadeAmmoManager gam = gm.transform.parent.parent.GetComponent <GrenadeAmmoManager>();

        if (gm.nadeList == null)
        {
            gm.nadeList = (GrenadeList)EditorGUILayout.ObjectField("Grenade List Prefab:", gm.nadeList, typeof(GrenadeList), true);
            EditorGUILayout.HelpBox("Not assigning this variable will have a heavy performance cost!", MessageType.Warning);
        }

        GUILayout.Space(6);
        EditorGUILayout.LabelField(" To Be Instantiated:", EditorStyles.boldLabel);

        EditorGUI.indentLevel += 1;
        EditorGUILayout.ObjectField(" Grenade Slot #1:", GrenadeDatabase.GetGrenadeByID(gam.grenadeTypeOne), typeof(GrenadeController), false);
        EditorGUILayout.ObjectField(" Grenade Slot #2:", GrenadeDatabase.GetGrenadeByID(gam.grenadeTypeTwo), typeof(GrenadeController), false);
        EditorGUI.indentLevel -= 1;
    }
예제 #24
0
        public static void SpawnGrenade(ItemType type, Player player, SubClass subClass)
        {
            // Credit to KoukoCocoa's AdminTools for the grenade spawn script below, I was lost. https://github.com/KoukoCocoa/AdminTools/
            GrenadeManager  grenadeManager = player.ReferenceHub.gameObject.GetComponent <GrenadeManager>();
            GrenadeSettings settings       = grenadeManager.availableGrenades.FirstOrDefault(g => g.inventoryID == type);

            Grenades.Grenade grenade = UnityEngine.Object.Instantiate(settings.grenadeInstance).GetComponent <Grenades.Grenade>();
            if (type == ItemType.GrenadeFlash)
            {
                grenade.fuseDuration = subClass.FloatOptions.ContainsKey("FlashOnCommandFuseTimer") ? subClass.FloatOptions["FlashOnCommandFuseTimer"] : 0.3f;
            }
            else
            {
                grenade.fuseDuration = subClass.FloatOptions.ContainsKey("GrenadeOnCommandFuseTimer") ? subClass.FloatOptions["GrenadeOnCommandFuseTimer"] : 0.3f;
            }
            grenade.FullInitData(grenadeManager, player.Position, Quaternion.Euler(grenade.throwStartAngle),
                                 grenade.throwLinearVelocityOffset, grenade.throwAngularVelocity, player.Team);
            NetworkServer.Spawn(grenade.gameObject);
        }
예제 #25
0
        public static bool Prefix(ref GrenadeManager __instance, ref int id, ref bool slowThrow, ref double time)
        {
            if (EventPlugin.GrenadeThrownPatchDisable)
            {
                return(true);
            }

            try
            {
                bool allow = true;
                Events.InvokeGrenadeThrown(ref __instance, ref id, ref slowThrow, ref time, ref allow);
                return(allow);
            }
            catch (Exception e)
            {
                Log.Error($"Grenade thrown patch error: {e}");
                return(true);
            }
        }
예제 #26
0
        private static bool Prefix(ref GrenadeManager __instance, ref int id, ref bool slowThrow, ref double time)
        {
            try
            {
                var ev = new ThrowingGrenadeEventArgs(API.Features.Player.Get(__instance.gameObject), __instance, (GrenadeType)id, slowThrow, time);

                Player.OnThrowingGrenade(ev);

                id        = (int)ev.Type;
                slowThrow = ev.IsSlow;
                time      = ev.FuseTime;

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

                return(true);
            }
        }
예제 #27
0
	void Start () 
	{
		instance = this; 
		grenadeCountGame = grenadeCountStart;
		timer = 0;
	}
예제 #28
0
        public void ConsoleCmd(ConsoleCommandEvent ev)
        {
            if (ev.Player.GetRole() == RoleType.Scp079)
            {
                string[] args = ev.Command.Split(' ');
                if (args[0].Equals(Plugin.CommandPrefix))
                {
                    if (args.Length >= 2)
                    {
                        if (args[1].ToLower().Equals("help") || args[1].ToLower().Equals("commands") || args[1].ToLower().Equals("?"))
                        {
                            ev.ReturnMessage = Plugin.HelpMsgTitle + "\n" +
                                               "\"." + Plugin.CommandPrefix + " a1\" - " + Plugin.HelpMsgA1 + " | Coût: " + Plugin.A1Power + " AP | Tier " + (Plugin.A1Tier + 1) + ".\n" +
                                               "\"." + Plugin.CommandPrefix + " a2\" - " + Plugin.HelpMsgA2 + " | Coût: " + Plugin.A2Power + " AP | Tier " + (Plugin.A2Tier + 1) + ".\n" +
                                               "\"." + Plugin.CommandPrefix + " a3\" - " + Plugin.HelpMsgA3 + " | Coût: " + Plugin.A3Power + " AP | Tier " + (Plugin.A3Tier + 1) + ".\n" +
                                               "\"." + Plugin.CommandPrefix + " a4\" - " + Plugin.HelpMsgA4 + " | Coût: " + Plugin.A4Power + " AP | Tier " + (Plugin.A4Tier + 1) + ".\n" +
                                               "\"." + Plugin.CommandPrefix + " a5\" - " + Plugin.HelpMsgA5 + " | Coût: " + Plugin.A5Power + " AP | Tier " + (Plugin.A5Tier + 1) + ".\n" +
                                               "\"." + Plugin.CommandPrefix + " a6\" - " + Plugin.HelpMsgA6 + " | Coût: " + Plugin.A6Cost + " Tier | Tier " + (Plugin.A6Tier + 1) + ".\n" +
                                               "\"." + Plugin.CommandPrefix + " suicide\" - " + Plugin.HelpMsgSuicide + ".\n";
                            return;
                        }

                        if (args[1].ToLower().Equals("a1"))
                        {
                            if (ev.Player.scp079PlayerScript.NetworkcurLvl < Plugin.A1Tier)
                            {
                                ev.ReturnMessage = Plugin.TierRequiredMsg.Replace("$tier", "" + (Plugin.A1Tier + 1));
                                return;
                            }
                            if (ev.Player.scp079PlayerScript.NetworkcurMana < Plugin.A1Power)
                            {
                                ev.ReturnMessage = Plugin.NoPowerMsg;
                                return;
                            }
                            if (args.Length > 3)
                            {
                                if (Plugin.A1AntiSpam > TimeBehaviour.CurrentTimestamp())
                                {
                                    ev.ReturnMessage = Plugin.AntiSpamMsg.Replace("%s", Math.Ceiling(TimeSpan.FromTicks(Plugin.A1AntiSpam - TimeBehaviour.CurrentTimestamp()).TotalSeconds).ToString());
                                    return;
                                }
                                else
                                {
                                    // .079 a1 SCP CAUSE[unknow/as/mtf/chaos] UNIT[C] UNIT[25]
                                    if (int.TryParse(args[2], out int SCP) || !String.IsNullOrWhiteSpace(args[3]))
                                    {
                                        string tts = string.Empty;
                                        tts += "BG_MTF2 BREAK_PREANNC SCP";
                                        foreach (char c in args[2])
                                        {
                                            tts += " " + c;
                                        }
                                        switch (args[3].ToLower())
                                        {
                                        case "mtf":
                                            if (args.Length > 5)
                                            {
                                                if (char.IsLetter(args[4][0]) || !String.IsNullOrWhiteSpace(args[5]))
                                                {
                                                    tts += " CONTAINEDSUCCESSFULLY CONTAINMENTUNIT NATO_" + args[4][0] + " " + args[5];
                                                }
                                                else
                                                {
                                                    ev.ReturnMessage = Plugin.FailA1Msg;
                                                    return;
                                                }
                                            }
                                            else
                                            {
                                                ev.ReturnMessage = Plugin.FailA1Msg;
                                                return;
                                            }
                                            break;

                                        case "security":
                                            tts += " SUCCESSFULLY TERMINATED BY AUTOMATIC SECURITY SYSTEM";
                                            break;

                                        case "chaos":
                                            tts += " TERMINATED BY CHAOSINSURGENCY";
                                            break;

                                        case "classed":
                                            tts += " TERMINATED BY CLASSD PERSONNEL";
                                            break;

                                        case "scientifique":
                                            tts += " TERMINATED BY SCIENCE PERSONNEL";
                                            break;

                                        case "decontamination":
                                            tts += " LOST IN DECONTAMINATION SEQUENCE";
                                            break;

                                        default:
                                            tts += " SUCCESSFULLY TERMINATED . CONTAINMENTUNIT UNKNOWN";
                                            break;
                                        }
                                        DoAnnouncement(tts, true);
                                        ev.Player.scp079PlayerScript.NetworkcurMana -= Plugin.A1Power;
                                        Plugin.A1AntiSpam = DateTime.UtcNow.AddSeconds((double)Plugin.A1TimeBetween).Ticks;
                                        ev.ReturnMessage  = Plugin.RunA1Msg;
                                        return;
                                    }
                                }
                            }
                            else
                            {
                                ev.ReturnMessage = Plugin.FailA1Msg;
                                return;
                            }
                        }

                        if (args[1].ToLower().Equals("a2"))
                        {
                            if (ev.Player.scp079PlayerScript.NetworkcurLvl < Plugin.A2Tier)
                            {
                                ev.ReturnMessage = Plugin.TierRequiredMsg.Replace("$tier", "" + (Plugin.A2Tier + 1));
                                return;
                            }
                            if (ev.Player.scp079PlayerScript.NetworkcurMana >= Plugin.A2Power)
                            {
                                ev.Player.scp079PlayerScript.NetworkcurMana -= Plugin.A2Power;
                            }
                            else
                            {
                                ev.ReturnMessage = Plugin.NoPowerMsg;
                                return;
                            }
                            Room room = SCP079Room(ev.Player);
                            if (room == null)
                            {
                                ev.ReturnMessage = Plugin.FailA2Msg;
                                return;
                            }
                            if (room.Zone == ZoneType.Surface)
                            {
                                ev.ReturnMessage = Plugin.FailA2Msg;
                                return;
                            }
                            foreach (var item in Plugin.A2BlacklistRooms)
                            {
                                if (room.Name.ToLower().Contains(item.ToLower()))
                                {
                                    ev.ReturnMessage = Plugin.FailA2Msg;
                                    return;
                                }
                            }
                            if (Plugin.A2AntiSpam > TimeBehaviour.CurrentTimestamp())
                            {
                                ev.ReturnMessage = Plugin.AntiSpamMsg.Replace("%s", Math.Ceiling(TimeSpan.FromTicks(Plugin.A2AntiSpam - TimeBehaviour.CurrentTimestamp()).TotalSeconds).ToString());
                                return;
                            }
                            Timing.RunCoroutine(GasRoom(room, ev.Player));
                            Plugin.A2AntiSpam = DateTime.UtcNow.AddSeconds((double)Plugin.A2TimeBetween).Ticks;
                            ev.ReturnMessage  = Plugin.RunA2Msg;
                            return;
                        }

                        if (args[1].ToLower().Equals("a3"))
                        {
                            if (ev.Player.scp079PlayerScript.NetworkcurLvl < Plugin.A3Tier)
                            {
                                ev.ReturnMessage = Plugin.TierRequiredMsg.Replace("$tier", "" + (Plugin.A3Tier + 1));
                                return;
                            }
                            if (ev.Player.scp079PlayerScript.NetworkcurMana >= Plugin.A3Power)
                            {
                                ev.Player.scp079PlayerScript.NetworkcurMana -= Plugin.A3Power;
                            }
                            else
                            {
                                ev.ReturnMessage = Plugin.NoPowerMsg;
                                return;
                            }
                            Generator079.generators[0].RpcCustomOverchargeForOurBeautifulModCreators(Plugin.A3Timer, false);
                            ev.ReturnMessage = Plugin.RunA3Msg;
                            return;
                        }

                        if (args[1].ToLower().Equals("a4"))
                        {
                            if (ev.Player.scp079PlayerScript.NetworkcurLvl < Plugin.A4Tier)
                            {
                                ev.ReturnMessage = Plugin.TierRequiredMsg.Replace("$tier", "" + (Plugin.A4Tier + 1));
                                return;
                            }
                            if (ev.Player.scp079PlayerScript.NetworkcurMana >= Plugin.A4Power)
                            {
                                ev.Player.scp079PlayerScript.NetworkcurMana -= Plugin.A4Power;
                            }
                            else
                            {
                                ev.ReturnMessage = Plugin.NoPowerMsg;
                                return;
                            }
                            var             pos      = ev.Player.scp079PlayerScript.currentCamera.transform.position;
                            GrenadeManager  gm       = ev.Player.GetComponent <GrenadeManager>();
                            GrenadeSettings settings = gm.availableGrenades.FirstOrDefault(g => g.inventoryID == ItemType.GrenadeFlash);
                            FlashGrenade    flash    = GameObject.Instantiate(settings.grenadeInstance).GetComponent <FlashGrenade>();
                            flash.fuseDuration = 0.5f;
                            flash.InitData(gm, Vector3.zero, Vector3.zero, 1f);
                            flash.transform.position = pos;
                            NetworkServer.Spawn(flash.gameObject);
                            ev.ReturnMessage = Plugin.RunA4Msg;
                            return;
                        }

                        if (args[1].ToLower().Equals("suicide"))
                        {
                            ev.Player.playerStats.HurtPlayer(new PlayerStats.HitInfo(119000000, ev.Player.GetNickname(), DamageTypes.Wall, ev.Player.GetPlayerId()), ev.Player.gameObject);
                            return;
                        }

                        if (args[1].ToLower().Equals("a5"))
                        {
                            if (ev.Player.scp079PlayerScript.NetworkcurLvl < Plugin.A1Tier)
                            {
                                ev.ReturnMessage = Plugin.TierRequiredMsg.Replace("$tier", "" + (Plugin.A5Tier + 1));
                                return;
                            }
                            if (ev.Player.scp079PlayerScript.NetworkcurMana < Plugin.A5Power)
                            {
                                ev.ReturnMessage = Plugin.NoPowerMsg;
                                return;
                            }
                            if (args.Length > 2)
                            {
                                if (Plugin.A5AntiSpam > TimeBehaviour.CurrentTimestamp())
                                {
                                    ev.ReturnMessage = Plugin.AntiSpamMsg.Replace("%s", Math.Ceiling(TimeSpan.FromTicks(Plugin.A5AntiSpam - TimeBehaviour.CurrentTimestamp()).TotalSeconds).ToString());
                                    return;
                                }
                                else
                                {
                                    // .079 a5 GROUPE[unknow/mtf] UNIT[C] UNIT[25] [REMAIN SCP]
                                    if (!String.IsNullOrWhiteSpace(args[2]))
                                    {
                                        string tts = string.Empty;
                                        switch (args[2].ToLower())
                                        {
                                        case "mtf":
                                            if (args.Length > 5)
                                            {
                                                bool success = Int32.TryParse(args[5], out int scpleft);
                                                if (char.IsLetter(args[3][0]) || !String.IsNullOrWhiteSpace(args[4]) || success)
                                                {
                                                    tts += "MTFUNIT EPSILON 11 DESIGNATED NATO_" + args[3][0] + " " + args[4] + " HASENTERED ALLREMAINING ";
                                                    tts += ((scpleft <= 0) ? "NOSCPSLEFT" : ("AWAITINGRECONTAINMENT " + scpleft + ((scpleft == 1) ? " SCPSUBJECT" : " SCPSUBJECTS")));
                                                }
                                                else
                                                {
                                                    ev.ReturnMessage = Plugin.FailA5Msg;
                                                    return;
                                                }
                                            }
                                            else
                                            {
                                                ev.ReturnMessage = Plugin.FailA5Msg;
                                                return;
                                            }
                                            break;

                                        default:
                                            tts += "Danger. Alert all security .g1 personnel. .g4 Unauthorized personnel .g2 have been detected .g1 in the facility.";
                                            break;
                                        }
                                        DoAnnouncement(tts, true);
                                        ev.Player.scp079PlayerScript.NetworkcurMana -= Plugin.A5Power;
                                        Plugin.A5AntiSpam = DateTime.UtcNow.AddSeconds((double)Plugin.A5TimeBetween).Ticks;
                                        ev.ReturnMessage  = Plugin.RunA5Msg;
                                        return;
                                    }
                                }
                            }
                            else
                            {
                                ev.ReturnMessage = Plugin.FailA5Msg;
                                return;
                            }
                        }

                        if (args[1].ToLower().Equals("a6"))
                        {
                            if (ev.Player.scp079PlayerScript.NetworkcurLvl < Plugin.A6Tier)
                            {
                                ev.ReturnMessage = Plugin.TierRequiredMsg.Replace("$tier", "" + (Plugin.A6Tier + 1));
                                return;
                            }
                            if (ev.Player.scp079PlayerScript.NetworkcurMana < Plugin.A6Power)
                            {
                                ev.ReturnMessage = Plugin.NoPowerMsg;
                                return;
                            }
                            else
                            {
                                List <ReferenceHub> riplist;
                                ReferenceHub        chosenPlayer;
                                riplist = GetHubList(RoleType.Spectator);
                                if (riplist.Count > 0)
                                {
                                    chosenPlayer = riplist[(new System.Random()).Next(riplist.Count)];
                                    int SCP = PlayerManager.localPlayer.GetComponent <CharacterClassManager>().FindRandomIdUsingDefinedTeam(Team.SCP);
                                    if (SCP != 1)
                                    {
                                        chosenPlayer.SetRole((RoleType)SCP);
                                        chosenPlayer.Broadcast(10, Plugin.NewSCPA6Msg, false);
                                        ev.Player.scp079PlayerScript.NetworkcurLvl  -= Plugin.A6Cost;
                                        ev.Player.scp079PlayerScript.NetworkcurMana -= Plugin.A6Power;
                                        Scp079.SetMaxEnergy(ev.Player, 125);
                                        Timing.CallDelayed(0.8f, () => { foreach (Room r in Map.Rooms)
                                                                         {
                                                                             if (r.Name.ToLower().Equals("HCZ_079".ToLower()))
                                                                             {
                                                                                 chosenPlayer.SetPosition(r.Position.x, r.Position.y + 1, r.Position.z);
                                                                             }
                                                                         }
                                                                         chosenPlayer.SetHealth(chosenPlayer.GetMaxHealth()); });
                                        DoAnnouncement("Alert. New containment .g1 breach detected. Cassie .g2 corruption detected. Code .g4 red.", true);
                                        ev.ReturnMessage = Plugin.RunA6Msg;
                                        return;
                                    }
                                    else
                                    {
                                        ev.ReturnMessage = Plugin.NoSCPA6Msg;
                                        return;
                                    }
                                }
                                else
                                {
                                    ev.ReturnMessage = Plugin.NoPlayerA6Msg;
                                    return;
                                }
                            }
                        }
                        ev.ReturnMessage = Plugin.HelpMsg.Replace("$prefix", "" + Plugin.CommandPrefix);
                        return;
                    }
                    ev.ReturnMessage = Plugin.HelpMsg.Replace("$prefix", "" + Plugin.CommandPrefix);
                    return;
                }
            }
        }
        public static IEnumerator <float> ServerThrowGrenadeOverride(GrenadeManager __instance, GrenadeSettings settings, float forceMultiplier, int itemIndex, float delay, bool cancelled)
        {
            if (cancelled)
            {
                yield break;
            }

            if (itemIndex < 0 || itemIndex >= __instance.hub.inventory.items.Count)
            {
                yield break;
            }
            __instance.hub.weaponManager.scp268.ServerDisable();
            float networkDelay = Mathf.Max(delay - __instance.velocityAuditPeriod, 0f);

            if (networkDelay > 0f)
            {
                ushort i = 0;
                while ((float)i < 50f * networkDelay)
                {
                    yield return(0f);

                    ushort num = i;
                    i = (ushort)(num + 1);
                }
                if (__instance.hub.characterClassManager.CurClass == global::RoleType.Spectator)
                {
                    yield break;
                }
            }
            float   auditDelay = Mathf.Min(delay, __instance.velocityAuditPeriod);
            Vector3 relativeVelocity;

            if (auditDelay > 0f)
            {
                Transform localTransform  = __instance.gameObject.transform;
                Vector3   initialPosition = localTransform.position;
                float     initialTime     = Time.time;
                ushort    i = 0;
                while ((float)i < 50f * auditDelay)
                {
                    yield return(0f);

                    ushort num = i;
                    i = (ushort)(num + 1);
                }
                if (__instance.hub.characterClassManager.CurClass == global::RoleType.Spectator)
                {
                    yield break;
                }
                float num2 = Time.time - initialTime;
                relativeVelocity = (localTransform.position - initialPosition) / num2;
                localTransform   = null;
                initialPosition  = default(Vector3);
            }
            else
            {
                relativeVelocity = Vector3.zero;
            }

            var allow = true;
            var item  = __instance.hub.inventory.items[itemIndex].GetSynapseItem();

            SynapseController.Server.Events.Player.InvokePlayerItemUseEvent(__instance.GetPlayer(), item, ItemInteractState.Finalizing, ref allow);
            if (!allow)
            {
                yield break;
            }

            Grenade component = Object.Instantiate(settings.grenadeInstance).GetComponent <Grenade>();

            component.InitData(__instance, relativeVelocity, __instance.hub.PlayerCameraReference.forward, forceMultiplier);
            NetworkServer.Spawn(component.gameObject);
            item.Destroy();
            if (settings.inventoryID == global::ItemType.SCP018)
            {
                global::Team team = __instance.hub.characterClassManager.CurRole.team;
                if (team == global::Team.CHI || team == global::Team.CDP)
                {
                    Respawning.RespawnTickets.Singleton.GrantTickets(Respawning.SpawnableTeamType.ChaosInsurgency, GameCore.ConfigFile.ServerConfig.GetInt("respawn_tickets_ci_scp_item_count", 1), false);
                }
            }
            yield break;
        }
예제 #30
0
        public void OnSendingConsoleCommand(SendingConsoleCommandEventArgs ev)
        {
            Log.Debug($"Player {ev.Player.Nickname} sent a console command", Subclass.Instance.Config.Debug);
            ev.IsAllowed = false;
            switch (ev.Name)
            {
            case "revive":
                Log.Debug($"Player {ev.Player.Nickname} is attempting to revive", Subclass.Instance.Config.Debug);
                if (Tracking.PlayersWithSubclasses.ContainsKey(ev.Player) && Tracking.PlayersWithSubclasses[ev.Player].Abilities.Contains(AbilityType.Revive))
                {
                    SubClass subClass = Tracking.PlayersWithSubclasses[ev.Player];
                    AttemptRevive(ev, subClass);
                }
                else
                {
                    ev.ReturnMessage = "You don't have the ability to revive!";
                }
                break;

            case "necro":
                Log.Debug($"Player {ev.Player.Nickname} is attempting to necro", Subclass.Instance.Config.Debug);
                if (Tracking.PlayersWithSubclasses.ContainsKey(ev.Player) && Tracking.PlayersWithSubclasses[ev.Player].Abilities.Contains(AbilityType.Necromancy))
                {
                    SubClass subClass = Tracking.PlayersWithSubclasses[ev.Player];
                    AttemptRevive(ev, subClass, true);
                }
                else
                {
                    ev.ReturnMessage = "You don't have the ability to necro!";
                }
                break;

            case "locate":
                if (ev.Player.Role != RoleType.Scp93953 && ev.Player.Role != RoleType.Scp93989 &&
                    (!Tracking.PlayersWithSubclasses.ContainsKey(ev.Player) ||
                     !Tracking.PlayersWithSubclasses[ev.Player].Abilities.Contains(AbilityType.Scp939Vision)))
                {
                    Log.Debug($"Player {ev.Player.Nickname} failed to echolocate", Subclass.Instance.Config.Debug);
                    ev.ReturnMessage = "You must be SCP-939 or have a subclass with its visuals to use this command";
                    return;
                }

                if (Tracking.PlayersWithSubclasses.ContainsKey(ev.Player) && Tracking.PlayersWithSubclasses[ev.Player].Abilities.Contains(AbilityType.Echolocate))
                {
                    SubClass subClass = Tracking.PlayersWithSubclasses[ev.Player];
                    if (Tracking.OnCooldown(ev.Player, AbilityType.Echolocate, subClass))
                    {
                        Log.Debug($"Player {ev.Player.Nickname} failed to echolocate", Subclass.Instance.Config.Debug);
                        Tracking.DisplayCooldown(ev.Player, AbilityType.Echolocate, subClass, "echolocation", Time.time);
                        return;
                    }

                    Collider[] colliders = Physics.OverlapSphere(ev.Player.Position, subClass.FloatOptions.ContainsKey("EcholocateRadius") ? subClass.FloatOptions["EcholocateRadius"] : 10f);

                    foreach (Collider PlayerCollider in colliders.Where(c => EPlayer.Get(c.gameObject) != null))
                    {
                        EPlayer.Get(PlayerCollider.gameObject).ReferenceHub.footstepSync?.CmdScp939Noise(100f);
                    }

                    Tracking.AddCooldown(ev.Player, AbilityType.Echolocate);
                    Log.Debug($"Player {ev.Player.Nickname} successfully used echolocate", Subclass.Instance.Config.Debug);
                }
                break;

            case "noclip":
                Log.Debug($"Player {ev.Player.Nickname} is attempting to noclip", Subclass.Instance.Config.Debug);
                if (Tracking.PlayersWithSubclasses.ContainsKey(ev.Player) && Tracking.PlayersWithSubclasses[ev.Player].Abilities.Contains(AbilityType.NoClip))
                {
                    SubClass subClass = Tracking.PlayersWithSubclasses[ev.Player];
                    if (Tracking.OnCooldown(ev.Player, AbilityType.NoClip, subClass))
                    {
                        Log.Debug($"Player {ev.Player.Nickname} failed to noclip - cooldown", Subclass.Instance.Config.Debug);
                        Tracking.DisplayCooldown(ev.Player, AbilityType.NoClip, subClass, "noclip", Time.time);
                        return;
                    }
                    bool previous = ev.Player.NoClipEnabled;
                    ev.Player.NoClipEnabled = !ev.Player.NoClipEnabled;
                    Tracking.AddCooldown(ev.Player, AbilityType.NoClip);
                    if (subClass.FloatOptions.ContainsKey("NoClipTime"))
                    {
                        Timing.CallDelayed(subClass.FloatOptions["NoClipTime"], () =>
                        {
                            if (ev.Player.NoClipEnabled != previous)
                            {
                                ev.Player.NoClipEnabled = previous;
                            }
                        });
                    }
                    Log.Debug($"Player {ev.Player.Nickname} successfully noclipped", Subclass.Instance.Config.Debug);
                }
                else
                {
                    ev.ReturnMessage = "You must have the noclip ability to use this command";
                    Log.Debug($"Player {ev.Player.Nickname} could not noclip", Subclass.Instance.Config.Debug);
                }
                break;

            case "flash":
                if (Tracking.PlayersWithSubclasses.ContainsKey(ev.Player) && Tracking.PlayersWithSubclasses[ev.Player].Abilities.Contains(AbilityType.FlashOnCommand))
                {
                    SubClass subClass = Tracking.PlayersWithSubclasses[ev.Player];
                    if (Tracking.OnCooldown(ev.Player, AbilityType.FlashOnCommand, subClass))
                    {
                        Log.Debug($"Player {ev.Player.Nickname} failed to flash on command", Subclass.Instance.Config.Debug);
                        Tracking.DisplayCooldown(ev.Player, AbilityType.FlashOnCommand, subClass, "flash", Time.time);
                        return;
                    }

                    // Credit to KoukoCocoa's AdminTools for the grenade spawn script below, I was lost. https://github.com/KoukoCocoa/AdminTools/
                    GrenadeManager  grenadeManager = ev.Player.ReferenceHub.gameObject.GetComponent <GrenadeManager>();
                    GrenadeSettings settings       = grenadeManager.availableGrenades.FirstOrDefault(g => g.inventoryID == ItemType.GrenadeFlash);
                    Grenade         grenade        = UnityEngine.Object.Instantiate(settings.grenadeInstance).GetComponent <Grenade>();
                    grenade.fuseDuration = subClass.FloatOptions.ContainsKey("FlashOnCommandFuseTimer") ? subClass.FloatOptions["FlashOnCommandFuseTimer"] : 0.3f;
                    grenade.FullInitData(grenadeManager, ev.Player.Position, Quaternion.Euler(grenade.throwStartAngle),
                                         grenade.throwLinearVelocityOffset, grenade.throwAngularVelocity);
                    NetworkServer.Spawn(grenade.gameObject);
                    Tracking.AddCooldown(ev.Player, AbilityType.FlashOnCommand);
                    Log.Debug($"Player {ev.Player.Nickname} successfully used flash on commad", Subclass.Instance.Config.Debug);
                }
                else
                {
                    ev.ReturnMessage = "You must have the flash on command ability to use this command";
                    Log.Debug($"Player {ev.Player.Nickname} could not flash on command", Subclass.Instance.Config.Debug);
                }
                break;

            case "invis":
                if (!Tracking.PlayersWithSubclasses.ContainsKey(ev.Player) || !Tracking.PlayersWithSubclasses[ev.Player].Abilities.Contains(AbilityType.InvisibleOnCommand))
                {
                    ev.ReturnMessage = "You must have the invisible on command ability to use this command";
                    Log.Debug($"Player {ev.Player.Nickname} could not go invisible on command", Subclass.Instance.Config.Debug);
                    return;
                }
                Scp268 scp268 = ev.Player.ReferenceHub.playerEffectsController.GetEffect <Scp268>();
                if (scp268 != null)
                {
                    SubClass subClass = Tracking.PlayersWithSubclasses[ev.Player];

                    if (scp268.Enabled)
                    {
                        Log.Debug($"Player {ev.Player.Nickname} failed to go invisible on command", Subclass.Instance.Config.Debug);
                        ev.Player.Broadcast(3, "You're already invisible!");
                        return;
                    }

                    if (Tracking.OnCooldown(ev.Player, AbilityType.InvisibleOnCommand, subClass))
                    {
                        Log.Debug($"Player {ev.Player.Nickname} failed to go invisible on command", Subclass.Instance.Config.Debug);
                        Tracking.DisplayCooldown(ev.Player, AbilityType.InvisibleOnCommand, subClass, "invisible", Time.time);
                        return;
                    }

                    //scp268.Duration = subClass.FloatOptions.ContainsKey("InvisibleOnCommandDuration") ?
                    //    subClass.FloatOptions["InvisibleOnCommandDuration"]*2f : 30f*2f;

                    //ev.Player.ReferenceHub.playerEffectsController.EnableEffect(scp268);

                    ev.Player.ReferenceHub.playerEffectsController.EnableEffect <Scp268>();
                    Tracking.PlayersInvisibleByCommand.Add(ev.Player);
                    Timing.CallDelayed(subClass.FloatOptions.ContainsKey("InvisibleOnCommandDuration") ?
                                       subClass.FloatOptions["InvisibleOnCommandDuration"] : 30f, () => {
                        if (Tracking.PlayersInvisibleByCommand.Contains(ev.Player))
                        {
                            Tracking.PlayersInvisibleByCommand.Remove(ev.Player);
                        }
                        if (scp268.Enabled)
                        {
                            ev.Player.ReferenceHub.playerEffectsController.DisableEffect <Scp268>();
                        }
                    });

                    Tracking.AddCooldown(ev.Player, AbilityType.InvisibleOnCommand);
                }
                break;

            default:
                ev.IsAllowed = true;
                break;
            }
        }
예제 #31
0
        public bool Execute(ArraySegment <string> arguments, ICommandSender sender, out string response)
        {
            if (sender is PlayerCommandSender)
            {
                var plr = sender as PlayerCommandSender;
                if (plr.RH.characterClassManager.NetworkCurClass == RoleType.Scp079)
                {
                    var plugin = Better079Plugin.instance;
                    var args   = arguments.Array;
                    {
                        if (args.Length == 1)
                        {
                            if (args[1].ToLower().Equals("help") || args[1].ToLower().Equals("commands") || args[1].ToLower().Equals("?"))
                            {
                                response = plugin.Config.b079_help_title + "\n" +
                                           "\"." + plugin.Config.b079_prefix + " a1\" - " + plugin.Config.b079_help_a1 + " - " + plugin.Config.b079_a1_power + "+ AP - Tier " + (plugin.Config.b079_a1_tier + 1) + "+\n" +
                                           "\"." + plugin.Config.b079_prefix + " a2\" - " + plugin.Config.b079_help_a2 + " - " + plugin.Config.b079_a2_power + "+ AP - Tier " + (plugin.Config.b079_a2_tier + 1) + "+\n" +
                                           "\"." + plugin.Config.b079_prefix + " a3\" - " + plugin.Config.b079_help_a3 + " - " + plugin.Config.b079_a3_power + "+ AP - Tier " + (plugin.Config.b079_a3_tier + 1) + "+\n" +
                                           "\"." + plugin.Config.b079_prefix + " a4\" - " + plugin.Config.b079_help_a4 + " - " + plugin.Config.b079_a4_power + "+ AP - Tier " + (plugin.Config.b079_a4_tier + 1) + "+\n";
                                return(true);
                            }

                            if (args[1].ToLower().Equals("a1"))
                            {
                                if (plr.RH.scp079PlayerScript.NetworkcurLvl < plugin.Config.b079_a1_tier)
                                {
                                    response = plugin.Config.b079_msg_tier_required.Replace("$tier", "" + (plugin.Config.b079_a1_tier + 1));
                                    return(true);
                                }
                                if (plr.RH.scp079PlayerScript.NetworkcurMana >= plugin.Config.b079_a1_power)
                                {
                                    plr.RH.scp079PlayerScript.NetworkcurMana -= plugin.Config.b079_a1_power;
                                }
                                else
                                {
                                    response = plugin.Config.b079_msg_no_power;
                                    return(true);
                                }
                                var cams = PluginEvents.GetSCPCameras();
                                if (cams.Count > 0)
                                {
                                    Camera079 cam = cams[UnityEngine.Random.Range(0, cams.Count)];
                                    plr.RH.scp079PlayerScript.CmdSwitchCamera(cam.cameraId, false);
                                    response = plugin.Config.b079_msg_a1_run;
                                    return(true);
                                }
                                else
                                {
                                    plr.RH.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a1_power;
                                    response = plugin.Config.b079_msg_a1_fail;
                                    return(true);
                                }
                            }

                            if (args[1].ToLower().Equals("a2"))
                            {
                                if (plr.RH.scp079PlayerScript.NetworkcurLvl < plugin.Config.b079_a2_tier)
                                {
                                    response = plugin.Config.b079_msg_tier_required.Replace("$tier", "" + (plugin.Config.b079_a2_tier + 1));
                                    return(true);
                                }
                                if (plr.RH.scp079PlayerScript.NetworkcurMana >= plugin.Config.b079_a2_power)
                                {
                                    plr.RH.scp079PlayerScript.NetworkcurMana -= plugin.Config.b079_a2_power;
                                }
                                else
                                {
                                    response = plugin.Config.b079_msg_no_power;
                                    return(true);
                                }
                                if (Time.timeSinceLevelLoad - PluginEvents.a2cooldown < plugin.Config.b079_a2_cooldown)
                                {
                                    plr.RH.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a2_power;
                                    response = plugin.Config.b079_msg_a2_fail;
                                    return(true);
                                }
                                Room room = PluginEvents.SCP079Room(plr.RH);
                                if (room == null)
                                {
                                    plr.RH.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a2_power;
                                    response = plugin.Config.b079_msg_a2_fail;
                                    return(true);
                                }
                                if (room.Zone == ZoneType.Surface)
                                {
                                    plr.RH.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a2_power;
                                    response = plugin.Config.b079_msg_a2_fail;
                                    return(true);
                                }
                                foreach (var item in plugin.Config.b079_a2_blacklisted_rooms)
                                {
                                    if (room.Name.ToLower().Contains(item.ToLower()))
                                    {
                                        plr.RH.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a2_power;
                                        response = plugin.Config.b079_msg_a2_fail;
                                        return(true);
                                    }
                                }
                                Timing.RunCoroutine(PluginEvents.GasRoom(room, plr.RH));
                                response = plugin.Config.b079_msg_a2_run;
                                return(true);
                            }

                            if (args[1].ToLower().Equals("a3"))
                            {
                                if (plr.RH.scp079PlayerScript.NetworkcurLvl < plugin.Config.b079_a3_tier)
                                {
                                    response = plugin.Config.b079_msg_tier_required.Replace("$tier", "" + (plugin.Config.b079_a3_tier + 1));
                                    return(true);
                                }
                                if (plr.RH.scp079PlayerScript.NetworkcurMana >= plugin.Config.b079_a3_power)
                                {
                                    plr.RH.scp079PlayerScript.NetworkcurMana -= plugin.Config.b079_a3_power;
                                }
                                else
                                {
                                    response = plugin.Config.b079_msg_no_power;
                                    return(true);
                                }
                                Generator079.Generators[0].RpcCustomOverchargeForOurBeautifulModCreators(plugin.Config.b079_a3_timer, false);
                                response = plugin.Config.b079_msg_a3_run;
                                return(true);
                            }

                            if (args[1].ToLower().Equals("a4"))
                            {
                                if (plr.RH.scp079PlayerScript.NetworkcurLvl < plugin.Config.b079_a4_tier)
                                {
                                    response = plugin.Config.b079_msg_tier_required.Replace("$tier", "" + (plugin.Config.b079_a4_tier + 1));
                                    return(true);
                                }
                                if (plr.RH.scp079PlayerScript.NetworkcurMana >= plugin.Config.b079_a4_power)
                                {
                                    plr.RH.scp079PlayerScript.NetworkcurMana -= plugin.Config.b079_a4_power;
                                }
                                else
                                {
                                    response = plugin.Config.b079_msg_no_power;
                                    return(true);
                                }
                                var             pos      = plr.RH.scp079PlayerScript.currentCamera.transform.position;
                                GrenadeManager  gm       = plr.RH.GetComponent <GrenadeManager>();
                                GrenadeSettings settings = gm.availableGrenades.FirstOrDefault(g => g.inventoryID == ItemType.GrenadeFlash);
                                FlashGrenade    flash    = GameObject.Instantiate(settings.grenadeInstance).GetComponent <FlashGrenade>();
                                flash.fuseDuration = 0.5f;
                                flash.InitData(gm, Vector3.zero, Vector3.zero, 1f);
                                flash.transform.position = pos;
                                NetworkServer.Spawn(flash.gameObject);
                                response = plugin.Config.b079_msg_a4_run;
                                return(true);
                            }
                            response = plugin.Config.b079_msg_help_cmd_fail.Replace("$prefix", "" + plugin.Config.b079_prefix);
                            return(true);
                        }
                        response = plugin.Config.b079_msg_help_cmd_fail.Replace("$prefix", "" + plugin.Config.b079_prefix);
                        return(true);
                    }
                }
            }
            response = Better079Plugin.instance.Config.b079_msg_help_cmd_fail.Replace("$prefix", "" + Better079Plugin.instance.Config.b079_prefix);
            return(false);
        }