private static void Prefix(BreakableWindow __instance, ref float damage) { var ev = new EventArgs.DamagingWindowEventArgs(__instance, damage); Handlers.Map.OnDamagingWindow(ev); damage = ev.Damage; }
// Token: 0x06000022 RID: 34 RVA: 0x00002C98 File Offset: 0x00000E98 public static void Prefix(BreakableWindow __instance) { if (SameThings.WindowHealth < 1f || State.BreakableWindows.Contains(__instance)) { return; } __instance.health = ((SameThings.WindowHealth == 0f) ? 9999999f : SameThings.WindowHealth); State.BreakableWindows.Add(__instance); }
private static bool Prefix(BreakableWindow __instance, float damage) => !Handler.IsLobby;
public static bool Prefix(Grenades.Scp018Grenade __instance, Collision collision, float relativeSpeed) { //__instance.damageHurt = 0.95f //__instance.damageScpMultiplier = 4.85f Vector3 velocity = __instance.rb.velocity * __instance.bounceSpeedMultiplier; float num = __instance.topSpeedPerBounce[__instance.bounce]; if (relativeSpeed > num) { __instance.rb.velocity = velocity.normalized * num; if (__instance.actionAllowed) { __instance.bounce = Mathf.Min(__instance.bounce + 1, __instance.topSpeedPerBounce.Length - 1); } } else { if (relativeSpeed > __instance.source.maxDistance) { __instance.source.maxDistance = relativeSpeed; } __instance.rb.velocity = velocity; } if (NetworkServer.active) { Collider collider = collision.collider; int num2 = 1 << collider.gameObject.layer; if (num2 == __instance.layerGlass) { if (__instance.actionAllowed && relativeSpeed >= __instance.breakpointGlass) { __instance.cooldown = __instance.cooldownGlass; BreakableWindow component = collider.GetComponent <BreakableWindow>(); if (component != null) { component.ServerDamageWindow(relativeSpeed * __instance.damageGlass); } } } else if (num2 == __instance.layerDoor) { if (relativeSpeed >= __instance.breakpointDoor) { __instance.cooldown = __instance.cooldownDoor; Door componentInParent = collider.GetComponentInParent <Door>(); if (componentInParent != null && !componentInParent.GrenadesResistant) { componentInParent.DestroyDoor(b: true); } } } else if ((num2 == __instance.layerHitbox || num2 == __instance.layerIgnoreRaycast) && __instance.actionAllowed && relativeSpeed >= __instance.breakpointHurt) { __instance.cooldown = __instance.cooldownHurt; ReferenceHub componentInParent2 = collider.GetComponentInParent <ReferenceHub>(); if (componentInParent2 != null && (ServerConsole.FriendlyFire || componentInParent2.gameObject == __instance.thrower.gameObject || componentInParent2.weaponManager.GetShootPermission(__instance.throwerTeam))) { float num3 = relativeSpeed * __instance.damageHurt * Configs.scp018_damage_multiplier; //componentInParent2.playerStats.ccm.CurClass != RoleType.Scp106 && if (componentInParent2.playerStats.ccm.Classes.SafeGet(componentInParent2.playerStats.ccm.CurClass).team == Team.SCP) { num3 *= __instance.damageScpMultiplier; } componentInParent2.playerStats.HurtPlayer(new PlayerStats.HitInfo(num3, __instance.logName, DamageTypes.Grenade, __instance.throwerGameObject.GetPlayer().GetPlayerId()), componentInParent2.playerStats.gameObject); } } if (__instance.bounce >= __instance.topSpeedPerBounce.Length - 1 && relativeSpeed >= num && !__instance.hasHitMaxSpeed) { __instance.NetworkfuseTime = NetworkTime.time + 10.0; __instance.hasHitMaxSpeed = true; } } //base.OnSpeedCollisionEnter(collision, relativeSpeed); return(false); }
public static bool Prefix(FragGrenade __instance, ref bool __result) { Player thrower = Player.Get(__instance.thrower.gameObject); if (Tracking.PlayersWithSubclasses.ContainsKey(thrower) && Tracking.PlayersWithSubclasses[thrower].Abilities.Contains(AbilityType.HealGrenadeFrag)) { UnityEngine.Collider[] colliders = UnityEngine.Physics.OverlapSphere(__instance.transform.position, 4); Subclass.Instance.map.UpdateHealths(colliders, thrower, "HealGrenadeFragHealAmount"); return(false); } string str = (((Grenade)((EffectGrenade)__instance)).thrower != null) ? ((Grenade)((EffectGrenade)__instance)).thrower.hub.LoggedNameFromRefHub() : ((string)"(UNKNOWN)"); string[] textArray1 = new string[] { "Player ", (string)str, "'s ", (string)((Grenade)((EffectGrenade)__instance)).logName, " grenade exploded." }; ServerLogs.AddLog(ServerLogs.Modules.Logger, string.Concat((string[])textArray1), ServerLogs.ServerLogType.GameEvent, false); if (((EffectGrenade)__instance).serverGrenadeEffect != null) { Transform transform = ((Grenade)((EffectGrenade)__instance)).transform; Object.Instantiate <GameObject>(((EffectGrenade)__instance).serverGrenadeEffect, transform.position, transform.rotation); } Vector3 position = ((EffectGrenade)__instance).transform.position; int num = 0; Collider[] colliderArray = Physics.OverlapSphere(position, __instance.chainTriggerRadius, (int)__instance.damageLayerMask); int index = 0; while (index < colliderArray.Length) { Collider collider = colliderArray[index]; BreakableWindow component = collider.GetComponent <BreakableWindow>(); if (component != null) { if ((component.transform.position - position).sqrMagnitude <= __instance.sqrChainTriggerRadius) { component.ServerDamageWindow(500f); } } else { Door componentInParent = collider.GetComponentInParent <Door>(); if (componentInParent != null) { if ((!componentInParent.GrenadesResistant && (!componentInParent.commandlock && (!componentInParent.decontlock && !componentInParent.lockdown))) && ((componentInParent.transform.position - position).sqrMagnitude <= __instance.sqrChainTriggerRadius)) { componentInParent.DestroyDoor(true); } } else if (((__instance.chainLengthLimit == -1) || (__instance.chainLengthLimit > ((EffectGrenade)__instance).currentChainLength)) && ((__instance.chainConcurrencyLimit == -1) || (__instance.chainConcurrencyLimit > num))) { Pickup componentInChildren = collider.GetComponentInChildren <Pickup>(); if ((componentInChildren != null) && __instance.ChangeIntoGrenade(componentInChildren)) { num = (int)(num + 1); } } } index = (int)(index + 1); } Player pthrower = Player.Get(((EffectGrenade)__instance).thrower.gameObject); foreach (GameObject obj2 in PlayerManager.players) { if (!ServerConsole.FriendlyFire && ((obj2 != ((EffectGrenade)__instance).thrower.gameObject) && (!obj2.GetComponent <WeaponManager>().GetShootPermission(((EffectGrenade)__instance).throwerTeam, false))) && !Tracking.PlayerHasFFToPlayer(pthrower, Player.Get(obj2))) { Exiled.API.Features.Log.Debug($"Player {Player.Get(obj2)?.Nickname} could not be hurt from a grenade. Thrower has ff to player: {Tracking.PlayerHasFFToPlayer(pthrower, Player.Get(obj2))}", Subclass.Instance.Config.Debug); continue; } PlayerStats component = obj2.GetComponent <PlayerStats>(); if ((component != null) && component.ccm.InWorld) { float amount = (float)(__instance.damageOverDistance.Evaluate(Vector3.Distance(position, component.transform.position)) * (component.ccm.IsHuman() ? ConfigFile.ServerConfig.GetFloat("human_grenade_multiplier", 0.7f) : ConfigFile.ServerConfig.GetFloat("scp_grenade_multiplier", 1f))); if (amount > __instance.absoluteDamageFalloff) { Exiled.API.Features.Log.Debug($"Attempting to hurt player {Player.Get(obj2)?.Nickname} with a grenade", Subclass.Instance.Config.Debug); Transform[] grenadePoints = component.grenadePoints; index = 0; while (true) { if (index < grenadePoints.Length) { Transform transform = grenadePoints[index]; if (Physics.Linecast(position, transform.position, (int)__instance.hurtLayerMask)) { index = (int)(index + 1); continue; } component.HurtPlayer(new PlayerStats.HitInfo(amount, (((EffectGrenade)__instance).thrower != null) ? ((EffectGrenade)__instance).thrower.hub.LoggedNameFromRefHub() : ((string)"(UNKNOWN)"), DamageTypes.Grenade, ((EffectGrenade)__instance).thrower.hub.queryProcessor.PlayerId), obj2, false); } if (!component.ccm.IsAnyScp()) { ReferenceHub hub = ReferenceHub.GetHub(obj2); float duration = __instance.statusDurationOverDistance.Evaluate(Vector3.Distance(position, component.transform.position)); hub.playerEffectsController.EnableEffect(hub.playerEffectsController.GetEffect <Burned>(), duration, false); hub.playerEffectsController.EnableEffect(hub.playerEffectsController.GetEffect <Concussed>(), duration, false); } break; } } } } __result = true; return(false); }
/// <summary> /// Initializes a new instance of the <see cref="DamagingWindowEventArgs"/> class. /// </summary> /// <param name="window"><inheritdoc cref="Window"/></param> /// <param name="damage">The damage being dealt.</param> /// <param name="handler"><inheritdoc cref="Handler"/></param> public DamagingWindowEventArgs(BreakableWindow window, float damage, DamageHandlerBase handler) { Window = Window.Get(window); Handler = new CustomDamageHandler(handler is AttackerDamageHandler attackerDamageHandler ? Player.Get(attackerDamageHandler.Attacker.Hub) : null, handler); Handler.Damage = damage; }
/// <summary> /// Initializes a new instance of the <see cref="DamagingWindowEventArgs"/> class. /// </summary> /// <param name="window"><inheritdoc cref="Window"/></param> /// <param name="damage"><inheritdoc cref="Damage"/></param> public DamagingWindowEventArgs(BreakableWindow window, float damage) { Window = window; Damage = damage; }
public static bool Prefix(FragGrenade __instance, ref bool __result) { Player thrower = Player.Get(__instance.thrower.gameObject); Dictionary <Player, float> damages = new Dictionary <Player, float>(); Vector3 position = ((EffectGrenade)__instance).transform.position; int num = 0; Collider[] colliderArray = Physics.OverlapSphere(position, __instance.chainTriggerRadius, (int)__instance.damageLayerMask); int index = 0; foreach (GameObject obj2 in PlayerManager.players) { if (!ServerConsole.FriendlyFire && ((obj2 != ((EffectGrenade)__instance).thrower.gameObject) && (!obj2.GetComponent <WeaponManager>().GetShootPermission(((EffectGrenade)__instance).throwerTeam, false)))) { continue; } PlayerStats component = obj2.GetComponent <PlayerStats>(); if ((component != null) && component.ccm.InWorld) { float amount = (float)(__instance.damageOverDistance.Evaluate(Vector3.Distance(position, component.transform.position)) * (component.ccm.IsHuman() ? ConfigFile.ServerConfig.GetFloat("human_grenade_multiplier", 0.7f) : ConfigFile.ServerConfig.GetFloat("scp_grenade_multiplier", 1f))); damages.Add(Player.Get(obj2), amount); } } var ev = new ExplodingGrenadeEventArgs(thrower, damages, true, __instance.gameObject); Exiled.Events.Handlers.Map.OnExplodingGrenade(ev); if (!ev.IsAllowed) { return(false); } while (index < colliderArray.Length) { Collider collider = colliderArray[index]; BreakableWindow component = collider.GetComponent <BreakableWindow>(); if (component != null) { if ((component.transform.position - position).sqrMagnitude <= __instance.sqrChainTriggerRadius) { component.ServerDamageWindow(500f); } } else { DoorVariant componentInParent = collider.GetComponentInParent <DoorVariant>(); if (componentInParent != null && componentInParent is IDamageableDoor damageableDoor) { damageableDoor.ServerDamage(__instance.damageOverDistance.Evaluate(Vector3.Distance(position, componentInParent.transform.position)), DoorDamageType.Grenade); } else if (((__instance.chainLengthLimit == -1) || (__instance.chainLengthLimit > ((EffectGrenade)__instance).currentChainLength)) && ((__instance.chainConcurrencyLimit == -1) || (__instance.chainConcurrencyLimit > num))) { Pickup componentInChildren = collider.GetComponentInChildren <Pickup>(); if ((componentInChildren != null) && __instance.ChangeIntoGrenade(componentInChildren)) { num = (int)(num + 1); } } } index = (int)(index + 1); } foreach (var item in damages) { if (item.Value > __instance.absoluteDamageFalloff) { PlayerStats component = item.Key.GameObject.GetComponent <PlayerStats>(); Transform[] grenadePoints = component.grenadePoints; index = 0; while (true) { if (index < grenadePoints.Length) { Transform transform = grenadePoints[index]; if (Physics.Linecast(position, transform.position, (int)__instance.hurtLayerMask)) { index = (int)(index + 1); continue; } component.HurtPlayer(new PlayerStats.HitInfo(item.Value, (((EffectGrenade)__instance).thrower != null) ? ((EffectGrenade)__instance).thrower.hub.LoggedNameFromRefHub() : ((string)"(UNKNOWN)"), DamageTypes.Grenade, ((EffectGrenade)__instance).thrower.hub.queryProcessor.PlayerId), item.Key.GameObject, false); } if (!component.ccm.IsAnyScp()) { ReferenceHub hub = item.Key.ReferenceHub; float duration = __instance.statusDurationOverDistance.Evaluate(Vector3.Distance(position, component.transform.position)); hub.playerEffectsController.EnableEffect(hub.playerEffectsController.GetEffect <Burned>(), duration, false); hub.playerEffectsController.EnableEffect(hub.playerEffectsController.GetEffect <Concussed>(), duration, false); } break; } } } //if (Tracking.PlayersWithSubclasses.ContainsKey(thrower) && Tracking.PlayersWithSubclasses[thrower].Abilities.Contains(AbilityType.HealGrenadeFrag)) //{ // if (!Tracking.CanUseAbility(thrower, AbilityType.HealGrenadeFrag, Tracking.PlayersWithSubclasses[thrower])) // { // Tracking.DisplayCantUseAbility(thrower, AbilityType.HealGrenadeFrag, Tracking.PlayersWithSubclasses[thrower], "heal frag"); // } // else // { // Tracking.UseAbility(thrower, AbilityType.HealGrenadeFrag, Tracking.PlayersWithSubclasses[thrower]); // UnityEngine.Collider[] colliders = UnityEngine.Physics.OverlapSphere(__instance.transform.position, 4); // Subclass.Instance.map.UpdateHealths(colliders, thrower, "HealGrenadeFragHealAmount"); // return false; // } //} string str = (((Grenade)((EffectGrenade)__instance)).thrower != null) ? ((Grenade)((EffectGrenade)__instance)).thrower.hub.LoggedNameFromRefHub() : ((string)"(UNKNOWN)"); string[] textArray1 = new string[] { "Player ", (string)str, "'s ", (string)((Grenade)((EffectGrenade)__instance)).logName, " grenade exploded." }; ServerLogs.AddLog(ServerLogs.Modules.Logger, string.Concat((string[])textArray1), ServerLogs.ServerLogType.GameEvent, false); if (((EffectGrenade)__instance).serverGrenadeEffect != null) { Transform transform = ((Grenade)((EffectGrenade)__instance)).transform; Object.Instantiate <GameObject>(((EffectGrenade)__instance).serverGrenadeEffect, transform.position, transform.rotation); } __result = true; return(false); }
public static bool Prefix(Scp096 __instance) { if (!__instance.CanAttack) { return(false); } __instance._leftAttack = !__instance._leftAttack; __instance._attacking = true; __instance.PlayerState = Scp096PlayerState.Attacking; Transform playerCameraReference = __instance.Hub.PlayerCameraReference; Collider[] array = Physics.OverlapSphere(playerCameraReference.position + playerCameraReference.forward * 1.25f, SCP096Re.instance.Config.re096_attack_radius, LayerMask.GetMask(new string[] { "PlyCenter", "Door", "Glass" })); HashSet <GameObject> hashSet = new HashSet <GameObject>(); float num = 0f; foreach (Collider collider in array) { Door componentInParent = collider.GetComponentInParent <Door>(); if (componentInParent != null) { componentInParent.DestroyDoor(true); if (componentInParent.destroyed && num < 0.5f) { num = 1f; } } else { BreakableWindow componentInParent2 = collider.GetComponentInParent <BreakableWindow>(); if (componentInParent2 != null && num < 0.25f) { componentInParent2.ServerDamageWindow(500f); num = 0.5f; break; } ReferenceHub componentInParent3 = collider.GetComponentInParent <ReferenceHub>(); if (!(componentInParent3 == null) && !(componentInParent3 == __instance.Hub) && hashSet.Add(componentInParent3.gameObject) && !Physics.Linecast(__instance.Hub.transform.position, componentInParent3.transform.position, LayerMask.GetMask(new string[] { "Default", "Door", "Glass" }))) { num = 1.2f; if ((__instance._targets.Contains(componentInParent3) && SCP096Re.instance.Config.re096_hurt_targets_only) || !SCP096Re.instance.Config.re096_hurt_targets_only) { if (__instance.Hub.playerStats.HurtPlayer(new PlayerStats.HitInfo(9696f, __instance.Hub.LoggedNameFromRefHub(), DamageTypes.Scp096, componentInParent3.queryProcessor.PlayerId), componentInParent3.gameObject)) { num = 1.35f; __instance._targets.Remove(componentInParent3); NetworkServer.SendToAll <Scp096OnKillMessage>(default(Scp096OnKillMessage), 0); } } } } } if (num > 0f) { NetworkServer.SendToClientOfPlayer <Scp096HitmarkerMessage>(__instance.Hub.characterClassManager.netIdentity, new Scp096HitmarkerMessage(num)); } __instance._attackDuration = 0.5f; return(false); }
private void OnShooting(ShootingEventArgs ev) { if (CheckItem(ev.Shooter.CurrentItem)) { ev.IsAllowed = false; try { int bullets = Plugin.Singleton.Config.ItemConfigs.ShotgunCfg.SpreadCount; if (ev.Shooter.CurrentItem.durability <= bullets) { bullets = (int)ev.Shooter.CurrentItem.durability; } Ray[] rays = new Ray[bullets]; for (int i = 0; i < rays.Length; i++) { Vector3 forward = ev.Shooter.CameraTransform.forward; rays[i] = new Ray(ev.Shooter.CameraTransform.position + forward, RandomAimcone() * forward); } RaycastHit[] hits = new RaycastHit[bullets]; bool[] didHit = new bool[hits.Length]; for (int i = 0; i < hits.Length; i++) { didHit[i] = Physics.Raycast(rays[i], out hits[i], 500f, 1208246273); } WeaponManager component = ev.Shooter.ReferenceHub.weaponManager; bool confirm = false; for (int i = 0; i < hits.Length; i++) { try { if (!didHit[i]) { continue; } HitboxIdentity hitbox = hits[i].collider.GetComponent <HitboxIdentity>(); if (hitbox != null) { Player target = Player.Get(hits[i].collider.GetComponentInParent <ReferenceHub>()); if (target == null) { continue; } if (component.GetShootPermission(target.ReferenceHub.characterClassManager, Server.FriendlyFire)) { float damage = HitHandler(hitbox); if (target.Role == RoleType.Scp106) { damage /= 10; } float distance = Vector3.Distance(ev.Shooter.Position, target.Position); for (int f = 0; f < (int)distance; f++) { damage *= Plugin.Singleton.Config.ItemConfigs.ShotgunCfg.DamageFalloffModifier; } target.Hurt(damage, DamageTypes.FromWeaponId(ev.Shooter.ReferenceHub.weaponManager.curWeapon), ev.Shooter.Nickname, ev.Shooter.Id); component.RpcPlaceDecal(true, (sbyte)target.ReferenceHub.characterClassManager.Classes.SafeGet(target.Role).bloodType, hits[i].point + hits[i].normal * 0.01f, Quaternion.FromToRotation(Vector3.up, hits[i].normal)); confirm = true; } continue; } } catch (Exception e) { Log.Error($"{e}\n{e.StackTrace}"); } BreakableWindow window = hits[i].collider.GetComponent <BreakableWindow>(); if (window != null) { window.ServerDamageWindow(Plugin.Singleton.Config.ItemConfigs.ShotgunCfg.BaseDamage); confirm = true; continue; } component.RpcPlaceDecal(false, component.curWeapon, hits[i].point + hits[i].normal * 0.01f, Quaternion.FromToRotation(Vector3.up, hits[i].normal)); } for (int i = 0; i < bullets; i++) { component.RpcConfirmShot(confirm, component.curWeapon); } ev.Shooter.SetWeaponAmmo(ev.Shooter.CurrentItem, (int)ev.Shooter.CurrentItem.durability - bullets); } catch (Exception e) { Log.Error(e.ToString()); } } }