using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using HarmonyLib;
using Jotunn;
using Jotunn.Configs;
using Jotunn.Entities;
using Jotunn.Managers;
using Jotunn.Utils;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("JotunnModStub")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("JotunnModStub")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")]
[assembly: AssemblyFileVersion("1.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
namespace SpeedyCart;
[BepInPlugin("org.slesar.speedycart", "SpeedyCart", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
internal class SpeedyCart : BaseUnityPlugin
{
[HarmonyPatch(typeof(Vagon), "AttachTo")]
public class Vagon_AttachTo_Patch
{
private static void Postfix(Vagon __instance, GameObject go)
{
//IL_00b7: 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_00e3: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
Logger.LogInfo((object)go);
PlayerController component = go.GetComponent<PlayerController>();
if ((Object)(object)component == (Object)null)
{
Logger.LogWarning((object)"PlayerController not found on attached GameObject.");
return;
}
Character component2 = ((Component)component).GetComponent<Character>();
if ((Object)(object)component2 == (Object)null)
{
Logger.LogWarning((object)"Character not found on PlayerController.");
}
else if (!component2.m_seman.HaveStatusEffect(CartSpeeds[0].StatusEffect.m_nameHash))
{
component2.m_seman.AddStatusEffect(CartSpeeds[0].StatusEffect, false, 0, 0f);
__instance.m_breakForce = float.PositiveInfinity;
((Joint)__instance.m_attachJoin).breakTorque = float.PositiveInfinity;
__instance.m_detachDistance = 3f;
__instance.m_itemWeightMassFactor = 0f;
SoftJointLimit linearLimit = default(SoftJointLimit);
((SoftJointLimit)(ref linearLimit)).limit = 0.01f;
((SoftJointLimit)(ref linearLimit)).bounciness = 1f;
__instance.m_attachJoin.linearLimit = linearLimit;
SoftJointLimit angularZLimit = default(SoftJointLimit);
((SoftJointLimit)(ref angularZLimit)).limit = 5f;
((SoftJointLimit)(ref angularZLimit)).bounciness = 1f;
__instance.m_attachJoin.angularZLimit = angularZLimit;
}
}
}
[HarmonyPatch(typeof(Vagon), "CanAttach")]
public class Vagon_CanAttach_Patch
{
private static bool Prefix(Vagon __instance, GameObject go, ref bool __result)
{
if ((Object)(object)__instance.m_attachedObject != (Object)null && (Object)(object)__instance.m_attachedObject == (Object)(object)go)
{
__result = true;
return false;
}
return true;
}
}
[HarmonyPatch(typeof(Vagon), "Detach")]
public class Vagon_Detach_Patch
{
private static void Prefix(Vagon __instance)
{
if ((Object)(object)__instance.m_attachedObject == (Object)null)
{
return;
}
PlayerController component = __instance.m_attachedObject.GetComponent<PlayerController>();
if ((Object)(object)component == (Object)null)
{
Logger.LogWarning((object)"PlayerController not found on attached GameObject.");
return;
}
Character component2 = ((Component)component).GetComponent<Character>();
if ((Object)(object)component2 == (Object)null)
{
Logger.LogWarning((object)"Character not found on PlayerController.");
return;
}
CustomStatusEffect val = detectEffect(component2.m_seman);
if (val != null)
{
component2.m_seman.RemoveStatusEffect(val.StatusEffect.m_nameHash, false);
}
}
}
[HarmonyPatch(typeof(WearNTear), "Damage")]
public class Cart_Indestructible_Patch
{
private static bool Prefix(WearNTear __instance, ref HitData hit)
{
if ((Object)(object)((Component)__instance).gameObject.GetComponent<Vagon>() != (Object)null)
{
return false;
}
return true;
}
}
public class InfiniteStaminaCommand : ConsoleCommand
{
public override string Name => "nostamina";
public override string Help => "You don't need stamina, bro";
public override bool IsCheat => true;
public override void Run(string[] args)
{
if (!((Character)Player.m_localPlayer).m_seman.HaveStatusEffect(InfiniteStaminaEffect.StatusEffect.m_nameHash))
{
((Character)Player.m_localPlayer).m_seman.AddStatusEffect(InfiniteStaminaEffect.StatusEffect, false, 0, 0f);
}
else
{
((Character)Player.m_localPlayer).m_seman.RemoveStatusEffect(InfiniteStaminaEffect.StatusEffect.m_nameHash, false);
}
}
}
[HarmonyPatch(typeof(Player), "UseStamina")]
public static class Patch_UseStamina
{
public static bool Prefix(Player __instance, ref float v)
{
if (((Character)__instance).m_seman.HaveStatusEffect(InfiniteStaminaEffect.StatusEffect.m_nameHash))
{
v = 0f;
return false;
}
return true;
}
}
[HarmonyPatch(typeof(Piece), "Awake")]
public static class Patch_DestroyCart
{
private static void Postfix(Piece __instance)
{
if (Object.op_Implicit((Object)(object)((Component)__instance).GetComponentInChildren<Vagon>()))
{
__instance.m_canBeRemoved = true;
}
}
}
public const string PluginGUID = "org.slesar.speedycart";
public const string PluginName = "SpeedyCart";
public const string PluginVersion = "1.0.0";
private const int CartGears = 5;
private readonly Harmony HarmonyInstance = new Harmony("org.slesar.speedycart");
private AssetBundle EmbeddedResourceBunlde;
private Sprite SpeedIcon;
private Sprite StaminaIcon;
private static List<CustomStatusEffect> CartSpeeds = new List<CustomStatusEffect>();
private static CustomStatusEffect InfiniteStaminaEffect;
private ButtonConfig SwitchGearsButton;
private void Awake()
{
LoadAssets();
AddStatusEffects();
AddInputs();
CommandManager.Instance.AddConsoleCommand((ConsoleCommand)(object)new InfiniteStaminaCommand());
Assembly executingAssembly = Assembly.GetExecutingAssembly();
HarmonyInstance.PatchAll(executingAssembly);
}
private void LoadAssets()
{
EmbeddedResourceBunlde = AssetUtils.LoadAssetBundleFromResources("speedicon");
SpeedIcon = EmbeddedResourceBunlde.LoadAsset<Sprite>("SpeedIcon");
if ((Object)(object)SpeedIcon == (Object)null)
{
Logger.LogError((object)"Failed to load SpeedIcon from AssetBundle");
}
StaminaIcon = EmbeddedResourceBunlde.LoadAsset<Sprite>("StaminaIcon");
if ((Object)(object)StaminaIcon == (Object)null)
{
Logger.LogError((object)"Failed to load StaminaIcon from AssetBundle");
}
}
private void AddStatusEffects()
{
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Expected O, but got Unknown
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
//IL_010f: Unknown result type (might be due to invalid IL or missing references)
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
//IL_012a: Expected O, but got Unknown
for (int i = 0; i < 5; i++)
{
SE_Stats obj = ScriptableObject.CreateInstance<SE_Stats>();
((Object)obj).name = $"CartSpeedEffect{i}";
((StatusEffect)obj).m_name = $"Cart Speed {i}";
((StatusEffect)obj).m_tooltip = "Dragging a cart is really fast!";
((StatusEffect)obj).m_icon = SpeedIcon;
((StatusEffect)obj).m_startMessageType = (MessageType)2;
((StatusEffect)obj).m_startMessage = string.Concat("You are ", string.Concat(Enumerable.Repeat("really ", i)), "fast");
((StatusEffect)obj).m_stopMessageType = (MessageType)2;
((StatusEffect)obj).m_stopMessage = "You are slow :(";
obj.m_speedModifier = i;
((StatusEffect)obj).m_ttl = 0f;
CustomStatusEffect val = new CustomStatusEffect((StatusEffect)(object)obj, false);
CartSpeeds.Add(val);
ItemManager.Instance.AddStatusEffect(val);
}
StatusEffect obj2 = ScriptableObject.CreateInstance<StatusEffect>();
((Object)obj2).name = "InfiniteStaminaEffect";
obj2.m_name = "Infinite Stamina Effect";
obj2.m_tooltip = "You won't need stamina where we are going.";
obj2.m_icon = StaminaIcon;
obj2.m_startMessageType = (MessageType)2;
obj2.m_startMessage = "Stamina disabled";
obj2.m_stopMessageType = (MessageType)2;
obj2.m_stopMessage = "Stamina enabled";
InfiniteStaminaEffect = new CustomStatusEffect(obj2, false);
ItemManager.Instance.AddStatusEffect(InfiniteStaminaEffect);
}
private void AddInputs()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Expected O, but got Unknown
SwitchGearsButton = new ButtonConfig
{
Name = "SwitchGears",
Key = (KeyCode)103
};
InputManager.Instance.AddButton("org.slesar.speedycart", SwitchGearsButton);
}
private void Update()
{
if (ZInput.instance != null && ZInput.GetButtonDown(SwitchGearsButton.Name))
{
CustomStatusEffect val = detectEffect(((Character)Player.m_localPlayer).m_seman);
if (val != null)
{
int gearFromString = getGearFromString(((Object)val.StatusEffect).name);
((Character)Player.m_localPlayer).m_seman.RemoveStatusEffect(val.StatusEffect.m_nameHash, false);
((Character)Player.m_localPlayer).m_seman.AddStatusEffect(CartSpeeds[(gearFromString + 1) % 5].StatusEffect, false, 0, 0f);
}
}
}
private static CustomStatusEffect detectEffect(SEMan m_seman)
{
foreach (CustomStatusEffect cartSpeed in CartSpeeds)
{
if (((Character)Player.m_localPlayer).m_seman.HaveStatusEffect(cartSpeed.StatusEffect.m_nameHash))
{
return cartSpeed;
}
}
return null;
}
private static int getGearFromString(string name)
{
return int.Parse(Regex.Match(name, "(\\d+)$").Value);
}
}
public static class StringHashExtensions
{
public static int GetStableHashCode(this string str)
{
int num = 352654597;
int num2 = num;
for (int i = 0; i < str.Length; i += 2)
{
num = ((num << 5) + num) ^ str[i];
if (i == str.Length - 1)
{
break;
}
num2 = ((num2 << 5) + num2) ^ str[i + 1];
}
return num + num2 * 1566083941;
}
}