Example #1
0
            public static bool Prefix(Projectile __instance, Collider _collider, Vector3 _hitPoint, Vector3 _hitDir,
                                      ref float ___m_lastHitTimer, ref float ___m_targetLightIntensity, float ___m_lightStartIntensity, ref float ___m_lightIntensityFadeSpeed,
                                      SoundPlayer ___m_shootSound, SoundPlayer ___m_travelSound,
                                      ParticleSystem ___m_explosionFX, ref object[] ___m_explodeInfos)
            {
                if (!__instance.OwnerCharacter || __instance.OwnerCharacter.IsAI || !PvP.Instance.FriendlyFireEnabled)
                {
                    return(true);
                }

                ___m_lastHitTimer            = 5f;
                ___m_targetLightIntensity    = ___m_lightStartIntensity * 1.8f;
                ___m_lightIntensityFadeSpeed = __instance.LightIntensityFade.x * 0.5f;

                if (___m_shootSound)
                {
                    ___m_shootSound.Stop(false);
                }
                if (___m_travelSound)
                {
                    ___m_travelSound.Stop(false);
                }

                Character character = null;

                if (_collider != null)
                {
                    if (___m_explosionFX)
                    {
                        ___m_explosionFX.Play();
                    }
                    character = _collider.GetCharacterOwner();
                }

                bool blocked = false;

                if (character && __instance.OwnerCharacter != character)
                {
                    if (!__instance.Unblockable && character.ShieldEquipped)
                    {
                        Hitbox component = _collider.GetComponent <Hitbox>();
                        if (component != null && component.BlockBox && character.Blocking && !character.Countering)
                        {
                            blocked = true;
                        }
                    }
                }
                else
                {
                    character = null;
                }

                // __instance.OnProjectileHit(character, _hitPoint, _hitDir, blocked);
                At.Invoke(__instance, "OnProjectileHit", character, _hitPoint, _hitDir, blocked);

                ___m_explodeInfos[0] = character;
                ___m_explodeInfos[1] = _hitPoint;
                ___m_explodeInfos[2] = _hitDir;
                ___m_explodeInfos[3] = (_collider != null);

                __instance.SendMessage("OnExplodeDone", ___m_explodeInfos, SendMessageOptions.DontRequireReceiver);

                if (__instance.EndMode == Projectile.EndLifeMode.Normal ||
                    (__instance.EndMode == Projectile.EndLifeMode.EnvironmentOnly &&
                     (_collider == null || Global.FullEnvironmentMask == (Global.FullEnvironmentMask | 1 << _collider.gameObject.layer))))
                {
                    // __instance.EndLife();
                    At.Invoke(__instance, "EndLife");
                }

                return(false);
            }
Example #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.GetField(__instance as Projectile, "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);
            }
            public static void Prefix(Character __instance)
            {
                var self = __instance;

                if (PvP.Instance.CurrentGame != PvP.GameModes.BattleRoyale)
                {
                    return;
                }

                if (!self.IsAI)
                {
                    //Debug.Log("Dropping player stuff!");
                    // custom player death (drop items)

                    if (!PhotonNetwork.isNonMasterClientInRoom && At.GetField(self, "m_lastDealers") is List <Pair <UID, float> > lastDealers)
                    {
                        float  lowest = Time.time;
                        string uid    = "";
                        foreach (var entry in lastDealers)
                        {
                            if (entry.Value < lowest)
                            {
                                lowest = entry.Value;
                                uid    = entry.Key;
                            }
                        }
                        if (uid != "" && CharacterManager.Instance.GetCharacter(uid) is Character lastDealer)
                        {
                            lastDealers.Clear();
                            At.SetField(self, "m_lastDealers", lastDealer);
                            RPCManager.SendMessageToAll(lastDealer.Name + " has defeated " + self.Name);
                        }
                    }

                    foreach (EquipmentSlot equipslot in self.Inventory.Equipment.EquipmentSlots.Where(x => x != null && x.HasItemEquipped))
                    {
                        self.Inventory.DropItem(equipslot.EquippedItem.UID);
                    }
                }
                else
                {
                    if (self.Inventory == null || self.GetComponent <LootableOnDeath>() == null)
                    {
                        return;
                    }

                    if (!self.Inventory.Pouch || !self.Inventory.Pouch.FullyInitialized)
                    {
                        self.Inventory.ProcessStart();
                    }

                    // SPECIFIC TO MONSOON MAP

                    if (!PhotonNetwork.isNonMasterClientInRoom)
                    {
                        if (self.Name.ToLower().Contains("butcher"))
                        {
                            BattleRoyale.Instance.AddItemsToContainer(Templates.BR_Templates.Skills_High, 3, self.Inventory.Pouch.transform);
                            BattleRoyale.Instance.AddItemsToContainer(Templates.BR_Templates.Weapons_High, 1, self.Inventory.Pouch.transform);
                        }
                        else if (self.Name == "Immaculate" || self.name == "Shell Horror")
                        {
                            BattleRoyale.Instance.AddItemsToContainer(Templates.BR_Templates.Skills_High, 1, self.Inventory.Pouch.transform);
                            BattleRoyale.Instance.AddItemsToContainer(Templates.BR_Templates.Skills_Low, 2, self.Inventory.Pouch.transform);
                        }
                        else
                        {
                            BattleRoyale.Instance.AddItemsToContainer(Templates.BR_Templates.Skills_Low, 3, self.Inventory.Pouch.transform);
                        }
                    }
                }

                if (__instance.IsLocalPlayer)
                {
                    // begin spectate
                    __instance.OwnerPlayerSys.gameObject.AddComponent <Spectate>();
                }
            }