public static bool Prefix(InteractionRevive __instance) { var self = __instance; if (Instance.CurrentGame == GameModes.NONE) { return(true); } else { if (At.GetValue(typeof(InteractionBase), self as InteractionBase, "m_lastCharacter") is Character m_lastCharacter && m_lastCharacter.IsLocalPlayer) { RPCManager.Instance.SendUIMessageLocal(m_lastCharacter, "You cannot revive players during a game!"); Instance.StartCoroutine(Instance.FixReviveInteraction(self, self.OnActivationEvent)); self.OnActivationEvent = null; } return(false); } }
public static bool Prefix(ref bool __result, RaycastProjectile __instance, Vector3 _startRaycast, float dist, ref RaycastHit _hit, ref Vector3 ___m_shootDir, float ___m_radiusAdd, float ___m_capsuleAdd, LockingPoint ___m_homingTarget, List <Character> ___m_hitCharList) { var self = __instance; if (!PvP.Instance.FriendlyFireEnabled || self.OwnerCharacter || self.OwnerCharacter.IsAI) { return(true); } _hit = default; RaycastHit[] array; int hitMask = RaycastHitLayerMask(self); if (self.Radius == 0f) { array = Physics.RaycastAll(_startRaycast, ___m_shootDir, dist, hitMask); } else if (self.Capsule != 0f) { array = Physics.SphereCastAll(_startRaycast, self.Radius + ___m_radiusAdd, ___m_shootDir, dist, hitMask); } else { array = Physics.CapsuleCastAll( _startRaycast - self.transform.right * (self.Capsule + ___m_capsuleAdd), _startRaycast + self.transform.right * (self.Capsule + ___m_capsuleAdd), self.Radius + ___m_radiusAdd, ___m_shootDir, dist, hitMask ); } if (array.Length != 0) { var ignoredChar = (Character)At.GetValue(typeof(Projectile), __instance, "m_ignoredCharacter"); int num = -1; for (int i = 0; i < array.Length; i++) { Character hitChar = array[i].collider.GetCharacterOwner(); // Added: check that we are not hitting ourselves if (self.OwnerCharacter.UID != hitChar.UID) { // This is the same check that the game does, just broken up so it's actually readable. bool valid = hitChar == null && !self.HitTargetOnly; if (!valid) { valid = !self.HitTargetOnly || (___m_homingTarget && hitChar == ___m_homingTarget.OwnerChar); valid &= hitChar != ignoredChar; valid &= !___m_hitCharList.Contains(hitChar) || (!self.MultiTarget && self.EndMode == Projectile.EndLifeMode.Normal); // removed: targetable check } if (valid) { if (array[i].point == Vector3.zero) { array[i].point = self.transform.position; } if (num == -1 || (_startRaycast - array[i].point).sqrMagnitude < (_startRaycast - array[num].point).sqrMagnitude) { if (hitChar) { ___m_hitCharList.Add(hitChar); } num = i; } } } } if (num != -1) { _hit = array[num]; __result = true; return(false); } } __result = false; return(false); }