diff --git a/MxValheim/EventSystem/Patch.cs b/MxValheim/EventSystem/Patch.cs index 7446973..fa4caf2 100644 --- a/MxValheim/EventSystem/Patch.cs +++ b/MxValheim/EventSystem/Patch.cs @@ -1,5 +1,6 @@ -using HarmonyLib; -using Splatform; +using BepInEx.Bootstrap; +using EpicLoot; +using HarmonyLib; using System; using System.Collections; using System.Collections.Generic; @@ -28,6 +29,15 @@ namespace MxValheim.EventSystem } } + [HarmonyPatch(typeof(RandEventSystem), nameof(RandEventSystem.Awake))] + public static class EventRadiusPatch + { + static void Postfix(RandEventSystem __instance) + { + + } + } + [HarmonyPatch(typeof(RandEventSystem), nameof(RandEventSystem.StartRandomEvent))] public static class DebugRaidFrequency { @@ -45,8 +55,17 @@ namespace MxValheim.EventSystem { static void Prefix(RandEventSystem __instance) { - __instance.m_eventIntervalMin = 10f; - __instance.m_eventChance = 100f; + if (MxValheimMod.Config_DebugRandomEventInterval.Value) + { + __instance.m_eventIntervalMin = 10f; + __instance.m_eventChance = 100f; + } + RandomEvent activeEvent = RandEventSystem.instance.GetActiveEvent(); + if (activeEvent != null) + { + activeEvent.m_eventRange = 200f; + activeEvent.m_duration = 10f; + } } } @@ -63,7 +82,6 @@ namespace MxValheim.EventSystem ZPackage pkg = new ZPackage(); pkg.Write(currentRaid.m_name); pkg.Write($"{currentRaid.m_pos}"); - Debug.Log($"RPC_SetEvent: {currentRaid.m_pos}"); kill = Watcher.eventKill; ZRoutedRpc.instance.InvokeRoutedRPC(0, "RPC_ServerRemoveEvent", pkg); @@ -88,6 +106,12 @@ namespace MxValheim.EventSystem { Reward.GiveItemRandom(Reward.GetRewardPrefab(Profiles.serverLevel, "metal"), rand.Next(5, 20)); } + if (Chainloader.PluginInfos.ContainsKey("randyknapp.mods.epicloot")) + { + Reward.GiveEpicLootLowMats(); + Reward.GiveEpicLootEssence(); + Reward.GiveEpicLootRune(); + } } } } @@ -113,7 +137,7 @@ namespace MxValheim.EventSystem if (RandEventSystem.instance != null && RandEventSystem.instance.GetActiveEvent() != null) { __instance.m_eventName.text = ""; - } + } } } diff --git a/MxValheim/EventSystem/Reward.cs b/MxValheim/EventSystem/Reward.cs index 260caa9..180756a 100644 --- a/MxValheim/EventSystem/Reward.cs +++ b/MxValheim/EventSystem/Reward.cs @@ -1,6 +1,8 @@ -using System; +using EpicLoot; +using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using UnityEngine; @@ -34,9 +36,9 @@ namespace MxValheim.EventSystem string[] metalList = { "CopperOre", "TinOre", "IronScrap", "SilverOre", "BlackMetalScrap", "FlametalOreNew" }; System.Random rng = new System.Random(); - int foodTier = rng.Next(1, foodList.Length); - int healTier = rng.Next(1, healList.Length); - int metalTier = rng.Next(1, metalList.Length); + int foodTier = rng.Next(0, foodList.Length - 1); + int healTier = rng.Next(0, healList.Length - 1); + int metalTier = rng.Next(0, metalList.Length - 1); if (type == "food") return foodList[foodTier]; if (type == "heal") return healList[healTier]; @@ -44,6 +46,85 @@ namespace MxValheim.EventSystem return "Wood"; } + public static void GiveEpicLootLowMats() + { + System.Random rand = new System.Random(); + + int qty = rand.Next(5,10); + + string[] rarity = { "Magic", "Rare", "Epic", "Legendary", "Mythic" }; + string[] type = { "Dust", "Shard", "Fragment" }; + + string itemName = $"{type[rand.Next(0, type.Length - 1)]}{rarity[rand.Next(0, rarity.Length - 1)]}"; + + Player player = Player.m_localPlayer; + if (player == null) return; + + GameObject prefab = ObjectDB.instance.GetItemPrefab(itemName); + if (prefab != null) + { + player.GetInventory().AddItem(itemName, qty, 1, 0, 0, ""); + + player.Message(MessageHud.MessageType.TopLeft, $"Received {qty}x {itemName}"); + } + else + { + Debug.LogWarning($"Item {itemName} not found in ObjectDB!"); + } + } + + public static void GiveEpicLootEssence() + { + System.Random rand = new System.Random(); + + int qty = rand.Next(1, 5); + + string[] rarity = { "Magic", "Rare", "Epic", "Legendary", "Mythic" }; + + string itemName = $"Essence{rarity[rand.Next(0, rarity.Length - 1)]}"; + + Player player = Player.m_localPlayer; + if (player == null) return; + + GameObject prefab = ObjectDB.instance.GetItemPrefab(itemName); + if (prefab != null) + { + player.GetInventory().AddItem(itemName, qty, 1, 0, 0, ""); + + player.Message(MessageHud.MessageType.TopLeft, $"Received {qty}x {itemName}"); + } + else + { + Debug.LogWarning($"Item {itemName} not found in ObjectDB!"); + } + } + + public static void GiveEpicLootRune() + { + System.Random rand = new System.Random(); + + int qty = 1; + + string[] rarity = { "Magic", "Rare", "Epic" }; + + string itemName = $"Runestone{rarity[rand.Next(0, rarity.Length - 1)]}"; + + Player player = Player.m_localPlayer; + if (player == null) return; + + GameObject prefab = ObjectDB.instance.GetItemPrefab(itemName); + if (prefab != null) + { + player.GetInventory().AddItem(itemName, qty, 1, 0, 0, ""); + + player.Message(MessageHud.MessageType.TopLeft, $"Received {qty}x {itemName}"); + } + else + { + Debug.LogWarning($"Item {itemName} not found in ObjectDB!"); + } + } + public static void GiveItemRandom(string itemName, int qty) { System.Random rng = new System.Random(); diff --git a/MxValheim/MxValheim.cs b/MxValheim/MxValheim.cs index 5870607..bf8393e 100644 --- a/MxValheim/MxValheim.cs +++ b/MxValheim/MxValheim.cs @@ -7,7 +7,6 @@ using MxValheim.KillFeed; using MxValheim.Patch; using MxValheim.Patch.HUD; using Newtonsoft.Json; -using Splatform; using System; using System.Collections.Generic; using System.IO; @@ -34,16 +33,10 @@ public class MxValheimMod : BaseUnityPlugin private const string ModGUID = "ovh.mxdev.mxvalheim"; private const string ModName = "MxValheim"; - private const string ModVersion = "1.6.6"; + private const string ModVersion = "1.6.7"; - public static ConfigEntry Config_Locked; - public static ConfigEntry Config_OreMultiplier; - public static ConfigEntry Config_rangeMultiplier; + public static ConfigEntry Config_DebugRandomEventInterval; public static ConfigEntry Config_bowDrawSpeedBonusPerLevel; - public static ConfigEntry Config_rainDamage; - public static ConfigEntry Config_boatSpeed; - public static ConfigEntry Config_autoDoorCloseEnabled; - public static ConfigEntry Config_autoDoorClose; public static string modPath = Path.Combine(Paths.PluginPath, "MxValheim"); public static string internalConfigsPath = Path.Combine(modPath, "Configs"); @@ -93,6 +86,8 @@ public class MxValheimMod : BaseUnityPlugin public static float _uniqueTimer = 60.0f; public static string eventName; + public static float eventTimer = 0f; + public class ActiveEventData { public string Name; @@ -113,19 +108,14 @@ public class MxValheimMod : BaseUnityPlugin { Instance = this; - Config_OreMultiplier = Config.Bind("General", "OreMultiplier", 3, "How many items should drop for every 1 ore/scrap found."); - Config_rangeMultiplier = Config.Bind("General", "CraftingRangeMultiplier", 2.0f, "Multiplier for the workbench build/crafting range. Default is 2x."); + Config_DebugRandomEventInterval = Config.Bind("Debug", "DebugRandomEventInterval", false, "Event are triggered really often, to debug my EventSystem logic."); Config_bowDrawSpeedBonusPerLevel = Config.Bind("General", "BowDrawSpeedBonusPercentPerLevel", 1.0f, "Shorten the bow draw speed by this percent for every bow upgrade level."); - Config_rainDamage = Config.Bind("General", "RainDamage", true, "Set to true to stop rain damage, false to return to vanilla behavior."); - Config_boatSpeed = Config.Bind("General", "BoatSpeedMultiplier", 2.0f, "Your boat/raft will move without wind at a speed multiplied by this value."); - Config_autoDoorCloseEnabled = Config.Bind("General", "AutoDoorCloseEnabled", true, "Your doors will auto close if enabled. See AutoDoorCloseTimer for the desired time."); - Config_autoDoorClose = Config.Bind("General", "AutoDoorCloseTimer", 5.0f, "Your doors will auto close after the specified timer duration."); LoadLocalization(); LoadJsonConfig(); LoadDoorConfig(); - _doorTimer = MxValheimMod.Config_autoDoorClose.Value; + _doorTimer = 2; //PrefabManager.OnVanillaPrefabsAvailable += InitCustomEnemies; @@ -184,10 +174,13 @@ public class MxValheimMod : BaseUnityPlugin ZRoutedRpc.instance.Register("RPC_MxKillMsg", new RoutedMethod.Method(kfp.OnReceiveKillMsg)); + ZRoutedRpc.instance.Register("RPC_ServerAddDoorToQueue", Watcher.RegisterEvent); + ZRoutedRpc.instance.Register("RPC_ServerRegisterEvent", Watcher.RegisterEvent); ZRoutedRpc.instance.Register("RPC_ServerGetEventKill", Watcher.GetEventKill); ZRoutedRpc.instance.Register("RPC_ServerSetEventKill", Watcher.SetEventKill); ZRoutedRpc.instance.Register("RPC_ServerRemoveEvent", Watcher.RemoveEvent); + ZRoutedRpc.instance.Register("RPC_ServerRegisterEventKill", Profiles.ServerSetLevel); ZRoutedRpc.instance.Register("RPC_ServerCreateUser", Profiles.ServerReceiveCreateUser); ZRoutedRpc.instance.Register("RPC_RequestProfile", Profiles.ServerHandleProfileRequest); @@ -261,7 +254,7 @@ public class MxValheimMod : BaseUnityPlugin if (_doorTimer <= 0) { dpatch.CloseNextDoor(_doorQueueDoor.Dequeue(), _doorQueueNview.Dequeue(), _doorQueueName.Dequeue()); - _doorTimer = MxValheimMod.Config_autoDoorClose.Value; + _doorTimer = 2; } } // Door Logic diff --git a/MxValheim/MxValheim.csproj b/MxValheim/MxValheim.csproj index 5889c55..f2d4a73 100644 --- a/MxValheim/MxValheim.csproj +++ b/MxValheim/MxValheim.csproj @@ -9,7 +9,7 @@ Properties MxValheim MxValheim - v4.6.2 + v4.8.1 12.0 512 true @@ -52,6 +52,9 @@ E:\SteamLibrary\steamapps\common\Valheim\BepInEx\core\BepInEx.dll + + E:\SteamLibrary\steamapps\common\Valheim\BepInEx\plugins\EpicLoot\EpicLoot.dll + E:\SteamLibrary\steamapps\common\Valheim\Valheim_Data\Managed\gui_framework.dll diff --git a/MxValheim/Patch/CraftingStation.cs b/MxValheim/Patch/CraftingStation.cs index 56ac155..46c0a62 100644 --- a/MxValheim/Patch/CraftingStation.cs +++ b/MxValheim/Patch/CraftingStation.cs @@ -17,7 +17,7 @@ namespace MxValheim.Patch if (rangeField.FieldExists()) { float currentRange = rangeField.GetValue(); - rangeField.SetValue(currentRange * MxValheimMod.Config_rangeMultiplier.Value); + rangeField.SetValue(currentRange * 1); } } } diff --git a/MxValheim/Patch/Doors.cs b/MxValheim/Patch/Doors.cs index 11d2396..48f8ff7 100644 --- a/MxValheim/Patch/Doors.cs +++ b/MxValheim/Patch/Doors.cs @@ -20,7 +20,7 @@ namespace MxValheim.Patch [HarmonyPatch(typeof(Door), nameof(Door.Interact))] public static class DoorTracker { - static void Postfix(Door __instance, Humanoid character, bool hold, bool alt, ZNetView ___m_nview) + static void Postfix(Door __instance) { ZNetView nview = __instance.GetComponent(); if (nview != null && nview.IsValid()) @@ -32,36 +32,42 @@ namespace MxValheim.Patch if (MxValheimMod.CachedConfig?.ignoreList != null) if (MxValheimMod.CachedConfig.ignoreList.Contains(prefabName)) return; - if (hold || alt || ___m_nview == null || !___m_nview.IsValid()) return; + nview.ClaimOwnership(); // Get state: 0 is closed - int state = ___m_nview.GetZDO().GetInt("state"); + int state = nview.GetZDO().GetInt("state"); - if (state == 0) return; + if (state == 0) return; + + ZPackage pkg = new ZPackage(); + pkg.Write(nview); + pkg.Write(__instance); + pkg.Write(prefabName); lock (_doorQueueNview) { - Debug.Log($"AutoDoor:Door.Interact Adding \"{prefabName}\" to queue."); + Debug.Log($"AutoDoor: Adding \"{prefabName}\" to queue."); _doorQueueNview.Enqueue(nview); _doorQueueDoor.Enqueue(__instance); _doorQueueName.Enqueue(prefabName); } } } - } + } public void CloseNextDoor(Door door, ZNetView nview, string doorName) { if (door != null && nview != null && nview.IsValid()) { + nview.ClaimOwnership(); if (nview.GetZDO().GetInt("state") != 0) { - Debug.Log($"AutoDoor:CloseNextDoor Closing door \"{doorName}\"."); + Debug.Log($"AutoDoor: Closing door \"{doorName}\"."); ZDO zd0 = nview.GetZDO(); zd0.Set("state", 0); } else { - Debug.Log($"AutoDoor:CloseNextDoor Door \"{doorName}\" was already closed."); + Debug.Log($"AutoDoor: Door \"{doorName}\" was already closed."); } } } diff --git a/MxValheim/Patch/WearNTear.cs b/MxValheim/Patch/WearNTear.cs index 8065b29..d414ccd 100644 --- a/MxValheim/Patch/WearNTear.cs +++ b/MxValheim/Patch/WearNTear.cs @@ -10,8 +10,6 @@ namespace MxValheim.Patch { static void Postfix(WearNTear __instance, ref bool __result) { - if (!MxValheimMod.Config_rainDamage.Value) return; - __result = true; } } diff --git a/README.md b/README.md index 0f60dca..4cddc49 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![logo](https://mxio.ovh/gaming/valheim/mxvalheim.png) +![logo](https://mxio.ovh/gaming/valheim/mxvalheim_valtint.png) ## MxValheim Official **MxValheim Server** Mod.