Beispiel #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ExplosiveGrenade"/> class.
        /// </summary>
        /// <param name="itemBase"><inheritdoc cref="Throwable.Base"/></param>
        public ExplosiveGrenade(ThrowableItem itemBase)
            : base(itemBase)
        {
            ExplosionGrenade grenade = (ExplosionGrenade)Base.Projectile;

            MaxRadius       = grenade._maxRadius;
            ScpMultiplier   = grenade._scpDamageMultiplier;
            BurnDuration    = grenade._burnedDuration;
            DeafenDuration  = grenade._deafenedDuration;
            ConcussDuration = grenade._concussedDuration;
            FuseTime        = grenade._fuseTime;
        }
Beispiel #2
0
        /// <summary>
        /// Spawns an active grenade on the map at the specified location.
        /// </summary>
        /// <param name="position">The location to spawn the grenade.</param>
        /// <param name="owner">Optional: The <see cref="Player"/> owner of the grenade.</param>
        public void SpawnActive(Vector3 position, Player owner = null)
        {
#if DEBUG
            Log.Debug($"Spawning active grenade: {FuseTime}");
#endif
            ExplosionGrenade grenade = (ExplosionGrenade)Object.Instantiate(Base.Projectile, position, Quaternion.identity);
            grenade._maxRadius           = MaxRadius;
            grenade._scpDamageMultiplier = ScpMultiplier;
            grenade._burnedDuration      = BurnDuration;
            grenade._deafenedDuration    = DeafenDuration;
            grenade._concussedDuration   = ConcussDuration;
            grenade._fuseTime            = FuseTime;
            grenade.PreviousOwner        = new Footprint(owner != null ? owner.ReferenceHub : Server.Host.ReferenceHub);
            NetworkServer.Spawn(grenade.gameObject);
            grenade.ServerActivate();
        }
        private static bool ExplodeDestructible(ExplosionGrenade __instance, IDestructible dest, Footprinting.Footprint attacker, Vector3 pos, ExplosionGrenade setts, out bool __result)
        {
            __result = false;
            try
            {
                if (Physics.Linecast(dest.CenterOfMass, pos, InventorySystem.Items.MicroHID.MicroHIDItem.WallMask))
                {
                    return(false);
                }
                Vector3      a         = dest.CenterOfMass - pos;
                float        magnitude = a.magnitude;
                float        num       = setts._playerDamageOverDistance.Evaluate(magnitude);
                ReferenceHub referenceHub;
                bool         flag = ReferenceHub.TryGetHubNetID(dest.NetworkId, out referenceHub);
                if (flag && referenceHub.characterClassManager.CurRole.team == Team.SCP)
                {
                    num *= setts._scpDamageMultiplier;
                }
                Vector3 force = (1f - magnitude / setts._maxRadius) * (a / magnitude) * setts._rigidbodyLiftForce + Vector3.up * setts._rigidbodyLiftForce;
                if (num > 0f && dest.Damage(num, new PlayerStatsSystem.ExplosionDamageHandler(attacker, force, num, 50), dest.CenterOfMass) && flag)
                {
                    float num2  = setts._effectDurationOverDistance.Evaluate(magnitude);
                    bool  flag2 = attacker.Hub == referenceHub;
                    if (num2 > 0f && (flag2 || HitboxIdentity.CheckFriendlyFire(attacker.Hub, referenceHub, false)))
                    {
                        float minimalDuration = setts._minimalDuration;
                        ExplosionGrenade.TriggerEffect <CustomPlayerEffects.Burned>(referenceHub, num2 * setts._burnedDuration, minimalDuration);
                        ExplosionGrenade.TriggerEffect <CustomPlayerEffects.Deafened>(referenceHub, num2 * setts._deafenedDuration, minimalDuration);
                        ExplosionGrenade.TriggerEffect <CustomPlayerEffects.Concussed>(referenceHub, num2 * setts._concussedDuration, minimalDuration);
                    }
                    if (!flag2 && attacker.Hub != null)
                    {
                        Hitmarker.SendHitmarker(attacker.Hub, 1f);
                    }
                    referenceHub.inventory.connectionToClient.Send(new GunHitMessage(false, num, pos), 0);
                }

                __result = true;
                return(false);
            }
            catch (Exception ex)
            {
                Logger.Get.Error($"Synapse-FF: ExplodeDestructible failed!!\n{ex}");
                return(true);
            }
        }