using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using CreatureManager;
using HarmonyLib;
using ItemManager;
using JetBrains.Annotations;
using LocalizationManager;
using Microsoft.CodeAnalysis;
using PieceManager;
using ServerSync;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Core.Tokens;
using YamlDotNet.Helpers;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.Converters;
using YamlDotNet.Serialization.EventEmitters;
using YamlDotNet.Serialization.NamingConventions;
using YamlDotNet.Serialization.NodeDeserializers;
using YamlDotNet.Serialization.NodeTypeResolvers;
using YamlDotNet.Serialization.ObjectFactories;
using YamlDotNet.Serialization.ObjectGraphTraversalStrategies;
using YamlDotNet.Serialization.ObjectGraphVisitors;
using YamlDotNet.Serialization.Schemas;
using YamlDotNet.Serialization.TypeInspectors;
using YamlDotNet.Serialization.TypeResolvers;
using YamlDotNet.Serialization.Utilities;
using YamlDotNet.Serialization.ValueDeserializers;
[assembly: AssemblyFileVersion("1.2.7.0")]
[assembly: Guid("150DFDAF-FF35-4302-B2CC-BEDCE69118D5")]
[assembly: ComVisible(false)]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyProduct("OdinHorse")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyDescription("https://valheim.thunderstore.io/package/OdinPlus/OdinHorse")]
[assembly: AssemblyTitle("OdinHorse")]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: CompilationRelaxations(8)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.2.7.0")]
[module: <ca17ce5c-c752-4e86-ad51-bc052d246a50>RefSafetyRules(11)]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[<4a24035f-546a-4ca5-acfb-045346217fc7>Embedded]
internal sealed class <4a24035f-546a-4ca5-acfb-045346217fc7>EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
[<4a24035f-546a-4ca5-acfb-045346217fc7>Embedded]
internal sealed class <2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public <2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public <2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[<4a24035f-546a-4ca5-acfb-045346217fc7>Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class <4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContextAttribute : Attribute
{
public readonly byte Flag;
public <4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
[<4a24035f-546a-4ca5-acfb-045346217fc7>Embedded]
[CompilerGenerated]
internal sealed class <ca17ce5c-c752-4e86-ad51-bc052d246a50>RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public <ca17ce5c-c752-4e86-ad51-bc052d246a50>RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace OdinHorse
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
[BepInPlugin("Raelaziel.OdinHorse", "OdinHorse", "1.6.1")]
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
public class OdinHorse : BaseUnityPlugin
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
internal enum Toggle
{
On = 1,
Off = 0
}
[HarmonyPatch(typeof(Character), "Awake")]
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
public static class CharacterAwakePatch
{
[CompilerGenerated]
private sealed class <ApplyHorseMaterial>d__1 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
private object <>2__current;
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
public Character character;
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
public ZNetView znv;
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
private SkinnedMeshRenderer <renderer>5__1;
private int <materialIndex>5__2;
object IEnumerator<object>.Current
{
[DebuggerHidden]
[return: <2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
[return: <2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <ApplyHorseMaterial>d__1(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<renderer>5__1 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Expected O, but got Unknown
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
//IL_014b: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = null;
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
<renderer>5__1 = ((Component)character).GetComponentInChildren<SkinnedMeshRenderer>();
if ((Object)(object)<renderer>5__1 == (Object)null)
{
return false;
}
<materialIndex>5__2 = znv.GetZDO().GetInt("HorseMaterial", -1);
if (<materialIndex>5__2 == -1)
{
<>2__current = (object)new WaitForSeconds(0.5f);
<>1__state = 2;
return true;
}
break;
case 2:
<>1__state = -1;
<materialIndex>5__2 = znv.GetZDO().GetInt("HorseMaterial", -1);
if (<materialIndex>5__2 == -1 && znv.IsOwner())
{
<materialIndex>5__2 = Random.Range(0, horseMaterials.Count);
znv.GetZDO().Set("HorseMaterial", <materialIndex>5__2);
}
else if (<materialIndex>5__2 == -1)
{
<>2__current = (object)new WaitForSeconds(1f);
<>1__state = 3;
return true;
}
break;
case 3:
<>1__state = -1;
<materialIndex>5__2 = znv.GetZDO().GetInt("HorseMaterial", 0);
break;
}
if (<materialIndex>5__2 < 0 || <materialIndex>5__2 >= horseMaterials.Count)
{
<materialIndex>5__2 = 0;
}
((Renderer)<renderer>5__1).material = horseMaterials[<materialIndex>5__2];
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private static void Postfix(Character __instance)
{
if (!(((Object)__instance).name != "rae_OdinHorse(Clone)"))
{
ZNetView component = ((Component)__instance).GetComponent<ZNetView>();
if (!((Object)(object)component == (Object)null) && component.IsValid())
{
((MonoBehaviour)__instance).StartCoroutine(ApplyHorseMaterial(__instance, component));
}
}
}
[IteratorStateMachine(typeof(<ApplyHorseMaterial>d__1))]
private static IEnumerator ApplyHorseMaterial(Character character, ZNetView znv)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <ApplyHorseMaterial>d__1(0)
{
character = character,
znv = znv
};
}
}
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
[HarmonyPatch(typeof(Character), "SetLevel")]
public static class Character_SetLevel_Patch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static void Postfix(Character __instance)
{
if (!((Object)((Component)__instance).gameObject).name.Contains("rae_OdinHorse"))
{
return;
}
ZNetView component = ((Component)__instance).GetComponent<ZNetView>();
if ((Object)(object)component == (Object)null || !component.IsValid())
{
return;
}
SkinnedMeshRenderer componentInChildren = ((Component)__instance).GetComponentInChildren<SkinnedMeshRenderer>();
if (!((Object)(object)componentInChildren == (Object)null))
{
int @int = component.GetZDO().GetInt("HorseMaterial", -1);
if (@int >= 0 && @int < horseMaterials.Count)
{
((Renderer)componentInChildren).material = horseMaterials[@int];
}
}
}
}
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
[HarmonyPatch(typeof(Tameable), "Awake")]
private static class AddRPCForHorseArmorTameableAwakePatch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static void Postfix(Tameable __instance)
{
if (!((Object)((Component)((Component)__instance).transform.root).gameObject).name.Contains("rae_OdinHorse"))
{
return;
}
if ((Object)(object)__instance.m_character != (Object)null)
{
Character character = __instance.m_character;
character.m_onDeath = (Action)Delegate.Remove(character.m_onDeath, new Action(__instance.OnHorseDeath));
Character character2 = __instance.m_character;
character2.m_onDeath = (Action)Delegate.Combine(character2.m_onDeath, new Action(__instance.OnHorseDeath));
}
if (!((Object)(object)__instance.m_nview == (Object)null) && __instance.m_nview.IsValid())
{
__instance.m_nview.Register("AddArmor", (Action<long>)delegate(long sender)
{
__instance.RPC_AddArmor(sender);
});
__instance.m_nview.Register<bool>("SetArmor", (Action<long, bool>)delegate(long sender, bool enabled)
{
__instance.RPC_SetArmor(sender, enabled);
});
__instance.m_nview.Register<Vector3>("RemoveArmor", (Action<long, Vector3>)delegate(long sender, Vector3 position)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
__instance.RPC_RemoveArmor(sender, position);
});
__instance.m_nview.Register("ToggleWait", (Action<long>)delegate(long sender)
{
__instance.RPC_ToggleWait(sender);
});
__instance.m_nview.Register<bool>("SetWait", (Action<long, bool>)delegate(long sender, bool enabled)
{
__instance.RPC_SetWait(sender, enabled);
});
__instance.SetArmor(__instance.HaveArmor());
__instance.SetWaitAnimation(__instance.IsWaiting());
}
}
}
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
[HarmonyPatch(typeof(Tameable), "GetHoverText")]
private static class AddTextForRemovalOfArmorTameableGetHoverTextPatch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static void Postfix(Tameable __instance, ref string __result)
{
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
//IL_0124: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)((Component)((Component)__instance).transform.root).gameObject).name.Contains("rae_OdinHorse"))
{
return;
}
if (!__instance.m_nview.IsValid())
{
__result = __result ?? "";
}
KeyboardShortcut value;
if (__instance.HaveArmor() && __instance.m_character.IsTamed())
{
string obj = __result;
string text;
if (ZInput.IsNonClassicFunctionality() && ZInput.IsGamepadActive())
{
Localization instance = Localization.instance;
value = RemoveArmorHotKey.Value;
text = instance.Localize("\n[<color=yellow><b>" + ((object)(KeyboardShortcut)(ref value)).ToString() + " + $KEY_Use</b></color>] Remove Armor");
}
else
{
Localization instance2 = Localization.instance;
value = RemoveArmorHotKey.Value;
text = instance2.Localize("\n[<color=yellow><b>" + ((object)(KeyboardShortcut)(ref value)).ToString() + " + $KEY_Use</b></color>] Remove Armor");
}
__result = obj + text;
}
if (__instance.m_character.IsTamed())
{
bool flag = __instance.IsWaiting();
string obj2 = __result;
string text2;
if (ZInput.IsNonClassicFunctionality() && ZInput.IsGamepadActive())
{
Localization instance3 = Localization.instance;
value = WaitHotKey.Value;
text2 = instance3.Localize("\n[<color=yellow><b>" + ((object)(KeyboardShortcut)(ref value)).ToString() + " + $KEY_Use</b></color>] " + (flag ? "Resume" : "Wait Here"));
}
else
{
Localization instance4 = Localization.instance;
value = WaitHotKey.Value;
text2 = instance4.Localize("\n[<color=yellow><b>" + ((object)(KeyboardShortcut)(ref value)).ToString() + " + $KEY_Use</b></color>] " + (flag ? "Resume" : "Wait Here"));
}
__result = obj2 + text2;
}
}
}
[HarmonyPatch(typeof(Tameable), "Interact")]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
private static class RemoveArmorTameableInteractPatch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static bool Prefix(Tameable __instance, Humanoid user, bool hold, bool alt)
{
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
if (!__instance.m_nview.IsValid() || hold)
{
return false;
}
if (!((Object)((Component)((Component)__instance).transform.root).gameObject).name.Contains("rae_OdinHorse"))
{
return true;
}
if (RemoveArmorHotKey.Value.IsKeyHeld() && __instance.HaveArmor())
{
__instance.m_nview.InvokeRPC("RemoveArmor", new object[1] { ((Component)user).transform.position });
return false;
}
if (WaitHotKey.Value.IsKeyHeld())
{
__instance.m_nview.InvokeRPC("ToggleWait", Array.Empty<object>());
return false;
}
return true;
}
}
[HarmonyPatch(typeof(Tameable), "Interact")]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
private static class CycleHorseStateTameableInteractPatch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static void Postfix(Tameable __instance, Humanoid user, bool hold, bool alt, bool __result)
{
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
if (!(!__instance.m_nview.IsValid() || hold || alt) && ((Object)((Component)((Component)__instance).transform.root).gameObject).name.Contains("rae_OdinHorse") && !RemoveArmorHotKey.Value.IsKeyHeld() && !WaitHotKey.Value.IsKeyHeld() && __instance.IsTamed() && __instance.IsWaiting())
{
__instance.m_nview.InvokeRPC("ToggleWait", Array.Empty<object>());
}
}
}
[HarmonyPatch(typeof(Tameable), "UseItem")]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
private static class UseArmorOnHorseTameableUseItemPatch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static void Postfix(Tameable __instance, Humanoid user, ItemData item)
{
if (((Object)((Component)((Component)__instance).transform.root).gameObject).name.Contains("rae_OdinHorse") && __instance.m_nview.IsValid() && !((Object)(object)__instance.GetArmorItem() == (Object)null) && __instance.m_character.IsTamed() && !(item.m_shared.m_name != __instance.GetArmorItem().m_itemData.m_shared.m_name))
{
if (__instance.HaveArmor())
{
((Character)user).Message((MessageType)2, __instance.m_character.GetHoverName() + " Armor Already equipped", 0, (Sprite)null);
return;
}
__instance.m_nview.InvokeRPC("AddArmor", new object[1] { ZNet.GetUID() });
user.GetInventory().RemoveOneItem(item);
((Character)user).Message((MessageType)2, __instance.m_character.GetHoverName() + " Armor added", 0, (Sprite)null);
}
}
}
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
public enum HorseBeasts
{
player,
horse
}
[HarmonyPatch(typeof(Vagon), "LateUpdate")]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
private class LateUpdate_Vagon_Patch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static void Prefix(ref Vagon __instance, ref ConfigurableJoint ___m_attachJoin, ref Rigidbody ___m_body)
{
try
{
if ((Object)(object)___m_attachJoin != (Object)null && (Object)(object)((Joint)___m_attachJoin).connectedBody == (Object)null)
{
__instance.Detach();
}
}
catch (Exception ex)
{
Debug.LogError((object)ex);
}
}
}
[HarmonyPatch(typeof(Vagon), "InUse")]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
private class InUse_Vagon_Patch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static bool Prefix(ref bool __result, ref Vagon __instance)
{
if (Object.op_Implicit((Object)(object)__instance.m_container) && __instance.m_container.IsInUse())
{
__result = true;
}
else if (__instance.IsAttached())
{
__result = Object.op_Implicit((Object)(object)((Component)((Joint)__instance.m_attachJoin).connectedBody).gameObject.GetComponent<Player>());
}
else
{
__result = false;
}
return false;
}
}
[HarmonyPatch(typeof(Vagon), "FixedUpdate")]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
private class Vagon_FixedUpdate_Patch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static bool Prefix(Vagon __instance)
{
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
if (!__instance.m_nview.IsValid())
{
return false;
}
if (__instance.IsAttached())
{
ConfigurableJoint attachJoin = __instance.m_attachJoin;
if ((Object)(object)((attachJoin != null) ? ((Joint)attachJoin).connectedBody : null) == (Object)null)
{
__instance.Detach();
return false;
}
}
__instance.UpdateAudio(Time.fixedDeltaTime);
if (__instance.m_nview.IsOwner())
{
if (Object.op_Implicit((Object)(object)__instance.m_useRequester))
{
if (__instance.IsAttached())
{
__instance.Detach();
}
else
{
Character val = FindClosestAttachableAnimal(__instance);
if ((Object)(object)val != (Object)null)
{
AttachCartTo(val, __instance);
}
else if (__instance.CanAttach(((Component)__instance.m_useRequester).gameObject))
{
AttachCartTo((Character)(object)__instance.m_useRequester, __instance);
}
else
{
((Character)__instance.m_useRequester).Message((MessageType)2, "Not in the right position", 0, (Sprite)null);
}
}
__instance.m_useRequester = null;
}
if (__instance.IsAttached())
{
__instance.m_detachDistance = GetCartDetachDistance(AttachedCharacter(__instance));
if (!__instance.CanAttach(((Component)((Joint)__instance.m_attachJoin).connectedBody).gameObject))
{
__instance.Detach();
}
}
}
else if (__instance.IsAttached())
{
__instance.Detach();
}
return false;
}
}
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
[HarmonyPatch(typeof(BaseAI), "Follow")]
private class Tamed_Follow_patch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static bool Prefix(GameObject go, float dt, ref BaseAI __instance)
{
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
if (!__instance.m_character.IsTamed())
{
return true;
}
BaseAI obj = __instance;
if ((Object)(object)((MonsterAI)((obj is MonsterAI) ? obj : null)).GetFollowTarget().GetComponent<Player>() == (Object)null)
{
return true;
}
float num = Vector3.Distance(go.transform.position, ((Component)__instance).transform.position);
HorseBeasts horseBeasts = ParseCharacterType(__instance.m_character);
HorseBeasts horseBeasts2 = horseBeasts;
if (horseBeasts2 == HorseBeasts.horse)
{
float num2 = 3f;
bool flag = num > num2 * 3f;
if (num < num2)
{
__instance.StopMoving();
}
else
{
__instance.MoveTo(dt, go.transform.position, 0f, flag);
}
return false;
}
return true;
}
}
[HarmonyPatch(typeof(MonsterAI), "UpdateAI")]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
private class MonsterAI_UpdateAI_WaitPatch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static bool Prefix(MonsterAI __instance, ref bool __result)
{
if ((Object)(object)__instance == (Object)null)
{
return true;
}
if ((Object)(object)((Component)__instance).gameObject == (Object)null)
{
return true;
}
if (!((Object)((Component)__instance).gameObject).name.Contains("rae_OdinHorse"))
{
return true;
}
Tameable component = ((Component)__instance).GetComponent<Tameable>();
if ((Object)(object)component != (Object)null && component.IsWaiting())
{
((BaseAI)__instance).StopMoving();
__result = true;
return false;
}
return true;
}
}
[HarmonyPatch(typeof(Sadle), "UseItem")]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
private class Sadle_UseItem_Patch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static void Postfix(Sadle __instance, bool __result)
{
if (__result)
{
Tameable componentInParent = ((Component)__instance).GetComponentInParent<Tameable>();
if ((Object)(object)componentInParent != (Object)null && componentInParent.IsWaiting())
{
componentInParent.m_nview.InvokeRPC("ToggleWait", Array.Empty<object>());
}
}
}
}
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
[HarmonyPatch(typeof(Character), "Damage")]
private class Character_Damage_Patch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static void Postfix(Character __instance, HitData hit)
{
if (((Object)((Component)__instance).gameObject).name.Contains("rae_OdinHorse"))
{
Tameable component = ((Component)__instance).GetComponent<Tameable>();
if ((Object)(object)component != (Object)null && component.IsWaiting())
{
component.m_nview.InvokeRPC("ToggleWait", Array.Empty<object>());
}
}
}
}
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
[HarmonyPatch(typeof(Tameable), "GetHoverText")]
private static class SaddlebagHoverTextPatch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static void Postfix(Tameable __instance, ref string __result)
{
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
if (((Object)((Component)((Component)__instance).transform.root).gameObject).name.Contains("rae_OdinHorse") && SaddleBagsEnabled.Value != 0 && __instance.m_nview.IsValid() && __instance.IsTamed() && __instance.HaveSaddle())
{
__result += Localization.instance.Localize($"\n[<color=yellow><b>{SaddleBagsHotKey.Value} + $KEY_Use</b></color>] Open Saddlebags");
}
}
}
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)]
[HarmonyPatch(typeof(Tameable), "Interact")]
private static class SaddlebagInteractPatch
{
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
private static bool Prefix(Tameable __instance, Humanoid user, bool hold, bool alt)
{
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
if (hold || alt)
{
return true;
}
if (!((Object)((Component)((Component)__instance).transform.root).gameObject).name.Contains("rae_OdinHorse"))
{
return true;
}
if (SaddleBagsEnabled.Value == Toggle.Off)
{
return true;
}
if (!__instance.m_nview.IsValid())
{
return true;
}
if (!__instance.IsTamed())
{
return true;
}
if (!__instance.HaveSaddle())
{
return true;
}
if (!SaddleBagsHotKey.Value.IsKeyHeld())
{
return true;
}
HorseSaddlebags.Open(__instance);
return false;
}
}
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
public static class CustomMapPins
{
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
public class CustomPinhandlerHorse : MonoBehaviour
{
public Sprite icon;
public string pinName;
private PinData pin;
private void Awake()
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Invalid comparison between Unknown and I4
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00dd: Expected O, but got Unknown
if (!((Component)this).gameObject.GetComponent<Tameable>().HaveSaddle())
{
Object.DestroyImmediate((Object)(object)this);
return;
}
pin = new PinData();
pin.m_type = (PinType)0;
pin.m_name = Localization.instance.Localize(pinName);
pin.m_pos = ((Component)this).transform.position;
pin.m_icon = icon;
pin.m_save = false;
pin.m_checked = false;
pin.m_ownerID = 0L;
RectTransform val = (((int)Minimap.instance.m_mode == 2) ? Minimap.instance.m_pinNameRootLarge : Minimap.instance.m_pinNameRootSmall);
pin.m_NamePinData = new PinNameData(pin);
Minimap.instance.CreateMapNamePin(pin, val);
pin.m_NamePinData.PinNameText.richText = true;
pin.m_NamePinData.PinNameText.overrideColorTags = false;
Minimap.instance?.m_pins?.Add(pin);
}
private void LateUpdate()
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
pin.m_checked = false;
pin.m_pos = ((Component)this).transform.position;
}
private void OnDestroy()
{
if (pin != null)
{
if (Object.op_Implicit((Object)(object)pin.m_uiElement))
{
Minimap.instance.DestroyPinMarker(pin);
}
Minimap.instance?.m_pins?.Remove(pin);
}
}
}
public static void RegisterCustomPin(GameObject go, string name, Sprite icon)
{
CustomPinhandlerHorse customPinhandlerHorse = go.AddComponent<CustomPinhandlerHorse>();
customPinhandlerHorse.pinName = name;
customPinhandlerHorse.icon = icon;
}
}
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
public static class CustomMapPins_Cart
{
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
public class CustomPinhandler_Generic_Cart : MonoBehaviour
{
public Sprite icon;
public string pinName;
private PinData pin;
private void Awake()
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Expected O, but got Unknown
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Invalid comparison between Unknown and I4
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Expected O, but got Unknown
pin = new PinData();
pin.m_type = (PinType)0;
pin.m_name = Localization.instance.Localize(pinName);
pin.m_pos = ((Component)this).transform.position;
pin.m_icon = icon;
pin.m_save = false;
pin.m_checked = false;
pin.m_ownerID = 0L;
RectTransform val = (((int)Minimap.instance.m_mode == 2) ? Minimap.instance.m_pinNameRootLarge : Minimap.instance.m_pinNameRootSmall);
pin.m_NamePinData = new PinNameData(pin);
Minimap.instance.CreateMapNamePin(pin, val);
pin.m_NamePinData.PinNameText.richText = true;
pin.m_NamePinData.PinNameText.overrideColorTags = false;
Minimap.instance?.m_pins?.Add(pin);
}
private void LateUpdate()
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
pin.m_checked = false;
pin.m_pos = ((Component)this).transform.position;
}
private void OnDestroy()
{
if (pin != null)
{
if ((Object)(object)pin.m_uiElement != (Object)null)
{
Minimap.instance.DestroyPinMarker(pin);
}
Minimap.instance?.m_pins?.Remove(pin);
}
}
}
public static void RegisterCustomPinGeneric(GameObject go, string name, Sprite icon)
{
CustomPinhandler_Generic_Cart customPinhandler_Generic_Cart = go.AddComponent<CustomPinhandler_Generic_Cart>();
customPinhandler_Generic_Cart.pinName = name;
customPinhandler_Generic_Cart.icon = icon;
}
}
private const string ModName = "OdinHorse";
private const string ModVersion = "1.6.1";
private const string ModGUID = "Raelaziel.OdinHorse";
private static readonly ConfigSync configSync = new ConfigSync("Raelaziel.OdinHorse")
{
DisplayName = "OdinHorse",
CurrentVersion = "1.6.1",
MinimumRequiredVersion = "1.6.1"
};
private static ConfigEntry<Toggle> serverConfigLocked = null;
internal static Creature raeHorse;
internal static ConfigEntry<int> HorseRunningSpeed = null;
internal static ConfigEntry<int> HorseWalkingSpeed = null;
internal static ConfigEntry<int> HorseSpeed = null;
internal static ConfigEntry<int> HorseTurnSpeed = null;
internal static ConfigEntry<int> HorseRunningTurnSpeed = null;
internal static ConfigEntry<int> HorseHealth = null;
internal static ConfigEntry<float> HorseStamina = null;
internal static ConfigEntry<float> HorseStaminaRegen = null;
internal static ConfigEntry<float> HorseStaminaRegenHungry = null;
internal static ConfigEntry<float> HorseProcreationUpdateInterval;
internal static ConfigEntry<float> HorseProcreationTotalCheckRange;
internal static ConfigEntry<int> HorseProcreationMaxCreatures;
internal static ConfigEntry<float> HorseProcreationPartnerCheckRange;
internal static ConfigEntry<float> HorseProcreationPregnancyChance;
internal static ConfigEntry<float> HorseProcreationPregnancyDuration;
internal static ConfigEntry<int> HorseProcreationRequiredLovePoints;
internal static ConfigEntry<int> HorseOffspringHealth = null;
internal static ConfigEntry<int> HorseOffspringGrowupTime = null;
internal static ConfigEntry<float> HorseOffspringMeatDropChance = null;
internal static ConfigEntry<int> HorseOffspringMeatDropMinimum = null;
internal static ConfigEntry<int> HorseOffspringMeatDropMaximum = null;
internal static ConfigEntry<float> HorseOffspringHideDropChance = null;
internal static ConfigEntry<int> HorseOffspringHideDropMinimum = null;
internal static ConfigEntry<int> HorseOffspringHideDropMaximum = null;
internal static ConfigEntry<KeyboardShortcut> RemoveArmorHotKey = null;
internal static ConfigEntry<KeyboardShortcut> WaitHotKey = null;
internal static ConfigEntry<KeyboardShortcut> SaddleBagsHotKey = null;
internal static ConfigEntry<Toggle> SaddleBagsEnabled = null;
internal static ConfigEntry<int> SaddleBagsWidth = null;
internal static ConfigEntry<int> SaddleBagsHeight = null;
internal static ConfigEntry<bool> HideHorsePin;
internal static ConfigEntry<bool> HideCartPin;
private static List<Material> horseMaterials;
private static AssetBundle horseAssetBundle;
private static string ConfigFileName = "Raelaziel.OdinHorse.cfg";
private static string ConfigFileFullPath;
private ConfigEntry<T> config<[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(2)] T>(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true)
{
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Expected O, but got Unknown
ConfigDescription val = new ConfigDescription(description.Description + (synchronizedSetting ? " [Synced with Server]" : " [Not Synced with Server]"), description.AcceptableValues, description.Tags);
ConfigEntry<T> val2 = ((BaseUnityPlugin)this).Config.Bind<T>(group, name, value, val);
SyncedConfigEntry<T> syncedConfigEntry = configSync.AddConfigEntry<T>(val2);
syncedConfigEntry.SynchronizedConfig = synchronizedSetting;
return val2;
}
private ConfigEntry<T> config<[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(2)] T>(string group, string name, T value, string description, bool synchronizedSetting = true)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Expected O, but got Unknown
return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()), synchronizedSetting);
}
public void Awake()
{
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: Expected O, but got Unknown
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Expected O, but got Unknown
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Expected O, but got Unknown
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Expected O, but got Unknown
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
//IL_0114: Expected O, but got Unknown
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
//IL_013f: Expected O, but got Unknown
//IL_015f: Unknown result type (might be due to invalid IL or missing references)
//IL_016a: Expected O, but got Unknown
//IL_018a: Unknown result type (might be due to invalid IL or missing references)
//IL_0195: Expected O, but got Unknown
//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
//IL_01c0: Expected O, but got Unknown
//IL_02b5: Unknown result type (might be due to invalid IL or missing references)
//IL_02c0: Expected O, but got Unknown
//IL_02e0: Unknown result type (might be due to invalid IL or missing references)
//IL_02eb: Expected O, but got Unknown
//IL_030b: Unknown result type (might be due to invalid IL or missing references)
//IL_0316: Expected O, but got Unknown
//IL_0332: Unknown result type (might be due to invalid IL or missing references)
//IL_033d: Expected O, but got Unknown
//IL_0359: Unknown result type (might be due to invalid IL or missing references)
//IL_0364: Expected O, but got Unknown
//IL_0384: Unknown result type (might be due to invalid IL or missing references)
//IL_038f: Expected O, but got Unknown
//IL_03ab: Unknown result type (might be due to invalid IL or missing references)
//IL_03b6: Expected O, but got Unknown
//IL_03d2: Unknown result type (might be due to invalid IL or missing references)
//IL_03dd: Expected O, but got Unknown
//IL_03f4: Unknown result type (might be due to invalid IL or missing references)
//IL_0404: Unknown result type (might be due to invalid IL or missing references)
//IL_040f: Expected O, but got Unknown
//IL_0426: Unknown result type (might be due to invalid IL or missing references)
//IL_0436: Unknown result type (might be due to invalid IL or missing references)
//IL_0441: Expected O, but got Unknown
//IL_0458: Unknown result type (might be due to invalid IL or missing references)
//IL_0468: Unknown result type (might be due to invalid IL or missing references)
//IL_0473: Expected O, but got Unknown
//IL_048f: Unknown result type (might be due to invalid IL or missing references)
//IL_049a: Expected O, but got Unknown
//IL_04bc: Unknown result type (might be due to invalid IL or missing references)
//IL_04c7: Expected O, but got Unknown
//IL_04e9: Unknown result type (might be due to invalid IL or missing references)
//IL_04f4: Expected O, but got Unknown
//IL_1086: Unknown result type (might be due to invalid IL or missing references)
//IL_10fb: Unknown result type (might be due to invalid IL or missing references)
//IL_163a: Unknown result type (might be due to invalid IL or missing references)
//IL_163f: Unknown result type (might be due to invalid IL or missing references)
//IL_164b: Unknown result type (might be due to invalid IL or missing references)
//IL_165b: Unknown result type (might be due to invalid IL or missing references)
//IL_166b: Unknown result type (might be due to invalid IL or missing references)
//IL_167b: Unknown result type (might be due to invalid IL or missing references)
//IL_1682: Unknown result type (might be due to invalid IL or missing references)
//IL_168e: Expected O, but got Unknown
//IL_169b: Unknown result type (might be due to invalid IL or missing references)
//IL_16a0: Unknown result type (might be due to invalid IL or missing references)
//IL_16ac: Unknown result type (might be due to invalid IL or missing references)
//IL_16bc: Unknown result type (might be due to invalid IL or missing references)
//IL_16cc: Unknown result type (might be due to invalid IL or missing references)
//IL_16dc: Unknown result type (might be due to invalid IL or missing references)
//IL_16e3: Unknown result type (might be due to invalid IL or missing references)
//IL_16ef: Expected O, but got Unknown
//IL_17a8: Unknown result type (might be due to invalid IL or missing references)
//IL_17af: Expected O, but got Unknown
Localizer.Load();
LoadAssetBundle();
bool saveOnConfigSet = ((BaseUnityPlugin)this).Config.SaveOnConfigSet;
((BaseUnityPlugin)this).Config.SaveOnConfigSet = false;
serverConfigLocked = config("General", "Lock Configuration", Toggle.On, "If on, the configuration is locked and can be changed by server admins only.");
configSync.AddLockingConfigEntry<Toggle>(serverConfigLocked);
HorseRunningSpeed = config("Horse", "Running Speed", 12, new ConfigDescription("Horse's gallop speed when sprinting/riding. Affects unmounted running too.", (AcceptableValueBase)null, Array.Empty<object>()));
HorseWalkingSpeed = config("Horse", "Walking Speed", 5, new ConfigDescription("Horse's walking speed when not tamed or mounted. Has no effect on mounted walk speed — use Speed Modifier for that.", (AcceptableValueBase)null, Array.Empty<object>()));
HorseSpeed = config("Horse", "Speed Modifier", 1, new ConfigDescription("Global speed multiplier applied on top of all other speed values. Affects walking, running, and mounted movement. Setting this to 2 doubles all speeds. Primary control for mounted walk speed.", (AcceptableValueBase)null, Array.Empty<object>()));
HorseTurnSpeed = config("Horse", "Turn Speed", 75, new ConfigDescription("Declare turning speed for Horse", (AcceptableValueBase)null, Array.Empty<object>()));
HorseRunningTurnSpeed = config("Horse", "Run Turn Speed", 120, new ConfigDescription("Declare turning speed when running for Horse", (AcceptableValueBase)null, Array.Empty<object>()));
HorseHealth = config("Horse", "Health", 200, new ConfigDescription("Declare health points for Horse", (AcceptableValueBase)null, Array.Empty<object>()));
HorseStamina = config("Horse", "Stamina", 400f, new ConfigDescription("Declare stamina for Horse", (AcceptableValueBase)null, Array.Empty<object>()));
HorseStaminaRegen = config("Horse", "Stamina Regen", 2f, new ConfigDescription("Declare stamina regen for Horse", (AcceptableValueBase)null, Array.Empty<object>()));
HorseStaminaRegenHungry = config("Horse", "Stamina Regen Hungry", 1f, new ConfigDescription("Declare stamina regen when hungry for Horse", (AcceptableValueBase)null, Array.Empty<object>()));
HorseProcreationUpdateInterval = config("Horse Procreation", "Update Interval", 10f, "Time interval in seconds to check for procreation.");
HorseProcreationTotalCheckRange = config("Horse Procreation", "Total Check Range", 10f, "Range in meters to check for total creatures.");
HorseProcreationMaxCreatures = config("Horse Procreation", "Max Creatures", 4, "Maximum number of creatures allowed in range.");
HorseProcreationPartnerCheckRange = config("Horse Procreation", "Partner Check Range", 3f, "Range in meters to find a procreation partner.");
HorseProcreationPregnancyChance = config("Horse Procreation", "Pregnancy Chance", 0.5f, "Chance of becoming pregnant per check.");
HorseProcreationPregnancyDuration = config("Horse Procreation", "Pregnancy Duration", 10f, "Duration of pregnancy in seconds.");
HorseProcreationRequiredLovePoints = config("Horse Procreation", "Required Love Points", 4, "Number of love points required to trigger pregnancy.");
HorseOffspringHealth = config("Horse Offspring", "Health", 60, new ConfigDescription("Declare health points for Horse Offspring", (AcceptableValueBase)null, Array.Empty<object>()));
HorseOffspringGrowupTime = config("Horse Offspring", "Grow-up time", 2000, new ConfigDescription("Declare growup time needed to convert offspring into Horse. Time in seconds.", (AcceptableValueBase)null, Array.Empty<object>()));
HorseOffspringMeatDropChance = config("Horse Offspring", "Meat Drop Chance", 1f, new ConfigDescription("Declare drop chance for Horse Meat from offspring", (AcceptableValueBase)null, Array.Empty<object>()));
HorseOffspringMeatDropMinimum = config("Horse Offspring", "Meat Amount Min", 1, new ConfigDescription("Declare minimum amount of Horse Meat to drop from offspring", (AcceptableValueBase)null, Array.Empty<object>()));
HorseOffspringMeatDropMaximum = config("Horse Offspring", "Meat Amount Max", 2, new ConfigDescription("Declare maximum amount of Horse Meat to drop from offspring", (AcceptableValueBase)null, Array.Empty<object>()));
HorseOffspringHideDropChance = config("Horse Offspring", "Hide Drop Chance", 0.33f, new ConfigDescription("Declare drop chance for Horse Hide from offspring", (AcceptableValueBase)null, Array.Empty<object>()));
HorseOffspringHideDropMinimum = config("Horse Offspring", "Hide Amount Min", 1, new ConfigDescription("Declare minimum amount of Horse Hide to drop from offspring", (AcceptableValueBase)null, Array.Empty<object>()));
HorseOffspringHideDropMaximum = config("Horse Offspring", "Hide Amount Max", 1, new ConfigDescription("Declare maximum amount of Horse Hide to drop from offspring", (AcceptableValueBase)null, Array.Empty<object>()));
RemoveArmorHotKey = config<KeyboardShortcut>("Hotkeys", "Remove Armor Key", new KeyboardShortcut((KeyCode)114, Array.Empty<KeyCode>()), new ConfigDescription("The key needed to be held while interacting with the horse to remove the armor.", (AcceptableValueBase)null, Array.Empty<object>()));
WaitHotKey = config<KeyboardShortcut>("Hotkeys", "Wait Here Key", new KeyboardShortcut((KeyCode)116, Array.Empty<KeyCode>()), new ConfigDescription("The key needed to be held while interacting with the horse to make it wait in place.", (AcceptableValueBase)null, Array.Empty<object>()));
SaddleBagsHotKey = config<KeyboardShortcut>("Hotkeys", "Saddlebags Key", new KeyboardShortcut((KeyCode)98, Array.Empty<KeyCode>()), new ConfigDescription("The key needed to be held while interacting with the saddled horse to open its saddlebag inventory.", (AcceptableValueBase)null, Array.Empty<object>()));
SaddleBagsEnabled = config("Saddlebags", "Disable", Toggle.On, new ConfigDescription("If On, a saddlebag inventory is available on tamed, saddled horses, this setting is still being tested. For performance reasons and memory usage, it is off by default.", (AcceptableValueBase)null, Array.Empty<object>()));
SaddleBagsWidth = config("Saddlebags", "Width", 2, new ConfigDescription("Number of columns in the saddlebag inventory.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 8), Array.Empty<object>()));
SaddleBagsHeight = config("Saddlebags", "Height", 1, new ConfigDescription("Number of rows in the saddlebag inventory.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 4), Array.Empty<object>()));
HideHorsePin = config("Map Icons", "HideHorsePin", value: false, "If true, disables the map icon for the Odin Horse.");
HideCartPin = config("Map Icons", "HideCartPin", value: false, "If true, disables the map icon for the Odin Cart.");
Item item = new Item("horsesets", "rae_HorseMeat");
Item item2 = new Item("horsesets", "rae_HorseHide");
Item item3 = new Item("horsesets", "rae_OdinHorse_Trophy");
Item item4 = new Item("horsesets", "rae_CookedHorseMeat");
Item item5 = new Item("horsesets", "rae_SaddleHorse");
item5.Crafting.Add(ItemManager.CraftingTable.Workbench, 1);
item5.MaximumRequiredStationLevel = 5;
item5.RequiredItems.Add("Bronze", 1);
item5.RequiredItems.Add("rae_HorseHide", 8);
item5.CraftAmount = 1;
Item item6 = new Item("horsesets", "rae_iron_HorseArmor");
item6.Crafting.Add(ItemManager.CraftingTable.Forge, 1);
item6.MaximumRequiredStationLevel = 5;
item6.RequiredItems.Add("Iron", 10);
item6.RequiredItems.Add("rae_HorseHide", 20);
item6.CraftAmount = 1;
TameableExtensions.m_armorItem = item6.Prefab.GetComponent<ItemDrop>();
Item item7 = new Item("horsesets", "rae_HorseSticks");
item7.Configurable = Configurability.Full;
item7.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
item7.MaximumRequiredStationLevel = 10;
item7.RequiredItems.Add("rae_HorseMeat", 3);
item7.RequiredItems.Add("Coal", 1);
item7.RequiredItems.Add("Dandelion", 2);
item7.CraftAmount = 2;
Item item8 = new Item("horsesets", "rae_HorseSoup");
item8.Configurable = Configurability.Full;
item8.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1);
item8.MaximumRequiredStationLevel = 10;
item8.RequiredItems.Add("rae_HorseMeat", 2);
item8.RequiredItems.Add("Carrot", 2);
item8.RequiredItems.Add("Dandelion", 3);
item8.CraftAmount = 1;
Item item9 = new Item("horsesets", "rae_HorseMeatSkewer");
item9.Configurable = Configurability.Full;
item9.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2);
item9.MaximumRequiredStationLevel = 10;
item9.RequiredItems.Add("rae_HorseMeat", 3);
item9.RequiredItems.Add("Mushroom", 2);
item9.RequiredItems.Add("NeckTail", 1);
item9.CraftAmount = 2;
Item item10 = new Item("horsesets", "rae_Horseaker");
item10.Configurable = Configurability.Full;
item10.Crafting.Add(ItemManager.CraftingTable.Forge, 1);
item10.MaximumRequiredStationLevel = 10;
item10.RequiredItems.Add("Iron", 20);
item10.RequiredItems.Add("rae_OdinHorse_Trophy", 1);
item10.RequiredItems.Add("ElderBark", 35);
item10.RequiredUpgradeItems.Add("Iron", 5);
item10.RequiredUpgradeItems.Add("ElderBark", 10);
item10.CraftAmount = 1;
Item item11 = new Item("horsesets", "rae_OdinHorse_Helmet");
item11.Configurable = Configurability.Full;
item11.Crafting.Add(ItemManager.CraftingTable.Workbench, 1);
item11.MaximumRequiredStationLevel = 10;
item11.RequiredItems.Add("Tin", 10);
item11.RequiredItems.Add("rae_OdinHorse_Trophy", 1);
item11.RequiredItems.Add("rae_HorseHide", 5);
item11.RequiredUpgradeItems.Add("rae_HorseHide", 4);
item11.RequiredUpgradeItems.Add("Tin", 2);
item11.CraftAmount = 1;
Item item12 = new Item("horsesets", "rae_CapeHorseHide");
item12.Configurable = Configurability.Full;
item12.Crafting.Add(ItemManager.CraftingTable.Workbench, 1);
item12.MaximumRequiredStationLevel = 10;
item12.RequiredItems.Add("rae_HorseHide", 10);
item12.RequiredItems.Add("rae_OdinHorse_Trophy", 1);
item12.RequiredItems.Add("Tin", 2);
item12.RequiredUpgradeItems.Add("rae_HorseHide", 10);
item12.RequiredUpgradeItems.Add("Tin", 2);
item12.CraftAmount = 1;
Item item13 = new Item("horsesets", "ArmorHorseClothHelmet_T1");
item13.Configurable = Configurability.Full;
item13.Crafting.Add(ItemManager.CraftingTable.Workbench, 1);
item13.MaximumRequiredStationLevel = 10;
item13.RequiredItems.Add("rae_HorseHide", 4);
item13.RequiredItems.Add("LeatherScraps", 6);
item13.RequiredItems.Add("rae_OdinHorse_Trophy", 1);
item13.RequiredUpgradeItems.Add("rae_HorseHide", 2);
item13.RequiredUpgradeItems.Add("LeatherScraps", 3);
item13.CraftAmount = 1;
Item item14 = new Item("horsesets", "ArmorHorseClothHelmet_T2");
item14.Configurable = Configurability.Full;
item14.Crafting.Add(ItemManager.CraftingTable.Forge, 1);
item14.MaximumRequiredStationLevel = 10;
item14.RequiredItems.Add("rae_HorseHide", 6);
item14.RequiredItems.Add("Iron", 15);
item14.RequiredItems.Add("LeatherScraps", 4);
item14.RequiredItems.Add("rae_OdinHorse_Trophy", 1);
item14.RequiredUpgradeItems.Add("rae_HorseHide", 3);
item14.RequiredUpgradeItems.Add("Iron", 5);
item14.RequiredUpgradeItems.Add("LeatherScraps", 2);
item14.CraftAmount = 1;
Item item15 = new Item("horsesets", "ArmorHorseClothChest_T1");
item15.Configurable = Configurability.Full;
item15.Crafting.Add(ItemManager.CraftingTable.Workbench, 1);
item15.MaximumRequiredStationLevel = 10;
item15.RequiredItems.Add("rae_HorseHide", 4);
item15.RequiredItems.Add("LeatherScraps", 8);
item15.RequiredUpgradeItems.Add("rae_HorseHide", 2);
item15.RequiredUpgradeItems.Add("LeatherScraps", 4);
item15.CraftAmount = 1;
Item item16 = new Item("horsesets", "ArmorHorseClothChest_T2");
item16.Configurable = Configurability.Full;
item16.Crafting.Add(ItemManager.CraftingTable.Forge, 1);
item16.MaximumRequiredStationLevel = 10;
item16.RequiredItems.Add("rae_HorseHide", 6);
item16.RequiredItems.Add("Iron", 20);
item16.RequiredItems.Add("LeatherScraps", 8);
item16.RequiredUpgradeItems.Add("rae_HorseHide", 2);
item16.RequiredUpgradeItems.Add("Iron", 5);
item16.RequiredUpgradeItems.Add("LeatherScraps", 4);
item16.CraftAmount = 1;
Item item17 = new Item("horsesets", "ArmorHorseClothLegs_T1");
item17.Configurable = Configurability.Full;
item17.Crafting.Add(ItemManager.CraftingTable.Workbench, 1);
item17.MaximumRequiredStationLevel = 10;
item17.RequiredItems.Add("rae_HorseHide", 4);
item17.RequiredItems.Add("LeatherScraps", 8);
item17.RequiredUpgradeItems.Add("rae_HorseHide", 2);
item17.RequiredUpgradeItems.Add("LeatherScraps", 4);
item17.CraftAmount = 1;
Item item18 = new Item("horsesets", "ArmorHorseClothLegs_T2");
item18.Configurable = Configurability.Full;
item18.Crafting.Add(ItemManager.CraftingTable.Forge, 1);
item18.MaximumRequiredStationLevel = 10;
item18.RequiredItems.Add("rae_HorseHide", 6);
item18.RequiredItems.Add("Iron", 20);
item18.RequiredItems.Add("LeatherScraps", 8);
item18.RequiredUpgradeItems.Add("rae_HorseHide", 2);
item18.RequiredUpgradeItems.Add("Iron", 5);
item18.RequiredUpgradeItems.Add("LeatherScraps", 4);
item18.CraftAmount = 1;
BuildPiece buildPiece = new BuildPiece("horsesets", "rae_OdinHorse_Rug");
buildPiece.RequiredItems.Add("rae_HorseHide", 20, recover: true);
buildPiece.Category.Set(BuildPieceCategory.Furniture);
buildPiece.Crafting.Set(PieceManager.CraftingTable.Workbench);
BuildPiece buildPiece2 = new BuildPiece("horsesets", "rae_OdinHorse_Rug_Headless");
buildPiece2.RequiredItems.Add("rae_HorseHide", 20, recover: true);
buildPiece2.Category.Set(BuildPieceCategory.Furniture);
buildPiece2.Crafting.Set(PieceManager.CraftingTable.Workbench);
BuildPiece buildPiece3 = new BuildPiece("horsesets", "rae_HorseChair");
buildPiece3.RequiredItems.Add("rae_HorseHide", 2, recover: true);
buildPiece3.RequiredItems.Add("FineWood", 3, recover: true);
buildPiece3.Category.Set(BuildPieceCategory.Furniture);
buildPiece3.Crafting.Set(PieceManager.CraftingTable.Workbench);
BuildPiece buildPiece4 = new BuildPiece("horsesets", "rae_HorseCart");
buildPiece4.RequiredItems.Add("BronzeNails", 60, recover: true);
buildPiece4.RequiredItems.Add("FineWood", 40, recover: true);
buildPiece4.Category.Set(BuildPieceCategory.Misc);
buildPiece4.Crafting.Set(PieceManager.CraftingTable.Workbench);
buildPiece4.Prefab.GetComponent<Vagon>().m_breakForce = float.MaxValue;
GameObject val = ItemManager.PrefabManager.RegisterPrefab("horsesets", "rae_Offspring_Normal");
GameObject val2 = ItemManager.PrefabManager.RegisterPrefab("horsesets", "rae_Offspring_Normal_ragdoll");
GameObject val3 = ItemManager.PrefabManager.RegisterPrefab("horsesets", "rae_OdinHorse_ragdoll");
GameObject val4 = ItemManager.PrefabManager.RegisterPrefab("horsesets", "sfx_horse_idle");
GameObject val5 = ItemManager.PrefabManager.RegisterPrefab("horsesets", "sfx_horse_birth");
GameObject val6 = ItemManager.PrefabManager.RegisterPrefab("horsesets", "vfx_horse_birth");
GameObject val7 = ItemManager.PrefabManager.RegisterPrefab("horsesets", "sfx_horse_hit");
GameObject val8 = ItemManager.PrefabManager.RegisterPrefab("horsesets", "vfx_horse_death");
GameObject val9 = ItemManager.PrefabManager.RegisterPrefab("horsesets", "Sfx_horse_love");
GameObject val10 = ItemManager.PrefabManager.RegisterPrefab("horsesets", "vfx_horse_love");
Item item19 = new Item("horsesets", "horse_bite_attack");
item19.Configurable = Configurability.Stats;
raeHorse = new Creature("horsesets", "rae_OdinHorse")
{
ConfigurationEnabled = true,
TamingTime = 1600f,
FedDuration = 300f,
Biome = (Biome)1,
CanSpawn = true,
CanBeTamed = true,
CanHaveStars = true,
FoodItems = "Blueberries, Carrot, Cloudberry, Barley",
SpawnChance = 15f,
GroupSize = new CreatureManager.Range(1f, 2f),
CheckSpawnInterval = 2000,
SpecificSpawnTime = SpawnTime.Day,
SpecificSpawnArea = SpawnArea.Center,
RequiredWeather = Weather.ClearSkies,
AttackImmediately = false,
ForestSpawn = Forest.Both,
CreatureFaction = (Faction)2,
Maximum = 1
};
raeHorse.Drops["rae_HorseMeat"].Amount = new CreatureManager.Range(1f, 2f);
raeHorse.Drops["rae_HorseMeat"].DropChance = 100f;
raeHorse.Drops["rae_HorseHide"].Amount = new CreatureManager.Range(1f, 2f);
raeHorse.Drops["rae_HorseHide"].DropChance = 100f;
raeHorse.Drops["rae_OdinHorse_Trophy"].Amount = new CreatureManager.Range(1f, 2f);
raeHorse.Drops["rae_OdinHorse_Trophy"].DropChance = 10f;
((Character)raeHorse.Prefab.GetComponent<Humanoid>()).m_runSpeed = HorseRunningSpeed.Value;
((Character)raeHorse.Prefab.GetComponent<Humanoid>()).m_walkSpeed = HorseWalkingSpeed.Value;
((Character)raeHorse.Prefab.GetComponent<Humanoid>()).m_speed = HorseSpeed.Value;
((Character)raeHorse.Prefab.GetComponent<Humanoid>()).m_turnSpeed = HorseTurnSpeed.Value;
((Character)raeHorse.Prefab.GetComponent<Humanoid>()).m_runTurnSpeed = HorseRunningTurnSpeed.Value;
((Character)raeHorse.Prefab.GetComponent<Humanoid>()).m_health = HorseHealth.Value;
raeHorse.Prefab.GetComponentInChildren<Sadle>(true).m_maxStamina = HorseStamina.Value;
raeHorse.Prefab.GetComponentInChildren<Sadle>(true).m_staminaRegen = HorseStaminaRegen.Value;
raeHorse.Prefab.GetComponentInChildren<Sadle>(true).m_staminaRegenHungry = HorseStaminaRegenHungry.Value;
raeHorse.Prefab.GetComponentInChildren<Procreation>(true).m_updateInterval = HorseProcreationUpdateInterval.Value;
raeHorse.Prefab.GetComponentInChildren<Procreation>(true).m_totalCheckRange = HorseProcreationTotalCheckRange.Value;
raeHorse.Prefab.GetComponentInChildren<Procreation>(true).m_maxCreatures = HorseProcreationMaxCreatures.Value;
raeHorse.Prefab.GetComponentInChildren<Procreation>(true).m_partnerCheckRange = HorseProcreationPartnerCheckRange.Value;
raeHorse.Prefab.GetComponentInChildren<Procreation>(true).m_pregnancyChance = HorseProcreationPregnancyChance.Value;
raeHorse.Prefab.GetComponentInChildren<Procreation>(true).m_pregnancyDuration = HorseProcreationPregnancyDuration.Value;
raeHorse.Prefab.GetComponentInChildren<Procreation>(true).m_requiredLovePoints = HorseProcreationRequiredLovePoints.Value;
HorseRunningSpeed.SettingChanged += ApplyHorseConfig;
HorseWalkingSpeed.SettingChanged += ApplyHorseConfig;
HorseSpeed.SettingChanged += ApplyHorseConfig;
HorseTurnSpeed.SettingChanged += ApplyHorseConfig;
HorseRunningTurnSpeed.SettingChanged += ApplyHorseConfig;
HorseHealth.SettingChanged += ApplyHorseConfig;
HorseStamina.SettingChanged += ApplyHorseConfig;
HorseStaminaRegen.SettingChanged += ApplyHorseConfig;
HorseStaminaRegenHungry.SettingChanged += ApplyHorseConfig;
HorseProcreationUpdateInterval.SettingChanged += ApplyHorseConfig;
HorseProcreationTotalCheckRange.SettingChanged += ApplyHorseConfig;
HorseProcreationMaxCreatures.SettingChanged += ApplyHorseConfig;
HorseProcreationPartnerCheckRange.SettingChanged += ApplyHorseConfig;
HorseProcreationPregnancyChance.SettingChanged += ApplyHorseConfig;
HorseProcreationPregnancyDuration.SettingChanged += ApplyHorseConfig;
HorseProcreationRequiredLovePoints.SettingChanged += ApplyHorseConfig;
val.GetComponent<CharacterDrop>().m_drops.Add(new Drop
{
m_prefab = item2.Prefab,
m_amountMin = HorseOffspringHideDropMinimum.Value,
m_amountMax = HorseOffspringHideDropMaximum.Value,
m_chance = HorseOffspringHideDropChance.Value,
m_levelMultiplier = true,
m_onePerPlayer = false
});
val.GetComponent<CharacterDrop>().m_drops.Add(new Drop
{
m_prefab = item.Prefab,
m_amountMin = HorseOffspringMeatDropMinimum.Value,
m_amountMax = HorseOffspringMeatDropMaximum.Value,
m_chance = HorseOffspringMeatDropChance.Value,
m_levelMultiplier = true,
m_onePerPlayer = false
});
((Character)val.GetComponent<Humanoid>()).m_health = HorseOffspringHealth.Value;
val.GetComponent<Growup>().m_growTime = HorseOffspringGrowupTime.Value;
if (!HideHorsePin.Value)
{
CustomMapPins.RegisterCustomPin(raeHorse.Prefab, "$horse_odin", item3.Prefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_icons[0]);
}
if (!HideCartPin.Value)
{
CustomMapPins_Cart.RegisterCustomPinGeneric(buildPiece4.Prefab, "$pin_cart", buildPiece4.Prefab.GetComponent<Piece>().m_icon);
}
Assembly executingAssembly = Assembly.GetExecutingAssembly();
Harmony val11 = new Harmony("Raelaziel.OdinHorse");
val11.PatchAll(executingAssembly);
if (saveOnConfigSet)
{
((BaseUnityPlugin)this).Config.SaveOnConfigSet = saveOnConfigSet;
((BaseUnityPlugin)this).Config.Save();
}
SetupWatcher();
}
private void OnDestroy()
{
((BaseUnityPlugin)this).Config.Save();
}
private void SetupWatcher()
{
FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, ConfigFileName);
fileSystemWatcher.Changed += ReadConfigValues;
fileSystemWatcher.Created += ReadConfigValues;
fileSystemWatcher.Renamed += ReadConfigValues;
fileSystemWatcher.IncludeSubdirectories = true;
fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject;
fileSystemWatcher.EnableRaisingEvents = true;
}
private void ReadConfigValues(object sender, FileSystemEventArgs e)
{
if (!File.Exists(ConfigFileFullPath))
{
return;
}
try
{
((BaseUnityPlugin)this).Config.Reload();
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)("There was an issue loading your " + ConfigFileName));
((BaseUnityPlugin)this).Logger.LogError((object)"Please check your config entries for spelling and format!");
}
}
private void LoadAssetBundle()
{
string text = "OdinHorse.assets.horsesets";
using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(text);
if (stream == null)
{
((BaseUnityPlugin)this).Logger.LogError((object)("Failed to load embedded resource: " + text));
return;
}
horseAssetBundle = AssetBundle.LoadFromStream(stream);
if ((Object)(object)horseAssetBundle == (Object)null)
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load AssetBundle from stream.");
return;
}
horseMaterials = new List<Material>
{
horseAssetBundle.LoadAsset<Material>("Horse_color_Black_Tobiano_pinto"),
horseAssetBundle.LoadAsset<Material>("Horse_color_brown"),
horseAssetBundle.LoadAsset<Material>("Horse_color_grays"),
horseAssetBundle.LoadAsset<Material>("Horse_color_palomino"),
horseAssetBundle.LoadAsset<Material>("Horse_color_white"),
horseAssetBundle.LoadAsset<Material>("Horse_color_dark_grey")
};
}
private void RegisterHorseWithCreatureManager()
{
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
Creature creature = new Creature("horsesets", "rae_OdinHorse")
{
ConfigurationEnabled = true,
TamingTime = 1600f,
FedDuration = 300f,
Biome = (Biome)1,
CanSpawn = true,
CanBeTamed = true,
CanHaveStars = true,
FoodItems = "Blueberries, Carrot, Cloudberry, Barley",
SpawnChance = 15f,
GroupSize = new CreatureManager.Range(1f, 2f),
CheckSpawnInterval = 2000,
SpecificSpawnTime = SpawnTime.Day,
SpecificSpawnArea = SpawnArea.Center,
RequiredWeather = Weather.ClearSkies,
AttackImmediately = false,
ForestSpawn = Forest.Both,
CreatureFaction = (Faction)2,
Maximum = 1
};
creature.Drops["rae_HorseMeat"].Amount = new CreatureManager.Range(1f, 2f);
creature.Drops["rae_HorseMeat"].DropChance = 100f;
creature.Drops["rae_HorseHide"].Amount = new CreatureManager.Range(1f, 2f);
creature.Drops["rae_HorseHide"].DropChance = 100f;
creature.Drops["rae_OdinHorse_Trophy"].Amount = new CreatureManager.Range(1f, 2f);
creature.Drops["rae_OdinHorse_Trophy"].DropChance = 10f;
}
private void OnPrefabPostLoad(GameObject prefab)
{
SkinnedMeshRenderer componentInChildren = prefab.GetComponentInChildren<SkinnedMeshRenderer>();
if (!((Object)(object)componentInChildren == (Object)null))
{
((Renderer)componentInChildren).material = horseMaterials[0];
}
}
public static HorseBeasts ParseCharacterType(Character c)
{
if (c.IsPlayer())
{
return HorseBeasts.player;
}
if (c.m_nview.IsValid())
{
string name = ((Object)ZNetScene.instance.GetPrefab(c.m_nview.GetZDO().GetPrefab())).name;
string text = name;
if (text == "rae_OdinHorse")
{
return HorseBeasts.horse;
}
return HorseBeasts.horse;
}
return HorseBeasts.horse;
}
public static Vector3 GetCartOffsetVectorForCharacter(Character c)
{
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
if (Object.op_Implicit((Object)(object)c))
{
return new Vector3(0f, 0.8f, 0f - c.GetRadius());
}
return new Vector3(0f, 0.8f, 0f);
}
public static bool IsAttachableCharacter(Character c)
{
return ParseCharacterType(c) switch
{
HorseBeasts.player => false,
HorseBeasts.horse => true,
_ => true,
};
}
public static float GetCartDetachDistance(Character c)
{
if (Object.op_Implicit((Object)(object)c))
{
if (c.IsPlayer())
{
return 2f;
}
return c.GetRadius() * 3f;
}
return 0f;
}
private static Character FindClosestAttachableAnimal(Vagon cart)
{
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)cart == (Object)null || (Object)(object)cart.m_attachPoint == (Object)null)
{
return null;
}
Transform attachPoint = cart.m_attachPoint;
Character result = null;
float num = float.MaxValue;
if (!Object.op_Implicit((Object)(object)cart.m_attachPoint))
{
return null;
}
foreach (Character allCharacter in Character.GetAllCharacters())
{
if (!((Object)(object)allCharacter == (Object)null) && allCharacter.m_nview.IsValid() && !allCharacter.IsDead() && Object.op_Implicit((Object)(object)allCharacter) && !allCharacter.IsPlayer() && allCharacter.IsTamed() && IsAttachableCharacter(allCharacter))
{
Vector3 cartOffsetVectorForCharacter = GetCartOffsetVectorForCharacter(allCharacter);
Vector3 position = ((Component)allCharacter).transform.position;
float num2 = Vector3.Distance(position + cartOffsetVectorForCharacter, attachPoint.position);
float cartDetachDistance = GetCartDetachDistance(allCharacter);
if (num2 < cartDetachDistance && num2 < num)
{
result = allCharacter;
num = num2;
}
}
}
return result;
}
private static Character AttachedCharacter(Vagon cart)
{
if (Object.op_Implicit((Object)(object)cart) && cart.IsAttached())
{
return ((Component)((Joint)cart.m_attachJoin).connectedBody).gameObject.GetComponent<Character>();
}
return null;
}
private static void LogCartContents(Vagon cart)
{
Container container = cart.m_container;
foreach (ItemData allItem in container.GetInventory().GetAllItems())
{
}
}
private static void AttachCartTo(Character attachTarget, Vagon cart)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
cart.m_attachOffset = GetCartOffsetVectorForCharacter(attachTarget);
cart.m_attachJoin = ((Component)cart).gameObject.AddComponent<ConfigurableJoint>();
((Joint)cart.m_attachJoin).autoConfigureConnectedAnchor = false;
((Joint)cart.m_attachJoin).anchor = cart.m_attachPoint.localPosition;
((Joint)cart.m_attachJoin).connectedAnchor = cart.m_attachOffset;
((Joint)cart.m_attachJoin).breakForce = cart.m_breakForce;
cart.m_attachJoin.xMotion = (ConfigurableJointMotion)1;
cart.m_attachJoin.yMotion = (ConfigurableJointMotion)1;
cart.m_attachJoin.zMotion = (ConfigurableJointMotion)1;
SoftJointLimit linearLimit = default(SoftJointLimit);
((SoftJointLimit)(ref linearLimit)).limit = 0.05f;
cart.m_attachJoin.linearLimit = linearLimit;
SoftJointLimitSpring linearLimitSpring = default(SoftJointLimitSpring);
((SoftJointLimitSpring)(ref linearLimitSpring)).spring = cart.m_spring;
((SoftJointLimitSpring)(ref linearLimitSpring)).damper = cart.m_springDamping;
cart.m_attachJoin.linearLimitSpring = linearLimitSpring;
cart.m_attachJoin.zMotion = (ConfigurableJointMotion)0;
((Joint)cart.m_attachJoin).connectedBody = ((Component)attachTarget).gameObject.GetComponent<Rigidbody>();
}
private static void ApplyHorseConfig(object sender, EventArgs e)
{
if ((Object)(object)raeHorse?.Prefab != (Object)null)
{
Humanoid component = raeHorse.Prefab.GetComponent<Humanoid>();
if ((Object)(object)component != (Object)null)
{
((Character)component).m_runSpeed = HorseRunningSpeed.Value;
((Character)component).m_walkSpeed = HorseWalkingSpeed.Value;
((Character)component).m_speed = HorseSpeed.Value;
((Character)component).m_turnSpeed = HorseTurnSpeed.Value;
((Character)component).m_runTurnSpeed = HorseRunningTurnSpeed.Value;
((Character)component).m_health = HorseHealth.Value;
}
Sadle componentInChildren = raeHorse.Prefab.GetComponentInChildren<Sadle>(true);
if ((Object)(object)componentInChildren != (Object)null)
{
componentInChildren.m_maxStamina = HorseStamina.Value;
componentInChildren.m_staminaRegen = HorseStaminaRegen.Value;
componentInChildren.m_staminaRegenHungry = HorseStaminaRegenHungry.Value;
}
Procreation componentInChildren2 = raeHorse.Prefab.GetComponentInChildren<Procreation>(true);
if ((Object)(object)componentInChildren2 != (Object)null)
{
componentInChildren2.m_updateInterval = HorseProcreationUpdateInterval.Value;
componentInChildren2.m_totalCheckRange = HorseProcreationTotalCheckRange.Value;
componentInChildren2.m_maxCreatures = HorseProcreationMaxCreatures.Value;
componentInChildren2.m_partnerCheckRange = HorseProcreationPartnerCheckRange.Value;
componentInChildren2.m_pregnancyChance = HorseProcreationPregnancyChance.Value;
componentInChildren2.m_pregnancyDuration = HorseProcreationPregnancyDuration.Value;
componentInChildren2.m_requiredLovePoints = HorseProcreationRequiredLovePoints.Value;
}
}
foreach (Character s_character in Character.s_characters)
{
if (((Object)((Component)s_character).gameObject).name.Contains("rae_OdinHorse"))
{
Humanoid component2 = ((Component)s_character).GetComponent<Humanoid>();
if ((Object)(object)component2 != (Object)null)
{
((Character)component2).m_runSpeed = HorseRunningSpeed.Value;
((Character)component2).m_walkSpeed = HorseWalkingSpeed.Value;
((Character)component2).m_speed = HorseSpeed.Value;
((Character)component2).m_turnSpeed = HorseTurnSpeed.Value;
((Character)component2).m_runTurnSpeed = HorseRunningTurnSpeed.Value;
}
Sadle componentInChildren3 = ((Component)s_character).GetComponentInChildren<Sadle>(true);
if ((Object)(object)componentInChildren3 != (Object)null)
{
componentInChildren3.m_maxStamina = HorseStamina.Value;
componentInChildren3.m_staminaRegen = HorseStaminaRegen.Value;
componentInChildren3.m_staminaRegenHungry = HorseStaminaRegenHungry.Value;
}
Procreation componentInChildren4 = ((Component)s_character).GetComponentInChildren<Procreation>(true);
if ((Object)(object)componentInChildren4 != (Object)null)
{
componentInChildren4.m_updateInterval = HorseProcreationUpdateInterval.Value;
componentInChildren4.m_totalCheckRange = HorseProcreationTotalCheckRange.Value;
componentInChildren4.m_maxCreatures = HorseProcreationMaxCreatures.Value;
componentInChildren4.m_partnerCheckRange = HorseProcreationPartnerCheckRange.Value;
componentInChildren4.m_pregnancyChance = HorseProcreationPregnancyChance.Value;
componentInChildren4.m_pregnancyDuration = HorseProcreationPregnancyDuration.Value;
componentInChildren4.m_requiredLovePoints = HorseProcreationRequiredLovePoints.Value;
}
}
}
}
static OdinHorse()
{
string configPath = Paths.ConfigPath;
char directorySeparatorChar = Path.DirectorySeparatorChar;
ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName;
}
}
public static class KeyboardExtensions
{
public static bool IsKeyDown(this KeyboardShortcut shortcut)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
return (int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKeyDown(((KeyboardShortcut)(ref shortcut)).MainKey) && ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey);
}
public static bool IsKeyHeld(this KeyboardShortcut shortcut)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
return (int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKey(((KeyboardShortcut)(ref shortcut)).MainKey) && ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey);
}
}
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
public static class TameableExtensions
{
public static ItemDrop m_armorItem = null;
public static readonly int s_haveArmorHash = StringExtensionMethods.GetStableHashCode("HaveArmor");
public static readonly int s_isWaitingHash = StringExtensionMethods.GetStableHashCode("IsWaiting");
public static ItemDrop GetArmorItem(this Tameable tameable)
{
return m_armorItem;
}
public static bool IsWaiting(this Tameable tameable)
{
return tameable.m_nview.IsValid() && tameable.m_nview.GetZDO().GetBool(s_isWaitingHash, false);
}
public static void RPC_ToggleWait(this Tameable tameable, long sender)
{
if (tameable.m_nview.IsOwner())
{
bool flag = !tameable.IsWaiting();
tameable.m_nview.GetZDO().Set(s_isWaitingHash, flag);
tameable.m_nview.InvokeRPC(ZNetView.Everybody, "SetWait", new object[1] { flag });
}
}
public static void RPC_SetWait(this Tameable tameable, long sender, bool enabled)
{
tameable.SetWaitAnimation(enabled);
}
public static void SetWaitAnimation(this Tameable tameable, bool enabled)
{
MonsterAI component = ((Component)tameable).GetComponent<MonsterAI>();
if ((Object)(object)component != (Object)null && (Object)(object)((BaseAI)component).m_animator != (Object)null)
{
((BaseAI)component).m_animator.SetBool("isWaiting", enabled);
}
}
public static void RPC_AddArmor(this Tameable tameable, long sender)
{
if (tameable.m_nview.IsOwner() && !tameable.HaveArmor())
{
float num = tameable.m_character.GetHealth() / tameable.m_character.GetMaxHealth();
tameable.m_character.SetMaxHealth(tameable.m_character.GetMaxHealth() + 200f);
tameable.m_character.SetHealth(tameable.m_character.GetMaxHealth() * num);
tameable.m_nview.GetZDO().Set(s_haveArmorHash, true);
tameable.m_nview.InvokeRPC(ZNetView.Everybody, "SetArmor", new object[1] { true });
}
}
public static void RPC_SetArmor(this Tameable tameable, long sender, bool enabled)
{
tameable.SetArmor(enabled);
}
public static void RPC_RemoveArmor(this Tameable tameable, long sender, Vector3 userPoint)
{
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
if (tameable.m_nview.IsOwner())
{
Character character = tameable.m_character;
float num = character.GetHealth() / character.GetMaxHealth();
character.SetMaxHealth(character.GetMaxHealth() - 200f);
character.SetHealth(character.GetMaxHealth() * num);
tameable.DropArmor(userPoint);
}
}
public static void SetArmor(this Tameable tameable, bool enabled)
{
ZLog.Log((object)("Setting armor:" + enabled));
if (!((Object)(object)tameable.GetArmorItem() == (Object)null))
{
SetArmorObjectsOn(tameable, enabled);
}
}
public static void SetArmorObjectsOn(Tameable tameable, bool enabled)
{
((Component)Utils.FindChild(((Component)tameable).transform, "Horse_mask", (IterativeSearchType)0)).gameObject.SetActive(enabled);
((Component)Utils.FindChild(((Component)tameable).transform, "horse_armor", (IterativeSearchType)0)).gameObject.SetActive(enabled);
}
public static bool HaveArmor(this Tameable tameable)
{
return tameable.m_nview.IsValid() && tameable.m_nview.GetZDO().GetBool(s_haveArmorHash, false);
}
public static bool DropArmor(this Tameable tameable, Vector3 userPoint)
{
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
if (!tameable.HaveArmor())
{
return false;
}
tameable.m_nview.GetZDO().Set(s_haveArmorHash, false);
tameable.m_nview.InvokeRPC(ZNetView.Everybody, "SetArmor", new object[1] { false });
tameable.SpawnArmor(userPoint - ((Component)tameable).transform.position);
return true;
}
public static void SpawnArmor(this Tameable tameable, Vector3 flyDirection)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
Rigidbody component = Object.Instantiate<GameObject>(((Component)m_armorItem).gameObject, ((Component)tameable).transform.TransformPoint(tameable.m_dropSaddleOffset), Quaternion.identity).GetComponent<Rigidbody>();
if (Object.op_Implicit((Object)(object)component))
{
Vector3 val = Vector3.up;
if ((double)((Vector3)(ref flyDirection)).magnitude > 0.10000000149011612)
{
flyDirection.y = 0f;
((Vector3)(ref flyDirection)).Normalize();
val += flyDirection;
}
component.AddForce(val * tameable.m_dropItemVel, (ForceMode)2);
}
}
public static void OnHorseDeath(this Tameable tameable)
{
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
ZLog.Log((object)("Valid " + tameable.m_nview.IsValid()));
ZLog.Log((object)("On death " + tameable.HaveArmor()));
if (tameable.HaveArmor() && tameable.m_dropSaddleOnDeath)
{
ZLog.Log((object)"Spawning armor ");
tameable.SpawnArmor(Vector3.zero);
}
if (tameable.m_nview.IsValid() && tameable.m_nview.IsOwner())
{
HorseSaddlebags.DropAll(tameable.m_nview, ((Component)tameable).transform.position);
}
}
}
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
public class CoroutineRunner : MonoBehaviour
{
private static CoroutineRunner s_instance;
public static void Run(IEnumerator routine)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Expected O, but got Unknown
if ((Object)(object)s_instance == (Object)null)
{
GameObject val = new GameObject("OdinHorse_CoroutineRunner");
Object.DontDestroyOnLoad((Object)(object)val);
s_instance = val.AddComponent<CoroutineRunner>();
}
((MonoBehaviour)s_instance).StartCoroutine(routine);
}
}
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
public static class HorseSaddlebags
{
[CompilerGenerated]
private sealed class <SpawnItemsOverTime>d__6 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
private object <>2__current;
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(new byte[] { 0, 1 })]
public List<ItemData> items;
public Vector3 position;
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
public ZNetView nview;
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(new byte[] { 0, 1 })]
private List<ItemData>.Enumerator <>s__1;
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
private ItemData <item>5__2;
private Vector3 <scatter>5__3;
private Quaternion <rot>5__4;
object IEnumerator<object>.Current
{
[DebuggerHidden]
[return: <2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
[return: <2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <SpawnItemsOverTime>d__6(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
int num = <>1__state;
if (num == -3 || num == 1)
{
try
{
}
finally
{
<>m__Finally1();
}
}
<>s__1 = default(List<ItemData>.Enumerator);
<item>5__2 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
try
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>s__1 = items.GetEnumerator();
<>1__state = -3;
break;
case 1:
<>1__state = -3;
<item>5__2 = null;
break;
}
if (<>s__1.MoveNext())
{
<item>5__2 = <>s__1.Current;
<scatter>5__3 = position + Vector3.up * 0.5f + Random.insideUnitSphere * 0.4f;
<rot>5__4 = Quaternion.Euler(0f, (float)Random.Range(0, 360), 0f);
ItemDrop.DropItem(<item>5__2, 0, <scatter>5__3, <rot>5__4);
<>2__current = null;
<>1__state = 1;
return true;
}
<>m__Finally1();
<>s__1 = default(List<ItemData>.Enumerator);
if (nview.IsValid())
{
nview.GetZDO().Set(s_saddleBagsHash, "");
s_containerCache.Remove(nview.GetZDO().m_uid);
}
return false;
}
catch
{
//try-fault
((IDisposable)this).Dispose();
throw;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
private void <>m__Finally1()
{
<>1__state = -1;
((IDisposable)<>s__1).Dispose();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private static readonly int s_saddleBagsHash = StringExtensionMethods.GetStableHashCode("rae_saddlebags");
private static readonly Dictionary<ZDOID, Container> s_containerCache = new Dictionary<ZDOID, Container>();
private static readonly FieldInfo f_inventory = typeof(Container).GetField("m_inventory", BindingFlags.Instance | BindingFlags.NonPublic);
public static void Open(Tameable tameable)
{
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c8: Expected O, but got Unknown
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_011a: Expected O, but got Unknown
//IL_0179: Unknown result type (might be due to invalid IL or missing references)
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
//IL_010d: Expected O, but got Unknown
//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
if (!tameable.m_nview.IsValid())
{
return;
}
ZNetView nview = tameable.m_nview;
ZDOID uid = nview.GetZDO().m_uid;
if (s_containerCache.TryGetValue(uid, out var value) && (Object)(object)value == (Object)null)
{
s_containerCache.Remove(uid);
}
if (!s_containerCache.TryGetValue(uid, out var value2) || (Object)(object)value2 == (Object)null)
{
int value3 = OdinHorse.SaddleBagsWidth.Value;
int value4 = OdinHorse.SaddleBagsHeight.Value;
Inventory inv = new Inventory("Saddlebags", (Sprite)null, value3, value4);
string @string = nview.GetZDO().GetString(s_saddleBagsHash, "");
if (!string.IsNullOrEmpty(@string))
{
inv.Load(new ZPackage(@string));
}
GameObject val = new GameObject("SaddlebagContainer");
val.SetActive(false);
val.transform.SetParent(((Component)nview).transform, false);
value2 = val.AddComponent<Container>();
value2.m_rootObjectOverride = nview;
value2.m_name = "Saddlebags";
value2.m_width = value3;
value2.m_height = value4;
value2.m_privacy = (PrivacySetting)2;
value2.m_checkGuardStone = false;
value2.m_autoDestroyEmpty = false;
val.SetActive(true);
f_inventory?.SetValue(value2, inv);
Inventory obj = inv;
obj.m_onChanged = (Action)Delegate.Combine(obj.m_onChanged, (Action)delegate
{
Save(nview, inv);
});
s_containerCache[uid] = value2;
}
nview.ClaimOwnership();
InventoryGui.instance.Show(value2, 1);
}
public static void Save(ZNetView nview, Inventory inv)
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Expected O, but got Unknown
if (nview.IsValid() && nview.IsOwner())
{
ZPackage val = new ZPackage();
inv.Save(val);
nview.GetZDO().Set(s_saddleBagsHash, val.GetBase64());
}
}
public static void DropAll(ZNetView nview, Vector3 position)
{
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Expected O, but got Unknown
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Expected O, but got Unknown
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
if (!nview.IsValid() || !nview.IsOwner())
{
return;
}
string @string = nview.GetZDO().GetString(s_saddleBagsHash, "");
if (!string.IsNullOrEmpty(@string))
{
Inventory val = new Inventory("Saddlebags", (Sprite)null, 8, 4);
val.Load(new ZPackage(@string));
List<ItemData> allItems = val.GetAllItems();
if (allItems.Count != 0)
{
CoroutineRunner.Run(SpawnItemsOverTime(allItems, position, nview));
}
}
}
[IteratorStateMachine(typeof(<SpawnItemsOverTime>d__6))]
private static IEnumerator SpawnItemsOverTime(List<ItemData> items, Vector3 position, ZNetView nview)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <SpawnItemsOverTime>d__6(0)
{
items = items,
position = position,
nview = nview
};
}
}
[HarmonyPatch(typeof(CookingStation))]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
public static class CookingStationPatch
{
private static bool ConversionAdded;
[HarmonyPatch("Awake")]
[HarmonyPostfix]
public static void Awake_Postfix(CookingStation __instance)
{
if ((Object)(object)__instance == (Object)null)
{
Debug.LogError((object)"CookingStation instance is null in Awake_Postfix.");
return;
}
if (__instance.m_conversion == null)
{
__instance.m_conversion = new List<ItemConversion>();
}
AddCustomConversion(__instance);
}
private static void AddCustomConversion(CookingStation station)
{
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Expected O, but got Unknown
try
{
if ((Object)(object)station == (Object)null || station.m_conversion == null)
{
Debug.LogError((object)"CookingStation or m_conversion is null during AddCustomConversion.");
}
else
{
if (station.m_conversion.Exists([<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)] (ItemConversion c) => ((Object)c.m_from).name == "rae_HorseMeat" && ((Object)c.m_to).name == "rae_CookedHorseMeat"))
{
return;
}
ItemConversion val = new ItemConversion
{
m_from = ObjectDB.instance.GetItemPrefab("rae_HorseMeat").GetComponent<ItemDrop>(),
m_to = ObjectDB.instance.GetItemPrefab("rae_CookedHorseMeat").GetComponent<ItemDrop>(),
m_cookTime = 25f
};
if ((Object)(object)val.m_from == (Object)null || (Object)(object)val.m_to == (Object)null)
{
Debug.LogError((object)"Could not find prefabs for 'rae_HorseMeat' or 'rae_CookedHorseMeat'.");
return;
}
station.m_conversion.Add(val);
if (!ConversionAdded)
{
Debug.Log((object)$"Added custom conversion: {((Object)val.m_from).name} -> {((Object)val.m_to).name} with cook time {val.m_cookTime}s.");
ConversionAdded = true;
}
}
}
catch (Exception arg)
{
Debug.LogError((object)$"Exception in AddCustomConversion: {arg}");
}
}
}
}
namespace CreatureManager
{
public enum Toggle
{
On,
Off
}
[PublicAPI]
public enum GlobalKey
{
[InternalName("")]
None,
[InternalName("defeated_bonemass")]
KilledBonemass,
[InternalName("defeated_gdking")]
KilledElder,
[InternalName("defeated_goblinking")]
KilledYagluth,
[InternalName("defeated_dragon")]
KilledModer,
[InternalName("defeated_eikthyr")]
KilledEikthyr,
[InternalName("KilledTroll")]
KilledTroll,
[InternalName("killed_surtling")]
KilledSurtling
}
[PublicAPI]
[Flags]
public enum Weather
{
[InternalName("")]
None = 0,
[InternalName("Clear")]
ClearSkies = 1,
[InternalName("Heath clear")]
MeadowsClearSkies = 4,
[InternalName("LightRain")]
LightRain = 8,
[InternalName("Rain")]
Rain = 0x10,
[InternalName("ThunderStorm")]
ThunderStorm = 0x20,
[InternalName("nofogts")]
ClearThunderStorm = 0x40,
[InternalName("SwampRain")]
SwampRain = 0x80,
[InternalName("Darklands_dark")]
MistlandsDark = 0x100,
[InternalName("Ashrain")]
AshlandsAshrain = 0x200,
[InternalName("Snow")]
MountainSnow = 0x400,
[InternalName("SnowStorm")]
MountainBlizzard = 0x800,
[InternalName("DeepForest Mist")]
BlackForestFog = 0x1000,
[InternalName("Misty")]
Fog = 0x2000,
[InternalName("Twilight_Snow")]
DeepNorthSnow = 0x4000,
[InternalName("Twilight_SnowStorm")]
DeepNorthSnowStorm = 0x8000,
[InternalName("Twilight_Clear")]
DeepNorthClear = 0x10000,
[InternalName("Eikthyr")]
EikthyrsThunderstorm = 0x20000,
[InternalName("GDKing")]
EldersHaze = 0x40000,
[InternalName("Bonemass")]
BonemassDownpour = 0x80000,
[InternalName("Moder")]
ModersVortex = 0x100000,
[InternalName("GoblinKing")]
YagluthsMagicBlizzard = 0x200000,
[InternalName("Crypt")]
Crypt = 0x400000,
[InternalName("SunkenCrypt")]
SunkenCrypt = 0x800000
}
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
public class InternalName : Attribute
{
public readonly string internalName;
public InternalName(string internalName)
{
this.internalName = internalName;
}
}
public enum DropOption
{
Disabled,
Default,
Custom
}
public enum SpawnOption
{
Disabled,
Default,
Custom
}
public enum SpawnTime
{
Day,
Night,
Always
}
public enum SpawnArea
{
Center,
Edge,
Everywhere
}
public enum Forest
{
Yes,
No,
Both
}
[PublicAPI]
public struct Range
{
public float min;
public float max;
public Range(float min, float max)
{
this.min = min;
this.max = max;
}
}
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
[PublicAPI]
[<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(1)]
public class Creature
{
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
[PublicAPI]
public class DropList
{
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(0)]
internal class SerializedDrops
{
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(new byte[] { 1, 0, 1, 1 })]
public readonly List<KeyValuePair<string, Drop>> Drops;
public SerializedDrops(DropList drops, Creature creature)
{
Drops = (drops.drops ?? creature.Prefab.GetComponent<CharacterDrop>()?.m_drops.ToDictionary([<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)] (Drop drop) => ((Object)drop.m_prefab).name, [<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)] (Drop drop) => new Drop
{
Amount = new Range(drop.m_amountMin, drop.m_amountMax),
DropChance = drop.m_chance,
DropOnePerPlayer = drop.m_onePerPlayer,
MultiplyDropByLevel = drop.m_levelMultiplier
}) ?? new Dictionary<string, Drop>()).ToList();
}
public SerializedDrops([<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(new byte[] { 1, 0, 1, 1 })] List<KeyValuePair<string, Drop>> drops)
{
Drops = drops;
}
public SerializedDrops(string reqs)
{
Drops = (from r in reqs.Split(new char[1] { ',' })
select r.Split(new char[1] { ':' })).ToDictionary([<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)] (string[] l) => l[0], [<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)] (string[] parts) =>
{
Range amount = new Range(1f, 1f);
if (parts.Length > 1)
{
string[] array = parts[1].Split(new char[1] { '-' });
if (!int.TryParse(array[0], out var result))
{
result = 1;
}
if (array.Length == 1 || !int.TryParse(array[0], out var result2))
{
result2 = result;
}
amount = new Range(result, result2);
}
float result3;
return new Drop
{
Amount = amount,
DropChance = ((parts.Length > 2 && float.TryParse(parts[2], out result3)) ? result3 : 100f),
DropOnePerPlayer = (parts.Length > 3 && parts[3] == "onePerPlayer"),
MultiplyDropByLevel = (parts.Length > 4 && parts[4] == "multiplyByLevel")
};
}).ToList();
}
public override string ToString()
{
return string.Join(",", Drops.Select([<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)] (KeyValuePair<string, Drop> kv) => string.Format("{0}:{1}-{2}:{3}:{4}:{5}", kv.Key, kv.Value.Amount.min, kv.Value.Amount.max, kv.Value.DropChance, kv.Value.DropOnePerPlayer ? "onePerPlayer" : "unrestricted", kv.Value.MultiplyDropByLevel ? "multiplyByLevel" : "unaffectedByLevel")));
}
}
[<2abb5b8f-7e7b-4743-a476-e224d1d5c2c5>Nullable(new byte[] { 2, 1, 1 })]
private Dictionary<string, Drop> drops = null;
public Drop this[string prefabName]
{
get
{
Drop result;
if (!(drops ?? (drops = new Dictionary<string, Drop>())).TryGetValue(prefabName, out var value))
{
Drop drop2 = (drops[prefabName] = new Drop());
result = drop2;
}
else
{
result = value;
}
return result;
}
}
public void None()
{
drops = new Dictionary<string, Drop>();
}
[HarmonyPriority(700)]
internal static void AddDropsToCreature()
{
foreach (Creature registeredCreature in registeredCreatures)
{
UpdateDrops(registeredCreature);
}
}
internal static void UpdateDrops(Creature creature)
{
DropOption dropOption = creatureConfigs[creature].Drops.get();
if (dropOption == DropOption.Default && creature.Drops.drops == null)
{
return;
}
CharacterDrop val = creature.Prefab.GetComponent<CharacterDrop>() ?? creature.Prefab.AddComponent<CharacterDrop>();
DropOption dropOption2 = creatureConfigs[creature].Drops.get();
if (1 == 0)
{
}
List<KeyValuePair<string, Drop>> source = dropOption2 switch
{
DropOption.Custom => new SerializedDrops(creatureConfigs[creature].CustomDrops.get()).Drops,
DropOption.Disabled => new List<KeyValuePair<string, Drop>>(),
_ => creature.Drops.drops.ToList(),
};
if (1 == 0)
{
}
val.m_drops = (from d in ((IEnumerable<KeyValuePair<string, Drop>>)source).Select((Func<KeyValuePair<string, Drop>, Drop>)([<4462215f-ae19-4a07-b420-c70ef12aa6d8>NullableContext(0)] (KeyValuePair<string, Drop> kv) =>
{
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: Expected O, but got Unknown
if (kv.Key == "" || ZNetScene.instance == null)
{
return null;
}
GameObject prefab = ZNetScene.instance.GetPrefab(kv.Key);
if (prefab == null)
{
Debug.LogWarning((object)("Found invalid prefab name " + kv.Key + " for creature " + ((Object)creature.Prefab).name));
return null;
}
return new Drop
{
m_prefab = prefab,
m_amountMin = (int)kv.Value.Amount.min,
m_amountMax = (int)kv.Value.Amount.max,
m_chance = kv.Value.DropChance / 100f,
m_onePerPlayer = kv.Value.DropOnePerPlayer,
m_levelMultiplier = kv.Value.MultiplyDropByLevel
};
}))