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); }
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>(); } }