

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using Il2CppFishNet.Object;
using Il2CppInterop.Runtime.Injection;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppScheduleOne;
using Il2CppScheduleOne.Audio;
using Il2CppScheduleOne.Combat;
using Il2CppScheduleOne.DevUtilities;
using Il2CppScheduleOne.Effects;
using Il2CppScheduleOne.Equipping;
using Il2CppScheduleOne.FX;
using Il2CppScheduleOne.ItemFramework;
using Il2CppScheduleOne.NPCs;
using Il2CppScheduleOne.Noise;
using Il2CppScheduleOne.Persistence;
using Il2CppScheduleOne.PlayerScripts;
using Il2CppScheduleOne.Vision;
using Il2CppScheduleOne.Weather;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using MelonLoader;
using MelonLoader.Preferences;
using MelonLoader.Utils;
using Microsoft.CodeAnalysis;
using S1API.Items;
using S1API.Shops;
using S1MAPI.Gltf;
using S1MAPI.Utils;
using ThorHammer;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Rendering;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: MelonInfo(typeof(Core), "Mjolnir", "1.0.4", "hdlmrell", null)]
[assembly: MelonGame("TVGS", "Schedule I")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("ThorHammer.Il2Cpp")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.2.0")]
[assembly: AssemblyInformationalVersion("1.0.0+ea2da1c6208f6f22b4b7396e9dab0a1eb1fb605e")]
[assembly: AssemblyProduct("ThorHammer.Il2Cpp")]
[assembly: AssemblyTitle("ThorHammer.Il2Cpp")]
[assembly: NeutralResourcesLanguage("en-US")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.2.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace ThorHammer
{
public class Core : MelonMod
{
private bool _itemsRegistered;
private bool _loadHooked;
private static ItemDefinition _hammerDef;
private static Sprite _cachedIcon;
private static readonly string[] HardwareShopNames = new string[2] { "Handy Hank's Hardware", "Dan's Hardware" };
private static MelonPreferences_Entry<float> _priceEntry;
private static MelonPreferences_Entry<bool> _sellAtHardwareEntry;
private static bool _shopsPopulated;
public static KeyCode LightningKey { get; private set; } = (KeyCode)120;
public static float MeleeDamage { get; private set; } = 25f;
public static float MeleeForce { get; private set; } = 350f;
public static float ThrowDamage { get; private set; } = 100f;
public static float ThrowForce { get; private set; } = 600f;
public static float LightningDamage { get; private set; } = 80f;
public static float LightningForce { get; private set; } = 400f;
public static float LightningPanicRadius { get; private set; } = 25f;
public static float FlightSpeed { get; private set; } = 18f;
public static float ThrowSpeed { get; private set; } = 40f;
public static float MaxThrowRange { get; private set; } = 30f;
public static float WindUpDuration { get; private set; } = 1.2f;
public static bool StaminaEnabled { get; private set; } = true;
public static float SwingStaminaCost { get; private set; } = 15f;
public static float LightningStaminaCost { get; private set; } = 20f;
public static float WindUpStaminaRate { get; private set; } = 20f;
public static float FlightStaminaRate { get; private set; } = 15f;
private static string IconPath => Path.Combine(MelonEnvironment.UserDataDirectory, "S1API", "Icons", "ThorHammer.png");
public override void OnInitializeMelon()
{
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
ClassInjector.RegisterTypeInIl2Cpp<HammerEquippable>();
string text = BindEntry(MelonPreferences.CreateCategory("Mjolnir - Controls", "Mjolnir Controls"), "LightningKey", "X", "Lightning Key", "Key to summon lightning from the hammer (e.g. X, F, G, T)", delegate(string _, string v)
{
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
if (Enum.TryParse<KeyCode>(v, ignoreCase: true, out KeyCode result2))
{
LightningKey = result2;
}
else
{
((MelonBase)this).LoggerInstance.Warning($"Invalid lightning key '{v}', keeping {LightningKey}");
}
});
if (Enum.TryParse<KeyCode>(text, ignoreCase: true, out KeyCode result))
{
LightningKey = result;
}
else
{
((MelonBase)this).LoggerInstance.Warning("Invalid lightning key '" + text + "', defaulting to X");
}
MelonPreferences_Category obj = MelonPreferences.CreateCategory("Mjolnir - Shop", "Mjolnir Shop");
_priceEntry = obj.CreateEntry<float>("Price", 10000f, "Shop Price", "Price of Mjolnir at the Arms Dealer (in dollars)", false, false, (ValueValidator)null, (string)null);
((MelonEventBase<LemonAction<float, float>>)(object)_priceEntry.OnEntryValueChanged).Subscribe((LemonAction<float, float>)delegate(float _, float v)
{
OnPriceChanged(v);
}, 0, false);
_sellAtHardwareEntry = obj.CreateEntry<bool>("SellAtHardwareStores", false, "Sell at Hardware Stores", "Whether Mjolnir is also sold at hardware stores (Handy Hank's, Dan's)", false, false, (ValueValidator)null, (string)null);
((MelonEventBase<LemonAction<bool, bool>>)(object)_sellAtHardwareEntry.OnEntryValueChanged).Subscribe((LemonAction<bool, bool>)delegate(bool _, bool v)
{
OnHardwareShopToggled(v);
}, 0, false);
MelonPreferences_Category cat = MelonPreferences.CreateCategory("Mjolnir - Combat", "Mjolnir Combat");
MeleeDamage = BindEntry(cat, "MeleeDamage", 25f, "Melee Damage", "Damage dealt by a melee swing", delegate(float _, float v)
{
MeleeDamage = v;
});
MeleeForce = BindEntry(cat, "MeleeForce", 350f, "Melee Force", "Impact force of a melee swing", delegate(float _, float v)
{
MeleeForce = v;
});
ThrowDamage = BindEntry(cat, "ThrowDamage", 100f, "Throw Damage", "Damage dealt when the thrown hammer hits", delegate(float _, float v)
{
ThrowDamage = v;
});
ThrowForce = BindEntry(cat, "ThrowForce", 600f, "Throw Force", "Impact force of the thrown hammer", delegate(float _, float v)
{
ThrowForce = v;
});
LightningDamage = BindEntry(cat, "LightningDamage", 80f, "Lightning Damage", "Damage dealt by a lightning zap", delegate(float _, float v)
{
LightningDamage = v;
});
LightningForce = BindEntry(cat, "LightningForce", 400f, "Lightning Force", "Impact force of a lightning zap", delegate(float _, float v)
{
LightningForce = v;
});
LightningPanicRadius = BindEntry(cat, "LightningPanicRadius", 25f, "Lightning Panic Radius", "Radius around lightning strikes that causes nearby NPCs to panic (0 to disable)", delegate(float _, float v)
{
LightningPanicRadius = v;
});
MelonPreferences_Category cat2 = MelonPreferences.CreateCategory("Mjolnir - Mechanics", "Mjolnir Mechanics");
FlightSpeed = BindEntry(cat2, "FlightSpeed", 18f, "Flight Speed", "How fast you fly while holding Space during a charged wind-up", delegate(float _, float v)
{
FlightSpeed = v;
});
ThrowSpeed = BindEntry(cat2, "ThrowSpeed", 40f, "Throw Speed", "How fast the thrown hammer travels", delegate(float _, float v)
{
ThrowSpeed = v;
});
MaxThrowRange = BindEntry(cat2, "MaxThrowRange", 30f, "Max Throw Range", "Maximum distance the hammer can travel before returning", delegate(float _, float v)
{
MaxThrowRange = v;
});
WindUpDuration = Math.Max(0.1f, BindEntry(cat2, "WindUpDuration", 1.2f, "Wind-Up Duration", "Seconds to fully charge the hammer spin (minimum 0.1)", delegate(float _, float v)
{
WindUpDuration = Math.Max(0.1f, v);
}));
MelonPreferences_Category cat3 = MelonPreferences.CreateCategory("Mjolnir - Stamina", "Mjolnir Stamina");
StaminaEnabled = BindEntry(cat3, "StaminaEnabled", defaultValue: true, "Stamina Enabled", "Whether hammer actions consume stamina", delegate(bool _, bool v)
{
StaminaEnabled = v;
});
SwingStaminaCost = BindEntry(cat3, "SwingStaminaCost", 15f, "Swing Stamina Cost", "Stamina consumed per melee swing", delegate(float _, float v)
{
SwingStaminaCost = v;
});
LightningStaminaCost = BindEntry(cat3, "LightningStaminaCost", 20f, "Lightning Stamina Cost", "Stamina consumed per lightning zap", delegate(float _, float v)
{
LightningStaminaCost = v;
});
WindUpStaminaRate = BindEntry(cat3, "WindUpStaminaRate", 20f, "Wind-Up Stamina Rate", "Stamina consumed per second while winding up", delegate(float _, float v)
{
WindUpStaminaRate = v;
});
FlightStaminaRate = BindEntry(cat3, "FlightStaminaRate", 15f, "Flight Stamina Rate", "Stamina consumed per second while flying", delegate(float _, float v)
{
FlightStaminaRate = v;
});
((MelonBase)this).LoggerInstance.Msg("Initialized.");
}
public override void OnSceneWasInitialized(int buildIndex, string sceneName)
{
if (sceneName == "Main" && !_itemsRegistered)
{
_itemsRegistered = true;
RegisterItems();
}
if (sceneName == "Main" && !_loadHooked)
{
LoadManager instance = Singleton<LoadManager>.Instance;
if ((Object)(object)instance != (Object)null)
{
instance.onLoadComplete.AddListener(UnityAction.op_Implicit((Action)OnGameLoaded));
_loadHooked = true;
}
}
}
public override void OnSceneWasUnloaded(int buildIndex, string sceneName)
{
if (sceneName == "Main")
{
_loadHooked = false;
}
}
private void RegisterItems()
{
Equippable val = ItemCreator.CreateEquippableBuilder().CreateEquippable<HammerEquippable>("ThorHammerEquippable").WithInteraction(true, true)
.Build();
_hammerDef = (ItemDefinition)(object)ItemCreator.CreateBuilder().WithBasicInfo("thor_hammer", "Mjolnir", "Mjolnir. Whosoever holds this hammer, if they be worthy, shall possess the power of Thor.", (ItemCategory)3).WithStackLimit(1)
.WithPricing(_priceEntry.Value, 0.5f)
.WithLegalStatus((LegalStatus)0)
.WithEquippable(val)
.Build();
RenderHammerIcon();
((MelonBase)this).LoggerInstance.Msg("Mjolnir registered.");
}
private void RenderHammerIcon()
{
//IL_0420: Unknown result type (might be due to invalid IL or missing references)
//IL_042f: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Expected O, but got Unknown
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Expected O, but got Unknown
//IL_010b: 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_007c: Unknown result type (might be due to invalid IL or missing references)
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
//IL_0200: Unknown result type (might be due to invalid IL or missing references)
//IL_0228: Unknown result type (might be due to invalid IL or missing references)
//IL_0237: Unknown result type (might be due to invalid IL or missing references)
//IL_023c: Unknown result type (might be due to invalid IL or missing references)
//IL_024e: Unknown result type (might be due to invalid IL or missing references)
//IL_026b: Unknown result type (might be due to invalid IL or missing references)
//IL_0293: Unknown result type (might be due to invalid IL or missing references)
//IL_02a2: Unknown result type (might be due to invalid IL or missing references)
//IL_02a7: Unknown result type (might be due to invalid IL or missing references)
//IL_02f2: Unknown result type (might be due to invalid IL or missing references)
//IL_030a: Unknown result type (might be due to invalid IL or missing references)
//IL_0316: Unknown result type (might be due to invalid IL or missing references)
//IL_032a: Unknown result type (might be due to invalid IL or missing references)
//IL_032f: Unknown result type (might be due to invalid IL or missing references)
//IL_0344: Unknown result type (might be due to invalid IL or missing references)
//IL_035b: Unknown result type (might be due to invalid IL or missing references)
//IL_0361: Expected O, but got Unknown
//IL_0387: Unknown result type (might be due to invalid IL or missing references)
//IL_038e: Expected O, but got Unknown
//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)_cachedIcon != (Object)null)
{
_hammerDef.Icon = _cachedIcon;
return;
}
string iconPath = IconPath;
if (File.Exists(iconPath))
{
try
{
byte[] array = File.ReadAllBytes(iconPath);
Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false);
if (ImageConversion.LoadImage(val, Il2CppStructArray<byte>.op_Implicit(array)))
{
_cachedIcon = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), 100f);
((Object)_cachedIcon).name = "ThorHammerIcon";
_hammerDef.Icon = _cachedIcon;
((MelonBase)this).LoggerInstance.Msg("Loaded hammer icon from cache.");
return;
}
}
catch (Exception ex)
{
((MelonBase)this).LoggerInstance.Warning("Failed to load cached icon, re-rendering: " + ex.Message);
}
}
GameObject val2 = null;
Camera val3 = null;
RenderTexture val4 = null;
try
{
val2 = new GameObject("TH_IconStage");
val2.transform.position = new Vector3(0f, 5000f, 0f);
byte[] array2 = EmbeddedResourceLoader.LoadBytes("ThorHammer.Resources.ThorHammer.glb", Assembly.GetExecutingAssembly());
if (array2 == null)
{
((MelonBase)this).LoggerInstance.Warning("Cannot render icon: GLB resource not found");
return;
}
GameObject val5 = GltfLoader.LoadGlb(array2, (Shader)null);
if ((Object)(object)val5 == (Object)null)
{
((MelonBase)this).LoggerInstance.Warning("Cannot render icon: GLB load failed");
return;
}
val5.transform.SetParent(val2.transform, false);
val5.transform.localPosition = Vector3.zero;
val5.transform.localRotation = Quaternion.Euler(0f, 135f, -30f);
val5.transform.localScale = Vector3.one * 0.5f;
GameObject val6 = new GameObject("TH_IconLight");
val6.transform.SetParent(val2.transform, false);
Light obj = val6.AddComponent<Light>();
obj.type = (LightType)1;
obj.color = new Color(1f, 0.97f, 0.92f);
obj.intensity = 1.2f;
val6.transform.rotation = Quaternion.Euler(50f, -30f, 0f);
GameObject val7 = new GameObject("TH_IconFill");
val7.transform.SetParent(val2.transform, false);
Light obj2 = val7.AddComponent<Light>();
obj2.type = (LightType)1;
obj2.color = new Color(0.8f, 0.85f, 0.95f);
obj2.intensity = 0.5f;
val7.transform.rotation = Quaternion.Euler(30f, 150f, 0f);
GameObject val8 = new GameObject("TH_IconCamera");
val3 = val8.AddComponent<Camera>();
val3.orthographic = true;
val3.orthographicSize = 1.8f;
val3.nearClipPlane = 0.01f;
val3.farClipPlane = 10f;
val3.clearFlags = (CameraClearFlags)2;
val3.backgroundColor = new Color(0f, 0f, 0f, 0f);
val3.cullingMask = -1;
((Behaviour)val3).enabled = false;
val8.transform.position = val2.transform.position + new Vector3(-1.5f, 1.5f, 1.5f);
val8.transform.LookAt(val2.transform.position);
val4 = new RenderTexture(256, 256, 24, (RenderTextureFormat)0);
val4.Create();
val3.targetTexture = val4;
val3.Render();
RenderTexture.active = val4;
Texture2D val9 = new Texture2D(256, 256, (TextureFormat)4, false);
val9.ReadPixels(new Rect(0f, 0f, 256f, 256f), 0, 0);
val9.Apply();
RenderTexture.active = null;
try
{
string directoryName = Path.GetDirectoryName(iconPath);
if (!Directory.Exists(directoryName))
{
Directory.CreateDirectory(directoryName);
}
File.WriteAllBytes(iconPath, Il2CppArrayBase<byte>.op_Implicit((Il2CppArrayBase<byte>)(object)ImageConversion.EncodeToPNG(val9)));
}
catch (Exception ex2)
{
((MelonBase)this).LoggerInstance.Warning("Failed to save icon to disk: " + ex2.Message);
}
_cachedIcon = Sprite.Create(val9, new Rect(0f, 0f, 256f, 256f), new Vector2(0.5f, 0.5f), 100f);
((Object)_cachedIcon).name = "ThorHammerIcon";
_hammerDef.Icon = _cachedIcon;
((MelonBase)this).LoggerInstance.Msg("Rendered hammer icon.");
}
catch (Exception ex3)
{
((MelonBase)this).LoggerInstance.Error("RenderHammerIcon failed: " + ex3.Message + "\n" + ex3.StackTrace);
}
finally
{
if ((Object)(object)val3 != (Object)null)
{
Object.Destroy((Object)(object)((Component)val3).gameObject);
}
if ((Object)(object)val4 != (Object)null)
{
val4.Release();
Object.Destroy((Object)(object)val4);
}
if ((Object)(object)val2 != (Object)null)
{
Object.Destroy((Object)(object)val2);
}
}
}
private void OnGameLoaded()
{
if (!(_hammerDef == (ItemDefinition)null))
{
int num = ShopManager.AddToShops(_hammerDef, new string[1] { "Arms Dealer" });
if (_sellAtHardwareEntry.Value)
{
num += ShopManager.AddToShops(_hammerDef, HardwareShopNames);
}
_shopsPopulated = true;
((MelonBase)this).LoggerInstance.Msg($"Mjolnir added to {num} shop(s).");
}
}
private void OnPriceChanged(float newPrice)
{
if (_shopsPopulated && !(_hammerDef == (ItemDefinition)null))
{
ItemDefinition hammerDef = _hammerDef;
StorableItemDefinition val = (StorableItemDefinition)(object)((hammerDef is StorableItemDefinition) ? hammerDef : null);
if (val != null)
{
val.BasePurchasePrice = newPrice;
}
Shop[] array = ShopManager.FindShopsByItem("thor_hammer");
foreach (Shop obj in array)
{
obj.RemoveItem("thor_hammer");
obj.AddItem(_hammerDef, (float?)newPrice);
}
((MelonBase)this).LoggerInstance.Msg($"Mjolnir price updated to ${newPrice:N0}.");
}
}
private void OnHardwareShopToggled(bool enabled)
{
if (!_shopsPopulated || _hammerDef == (ItemDefinition)null)
{
return;
}
if (enabled)
{
int value = ShopManager.AddToShops(_hammerDef, HardwareShopNames);
((MelonBase)this).LoggerInstance.Msg($"Mjolnir added to {value} hardware shop(s).");
return;
}
string[] hardwareShopNames = HardwareShopNames;
for (int i = 0; i < hardwareShopNames.Length; i++)
{
Shop shopByName = ShopManager.GetShopByName(hardwareShopNames[i]);
if (shopByName != null && shopByName.HasItem("thor_hammer"))
{
shopByName.RemoveItem("thor_hammer");
}
}
((MelonBase)this).LoggerInstance.Msg("Mjolnir removed from hardware shops.");
}
private static T BindEntry<T>(MelonPreferences_Category cat, string id, T defaultValue, string displayName, string description, LemonAction<T, T> onChanged)
{
MelonPreferences_Entry<T> obj = cat.CreateEntry<T>(id, defaultValue, displayName, description, false, false, (ValueValidator)null, (string)null);
((MelonEventBase<LemonAction<T, T>>)(object)obj.OnEntryValueChanged).Subscribe(onChanged, 0, false);
return obj.Value;
}
}
public class HammerEquippable : Equippable_Viewmodel
{
private enum HammerState
{
Idle,
WindingUp,
FlyingOut,
FlyingBack,
Flying
}
private const float Range = 1.5f;
private const float HitRadius = 0.3f;
private const float SwingCooldown = 0.25f;
private const float SwingDuration = 0.15f;
private const float SwingAngle = 70f;
private const float HitTime = 0.06f;
private const float WindUpMaxSpinSpeed = 5400f;
private const float AimFOVReduction = 15f;
private const float AimZoomDuration = 0.2f;
private const float LightningAimRadius = 0.5f;
private const float FlightGracePeriod = 0.5f;
private const float ThrowHitRadius = 0.3f;
private const float ReturnSpeed = 45f;
private const float ReturnCatchDistance = 0.5f;
private const float SpinSpeed = 1440f;
private HammerState _state;
private float _cooldownRemaining;
private bool _isSwinging;
private float _swingElapsed;
private bool _hitChecked;
private GameObject _hammerModel;
private Quaternion _modelBaseRotation;
private float _windUpElapsed;
private bool _fovOverridden;
private bool _playerCharged;
private GameObject _projectile;
private Vector3 _throwDirection;
private float _throwDistance;
private float _savedGravityMultiplier = 1f;
private float _flightStartTime;
private AudioClip _thunderClip;
private bool _thunderClipSearched;
private static float LightningRange => Core.MaxThrowRange * 0.7f;
public HammerEquippable(IntPtr ptr)
: base(ptr)
{
}
public override void Equip(ItemInstance item)
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: 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)
//IL_0074: 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_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Invalid comparison between Unknown and I4
((Component)this).gameObject.SetActive(true);
((Equippable_Viewmodel)this).localPosition = new Vector3(0.35f, -0.3f, 0.5f);
((Equippable_Viewmodel)this).localEulerAngles = new Vector3(0f, 0f, 0f);
((Equippable_Viewmodel)this).localScale = Vector3.one;
LoadHammerModel();
((Equippable)this).itemInstance = item;
PlayerSingleton<PlayerInventory>.Instance.SetEquippable((Equippable)(object)this);
PlayerSingleton<PlayerInventory>.Instance.EquippedSlotChanged();
((Component)this).transform.localPosition = ((Equippable_Viewmodel)this).localPosition;
((Component)this).transform.localEulerAngles = ((Equippable_Viewmodel)this).localEulerAngles;
((Component)this).transform.localScale = ((Equippable_Viewmodel)this).localScale;
LayerUtility.SetLayerRecursively(((Component)this).gameObject, LayerMask.NameToLayer("Viewmodel"));
foreach (MeshRenderer componentsInChild in ((Component)this).gameObject.GetComponentsInChildren<MeshRenderer>(true))
{
if ((int)((Renderer)componentsInChild).shadowCastingMode == 3)
{
((Renderer)componentsInChild).enabled = false;
}
else
{
((Renderer)componentsInChild).shadowCastingMode = (ShadowCastingMode)0;
}
}
}
public override void Unequip()
{
if (_state == HammerState.Flying)
{
StopFlight();
}
if (_state == HammerState.WindingUp)
{
CancelWindUp();
}
CleanupThrow();
ClearPlayerCharged();
PlayerSingleton<PlayerInventory>.Instance.SetEquippable((Equippable)null);
PlayerSingleton<PlayerInventory>.Instance.EquippedSlotChanged();
Object.Destroy((Object)(object)((Component)this).gameObject);
}
private void LoadHammerModel()
{
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
byte[] array = EmbeddedResourceLoader.LoadBytes("ThorHammer.Resources.ThorHammer.glb", Assembly.GetExecutingAssembly());
if (array == null)
{
Melon<Core>.Logger.Error("Failed to load ThorHammer.glb from embedded resources");
return;
}
_hammerModel = GltfLoader.LoadGlb(array, (Shader)null);
if ((Object)(object)_hammerModel == (Object)null)
{
Melon<Core>.Logger.Error("GltfLoader.LoadGlb returned null");
return;
}
_hammerModel.transform.SetParent(((Component)this).transform, false);
_hammerModel.transform.localPosition = new Vector3(0.02f, -0.15f, 0.05f);
_hammerModel.transform.localRotation = Quaternion.Euler(0f, 90f, 0f);
_hammerModel.transform.localScale = Vector3.one * 0.08f;
_modelBaseRotation = _hammerModel.transform.localRotation;
}
public override void Update()
{
if (_cooldownRemaining > 0f)
{
_cooldownRemaining -= Time.deltaTime;
}
switch (_state)
{
case HammerState.Idle:
UpdateSwingAnimation();
UpdateIdle();
break;
case HammerState.WindingUp:
UpdateWindUp();
break;
case HammerState.FlyingOut:
UpdateFlyingOut();
break;
case HammerState.FlyingBack:
UpdateFlyingBack();
break;
case HammerState.Flying:
UpdateFlying();
break;
}
}
private void UpdateIdle()
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
bool flag = !GameInput.IsTyping && PlayerSingleton<PlayerCamera>.Instance.activeUIElementCount == 0;
if (flag && GameInput.GetButtonDown((ButtonCode)1))
{
StartWindUp();
return;
}
if (flag && Input.GetKeyDown(Core.LightningKey))
{
if (Core.StaminaEnabled && PlayerSingleton<PlayerMovement>.Instance.CurrentStaminaReserve < Core.LightningStaminaCost)
{
return;
}
if (Core.StaminaEnabled)
{
PlayerSingleton<PlayerMovement>.Instance.ChangeStamina(0f - Core.LightningStaminaCost, true);
}
TryLightningZap();
}
if (flag && !_isSwinging && _cooldownRemaining <= 0f && GameInput.GetButtonDown((ButtonCode)0) && (!Core.StaminaEnabled || !(PlayerSingleton<PlayerMovement>.Instance.CurrentStaminaReserve < Core.SwingStaminaCost)))
{
if (Core.StaminaEnabled)
{
PlayerSingleton<PlayerMovement>.Instance.ChangeStamina(0f - Core.SwingStaminaCost, true);
}
StartSwing();
}
}
private void StartSwing()
{
_isSwinging = true;
_swingElapsed = 0f;
_hitChecked = false;
_cooldownRemaining = 0.25f;
}
private void UpdateSwingAnimation()
{
//IL_0085: 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_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
if (!_isSwinging || (Object)(object)_hammerModel == (Object)null)
{
return;
}
_swingElapsed += Time.deltaTime;
float num = _swingElapsed / 0.15f;
if (num >= 1f)
{
_isSwinging = false;
_hammerModel.transform.localRotation = _modelBaseRotation;
return;
}
float num2 = Mathf.Sin(num * (float)Math.PI) * 70f;
_hammerModel.transform.localRotation = Quaternion.Euler(num2, 0f, 0f) * _modelBaseRotation;
if (!_hitChecked && _swingElapsed >= 0.06f)
{
_hitChecked = true;
ExecuteMeleeHit();
}
}
private void ExecuteMeleeHit()
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Expected O, but got Unknown
RaycastHit val = default(RaycastHit);
if (!PlayerSingleton<PlayerCamera>.Instance.LookRaycast(1.5f, ref val, NetworkSingleton<CombatManager>.Instance.MeleeLayerMask, true, 0.3f))
{
return;
}
IDamageable componentInParent = ((Component)((RaycastHit)(ref val)).collider).GetComponentInParent<IDamageable>();
if (componentInParent != null)
{
float meleeForce = Core.MeleeForce;
Impact val2 = new Impact(((RaycastHit)(ref val)).point, ((Component)PlayerSingleton<PlayerCamera>.Instance).transform.forward, meleeForce, Core.MeleeDamage, (EImpactType)1, ((NetworkBehaviour)Player.Local).NetworkObject, Random.Range(int.MinValue, int.MaxValue));
componentInParent.SendImpact(val2);
Singleton<FXManager>.Instance.CreateImpactFX(val2, componentInParent);
PlayerSingleton<PlayerCamera>.Instance.StartCameraShake(0.3f, 0.2f, true);
NPC componentInParent2 = ((Component)((RaycastHit)(ref val)).collider).GetComponentInParent<NPC>();
if ((Object)(object)componentInParent2 != (Object)null)
{
StrikeLightningOnNPC(componentInParent2);
((EntityVisibility)Player.Local.VisualState).ApplyState("melee_attack", (EVisualState)9, 2.5f);
}
}
}
private void StartWindUp()
{
_state = HammerState.WindingUp;
_windUpElapsed = 0f;
_isSwinging = false;
PlayerSingleton<PlayerMovement>.Instance.CanJump = false;
float num = Singleton<Settings>.Instance.CameraFOV - 15f;
PlayerSingleton<PlayerCamera>.Instance.OverrideFOV(num, 0.2f);
_fovOverridden = true;
}
private void UpdateWindUp()
{
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
_windUpElapsed += Time.deltaTime;
bool flag = _windUpElapsed >= Core.WindUpDuration;
if (Core.StaminaEnabled)
{
PlayerSingleton<PlayerMovement>.Instance.ChangeStamina((0f - Core.WindUpStaminaRate) * Time.deltaTime, true);
if (PlayerSingleton<PlayerMovement>.Instance.CurrentStaminaReserve <= 0f)
{
CancelWindUp();
return;
}
}
float num = Mathf.Clamp01(_windUpElapsed / Core.WindUpDuration);
float num2 = num * num * 5400f;
if ((Object)(object)_hammerModel != (Object)null)
{
_hammerModel.transform.Rotate(Vector3.forward, num2 * Time.deltaTime, (Space)1);
}
if (flag && !_playerCharged)
{
_playerCharged = true;
Electrifying.ApplyToAvatar(Player.Local.Avatar);
}
if (!GameInput.GetButton((ButtonCode)1))
{
if (flag)
{
StartThrow();
}
else
{
CancelWindUp();
}
}
else if (flag && GameInput.GetButton((ButtonCode)7))
{
StartFlight();
}
}
private void CancelWindUp()
{
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
_state = HammerState.Idle;
_windUpElapsed = 0f;
PlayerSingleton<PlayerMovement>.Instance.CanJump = true;
ClearPlayerCharged();
if (_fovOverridden)
{
PlayerSingleton<PlayerCamera>.Instance.StopFOVOverride(0.2f);
_fovOverridden = false;
}
if ((Object)(object)_hammerModel != (Object)null)
{
_hammerModel.transform.localRotation = _modelBaseRotation;
}
}
private void ClearPlayerCharged()
{
if (_playerCharged)
{
_playerCharged = false;
Electrifying.ClearFromAvatar(Player.Local.Avatar);
}
}
private void StartThrow()
{
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00dd: 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_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
PlayerSingleton<PlayerMovement>.Instance.CanJump = true;
ClearPlayerCharged();
if (_fovOverridden)
{
PlayerSingleton<PlayerCamera>.Instance.StopFOVOverride(0.2f);
_fovOverridden = false;
}
if (!((Object)(object)_hammerModel == (Object)null))
{
_hammerModel.transform.localRotation = _modelBaseRotation;
_hammerModel.SetActive(false);
_projectile = Object.Instantiate<GameObject>(_hammerModel);
_projectile.SetActive(true);
_projectile.transform.SetParent((Transform)null, false);
SetLayerRecursive(_projectile, 0);
Transform transform = ((Component)PlayerSingleton<PlayerCamera>.Instance).transform;
_projectile.transform.position = transform.position + transform.forward * 1f;
_projectile.transform.rotation = Quaternion.LookRotation(transform.forward) * Quaternion.Euler(0f, 90f, 0f);
_projectile.transform.localScale = Vector3.one * 0.08f;
_throwDirection = transform.forward;
_throwDistance = 0f;
_state = HammerState.FlyingOut;
}
}
private void UpdateFlyingOut()
{
//IL_003b: 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)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: 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_0082: 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_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00ab: 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)
if ((Object)(object)_projectile == (Object)null)
{
CatchHammer();
return;
}
float num = Core.ThrowSpeed * Time.deltaTime;
_throwDistance += num;
Transform transform = _projectile.transform;
transform.position += _throwDirection * num;
_projectile.transform.Rotate(Vector3.forward, 1440f * Time.deltaTime, (Space)1);
RaycastHit hit = default(RaycastHit);
if (Physics.SphereCast(_projectile.transform.position - _throwDirection * num, 0.3f, _throwDirection, ref hit, num, LayerMask.op_Implicit(NetworkSingleton<CombatManager>.Instance.MeleeLayerMask), (QueryTriggerInteraction)2))
{
ExecuteThrowHit(hit);
_state = HammerState.FlyingBack;
}
else if (_throwDistance >= Core.MaxThrowRange)
{
_state = HammerState.FlyingBack;
}
}
private void UpdateFlyingBack()
{
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: 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_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: 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_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_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)_projectile == (Object)null)
{
CatchHammer();
return;
}
Vector3 position = ((Component)PlayerSingleton<PlayerCamera>.Instance).transform.position;
Vector3 val = position - _projectile.transform.position;
Vector3 normalized = ((Vector3)(ref val)).normalized;
float num = 45f * Time.deltaTime;
Transform transform = _projectile.transform;
transform.position += normalized * num;
_projectile.transform.Rotate(Vector3.forward, 1440f * Time.deltaTime, (Space)1);
if (Vector3.Distance(_projectile.transform.position, position) < 0.5f)
{
CatchHammer();
}
}
private void ExecuteThrowHit(RaycastHit hit)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: 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)
//IL_0047: Expected O, but got Unknown
IDamageable componentInParent = ((Component)((RaycastHit)(ref hit)).collider).GetComponentInParent<IDamageable>();
if (componentInParent != null)
{
Impact val = new Impact(((RaycastHit)(ref hit)).point, _throwDirection, Core.ThrowForce, Core.ThrowDamage, (EImpactType)1, ((NetworkBehaviour)Player.Local).NetworkObject, Random.Range(int.MinValue, int.MaxValue));
componentInParent.SendImpact(val);
Singleton<FXManager>.Instance.CreateImpactFX(val, componentInParent);
}
NPC componentInParent2 = ((Component)((RaycastHit)(ref hit)).collider).GetComponentInParent<NPC>();
if ((Object)(object)componentInParent2 != (Object)null)
{
StrikeLightningOnNPC(componentInParent2);
((EntityVisibility)Player.Local.VisualState).ApplyState("melee_attack", (EVisualState)9, 2.5f);
}
PlayerSingleton<PlayerCamera>.Instance.StartCameraShake(0.5f, 0.3f, true);
}
private void CatchHammer()
{
if ((Object)(object)_projectile != (Object)null)
{
Object.Destroy((Object)(object)_projectile);
_projectile = null;
}
if ((Object)(object)_hammerModel != (Object)null)
{
_hammerModel.SetActive(true);
}
_state = HammerState.Idle;
}
private void CleanupThrow()
{
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)_projectile != (Object)null)
{
Object.Destroy((Object)(object)_projectile);
_projectile = null;
}
if (_fovOverridden)
{
PlayerSingleton<PlayerCamera>.Instance.StopFOVOverride(0f);
_fovOverridden = false;
}
if ((Object)(object)_hammerModel != (Object)null)
{
_hammerModel.SetActive(true);
_hammerModel.transform.localRotation = _modelBaseRotation;
}
_state = HammerState.Idle;
}
private void TryLightningZap()
{
//IL_0015: 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_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: 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_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Expected O, but got Unknown
PlayerCamera instance = PlayerSingleton<PlayerCamera>.Instance;
NPC val = null;
RaycastHit val2 = default(RaycastHit);
Vector3 position;
if (instance.LookRaycast(LightningRange, ref val2, NetworkSingleton<CombatManager>.Instance.MeleeLayerMask, true, 0.5f))
{
position = ((RaycastHit)(ref val2)).point;
val = ((Component)((RaycastHit)(ref val2)).collider).GetComponentInParent<NPC>();
if ((Object)(object)val != (Object)null)
{
IDamageable componentInParent = ((Component)((RaycastHit)(ref val2)).collider).GetComponentInParent<IDamageable>();
if (componentInParent != null)
{
Impact val3 = new Impact(((RaycastHit)(ref val2)).point, ((Component)instance).transform.forward, Core.LightningForce, Core.LightningDamage, (EImpactType)1, ((NetworkBehaviour)Player.Local).NetworkObject, Random.Range(int.MinValue, int.MaxValue));
componentInParent.SendImpact(val3);
}
Electrifying.ApplyToAvatar(val.Avatar);
}
}
else
{
position = ((Component)instance).transform.position + ((Component)instance).transform.forward * LightningRange;
}
LightningHelper.StrikeLightning(position);
if ((Object)(object)val != (Object)null)
{
MelonCoroutines.Start(LightningHelper.ClearElectrifyCoroutine(val));
}
PlayThunderSound(position);
EmitLightningNoise(position);
((EntityVisibility)Player.Local.VisualState).ApplyState("melee_attack", (EVisualState)9, 2.5f);
PlayerSingleton<PlayerCamera>.Instance.StartCameraShake(0.5f, 0.3f, true);
}
private void StrikeLightningOnNPC(NPC npc)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: 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)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
Vector3 position = ((Component)npc).transform.position;
LightningHelper.StrikeLightning(position);
MelonCoroutines.Start(LightningHelper.ClearElectrifyCoroutine(npc));
Electrifying.ApplyToAvatar(npc.Avatar);
PlayThunderSound(position);
EmitLightningNoise(position);
}
private static void EmitLightningNoise(Vector3 position)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
if (Core.LightningPanicRadius > 0f)
{
NoiseUtility.EmitNoise(position, (ENoiseType)2, Core.LightningPanicRadius, ((Component)Player.Local).gameObject);
}
}
private void PlayThunderSound(Vector3 position)
{
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
if (!_thunderClipSearched)
{
_thunderClipSearched = true;
ThunderController val = Object.FindObjectOfType<ThunderController>();
if ((Object)(object)val == (Object)null)
{
Il2CppArrayBase<ThunderController> val2 = Resources.FindObjectsOfTypeAll<ThunderController>();
if (val2.Length > 0)
{
val = val2[0];
}
}
if ((Object)(object)val != (Object)null)
{
try
{
RandomizedAudioSourceController lightningAudio = val._lightningAudio;
if ((Object)(object)lightningAudio != (Object)null && lightningAudio.Clips != null && ((Il2CppArrayBase<AudioClip>)(object)lightningAudio.Clips).Count > 0)
{
_thunderClip = ((Il2CppArrayBase<AudioClip>)(object)lightningAudio.Clips)[0];
}
}
catch
{
}
}
if ((Object)(object)_thunderClip == (Object)null)
{
try
{
foreach (AudioClip item in Resources.FindObjectsOfTypeAll<AudioClip>())
{
if (!((Object)(object)item == (Object)null))
{
string text = ((Object)item).name.ToLowerInvariant();
if (text.Contains("thunder") || text.Contains("lightning"))
{
_thunderClip = item;
break;
}
}
}
}
catch
{
}
}
if ((Object)(object)_thunderClip != (Object)null)
{
Melon<Core>.Logger.Msg("Thunder sound found: " + ((Object)_thunderClip).name);
}
else
{
Melon<Core>.Logger.Warning("No thunder/lightning AudioClip found in game assets");
}
}
if ((Object)(object)_thunderClip != (Object)null)
{
AudioSource.PlayClipAtPoint(_thunderClip, position, 1f);
}
}
private void StartFlight()
{
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
if (_fovOverridden)
{
PlayerSingleton<PlayerCamera>.Instance.StopFOVOverride(0.2f);
_fovOverridden = false;
}
_state = HammerState.Flying;
_flightStartTime = Time.time;
_savedGravityMultiplier = PlayerMovement.GravityMultiplier;
PlayerMovement.GravityMultiplier = 0f;
PlayerSingleton<PlayerMovement>.Instance.Controller.Move(Vector3.up * 0.5f);
if ((Object)(object)_hammerModel != (Object)null)
{
_hammerModel.transform.localRotation = Quaternion.Euler(90f, 0f, 0f);
}
}
private void UpdateFlying()
{
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: 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)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
Transform transform = ((Component)PlayerSingleton<PlayerCamera>.Instance).transform;
PlayerMovement instance = PlayerSingleton<PlayerMovement>.Instance;
if (Core.StaminaEnabled)
{
instance.ChangeStamina((0f - Core.FlightStaminaRate) * Time.deltaTime, true);
if (instance.CurrentStaminaReserve <= 0f)
{
StopFlight();
return;
}
}
instance.Controller.Move(transform.forward * Core.FlightSpeed * Time.deltaTime);
bool flag = Time.time - _flightStartTime > 0.5f;
if (!GameInput.GetButton((ButtonCode)7) || (flag && instance.IsGrounded))
{
StopFlight();
}
}
private void StopFlight()
{
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
_state = HammerState.Idle;
PlayerMovement.GravityMultiplier = _savedGravityMultiplier;
PlayerSingleton<PlayerMovement>.Instance.CanJump = true;
ClearPlayerCharged();
if ((Object)(object)_hammerModel != (Object)null)
{
_hammerModel.transform.localRotation = _modelBaseRotation;
}
}
private static void SetLayerRecursive(GameObject go, int layer)
{
go.layer = layer;
for (int i = 0; i < go.transform.childCount; i++)
{
SetLayerRecursive(((Component)go.transform.GetChild(i)).gameObject, layer);
}
}
}
internal static class LightningHelper
{
[CompilerGenerated]
private sealed class <ClearElectrifyCoroutine>d__2 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public NPC npc;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <ClearElectrifyCoroutine>d__2(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitForSeconds(4f);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
if ((Object)(object)npc != (Object)null && (Object)(object)npc.Avatar != (Object)null)
{
Electrifying.ClearFromAvatar(npc.Avatar);
}
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 VFXEffectHandler _lightningVFX;
private static bool _searched;
[IteratorStateMachine(typeof(<ClearElectrifyCoroutine>d__2))]
internal static IEnumerator ClearElectrifyCoroutine(NPC npc)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <ClearElectrifyCoroutine>d__2(0)
{
npc = npc
};
}
internal static void StrikeLightning(Vector3 position)
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
EnsureVFX();
if (!((Object)(object)_lightningVFX == (Object)null))
{
((EffectHandler)_lightningVFX).SetPosition(position);
((EffectHandler)_lightningVFX).Activate();
((EffectHandler)_lightningVFX).DelayDeactivate(2f, (Action)null);
}
}
private static void EnsureVFX()
{
if (_searched)
{
return;
}
_searched = true;
Il2CppArrayBase<ThunderController> val = Resources.FindObjectsOfTypeAll<ThunderController>();
ThunderController val2 = ((val.Length > 0) ? val[0] : null);
if ((Object)(object)val2 == (Object)null)
{
Melon<Core>.Logger.Warning("No ThunderController found — lightning VFX unavailable");
return;
}
VFXEffectHandler val3 = null;
val3 = val2._lightningEffect;
if ((Object)(object)val3 == (Object)null && ((WeatherEffectController)val2).visualEffects != null)
{
Enumerator<VFXEffectHandler> enumerator = ((WeatherEffectController)val2).visualEffects.GetEnumerator();
while (enumerator.MoveNext())
{
VFXEffectHandler current = enumerator.Current;
if ((Object)(object)current != (Object)null && ((EffectHandler)current).Id == "Lightning")
{
val3 = current;
break;
}
}
}
if ((Object)(object)val3 == (Object)null)
{
Melon<Core>.Logger.Warning("No lightning VFX found on ThunderController");
return;
}
GameObject val4 = Object.Instantiate<GameObject>(((Component)val3).gameObject);
((Object)val4).name = "ThorLightningVFX";
val4.SetActive(true);
Object.DontDestroyOnLoad((Object)(object)val4);
_lightningVFX = val4.GetComponent<VFXEffectHandler>();
if ((Object)(object)_lightningVFX != (Object)null)
{
((EffectHandler)_lightningVFX).Deactivate();
Melon<Core>.Logger.Msg("Cloned game lightning VFX for ThorHammer.");
}
else
{
Melon<Core>.Logger.Warning("Cloned lightning VFX has no VFXEffectHandler component");
Object.Destroy((Object)(object)val4);
}
}
}
}using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using FishNet.Object;
using MelonLoader;
using MelonLoader.Preferences;
using MelonLoader.Utils;
using Microsoft.CodeAnalysis;
using S1API.Items;
using S1API.Shops;
using S1MAPI.Gltf;
using S1MAPI.Utils;
using ScheduleOne;
using ScheduleOne.Audio;
using ScheduleOne.Combat;
using ScheduleOne.DevUtilities;
using ScheduleOne.Effects;
using ScheduleOne.Equipping;
using ScheduleOne.FX;
using ScheduleOne.ItemFramework;
using ScheduleOne.NPCs;
using ScheduleOne.Noise;
using ScheduleOne.Persistence;
using ScheduleOne.PlayerScripts;
using ScheduleOne.Vision;
using ScheduleOne.Weather;
using ThorHammer;
using UnityEngine;
using UnityEngine.Events;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(Core), "Mjolnir", "1.0.4", "hdlmrell", null)]
[assembly: MelonGame("TVGS", "Schedule I")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ThorHammer.Mono")]
[assembly: AssemblyConfiguration("MonoRelease")]
[assembly: AssemblyFileVersion("1.0.2.0")]
[assembly: AssemblyInformationalVersion("1.0.0+ea2da1c6208f6f22b4b7396e9dab0a1eb1fb605e")]
[assembly: AssemblyProduct("ThorHammer.Mono")]
[assembly: AssemblyTitle("ThorHammer.Mono")]
[assembly: NeutralResourcesLanguage("en-US")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.2.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace ThorHammer
{
public class Core : MelonMod
{
private bool _itemsRegistered;
private bool _loadHooked;
private static ItemDefinition _hammerDef;
private static Sprite _cachedIcon;
private static readonly string[] HardwareShopNames = new string[2] { "Handy Hank's Hardware", "Dan's Hardware" };
private static MelonPreferences_Entry<float> _priceEntry;
private static MelonPreferences_Entry<bool> _sellAtHardwareEntry;
private static bool _shopsPopulated;
public static KeyCode LightningKey { get; private set; } = (KeyCode)120;
public static float MeleeDamage { get; private set; } = 25f;
public static float MeleeForce { get; private set; } = 350f;
public static float ThrowDamage { get; private set; } = 100f;
public static float ThrowForce { get; private set; } = 600f;
public static float LightningDamage { get; private set; } = 80f;
public static float LightningForce { get; private set; } = 400f;
public static float LightningPanicRadius { get; private set; } = 25f;
public static float FlightSpeed { get; private set; } = 18f;
public static float ThrowSpeed { get; private set; } = 40f;
public static float MaxThrowRange { get; private set; } = 30f;
public static float WindUpDuration { get; private set; } = 1.2f;
public static bool StaminaEnabled { get; private set; } = true;
public static float SwingStaminaCost { get; private set; } = 15f;
public static float LightningStaminaCost { get; private set; } = 20f;
public static float WindUpStaminaRate { get; private set; } = 20f;
public static float FlightStaminaRate { get; private set; } = 15f;
private static string IconPath => Path.Combine(MelonEnvironment.UserDataDirectory, "S1API", "Icons", "ThorHammer.png");
public override void OnInitializeMelon()
{
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
MelonPreferences_Category cat = MelonPreferences.CreateCategory("Mjolnir - Controls", "Mjolnir Controls");
string text = BindEntry(cat, "LightningKey", "X", "Lightning Key", "Key to summon lightning from the hammer (e.g. X, F, G, T)", delegate(string _, string v)
{
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
if (Enum.TryParse<KeyCode>(v, ignoreCase: true, out KeyCode result2))
{
LightningKey = result2;
}
else
{
((MelonBase)this).LoggerInstance.Warning($"Invalid lightning key '{v}', keeping {LightningKey}");
}
});
if (Enum.TryParse<KeyCode>(text, ignoreCase: true, out KeyCode result))
{
LightningKey = result;
}
else
{
((MelonBase)this).LoggerInstance.Warning("Invalid lightning key '" + text + "', defaulting to X");
}
MelonPreferences_Category val = MelonPreferences.CreateCategory("Mjolnir - Shop", "Mjolnir Shop");
_priceEntry = val.CreateEntry<float>("Price", 10000f, "Shop Price", "Price of Mjolnir at the Arms Dealer (in dollars)", false, false, (ValueValidator)null, (string)null);
((MelonEventBase<LemonAction<float, float>>)(object)_priceEntry.OnEntryValueChanged).Subscribe((LemonAction<float, float>)delegate(float _, float v)
{
OnPriceChanged(v);
}, 0, false);
_sellAtHardwareEntry = val.CreateEntry<bool>("SellAtHardwareStores", false, "Sell at Hardware Stores", "Whether Mjolnir is also sold at hardware stores (Handy Hank's, Dan's)", false, false, (ValueValidator)null, (string)null);
((MelonEventBase<LemonAction<bool, bool>>)(object)_sellAtHardwareEntry.OnEntryValueChanged).Subscribe((LemonAction<bool, bool>)delegate(bool _, bool v)
{
OnHardwareShopToggled(v);
}, 0, false);
MelonPreferences_Category cat2 = MelonPreferences.CreateCategory("Mjolnir - Combat", "Mjolnir Combat");
MeleeDamage = BindEntry(cat2, "MeleeDamage", 25f, "Melee Damage", "Damage dealt by a melee swing", delegate(float _, float v)
{
MeleeDamage = v;
});
MeleeForce = BindEntry(cat2, "MeleeForce", 350f, "Melee Force", "Impact force of a melee swing", delegate(float _, float v)
{
MeleeForce = v;
});
ThrowDamage = BindEntry(cat2, "ThrowDamage", 100f, "Throw Damage", "Damage dealt when the thrown hammer hits", delegate(float _, float v)
{
ThrowDamage = v;
});
ThrowForce = BindEntry(cat2, "ThrowForce", 600f, "Throw Force", "Impact force of the thrown hammer", delegate(float _, float v)
{
ThrowForce = v;
});
LightningDamage = BindEntry(cat2, "LightningDamage", 80f, "Lightning Damage", "Damage dealt by a lightning zap", delegate(float _, float v)
{
LightningDamage = v;
});
LightningForce = BindEntry(cat2, "LightningForce", 400f, "Lightning Force", "Impact force of a lightning zap", delegate(float _, float v)
{
LightningForce = v;
});
LightningPanicRadius = BindEntry(cat2, "LightningPanicRadius", 25f, "Lightning Panic Radius", "Radius around lightning strikes that causes nearby NPCs to panic (0 to disable)", delegate(float _, float v)
{
LightningPanicRadius = v;
});
MelonPreferences_Category cat3 = MelonPreferences.CreateCategory("Mjolnir - Mechanics", "Mjolnir Mechanics");
FlightSpeed = BindEntry(cat3, "FlightSpeed", 18f, "Flight Speed", "How fast you fly while holding Space during a charged wind-up", delegate(float _, float v)
{
FlightSpeed = v;
});
ThrowSpeed = BindEntry(cat3, "ThrowSpeed", 40f, "Throw Speed", "How fast the thrown hammer travels", delegate(float _, float v)
{
ThrowSpeed = v;
});
MaxThrowRange = BindEntry(cat3, "MaxThrowRange", 30f, "Max Throw Range", "Maximum distance the hammer can travel before returning", delegate(float _, float v)
{
MaxThrowRange = v;
});
WindUpDuration = Math.Max(0.1f, BindEntry(cat3, "WindUpDuration", 1.2f, "Wind-Up Duration", "Seconds to fully charge the hammer spin (minimum 0.1)", delegate(float _, float v)
{
WindUpDuration = Math.Max(0.1f, v);
}));
MelonPreferences_Category cat4 = MelonPreferences.CreateCategory("Mjolnir - Stamina", "Mjolnir Stamina");
StaminaEnabled = BindEntry(cat4, "StaminaEnabled", defaultValue: true, "Stamina Enabled", "Whether hammer actions consume stamina", delegate(bool _, bool v)
{
StaminaEnabled = v;
});
SwingStaminaCost = BindEntry(cat4, "SwingStaminaCost", 15f, "Swing Stamina Cost", "Stamina consumed per melee swing", delegate(float _, float v)
{
SwingStaminaCost = v;
});
LightningStaminaCost = BindEntry(cat4, "LightningStaminaCost", 20f, "Lightning Stamina Cost", "Stamina consumed per lightning zap", delegate(float _, float v)
{
LightningStaminaCost = v;
});
WindUpStaminaRate = BindEntry(cat4, "WindUpStaminaRate", 20f, "Wind-Up Stamina Rate", "Stamina consumed per second while winding up", delegate(float _, float v)
{
WindUpStaminaRate = v;
});
FlightStaminaRate = BindEntry(cat4, "FlightStaminaRate", 15f, "Flight Stamina Rate", "Stamina consumed per second while flying", delegate(float _, float v)
{
FlightStaminaRate = v;
});
((MelonBase)this).LoggerInstance.Msg("Initialized.");
}
public override void OnSceneWasInitialized(int buildIndex, string sceneName)
{
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: Expected O, but got Unknown
if (sceneName == "Main" && !_itemsRegistered)
{
_itemsRegistered = true;
RegisterItems();
}
if (sceneName == "Main" && !_loadHooked)
{
LoadManager instance = Singleton<LoadManager>.Instance;
if ((Object)(object)instance != (Object)null)
{
instance.onLoadComplete.AddListener(new UnityAction(OnGameLoaded));
_loadHooked = true;
}
}
}
public override void OnSceneWasUnloaded(int buildIndex, string sceneName)
{
if (sceneName == "Main")
{
_loadHooked = false;
}
}
private void RegisterItems()
{
Equippable val = ItemCreator.CreateEquippableBuilder().CreateEquippable<HammerEquippable>("ThorHammerEquippable").WithInteraction(true, true)
.Build();
_hammerDef = (ItemDefinition)(object)ItemCreator.CreateBuilder().WithBasicInfo("thor_hammer", "Mjolnir", "Mjolnir. Whosoever holds this hammer, if they be worthy, shall possess the power of Thor.", (ItemCategory)3).WithStackLimit(1)
.WithPricing(_priceEntry.Value, 0.5f)
.WithLegalStatus((LegalStatus)0)
.WithEquippable(val)
.Build();
RenderHammerIcon();
((MelonBase)this).LoggerInstance.Msg("Mjolnir registered.");
}
private void RenderHammerIcon()
{
//IL_048e: Unknown result type (might be due to invalid IL or missing references)
//IL_049d: Unknown result type (might be due to invalid IL or missing references)
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Expected O, but got Unknown
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Expected O, but got Unknown
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
//IL_0201: Expected O, but got Unknown
//IL_0238: Unknown result type (might be due to invalid IL or missing references)
//IL_0266: Unknown result type (might be due to invalid IL or missing references)
//IL_0276: Unknown result type (might be due to invalid IL or missing references)
//IL_027d: Expected O, but got Unknown
//IL_02b4: Unknown result type (might be due to invalid IL or missing references)
//IL_02e2: Unknown result type (might be due to invalid IL or missing references)
//IL_02f2: Unknown result type (might be due to invalid IL or missing references)
//IL_02f9: Expected O, but got Unknown
//IL_034a: Unknown result type (might be due to invalid IL or missing references)
//IL_0372: Unknown result type (might be due to invalid IL or missing references)
//IL_0386: Unknown result type (might be due to invalid IL or missing references)
//IL_038b: Unknown result type (might be due to invalid IL or missing references)
//IL_03a3: Unknown result type (might be due to invalid IL or missing references)
//IL_03bb: Unknown result type (might be due to invalid IL or missing references)
//IL_03c1: Expected O, but got Unknown
//IL_03ea: Unknown result type (might be due to invalid IL or missing references)
//IL_03f1: Expected O, but got Unknown
//IL_0407: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)_cachedIcon != (Object)null)
{
_hammerDef.Icon = _cachedIcon;
return;
}
string iconPath = IconPath;
if (File.Exists(iconPath))
{
try
{
byte[] array = File.ReadAllBytes(iconPath);
Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false);
if (ImageConversion.LoadImage(val, array))
{
_cachedIcon = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), 100f);
((Object)_cachedIcon).name = "ThorHammerIcon";
_hammerDef.Icon = _cachedIcon;
((MelonBase)this).LoggerInstance.Msg("Loaded hammer icon from cache.");
return;
}
}
catch (Exception ex)
{
((MelonBase)this).LoggerInstance.Warning("Failed to load cached icon, re-rendering: " + ex.Message);
}
}
GameObject val2 = null;
Camera val3 = null;
RenderTexture val4 = null;
try
{
val2 = new GameObject("TH_IconStage");
val2.transform.position = new Vector3(0f, 5000f, 0f);
byte[] array2 = EmbeddedResourceLoader.LoadBytes("ThorHammer.Resources.ThorHammer.glb", Assembly.GetExecutingAssembly());
if (array2 == null)
{
((MelonBase)this).LoggerInstance.Warning("Cannot render icon: GLB resource not found");
return;
}
GameObject val5 = GltfLoader.LoadGlb(array2, (Shader)null);
if ((Object)(object)val5 == (Object)null)
{
((MelonBase)this).LoggerInstance.Warning("Cannot render icon: GLB load failed");
return;
}
val5.transform.SetParent(val2.transform, false);
val5.transform.localPosition = Vector3.zero;
val5.transform.localRotation = Quaternion.Euler(0f, 135f, -30f);
val5.transform.localScale = Vector3.one * 0.5f;
GameObject val6 = new GameObject("TH_IconLight");
val6.transform.SetParent(val2.transform, false);
Light val7 = val6.AddComponent<Light>();
val7.type = (LightType)1;
val7.color = new Color(1f, 0.97f, 0.92f);
val7.intensity = 1.2f;
val6.transform.rotation = Quaternion.Euler(50f, -30f, 0f);
GameObject val8 = new GameObject("TH_IconFill");
val8.transform.SetParent(val2.transform, false);
Light val9 = val8.AddComponent<Light>();
val9.type = (LightType)1;
val9.color = new Color(0.8f, 0.85f, 0.95f);
val9.intensity = 0.5f;
val8.transform.rotation = Quaternion.Euler(30f, 150f, 0f);
GameObject val10 = new GameObject("TH_IconCamera");
val3 = val10.AddComponent<Camera>();
val3.orthographic = true;
val3.orthographicSize = 1.8f;
val3.nearClipPlane = 0.01f;
val3.farClipPlane = 10f;
val3.clearFlags = (CameraClearFlags)2;
val3.backgroundColor = new Color(0f, 0f, 0f, 0f);
val3.cullingMask = -1;
((Behaviour)val3).enabled = false;
val10.transform.position = val2.transform.position + new Vector3(-1.5f, 1.5f, 1.5f);
val10.transform.LookAt(val2.transform.position);
val4 = new RenderTexture(256, 256, 24, (RenderTextureFormat)0);
val4.Create();
val3.targetTexture = val4;
val3.Render();
RenderTexture.active = val4;
Texture2D val11 = new Texture2D(256, 256, (TextureFormat)4, false);
val11.ReadPixels(new Rect(0f, 0f, 256f, 256f), 0, 0);
val11.Apply();
RenderTexture.active = null;
try
{
string directoryName = Path.GetDirectoryName(iconPath);
if (!Directory.Exists(directoryName))
{
Directory.CreateDirectory(directoryName);
}
File.WriteAllBytes(iconPath, ImageConversion.EncodeToPNG(val11));
}
catch (Exception ex2)
{
((MelonBase)this).LoggerInstance.Warning("Failed to save icon to disk: " + ex2.Message);
}
_cachedIcon = Sprite.Create(val11, new Rect(0f, 0f, 256f, 256f), new Vector2(0.5f, 0.5f), 100f);
((Object)_cachedIcon).name = "ThorHammerIcon";
_hammerDef.Icon = _cachedIcon;
((MelonBase)this).LoggerInstance.Msg("Rendered hammer icon.");
}
catch (Exception ex3)
{
((MelonBase)this).LoggerInstance.Error("RenderHammerIcon failed: " + ex3.Message + "\n" + ex3.StackTrace);
}
finally
{
if ((Object)(object)val3 != (Object)null)
{
Object.Destroy((Object)(object)((Component)val3).gameObject);
}
if ((Object)(object)val4 != (Object)null)
{
val4.Release();
Object.Destroy((Object)(object)val4);
}
if ((Object)(object)val2 != (Object)null)
{
Object.Destroy((Object)(object)val2);
}
}
}
private void OnGameLoaded()
{
if (!(_hammerDef == (ItemDefinition)null))
{
int num = ShopManager.AddToShops(_hammerDef, new string[1] { "Arms Dealer" });
if (_sellAtHardwareEntry.Value)
{
num += ShopManager.AddToShops(_hammerDef, HardwareShopNames);
}
_shopsPopulated = true;
((MelonBase)this).LoggerInstance.Msg($"Mjolnir added to {num} shop(s).");
}
}
private void OnPriceChanged(float newPrice)
{
if (_shopsPopulated && !(_hammerDef == (ItemDefinition)null))
{
ItemDefinition hammerDef = _hammerDef;
StorableItemDefinition val = (StorableItemDefinition)(object)((hammerDef is StorableItemDefinition) ? hammerDef : null);
if (val != null)
{
val.BasePurchasePrice = newPrice;
}
Shop[] array = ShopManager.FindShopsByItem("thor_hammer");
Shop[] array2 = array;
foreach (Shop val2 in array2)
{
val2.RemoveItem("thor_hammer");
val2.AddItem(_hammerDef, (float?)newPrice);
}
((MelonBase)this).LoggerInstance.Msg($"Mjolnir price updated to ${newPrice:N0}.");
}
}
private void OnHardwareShopToggled(bool enabled)
{
if (!_shopsPopulated || _hammerDef == (ItemDefinition)null)
{
return;
}
if (enabled)
{
int num = ShopManager.AddToShops(_hammerDef, HardwareShopNames);
((MelonBase)this).LoggerInstance.Msg($"Mjolnir added to {num} hardware shop(s).");
return;
}
string[] hardwareShopNames = HardwareShopNames;
foreach (string text in hardwareShopNames)
{
Shop shopByName = ShopManager.GetShopByName(text);
if (shopByName != null && shopByName.HasItem("thor_hammer"))
{
shopByName.RemoveItem("thor_hammer");
}
}
((MelonBase)this).LoggerInstance.Msg("Mjolnir removed from hardware shops.");
}
private static T BindEntry<T>(MelonPreferences_Category cat, string id, T defaultValue, string displayName, string description, LemonAction<T, T> onChanged)
{
MelonPreferences_Entry<T> val = cat.CreateEntry<T>(id, defaultValue, displayName, description, false, false, (ValueValidator)null, (string)null);
((MelonEventBase<LemonAction<T, T>>)(object)val.OnEntryValueChanged).Subscribe(onChanged, 0, false);
return val.Value;
}
}
public class HammerEquippable : Equippable_Viewmodel
{
private enum HammerState
{
Idle,
WindingUp,
FlyingOut,
FlyingBack,
Flying
}
private const float Range = 1.5f;
private const float HitRadius = 0.3f;
private const float SwingCooldown = 0.25f;
private const float SwingDuration = 0.15f;
private const float SwingAngle = 70f;
private const float HitTime = 0.06f;
private const float WindUpMaxSpinSpeed = 5400f;
private const float AimFOVReduction = 15f;
private const float AimZoomDuration = 0.2f;
private const float LightningAimRadius = 0.5f;
private const float FlightGracePeriod = 0.5f;
private const float ThrowHitRadius = 0.3f;
private const float ReturnSpeed = 45f;
private const float ReturnCatchDistance = 0.5f;
private const float SpinSpeed = 1440f;
private HammerState _state = HammerState.Idle;
private float _cooldownRemaining;
private bool _isSwinging;
private float _swingElapsed;
private bool _hitChecked;
private GameObject _hammerModel;
private Quaternion _modelBaseRotation;
private float _windUpElapsed;
private bool _fovOverridden;
private bool _playerCharged;
private GameObject _projectile;
private Vector3 _throwDirection;
private float _throwDistance;
private float _savedGravityMultiplier = 1f;
private float _flightStartTime;
private AudioClip _thunderClip;
private bool _thunderClipSearched;
private static float LightningRange => Core.MaxThrowRange * 0.7f;
public override void Equip(ItemInstance item)
{
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
((Component)this).gameObject.SetActive(true);
base.localPosition = new Vector3(0.35f, -0.3f, 0.5f);
base.localEulerAngles = new Vector3(0f, 0f, 0f);
base.localScale = Vector3.one;
LoadHammerModel();
((Equippable_Viewmodel)this).Equip(item);
}
public override void Unequip()
{
if (_state == HammerState.Flying)
{
StopFlight();
}
if (_state == HammerState.WindingUp)
{
CancelWindUp();
}
CleanupThrow();
ClearPlayerCharged();
((Equippable_Viewmodel)this).Unequip();
}
private void LoadHammerModel()
{
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00cf: 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)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
byte[] array = EmbeddedResourceLoader.LoadBytes("ThorHammer.Resources.ThorHammer.glb", Assembly.GetExecutingAssembly());
if (array == null)
{
Melon<Core>.Logger.Error("Failed to load ThorHammer.glb from embedded resources");
return;
}
_hammerModel = GltfLoader.LoadGlb(array, (Shader)null);
if ((Object)(object)_hammerModel == (Object)null)
{
Melon<Core>.Logger.Error("GltfLoader.LoadGlb returned null");
return;
}
_hammerModel.transform.SetParent(((Component)this).transform, false);
_hammerModel.transform.localPosition = new Vector3(0.02f, -0.15f, 0.05f);
_hammerModel.transform.localRotation = Quaternion.Euler(0f, 90f, 0f);
_hammerModel.transform.localScale = Vector3.one * 0.08f;
_modelBaseRotation = _hammerModel.transform.localRotation;
}
protected override void Update()
{
((Equippable)this).Update();
if (_cooldownRemaining > 0f)
{
_cooldownRemaining -= Time.deltaTime;
}
switch (_state)
{
case HammerState.Idle:
UpdateSwingAnimation();
UpdateIdle();
break;
case HammerState.WindingUp:
UpdateWindUp();
break;
case HammerState.FlyingOut:
UpdateFlyingOut();
break;
case HammerState.FlyingBack:
UpdateFlyingBack();
break;
case HammerState.Flying:
UpdateFlying();
break;
}
}
private void UpdateIdle()
{
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
bool flag = !GameInput.IsTyping && PlayerSingleton<PlayerCamera>.Instance.activeUIElementCount == 0;
if (flag && GameInput.GetButtonDown((ButtonCode)1))
{
StartWindUp();
return;
}
if (flag && Input.GetKeyDown(Core.LightningKey))
{
if (Core.StaminaEnabled && PlayerSingleton<PlayerMovement>.Instance.CurrentStaminaReserve < Core.LightningStaminaCost)
{
return;
}
if (Core.StaminaEnabled)
{
PlayerSingleton<PlayerMovement>.Instance.ChangeStamina(0f - Core.LightningStaminaCost, true);
}
TryLightningZap();
}
if (flag && !_isSwinging && _cooldownRemaining <= 0f && GameInput.GetButtonDown((ButtonCode)0) && (!Core.StaminaEnabled || !(PlayerSingleton<PlayerMovement>.Instance.CurrentStaminaReserve < Core.SwingStaminaCost)))
{
if (Core.StaminaEnabled)
{
PlayerSingleton<PlayerMovement>.Instance.ChangeStamina(0f - Core.SwingStaminaCost, true);
}
StartSwing();
}
}
private void StartSwing()
{
_isSwinging = true;
_swingElapsed = 0f;
_hitChecked = false;
_cooldownRemaining = 0.25f;
}
private void UpdateSwingAnimation()
{
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: 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_0063: Unknown result type (might be due to invalid IL or missing references)
if (!_isSwinging || (Object)(object)_hammerModel == (Object)null)
{
return;
}
_swingElapsed += Time.deltaTime;
float num = _swingElapsed / 0.15f;
if (num >= 1f)
{
_isSwinging = false;
_hammerModel.transform.localRotation = _modelBaseRotation;
return;
}
float num2 = Mathf.Sin(num * MathF.PI) * 70f;
_hammerModel.transform.localRotation = Quaternion.Euler(num2, 0f, 0f) * _modelBaseRotation;
if (!_hitChecked && _swingElapsed >= 0.06f)
{
_hitChecked = true;
ExecuteMeleeHit();
}
}
private void ExecuteMeleeHit()
{
//IL_0012: 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_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Expected O, but got Unknown
RaycastHit val = default(RaycastHit);
if (!PlayerSingleton<PlayerCamera>.Instance.LookRaycast(1.5f, ref val, NetworkSingleton<CombatManager>.Instance.MeleeLayerMask, true, 0.3f))
{
return;
}
IDamageable componentInParent = ((Component)((RaycastHit)(ref val)).collider).GetComponentInParent<IDamageable>();
if (componentInParent != null)
{
float meleeForce = Core.MeleeForce;
Impact val2 = new Impact(((RaycastHit)(ref val)).point, ((Component)PlayerSingleton<PlayerCamera>.Instance).transform.forward, meleeForce, Core.MeleeDamage, (EImpactType)1, ((NetworkBehaviour)Player.Local).NetworkObject, Random.Range(int.MinValue, int.MaxValue));
componentInParent.SendImpact(val2);
Singleton<FXManager>.Instance.CreateImpactFX(val2, componentInParent);
PlayerSingleton<PlayerCamera>.Instance.StartCameraShake(0.3f, 0.2f, true);
NPC componentInParent2 = ((Component)((RaycastHit)(ref val)).collider).GetComponentInParent<NPC>();
if ((Object)(object)componentInParent2 != (Object)null)
{
StrikeLightningOnNPC(componentInParent2);
((EntityVisibility)Player.Local.VisualState).ApplyState("melee_attack", (EVisualState)9, 2.5f);
}
}
}
private void StartWindUp()
{
_state = HammerState.WindingUp;
_windUpElapsed = 0f;
_isSwinging = false;
PlayerSingleton<PlayerMovement>.Instance.CanJump = false;
float num = Singleton<Settings>.Instance.CameraFOV - 15f;
PlayerSingleton<PlayerCamera>.Instance.OverrideFOV(num, 0.2f);
_fovOverridden = true;
}
private void UpdateWindUp()
{
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
_windUpElapsed += Time.deltaTime;
bool flag = _windUpElapsed >= Core.WindUpDuration;
if (Core.StaminaEnabled)
{
PlayerSingleton<PlayerMovement>.Instance.ChangeStamina((0f - Core.WindUpStaminaRate) * Time.deltaTime, true);
if (PlayerSingleton<PlayerMovement>.Instance.CurrentStaminaReserve <= 0f)
{
CancelWindUp();
return;
}
}
float num = Mathf.Clamp01(_windUpElapsed / Core.WindUpDuration);
float num2 = num * num * 5400f;
if ((Object)(object)_hammerModel != (Object)null)
{
_hammerModel.transform.Rotate(Vector3.forward, num2 * Time.deltaTime, (Space)1);
}
if (flag && !_playerCharged)
{
_playerCharged = true;
Electrifying.ApplyToAvatar(Player.Local.Avatar);
}
if (!GameInput.GetButton((ButtonCode)1))
{
if (flag)
{
StartThrow();
}
else
{
CancelWindUp();
}
}
else if (flag && GameInput.GetButton((ButtonCode)7))
{
StartFlight();
}
}
private void CancelWindUp()
{
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
_state = HammerState.Idle;
_windUpElapsed = 0f;
PlayerSingleton<PlayerMovement>.Instance.CanJump = true;
ClearPlayerCharged();
if (_fovOverridden)
{
PlayerSingleton<PlayerCamera>.Instance.StopFOVOverride(0.2f);
_fovOverridden = false;
}
if ((Object)(object)_hammerModel != (Object)null)
{
_hammerModel.transform.localRotation = _modelBaseRotation;
}
}
private void ClearPlayerCharged()
{
if (_playerCharged)
{
_playerCharged = false;
Electrifying.ClearFromAvatar(Player.Local.Avatar);
}
}
private void StartThrow()
{
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_010a: 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_0125: Unknown result type (might be due to invalid IL or missing references)
//IL_012f: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
PlayerSingleton<PlayerMovement>.Instance.CanJump = true;
ClearPlayerCharged();
if (_fovOverridden)
{
PlayerSingleton<PlayerCamera>.Instance.StopFOVOverride(0.2f);
_fovOverridden = false;
}
if (!((Object)(object)_hammerModel == (Object)null))
{
_hammerModel.transform.localRotation = _modelBaseRotation;
_hammerModel.SetActive(false);
_projectile = Object.Instantiate<GameObject>(_hammerModel);
_projectile.SetActive(true);
_projectile.transform.SetParent((Transform)null, false);
SetLayerRecursive(_projectile, 0);
Transform transform = ((Component)PlayerSingleton<PlayerCamera>.Instance).transform;
_projectile.transform.position = transform.position + transform.forward * 1f;
_projectile.transform.rotation = Quaternion.LookRotation(transform.forward) * Quaternion.Euler(0f, 90f, 0f);
_projectile.transform.localScale = Vector3.one * 0.08f;
_throwDirection = transform.forward;
_throwDistance = 0f;
_state = HammerState.FlyingOut;
}
}
private void UpdateFlyingOut()
{
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: 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_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: 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_009e: 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_00cc: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)_projectile == (Object)null)
{
CatchHammer();
return;
}
float num = Core.ThrowSpeed * Time.deltaTime;
_throwDistance += num;
Transform transform = _projectile.transform;
transform.position += _throwDirection * num;
_projectile.transform.Rotate(Vector3.forward, 1440f * Time.deltaTime, (Space)1);
RaycastHit hit = default(RaycastHit);
if (Physics.SphereCast(_projectile.transform.position - _throwDirection * num, 0.3f, _throwDirection, ref hit, num, LayerMask.op_Implicit(NetworkSingleton<CombatManager>.Instance.MeleeLayerMask), (QueryTriggerInteraction)2))
{
ExecuteThrowHit(hit);
_state = HammerState.FlyingBack;
}
else if (_throwDistance >= Core.MaxThrowRange)
{
_state = HammerState.FlyingBack;
}
}
private void UpdateFlyingBack()
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: 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_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: 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_0072: 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_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)_projectile == (Object)null)
{
CatchHammer();
return;
}
Vector3 position = ((Component)PlayerSingleton<PlayerCamera>.Instance).transform.position;
Vector3 val = position - _projectile.transform.position;
Vector3 normalized = ((Vector3)(ref val)).normalized;
float num = 45f * Time.deltaTime;
Transform transform = _projectile.transform;
transform.position += normalized * num;
_projectile.transform.Rotate(Vector3.forward, 1440f * Time.deltaTime, (Space)1);
if (Vector3.Distance(_projectile.transform.position, position) < 0.5f)
{
CatchHammer();
}
}
private void ExecuteThrowHit(RaycastHit hit)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Expected O, but got Unknown
IDamageable componentInParent = ((Component)((RaycastHit)(ref hit)).collider).GetComponentInParent<IDamageable>();
if (componentInParent != null)
{
Impact val = new Impact(((RaycastHit)(ref hit)).point, _throwDirection, Core.ThrowForce, Core.ThrowDamage, (EImpactType)1, ((NetworkBehaviour)Player.Local).NetworkObject, Random.Range(int.MinValue, int.MaxValue));
componentInParent.SendImpact(val);
Singleton<FXManager>.Instance.CreateImpactFX(val, componentInParent);
}
NPC componentInParent2 = ((Component)((RaycastHit)(ref hit)).collider).GetComponentInParent<NPC>();
if ((Object)(object)componentInParent2 != (Object)null)
{
StrikeLightningOnNPC(componentInParent2);
((EntityVisibility)Player.Local.VisualState).ApplyState("melee_attack", (EVisualState)9, 2.5f);
}
PlayerSingleton<PlayerCamera>.Instance.StartCameraShake(0.5f, 0.3f, true);
}
private void CatchHammer()
{
if ((Object)(object)_projectile != (Object)null)
{
Object.Destroy((Object)(object)_projectile);
_projectile = null;
}
if ((Object)(object)_hammerModel != (Object)null)
{
_hammerModel.SetActive(true);
}
_state = HammerState.Idle;
}
private void CleanupThrow()
{
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)_projectile != (Object)null)
{
Object.Destroy((Object)(object)_projectile);
_projectile = null;
}
if (_fovOverridden)
{
PlayerSingleton<PlayerCamera>.Instance.StopFOVOverride(0f);
_fovOverridden = false;
}
if ((Object)(object)_hammerModel != (Object)null)
{
_hammerModel.SetActive(true);
_hammerModel.transform.localRotation = _modelBaseRotation;
}
_state = HammerState.Idle;
}
private void TryLightningZap()
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
//IL_00e1: 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_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: 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_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_010e: Unknown result type (might be due to invalid IL or missing references)
//IL_0115: 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_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Expected O, but got Unknown
PlayerCamera instance = PlayerSingleton<PlayerCamera>.Instance;
NPC val = null;
RaycastHit val2 = default(RaycastHit);
Vector3 position;
if (instance.LookRaycast(LightningRange, ref val2, NetworkSingleton<CombatManager>.Instance.MeleeLayerMask, true, 0.5f))
{
position = ((RaycastHit)(ref val2)).point;
val = ((Component)((RaycastHit)(ref val2)).collider).GetComponentInParent<NPC>();
if ((Object)(object)val != (Object)null)
{
IDamageable componentInParent = ((Component)((RaycastHit)(ref val2)).collider).GetComponentInParent<IDamageable>();
if (componentInParent != null)
{
Impact val3 = new Impact(((RaycastHit)(ref val2)).point, ((Component)instance).transform.forward, Core.LightningForce, Core.LightningDamage, (EImpactType)1, ((NetworkBehaviour)Player.Local).NetworkObject, Random.Range(int.MinValue, int.MaxValue));
componentInParent.SendImpact(val3);
}
Electrifying.ApplyToAvatar(val.Avatar);
}
}
else
{
position = ((Component)instance).transform.position + ((Component)instance).transform.forward * LightningRange;
}
LightningHelper.StrikeLightning(position);
if ((Object)(object)val != (Object)null)
{
MelonCoroutines.Start(LightningHelper.ClearElectrifyCoroutine(val));
}
PlayThunderSound(position);
EmitLightningNoise(position);
((EntityVisibility)Player.Local.VisualState).ApplyState("melee_attack", (EVisualState)9, 2.5f);
PlayerSingleton<PlayerCamera>.Instance.StartCameraShake(0.5f, 0.3f, true);
}
private void StrikeLightningOnNPC(NPC npc)
{
//IL_0007: 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)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
Vector3 position = ((Component)npc).transform.position;
LightningHelper.StrikeLightning(position);
MelonCoroutines.Start(LightningHelper.ClearElectrifyCoroutine(npc));
Electrifying.ApplyToAvatar(npc.Avatar);
PlayThunderSound(position);
EmitLightningNoise(position);
}
private static void EmitLightningNoise(Vector3 position)
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
if (Core.LightningPanicRadius > 0f)
{
NoiseUtility.EmitNoise(position, (ENoiseType)2, Core.LightningPanicRadius, ((Component)Player.Local).gameObject);
}
}
private void PlayThunderSound(Vector3 position)
{
//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
if (!_thunderClipSearched)
{
_thunderClipSearched = true;
ThunderController val = Object.FindObjectOfType<ThunderController>();
if ((Object)(object)val == (Object)null)
{
ThunderController[] array = Resources.FindObjectsOfTypeAll<ThunderController>();
if (array.Length != 0)
{
val = array[0];
}
}
if ((Object)(object)val != (Object)null)
{
try
{
object? obj = typeof(ThunderController).GetField("_lightningAudio", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(val);
AudioSourceController val2 = (AudioSourceController)((obj is AudioSourceController) ? obj : null);
if (val2 != null && ((object)val2).GetType().GetField("Clips", BindingFlags.Instance | BindingFlags.Public)?.GetValue(val2) is AudioClip[] array2 && array2.Length != 0)
{
_thunderClip = array2[0];
}
}
catch
{
}
}
if ((Object)(object)_thunderClip == (Object)null)
{
try
{
AudioClip[] array3 = Resources.FindObjectsOfTypeAll<AudioClip>();
AudioClip[] array4 = array3;
foreach (AudioClip val3 in array4)
{
if (!((Object)(object)val3 == (Object)null))
{
string text = ((Object)val3).name.ToLowerInvariant();
if (text.Contains("thunder") || text.Contains("lightning"))
{
_thunderClip = val3;
break;
}
}
}
}
catch
{
}
}
if ((Object)(object)_thunderClip != (Object)null)
{
Melon<Core>.Logger.Msg("Thunder sound found: " + ((Object)_thunderClip).name);
}
else
{
Melon<Core>.Logger.Warning("No thunder/lightning AudioClip found in game assets");
}
}
if ((Object)(object)_thunderClip != (Object)null)
{
AudioSource.PlayClipAtPoint(_thunderClip, position, 1f);
}
}
private void StartFlight()
{
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
if (_fovOverridden)
{
PlayerSingleton<PlayerCamera>.Instance.StopFOVOverride(0.2f);
_fovOverridden = false;
}
_state = HammerState.Flying;
_flightStartTime = Time.time;
_savedGravityMultiplier = PlayerMovement.GravityMultiplier;
PlayerMovement.GravityMultiplier = 0f;
PlayerSingleton<PlayerMovement>.Instance.Controller.Move(Vector3.up * 0.5f);
if ((Object)(object)_hammerModel != (Object)null)
{
_hammerModel.transform.localRotation = Quaternion.Euler(90f, 0f, 0f);
}
}
private void UpdateFlying()
{
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
Transform transform = ((Component)PlayerSingleton<PlayerCamera>.Instance).transform;
PlayerMovement instance = PlayerSingleton<PlayerMovement>.Instance;
if (Core.StaminaEnabled)
{
instance.ChangeStamina((0f - Core.FlightStaminaRate) * Time.deltaTime, true);
if (instance.CurrentStaminaReserve <= 0f)
{
StopFlight();
return;
}
}
instance.Controller.Move(transform.forward * Core.FlightSpeed * Time.deltaTime);
bool flag = Time.time - _flightStartTime > 0.5f;
if (!GameInput.GetButton((ButtonCode)7) || (flag && instance.IsGrounded))
{
StopFlight();
}
}
private void StopFlight()
{
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
_state = HammerState.Idle;
PlayerMovement.GravityMultiplier = _savedGravityMultiplier;
PlayerSingleton<PlayerMovement>.Instance.CanJump = true;
ClearPlayerCharged();
if ((Object)(object)_hammerModel != (Object)null)
{
_hammerModel.transform.localRotation = _modelBaseRotation;
}
}
private static void SetLayerRecursive(GameObject go, int layer)
{
go.layer = layer;
for (int i = 0; i < go.transform.childCount; i++)
{
SetLayerRecursive(((Component)go.transform.GetChild(i)).gameObject, layer);
}
}
}
internal static class LightningHelper
{
[CompilerGenerated]
private sealed class <ClearElectrifyCoroutine>d__2 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public NPC npc;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <ClearElectrifyCoroutine>d__2(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitForSeconds(4f);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
if ((Object)(object)npc != (Object)null && (Object)(object)npc.Avatar != (Object)null)
{
Electrifying.ClearFromAvatar(npc.Avatar);
}
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 VFXEffectHandler _lightningVFX;
private static bool _searched;
[IteratorStateMachine(typeof(<ClearElectrifyCoroutine>d__2))]
internal static IEnumerator ClearElectrifyCoroutine(NPC npc)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <ClearElectrifyCoroutine>d__2(0)
{
npc = npc
};
}
internal static void StrikeLightning(Vector3 position)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
EnsureVFX();
if (!((Object)(object)_lightningVFX == (Object)null))
{
((EffectHandler)_lightningVFX).SetPosition(position);
((EffectHandler)_lightningVFX).Activate();
((EffectHandler)_lightningVFX).DelayDeactivate(2f, (Action)null);
}
}
private static void EnsureVFX()
{
if (_searched)
{
return;
}
_searched = true;
ThunderController[] array = Resources.FindObjectsOfTypeAll<ThunderController>();
ThunderController val = ((array.Length != 0) ? array[0] : null);
if ((Object)(object)val == (Object)null)
{
Melon<Core>.Logger.Warning("No ThunderController found — lightning VFX unavailable");
return;
}
VFXEffectHandler val2 = null;
object? obj = typeof(ThunderController).GetField("_lightningEffect", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(val);
val2 = (VFXEffectHandler)((obj is VFXEffectHandler) ? obj : null);
if ((Object)(object)val2 == (Object)null && typeof(WeatherEffectController).GetField("visualEffects", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(val) is IList list)
{
foreach (object item in list)
{
VFXEffectHandler val3 = (VFXEffectHandler)((item is VFXEffectHandler) ? item : null);
if (val3 != null && ((EffectHandler)val3).Id == "Lightning")
{
val2 = val3;
break;
}
}
}
if ((Object)(object)val2 == (Object)null)
{
Melon<Core>.Logger.Warning("No lightning VFX found on ThunderController");
return;
}
GameObject val4 = Object.Instantiate<GameObject>(((Component)val2).gameObject);
((Object)val4).name = "ThorLightningVFX";
val4.SetActive(true);
Object.DontDestroyOnLoad((Object)(object)val4);
_lightningVFX = val4.GetComponent<VFXEffectHandler>();
if ((Object)(object)_lightningVFX != (Object)null)
{
((EffectHandler)_lightningVFX).Deactivate();
Melon<Core>.Logger.Msg("Cloned game lightning VFX for ThorHammer.");
}
else
{
Melon<Core>.Logger.Warning("Cloned lightning VFX has no VFXEffectHandler component");
Object.Destroy((Object)(object)val4);
}
}
}
}