/// <summary> /// Handles the removal of C4 charges. /// </summary> /// <param name="charge"> The C4 charge to be handled.</param> /// <param name="removeMethod"> The method of removing the charge.</param> public void C4Handler(Pickup charge, C4RemoveMethod removeMethod = C4RemoveMethod.Detonate) { switch (removeMethod) { case C4RemoveMethod.Remove: { charge.Destroy(); break; } case C4RemoveMethod.Detonate: { EffectGrenade projectile = (EffectGrenade)charge.Base; projectile._fuseTime = 0.1f; projectile.ServerActivate(); break; } case C4RemoveMethod.Drop: { TrySpawn((int)Id, charge.Position, out _); charge.Destroy(); break; } } PlacedCharges.Remove(charge); }
/// <summary> /// Initializes a new instance of the <see cref="ExplodingGrenadeEventArgs"/> class. /// </summary> /// <param name="thrower"><inheritdoc cref="Thrower"/></param> /// <param name="grenade"><inheritdoc cref="Grenade"/></param> /// <param name="targets"><inheritdoc cref="TargetsToAffect"/></param> public ExplodingGrenadeEventArgs(Player thrower, EffectGrenade grenade, Collider[] targets) { Thrower = thrower ?? Server.Host; GrenadeType = grenadeDictionary[grenade.GetType()]; Grenade = grenade; TargetsToAffect = ListPool <Player> .Shared.Rent(); foreach (Collider collider in targets) { if (!(Grenade is ExplosionGrenade) || !collider.TryGetComponent(out IDestructible destructible) || !ReferenceHub.TryGetHubNetID(destructible.NetworkId, out ReferenceHub hub)) { continue; } Player player = Player.Get(hub); if (player == null) { continue; } if (!TargetsToAffect.Contains(player)) { TargetsToAffect.Add(player); } } }
private static void Prefix(EffectGrenade __instance) { if (Items.C4Charge.Instance.IsSticky && Items.C4Charge.PlacedCharges.ContainsKey(Pickup.Get(__instance))) { __instance.gameObject.GetComponent <Rigidbody>().isKinematic = true; } }
/// <summary> /// Initializes a new instance of the <see cref="ExplodingGrenadeEventArgs"/> class. /// </summary> /// <param name="thrower"><inheritdoc cref="Thrower"/></param> /// <param name="grenade"><inheritdoc cref="Grenade"/></param> /// <param name="players"><inheritdoc cref="TargetsToAffect"/></param> public ExplodingGrenadeEventArgs(Player thrower, EffectGrenade grenade, List <Player> players) { Thrower = thrower ?? Server.Host; GrenadeType = grenadeDictionary[grenade.GetType()]; Grenade = grenade; TargetsToAffect = ListPool <Player> .Shared.Rent(); TargetsToAffect.AddRange(players); }
private void OnShooting(ShootingEventArgs ev) { if (!AllowShoot) { return; } Vector3 forward = ev.Shooter.CameraTransform.forward; if (Physics.Raycast(ev.Shooter.CameraTransform.position + forward, forward, out var hit, 500)) { EffectGrenade grenade = hit.collider.gameObject.GetComponentInParent <EffectGrenade>(); if (grenade == null) { return; } if (PlacedCharges.ContainsKey(Pickup.Get(grenade))) { C4Handler(Pickup.Get(grenade), ShotMethod); } } }
/// <summary> /// Inits the <see cref="CollisionHandler"/> object. /// </summary> /// <param name="owner">The grenade owner.</param> /// <param name="grenade">The grenade component.</param> public void Init(GameObject owner, ThrownProjectile grenade) { Owner = owner; Grenade = (EffectGrenade)grenade; initialized = true; }