Example #1
0
        private void CustomPlayerSetup(Character _char)
        {
            // wipe character

            var save = SaveManager.Instance.CreateNewCharacterSave();

            save.PSave.NewSave      = true;
            save.PSave.ManaPoint    = 0;
            save.PSave.UID          = _char.UID;
            save.PSave.Name         = _char.Name;
            save.PSave.VisualData   = _char.VisualData;
            save.PSave.Food         = 1000f;
            save.PSave.Drink        = 1000f;
            save.PSave.HardcoreMode = false;

            save.ApplyLoadedSaveToChar(_char);

            // ========= set custom stats ==========

            At.SetField(_char.Stats, "m_maxHealthStat", new Stat(500f));
            At.SetField(_char.Stats, "m_maxStamina", new Stat(200f));
            At.SetField(_char.Stats, "m_maxManaStat", new Stat(75f));
            _char.Stats.GiveManaPoint(1);

            // ========= finalize ==========

            // disable character cheats
            _char.Cheats.Invincible = false;
            _char.Cheats.IndestructibleEquipment      = false;
            _char.Cheats.NotAffectedByWeightPenalties = false;

            _char.Cheats.NeedsEnabled = true;

            // refresh stats
            At.Invoke(_char.Stats, "UpdateVitalStats");
            _char.Stats.Reset();
            _char.Stats.RestoreAllVitals();

            if (At.GetField(_char.QuickSlotMngr, "m_quickSlots") is QuickSlot[] m_quickSlots)
            {
                for (int i = 0; i < m_quickSlots.Count(); i++)
                {
                    _char.QuickSlotMngr.GetQuickSlot(i).Clear();
                }
            }
        }
            public static bool Prefix(ItemContainer __instance, Item _item, ref bool __result)
            {
                var self = __instance;

                if (PhotonNetwork.isNonMasterClientInRoom)
                {
                    return(true);
                }

                if (BattleRoyale.Instance.IsGameplayStarting || PvP.Instance.CurrentGame == PvP.GameModes.BattleRoyale)
                {
                    if (_item is Skill && self.OwnerCharacter != null && !self.OwnerCharacter.IsAI)
                    {
                        if (!self.OwnerCharacter.Inventory.SkillKnowledge.IsItemLearned(_item.ItemID))
                        {
                            _item.ChangeParent(self.OwnerCharacter.Inventory.SkillKnowledge.transform);
                        }

                        __result = true;
                        return(false);
                    }

                    if (_item is Weapon && self.OwnerCharacter != null)
                    {
                        if (Templates.Weapon_Skills.ContainsKey((int)(_item as Weapon).Type))
                        {
                            int id = Templates.Weapon_Skills[(int)(_item as Weapon).Type];
                            if (self.OwnerCharacter.Inventory.SkillKnowledge is CharacterSkillKnowledge skills && !skills.IsItemLearned(id))
                            {
                                var skill = ItemManager.Instance.GenerateItemNetwork(id);

                                skill.ChangeParent(skills.transform);

                                var learnedItems = At.GetField(skills as CharacterKnowledge, "m_learnedItems") as List <Item>;
                                learnedItems.Add(skill);
                            }
                        }
                    }
                }

                return(true);
            }
Example #3
0
            public static bool Prefix(InteractionRevive __instance)
            {
                var self = __instance;

                if (Instance.CurrentGame == GameModes.NONE)
                {
                    return(true);
                }
                else
                {
                    if (At.GetField(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);
                }
            }
Example #4
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>();
                }
            }