using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using ExitGames.Client.Photon;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using PEAKLib.Core;
using PEAKLib.Items.UnityEditor;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("q4y.Stones")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.1.2.0")]
[assembly: AssemblyInformationalVersion("0.1.2+83a32adcc880411693731e4c30bdb893eada8c95")]
[assembly: AssemblyProduct("q4y.Stones")]
[assembly: AssemblyTitle("Stones")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.2.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[CompilerGenerated]
[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 BepInEx
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
[Conditional("CodeGeneration")]
[Embedded]
internal sealed class BepInAutoPluginAttribute : Attribute
{
public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
{
}
}
}
namespace BepInEx.Preloader.Core.Patching
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
[Conditional("CodeGeneration")]
[Embedded]
internal sealed class PatcherAutoPluginAttribute : Attribute
{
public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
{
}
}
}
namespace Microsoft.CodeAnalysis
{
[Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace Stones
{
[RequireComponent(typeof(Item))]
public class AutoLightBehavior : MonoBehaviourPun
{
private Item item;
private bool hasTriggered;
private void Awake()
{
item = ((Component)this).GetComponent<Item>();
}
private void Update()
{
//IL_001d: 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)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: 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_0056: Unknown result type (might be due to invalid IL or missing references)
if (hasTriggered || !((MonoBehaviourPun)this).photonView.IsMine || (int)item.itemState != 0)
{
return;
}
hasTriggered = true;
Vector3 position = ((Component)this).transform.position;
Quaternion rotation = ((Component)this).transform.rotation;
ModLogger.LogInfo("[AutoLight] Custom explosive dropped/thrown. Spawning native vanilla Dynamite swap...");
try
{
GameObject val = PhotonNetwork.Instantiate("0_Items/Dynamite", position, rotation, (byte)0, (object[])null);
if ((Object)(object)val != (Object)null)
{
Dynamite component = val.GetComponent<Dynamite>();
if ((Object)(object)component != (Object)null)
{
component.startingFuseTime = 0.01f;
component.LightFlare();
}
}
}
catch (Exception ex)
{
ModLogger.LogError("[AutoLight] Failed to spawn native dynamite: " + ex.Message);
}
item.ClearDataFromBackpack();
PhotonNetwork.Destroy(((Component)this).gameObject);
}
}
[RequireComponent(typeof(Item))]
public class GrenadeCookBehavior : MonoBehaviourPun
{
private Item item;
private bool hasExploded;
private void Awake()
{
item = ((Component)this).GetComponent<Item>();
}
private void Update()
{
//IL_0153: 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_0065: 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_008d: 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_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
if (hasExploded || !((MonoBehaviourPun)this).photonView.IsMine)
{
return;
}
bool flag = false;
IntItemData val = default(IntItemData);
if (item.data != null && item.data.TryGetDataEntry<IntItemData>((DataEntryKey)1, ref val) && val.Value > 0)
{
flag = true;
}
if (!flag)
{
return;
}
hasExploded = true;
Vector3 position = ((Component)this).transform.position;
Quaternion rotation = ((Component)this).transform.rotation;
ModLogger.LogInfo("[GrenadeCook] Grenade cooked! Spawning custom 'Explosion' item via Photon...");
try
{
string text = "0_Items/" + Plugin.ModId + ":Explosion";
GameObject val2 = PhotonNetwork.Instantiate(text, position, rotation, (byte)0, (object[])null);
if ((Object)(object)val2 != (Object)null)
{
Item component = val2.GetComponent<Item>();
if ((Object)(object)component != (Object)null && (Object)(object)component.rig != (Object)null)
{
component.rig.linearVelocity = (((Object)(object)item.rig != (Object)null) ? item.rig.linearVelocity : Vector3.zero);
}
}
}
catch (Exception ex)
{
ModLogger.LogError("[GrenadeCook] Failed to spawn custom explosion item: " + ex.Message);
}
if ((Object)(object)Character.localCharacter != (Object)null && (Object)(object)Character.localCharacter.data.currentItem == (Object)(object)item)
{
Player.localPlayer.EmptySlot(Character.localCharacter.refs.items.currentSelectedSlot);
}
item.ClearDataFromBackpack();
PhotonNetwork.Destroy(((Component)this).gameObject);
}
}
public static class ItemSpawnHelper
{
public static GameObject? SpawnStone(string prefabId, Vector3 pos, Quaternion rot, bool startSleeping = true)
{
//IL_0050: 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)
//IL_00ae: 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 (!PhotonNetwork.IsMasterClient)
{
ModLogger.LogWarning("[Stones] Aborting SpawnStone: Only the Master Client should spawn networked stones.");
return null;
}
if (string.IsNullOrEmpty(prefabId))
{
ModLogger.LogError("[Stones] SpawnStone called with null/empty prefabId.");
return null;
}
string modId = Plugin.ModId;
string text = "0_Items/" + modId + ":" + prefabId;
object[] array = new object[1] { startSleeping };
GameObject val = PhotonNetwork.Instantiate(text, pos, rot, (byte)0, array);
if ((Object)(object)val == (Object)null)
{
ModLogger.LogError("[Stones] PhotonNetwork.Instantiate returned null - '" + text + "' not registered. Did PEAKLib.ItemsPlugin.RegisterContent run for this tier before this call?");
return null;
}
Item component = val.GetComponent<Item>();
if ((Object)(object)component == (Object)null)
{
ModLogger.LogWarning("[Stones] Spawned '" + prefabId + "' has no Item component - pickup/throw won't work.");
return val;
}
component.itemState = (ItemState)0;
component.SetKinematicNetworked(false, pos, rot);
return val;
}
public static GameObject? SpawnRandomStone(Vector3 pos, Quaternion rot)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
return SpawnRandomFromTiers(Plugin.StoneTiers, pos, rot);
}
public static GameObject? SpawnRandomStormStone(Vector3 pos, Quaternion rot)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
return SpawnRandomFromTiers(Plugin.StormStoneTiers, pos, rot);
}
private static GameObject? SpawnRandomFromTiers(StonesItem[] tiers, Vector3 pos, Quaternion rot)
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
if (tiers.Length <= 1)
{
ModLogger.LogError("[Stones] No stone tiers registered - cannot spawn random stone.");
return null;
}
StonesItem stonesItem = tiers[Random.Range(1, tiers.Length)];
return SpawnStone(stonesItem.PrefabName, pos, rot);
}
public static void LogSpawned(string label, GameObject go, Vector3 pos)
{
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
Item component = go.GetComponent<Item>();
Rigidbody component2 = go.GetComponent<Rigidbody>();
Collider component3 = go.GetComponent<Collider>();
PhotonView component4 = go.GetComponent<PhotonView>();
StoneBehavior component5 = go.GetComponent<StoneBehavior>();
ModLogger.LogDebug("[Stones] " + label + " spawned:\n Name: " + ((Object)go).name + "\n" + $" Position: {pos}\n" + " PhotonView: " + (((Object)(object)component4 != (Object)null) ? $"yes(viewID={component4.ViewID})" : "MISSING") + "\n Item: " + (((Object)(object)component != (Object)null) ? $"yes(state={component.itemState}, itemID={component.itemID})" : "MISSING") + "\n Rigidbody: " + (((Object)(object)component2 != (Object)null) ? $"yes(mass={component2.mass:F2})" : "MISSING") + "\n Collider: " + (((Object)(object)component3 != (Object)null) ? ((object)component3).GetType().Name : "MISSING") + "\n StoneBehavior: " + (((Object)(object)component5 != (Object)null) ? "yes" : "MISSING") + "\n" + $" IsMasterClient: {PhotonNetwork.IsMasterClient}");
}
}
public static class Localization
{
private const int LocaleCount = 13;
private const string KeyPebble = "NAME_PEBBLE";
private const string KeyRock = "NAME_ROCK";
private const string KeyBoulder = "NAME_BOULDER";
private const string KeyLargeBoulder = "NAME_100-POUNDER";
private const string KeyImpactGrenade = "NAME_IMPACT GRENADE";
public static void CILocalization()
{
AddEntry("NAME_PEBBLE", "Pebble", "Pebble", "Pebble", "Pebble", "Pebble", "Pebble", "Pebble", "Pebble", "Pebble", "Pebble", "Pebble", "Pebble", "Pebble");
AddEntry("NAME_ROCK", "Rock", "Rock", "Rock", "Rock", "Rock", "Rock", "Rock", "Rock", "Rock", "Rock", "Rock", "Rock", "Rock");
AddEntry("NAME_BOULDER", "Boulder", "Boulder", "Boulder", "Boulder", "Boulder", "Boulder", "Boulder", "Boulder", "Boulder", "Boulder", "Boulder", "Boulder", "Boulder");
AddEntry("NAME_100-POUNDER", "100-Pounder", "100-Pounder", "100-Pounder", "100-Pounder", "100-Pounder", "100-Pounder", "100-Pounder", "100-Pounder", "100-Pounder", "100-Pounder", "100-Pounder", "100-Pounder", "100-Pounder");
AddEntry("NAME_IMPACT GRENADE", "Impact Grenade", "Impact Grenade", "Impact Grenade", "Impact Grenade", "Impact Grenade", "Impact Grenade", "Impact Grenade", "Impact Grenade", "Impact Grenade", "Impact Grenade", "Impact Grenade", "Impact Grenade", "Impact Grenade");
Plugin.logger.LogInfo((object)"[Stones] Localization injection complete (keys: NAME_PEBBLE, NAME_ROCK, NAME_BOULDER, NAME_100-POUNDER).");
}
private static void AddEntry(string key, params string[] localeStrings)
{
if (!LocalizedText.mainTable.ContainsKey(key))
{
if (localeStrings.Length != 13)
{
ModLogger.LogError("[Stones] Localization for '" + key + "' has " + $"{localeStrings.Length} entries, expected {13}. " + "Skipped to avoid corrupting the locale table.");
}
else
{
LocalizedText.mainTable.Add(key, new List<string>(localeStrings));
}
}
}
}
[RequireComponent(typeof(PhotonView))]
public class MapStoneBehavior : MonoBehaviourPun
{
private void Start()
{
object[] instantiationData = ((MonoBehaviourPun)this).photonView.InstantiationData;
bool flag = default(bool);
int num;
if (instantiationData != null && instantiationData.Length != 0)
{
object obj = instantiationData[0];
if (obj is bool)
{
flag = (bool)obj;
num = 1;
}
else
{
num = 0;
}
}
else
{
num = 0;
}
if (((uint)num & (flag ? 1u : 0u)) != 0)
{
Rigidbody component = ((Component)this).GetComponent<Rigidbody>();
if ((Object)(object)component != (Object)null)
{
component.isKinematic = true;
}
}
}
}
public static class ModLogger
{
private static bool ShouldLog(LogLevel level)
{
if (!StonesConfig.EnableDebugLogging.Value)
{
return false;
}
return StonesConfig.MinLogLevel.Value <= level;
}
public static void LogDebug(object message)
{
if (StonesConfig.MinLogLevel.Value <= LogLevel.Debug)
{
Plugin.logger.LogDebug(message);
}
}
public static void LogInfo(object message)
{
if (StonesConfig.MinLogLevel.Value <= LogLevel.Info)
{
Plugin.logger.LogInfo(message);
}
}
public static void LogWarning(object message)
{
if (StonesConfig.MinLogLevel.Value <= LogLevel.Warning)
{
Plugin.logger.LogWarning(message);
}
}
public static void LogError(object message)
{
if (StonesConfig.MinLogLevel.Value <= LogLevel.Error)
{
Plugin.logger.LogError(message);
}
}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("q4y.Stones", "Stones", "0.1.2")]
public class Plugin : BaseUnityPlugin
{
private const string HarmonyId = "q4y.Stones";
private const string BundleFileName = "stones.peakbundle";
internal static readonly StonesItem[] StoneTiers = new StonesItem[4]
{
new StonesItem("PebbleContent", "Item_Small_Stone"),
new StonesItem("RockContent", "Item_Medium_Stone"),
new StonesItem("BoulderContent", "Item_Big_Stone"),
new StonesItem("LargeBoulderContent", "Item_Very_Big_Stone")
};
internal static readonly StonesItem[] StormStoneTiers = new StonesItem[4]
{
new StonesItem("StormPebbleContent", "Item_Small_Storm_Stone"),
new StonesItem("StormRockContent", "Item_Medium_Storm_Stone"),
new StonesItem("StormBoulderContent", "Item_Big_Storm_Stone"),
new StonesItem("StormLargeBoulderContent", "Item_Very_Big_Storm_Stone")
};
internal static readonly StonesItem[] OtherItems = new StonesItem[2]
{
new StonesItem("GrenadeContent", "Item_Grenade"),
new StonesItem("ExplosionContent", "Explosion")
};
public const string Id = "q4y.Stones";
internal static ManualLogSource logger { get; private set; } = null;
internal static string ModId { get; private set; } = null;
public static PeakBundle peakBundle { get; private set; } = null;
public static string Name => "Stones";
public static string Version => "0.1.2";
private void Awake()
{
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
logger = ((BaseUnityPlugin)this).Logger;
ModId = ((BaseUnityPlugin)this).Info.Metadata.GUID;
logger.LogInfo((object)("Plugin Stones is loaded! (GUID = " + ModId + ")"));
StonesConfig.Bind(((BaseUnityPlugin)this).Config);
Localization.CILocalization();
new Harmony("q4y.Stones").PatchAll(typeof(Plugin).Assembly);
VulcanStormManager.EnsureInstance();
BundleLoader.LoadBundleWithName((BaseUnityPlugin)(object)this, "stones.peakbundle", (Action<PeakBundle>)RegisterStonesContent);
}
private void RegisterStonesContent(PeakBundle peakBundle)
{
Plugin.peakBundle = peakBundle;
ModLogger.LogInfo("[Stones] Registering stone content from 'stones.peakbundle'...");
ProcessTierList(StoneTiers, delegate(UnityItemContent content2, string name)
{
AttachBehavior<StoneBehavior>(content2, name);
AttachBehavior<MapStoneBehavior>(content2, name);
});
ProcessTierList(StormStoneTiers, delegate(UnityItemContent content2, string name)
{
AttachBehavior<StoneBehavior>(content2, name);
AttachBehavior<StormStoneBehavior>(content2, name);
});
UnityItemContent content = peakBundle.LoadAsset<UnityItemContent>("ExplosionContent");
AttachBehavior<AutoLightBehavior>(content, "ExplosionContent");
content = peakBundle.LoadAsset<UnityItemContent>("GrenadeContent");
AttachBehavior<GrenadeCookBehavior>(content, "GrenadeContent");
ProcessTierList(OtherItems, delegate
{
});
peakBundle.Mod.RegisterContent();
ModLogger.LogInfo("[Stones] PEAKLib content registration batch complete.");
void ProcessTierList(StonesItem[] tiers, Action<UnityItemContent, string> attachBehaviors)
{
for (int i = 0; i < tiers.Length; i++)
{
StonesItem stonesItem = tiers[i];
UnityItemContent val = peakBundle.LoadAsset<UnityItemContent>(stonesItem.ContentName);
if ((Object)(object)val == (Object)null)
{
ModLogger.LogError("[Stones] UnityItemContent '" + stonesItem.ContentName + "' not found in bundle 'stones.peakbundle'. Re-author the asset in the Unity Editor and re-export the bundle.");
}
else
{
attachBehaviors(val, stonesItem.ContentName);
}
}
}
}
private static void AttachBehavior<T>(UnityItemContent content, string contentName) where T : Component
{
if (!((Object)(object)content == (Object)null))
{
GameObject itemPrefab = content.ItemPrefab;
if ((Object)(object)itemPrefab == (Object)null)
{
ModLogger.LogError("[Stones] UnityItemContent '" + contentName + "' has no ItemPrefab assigned. Re-author the asset in the Unity Editor.");
}
else if ((Object)(object)itemPrefab.GetComponent<T>() == (Object)null)
{
itemPrefab.AddComponent<T>();
ModLogger.LogInfo("[Stones] Attached " + typeof(T).Name + " to '" + contentName + "' ItemPrefab.");
}
}
}
private void Update()
{
if (Input.GetKeyDown((KeyCode)283))
{
HandleF2();
}
if (Input.GetKeyDown((KeyCode)284))
{
HandleF3();
}
if (Input.GetKeyDown((KeyCode)285))
{
HandleF4();
}
}
private void HandleF2()
{
//IL_003c: 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_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//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_0067: 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_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: 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_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
if (!PhotonNetwork.IsMasterClient)
{
return;
}
if ((Object)(object)Player.localPlayer == (Object)null || (Object)(object)Player.localPlayer.character == (Object)null)
{
ModLogger.LogWarning("F2: Local player or character is null - not in a map?");
return;
}
Vector3 center = Player.localPlayer.character.Center;
Vector3 right = ((Component)Player.localPlayer.character).transform.right;
Vector3 val = center + Vector3.up * 1f;
ModLogger.LogInfo("F2 pressed! Spawning one random stone + all four tiers (Pebble, Rock, Boulder, LargeBoulder) in a row...");
Vector3 pos = val + right * -3f;
GameObject val2 = ItemSpawnHelper.SpawnRandomStone(pos, Quaternion.identity);
if ((Object)(object)val2 == (Object)null)
{
ModLogger.LogError("[Stones] SpawnRandomStone returned null - none of the stone tiers are registered by PEAKLib?");
return;
}
ItemSpawnHelper.LogSpawned("F2 (random)", val2, pos);
SpawnStoneRow(val, center, right);
}
private void SpawnStoneRow(Vector3 chestPos, Vector3 playerVektor, Vector3 playerRight)
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: 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_002f: 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)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
float[] array = new float[4] { -2.25f, -0.75f, 0.75f, 2.25f };
for (int i = 0; i < StoneTiers.Length; i++)
{
StonesItem stonesItem = StoneTiers[i];
Vector3 val = chestPos + playerRight * array[i];
ModLogger.LogInfo($"Spawning {stonesItem.PrefabName} at: {val}");
GameObject val2 = ItemSpawnHelper.SpawnStone(stonesItem.PrefabName, val, Quaternion.identity);
if ((Object)(object)val2 == (Object)null)
{
ModLogger.LogError("[Stones] SpawnStone returned null - '" + stonesItem.PrefabName + "' not registered by PEAKLib?");
}
else
{
ItemSpawnHelper.LogSpawned("F2 (row: " + stonesItem.PrefabName + ")", val2, val);
}
}
}
private void HandleF4()
{
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: 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_003c: 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_0052: Unknown result type (might be due to invalid IL or missing references)
if (PhotonNetwork.IsMasterClient)
{
if ((Object)(object)Player.localPlayer != (Object)null && (Object)(object)Player.localPlayer.character != (Object)null)
{
Vector3 center = Player.localPlayer.character.Center;
ModLogger.LogInfo($"[Stones] DEBUG F4: Player Center is exactly at X={center.x:F2}, Y={center.y:F2}, Z={center.z:F2}");
}
else if ((Object)(object)Camera.main != (Object)null)
{
Vector3 position = ((Component)Camera.main).transform.position;
ModLogger.LogInfo($"[Stones] DEBUG F4: Camera is exactly at X={position.x:F2}, Y={position.y:F2}, Z={position.z:F2}");
}
}
}
private void HandleF3()
{
if (PhotonNetwork.IsMasterClient)
{
if (!StonesConfig.EnableVolcanoEvent.Value)
{
ModLogger.LogInfo("F3: forcing a volcanic outbreak for debugging even though EnableVolcanoEvent is false.");
}
VulcanStormManager vulcanStormManager = VulcanStormManager.EnsureInstance();
ModLogger.LogInfo("F3 pressed: forcing the volcanic outbreak immediately for debugging.");
vulcanStormManager.StartVulcanOutbreak();
}
}
}
internal readonly struct StonesItem
{
public readonly string ContentName;
public readonly string PrefabName;
public StonesItem(string contentName, string prefabName)
{
ContentName = contentName;
PrefabName = prefabName;
}
}
[HarmonyPatch(typeof(Campfire), "Light_Rpc")]
public static class CampfireRetryScatterPatch
{
[HarmonyPostfix]
public static void Postfix(bool updateSegment, Campfire __instance)
{
if (PhotonNetwork.IsMasterClient && updateSegment && (Object)(object)MapStoneSpawner.Instance != (Object)null)
{
((MonoBehaviour)MapStoneSpawner.Instance).StartCoroutine(MapStoneSpawner.Instance.DelayedRetryQueue());
}
}
}
[DisallowMultipleComponent]
[AddComponentMenu("Stones/Map Stone Spawner")]
public class MapStoneSpawner : MonoBehaviourPunCallbacks
{
[Header("Spawn Volume")]
public float mapMinX = -175f;
public float mapMaxX = 175f;
public float mapMinZ = -300f;
public float mapMaxZ = 2500f;
[Header("Bounds")]
public float lobbyExclusionRadius = 25f;
[Min(0f)]
public int maxExclusionRetries = 8;
[Header("Raycast")]
public float skySpawnHeight = 4000f;
public float raycastMaxDistance = 5000f;
public LayerMask groundLayerMask;
public QueryTriggerInteraction triggerInteraction = (QueryTriggerInteraction)1;
public float groundOffset = 0.01f;
[Header("Performance")]
[Min(1f)]
public int spawnsPerFrame = 5;
public static bool _hasSpawnedThisRun;
private List<Vector2> pendingSpawns = new List<Vector2>();
public static MapStoneSpawner? Instance { get; private set; }
private void Awake()
{
//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)
Instance = this;
groundLayerMask = BuildDefaultGroundMask();
}
private void OnDestroy()
{
ModLogger.LogDebug("[Stones] MapStoneSpawner destroyed.");
if ((Object)(object)Instance == (Object)(object)this)
{
Instance = null;
}
}
public override void OnEnable()
{
((MonoBehaviourPunCallbacks)this).OnEnable();
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
}
public override void OnLeftRoom()
{
_hasSpawnedThisRun = false;
pendingSpawns.Clear();
}
public void InitializeSpawnQueue()
{
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
if (!PhotonNetwork.IsMasterClient)
{
return;
}
pendingSpawns.Clear();
float num = lobbyExclusionRadius * lobbyExclusionRadius;
int value = StonesConfig.MaxStones.Value;
for (int i = 0; i < value; i++)
{
float num2 = 0f;
float num3 = 0f;
bool flag = false;
int num4 = 1 + Mathf.Max(0, maxExclusionRetries);
for (int j = 0; j < num4; j++)
{
num2 = Random.Range(mapMinX, mapMaxX);
num3 = Random.Range(mapMinZ, mapMaxZ);
if (num2 * num2 + num3 * num3 >= num)
{
flag = true;
break;
}
}
if (flag)
{
pendingSpawns.Add(new Vector2(num2, num3));
}
}
ModLogger.LogDebug($"[Stones] Queued {pendingSpawns.Count} stone locations.");
((MonoBehaviour)this).StartCoroutine(ProcessPendingSpawns());
}
public IEnumerator ProcessPendingSpawns()
{
if (!PhotonNetwork.IsMasterClient || pendingSpawns.Count == 0)
{
yield break;
}
List<Vector2> stillPending = new List<Vector2>();
int successfulThisBatch = 0;
Vector3 val2 = default(Vector3);
RaycastHit val3 = default(RaycastHit);
for (int i = 0; i < pendingSpawns.Count; i++)
{
Vector2 val = pendingSpawns[i];
((Vector3)(ref val2))..ctor(val.x, skySpawnHeight, val.y);
if (Physics.Raycast(val2, Vector3.down, ref val3, raycastMaxDistance, ((LayerMask)(ref groundLayerMask)).value, triggerInteraction))
{
Vector3 pos = ((RaycastHit)(ref val3)).point + Vector3.up * groundOffset;
if ((Object)(object)ItemSpawnHelper.SpawnRandomStone(pos, Random.rotation) != (Object)null)
{
successfulThisBatch++;
}
}
else
{
stillPending.Add(val);
}
if (spawnsPerFrame > 0 && (i + 1) % spawnsPerFrame == 0)
{
yield return null;
}
}
pendingSpawns = stillPending;
ModLogger.LogInfo($"[Stones] Spawned {successfulThisBatch} stones this batch. {pendingSpawns.Count} waiting for unloaded chunks.");
}
public IEnumerator DelayedRetryQueue()
{
ModLogger.LogInfo("[Stones] Waiting 3s for new chunks to load before retrying stone spawns...");
yield return (object)new WaitForSeconds(10f);
yield return ((MonoBehaviour)this).StartCoroutine(ProcessPendingSpawns());
}
private void OnValidate()
{
int value = StonesConfig.MaxStones.Value;
if (value < 0)
{
value = 0;
}
if (lobbyExclusionRadius < 0f)
{
lobbyExclusionRadius = 0f;
}
if (maxExclusionRetries < 0)
{
maxExclusionRetries = 0;
}
if (skySpawnHeight < 0f)
{
skySpawnHeight = 0f;
}
if (groundOffset < 0f)
{
groundOffset = 0f;
}
if (raycastMaxDistance < 0f)
{
raycastMaxDistance = 0f;
}
if (spawnsPerFrame < 1)
{
spawnsPerFrame = 1;
}
if (mapMinX > mapMaxX)
{
float num = mapMaxX;
float num2 = mapMinX;
mapMinX = num;
mapMaxX = num2;
}
if (mapMinZ > mapMaxZ)
{
float num2 = mapMaxZ;
float num = mapMinZ;
mapMinZ = num2;
mapMaxZ = num;
}
}
private static LayerMask BuildDefaultGroundMask()
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
return LayerMask.op_Implicit(LayerMask.GetMask(new string[2] { "Terrain", "Map" }));
}
}
[HarmonyPatch(typeof(RunManager))]
public static class RunManagerStoneScatterPatches
{
[HarmonyPatch("StartRun")]
[HarmonyPostfix]
public static void StartRun_Postfix()
{
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Expected O, but got Unknown
if (!PhotonNetwork.IsMasterClient)
{
return;
}
if (MapStoneSpawner._hasSpawnedThisRun)
{
ModLogger.LogInfo("[Stones] RunStart_StoneScatter_Patch: scatter already fired for this run, skipping duplicate RunManager.StartRun call.");
return;
}
MapStoneSpawner._hasSpawnedThisRun = true;
MapStoneSpawner mapStoneSpawner = MapStoneSpawner.Instance;
if ((Object)(object)mapStoneSpawner == (Object)null)
{
GameObject val = new GameObject("MapStoneSpawner (RunStart)");
Object.DontDestroyOnLoad((Object)(object)val);
mapStoneSpawner = val.AddComponent<MapStoneSpawner>();
}
if ((Object)(object)mapStoneSpawner == (Object)null)
{
MapStoneSpawner._hasSpawnedThisRun = false;
ModLogger.LogError("[Stones] RunStart_StoneScatter_Patch: failed to create MapStoneSpawner host GameObject; scatter aborted for this run.");
}
else
{
mapStoneSpawner.InitializeSpawnQueue();
ModLogger.LogInfo("[Stones] RunStart_StoneScatter_Patch: triggered queue initialization " + $"(host='{((Object)mapStoneSpawner).name}', totalStones={StonesConfig.MaxStones.Value}, " + $"X=[{mapStoneSpawner.mapMinX}..{mapStoneSpawner.mapMaxX}] m, " + $"Z=[{mapStoneSpawner.mapMinZ}..{mapStoneSpawner.mapMaxZ}] m).");
}
}
[HarmonyPatch("EndGame")]
[HarmonyPostfix]
public static void EndGame_Postfix()
{
if (MapStoneSpawner._hasSpawnedThisRun)
{
ModLogger.LogInfo("[Stones] RunEnd_StoneScatter_FlagReset_Patch: RunManager.EndGame fired — resetting scatter flag for next run.");
MapStoneSpawner._hasSpawnedThisRun = false;
}
}
}
[RequireComponent(typeof(PhotonView))]
public class StoneBehavior : MonoBehaviourPun
{
private float lastHitTime = -1f;
private void OnCollisionEnter(Collision collision)
{
//IL_0012: 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_0066: Unknown result type (might be due to invalid IL or missing references)
Item component = ((Component)this).GetComponent<Item>();
if ((Object)(object)component == (Object)null || (int)component.itemState != 0)
{
return;
}
Bodypart component2 = collision.gameObject.GetComponent<Bodypart>();
if ((Object)(object)component2 == (Object)null)
{
return;
}
Character componentInParent = ((Component)component2).GetComponentInParent<Character>();
if ((Object)(object)componentInParent == (Object)null || Time.time - lastHitTime < 1f)
{
return;
}
lastHitTime = Time.time;
Vector3 relativeVelocity = collision.relativeVelocity;
float magnitude = ((Vector3)(ref relativeVelocity)).magnitude;
if (((MonoBehaviourPun)componentInParent).photonView.IsMine)
{
float num = component.CarryWeight;
if (num <= 4f)
{
return;
}
float num2 = Mathf.Clamp01(num / 20f);
float num3 = Mathf.InverseLerp(10f, 25f, magnitude);
float num4 = num3 * num2 * 0.3f;
if (num4 > 0f)
{
try
{
componentInParent.refs.afflictions.AddStatus((STATUSTYPE)0, num4, false, true, true);
ModLogger.LogInfo("[Stone] Injury -> victim='" + componentInParent.characterName + "', " + $"weight={num:F2}, speed={magnitude:F2}m/s, " + $"stoneFactor={num2:F3}, amount={num4:F3}.");
}
catch (Exception ex)
{
ModLogger.LogError("[Stone] AddStatus threw " + ex.GetType().Name + ": " + ex.Message);
}
}
}
if (PhotonNetwork.IsMasterClient)
{
((MonoBehaviourPun)this).photonView.RPC("PlayImpactVisuals", (RpcTarget)3, new object[1] { magnitude });
}
}
[PunRPC]
private void PlayImpactVisuals(float impactSpeed, PhotonMessageInfo info)
{
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
ModLogger.LogInfo($"[Stone] PlayImpactVisuals - speed={impactSpeed:F2}m/s, " + $"sender={info.Sender.ActorNumber}, " + $"IsMasterClient={PhotonNetwork.IsMasterClient}, " + "ItemState=" + GetItemStateString());
}
private string GetItemStateString()
{
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
Item component = ((Component)this).GetComponent<Item>();
if (!((Object)(object)component != (Object)null))
{
return "(no Item)";
}
return ((object)component.itemState/*cast due to .constrained prefix*/).ToString();
}
}
public enum LogLevel
{
Debug,
Info,
Warning,
Error,
None
}
public static class StonesConfig
{
public static ConfigEntry<bool> EnableDebugLogging { get; private set; }
public static ConfigEntry<bool> EnableDebug { get; private set; }
public static ConfigEntry<LogLevel> MinLogLevel { get; private set; }
public static ConfigEntry<int> MaxStones { get; private set; }
public static ConfigEntry<int> VolcanoMaxStones { get; private set; }
public static ConfigEntry<bool> EnableVolcanoEvent { get; private set; }
public static ConfigEntry<float> VulcanOutbreakChance { get; private set; }
public static ConfigEntry<int> VulcanStoneBurstCount { get; private set; }
public static ConfigEntry<float> StoneRainDropRate { get; private set; }
public static void Bind(ConfigFile config)
{
EnableDebugLogging = config.Bind<bool>("Debug", "EnableLogging", true, "If true, enables detailed debug logging in the console.");
EnableDebug = config.Bind<bool>("Debug", "EnableDebug", true, "If true, enables debug commands.");
MinLogLevel = config.Bind<LogLevel>("Debug", "MinimumLogLevel", LogLevel.None, "Minimum severity level of logs to display in the console. Options: Debug, Info, Warning, Error, None.");
MaxStones = config.Bind<int>("1. Spawning", "MaxStones", 700, "The maximum number of items allowed in the world.");
EnableVolcanoEvent = config.Bind<bool>("2. Events", "EnableVolcanoEvent", true, "Set to true to allow the volcanic outbreak hijack.");
VolcanoMaxStones = config.Bind<int>("2. Events", "VolcanoMaxStones", 30, "The maximum number of items allowed in a volcanic outbreak.");
VulcanOutbreakChance = config.Bind<float>("2. Events", "VulcanOutbreakChance", 1f, "Chance for a normal storm start to become a volcanic outbreak.");
VulcanStoneBurstCount = config.Bind<int>("2. Events", "VulcanStoneBurstCount", 5, "How many stones to burst into the sky when the outbreak starts.");
StoneRainDropRate = config.Bind<float>("2. Events", "StoneRainDropRate", 2f, "Legacy setting kept for compatibility with the old coroutine path.");
}
}
public class StormStoneBehavior : MonoBehaviour
{
private Rigidbody? rb;
private Item? itemComponent;
private Breakable? breakableComponent;
private PhotonView? view;
private float lifeTimer;
private float maxLife = 25f;
private float gracePeriod = 2f;
private float tumbleSpeed = 15f;
private void Awake()
{
rb = ((Component)this).GetComponent<Rigidbody>();
itemComponent = ((Component)this).GetComponent<Item>();
breakableComponent = ((Component)this).GetComponent<Breakable>();
view = ((Component)this).GetComponent<PhotonView>();
if ((Object)(object)itemComponent != (Object)null)
{
itemComponent.blockInteraction = true;
}
if ((Object)(object)breakableComponent != (Object)null)
{
breakableComponent.breakOnCollision = false;
((Behaviour)breakableComponent).enabled = false;
}
MonoBehaviour[] componentsInChildren = ((Component)this).GetComponentsInChildren<MonoBehaviour>(true);
MonoBehaviour[] array = componentsInChildren;
foreach (MonoBehaviour val in array)
{
if (!((Object)(object)val == (Object)null))
{
string text = ((object)val).GetType().Name.ToLowerInvariant();
if (text.Contains("break") || text.Contains("damage"))
{
((Behaviour)val).enabled = false;
}
}
}
}
private void Start()
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
if (PhotonNetwork.IsMasterClient && (Object)(object)rb != (Object)null)
{
rb.angularVelocity = Random.insideUnitSphere * tumbleSpeed;
}
}
private void Update()
{
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
if (!PhotonNetwork.IsMasterClient)
{
return;
}
lifeTimer += Time.deltaTime;
if (lifeTimer >= maxLife)
{
Despawn();
}
else if (lifeTimer >= gracePeriod && (Object)(object)rb != (Object)null)
{
Vector3 linearVelocity = rb.linearVelocity;
if (((Vector3)(ref linearVelocity)).sqrMagnitude < 0.1f)
{
Despawn();
}
}
}
private void Despawn()
{
if ((Object)(object)view != (Object)null && view.IsMine)
{
PhotonNetwork.Destroy(((Component)this).gameObject);
}
else if ((Object)(object)view == (Object)null)
{
Object.Destroy((Object)(object)((Component)this).gameObject);
}
}
}
[HarmonyPatch(typeof(WindChillZone), "RPCA_ToggleWind")]
public static class WindChillZone_VulcanHijack_Patch
{
[HarmonyPrefix]
public static bool Prefix(bool set, Vector3 windDir, float untilSwitch, WindChillZone __instance)
{
if (!StonesConfig.EnableVolcanoEvent.Value)
{
return true;
}
VulcanStormManager.EnsureInstance();
if (!set)
{
VulcanStormManager.Instance?.StopVulcanOutbreak();
return true;
}
if (PhotonNetwork.IsMasterClient)
{
if (Random.value <= StonesConfig.VulcanOutbreakChance.Value)
{
ModLogger.LogInfo("[Vulcan] Hijacked storm start. Launching volcanic outbreak.");
VulcanStormManager.Instance?.StartVulcanOutbreak();
return false;
}
}
else if ((Object)(object)VulcanStormManager.Instance != (Object)null && VulcanStormManager.Instance.IsVulcanOutbreakActive)
{
return false;
}
Traverse.Create((object)WindChillZone.instance).Field("untilSwitch").SetValue((object)(-1f));
return true;
}
}
[HarmonyPatch(typeof(WindChillZone), "ApplyStatus")]
public static class WindChillZone_VulcanStatus_Patch
{
private static bool s_loggedMissingBurnStatus;
[HarmonyPrefix]
public static bool Prefix(Character character, WindChillZone __instance)
{
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
if (!StonesConfig.EnableVolcanoEvent.Value)
{
return true;
}
VulcanStormManager instance = VulcanStormManager.Instance;
if ((Object)(object)instance == (Object)null)
{
return true;
}
if (!instance.IsVulcanOutbreakActive)
{
return true;
}
float num = Mathf.Clamp01(__instance.windIntensity);
float climbingStamMinimumMultiplier = Mathf.Max(__instance.grabStaminaMultiplierDuringWind * num * 4f, 1f);
character.refs.climbing.climbingStamMinimumMultiplier = climbingStamMinimumMultiplier;
if (TryGetVulcanStatusType(out var statusType))
{
float num2 = num * __instance.statusApplicationPerSecond * Time.deltaTime * 2f;
character.refs.afflictions.AddStatus(statusType, num2, false, true, true);
}
else if (!s_loggedMissingBurnStatus)
{
s_loggedMissingBurnStatus = true;
ModLogger.LogWarning("[Vulcan] No burn-like status enum found. The outbreak will only increase wind strain and skip the custom affliction.");
}
return false;
}
private static bool TryGetVulcanStatusType(out STATUSTYPE statusType)
{
string[] array = new string[4] { "Burning", "Burn", "Heat", "Fire" };
string[] array2 = array;
foreach (string value in array2)
{
if (Enum.TryParse<STATUSTYPE>(value, ignoreCase: true, out statusType))
{
return true;
}
}
statusType = (STATUSTYPE)0;
return false;
}
}
public static class VolcanoEvent
{
private struct AtmosphereState
{
public Color OriginalAmbient;
public Color OriginalFogColor;
public float OriginalFogDensity;
public Color OriginalSunColor;
public float OriginalSunIntensity;
public bool OriginalFog;
}
private const float FadeInDuration = 5f;
private const float FadeOutDuration = 5f;
private const float ShakeDuration = 2f;
private const float ShakeMagnitude = 2f;
private const float BuildupDelay = 5f;
private const float RainRadiusXZ = 10f;
private const float RainHeightOffset = 70f;
private static readonly Color StormAmbient = new Color(0.35f, 0.08f, 0.08f, 1f);
private static readonly Color StormFogColor = new Color(0.45f, 0.05f, 0.05f, 1f);
private const float StormFogDensity = 0.16f;
private static readonly Color StormSunColor = new Color(1f, 0.45f, 0.15f, 1f);
private const float StormSunIntensity = 1.5f;
private static VolcanoVisuals? visualEnforcer;
public static IEnumerator Run()
{
float startTime = Time.time;
Plugin.logger.LogInfo((object)$"[Volcano] === EVENT START === Current Time: {startTime:F2}");
Plugin.logger.LogInfo((object)"[Volcano] Creating VolcanoVisualEnforcer GameObject...");
GameObject enforcerObject = new GameObject("VolcanoVisualEnforcer");
visualEnforcer = enforcerObject.AddComponent<VolcanoVisuals>();
Plugin.logger.LogInfo((object)"[Volcano] Setting up AudioSource for Au_Fire_Loop...");
AudioSource val = enforcerObject.AddComponent<AudioSource>();
val.spatialBlend = 0f;
val.loop = true;
val.volume = 0.1f;
AudioSource val2 = enforcerObject.AddComponent<AudioSource>();
val2.spatialBlend = 0f;
val2.loop = false;
val2.volume = 0.4f;
AudioClip val3 = Plugin.peakBundle.LoadAsset<AudioClip>("Au_Fire_Loop");
AudioClip val4 = Plugin.peakBundle.LoadAsset<AudioClip>("Au_Explosion_Debris");
if ((Object)(object)val3 != (Object)null)
{
val.clip = val3;
val.Play();
Plugin.logger.LogInfo((object)"[Volcano] Successfully loaded and playing Au_Fire_Loop from bundle.");
}
if ((Object)(object)val4 != (Object)null)
{
val2.clip = val4;
val2.Play();
Plugin.logger.LogInfo((object)"[Volcano] Successfully loaded and playing Au_Explosion_Debris from bundle.");
}
Light sun = FindMainDirectionalLight();
visualEnforcer.sun = sun;
visualEnforcer.enforceEnvironment = true;
Plugin.logger.LogInfo((object)("[Volcano] Enforcer attached and initialized. Sun reference: " + (((Object)(object)sun != (Object)null) ? ((Object)sun).name : "null")));
AtmosphereState state = CaptureAtmosphere(sun);
Plugin.logger.LogInfo((object)$"[Volcano] Captured original atmosphere state (Fog enabled: {state.OriginalFog}, Fog Density: {state.OriginalFogDensity:F3})");
Plugin.logger.LogInfo((object)$"[Volcano] Phase 1 (Fade In) starting. Expected duration: {5f}s");
yield return FadeEnvironment(sun, StormAmbient, StormFogColor, 0.16f, StormSunColor, 1.5f, 5f);
Plugin.logger.LogInfo((object)$"[Volcano] Phase 1 completed. (Elapsed: {Time.time - startTime:F2}s)");
float shakeStart = Time.time;
Plugin.logger.LogInfo((object)$"[Volcano] Phase 2 (Camera Shake) starting. Duration: {2f}s, Magnitude: {2f}");
yield return ShakeCamera(2f, 2f);
Plugin.logger.LogInfo((object)$"[Volcano] Phase 2 completed. (Phase Duration: {Time.time - shakeStart:F2}s)");
float delayStart = Time.time;
Plugin.logger.LogInfo((object)$"[Volcano] Phase 3 (Buildup Delay) starting. Holding for {5f}s...");
yield return (object)new WaitForSeconds(5f);
Plugin.logger.LogInfo((object)$"[Volcano] Phase 3 completed. (Phase Duration: {Time.time - delayStart:F2}s)");
float rainStart = Time.time;
Plugin.logger.LogInfo((object)$"[Volcano] Phase 4 (Stone Rain) starting. Target drops: {StonesConfig.VolcanoMaxStones.Value}");
float dropRate = 0.8f;
try
{
dropRate = StonesConfig.StoneRainDropRate.Value;
}
catch (Exception ex)
{
Plugin.logger.LogError((object)("[Volcano] Error reading StonesConfig.StoneRainDropRate: " + ex.Message));
}
Plugin.logger.LogInfo((object)$"[Volcano] Drop Interval: {dropRate}s");
if (dropRate <= 0.1f)
{
dropRate = 0.5f;
Plugin.logger.LogWarning((object)$"[Volcano] Drop rate was under safe threshold! Forcing to {dropRate}s.");
}
int burstCount = Mathf.Max(1, StonesConfig.VulcanStoneBurstCount.Value);
int ItemsToDrop = StonesConfig.VolcanoMaxStones.Value;
for (int i = 0; i < ItemsToDrop; i += burstCount)
{
SpawnVulcanStoneBurst();
yield return (object)new WaitForSeconds(dropRate);
}
Plugin.logger.LogInfo((object)$"[Volcano] Phase 4 completed. (Phase Duration: {Time.time - rainStart:F2}s)");
float fadeOutStart = Time.time;
Plugin.logger.LogInfo((object)$"[Volcano] Phase 5 (Fade Out) starting. Expected duration: {5f}s");
yield return FadeEnvironment(sun, state.OriginalAmbient, state.OriginalFogColor, state.OriginalFogDensity, state.OriginalSunColor, state.OriginalSunIntensity, 5f);
Plugin.logger.LogInfo((object)$"[Volcano] Phase 5 completed. (Phase Duration: {Time.time - fadeOutStart:F2}s)");
Plugin.logger.LogInfo((object)"[Volcano] Cleaning up enforcer object...");
if ((Object)(object)enforcerObject != (Object)null)
{
Object.Destroy((Object)(object)enforcerObject);
visualEnforcer = null;
}
RenderSettings.fog = state.OriginalFog;
Plugin.logger.LogInfo((object)$"[Volcano] === EVENT COMPLETE === Total Time Elapsed: {Time.time - startTime:F2}s");
}
private static Vector3 ComputeBurstSpawnPosition(Vector3 playerCenter)
{
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//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)
float num = Random.Range(-6f, 6f);
float num2 = Random.Range(-6f, 6f);
return playerCenter + new Vector3(num, 18f, num2);
}
private static void SpawnVulcanStoneBurst()
{
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: 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_0061: Unknown result type (might be due to invalid IL or missing references)
if (!PhotonNetwork.IsMasterClient)
{
return;
}
int num = Mathf.Max(1, StonesConfig.VulcanStoneBurstCount.Value);
Player[] array = Object.FindObjectsByType<Player>((FindObjectsSortMode)0);
Player[] array2 = array;
foreach (Player val in array2)
{
if ((Object)(object)val == (Object)null || (Object)(object)val.character == (Object)null)
{
continue;
}
for (int j = 0; j < num; j++)
{
Vector3 pos = ComputeBurstSpawnPosition(val.character.Center);
GameObject val2 = ItemSpawnHelper.SpawnRandomStormStone(pos, Random.rotation);
if ((Object)(object)val2 == (Object)null)
{
Plugin.logger.LogWarning((object)$"[Vulcan] Burst stone {j + 1}/{num} failed to spawn.");
}
}
}
}
private static AtmosphereState CaptureAtmosphere(Light? sun)
{
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: 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_0037: 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)
return new AtmosphereState
{
OriginalAmbient = RenderSettings.ambientLight,
OriginalFogColor = RenderSettings.fogColor,
OriginalFogDensity = RenderSettings.fogDensity,
OriginalSunColor = (((Object)(object)sun != (Object)null) ? sun.color : Color.white),
OriginalSunIntensity = (((Object)(object)sun != (Object)null) ? sun.intensity : 1f),
OriginalFog = RenderSettings.fog
};
}
private static IEnumerator FadeEnvironment(Light? sun, Color targetAmbient, Color targetFogColor, float targetFogDensity, Color targetSunColor, float targetSunIntensity, float duration)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: 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_0025: Unknown result type (might be due to invalid IL or missing references)
Color startAmbient = RenderSettings.ambientLight;
Color startFogColor = RenderSettings.fogColor;
float startFogDensity = RenderSettings.fogDensity;
Color startSunColor = (((Object)(object)sun != (Object)null) ? sun.color : Color.white);
float startSunIntensity = (((Object)(object)sun != (Object)null) ? sun.intensity : 1f);
if ((Object)(object)visualEnforcer == (Object)null)
{
ModLogger.LogError("[Volcano] visualEnforcer is NULL inside FadeEnvironment! Aborting fade step.");
yield break;
}
ModLogger.LogInfo($"[Volcano] FadeEnvironment started over {duration:F1}s.");
float elapsed = 0f;
while (elapsed < duration)
{
float num = elapsed / duration;
visualEnforcer.ambient = Color.Lerp(startAmbient, targetAmbient, num);
visualEnforcer.fogColor = Color.Lerp(startFogColor, targetFogColor, num);
visualEnforcer.fogDensity = Mathf.Lerp(startFogDensity, targetFogDensity, num);
visualEnforcer.sunColor = Color.Lerp(startSunColor, targetSunColor, num);
visualEnforcer.sunIntensity = Mathf.Lerp(startSunIntensity, targetSunIntensity, num);
elapsed += Time.deltaTime;
yield return null;
}
visualEnforcer.ambient = targetAmbient;
visualEnforcer.fogColor = targetFogColor;
visualEnforcer.fogDensity = targetFogDensity;
visualEnforcer.sunColor = targetSunColor;
visualEnforcer.sunIntensity = targetSunIntensity;
ModLogger.LogInfo("[Volcano] FadeEnvironment target values locked in.");
}
private static IEnumerator ShakeCamera(float duration, float magnitude)
{
if ((Object)(object)visualEnforcer == (Object)null)
{
ModLogger.LogError("[Volcano] visualEnforcer is NULL inside ShakeCamera! Aborting shake step.");
yield break;
}
ModLogger.LogInfo($"[Volcano] Enabling camera shake on visualEnforcer (mag={magnitude}, duration={duration}s)");
visualEnforcer.shakeMagnitude = magnitude;
visualEnforcer.isShaking = true;
yield return (object)new WaitForSeconds(duration);
ModLogger.LogInfo("[Volcano] Disabling camera shake on visualEnforcer.");
visualEnforcer.isShaking = false;
}
private static Light? FindMainDirectionalLight()
{
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Invalid comparison between Unknown and I4
Light[] array = Object.FindObjectsByType<Light>((FindObjectsInactive)0, (FindObjectsSortMode)0);
Light val = null;
float num = float.NegativeInfinity;
Light[] array2 = array;
foreach (Light val2 in array2)
{
if ((int)val2.type == 1 && ((Behaviour)val2).enabled && val2.intensity > num)
{
val = val2;
num = val2.intensity;
}
}
if ((Object)(object)val == (Object)null)
{
ModLogger.LogWarning("[Volcano] No active directional light found in scene.");
return val;
}
ModLogger.LogInfo($"[Volcano] Found primary directional light: '{((Object)val).name}' (Intensity: {val.intensity})");
return val;
}
}
public class VolcanoVisuals : MonoBehaviour
{
public Light? sun;
public Color ambient;
public Color fogColor;
public Color sunColor;
public float fogDensity;
public float sunIntensity;
private bool _enforceEnvironment;
private bool _isShaking;
public float shakeMagnitude;
private Camera? targetCam;
private Vector3 shakeBaseEuler;
private bool shakeBaseCaptured;
public bool enforceEnvironment
{
get
{
return _enforceEnvironment;
}
set
{
if (_enforceEnvironment != value)
{
ModLogger.LogInfo($"[VolcanoVisuals] enforceEnvironment changed: {_enforceEnvironment} -> {value}");
}
_enforceEnvironment = value;
}
}
public bool isShaking
{
get
{
return _isShaking;
}
set
{
if (_isShaking != value)
{
ModLogger.LogInfo($"[VolcanoVisuals] isShaking changed: {_isShaking} -> {value} (Magnitude: {shakeMagnitude})");
}
_isShaking = value;
}
}
private void Start()
{
targetCam = Camera.main ?? Object.FindAnyObjectByType<Camera>();
if ((Object)(object)targetCam != (Object)null)
{
ModLogger.LogInfo("[VolcanoVisuals] Initialized successfully. Target camera found: '" + ((Object)targetCam).name + "'");
}
else
{
ModLogger.LogWarning("[VolcanoVisuals] Initialized, but NO camera could be found in the scene yet!");
}
if ((Object)(object)sun == (Object)null)
{
ModLogger.LogWarning("[VolcanoVisuals] Warning: Sun light reference is null. Environment sun color/intensity will not be enforced.");
}
}
private void LateUpdate()
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: 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_004d: 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_01f8: Unknown result type (might be due to invalid IL or missing references)
//IL_0204: Unknown result type (might be due to invalid IL or missing references)
//IL_0209: Unknown result type (might be due to invalid IL or missing references)
//IL_0193: Unknown result type (might be due to invalid IL or missing references)
//IL_0198: Unknown result type (might be due to invalid IL or missing references)
//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
if (enforceEnvironment)
{
RenderSettings.ambientLight = ambient;
RenderSettings.fogColor = fogColor;
RenderSettings.fogDensity = fogDensity;
RenderSettings.fog = true;
RenderSettings.fogMode = (FogMode)3;
if ((Object)(object)sun != (Object)null)
{
sun.color = sunColor;
sun.intensity = sunIntensity;
}
Shader.SetGlobalColor("SkyTopColor", new Color(0.2f, 0f, 0f));
Shader.SetGlobalColor("SkyMidColor", new Color(0.8f, 0.3f, 0f));
Shader.SetGlobalColor("SkyBottomColor", new Color(1f, 0.2f, 0f));
Shader.SetGlobalFloat("GlobalWind", 1f);
}
if (!isShaking)
{
if (shakeBaseCaptured && (Object)(object)targetCam != (Object)null)
{
((Component)targetCam).transform.localEulerAngles = shakeBaseEuler;
ModLogger.LogInfo("[VolcanoVisuals] Shake ended. Camera rotation restored to base.");
}
shakeBaseCaptured = false;
return;
}
if ((Object)(object)targetCam == (Object)null)
{
targetCam = Camera.main ?? Object.FindAnyObjectByType<Camera>();
if ((Object)(object)targetCam != (Object)null)
{
ModLogger.LogInfo("[VolcanoVisuals] Target camera re-acquired during shake: '" + ((Object)targetCam).name + "'");
}
}
if ((Object)(object)targetCam == (Object)null)
{
ModLogger.LogWarning("[VolcanoVisuals] Cannot shake camera: targetCam is still null!");
return;
}
if (!shakeBaseCaptured)
{
shakeBaseEuler = ((Component)targetCam).transform.localPosition;
shakeBaseCaptured = true;
ModLogger.LogInfo($"[VolcanoVisuals] Captured base camera position for shake: {shakeBaseEuler}");
}
float num = Random.Range(-1f, 1f) * shakeMagnitude;
float num2 = Random.Range(-1f, 1f) * shakeMagnitude;
((Component)targetCam).transform.localPosition = shakeBaseEuler + new Vector3(num, num2, 0f);
}
private void OnDestroy()
{
ModLogger.LogInfo("[VolcanoVisuals] Component destroyed / cleaned up.");
}
}
[DisallowMultipleComponent]
public sealed class VulcanStormManager : MonoBehaviourPunCallbacks
{
private const string VulcanOutbreakRoomKey = "Stones.VulcanOutbreakActive";
private bool isVulcanOutbreakActive;
public static VulcanStormManager? Instance { get; private set; }
public bool IsVulcanOutbreakActive => isVulcanOutbreakActive;
public static VulcanStormManager EnsureInstance()
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Expected O, but got Unknown
if ((Object)(object)Instance != (Object)null)
{
return Instance;
}
GameObject val = new GameObject("VulcanStormManager");
Object.DontDestroyOnLoad((Object)(object)val);
return val.AddComponent<VulcanStormManager>();
}
private void Awake()
{
if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
{
Object.Destroy((Object)(object)((Component)this).gameObject);
return;
}
Instance = this;
Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
SyncFromRoomProperties();
}
private void OnDestroy()
{
if ((Object)(object)Instance == (Object)(object)this)
{
Instance = null;
}
}
public override void OnJoinedRoom()
{
SyncFromRoomProperties();
}
public override void OnRoomPropertiesUpdate(Hashtable propertiesThatChanged)
{
if (((Dictionary<object, object>)(object)propertiesThatChanged).ContainsKey((object)"Stones.VulcanOutbreakActive"))
{
SyncFromRoomProperties();
}
}
public override void OnLeftRoom()
{
ClearLocalState();
}
public void StartVulcanOutbreak()
{
if (!isVulcanOutbreakActive)
{
isVulcanOutbreakActive = true;
ModLogger.LogInfo("[Vulcan] A volcanic outbreak has begun.");
if (PhotonNetwork.InRoom && PhotonNetwork.IsMasterClient)
{
SetRoomOutbreakState(active: true);
}
((MonoBehaviour)this).StartCoroutine(VolcanoEvent.Run());
}
}
public void StopVulcanOutbreak()
{
if (isVulcanOutbreakActive)
{
isVulcanOutbreakActive = false;
ModLogger.LogInfo("[Vulcan] The volcanic outbreak has cleared.");
if (PhotonNetwork.InRoom && PhotonNetwork.IsMasterClient)
{
SetRoomOutbreakState(active: false);
}
}
}
private void SyncFromRoomProperties()
{
if (PhotonNetwork.InRoom && PhotonNetwork.CurrentRoom != null)
{
object obj = null;
if (((Dictionary<object, object>)(object)((RoomInfo)PhotonNetwork.CurrentRoom).CustomProperties).TryGetValue((object)"Stones.VulcanOutbreakActive", out object value))
{
obj = value;
}
bool flag = default(bool);
int num;
if (obj is bool)
{
flag = (bool)obj;
num = 1;
}
else
{
num = 0;
}
if (((uint)num & (flag ? 1u : 0u)) != 0)
{
StartVulcanOutbreak();
}
else
{
StopVulcanOutbreak();
}
}
}
private void ClearLocalState()
{
isVulcanOutbreakActive = false;
}
private void SetRoomOutbreakState(bool active)
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Expected O, but got Unknown
if (PhotonNetwork.CurrentRoom != null)
{
Hashtable val = new Hashtable { [(object)"Stones.VulcanOutbreakActive"] = active };
PhotonNetwork.CurrentRoom.SetCustomProperties(val, (Hashtable)null, (WebFlags)null);
}
}
}
}
namespace System.Diagnostics.CodeAnalysis
{
[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class ConstantExpectedAttribute : Attribute
{
public object? Min { get; set; }
public object? Max { get; set; }
}
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class ExperimentalAttribute : Attribute
{
public string DiagnosticId { get; }
public string? UrlFormat { get; set; }
public ExperimentalAttribute(string diagnosticId)
{
DiagnosticId = diagnosticId;
}
}
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
[ExcludeFromCodeCoverage]
internal sealed class MemberNotNullAttribute : Attribute
{
public string[] Members { get; }
public MemberNotNullAttribute(string member)
{
Members = new string[1] { member };
}
public MemberNotNullAttribute(params string[] members)
{
Members = members;
}
}
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
[ExcludeFromCodeCoverage]
internal sealed class MemberNotNullWhenAttribute : Attribute
{
public bool ReturnValue { get; }
public string[] Members { get; }
public MemberNotNullWhenAttribute(bool returnValue, string member)
{
ReturnValue = returnValue;
Members = new string[1] { member };
}
public MemberNotNullWhenAttribute(bool returnValue, params string[] members)
{
ReturnValue = returnValue;
Members = members;
}
}
[AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class SetsRequiredMembersAttribute : Attribute
{
}
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class StringSyntaxAttribute : Attribute
{
public const string CompositeFormat = "CompositeFormat";
public const string DateOnlyFormat = "DateOnlyFormat";
public const string DateTimeFormat = "DateTimeFormat";
public const string EnumFormat = "EnumFormat";
public const string GuidFormat = "GuidFormat";
public const string Json = "Json";
public const string NumericFormat = "NumericFormat";
public const string Regex = "Regex";
public const string TimeOnlyFormat = "TimeOnlyFormat";
public const string TimeSpanFormat = "TimeSpanFormat";
public const string Uri = "Uri";
public const string Xml = "Xml";
public string Syntax { get; }
public object?[] Arguments { get; }
public StringSyntaxAttribute(string syntax)
{
Syntax = syntax;
Arguments = new object[0];
}
public StringSyntaxAttribute(string syntax, params object?[] arguments)
{
Syntax = syntax;
Arguments = arguments;
}
}
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class UnscopedRefAttribute : Attribute
{
}
}
namespace System.Runtime.Versioning
{
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class RequiresPreviewFeaturesAttribute : Attribute
{
public string? Message { get; }
public string? Url { get; set; }
public RequiresPreviewFeaturesAttribute()
{
}
public RequiresPreviewFeaturesAttribute(string? message)
{
Message = message;
}
}
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
internal sealed class IgnoresAccessChecksToAttribute : Attribute
{
public IgnoresAccessChecksToAttribute(string assemblyName)
{
}
}
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class CallerArgumentExpressionAttribute : Attribute
{
public string ParameterName { get; }
public CallerArgumentExpressionAttribute(string parameterName)
{
ParameterName = parameterName;
}
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class CollectionBuilderAttribute : Attribute
{
public Type BuilderType { get; }
public string MethodName { get; }
public CollectionBuilderAttribute(Type builderType, string methodName)
{
BuilderType = builderType;
MethodName = methodName;
}
}
[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class CompilerFeatureRequiredAttribute : Attribute
{
public const string RefStructs = "RefStructs";
public const string RequiredMembers = "RequiredMembers";
public string FeatureName { get; }
public bool IsOptional { get; set; }
public CompilerFeatureRequiredAttribute(string featureName)
{
FeatureName = featureName;
}
}
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class InterpolatedStringHandlerArgumentAttribute : Attribute
{
public string[] Arguments { get; }
public InterpolatedStringHandlerArgumentAttribute(string argument)
{
Arguments = new string[1] { argument };
}
public InterpolatedStringHandlerArgumentAttribute(params string[] arguments)
{
Arguments = arguments;
}
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class InterpolatedStringHandlerAttribute : Attribute
{
}
[EditorBrowsable(EditorBrowsableState.Never)]
[ExcludeFromCodeCoverage]
internal static class IsExternalInit
{
}
[AttributeUsage(AttributeTargets.Method, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class ModuleInitializerAttribute : Attribute
{
}
[AttributeUsage(AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class OverloadResolutionPriorityAttribute : Attribute
{
public int Priority { get; }
public OverloadResolutionPriorityAttribute(int priority)
{
Priority = priority;
}
}
[AttributeUsage(AttributeTargets.Parameter, Inherited = true, AllowMultiple = false)]
[ExcludeFromCodeCoverage]
internal sealed class ParamCollectionAttribute : Attribute
{
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class RequiredMemberAttribute : Attribute
{
}
[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[ExcludeFromCodeCoverage]
internal sealed class RequiresLocationAttribute : Attribute
{
}
[AttributeUsage(AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Event | AttributeTargets.Interface, Inherited = false)]
[ExcludeFromCodeCoverage]
internal sealed class SkipLocalsInitAttribute : Attribute
{
}
}