Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 18 additions & 15 deletions JotunnLib/Utils/ExtEquipment.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using HarmonyLib;
using Mono.Cecil.Cil;
Expand All @@ -9,10 +9,13 @@ namespace Jotunn.Utils
{
internal class ExtEquipment : MonoBehaviour
{
private static int RightItemVariantHash = "RightItemVariant".GetStableHashCode();
private static int RightBackItemVariantHash = "RightBackItemVariant".GetStableHashCode();
private static int ChestItemVariantHash = "ChestItemVariant".GetStableHashCode();

private static bool Enabled;

private static readonly Dictionary<VisEquipment, ExtEquipment> Instances =
new Dictionary<VisEquipment, ExtEquipment>();
private static readonly Dictionary<VisEquipment, ExtEquipment> Instances = new Dictionary<VisEquipment, ExtEquipment>();

public static void Enable()
{
Expand Down Expand Up @@ -42,9 +45,9 @@ private static void VisEquipment_UpdateEquipmentVisuals(VisEquipment __instance)
{
if (Instances.TryGetValue(__instance, out var instance))
{
instance.NewRightItemVariant = zdo.GetInt("RightItemVariant");
instance.NewChestVariant = zdo.GetInt("ChestItemVariant");
instance.NewRightBackItemVariant = zdo.GetInt("RightBackItemVariant");
instance.NewRightItemVariant = zdo.GetInt(RightItemVariantHash);
instance.NewChestVariant = zdo.GetInt(ChestItemVariantHash);
instance.NewRightBackItemVariant = zdo.GetInt(RightBackItemVariantHash);
}
}
}
Expand Down Expand Up @@ -168,16 +171,16 @@ private static void VisEquipment_SetChestEquiped(ILContext il)
/// Store the variant index of the right hand item to the ZDO if the variant has changed
/// </summary>
[HarmonyPatch(typeof(VisEquipment), nameof(VisEquipment.SetRightItem)), HarmonyPrefix]
private static void VisEquipment_SetRightItem(VisEquipment __instance, string name)
private static void VisEquipment_SetRightItem(VisEquipment __instance, int itemHash)
{
if (Instances.TryGetValue(__instance, out var instance) &&
instance.MyHumanoid && instance.MyHumanoid.m_rightItem != null &&
!(__instance.m_rightItem == name && instance.MyHumanoid.m_rightItem.m_variant == instance.CurrentRightItemVariant))
!(__instance.m_rightItem == itemHash && instance.MyHumanoid.m_rightItem.m_variant == instance.CurrentRightItemVariant))
{
instance.NewRightItemVariant = instance.MyHumanoid.m_rightItem.m_variant;
if (__instance.m_nview && __instance.m_nview.GetZDO() is ZDO zdo)
{
zdo.Set("RightItemVariant", (!string.IsNullOrEmpty(name)) ? instance.NewRightItemVariant : 0);
zdo.Set(RightItemVariantHash, (itemHash != 0) ? instance.NewRightItemVariant : 0);
}
}
}
Expand All @@ -186,16 +189,16 @@ private static void VisEquipment_SetRightItem(VisEquipment __instance, string na
/// Store the variant index of the right back item to the ZDO if the variant has changed
/// </summary>
[HarmonyPatch(typeof(VisEquipment), nameof(VisEquipment.SetRightBackItem)), HarmonyPrefix]
private static void VisEquipment_SetRightBackItem(VisEquipment __instance, string name)
private static void VisEquipment_SetRightBackItem(VisEquipment __instance, int itemHash)
{
if (Instances.TryGetValue(__instance, out var instance) &&
instance.MyHumanoid && instance.MyHumanoid.m_hiddenRightItem != null &&
!(__instance.m_rightBackItem == name && instance.MyHumanoid.m_hiddenRightItem.m_variant == instance.CurrentRightBackItemVariant))
!(__instance.m_rightBackItem == itemHash && instance.MyHumanoid.m_hiddenRightItem.m_variant == instance.CurrentRightBackItemVariant))
{
instance.NewRightBackItemVariant = instance.MyHumanoid.m_hiddenRightItem.m_variant;
if (__instance.m_nview && __instance.m_nview.GetZDO() is ZDO zdo)
{
zdo.Set("RightBackItemVariant", (!string.IsNullOrEmpty(name)) ? instance.NewRightBackItemVariant : 0);
zdo.Set(RightBackItemVariantHash, (itemHash != 0) ? instance.NewRightBackItemVariant : 0);
}
}
}
Expand All @@ -204,16 +207,16 @@ private static void VisEquipment_SetRightBackItem(VisEquipment __instance, strin
/// Store the variant index of the chest item to the ZDO if the variant has changed
/// </summary>
[HarmonyPatch(typeof(VisEquipment), nameof(VisEquipment.SetChestItem)), HarmonyPrefix]
private static void VisEquipment_SetChestItem(VisEquipment __instance, string name)
private static void VisEquipment_SetChestItem(VisEquipment __instance, int itemHash)
{
if (Instances.TryGetValue(__instance, out var instance) &&
instance.MyHumanoid && instance.MyHumanoid.m_chestItem != null &&
!(__instance.m_chestItem == name && instance.MyHumanoid.m_chestItem.m_variant == instance.CurrentChestVariant))
!(__instance.m_chestItem == itemHash && instance.MyHumanoid.m_chestItem.m_variant == instance.CurrentChestVariant))
{
instance.NewChestVariant = instance.MyHumanoid.m_chestItem.m_variant;
if (__instance.m_nview && __instance.m_nview.GetZDO() is ZDO zdo)
{
zdo.Set("ChestItemVariant", (!string.IsNullOrEmpty(name)) ? instance.NewChestVariant : 0);
zdo.Set(ChestItemVariantHash, (itemHash != 0) ? instance.NewChestVariant : 0);
}
}
}
Expand Down
12 changes: 7 additions & 5 deletions JotunnLib/Utils/GameVersions.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;
using System.Diagnostics;
using System.Reflection;
using System;
using HarmonyLib;

namespace Jotunn.Utils
Expand All @@ -27,8 +25,12 @@ private static System.Version GetValheimVersion()

private static uint GetNetworkVersion()
{
// use Reflection because Version.m_networkVersion is a constant field, i.e. evaluated at compile time
return (uint)AccessTools.Field(typeof(Version), nameof(Version.m_networkVersion)).GetValue(null);
Logger.LogInfo("GetNetworkVersion");
// Use reflection because Version.c_networkVersion is a constant field, i.e. evaluated at compile time
var field = AccessTools.Field(typeof(Version), nameof(Version.c_networkVersion))
?? AccessTools.Field(typeof(Version), "m_networkVersion") // older Valheim version
?? throw new Exception("Could not find network version field in Version class");
return (uint)field.GetValue(null);
}
}
}
2 changes: 1 addition & 1 deletion TestMod/TestMod.cs
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ private void Update()

// Use the name of the ButtonConfig to identify the button pressed
if (EvilSwordSpecialButton != null && MessageHud.instance != null &&
Player.m_localPlayer != null && Player.m_localPlayer.m_visEquipment.m_rightItem == "EvilSword")
Player.m_localPlayer != null && Player.m_localPlayer.m_visEquipment.m_rightItem == "EvilSword".GetStableHashCode())
{
if (ZInput.GetButton(EvilSwordSpecialButton.Name) && MessageHud.instance.m_msgQeue.Count == 0)
{
Expand Down