using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using GameNetcodeStuff;
using GrimoireWeiss.NetcodePatcher;
using GrimoireWeissScrap.Behaviours;
using JetBrains.Annotations;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("CMM")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Adds your favorite cookbook to the game.")]
[assembly: AssemblyFileVersion("1.1.0.0")]
[assembly: AssemblyInformationalVersion("1.1.0+fb0a5905462a3b97850844ae31013b478cd5cc59")]
[assembly: AssemblyProduct("GrimoireWeiss")]
[assembly: AssemblyTitle("GrimoireWeiss")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
internal class <Module>
{
static <Module>()
{
}
}
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace GrimoireWeissScrap
{
[BepInPlugin("CMM.GrimoireWeiss", "GrimoireWeiss", "1.1.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInProcess("Lethal Company.exe")]
public class Plugin : BaseUnityPlugin
{
public const string PluginGUID = "CMM.GrimoireWeiss";
public const string PluginAuthor = "CMM";
public const string PluginName = "GrimoireWeiss";
public const string PluginVersion = "1.1.0";
private static Plugin s_instance;
internal static ManualLogSource Log;
public static AssetBundle WeissBundle;
public GameObject NetManagerPrefab;
private void Awake()
{
try
{
NetcodeWeaver();
if ((Object)(object)s_instance == (Object)null)
{
s_instance = this;
}
Log = Logger.CreateLogSource("CMM.GrimoireWeiss");
LoadAssetBundles();
DoNetworkThingy();
LoadAndRegisterItems();
Log.LogInfo((object)"Weiss! You dumbass!");
}
catch (Exception)
{
Log.LogError((object)"Plugin CMM.GrimoireWeiss failed to load.");
}
}
private static void NetcodeWeaver()
{
Type[] types = Assembly.GetExecutingAssembly().GetTypes();
for (int i = 0; i < types.Length; i++)
{
MethodInfo[] methods = types[i].GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
foreach (MethodInfo methodInfo in methods)
{
if (methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false).Length != 0)
{
methodInfo.Invoke(null, null);
}
}
}
}
private void DoNetworkThingy()
{
NetManagerPrefab = WeissBundle.LoadAsset<GameObject>("Assets/Dumbass/WeissNetworkManager.prefab");
NetManagerPrefab.AddComponent<WeissNetworkManager>();
}
private static void LoadAssetBundles()
{
WeissBundle = LoadAssetBundle("grimoireweiss", "weissBundle");
}
private static AssetBundle LoadAssetBundle(string bundleName, string bundleDisplayName)
{
AssetBundle obj = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? throw new InvalidOperationException(), bundleName));
if ((Object)(object)obj == (Object)null)
{
Log.LogError((object)("Failed to load " + bundleDisplayName + "."));
}
return obj;
}
private static void LoadAndRegisterItems()
{
Scrap[] array = new Scrap[7]
{
new Scrap("Grimoire Weiss", Plugin.LoadItemFromBundle<Item>(WeissBundle, "Assets/Dumbass/GrimoireWeissItem.asset")),
new Scrap("Tome Blood & Sacrifice", Plugin.LoadItemFromBundle<Item>(WeissBundle, "Assets/Dumbass/TomeBlood&SacrificeItem.asset")),
new Scrap("Tome Belief & Heart", Plugin.LoadItemFromBundle<Item>(WeissBundle, "Assets/Dumbass/TomeBelief&HeartItem.asset")),
new Scrap("Tome Heaven & Earth", Plugin.LoadItemFromBundle<Item>(WeissBundle, "Assets/Dumbass/TomeHeaven&EarthItem.asset")),
new Scrap("Tome Cause & Malice", Plugin.LoadItemFromBundle<Item>(WeissBundle, "Assets/Dumbass/TomeCause&MaliceItem.asset")),
new Scrap("Tome Sea & Chasm", Plugin.LoadItemFromBundle<Item>(WeissBundle, "Assets/Dumbass/TomeSea&ChasmItem.asset")),
new Scrap("Tome Star & Song", Plugin.LoadItemFromBundle<Item>(WeissBundle, "Assets/Dumbass/TomeStar&SongItem.asset"))
};
Scrap[] array2 = array;
foreach (Scrap obj in array2)
{
string name = obj.Name;
Item item = obj.Item;
if ((Object)(object)item == (Object)null)
{
Log.LogError((object)("Failed to load item: " + name));
continue;
}
if (!(name == "Grimoire Weiss"))
{
if (name == "Tome Blood & Sacrifice")
{
TomeBlood tomeBlood = item.spawnPrefab.AddComponent<TomeBlood>();
((GrabbableObject)tomeBlood).grabbable = true;
((GrabbableObject)tomeBlood).grabbableToEnemies = true;
((GrabbableObject)tomeBlood).itemProperties = item;
}
}
else
{
Weiss weiss = item.spawnPrefab.AddComponent<Weiss>();
((GrabbableObject)weiss).grabbable = true;
((GrabbableObject)weiss).scrapPersistedThroughRounds = true;
((GrabbableObject)weiss).grabbableToEnemies = true;
((GrabbableObject)weiss).itemProperties = item;
}
NetworkPrefabs.RegisterNetworkPrefab(item.spawnPrefab);
Utilities.FixMixerGroups(item.spawnPrefab);
}
array2 = array;
foreach (Scrap scrap in array2)
{
switch (scrap.Name)
{
case "Grimoire Weiss":
Items.RegisterScrap(scrap.Item, new Dictionary<LevelTypes, int>
{
{
(LevelTypes)64,
15
},
{
(LevelTypes)4,
5
},
{
(LevelTypes)8,
5
},
{
(LevelTypes)16,
10
}
}, (Dictionary<string, int>)null);
break;
case "Tome Blood & Sacrifice":
Items.RegisterScrap(scrap.Item, new Dictionary<LevelTypes, int>
{
{
(LevelTypes)64,
15
},
{
(LevelTypes)512,
10
}
}, (Dictionary<string, int>)null);
break;
case "Tome Heaven & Earth":
Items.RegisterScrap(scrap.Item, new Dictionary<LevelTypes, int>
{
{
(LevelTypes)128,
15
},
{
(LevelTypes)256,
10
}
}, (Dictionary<string, int>)null);
break;
case "Tome Belief & Heart":
Items.RegisterScrap(scrap.Item, new Dictionary<LevelTypes, int>
{
{
(LevelTypes)256,
15
},
{
(LevelTypes)128,
10
}
}, (Dictionary<string, int>)null);
break;
default:
Items.RegisterScrap(scrap.Item, new Dictionary<LevelTypes, int>
{
{
(LevelTypes)4,
10
},
{
(LevelTypes)8,
10
},
{
(LevelTypes)16,
15
},
{
(LevelTypes)256,
10
},
{
(LevelTypes)128,
10
},
{
(LevelTypes)64,
7
},
{
(LevelTypes)512,
5
}
}, (Dictionary<string, int>)null);
break;
}
}
}
public static T LoadItemFromBundle<T>(AssetBundle bundle, string path) where T : Object
{
T val = bundle.LoadAsset<T>(path);
if ((Object)(object)val == (Object)null)
{
Log.LogError((object)("Failed to load asset at path " + path + " from bundle " + ((Object)bundle).name));
}
return val;
}
}
public class Scrap
{
public string Name { get; }
public Item Item { get; }
public Scrap(string name, Item item)
{
Name = name;
Item = item;
base..ctor();
}
}
}
namespace GrimoireWeissScrap.Behaviours
{
public class WeissNetworkManager : NetworkBehaviour
{
public static WeissNetworkManager Instance;
public override void OnNetworkSpawn()
{
if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer)
{
WeissNetworkManager instance = Instance;
if (instance != null)
{
((Component)instance).gameObject.GetComponent<NetworkObject>().Despawn(true);
}
}
Instance = this;
((NetworkBehaviour)this).OnNetworkSpawn();
}
protected override void __initializeVariables()
{
((NetworkBehaviour)this).__initializeVariables();
}
protected internal override string __getTypeName()
{
return "WeissNetworkManager";
}
}
internal class TomeBelief : PhysicsProp
{
private const int BMaxHealth = 100;
private bool _bIsEquipped;
public override void GrabItem()
{
((GrabbableObject)this).GrabItem();
_ = (Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null;
}
public override void EquipItem()
{
((PhysicsProp)this).EquipItem();
if (!((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null))
{
_bIsEquipped = true;
if (((GrabbableObject)this).scrapValue >= 2 && ((GrabbableObject)this).playerHeldBy.health < 100)
{
((MonoBehaviour)this).StartCoroutine(RegenerateCoroutine());
}
}
}
public override void PocketItem()
{
((GrabbableObject)this).PocketItem();
if (_bIsEquipped)
{
_bIsEquipped = false;
}
}
private IEnumerator RegenerateCoroutine()
{
int healthMissing = 100 - ((GrabbableObject)this).playerHeldBy.health;
while (_bIsEquipped && ((GrabbableObject)this).scrapValue > 0 && healthMissing != 0)
{
int num = Mathf.Min(2 * healthMissing, ((GrabbableObject)this).scrapValue);
int healthRegenerated = Mathf.FloorToInt((float)(num / 2));
RegeneratePlayer(num, healthRegenerated);
healthMissing = 100 - ((GrabbableObject)this).playerHeldBy.health;
yield return (object)new WaitForSeconds(3f);
}
}
private void RegeneratePlayer(int scrapCost, int healthRegenerated)
{
PlayerControllerB playerHeldBy = ((GrabbableObject)this).playerHeldBy;
playerHeldBy.health += Mathf.FloorToInt((float)healthRegenerated);
((GrabbableObject)this).playerHeldBy.DamagePlayerClientRpc(-healthRegenerated, ((GrabbableObject)this).playerHeldBy.health);
HUDManager.Instance.UpdateHealthUI(((GrabbableObject)this).playerHeldBy.health, false);
if (((GrabbableObject)this).playerHeldBy.health >= 10 && ((GrabbableObject)this).playerHeldBy.criticallyInjured)
{
((GrabbableObject)this).playerHeldBy.MakeCriticallyInjured(false);
}
UpdateScrapValueServerRpc(((GrabbableObject)this).scrapValue - scrapCost);
}
[ServerRpc(RequireOwnership = false)]
public void UpdateScrapValueServerRpc(int value)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Invalid comparison between Unknown and I4
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Invalid comparison between Unknown and I4
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
{
ServerRpcParams val = default(ServerRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2231642400u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, value);
((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2231642400u, val, (RpcDelivery)0);
}
if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
{
UpdateScrapValueClientRpc(value);
}
}
}
[ClientRpc]
public void UpdateScrapValueClientRpc(int value)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Invalid comparison between Unknown and I4
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Invalid comparison between Unknown and I4
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
{
ClientRpcParams val = default(ClientRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2444448827u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, value);
((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2444448827u, val, (RpcDelivery)0);
}
if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
{
((GrabbableObject)this).SetScrapValue(value);
}
}
}
protected override void __initializeVariables()
{
((PhysicsProp)this).__initializeVariables();
}
[RuntimeInitializeOnLoadMethod]
internal static void InitializeRPCS_TomeBelief()
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Expected O, but got Unknown
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
NetworkManager.__rpc_func_table.Add(2231642400u, new RpcReceiveHandler(__rpc_handler_2231642400));
NetworkManager.__rpc_func_table.Add(2444448827u, new RpcReceiveHandler(__rpc_handler_2444448827));
}
private static void __rpc_handler_2231642400(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
int value = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref value);
target.__rpc_exec_stage = (__RpcExecStage)1;
((TomeBelief)(object)target).UpdateScrapValueServerRpc(value);
target.__rpc_exec_stage = (__RpcExecStage)0;
}
}
private static void __rpc_handler_2444448827(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
int value = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref value);
target.__rpc_exec_stage = (__RpcExecStage)2;
((TomeBelief)(object)target).UpdateScrapValueClientRpc(value);
target.__rpc_exec_stage = (__RpcExecStage)0;
}
}
protected internal override string __getTypeName()
{
return "TomeBelief";
}
}
internal class TomeBlood : PhysicsProp
{
private const int BMinDamage = 25;
private const int BMaxDamage = 75;
private int _bUsesLeft;
private int _bSacrifices;
private bool _bIsFirstUse = true;
private bool _bCanFlickerLights = true;
private PlayerControllerB _wasGrabbedBy;
private RoundManager _roundManager;
private bool _bCanScarePlayer;
public override void Start()
{
((GrabbableObject)this).Start();
_bUsesLeft = 10;
_roundManager = Object.FindFirstObjectByType<RoundManager>();
}
public override void ItemActivate(bool used, bool buttonDown = true)
{
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
((GrabbableObject)this).ItemActivate(used, buttonDown);
if (!buttonDown || (Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null)
{
return;
}
if ((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null && _bUsesLeft > 0)
{
_bUsesLeft--;
if (_bSacrifices >= 3)
{
if (_bIsFirstUse)
{
HandleUseFirst();
}
else
{
HandleUse();
}
if (Random.value <= 0.05f)
{
SacrificeScrapServerRpc();
}
}
else
{
((GrabbableObject)this).playerHeldBy.DamagePlayer(100, true, true, (CauseOfDeath)0, 0, false, default(Vector3));
}
}
else if (_bUsesLeft <= 0)
{
((GrabbableObject)this).playerHeldBy.MakeCriticallyInjured(true);
}
}
public override void GrabItem()
{
((GrabbableObject)this).GrabItem();
if (!((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null))
{
if (!Object.op_Implicit((Object)(object)_wasGrabbedBy) && _bCanFlickerLights)
{
_roundManager.FlickerLights(false, true);
}
_wasGrabbedBy = ((GrabbableObject)this).playerHeldBy;
}
}
public override void EquipItem()
{
((PhysicsProp)this).EquipItem();
if (!((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null) && _bCanScarePlayer)
{
((GrabbableObject)this).playerHeldBy.JumpToFearLevel(0.5f, true);
HUDManager.Instance.ShakeCamera((ScreenShakeType)0);
_bCanScarePlayer = false;
}
}
public override void PocketItem()
{
((GrabbableObject)this).PocketItem();
if (!((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null) && _bCanFlickerLights && Random.value <= 0.5f)
{
_roundManager.FlickerLights(true, false);
}
}
public override void DiscardItem()
{
((GrabbableObject)this).DiscardItem();
if (!((Object)(object)_wasGrabbedBy == (Object)null) && _wasGrabbedBy.isPlayerDead)
{
SacrificeScrapServerRpc();
}
}
private void HandleUseFirst()
{
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
_bIsFirstUse = false;
int num = ((GrabbableObject)this).playerHeldBy.health - 1;
int num2 = Random.Range(25, Mathf.Min(76, num + 1));
((GrabbableObject)this).playerHeldBy.DamagePlayer(num2, true, true, (CauseOfDeath)0, 0, false, default(Vector3));
((GrabbableObject)this).playerHeldBy.JumpToFearLevel(0.5f, true);
HUDManager.Instance.ShakeCamera((ScreenShakeType)0);
_roundManager.FlickerLights(false, false);
}
private void HandleUse()
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
int num = Random.Range(25, 76);
((GrabbableObject)this).playerHeldBy.DamagePlayer(num, true, true, (CauseOfDeath)0, 0, false, default(Vector3));
((GrabbableObject)this).playerHeldBy.JumpToFearLevel(0.5f, true);
HUDManager.Instance.ShakeCamera((ScreenShakeType)0);
_roundManager.FlickerLights(false, false);
}
[ServerRpc(RequireOwnership = false)]
public void SacrificeScrapServerRpc()
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Invalid comparison between Unknown and I4
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Invalid comparison between Unknown and I4
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
{
ServerRpcParams val = default(ServerRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(915431107u, val, (RpcDelivery)0);
((NetworkBehaviour)this).__endSendServerRpc(ref val2, 915431107u, val, (RpcDelivery)0);
}
if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
{
int num = ((GrabbableObject)this).scrapValue / 3;
int newPrice = Random.Range(5, num);
SacrificeScrapClientRpc(newPrice);
_roundManager.SpawnEnemiesOutside();
string[] array = new string[4]
{
"In shadows deep, " + _wasGrabbedBy.playerUsername + " surrenders willingly, to the Tome's insatiable hunger.",
"The air thickens with the scent of sacrifice.",
"The forbidden rites reach their dark conclusion.",
"The Tome's hunger grows, consuming their very essence."
};
string text = array[Random.Range(0, array.Length)];
HUDManager.Instance.AddTextToChatOnServer(text, -1);
_bSacrifices++;
}
}
}
[ClientRpc]
private void SacrificeScrapClientRpc(int newPrice)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Invalid comparison between Unknown and I4
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Invalid comparison between Unknown and I4
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager == null || !networkManager.IsListening)
{
return;
}
if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
{
ClientRpcParams val = default(ClientRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2585402183u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, newPrice);
((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2585402183u, val, (RpcDelivery)0);
}
if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost))
{
return;
}
((GrabbableObject)this).SetScrapValue(((GrabbableObject)this).scrapValue + newPrice);
_bCanFlickerLights = false;
_roundManager.FlickerLights(false, true);
foreach (Light allPoweredLight in _roundManager.allPoweredLights)
{
((MonoBehaviour)this).StartCoroutine(ChangeLightColorCoroutine(5f, allPoweredLight, Color.red));
}
((MonoBehaviour)this).StartCoroutine(SacrificeTurnOffLights(10f, 3f, _roundManager.allPoweredLightsAnimators));
}
private IEnumerator SacrificeTurnOffLights(float graceDelay, float turnOffDelay, List<Animator> animators)
{
yield return (object)new WaitForSeconds(graceDelay);
foreach (Animator animator in animators)
{
yield return (object)new WaitForSeconds(turnOffDelay);
animator.SetBool("on", false);
if (Random.value <= 0.05f)
{
_roundManager.FlickerLights(false, false);
}
}
}
private static IEnumerator ChangeLightColorCoroutine(float delay, Light light, Color color)
{
//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)
yield return (object)new WaitForSeconds(delay);
light.color = color;
}
protected override void __initializeVariables()
{
((PhysicsProp)this).__initializeVariables();
}
[RuntimeInitializeOnLoadMethod]
internal static void InitializeRPCS_TomeBlood()
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Expected O, but got Unknown
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
NetworkManager.__rpc_func_table.Add(915431107u, new RpcReceiveHandler(__rpc_handler_915431107));
NetworkManager.__rpc_func_table.Add(2585402183u, new RpcReceiveHandler(__rpc_handler_2585402183));
}
private static void __rpc_handler_915431107(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0029: 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)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
target.__rpc_exec_stage = (__RpcExecStage)1;
((TomeBlood)(object)target).SacrificeScrapServerRpc();
target.__rpc_exec_stage = (__RpcExecStage)0;
}
}
private static void __rpc_handler_2585402183(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
int newPrice = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref newPrice);
target.__rpc_exec_stage = (__RpcExecStage)2;
((TomeBlood)(object)target).SacrificeScrapClientRpc(newPrice);
target.__rpc_exec_stage = (__RpcExecStage)0;
}
}
protected internal override string __getTypeName()
{
return "TomeBlood";
}
}
internal class TomeHeaven : PhysicsProp
{
protected override void __initializeVariables()
{
((PhysicsProp)this).__initializeVariables();
}
protected internal override string __getTypeName()
{
return "TomeHeaven";
}
}
internal class Weiss : PhysicsProp
{
private bool _wIsInDungeon;
private bool _wCanTalkEnterDungeon = true;
private bool _wCanTalkLeftDungeon = true;
private bool _wCanTalkDiscardDungeon = true;
private bool _wCanTalkDiscardShip = true;
private bool _wCanTalkSwitchedOff = true;
private bool _wCanTalkAloneInDungeon = true;
private bool _wCanTalkClimbing = true;
private bool _wCanTalkQuicksand = true;
private bool _wCanTalkSand = true;
private bool _wCanTalkWater = true;
private int _wTimesEnteredDungeon;
private int _wTimesLeftDungeon;
private int _wTimesDiscardDungeon;
private int _wTimesDiscardShip;
private int _wTimesGrabbed;
private int _wTimesSwitchedOff;
private AudioSource _audioSource;
private readonly Dictionary<string, AudioClip> _audioClips = new Dictionary<string, AudioClip>();
private PlayerControllerB _wasGrabbedBy;
private RoundManager _roundManager;
[UsedImplicitly]
private void Awake()
{
_audioSource = ((Component)this).GetComponent<AudioSource>();
}
public override void Start()
{
((GrabbableObject)this).Start();
_roundManager = Object.FindFirstObjectByType<RoundManager>();
}
public override void Update()
{
((GrabbableObject)this).Update();
if (Time.frameCount % 60 != 0 || (Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null)
{
return;
}
string name = ((Object)_roundManager.currentLevel).name;
bool flag = ((name == "RendLevel" || name == "DineLevel") ? true : false);
bool flag2 = flag;
flag = ((name == "OffenseLevel" || name == "AssuranceLevel") ? true : false);
bool flag3 = flag;
if (((GrabbableObject)this).isInFactory)
{
if (!_wIsInDungeon)
{
_wIsInDungeon = true;
_wCanTalkDiscardShip = true;
if (_wCanTalkEnterDungeon)
{
if (flag2)
{
((MonoBehaviour)this).StartCoroutine(PlayFollowUpLine("PlayerIsEnteringDungeonMansion" + Random.Range(1, 5), 3f, _wIsInDungeon, followUpConditionExpected: true));
}
else
{
switch (_wTimesEnteredDungeon)
{
case 0:
((MonoBehaviour)this).StartCoroutine(PlayFollowUpLine("PlayerIsEnteringDungeon1", 3f, _wIsInDungeon, followUpConditionExpected: true));
((MonoBehaviour)this).StartCoroutine(PlayFollowUpLine("PlayerIsEnteringDungeon1FollowUp", 60f, _wIsInDungeon, followUpConditionExpected: true));
break;
case 1:
case 2:
((MonoBehaviour)this).StartCoroutine(PlayFollowUpLine("PlayerIsEnteringDungeon2", 3f, _wIsInDungeon, followUpConditionExpected: true));
((MonoBehaviour)this).StartCoroutine(PlayFollowUpLine("PlayerIsEnteringDungeon2FollowUp", 30f, _wIsInDungeon, followUpConditionExpected: true));
break;
case 3:
case 4:
((MonoBehaviour)this).StartCoroutine(PlayFollowUpLine("PlayerIsEnteringDungeon" + Random.Range(3, 6), 3f, _wIsInDungeon, followUpConditionExpected: true));
break;
}
_wTimesEnteredDungeon++;
_wCanTalkEnterDungeon = false;
}
}
if (_wCanTalkAloneInDungeon && ((GrabbableObject)this).playerHeldBy.isPlayerAlone && Random.value <= 0.25f)
{
((MonoBehaviour)this).StartCoroutine(PlayFollowUpLine("PlayerIsAlone" + Random.Range(1, 3), 120f, ((GrabbableObject)this).playerHeldBy.isPlayerAlone, _wIsInDungeon));
_wCanTalkAloneInDungeon = false;
}
return;
}
}
else
{
if (_wIsInDungeon)
{
_wIsInDungeon = false;
if (_wCanTalkLeftDungeon)
{
switch (_wTimesLeftDungeon)
{
case 0:
((MonoBehaviour)this).StartCoroutine(PlayFollowUpLine("PlayerIsLeavingDungeon1", 7f, _wIsInDungeon, followUpConditionExpected: false));
break;
case 1:
case 2:
case 3:
((MonoBehaviour)this).StartCoroutine(PlayFollowUpLine("PlayerIsLeavingDungeon" + Random.Range(2, 4), 7f, _wIsInDungeon, followUpConditionExpected: false));
break;
}
_wTimesLeftDungeon++;
_wCanTalkLeftDungeon = false;
}
return;
}
if (!((GrabbableObject)this).isInElevator)
{
if (_wCanTalkClimbing && ((GrabbableObject)this).playerHeldBy.isClimbingLadder && Random.value <= 0.25f)
{
_wCanTalkClimbing = false;
}
if (_wCanTalkQuicksand && ((GrabbableObject)this).playerHeldBy.isSinking && !((GrabbableObject)this).playerHeldBy.isUnderwater && Random.value <= 0.5f)
{
_wCanTalkQuicksand = false;
PlayAudioClip("Quicksand" + Random.Range(1, 6));
}
if (_wCanTalkWater && ((GrabbableObject)this).playerHeldBy.isSinking && ((GrabbableObject)this).playerHeldBy.isUnderwater && Random.value <= 0.5f)
{
_wCanTalkWater = false;
PlayAudioClip("Water" + Random.Range(1, 4));
}
if (_wCanTalkSand && flag3 && Random.value <= 0.5f)
{
((MonoBehaviour)this).StartCoroutine(PlayFollowUpLine("MapHasSand" + Random.Range(1, 5), 35f, _wIsInDungeon, followUpConditionExpected: false));
_wCanTalkSand = false;
}
return;
}
}
if (((GrabbableObject)this).isInElevator)
{
_wCanTalkEnterDungeon = true;
_wCanTalkLeftDungeon = true;
_wCanTalkDiscardDungeon = true;
}
}
public override void GrabItem()
{
((GrabbableObject)this).GrabItem();
if ((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null)
{
return;
}
_wasGrabbedBy = ((GrabbableObject)this).playerHeldBy;
if (_wTimesGrabbed == 0)
{
PlayAudioClip("PlayerPickedWeissIntro" + Random.Range(1, 7));
_wTimesGrabbed++;
}
else if (Random.value <= 0.5f)
{
switch (_wTimesGrabbed)
{
case 2:
case 3:
PlayAudioClip("PlayerPickedWeiss" + Random.Range(1, 5));
break;
case 9:
case 10:
case 11:
case 12:
case 13:
PlayAudioClip("PlayerPickedWeissIsAnnoyed" + Random.Range(1, 8));
break;
}
_wTimesGrabbed++;
}
}
public override void PocketItem()
{
((GrabbableObject)this).PocketItem();
if ((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null || !_wCanTalkSwitchedOff)
{
return;
}
_wCanTalkSwitchedOff = false;
if (_wTimesSwitchedOff == 0)
{
PlayAudioClip("PlayerAddedWeissToInv1");
_wTimesSwitchedOff++;
}
else if (Random.value <= 0.5f)
{
int wTimesSwitchedOff = _wTimesSwitchedOff;
if (wTimesSwitchedOff >= 1 && wTimesSwitchedOff <= 7)
{
PlayAudioClip("PlayerAddedWeissToInv" + Random.Range(2, 7));
}
_wTimesSwitchedOff++;
}
}
public override void DiscardItem()
{
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Expected I4, but got Unknown
((GrabbableObject)this).DiscardItem();
if ((Object)(object)_wasGrabbedBy == (Object)null)
{
return;
}
if (_wasGrabbedBy.isPlayerDead)
{
CauseOfDeath causeOfDeath = _wasGrabbedBy.causeOfDeath;
switch ((int)causeOfDeath)
{
case 7:
PlayAudioClip("PlayerIsDeadMine1");
break;
case 3:
PlayAudioClip("PlayerIsDeadMine1");
break;
case 0:
case 1:
PlayAudioClip("PlayerIsDeadBludg1");
break;
case 2:
case 4:
PlayAudioClip("PlayerIsDeadStra1");
break;
case 5:
case 6:
case 8:
case 9:
case 10:
case 11:
PlayAudioClip("PlayerIsDeadElc1");
break;
default:
PlayAudioClip("PlayerIsDead" + Random.Range(1, 7));
break;
}
}
else
{
if (((GrabbableObject)this).isInElevator && _wCanTalkDiscardShip)
{
switch (_wTimesDiscardShip)
{
case 0:
PlayAudioClip("PlayerDroppedWeissInsideShip1");
break;
case 5:
PlayAudioClip("PlayerDroppedWeissInsideShip2");
_wCanTalkDiscardShip = false;
break;
}
_wTimesDiscardShip++;
}
if (((GrabbableObject)this).isInFactory && _wCanTalkDiscardDungeon)
{
switch (_wTimesDiscardDungeon)
{
case 0:
PlayAudioClip("PlayerDroppedWeissInsideDungeon1");
break;
case 5:
PlayAudioClip("PlayerDroppedWeissInsideDungeon2");
_wCanTalkDiscardDungeon = false;
break;
}
_wTimesDiscardDungeon++;
}
}
_wCanTalkSwitchedOff = true;
}
private void LoadAudioClip(string clip, string clipFile)
{
AudioClip val = Plugin.LoadItemFromBundle<AudioClip>(Plugin.WeissBundle, "Assets/Dumbass/Resources/Sounds/Weiss/" + clip + ".wav");
if ((Object)(object)val != (Object)null)
{
_audioClips[clip] = val;
}
}
public void PlayAudioClip(string clip)
{
if (!_audioSource.isPlaying)
{
if (!_audioClips.ContainsKey(clip))
{
LoadAudioClip(clip, clip + ".wav");
}
if (_audioClips.ContainsKey(clip))
{
_audioSource.PlayOneShot(_audioClips[clip]);
}
}
}
private IEnumerator PlayFollowUpLine(string clip, float delayInSeconds, bool followUpCondition, bool followUpConditionExpected)
{
yield return (object)new WaitForSeconds(delayInSeconds);
if (followUpCondition == followUpConditionExpected)
{
PlayAudioClip(clip);
}
}
protected override void __initializeVariables()
{
((PhysicsProp)this).__initializeVariables();
}
protected internal override string __getTypeName()
{
return "Weiss";
}
}
}
namespace GrimoireWeiss.NetcodePatcher
{
[AttributeUsage(AttributeTargets.Module)]
internal class NetcodePatchedAssemblyAttribute : Attribute
{
}
}