Example #1
0
        public void SendSpawnEnemyRPC(string uid, float x, float y, float z)
        {
            if (BattleRoyale.Instance.EnemyCharacters.Find(w => w.UID == uid) is Character c)
            {
                c.gameObject.SetActive(true);

                c.Teleport(new Vector3(x, y, z), c.transform.rotation);

                // HIGHLY SPECIFIC TO MONSOON
                int value = 50;
                if (c.Name.ToLower().Contains("butcher"))
                {
                    value = 200;
                }
                else if (c.name.ToLower().Contains("illuminator"))
                {
                    value = 20;
                }
                At.SetField(c.Stats, "m_maxHealthStat", new Stat(value));

                //BattleRoyale.Instance..FixEnemyStats(c.Stats);

                //foreach (PlayerSystem ps in Global.Lobby.PlayersInLobby.Where(w => w.IsLocalPlayer))
                //{
                //    SendUIMessageLocal(ps.ControlledCharacter, c.Name + " has spawned!");
                //}

                //BattleRoyale.Instance..EnemyCharacters.Remove(c);
            }
        }
Example #2
0
        private void ReleaseTarget()
        {
            hasTarget = false;
            m_target  = null;

            At.SetField(VideoCamera.Instance, "m_targetTrans", null);
            At.SetField(VideoCamera.Instance, "m_state", VideoCamera.VideoCamState.NORMAL);
        }
Example #3
0
        private void SetFreeCam(bool active)
        {
            At.Invoke(VideoCamera.Instance, "SetCameraActive", active);

            if (active)
            {
                At.SetField(VideoCamera.Instance, "m_flyMode", true);
                Global.LockCursor(true);
            }
        }
Example #4
0
        private void SetTarget(Character target)
        {
            hasTarget = true;
            m_target  = target;
            Global.LockCursor(true);

            RPCManager.Instance.SendUIMessageLocal(m_ownerCharacter, "Spectating " + target.Name);

            At.SetField(VideoCamera.Instance, "m_targetTrans", target.transform);
            At.SetField(VideoCamera.Instance, "m_state", VideoCamera.VideoCamState.FOLLOW_POS);
        }
Example #5
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();
                }
            }
        }
Example #6
0
        private IEnumerator GenerateSupplyDrops()
        {
            //OLogger.Warning("generating supply drops!");

            if (ActiveItemContainers.Count() > 0)
            {
                if (PhotonNetwork.offlineMode)
                {
                    RPCManager.Instance.RPCSendCleanup();
                }
                else
                {
                    RPCManager.Instance.photonView.RPC("RPCSendCleanup", PhotonTargets.All, new object[0]);
                }

                yield return(new WaitForSeconds(2f)); // wait 2 seconds after destroying the active objects, so we dont start destroying the new ones!
            }

            if (SupplyDropCounter == 1)
            {
                // first drop. generate initial supply caches for all players

                foreach (PlayerSystem ps in Global.Lobby.PlayersInLobby)
                {
                    Character     _char = ps.ControlledCharacter;
                    TreasureChest stash = ItemManager.Instance.GenerateItemNetwork(1000110).GetComponent <TreasureChest>();
                    stash.transform.position = _char.transform.position + new Vector3(1.5f, 0, 1.5f);
                    ActiveItemContainers.Add(stash.gameObject);

                    if (!PhotonNetwork.offlineMode)
                    {
                        RPCManager.Instance.photonView.RPC("RPCGenerateStash", PhotonTargets.Others, new object[]
                        {
                            stash.ItemID,
                            stash.UID,
                            stash.transform.position.x,
                            stash.transform.position.y,
                            stash.transform.position.z
                        });
                    }

                    At.Invoke(stash, "InitDrops");
                    for (int i = 0; i < 5; i++)
                    {
                        At.SetField(stash, "m_hasGeneratedContent", false);
                        stash.GenerateContents();
                    }
                }
            }
            else
            {
                RPCManager.SendMessageToAll("Supply Chests are spawning!");

                // generate chest or ornate chest
                List <Vector3> locations = Templates.BR_Templates.SupplyDropLocations[SceneManagerHelper.ActiveSceneName].ToList();

                // 1 supply drop per 2 players. minimum of 2 drops.
                int numOfDrops = (int)Math.Ceiling(PlayerManager.Instance.GetRemainingPlayers().Count() * 0.5f);
                numOfDrops = (int)Mathf.Clamp(numOfDrops, 2, locations.Count());

                //Debug.Log("Generating " + numOfDrops + " supply drops from a locations list size of " + locations.Count());
                for (int i = 0; i < numOfDrops; i++)
                {
                    if (locations.Count == 0)
                    {
                        break;
                    }

                    int random = UnityEngine.Random.Range(0, locations.Count());
                    //Debug.Log("Rolled location index " + random);
                    GenerateChestSingle(locations[random]);
                    locations.RemoveAt(random);
                }
            }
        }
Example #7
0
        private void LocalSceneSetup()
        {
            // set TOD
            EnvironmentConditions.Instance.SetTimeOfDay(Templates.BR_Templates.TimeOfDayStarts[SceneManagerHelper.ActiveSceneName]);

            // DEACTIVATE OBJECTS
            if (Templates.BR_Templates.ObjectsToDeactivate.ContainsKey(SceneManagerHelper.ActiveSceneName))
            {
                foreach (string s in Templates.BR_Templates.ObjectsToDeactivate[SceneManagerHelper.ActiveSceneName])
                {
                    if (GameObject.Find(s) is GameObject obj)
                    {
                        if (s == "JesusBeam")
                        {
                            beamObject = obj;
                        }                                           // hold onto the jesusbeam

                        obj.SetActive(false);
                    }
                }
            }

            // ACTIVATE OBJECTS
            if (Templates.BR_Templates.ObjectsToActivate.ContainsKey(SceneManagerHelper.ActiveSceneName))
            {
                foreach (string s in Templates.BR_Templates.ObjectsToActivate[SceneManagerHelper.ActiveSceneName])
                {
                    if (GameObject.Find(s) is GameObject obj)
                    {
                        obj.SetActive(true);
                    }
                    else if (FindInactiveObjectByName(s) is GameObject obj2)
                    {
                        obj2.SetActive(true);
                    }
                }
            }

            // get enemy list for RPC setactive calls
            EnemyCharacters.Clear();
            foreach (Character c in CharacterManager.Instance.Characters.Values.Where(x => x.IsAI && x.Faction != Character.Factions.Player))
            {
                //Debug.Log("adding " + c.Name + " to enemycharacters dict!");
                EnemyCharacters.Add(c);
                c.gameObject.SetActive(false);
            }

            //// ====== setup local characters =======

            foreach (PlayerSystem ps in Global.Lobby.PlayersInLobby.Where(x => x.IsLocalPlayer))
            {
                Character c = ps.ControlledCharacter;

                var pouchUID = "Pouch_" + c.UID;
                if (ItemManager.Instance.GetItem(pouchUID))
                {
                    ItemManager.Instance.DestroyItem(pouchUID);
                }

                // fix inventory/pouch
                ItemContainer pouchContainer = null;
                if (c.Inventory.PouchPrefab)
                {
                    var transform = Instantiate(c.Inventory.PouchPrefab);
                    transform.SetParent(base.transform, false);
                    pouchContainer = transform.GetComponent <ItemContainer>();
                    pouchContainer.SetKeepAlive();
                    pouchContainer.UID = "CustomPouch_" + c.UID;
                    pouchContainer.ProcessInit();
                    At.SetField(c.Inventory, "m_inventoryPouch", pouchContainer);

                    if (PhotonNetwork.isNonMasterClientInRoom)
                    {
                        pouchContainer.ForceUpdateParentChange();
                    }
                }
                if (c.Inventory.MapKnowledge == null)
                {
                    var mk = new CharacterMapKnowledge();
                    mk.Init();
                    At.SetField(c.Inventory, "m_mapKnowledge", mk);
                }
                c.Inventory.Equipment.ProcessStart();

                // give starter items
                SetupStarterPack(c);

                // DOUBLE PURGE
                c.StatusEffectMngr.Purge();
            }

            // ==== disable compass ====

            foreach (UICompass compass in Resources.FindObjectsOfTypeAll <UICompass>())
            {
                compass.Hide();
            }
        }
            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>();
                }
            }