From 01fdd9794cd6e7afb834af087fe40985076d4742 Mon Sep 17 00:00:00 2001 From: mikx Date: Fri, 20 Mar 2026 15:33:27 -0400 Subject: [PATCH] (1.6.13) EventSystem Exp Revamp + Reward Fix --- MxValheim/EventSystem/Experience.cs | 89 +++++++++++++++++++++++++++++ MxValheim/EventSystem/Patch.cs | 39 +++++-------- MxValheim/EventSystem/Reward.cs | 2 +- MxValheim/EventSystem/Watcher.cs | 3 +- MxValheim/MxValheim.cs | 2 +- README.md | 4 +- 6 files changed, 109 insertions(+), 30 deletions(-) diff --git a/MxValheim/EventSystem/Experience.cs b/MxValheim/EventSystem/Experience.cs index 084454e..73145cb 100644 --- a/MxValheim/EventSystem/Experience.cs +++ b/MxValheim/EventSystem/Experience.cs @@ -15,6 +15,19 @@ namespace MxValheim.EventSystem return (level * 100); } + public static int CalculateExperience(string enemyInternalName, int level, Heightmap.Biome biome) + { + Dictionary levelMulti = new Dictionary + { + { 1, 1.0f }, + { 2, 1.5f }, + { 3, 2.0f }, + { 4, 2.5f }, + }; + int expfinal = (int)(EnemiesExpValue[enemyInternalName] * levelMulti[level]); + return expfinal; + } + public static float CalculateExpMultiplier(Heightmap.Biome biome) { Dictionary biomeBase = new Dictionary() @@ -67,5 +80,81 @@ namespace MxValheim.EventSystem Clock.m_barFill.offsetMax = Vector2.zero; } } + + public static Dictionary EnemiesExpValue = new Dictionary + { + // --- Meadows --- + { "Boar", 10 }, + { "Neck", 10 }, + { "Greyling", 15 }, + + // --- Black Forest --- + { "Greydwarf", 20 }, + { "Greydwarf_Elite", 30 }, + { "Greydwarf_Shaman", 30 }, + { "Troll", 100 }, + { "Ghost", 100 }, + { "Skeleton", 30 }, + { "Skeleton_NoArcher", 30 }, // Melee only variant + + // --- Swamp --- + { "Blob", 20 }, + { "BlobElite", 30 }, // Oozer + { "Draugr", 40 }, + { "Draugr_Elite", 50 }, + { "Draugr_Ranged", 40 }, + { "Leech", 20 }, + { "Surtling", 40 }, + { "Wraith", 100 }, + { "Abomination", 200 }, + + // --- Mountains --- + { "Bat", 10 }, + { "Hatchling", 50 }, + { "Fenring", 50 }, + { "Fenring_Cultist", 50 }, + { "StoneGolem", 100 }, + { "Ulv", 100 }, + { "Wolf", 30 }, + + // --- Plains --- + { "Deathsquito", 10 }, + { "Fuling", 50 }, + { "FulingBerserker", 60 }, + { "FulingShaman", 60 }, + { "Lox", 200 }, + { "Growth", 10 }, + + // --- Mistlands --- + { "Gjall", 100 }, + { "Seeker", 40 }, + { "SeekerBrute", 100 }, // Seeker Soldier + { "SeekerBrood", 100 }, + { "Tick", 20 }, + { "Dverger", 50 }, + + // --- Ashlands --- + { "Asksvin", 50 }, + { "Charred_Melee", 50 }, // Charred Warrior + { "Charred_Archer", 50 }, // Charred Marksman + { "Charred_Mage", 50 }, // Charred Warlock + { "Charred_Twitcher", 50 }, + { "FallenValkyrie", 200 }, + { "Morgen", 300 }, + { "BonemawSerpent", 200 }, + { "Voltures", 50 }, + + // --- Ocean --- + { "Serpent", 500 }, + + // --- Bosses --- + { "Eikthyr", 100 }, + { "gd_king", 200 }, // The Elder + { "Bonemass", 300 }, + { "Dragon", 400 }, // Moder + { "GoblinKing", 500 }, // Yagluth + { "SeekerQueen", 600 }, + { "Fader", 800 } + }; } } diff --git a/MxValheim/EventSystem/Patch.cs b/MxValheim/EventSystem/Patch.cs index e824cc4..00520b6 100644 --- a/MxValheim/EventSystem/Patch.cs +++ b/MxValheim/EventSystem/Patch.cs @@ -171,6 +171,13 @@ namespace MxValheim.EventSystem isEventCreature = Traverse.Create(mai).Field("m_eventCreature").Value; } + string internalName = __instance.gameObject.name; + int cloneIndex = internalName.IndexOf("(Clone)"); + if (cloneIndex != -1) + { + internalName = internalName.Substring(0, cloneIndex); + } + if (isEventCreature) { RandomEvent activeEvent = RandEventSystem.instance.GetActiveEvent(); @@ -178,13 +185,7 @@ namespace MxValheim.EventSystem { ZPackage pkg = new ZPackage(); pkg.Write(activeEvent.m_name); - pkg.Write($"{activeEvent.m_pos}"); - string internalName = __instance.gameObject.name; - int cloneIndex = internalName.IndexOf("(Clone)"); - if (cloneIndex != -1) - { - internalName = internalName.Substring(0, cloneIndex); - } + pkg.Write($"{activeEvent.m_pos}"); pkg.Write(Reward.EnemiesPointValue[internalName]); ActiveEventData entry = MxValheimMod.ActiveEvents.Find(e => e.Position == activeEvent.m_pos.ToString()); if (entry == null) @@ -199,32 +200,22 @@ namespace MxValheim.EventSystem } int level = __instance.GetLevel(); - int exp = - (level == 1) ? 4 : - (level == 2) ? 6 : - (level == 3) ? 8 : - 8; - ZRoutedRpc.instance.InvokeRoutedRPC(0, "RPC_RequestProfile", "Event"); Heightmap.Biome currentBiome = EnvMan.instance.GetCurrentBiome(); - int expFinal = ((int)(exp * Experience.CalculateExpMultiplier(currentBiome))) + Profiles.serverLevel; - Experience.AddExperience(expFinal); + int exp = Experience.CalculateExperience(internalName, level, currentBiome); + ZRoutedRpc.instance.InvokeRoutedRPC(0, "RPC_RequestProfile", "Event"); + Experience.AddExperience(exp); Color magicPurple = new Color(0.921f, 0.475f, 0.990f); Vector3 spawnPos = __instance.transform.position + Vector3.up * 1.0f; - DamageText.instance.ShowText(HitData.DamageModifier.Normal, spawnPos, expFinal, true); + DamageText.instance.ShowText(HitData.DamageModifier.Normal, spawnPos, exp, true); } else { int level = __instance.GetLevel(); - int exp = - (level == 1) ? 2 : - (level == 2) ? 4 : - (level == 3) ? 6 : - 6; Heightmap.Biome currentBiome = EnvMan.instance.GetCurrentBiome(); - int expFinal = ((int)(exp * Experience.CalculateExpMultiplier(currentBiome))) + Profiles.serverLevel; - Experience.AddExperience(expFinal); + int exp = Experience.CalculateExperience(internalName, level, currentBiome); + Experience.AddExperience(exp); Color magicPurple = new Color(0.921f, 0.475f, 0.990f); Vector3 spawnPos = __instance.transform.position + Vector3.up * 1.0f; - DamageText.instance.ShowText(HitData.DamageModifier.Normal, spawnPos, expFinal, true); + DamageText.instance.ShowText(HitData.DamageModifier.Normal, spawnPos, exp, true); } } } diff --git a/MxValheim/EventSystem/Reward.cs b/MxValheim/EventSystem/Reward.cs index a187246..0d854a6 100644 --- a/MxValheim/EventSystem/Reward.cs +++ b/MxValheim/EventSystem/Reward.cs @@ -303,7 +303,7 @@ namespace MxValheim.EventSystem // --- Mountains --- { "Bat", 50 }, - { "Drake", 150 }, + { "Hatchling", 150 }, { "Fenring", 150 }, { "Fenring_Cultist", 150 }, { "StoneGolem", 200 }, diff --git a/MxValheim/EventSystem/Watcher.cs b/MxValheim/EventSystem/Watcher.cs index 8a4c9f9..00c913d 100644 --- a/MxValheim/EventSystem/Watcher.cs +++ b/MxValheim/EventSystem/Watcher.cs @@ -41,6 +41,7 @@ namespace MxValheim.EventSystem public static void RegisterEvent(long sender, ZPackage pkg) { + eventPoints = 0; string eventName = pkg.ReadString(); string eventPos = pkg.ReadString(); int killPoints = pkg.ReadInt(); @@ -60,12 +61,10 @@ namespace MxValheim.EventSystem { evindex = MxValheimMod.ActiveEvents.FindIndex(e => e.Position.ToString() == eventPos); MxValheimMod.ActiveEvents.RemoveAt(evindex); - eventPoints = 0; } else if (MxValheimMod.ActiveEvents.Count <= 0 && eventPos != null) { // That's not the best way to do it, but until i find a better one, it will prevent an event bugging eternaly. MxValheimMod.ActiveEvents.Clear(); - eventPoints = 0; } } } diff --git a/MxValheim/MxValheim.cs b/MxValheim/MxValheim.cs index 278730d..2ca75a0 100644 --- a/MxValheim/MxValheim.cs +++ b/MxValheim/MxValheim.cs @@ -33,7 +33,7 @@ public class MxValheimMod : BaseUnityPlugin private const string ModGUID = "ovh.mxdev.mxvalheim"; private const string ModName = "MxValheim"; - private const string ModVersion = "1.6.12"; + private const string ModVersion = "1.6.13"; public static ConfigEntry Config_DebugRandomEventInterval; public static ConfigEntry Config_bowDrawSpeedBonusPerLevel; diff --git a/README.md b/README.md index c2f2e44..ebf8a7f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Official **MxValheim Server** Mod. ## Roadmap - **1.6.12** Revamped EventSystem Reward System based on enemy difficulty. - **1.6.13** Revamped Experience System based on enemy difficulty. -- **1.7.x** Stamina System Revamp +- **1.7.x** Drop Multiplier Revamp & Stamina System Revamp - **1.8.x** Random Mini Boss System - **1.9.x** Biome Random Quest System @@ -20,7 +20,7 @@ Official **MxValheim Server** Mod. - Display the day and the formated time in-game. - Use your client language with built-in localization. - Kill Feed with custom UI showing player kill and death. -- Tweak individual item(s) weight in "BepInEx\config\mxvalheim.custom_weights.json". +- Tweak individual item(s) weight in "BepInEx\plugins\MxValheim\Configs\items_weight.json". - Ore drop multiplier. (Value available in the generated config.) - Workbench crafting range multiplier. (Value available in the generated config.) - Reduce Bow draw time for each upgrade level. (Value available in the generated config.)