Ejemplo n.º 1
0
        static private bool IsCampingAllowed(Character character, Vector3 position)
        {
            AreaManager.AreaEnum currentArea = (AreaManager.AreaEnum)AreaManager.Instance.CurrentArea.ID;
            bool result;

            if (currentArea.IsContainedIn(CITIES))
            {
                result = _campingSpots.Value.HasFlag(CampingSpots.Cities);
            }
            else if (currentArea.IsContainedIn(OPEN_REGIONS))
            {
                result = _campingSpots.Value.HasFlag(CampingSpots.OpenRegions) ||
                         _campingSpots.Value.HasFlag(CampingSpots.Butterflies) && IsNearButterflies(position);
            }
            else
            {
                result = _campingSpots.Value.HasFlag(CampingSpots.Dungeons);
            }

            if (!result)
            {
                character.CharacterUI.ShowInfoNotification(CANT_CAMP_NOTIFICATION);
            }

            return(result);
        }
    private void DefeatScenariosContainer_AwakeInit(On.DefeatScenariosContainer.orig_AwakeInit orig, DefeatScenariosContainer self)
    {
        orig(self);
        try
        {
            AreaManager.AreaEnum areaN = (AreaManager.AreaEnum)AreaManager.Instance.GetAreaIndexFromSceneName(SceneManagerHelper.ActiveSceneName);
            if (areaN != AreaManager.AreaEnum.CierzoOutside &&
                areaN != AreaManager.AreaEnum.Abrassar &&
                areaN != AreaManager.AreaEnum.Emercar &&
                areaN != AreaManager.AreaEnum.HallowedMarsh &&
                areaN != AreaManager.AreaEnum.Tutorial &&
                areaN != AreaManager.AreaEnum.CierzoDungeon)
            {
                //OLogger.Log($"{areaN}");
                DefeatTable         m_tbl = (DefeatTable)AccessTools.Field(typeof(DefeatScenariosContainer), "m_eventChances").GetValue(self);
                List <RandomChance> lstCh = new List <RandomChance>((List <RandomChance>)AccessTools.Field(typeof(DefeatTable), "m_chances").GetValue(m_tbl));
                //OLogger.Log($"DefeatScenarioRespawn_CNT={lstCh.Count(c => c.Element is DefeatScenarioRespawn && c.HasValidConditions())}");
                if (lstCh.Count(c => (c.Element is DefeatScenarioRespawn || c.Element is DefeatScenarioChangeScene && (c.Element as DefeatScenarioChangeScene).Area == areaN) &&
                                c.HasValidConditions()) == 0)
                {
                    //OLogger.Log("No good scenarios");
                    return;
                }
                m_tbl.Clear();
                foreach (var item in lstCh)
                {
                    //OLogger.Log($"   {item.Element.name} {(item.Element is DefeatScenarioChangeScene ? (item.Element as DefeatScenarioChangeScene).Area.ToString() : "")}");
                    if (item.Element is DefeatScenarioRespawn || item.Element is DefeatScenarioChangeScene && (item.Element as DefeatScenarioChangeScene).Area == areaN)
                    {
                        //OLogger.Log($"{item.ChanceReduction} {item.ConditionCount} {item.InitialChance} {item.Chance}");
                        m_tbl.AddChance(item);
                    }
                }

                /*DefeatScenario d = m_tbl.Throw();
                 * if (d == null)
                 * {
                 *  OLogger.Log($"RESET");
                 *  m_tbl.Clear();
                 *  foreach (var item in lstCh)
                 *  {
                 *      m_tbl.AddChance(item);
                 *  }
                 * }
                 * else
                 * {
                 *  OLogger.Log($"SEL={d.GetType().Name}");
                 * }*/
            }
        }
        catch (Exception ex)
        {
            OLogger.Error(ex.Message);
        }
    }
Ejemplo n.º 3
0
        internal static bool IsPermanent(AreaManager.AreaEnum area)
        {
            var perms = AreaManager.Instance.PermenantAreas;

            foreach (var a in perms)
            {
                if (area == a)
                {
                    return(true);
                }
            }
            return(false);
        }
Ejemplo n.º 4
0
        static bool OrientOnTerrain_IsValid_Pre(OrientOnTerrain __instance)
        {
            AreaManager.AreaEnum currentArea = (AreaManager.AreaEnum)AreaManager.Instance.CurrentArea.ID;
            #region quit
            if (!__instance.m_detectionScript.DeployedItem.IsSleepKit ||
                currentArea.IsNotContainedIn(OPEN_REGIONS) ||
                _campingSpots.Value.HasFlag(CampingSpots.OpenRegions) ||
                !_campingSpots.Value.HasFlag(CampingSpots.Butterflies))
            {
                return(true);
            }
            #endregion

            return(IsNearButterflies(__instance.transform.position));
        }
Ejemplo n.º 5
0
    private void EnvironmentSave_ApplyData(On.EnvironmentSave.orig_ApplyData orig, EnvironmentSave self)
    {
        bool resetEnemies = false;

        AreaManager.AreaEnum areaN = (AreaManager.AreaEnum)AreaManager.Instance.GetAreaIndexFromSceneName(self.AreaName);
        if (areaN == AreaManager.AreaEnum.CierzoOutside ||
            areaN == AreaManager.AreaEnum.Abrassar ||
            areaN == AreaManager.AreaEnum.Emercar ||
            areaN == AreaManager.AreaEnum.HallowedMarsh)
        {
            resetEnemies = true;
        }

        float num = (float)(self.GameTime - EnvironmentConditions.GameTime);

        if (num > 0f)
        {
            EnvironmentConditions.GameTime = self.GameTime;
        }

        if (!AreaManager.Instance.IsAreaExpired(self.AreaName, num))
        {
            ItemManager.Instance.LoadItems(self.ItemList, _clearAllItems: true);
            CharacterManager.Instance.LoadAiCharactersFromSave(self.CharList.ToArray());
            SceneInteractionManager.Instance.LoadInteractableStates(self.InteractionActivatorList);
            SceneInteractionManager.Instance.LoadDropTableStates(self.DropTablesList);
            CampingEventManager.Instance.LoadEventTableData(self.CampingEventSaveData);
            DefeatScenariosManager.Instance.LoadSaveData(self.DefeatScenarioSaveData);
            EnvironmentConditions.Instance.LoadSoulSpots(self.UsedSoulSpots);
            MapDisplay.Instance.Load(self.MapSaveData);
        }
        else if (resetEnemies)
        {
            CharacterManager.Instance.LoadAiCharactersFromSave(self.CharList.ToArray());
        }
        //OLogger.Log($"Enter {self.AreaName} at {GameTimetoDays(EnvironmentConditions.GameTime)}");
        //OLogger.Log($" > Last visit was {GameTimetoDays(self.GameTime)})");
        //orig.Invoke(self);
        //ItemManager.Instance.LoadItems(self.ItemList, _clearAllItems: true);
        //SceneInteractionManager.Instance.LoadInteractableStates(self.InteractionActivatorList);
        //SceneInteractionManager.Instance.LoadDropTableStates(self.DropTablesList);
    }
        public static void RefreshTravelDestinationsPost(MerchantFastTravel __instance, bool _forceRefresh)
        {
            try
            {
                List <TravelData> tmpCurrentTravelData = (List <TravelData>)AccessTools.Field(typeof(MerchantFastTravel), "tmpCurrentTravelData").GetValue(__instance);
                List <int>        m_travelToRegion     = (List <int>)AccessTools.Field(typeof(MerchantFastTravel), "m_travelToRegion").GetValue(__instance);
                bool InCity = (bool)AccessTools.Property(typeof(MerchantFastTravel), "InCity").GetValue(__instance);
                AreaManager.AreaEnum m_currentAreaAssociatedCity = (AreaManager.AreaEnum)AccessTools.Field(typeof(MerchantFastTravel), "m_currentAreaAssociatedCity").GetValue(__instance);
                MethodInfo           InCierzoArea         = AccessTools.Method(typeof(MerchantFastTravel), "InCierzoArea");
                MethodInfo           InBergArea           = AccessTools.Method(typeof(MerchantFastTravel), "InBergArea");
                MethodInfo           InLevantArea         = AccessTools.Method(typeof(MerchantFastTravel), "InLevantArea");
                MethodInfo           InMonsoonArea        = AccessTools.Method(typeof(MerchantFastTravel), "InMonsoonArea");
                MethodInfo           InHarmattanArea      = AccessTools.Method(typeof(MerchantFastTravel), "InHarmattanArea");
                MethodInfo           CheckIfLevantBlocked = AccessTools.Method(typeof(MerchantFastTravel), "CheckIfLevantBlocked");
                MethodInfo           InNewSiroccoArea     = AccessTools.Method(typeof(MerchantFastTravel), "InNewSiroccoArea");

                tmpCurrentTravelData.Clear();
                if (PhotonNetwork.isNonMasterClientInRoom && !_forceRefresh)
                {
                    return;
                }
                Global.RPCManager.RequestMerchantFastTravelDestinations();
                m_travelToRegion.Clear();
                Area currentArea = AreaManager.Instance.CurrentArea;
                InCity = AreaManager.Instance.GetIsAreaTownOrCity(currentArea);
                if ((bool)InCierzoArea.Invoke(__instance, new object[] { currentArea }))
                {
                    m_currentAreaAssociatedCity = AreaManager.AreaEnum.CierzoVillage;
                }
                else if ((bool)InBergArea.Invoke(__instance, new object[] { currentArea }))
                {
                    m_currentAreaAssociatedCity = AreaManager.AreaEnum.Berg;
                }
                else if ((bool)InLevantArea.Invoke(__instance, new object[] { currentArea }))
                {
                    m_currentAreaAssociatedCity = AreaManager.AreaEnum.Levant;
                }
                else if ((bool)InMonsoonArea.Invoke(__instance, new object[] { currentArea }))
                {
                    m_currentAreaAssociatedCity = AreaManager.AreaEnum.Monsoon;
                }
                else if ((bool)InHarmattanArea.Invoke(__instance, new object[] { currentArea }))
                {
                    m_currentAreaAssociatedCity = AreaManager.AreaEnum.Harmattan;
                }
                else if ((bool)InNewSiroccoArea.Invoke(__instance, new object[] { currentArea }))
                {
                    m_currentAreaAssociatedCity = AreaManager.AreaEnum.NewSirocco;
                }
                else
                {
                    m_currentAreaAssociatedCity = AreaManager.AreaEnum.Tutorial;
                }
                CanTravelToHarmattan = (StoreManager.Instance.IsDlcInstalled(OTWStoreAPI.DLCs.Soroboreans) && !(bool)InHarmattanArea.Invoke(__instance, new object[] { currentArea }));
                if (!InCity || (bool)InHarmattanArea.Invoke(__instance, new object[] { currentArea }))
                {
                    if (!QuestEventManager.Instance.HasQuestEvent("lDHL_XMS7kKEs0uOqrLQjw") &&
                        !(bool)InCierzoArea.Invoke(__instance, new object[] { currentArea }))
                    {
                        m_travelToRegion.Add(100);
                    }
                    if (!QuestEventManager.Instance.HasQuestEvent("vW4sarzBGkalTwy_KhGI6A") &&
                        !(bool)InBergArea.Invoke(__instance, new object[] { currentArea }))
                    {
                        m_travelToRegion.Add(500);
                    }
                    if ((bool)CheckIfLevantBlocked.Invoke(__instance, null) &&
                        !(bool)InLevantArea.Invoke(__instance, new object[] { currentArea }))
                    {
                        m_travelToRegion.Add(300);
                    }
                    if (!(bool)InMonsoonArea.Invoke(__instance, new object[] { currentArea }))
                    {
                        m_travelToRegion.Add(200);
                    }
                    if (!(bool)InHarmattanArea.Invoke(__instance, new object[] { currentArea }))
                    {
                        m_travelToRegion.Add(400);
                    }
                    if (StoreManager.Instance.IsDlcInstalled(OTWStoreAPI.DLCs.DLC2) && !(bool)InNewSiroccoArea.Invoke(__instance, new object[] { currentArea }) &&
                        QuestEventManager.Instance.HasQuestEvent("eYmZGb_BJ0qAtpcwrndhTg"))
                    {
                        m_travelToRegion.Add(601);
                    }
                }
                else if (CanTravelToHarmattan)
                {
                    m_travelToRegion.Add(400);
                }

                foreach (int regionId in m_travelToRegion)
                {
                    TravelData merchantTravelData = AreaManager.Instance.GetMerchantTravelData(m_currentAreaAssociatedCity, (AreaManager.AreaEnum)regionId);
                    if (merchantTravelData != null)
                    {
                        tmpCurrentTravelData.Add(merchantTravelData);
                    }
                }
                SyncTravelDestinations();
            }
            catch (Exception ex)
            {
                SoroboreansDlcTravelUnleashed.Instance.MyLogger.LogError(ex.Message);
            }
        }
    private void DefeatScenariosManager_ActivateDefeatScenario(On.DefeatScenariosManager.orig_ActivateDefeatScenario orig, DefeatScenariosManager self, DefeatScenario _scenario)
    {
        try
        {
            AreaManager.AreaEnum areaN = (AreaManager.AreaEnum)AreaManager.Instance.GetAreaIndexFromSceneName(SceneManagerHelper.ActiveSceneName);
            if (_scenario is DefeatScenarioRespawn)
            {
                OLogger.Log($"DefeatScenarioRespawn");
            }
            //OLogger.Log($"ActivateDefeatScenario={SceneManagerHelper.ActiveSceneName}");
            if (areaN != AreaManager.AreaEnum.CierzoOutside &&
                areaN != AreaManager.AreaEnum.Abrassar &&
                areaN != AreaManager.AreaEnum.Emercar &&
                areaN != AreaManager.AreaEnum.HallowedMarsh &&
                areaN != AreaManager.AreaEnum.Tutorial &&
                areaN != AreaManager.AreaEnum.CierzoDungeon /*&&
                                                             * (_scenario is DefeatScenarioChangeScene)*/)
            {
                OLogger.Log($"FailSafeDefeat!");

                /*_scenario = new DefeatScenarioRespawn();
                 * (_scenario as DefeatScenarioRespawn).AffectBackpack = false;
                 * (_scenario as DefeatScenarioRespawn).RespawnAnimation = SpellCastType.GetUpBelly;
                 * (_scenario as DefeatScenarioRespawn).SpawnSelectionType = SpawnSelectionTypes.Random;
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_respawnTimeLapse").SetValue(_scenario, RespawnTimeLapseType.Hour);
                 *
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_burntHealthModifier").SetValue(_scenario, new StatAffect(ChangeType.Unchanged, new Vector2(0.3f, 0.4f)));
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_burntManaModifier").SetValue(_scenario, new StatAffect(ChangeType.Unchanged, new Vector2(0.0f, 0.0f)));
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_burntStaminaModifier").SetValue(_scenario, new StatAffect(ChangeType.Unchanged, new Vector2(0.0f, 0.0f)));
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_drinkModifier").SetValue(_scenario, new StatAffect(ChangeType.Multiplier, new Vector2(1.5f, 2.5f)));
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_foodModifier").SetValue(_scenario, new StatAffect(ChangeType.Unchanged, new Vector2(0.0f, 0.0f)));
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_healthModifier").SetValue(_scenario, new StatAffect(ChangeType.TargetRangeRatio, new Vector2(0.4f, 0.5f)));
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_manaModifier").SetValue(_scenario, new StatAffect(ChangeType.Unchanged, new Vector2(0.0f, 0.0f)));
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_sleepModifier").SetValue(_scenario, new StatAffect(ChangeType.Unchanged, new Vector2(0.0f, 0.0f)));
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_staminaModifier").SetValue(_scenario, new StatAffect(ChangeType.Unchanged, new Vector2(0.0f, 0.0f)));
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_temperatureModifier").SetValue(_scenario, new StatAffect(ChangeType.TargetRangeRatio, new Vector2(0.5f, 0.5f)));
                 *
                 * //AccessTools.Field(typeof(DefeatScenarioRespawn), "ContractedStatuses").SetValue(_scenario, new StatAffect(ChangeType.TargetRangeRatio, new Vector2(0.5f, 0.5f)));
                 *
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_hourRange").SetValue(_scenario, new Vector2(8.0f, 12.0f));
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_lastSpawn").SetValue(_scenario, 0);
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_nextTimeSlotJumpRange").SetValue(_scenario, new Vector2(1.0f, 1.0f));
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_samePlacePos").SetValue(_scenario, new Vector3(0.0f, 0.0f, 0.0f));
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_samePlaceSpawnIndex").SetValue(_scenario, -1);
                 * AccessTools.Field(typeof(DefeatScenarioRespawn), "m_respawnTimeLapse").SetValue(_scenario, DefeatScenarioRespawn.RespawnTimeLapseType.Hour);
                 * orig(self, _scenario);
                 * return;*/

                SendNotificationToAllPlayers($"{SceneManagerHelper.ActiveSceneName}");
                //self.FailSafeDefeat();
                for (int i = 0; i < CharacterManager.Instance.PlayerCharacters.Count; i++)
                {
                    Character character = CharacterManager.Instance.GetCharacter(CharacterManager.Instance.PlayerCharacters.Values[i]);
                    if (!(bool)character)
                    {
                        continue;
                    }
                    character.StatusEffectMngr.Purge();
                    character.Stats.RefreshVitalMaxStat();
                    PlayerSaveData playerSaveData = new PlayerSaveData(character);

                    /*playerSaveData.BurntHealth += character.Stats.MaxHealth * 0.10f; // Reduce burnt health by 10%
                     * playerSaveData.BurntHealth = Mathf.Clamp(playerSaveData.BurntHealth, 0f, character.Stats.MaxHealth * 0.9f);
                     * playerSaveData.Health = character.Stats.MaxHealth;// Mathf.Clamp(playerSaveData.Health, character.Stats.MaxHealth * 0.1f, character.Stats.MaxHealth);
                     * playerSaveData.BurntStamina += character.Stats.MaxStamina * 0.10f; // Reduce burnt stamina by 10%
                     * playerSaveData.BurntStamina = Mathf.Clamp(playerSaveData.BurntStamina, 0f, character.Stats.MaxStamina * 0.9f);
                     * playerSaveData.Stamina = character.Stats.MaxStamina; // Mathf.Clamp(playerSaveData.Stamina, character.Stats.MaxStamina * 0.1f, character.Stats.MaxStamina);
                     * playerSaveData.BurntMana = Mathf.Clamp(playerSaveData.BurntMana, 0f, character.Stats.MaxMana * 0.9f);*/

                    StatAffect m_burntHealthModifier = new StatAffect(ChangeType.TargetRangeRatio, new Vector2(0.7f, 0.8f));
                    playerSaveData.BurntHealth = Mathf.Clamp(m_burntHealthModifier.ProcessStat(character.Stats.MaxHealth), 0f, character.Stats.MaxHealth);
                    StatAffect m_healthModifier = new StatAffect(ChangeType.TargetRangeRatio, new Vector2(0.3f, 0.4f));
                    playerSaveData.Health = Mathf.Clamp(m_healthModifier.ProcessStat(character.Stats.MaxHealth), 0f, character.Stats.MaxHealth);


                    character.Resurrect(playerSaveData, _playAnim: true);
                    character.PlayerStats.RestLastNeedsUpdateTime();
                    character.ResetCombat();
                }
                NetworkLevelLoader.Instance.RequestReloadLevel(0);
                return;
            }
        }
        catch (Exception ex)
        {
            OLogger.Log($"[{_modName}] DefeatScenariosManager_ActivateDefeatScenario: {ex.Message}");
            Debug.Log($"[{_modName}] DefeatScenariosManager_ActivateDefeatScenario: {ex.Message}");
        }
        orig(self, _scenario);
    }
Ejemplo n.º 8
0
        static bool EnvironmentSave_ApplyData_Pre(EnvironmentSave __instance)
        {
            #region quit
            if (!_areasToggle)
            {
                return(true);
            }
            #endregion

            // Initialize game time
            if (GameTime < (float)__instance.GameTime)
            {
                GameTime = (float)__instance.GameTime;
            }

            // Persistent areas
            AreaManager.AreaEnum areaEnum = (AreaManager.AreaEnum)AreaManager.Instance.GetAreaFromSceneName(__instance.AreaName).ID;
            bool isAreaPermanent          = AreaManager.Instance.PermenantAreas.Contains(areaEnum);
            bool resetArea = _areasResetLayers.Value.HasFlag(AreasResetLayers.Cities) || !isAreaPermanent;

            // Area modes
            float sinceLastVisit = GameTime - (float)__instance.GameTime;
            float sinceLastReset = GameTime - __instance.SaveCreationGameTime;
            resetArea &= _areasMode == ResetMode.Always ||
                         _areasMode == ResetMode.Timer &&
                         sinceLastVisit >= _areasTimer * TIME_UNIT &&
                         sinceLastReset >= _areasTimerSinceReset * TIME_UNIT;
            // Execute
            if (resetArea)
            {
                __instance.SaveCreationGameTime = GameTime.RoundDown();
            }

            if (!resetArea || !_areasResetLayers.Value.HasFlag(AreasResetLayers.Enemies))
            {
                CharacterManager.Instance.LoadAiCharactersFromSave(__instance.CharList.ToArray());
            }
            else
            {
                RemovePouchItemsFromSaveData(__instance.ItemList);
            }

            if (!resetArea || !_areasResetLayers.Value.HasFlag(AreasResetLayers.ItemsAndContainers))
            {
                ItemManager.Instance.LoadItems(__instance.ItemList, true);
            }
            if (!resetArea || !_areasResetLayers.Value.HasFlag(AreasResetLayers.Switches))
            {
                SceneInteractionManager.Instance.LoadInteractableStates(__instance.InteractionActivatorList);
            }
            if (!resetArea || !_areasResetLayers.Value.HasFlag(AreasResetLayers.Gatherables))
            {
                SceneInteractionManager.Instance.LoadDropTableStates(__instance.DropTablesList);
            }
            if (!resetArea || !_areasResetLayers.Value.HasFlag(AreasResetLayers.AmbushEvents))
            {
                CampingEventManager.Instance.LoadEventTableData(__instance.CampingEventSaveData);
            }
            if (!resetArea || !_areasResetLayers.Value.HasFlag(AreasResetLayers.DeathEvents))
            {
                DefeatScenariosManager.Instance.LoadSaveData(__instance.DefeatScenarioSaveData);
            }
            if (!resetArea || !_areasResetLayers.Value.HasFlag(AreasResetLayers.Souls))
            {
                EnvironmentConditions.Instance.LoadSoulSpots(__instance.UsedSoulSpots);
            }

            return(false);
        }