using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
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 HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("zabu")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("zabumod")]
[assembly: AssemblyTitle("zabumod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.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.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]
[Microsoft.CodeAnalysis.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]
[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 REPOJP.AllMapValuables
{
[BepInPlugin("REPOJP.AllMapValuables", "AllMapValuables", "1.0.0")]
public sealed class AllMapValuablesPlugin : BaseUnityPlugin
{
public const string PluginGuid = "REPOJP.AllMapValuables";
public const string PluginName = "AllMapValuables";
public const string PluginVersion = "1.0.0";
internal static AllMapValuablesPlugin Instance;
internal static ManualLogSource Log;
private Harmony harmony;
private ConfigEntry<bool> enableMod;
private ConfigEntry<bool> enableVerboseLog;
private ConfigEntry<bool> fallbackToVanillaOnError;
private readonly Dictionary<string, ConfigEntry<int>> levelWeightConfigs = new Dictionary<string, ConfigEntry<int>>(StringComparer.OrdinalIgnoreCase);
private void Awake()
{
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Expected O, but got Unknown
Instance = this;
Log = ((BaseUnityPlugin)this).Logger;
enableMod = ((BaseUnityPlugin)this).Config.Bind<bool>("A General", "EnableMod", true, "Enable or disable this mod / このMODの有効無効");
enableVerboseLog = ((BaseUnityPlugin)this).Config.Bind<bool>("A General", "EnableVerboseLog", false, "Enable verbose debug log / 詳細デバッグログ有効");
fallbackToVanillaOnError = ((BaseUnityPlugin)this).Config.Bind<bool>("A General", "FallbackToVanillaOnError", true, "Fall back to vanilla valuable generation when an error occurs / エラー時バニラ生成へ自動復帰");
harmony = new Harmony("REPOJP.AllMapValuables");
harmony.PatchAll();
}
private void OnDestroy()
{
if (harmony != null)
{
harmony.UnpatchSelf();
}
}
internal bool IsEnabled()
{
return enableMod != null && enableMod.Value;
}
internal bool IsVerboseLogEnabled()
{
return enableVerboseLog != null && enableVerboseLog.Value;
}
internal bool IsFallbackToVanillaOnErrorEnabled()
{
return fallbackToVanillaOnError != null && fallbackToVanillaOnError.Value;
}
internal void EnsureLevelWeightConfigs()
{
//IL_0147: Unknown result type (might be due to invalid IL or missing references)
//IL_0151: Expected O, but got Unknown
if ((Object)(object)RunManager.instance == (Object)null)
{
return;
}
List<Level> list = new List<Level>();
if (RunManager.instance.levels != null)
{
foreach (Level level in RunManager.instance.levels)
{
if ((Object)(object)level != (Object)null)
{
list.Add(level);
}
}
}
if ((Object)(object)RunManager.instance.levelCurrent != (Object)null && !list.Contains(RunManager.instance.levelCurrent))
{
list.Add(RunManager.instance.levelCurrent);
}
foreach (Level item in list)
{
string levelName = GetLevelName(item);
if (!string.IsNullOrWhiteSpace(levelName) && !IsExcludedLevelName(levelName) && !levelWeightConfigs.ContainsKey(levelName))
{
levelWeightConfigs[levelName] = ((BaseUnityPlugin)this).Config.Bind<int>("B Level Valuable Weights", levelName, 1, new ConfigDescription($"Spawn weight for valuables from level \"{levelName}\" / このマップ由来貴重品の生成重み", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 10), Array.Empty<object>()));
}
}
}
internal int GetLevelWeight(Level level)
{
EnsureLevelWeightConfigs();
string levelName = GetLevelName(level);
if (string.IsNullOrWhiteSpace(levelName))
{
return 1;
}
if (IsExcludedLevelName(levelName))
{
return 1;
}
if (levelWeightConfigs.TryGetValue(levelName, out ConfigEntry<int> value) && value != null)
{
return Mathf.Clamp(value.Value, 1, 10);
}
return 1;
}
internal static string GetLevelName(Level level)
{
if ((Object)(object)level == (Object)null)
{
return string.Empty;
}
return string.IsNullOrWhiteSpace(((Object)level).name) ? string.Empty : ((Object)level).name.Trim();
}
internal static bool IsExcludedLevelName(string levelName)
{
if (string.IsNullOrWhiteSpace(levelName))
{
return true;
}
string text = levelName.Trim();
if (text.StartsWith("Level - ", StringComparison.OrdinalIgnoreCase))
{
text = text.Substring("Level - ".Length).Trim();
}
return string.Equals(text, "Splash Screen", StringComparison.OrdinalIgnoreCase) || string.Equals(text, "Main Menu", StringComparison.OrdinalIgnoreCase) || string.Equals(text, "Lobby Menu", StringComparison.OrdinalIgnoreCase);
}
internal static void WriteInfo(string message)
{
if (Log != null)
{
Log.LogInfo((object)message);
}
}
internal static void WriteWarning(string message)
{
if (Log != null)
{
Log.LogWarning((object)message);
}
}
internal static void WriteError(string message)
{
if (Log != null)
{
Log.LogError((object)message);
}
}
}
[HarmonyPatch(typeof(ValuableDirector), "SetupHost")]
internal static class ValuableDirectorSetupHostPatch
{
private sealed class WeightedPrefabRef
{
public PrefabRef PrefabRef;
public string ResourcePath;
public int Weight;
public string SourceLevelName;
}
private sealed class WeightedPoolSet
{
public readonly List<WeightedPrefabRef> TinyWeighted = new List<WeightedPrefabRef>();
public readonly List<WeightedPrefabRef> SmallWeighted = new List<WeightedPrefabRef>();
public readonly List<WeightedPrefabRef> MediumWeighted = new List<WeightedPrefabRef>();
public readonly List<WeightedPrefabRef> BigWeighted = new List<WeightedPrefabRef>();
public readonly List<WeightedPrefabRef> WideWeighted = new List<WeightedPrefabRef>();
public readonly List<WeightedPrefabRef> TallWeighted = new List<WeightedPrefabRef>();
public readonly List<WeightedPrefabRef> VeryTallWeighted = new List<WeightedPrefabRef>();
public readonly Dictionary<string, WeightedPrefabRef> TinyUniqueMap = new Dictionary<string, WeightedPrefabRef>(StringComparer.OrdinalIgnoreCase);
public readonly Dictionary<string, WeightedPrefabRef> SmallUniqueMap = new Dictionary<string, WeightedPrefabRef>(StringComparer.OrdinalIgnoreCase);
public readonly Dictionary<string, WeightedPrefabRef> MediumUniqueMap = new Dictionary<string, WeightedPrefabRef>(StringComparer.OrdinalIgnoreCase);
public readonly Dictionary<string, WeightedPrefabRef> BigUniqueMap = new Dictionary<string, WeightedPrefabRef>(StringComparer.OrdinalIgnoreCase);
public readonly Dictionary<string, WeightedPrefabRef> WideUniqueMap = new Dictionary<string, WeightedPrefabRef>(StringComparer.OrdinalIgnoreCase);
public readonly Dictionary<string, WeightedPrefabRef> TallUniqueMap = new Dictionary<string, WeightedPrefabRef>(StringComparer.OrdinalIgnoreCase);
public readonly Dictionary<string, WeightedPrefabRef> VeryTallUniqueMap = new Dictionary<string, WeightedPrefabRef>(StringComparer.OrdinalIgnoreCase);
public List<PrefabRef> TinyUnique = new List<PrefabRef>();
public List<PrefabRef> SmallUnique = new List<PrefabRef>();
public List<PrefabRef> MediumUnique = new List<PrefabRef>();
public List<PrefabRef> BigUnique = new List<PrefabRef>();
public List<PrefabRef> WideUnique = new List<PrefabRef>();
public List<PrefabRef> TallUnique = new List<PrefabRef>();
public List<PrefabRef> VeryTallUnique = new List<PrefabRef>();
public bool IsCompletelyEmpty()
{
return TinyWeighted.Count == 0 && SmallWeighted.Count == 0 && MediumWeighted.Count == 0 && BigWeighted.Count == 0 && WideWeighted.Count == 0 && TallWeighted.Count == 0 && VeryTallWeighted.Count == 0;
}
}
[CompilerGenerated]
private sealed class <CustomSetupHost>d__32 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public ValuableDirector director;
private WeightedPoolSet <poolSet>5__1;
private List<ValuableVolume> <allVolumes>5__2;
private List<ValuableVolume> <tinyVolumes>5__3;
private List<ValuableVolume> <smallVolumes>5__4;
private List<ValuableVolume> <mediumVolumes>5__5;
private List<ValuableVolume> <bigVolumes>5__6;
private List<ValuableVolume> <wideVolumes>5__7;
private List<ValuableVolume> <tallVolumes>5__8;
private List<ValuableVolume> <veryTallVolumes>5__9;
private string <valuableDebugName>5__10;
private int <totalMaxAmount>5__11;
private int[] <maxAmounts>5__12;
private string[] <paths>5__13;
private int[] <chances>5__14;
private List<ValuableVolume>[] <volumeLists>5__15;
private List<WeightedPrefabRef>[] <weightedPools>5__16;
private int[] <volumeIndex>5__17;
private int <index>5__18;
private float <highestRoll>5__19;
private int <selectedCategoryIndex>5__20;
private ValuableVolume <targetVolume>5__21;
private WeightedPrefabRef <selectedValuable>5__22;
private int <i>5__23;
private int <roll>5__24;
private PhotonView <photonView>5__25;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <CustomSetupHost>d__32(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<poolSet>5__1 = null;
<allVolumes>5__2 = null;
<tinyVolumes>5__3 = null;
<smallVolumes>5__4 = null;
<mediumVolumes>5__5 = null;
<bigVolumes>5__6 = null;
<wideVolumes>5__7 = null;
<tallVolumes>5__8 = null;
<veryTallVolumes>5__9 = null;
<valuableDebugName>5__10 = null;
<maxAmounts>5__12 = null;
<paths>5__13 = null;
<chances>5__14 = null;
<volumeLists>5__15 = null;
<weightedPools>5__16 = null;
<volumeIndex>5__17 = null;
<targetVolume>5__21 = null;
<selectedValuable>5__22 = null;
<photonView>5__25 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0cd5: Unknown result type (might be due to invalid IL or missing references)
//IL_0cdf: Expected O, but got Unknown
//IL_0d37: Unknown result type (might be due to invalid IL or missing references)
//IL_0d41: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
SetFieldValue(SetupCompleteField, director, false);
SetFieldValue(ValuableTargetAmountField, director, 0);
SetFieldValue(TotalCurrentValueField, director, 0f);
SetFieldValue(ValuableSpawnPlayerReadyField, director, 0);
SetFieldValue(SwitchSetupPlayerReadyField, director, 0);
SetFieldValue(SwitchSetupPlayerReadyListField, director, new List<Player>());
CalculateMaxAmounts(director);
<poolSet>5__1 = BuildWeightedPoolSet();
SetFieldValue(TinyValuablesField, director, <poolSet>5__1.TinyUnique);
SetFieldValue(SmallValuablesField, director, <poolSet>5__1.SmallUnique);
SetFieldValue(MediumValuablesField, director, <poolSet>5__1.MediumUnique);
SetFieldValue(BigValuablesField, director, <poolSet>5__1.BigUnique);
SetFieldValue(WideValuablesField, director, <poolSet>5__1.WideUnique);
SetFieldValue(TallValuablesField, director, <poolSet>5__1.TallUnique);
SetFieldValue(VeryTallValuablesField, director, <poolSet>5__1.VeryTallUnique);
<allVolumes>5__2 = Object.FindObjectsOfType<ValuableVolume>(false).ToList();
<tinyVolumes>5__3 = <allVolumes>5__2.FindAll((ValuableVolume x) => (int)x.VolumeType == 0);
<smallVolumes>5__4 = <allVolumes>5__2.FindAll((ValuableVolume x) => (int)x.VolumeType == 1);
<mediumVolumes>5__5 = <allVolumes>5__2.FindAll((ValuableVolume x) => (int)x.VolumeType == 2);
<bigVolumes>5__6 = <allVolumes>5__2.FindAll((ValuableVolume x) => (int)x.VolumeType == 3);
<wideVolumes>5__7 = <allVolumes>5__2.FindAll((ValuableVolume x) => (int)x.VolumeType == 4);
<tallVolumes>5__8 = <allVolumes>5__2.FindAll((ValuableVolume x) => (int)x.VolumeType == 5);
<veryTallVolumes>5__9 = <allVolumes>5__2.FindAll((ValuableVolume x) => (int)x.VolumeType == 6);
ListExtension.Shuffle<ValuableVolume>((IList<ValuableVolume>)<tinyVolumes>5__3);
ListExtension.Shuffle<ValuableVolume>((IList<ValuableVolume>)<smallVolumes>5__4);
ListExtension.Shuffle<ValuableVolume>((IList<ValuableVolume>)<mediumVolumes>5__5);
ListExtension.Shuffle<ValuableVolume>((IList<ValuableVolume>)<bigVolumes>5__6);
ListExtension.Shuffle<ValuableVolume>((IList<ValuableVolume>)<wideVolumes>5__7);
ListExtension.Shuffle<ValuableVolume>((IList<ValuableVolume>)<tallVolumes>5__8);
ListExtension.Shuffle<ValuableVolume>((IList<ValuableVolume>)<veryTallVolumes>5__9);
SetFieldValue(TinyVolumesField, director, <tinyVolumes>5__3);
SetFieldValue(SmallVolumesField, director, <smallVolumes>5__4);
SetFieldValue(MediumVolumesField, director, <mediumVolumes>5__5);
SetFieldValue(BigVolumesField, director, <bigVolumes>5__6);
SetFieldValue(WideVolumesField, director, <wideVolumes>5__7);
SetFieldValue(TallVolumesField, director, <tallVolumes>5__8);
SetFieldValue(VeryTallVolumesField, director, <veryTallVolumes>5__9);
<valuableDebugName>5__10 = GetValuableDebugName(director);
if (string.Equals(<valuableDebugName>5__10, "All", StringComparison.OrdinalIgnoreCase))
{
SetFieldValue(TotalMaxAmountField, director, <allVolumes>5__2.Count);
SetFieldValue(TotalMaxValueField, director, 99999f);
SetFieldValue(TinyMaxAmountField, director, <tinyVolumes>5__3.Count);
SetFieldValue(SmallMaxAmountField, director, <smallVolumes>5__4.Count);
SetFieldValue(MediumMaxAmountField, director, <mediumVolumes>5__5.Count);
SetFieldValue(BigMaxAmountField, director, <bigVolumes>5__6.Count);
SetFieldValue(WideMaxAmountField, director, <wideVolumes>5__7.Count);
SetFieldValue(TallMaxAmountField, director, <tallVolumes>5__8.Count);
SetFieldValue(VeryTallMaxAmountField, director, <veryTallVolumes>5__9.Count);
}
if (string.Equals(<valuableDebugName>5__10, "None", StringComparison.OrdinalIgnoreCase) || <poolSet>5__1.IsCompletelyEmpty())
{
SetFieldValue(TotalMaxAmountField, director, 0);
SetFieldValue(TinyMaxAmountField, director, 0);
SetFieldValue(SmallMaxAmountField, director, 0);
SetFieldValue(MediumMaxAmountField, director, 0);
SetFieldValue(BigMaxAmountField, director, 0);
SetFieldValue(WideMaxAmountField, director, 0);
SetFieldValue(TallMaxAmountField, director, 0);
SetFieldValue(VeryTallMaxAmountField, director, 0);
}
<totalMaxAmount>5__11 = GetFieldValue<int>(TotalMaxAmountField, director);
<maxAmounts>5__12 = new int[7]
{
GetFieldValue<int>(TinyMaxAmountField, director),
GetFieldValue<int>(SmallMaxAmountField, director),
GetFieldValue<int>(MediumMaxAmountField, director),
GetFieldValue<int>(BigMaxAmountField, director),
GetFieldValue<int>(WideMaxAmountField, director),
GetFieldValue<int>(TallMaxAmountField, director),
GetFieldValue<int>(VeryTallMaxAmountField, director)
};
<paths>5__13 = new string[7]
{
GetFieldValue<string>(AccessTools.Field(typeof(ValuableDirector), "tinyPath"), director),
GetFieldValue<string>(AccessTools.Field(typeof(ValuableDirector), "smallPath"), director),
GetFieldValue<string>(AccessTools.Field(typeof(ValuableDirector), "mediumPath"), director),
GetFieldValue<string>(AccessTools.Field(typeof(ValuableDirector), "bigPath"), director),
GetFieldValue<string>(AccessTools.Field(typeof(ValuableDirector), "widePath"), director),
GetFieldValue<string>(AccessTools.Field(typeof(ValuableDirector), "tallPath"), director),
GetFieldValue<string>(AccessTools.Field(typeof(ValuableDirector), "veryTallPath"), director)
};
<chances>5__14 = new int[7] { director.tinyChance, director.smallChance, director.mediumChance, director.bigChance, director.wideChance, director.tallChance, director.veryTallChance };
<volumeLists>5__15 = new List<ValuableVolume>[7] { <tinyVolumes>5__3, <smallVolumes>5__4, <mediumVolumes>5__5, <bigVolumes>5__6, <wideVolumes>5__7, <tallVolumes>5__8, <veryTallVolumes>5__9 };
<weightedPools>5__16 = new List<WeightedPrefabRef>[7] { <poolSet>5__1.TinyWeighted, <poolSet>5__1.SmallWeighted, <poolSet>5__1.MediumWeighted, <poolSet>5__1.BigWeighted, <poolSet>5__1.WideWeighted, <poolSet>5__1.TallWeighted, <poolSet>5__1.VeryTallWeighted };
<volumeIndex>5__17 = new int[7];
if ((Object)(object)AllMapValuablesPlugin.Instance != (Object)null && AllMapValuablesPlugin.Instance.IsVerboseLogEnabled())
{
AllMapValuablesPlugin.WriteInfo($"Pool Summary | Tiny:{<poolSet>5__1.TinyWeighted.Count} Small:{<poolSet>5__1.SmallWeighted.Count} Medium:{<poolSet>5__1.MediumWeighted.Count} Big:{<poolSet>5__1.BigWeighted.Count} Wide:{<poolSet>5__1.WideWeighted.Count} Tall:{<poolSet>5__1.TallWeighted.Count} VeryTall:{<poolSet>5__1.VeryTallWeighted.Count}");
}
<index>5__18 = 0;
goto IL_0c1c;
case 1:
<>1__state = -1;
<targetVolume>5__21 = null;
<selectedValuable>5__22 = null;
goto IL_0c0a;
case 2:
<>1__state = -1;
goto IL_0cf0;
case 3:
{
<>1__state = -1;
break;
}
IL_0c1c:
if (<index>5__18 < <totalMaxAmount>5__11)
{
<highestRoll>5__19 = -1f;
<selectedCategoryIndex>5__20 = -1;
<i>5__23 = 0;
while (<i>5__23 < <volumeLists>5__15.Length)
{
if (<volumeIndex>5__17[<i>5__23] < <maxAmounts>5__12[<i>5__23] && <volumeIndex>5__17[<i>5__23] < <volumeLists>5__15[<i>5__23].Count && <weightedPools>5__16[<i>5__23] != null && <weightedPools>5__16[<i>5__23].Count != 0)
{
<roll>5__24 = Random.Range(0, <chances>5__14[<i>5__23]);
if ((float)<roll>5__24 > <highestRoll>5__19)
{
<highestRoll>5__19 = <roll>5__24;
<selectedCategoryIndex>5__20 = <i>5__23;
}
}
<i>5__23++;
}
if (<selectedCategoryIndex>5__20 != -1)
{
<targetVolume>5__21 = <volumeLists>5__15[<selectedCategoryIndex>5__20][<volumeIndex>5__17[<selectedCategoryIndex>5__20]];
<selectedValuable>5__22 = PickWeightedPrefab(<weightedPools>5__16[<selectedCategoryIndex>5__20]);
if (<selectedValuable>5__22 == null || <selectedValuable>5__22.PrefabRef == null)
{
<volumeIndex>5__17[<selectedCategoryIndex>5__20]++;
goto IL_0c0a;
}
SpawnMethod.Invoke(director, new object[3]
{
<selectedValuable>5__22.PrefabRef,
<targetVolume>5__21,
<paths>5__13[<selectedCategoryIndex>5__20]
});
<volumeIndex>5__17[<selectedCategoryIndex>5__20]++;
<>2__current = null;
<>1__state = 1;
return true;
}
}
if (GameManager.instance.gameMode == 1)
{
<photonView>5__25 = ((Component)director).GetComponent<PhotonView>();
if ((Object)(object)<photonView>5__25 != (Object)null)
{
<photonView>5__25.RPC("ValuablesTargetSetRPC", (RpcTarget)0, new object[1] { GetFieldValue<int>(ValuableTargetAmountField, director) });
}
<photonView>5__25 = null;
}
SetFieldValue(ValuableSpawnPlayerReadyField, director, GetFieldValue<int>(ValuableSpawnPlayerReadyField, director) + 1);
goto IL_0cf0;
IL_0cf0:
if (GameManager.instance.gameMode == 1 && GetFieldValue<int>(ValuableSpawnPlayerReadyField, director) < PhotonNetwork.CurrentRoom.PlayerCount)
{
<>2__current = (object)new WaitForSeconds(0.1f);
<>1__state = 2;
return true;
}
director.VolumesAndSwitchSetup();
break;
IL_0c0a:
<index>5__18++;
goto IL_0c1c;
}
if (GameManager.instance.gameMode == 1 && GetFieldValue<int>(SwitchSetupPlayerReadyField, director) < PhotonNetwork.CurrentRoom.PlayerCount)
{
<>2__current = (object)new WaitForSeconds(0.1f);
<>1__state = 3;
return true;
}
SetFieldValue(SetupCompleteField, director, true);
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 readonly MethodInfo SpawnMethod = AccessTools.Method(typeof(ValuableDirector), "Spawn", (Type[])null, (Type[])null);
private static readonly FieldInfo ValuableDebugField = AccessTools.Field(typeof(ValuableDirector), "valuableDebug");
private static readonly FieldInfo SetupCompleteField = AccessTools.Field(typeof(ValuableDirector), "setupComplete");
private static readonly FieldInfo ValuableSpawnPlayerReadyField = AccessTools.Field(typeof(ValuableDirector), "valuableSpawnPlayerReady");
private static readonly FieldInfo ValuableTargetAmountField = AccessTools.Field(typeof(ValuableDirector), "valuableTargetAmount");
private static readonly FieldInfo SwitchSetupPlayerReadyField = AccessTools.Field(typeof(ValuableDirector), "switchSetupPlayerReady");
private static readonly FieldInfo SwitchSetupPlayerReadyListField = AccessTools.Field(typeof(ValuableDirector), "switchSetupPlayerReadyList");
private static readonly FieldInfo TotalMaxValueField = AccessTools.Field(typeof(ValuableDirector), "totalMaxValue");
private static readonly FieldInfo TotalCurrentValueField = AccessTools.Field(typeof(ValuableDirector), "totalCurrentValue");
private static readonly FieldInfo TotalMaxAmountField = AccessTools.Field(typeof(ValuableDirector), "totalMaxAmount");
private static readonly FieldInfo TinyMaxAmountField = AccessTools.Field(typeof(ValuableDirector), "tinyMaxAmount");
private static readonly FieldInfo SmallMaxAmountField = AccessTools.Field(typeof(ValuableDirector), "smallMaxAmount");
private static readonly FieldInfo MediumMaxAmountField = AccessTools.Field(typeof(ValuableDirector), "mediumMaxAmount");
private static readonly FieldInfo BigMaxAmountField = AccessTools.Field(typeof(ValuableDirector), "bigMaxAmount");
private static readonly FieldInfo WideMaxAmountField = AccessTools.Field(typeof(ValuableDirector), "wideMaxAmount");
private static readonly FieldInfo TallMaxAmountField = AccessTools.Field(typeof(ValuableDirector), "tallMaxAmount");
private static readonly FieldInfo VeryTallMaxAmountField = AccessTools.Field(typeof(ValuableDirector), "veryTallMaxAmount");
private static readonly FieldInfo TinyValuablesField = AccessTools.Field(typeof(ValuableDirector), "tinyValuables");
private static readonly FieldInfo SmallValuablesField = AccessTools.Field(typeof(ValuableDirector), "smallValuables");
private static readonly FieldInfo MediumValuablesField = AccessTools.Field(typeof(ValuableDirector), "mediumValuables");
private static readonly FieldInfo BigValuablesField = AccessTools.Field(typeof(ValuableDirector), "bigValuables");
private static readonly FieldInfo WideValuablesField = AccessTools.Field(typeof(ValuableDirector), "wideValuables");
private static readonly FieldInfo TallValuablesField = AccessTools.Field(typeof(ValuableDirector), "tallValuables");
private static readonly FieldInfo VeryTallValuablesField = AccessTools.Field(typeof(ValuableDirector), "veryTallValuables");
private static readonly FieldInfo TinyVolumesField = AccessTools.Field(typeof(ValuableDirector), "tinyVolumes");
private static readonly FieldInfo SmallVolumesField = AccessTools.Field(typeof(ValuableDirector), "smallVolumes");
private static readonly FieldInfo MediumVolumesField = AccessTools.Field(typeof(ValuableDirector), "mediumVolumes");
private static readonly FieldInfo BigVolumesField = AccessTools.Field(typeof(ValuableDirector), "bigVolumes");
private static readonly FieldInfo WideVolumesField = AccessTools.Field(typeof(ValuableDirector), "wideVolumes");
private static readonly FieldInfo TallVolumesField = AccessTools.Field(typeof(ValuableDirector), "tallVolumes");
private static readonly FieldInfo VeryTallVolumesField = AccessTools.Field(typeof(ValuableDirector), "veryTallVolumes");
private static bool Prefix(ValuableDirector __instance, ref IEnumerator __result)
{
if ((Object)(object)AllMapValuablesPlugin.Instance == (Object)null || !AllMapValuablesPlugin.Instance.IsEnabled())
{
return true;
}
if (!PhotonNetwork.IsMasterClient && (Object)(object)GameManager.instance != (Object)null && GameManager.instance.gameMode == 1)
{
return true;
}
try
{
AllMapValuablesPlugin.Instance.EnsureLevelWeightConfigs();
__result = CustomSetupHost(__instance);
return false;
}
catch (Exception ex)
{
AllMapValuablesPlugin.WriteError("Failure: Failed to start custom valuable generation / カスタム貴重品生成開始失敗\n" + ex);
return AllMapValuablesPlugin.Instance.IsFallbackToVanillaOnErrorEnabled();
}
}
[IteratorStateMachine(typeof(<CustomSetupHost>d__32))]
private static IEnumerator CustomSetupHost(ValuableDirector director)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <CustomSetupHost>d__32(0)
{
director = director
};
}
private static void CalculateMaxAmounts(ValuableDirector director)
{
if (SemiFunc.RunGetDifficultyMultiplier2() > 0f && !SemiFunc.RunIsArena())
{
float num = SemiFunc.RunGetDifficultyMultiplier2();
SetFieldValue(TotalMaxValueField, director, (float)Mathf.RoundToInt(director.totalMaxValueCurve2.Evaluate(num)));
SetFieldValue(TinyMaxAmountField, director, Mathf.RoundToInt(director.tinyMaxAmountCurve2.Evaluate(num)));
SetFieldValue(SmallMaxAmountField, director, Mathf.RoundToInt(director.smallMaxAmountCurve2.Evaluate(num)));
SetFieldValue(MediumMaxAmountField, director, Mathf.RoundToInt(director.mediumMaxAmountCurve2.Evaluate(num)));
SetFieldValue(BigMaxAmountField, director, Mathf.RoundToInt(director.bigMaxAmountCurve2.Evaluate(num)));
SetFieldValue(WideMaxAmountField, director, Mathf.RoundToInt(director.wideMaxAmountCurve2.Evaluate(num)));
SetFieldValue(TallMaxAmountField, director, Mathf.RoundToInt(director.tallMaxAmountCurve2.Evaluate(num)));
SetFieldValue(VeryTallMaxAmountField, director, Mathf.RoundToInt(director.veryTallMaxAmountCurve2.Evaluate(num)));
}
else
{
float num2 = SemiFunc.RunGetDifficultyMultiplier1();
if (SemiFunc.RunIsArena())
{
num2 = 0.75f;
}
SetFieldValue(TotalMaxValueField, director, (float)Mathf.RoundToInt(director.totalMaxValueCurve1.Evaluate(num2)));
SetFieldValue(TinyMaxAmountField, director, Mathf.RoundToInt(director.tinyMaxAmountCurve1.Evaluate(num2)));
SetFieldValue(SmallMaxAmountField, director, Mathf.RoundToInt(director.smallMaxAmountCurve1.Evaluate(num2)));
SetFieldValue(MediumMaxAmountField, director, Mathf.RoundToInt(director.mediumMaxAmountCurve1.Evaluate(num2)));
SetFieldValue(BigMaxAmountField, director, Mathf.RoundToInt(director.bigMaxAmountCurve1.Evaluate(num2)));
SetFieldValue(WideMaxAmountField, director, Mathf.RoundToInt(director.wideMaxAmountCurve1.Evaluate(num2)));
SetFieldValue(TallMaxAmountField, director, Mathf.RoundToInt(director.tallMaxAmountCurve1.Evaluate(num2)));
SetFieldValue(VeryTallMaxAmountField, director, Mathf.RoundToInt(director.veryTallMaxAmountCurve1.Evaluate(num2)));
}
if (SemiFunc.RunIsArena())
{
SetFieldValue(TotalMaxAmountField, director, GetFieldValue<int>(TotalMaxAmountField, director) / 2);
SetFieldValue(TinyMaxAmountField, director, GetFieldValue<int>(TinyMaxAmountField, director) / 3);
SetFieldValue(SmallMaxAmountField, director, GetFieldValue<int>(SmallMaxAmountField, director) / 3);
SetFieldValue(MediumMaxAmountField, director, GetFieldValue<int>(MediumMaxAmountField, director) / 3);
SetFieldValue(BigMaxAmountField, director, GetFieldValue<int>(BigMaxAmountField, director) / 3);
SetFieldValue(WideMaxAmountField, director, GetFieldValue<int>(WideMaxAmountField, director) / 2);
SetFieldValue(TallMaxAmountField, director, GetFieldValue<int>(TallMaxAmountField, director) / 2);
SetFieldValue(VeryTallMaxAmountField, director, GetFieldValue<int>(VeryTallMaxAmountField, director) / 2);
}
}
private static WeightedPoolSet BuildWeightedPoolSet()
{
WeightedPoolSet weightedPoolSet = new WeightedPoolSet();
if ((Object)(object)AllMapValuablesPlugin.Instance == (Object)null || (Object)(object)RunManager.instance == (Object)null)
{
return weightedPoolSet;
}
List<Level> list = new List<Level>();
if (RunManager.instance.levels != null)
{
foreach (Level level in RunManager.instance.levels)
{
if ((Object)(object)level != (Object)null)
{
list.Add(level);
}
}
}
if ((Object)(object)RunManager.instance.levelCurrent != (Object)null && !list.Contains(RunManager.instance.levelCurrent))
{
list.Add(RunManager.instance.levelCurrent);
}
foreach (Level item in list)
{
string levelName = AllMapValuablesPlugin.GetLevelName(item);
if (AllMapValuablesPlugin.IsExcludedLevelName(levelName) || (Object)(object)item == (Object)null || item.ValuablePresets == null || item.ValuablePresets.Count == 0)
{
continue;
}
int levelWeight = AllMapValuablesPlugin.Instance.GetLevelWeight(item);
foreach (LevelValuables valuablePreset in item.ValuablePresets)
{
if (!((Object)(object)valuablePreset == (Object)null))
{
AddWeightedPrefabs(weightedPoolSet.TinyWeighted, weightedPoolSet.TinyUniqueMap, valuablePreset.tiny, levelWeight, levelName);
AddWeightedPrefabs(weightedPoolSet.SmallWeighted, weightedPoolSet.SmallUniqueMap, valuablePreset.small, levelWeight, levelName);
AddWeightedPrefabs(weightedPoolSet.MediumWeighted, weightedPoolSet.MediumUniqueMap, valuablePreset.medium, levelWeight, levelName);
AddWeightedPrefabs(weightedPoolSet.BigWeighted, weightedPoolSet.BigUniqueMap, valuablePreset.big, levelWeight, levelName);
AddWeightedPrefabs(weightedPoolSet.WideWeighted, weightedPoolSet.WideUniqueMap, valuablePreset.wide, levelWeight, levelName);
AddWeightedPrefabs(weightedPoolSet.TallWeighted, weightedPoolSet.TallUniqueMap, valuablePreset.tall, levelWeight, levelName);
AddWeightedPrefabs(weightedPoolSet.VeryTallWeighted, weightedPoolSet.VeryTallUniqueMap, valuablePreset.veryTall, levelWeight, levelName);
}
}
}
weightedPoolSet.TinyUnique = weightedPoolSet.TinyUniqueMap.Values.Select((WeightedPrefabRef x) => x.PrefabRef).ToList();
weightedPoolSet.SmallUnique = weightedPoolSet.SmallUniqueMap.Values.Select((WeightedPrefabRef x) => x.PrefabRef).ToList();
weightedPoolSet.MediumUnique = weightedPoolSet.MediumUniqueMap.Values.Select((WeightedPrefabRef x) => x.PrefabRef).ToList();
weightedPoolSet.BigUnique = weightedPoolSet.BigUniqueMap.Values.Select((WeightedPrefabRef x) => x.PrefabRef).ToList();
weightedPoolSet.WideUnique = weightedPoolSet.WideUniqueMap.Values.Select((WeightedPrefabRef x) => x.PrefabRef).ToList();
weightedPoolSet.TallUnique = weightedPoolSet.TallUniqueMap.Values.Select((WeightedPrefabRef x) => x.PrefabRef).ToList();
weightedPoolSet.VeryTallUnique = weightedPoolSet.VeryTallUniqueMap.Values.Select((WeightedPrefabRef x) => x.PrefabRef).ToList();
return weightedPoolSet;
}
private static void AddWeightedPrefabs(List<WeightedPrefabRef> weightedList, Dictionary<string, WeightedPrefabRef> uniqueMap, List<PrefabRef> source, int levelWeight, string levelName)
{
if (source == null || source.Count == 0)
{
return;
}
foreach (PrefabRef item in source)
{
if (item == null || !item.IsValid())
{
continue;
}
string resourcePath = item.ResourcePath;
if (!string.IsNullOrWhiteSpace(resourcePath))
{
if (uniqueMap.TryGetValue(resourcePath, out WeightedPrefabRef value))
{
value.Weight += Mathf.Clamp(levelWeight, 1, 10);
continue;
}
value = new WeightedPrefabRef();
value.PrefabRef = item;
value.ResourcePath = resourcePath;
value.Weight = Mathf.Clamp(levelWeight, 1, 10);
value.SourceLevelName = levelName;
uniqueMap.Add(resourcePath, value);
weightedList.Add(value);
}
}
}
private static WeightedPrefabRef PickWeightedPrefab(List<WeightedPrefabRef> weightedPool)
{
if (weightedPool == null || weightedPool.Count == 0)
{
return null;
}
int num = 0;
foreach (WeightedPrefabRef item in weightedPool)
{
if (item != null && item.PrefabRef != null && item.Weight > 0)
{
num += item.Weight;
}
}
if (num <= 0)
{
return null;
}
int num2 = Random.Range(0, num);
int num3 = 0;
foreach (WeightedPrefabRef item2 in weightedPool)
{
if (item2 != null && item2.PrefabRef != null && item2.Weight > 0)
{
num3 += item2.Weight;
if (num2 < num3)
{
return item2;
}
}
}
return weightedPool[weightedPool.Count - 1];
}
private static string GetValuableDebugName(ValuableDirector director)
{
object value = ValuableDebugField.GetValue(director);
return (value == null) ? string.Empty : value.ToString();
}
private static T GetFieldValue<T>(FieldInfo fieldInfo, object instance)
{
object value = fieldInfo.GetValue(instance);
if (value == null)
{
return default(T);
}
return (T)value;
}
private static void SetFieldValue(FieldInfo fieldInfo, object instance, object value)
{
fieldInfo.SetValue(instance, value);
}
}
}