예제 #1
0
 private static int RaycastHitLayerMask(RaycastProjectile __instance)
 {
     if (__instance.OnlyExplodeOnLayers)
     {
         return(__instance.ExplodeOnContactWithLayers);
     }
     if (__instance.HitLayer == RaycastProjectile.HitLayers.Both)
     {
         return(Global.ProjectileHitAllMask);
     }
     if (__instance.HitLayer == RaycastProjectile.HitLayers.MeleeHitBox)
     {
         return(Global.ProjectileHitMeleeMask);
     }
     return(Global.ProjectileHitRangedMask);
 }
예제 #2
0
            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);
            }