using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using FacilityMeltdown.API;
using FacilityMeltdown.MeltdownSequence.Behaviours;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using PizzaProbability.Config;
using PizzaProbability.Patches;
using PizzaTowerEscapeMusic;
using Unity.Collections;
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("PizzaProbability")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Adds per-moon chance to the FacilityMeltdown mod. Improves interoperability with PizzaTowerEscapeMusic. Includes optional extras.")]
[assembly: AssemblyFileVersion("1.2.2.0")]
[assembly: AssemblyInformationalVersion("1.2.2")]
[assembly: AssemblyProduct("PizzaProbability")]
[assembly: AssemblyTitle("PizzaProbability")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.2.2.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace PizzaProbability
{
[BepInPlugin("PizzaProbability", "PizzaProbability", "1.2.2")]
public class PizzaProbabilityMod : BaseUnityPlugin
{
internal static ManualLogSource Logger;
internal static PizzaProbabilityConfig Config;
private static Random solarFlares;
private static Random stockMarket;
private static bool coreUnstable;
private readonly Harmony harmony = new Harmony("PizzaProbability");
private void Awake()
{
Logger = ((BaseUnityPlugin)this).Logger;
Logger.LogInfo((object)"Is today pizza day?");
Config = new PizzaProbabilityConfig(((BaseUnityPlugin)this).Config);
try
{
harmony.PatchAll(typeof(StartOfRoundPatch));
}
catch
{
Logger.LogError((object)"Failed to patch StartOfRound. PizzaProbability is now disabled.");
return;
}
try
{
MethodInfo methodInfo = typeof(LungProp).GetMethod("EquipItem");
foreach (Patch prefix in Harmony.GetPatchInfo((MethodBase)methodInfo).Prefixes)
{
if (prefix.owner == "me.loaforc.facilitymeltdown")
{
harmony.Unpatch((MethodBase)methodInfo, prefix.PatchMethod);
methodInfo = null;
break;
}
}
if (methodInfo != null)
{
Logger.LogError((object)"Failed to locate FacilityMeltdown. PizzaProbability is now disabled.");
return;
}
}
catch (Exception arg)
{
Logger.LogError((object)$"Failed to unpatch LungProp. PizzaProbability is now disabled.\n{arg}");
return;
}
try
{
harmony.PatchAll(typeof(LungPropPatch));
}
catch
{
Logger.LogError((object)"Failed to patch LungProp. PizzaProbability is now disabled.");
return;
}
PizzaProbabilityConfig.ActiveSettings.OutputForecast();
PizzaProbabilityConfig.ActiveSettings.OutputEconomy();
try
{
harmony.PatchAll(typeof(GameNetworkManagerPatch));
try
{
harmony.PatchAll(typeof(PlayerControllerBPatch));
}
catch
{
Logger.LogError((object)"Failed to patch PlayerControllerB. Config sync is now disabled.");
}
}
catch
{
Logger.LogError((object)"Failed to patch GameNetworkManager. Config sync is now disabled.");
}
if (PizzaProbabilityConfig.PizzaPatch)
{
try
{
harmony.PatchAll(typeof(GameEventListenerPatch));
try
{
harmony.PatchAll(typeof(MeltdownHandlerPatch));
return;
}
catch
{
Logger.LogError((object)"Failed to patch FacilityMeltdown. Default music will not be muted.");
return;
}
}
catch
{
Logger.LogInfo((object)"Failed to patch PizzaTowerEscapeMusic. Ignore this if not using PTEM.");
return;
}
}
Logger.LogInfo((object)"Skipping PizzaTowerEscapeMusic patch. PizzaPatch is disabled via config.");
}
internal static void Randomize(StartOfRound round)
{
solarFlares = new Random(round.randomMapSeed);
stockMarket = new Random(round.randomMapSeed - 100);
if (solarFlares.Next(0, 100) < PizzaProbabilityConfig.GetMoonSettings(round.currentLevel.PlanetName).MeltdownChance)
{
coreUnstable = true;
Logger.LogInfo((object)"Today is pizza day. (Apparatus is unsafe.)");
}
else
{
coreUnstable = false;
Logger.LogInfo((object)"Today is not pizza day. (Apparatus is safe.)");
}
}
internal static void FindOut(LungProp apparatus)
{
if (!((Object)(object)apparatus != (Object)null) || !apparatus.isLungDocked || MeltdownAPI.MeltdownStarted)
{
return;
}
if (coreUnstable)
{
if (stockMarket != null && PizzaProbabilityConfig.ActiveSettings.ApparatusValueMultiplier)
{
((GrabbableObject)apparatus).SetScrapValue(stockMarket.Next(Convert.ToInt32(PizzaProbabilityConfig.ActiveSettings.SpicyApparatusMinFactor * (float)PizzaProbabilityConfig.ActiveSettings.ApparatusValueBase), 1 + Convert.ToInt32(PizzaProbabilityConfig.ActiveSettings.SpicyApparatusMaxFactor * (float)PizzaProbabilityConfig.ActiveSettings.ApparatusValueBase)));
stockMarket = null;
Logger.LogInfo((object)$"Added extra cheese to the pizza. (Set apparatus value to ${((GrabbableObject)apparatus).scrapValue}.)");
}
Logger.LogInfo((object)"The pizza is spicy! (Meltdown may proceed.)");
MeltdownAPI.StartMeltdown("PizzaProbability");
}
else
{
if (stockMarket != null && PizzaProbabilityConfig.ActiveSettings.ApparatusValueMultiplier)
{
((GrabbableObject)apparatus).SetScrapValue(stockMarket.Next(Convert.ToInt32(PizzaProbabilityConfig.ActiveSettings.SafeApparatusMinFactor * (float)PizzaProbabilityConfig.ActiveSettings.ApparatusValueBase), 1 + Convert.ToInt32(PizzaProbabilityConfig.ActiveSettings.SafeApparatusMaxFactor * (float)PizzaProbabilityConfig.ActiveSettings.ApparatusValueBase)));
stockMarket = null;
Logger.LogInfo((object)$"Added extra sauce to the pizza. (Set apparatus value to ${((GrabbableObject)apparatus).scrapValue}.)");
}
Logger.LogInfo((object)"The pizza is basic. (Meltdown was blocked.)");
}
}
internal static void MuteDefaultMusic(AudioSource music)
{
music.volume = 0f;
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "PizzaProbability";
public const string PLUGIN_NAME = "PizzaProbability";
public const string PLUGIN_VERSION = "1.2.2";
}
}
namespace PizzaProbability.Patches
{
[HarmonyPatch(typeof(GameEventListener))]
internal class GameEventListenerPatch
{
[HarmonyPrefix]
[HarmonyPatch("CheckApparatusTaken")]
private static bool CheckApparatusPatch()
{
return MeltdownAPI.MeltdownStarted;
}
}
[HarmonyPatch(typeof(GameNetworkManager))]
internal class GameNetworkManagerPatch
{
[HarmonyPostfix]
[HarmonyPatch("StartDisconnect")]
public static void StartDisconnectPatch()
{
SyncedInstance<PizzaProbabilityConfig>.RevertSync();
}
}
[HarmonyPatch(typeof(LungProp))]
internal class LungPropPatch
{
[HarmonyPrefix]
[HarmonyPatch("EquipItem")]
private static void ApparatusEquipPatch(LungProp __instance)
{
PizzaProbabilityMod.FindOut(__instance);
}
}
[HarmonyPatch(typeof(MeltdownHandler))]
internal class MeltdownHandlerPatch
{
[HarmonyPostfix]
[HarmonyPatch("Update")]
private static void UpdatePatch(AudioSource ___meltdownMusic)
{
PizzaProbabilityMod.MuteDefaultMusic(___meltdownMusic);
}
}
[HarmonyPatch(typeof(PlayerControllerB))]
internal class PlayerControllerBPatch
{
[HarmonyPostfix]
[HarmonyPatch("ConnectClientToPlayerObject")]
public static void ConnectClientPatch()
{
PizzaProbabilityConfig.InitializeLocalPlayer();
}
}
[HarmonyPatch(typeof(StartOfRound))]
internal class StartOfRoundPatch
{
[HarmonyPostfix]
[HarmonyPatch("Awake")]
private static void AwakePatch(StartOfRound __instance)
{
PizzaProbabilityConfig.RegisterMoons(__instance);
}
[HarmonyPrefix]
[HarmonyPatch("OnShipLandedMiscEvents")]
private static void ShipLandedPatch(StartOfRound __instance)
{
PizzaProbabilityMod.Randomize(__instance);
}
}
}
namespace PizzaProbability.Config
{
[Serializable]
internal class MoonConfig
{
internal readonly string MoonName = "";
[NonSerialized]
private readonly ConfigEntry<int> meltdownChance;
[NonSerialized]
private readonly ConfigEntry<int> apparatusValueBase;
[NonSerialized]
private readonly ConfigEntry<bool> apparatusValueMultiplier;
[NonSerialized]
private readonly ConfigEntry<bool> useMoonSettings;
[NonSerialized]
private readonly ConfigEntry<float> safeApparatusMinFactor;
[NonSerialized]
private readonly ConfigEntry<float> safeApparatusMaxFactor;
[NonSerialized]
private readonly ConfigEntry<float> spicyApparatusMinFactor;
[NonSerialized]
private readonly ConfigEntry<float> spicyApparatusMaxFactor;
internal readonly int MeltdownChance = 50;
internal readonly int ApparatusValueBase = 80;
internal readonly bool ApparatusValueMultiplier = true;
internal readonly bool UseMoonSettings;
internal readonly float SafeApparatusMinFactor = 1f;
internal readonly float SafeApparatusMaxFactor = 3f;
internal readonly float SpicyApparatusMinFactor = 2f;
internal readonly float SpicyApparatusMaxFactor = 4f;
internal MoonConfig(ConfigFile config, string moonName)
{
MoonName = moonName;
if (moonName == "")
{
moonName = "Global";
meltdownChance = config.Bind<int>("FacilityMeltdown", "MeltdownChance", MeltdownChance, (ConfigDescription)null);
apparatusValueMultiplier = config.Bind<bool>("PizzaProbability", "ApparatusValueMultiplier", ApparatusValueMultiplier, (ConfigDescription)null);
apparatusValueBase = config.Bind<int>("PizzaProbability", "ApparatusValueBase", ApparatusValueBase, (ConfigDescription)null);
safeApparatusMinFactor = config.Bind<float>("PizzaProbability", "SafeApparatusMinFactor", SafeApparatusMinFactor, (ConfigDescription)null);
safeApparatusMaxFactor = config.Bind<float>("PizzaProbability", "SafeApparatusMaxFactor", SafeApparatusMaxFactor, (ConfigDescription)null);
spicyApparatusMinFactor = config.Bind<float>("PizzaProbability", "SpicyApparatusMinFactor", SpicyApparatusMinFactor, (ConfigDescription)null);
spicyApparatusMaxFactor = config.Bind<float>("PizzaProbability", "SpicyApparatusMaxFactor", SpicyApparatusMaxFactor, (ConfigDescription)null);
MeltdownChance = meltdownChance.Value;
ApparatusValueMultiplier = apparatusValueMultiplier.Value;
ApparatusValueBase = apparatusValueBase.Value;
SafeApparatusMinFactor = safeApparatusMinFactor.Value;
SafeApparatusMaxFactor = safeApparatusMaxFactor.Value;
SpicyApparatusMinFactor = spicyApparatusMinFactor.Value;
SpicyApparatusMaxFactor = spicyApparatusMaxFactor.Value;
config.Remove(((ConfigEntryBase)meltdownChance).Definition);
config.Remove(((ConfigEntryBase)apparatusValueMultiplier).Definition);
config.Remove(((ConfigEntryBase)apparatusValueBase).Definition);
config.Remove(((ConfigEntryBase)safeApparatusMinFactor).Definition);
config.Remove(((ConfigEntryBase)safeApparatusMaxFactor).Definition);
config.Remove(((ConfigEntryBase)spicyApparatusMinFactor).Definition);
config.Remove(((ConfigEntryBase)spicyApparatusMaxFactor).Definition);
config.Clear();
}
else
{
moonName = "Moon - ";
useMoonSettings = config.Bind<bool>(moonName + MoonName, "Use" + MoonName + "Settings", UseMoonSettings, "Enables moon-specific settings for " + MoonName + ". When disabled, global settings are used for " + MoonName + ".");
UseMoonSettings = useMoonSettings.Value;
}
meltdownChance = config.Bind<int>(moonName + MoonName, "MeltdownChance", MeltdownChance, "Sets the percentage chance of a meltdown occuring when the apparatus is taken.");
apparatusValueMultiplier = config.Bind<bool>(moonName + MoonName, "ApparatusValueMultiplier", ApparatusValueMultiplier, "Enables apparatus value multipliers.");
apparatusValueBase = config.Bind<int>(moonName + MoonName, "ApparatusValueBase", ApparatusValueBase, "Sets the base value of an apparatus before applying multipliers.");
safeApparatusMinFactor = config.Bind<float>(moonName + MoonName, "SafeApparatusMinFactor", SafeApparatusMinFactor, "Minimum value multiplier for a safe apparatus.");
safeApparatusMaxFactor = config.Bind<float>(moonName + MoonName, "SafeApparatusMaxFactor", SafeApparatusMaxFactor, "Maximum value multiplier for a safe apparatus.");
spicyApparatusMinFactor = config.Bind<float>(moonName + MoonName, "SpicyApparatusMinFactor", SpicyApparatusMinFactor, "Minimum value multiplier for an unsafe apparatus.");
spicyApparatusMaxFactor = config.Bind<float>(moonName + MoonName, "SpicyApparatusMaxFactor", SpicyApparatusMaxFactor, "Maximum value multiplier for an unsafe apparatus.");
MeltdownChance = meltdownChance.Value;
ApparatusValueMultiplier = apparatusValueMultiplier.Value;
ApparatusValueBase = apparatusValueBase.Value;
SafeApparatusMinFactor = safeApparatusMinFactor.Value;
SafeApparatusMaxFactor = safeApparatusMaxFactor.Value;
SpicyApparatusMinFactor = spicyApparatusMinFactor.Value;
SpicyApparatusMaxFactor = spicyApparatusMaxFactor.Value;
}
internal void OutputForecast()
{
PizzaProbabilityMod.Logger.LogInfo((object)$"Forecast: {MeltdownChance}% chance of pizza.");
}
internal void OutputEconomy()
{
if (ApparatusValueMultiplier)
{
PizzaProbabilityMod.Logger.LogInfo((object)$"Cost of pizza: ${ApparatusValueBase}");
PizzaProbabilityMod.Logger.LogInfo((object)$"Basic pizza stocks: {SafeApparatusMinFactor}-{SafeApparatusMaxFactor}x");
PizzaProbabilityMod.Logger.LogInfo((object)$"Spicy pizza stocks: {SpicyApparatusMinFactor}-{SpicyApparatusMaxFactor}x");
}
}
internal void OutputAll()
{
OutputForecast();
OutputEconomy();
}
}
[Serializable]
internal class MoonConfigList
{
[NonSerialized]
private readonly ConfigFile config;
private readonly List<MoonConfig> moonConfigList;
[NonSerialized]
private readonly ConfigEntry<string> validMoonList;
[NonSerialized]
private List<string> validMoonBuffer;
private List<string> ValidMoonList
{
get
{
List<string> list = validMoonBuffer;
if (list == null)
{
string[] array = validMoonList.Value.Split(",");
List<string> list2 = new List<string>(array.Length);
list2.AddRange(array);
List<string> list3 = list2;
validMoonBuffer = list2;
list = list3;
}
return list;
}
set
{
value.Sort();
validMoonList.Value = string.Join(",", value);
validMoonBuffer = null;
}
}
internal MoonConfigList(ConfigFile config)
{
this.config = config;
moonConfigList = new List<MoonConfig>(1)
{
new MoonConfig(config, "")
};
validMoonList = config.Bind<string>("Restricted", "MoonList", "Adamance,Artifice,Assurance,Dine,Embrion,Experimentation,Liquidation,March,Offense,Rend,Titan,Vow", "Automatically generated by PizzaProbability. Do not touch.");
foreach (string validMoon in ValidMoonList)
{
moonConfigList.Add(new MoonConfig(config, validMoon));
}
validMoonBuffer = new List<string>();
}
private void TruncateMoonName(ref string moonName)
{
moonName = new string(moonName.Where(char.IsLetter).ToArray());
}
internal void Add(string moonName)
{
TruncateMoonName(ref moonName);
if (!ValidMoonList.Contains(moonName))
{
if (moonName == "Gordion")
{
return;
}
ValidMoonList.Add(moonName);
ValidMoonList = ValidMoonList;
}
foreach (MoonConfig moonConfig in moonConfigList)
{
if (moonConfig.MoonName == moonName)
{
return;
}
}
moonConfigList.Add(new MoonConfig(config, moonName));
}
internal MoonConfig Get()
{
return moonConfigList[0];
}
internal MoonConfig Get(string moonName)
{
TruncateMoonName(ref moonName);
foreach (MoonConfig moonConfig in moonConfigList)
{
if (moonConfig.MoonName == moonName)
{
if (moonConfig.UseMoonSettings)
{
return moonConfig;
}
break;
}
}
return Get();
}
}
[Serializable]
internal class PizzaProbabilityConfig : SyncedInstance<PizzaProbabilityConfig>
{
[CompilerGenerated]
private static class <>O
{
public static HandleNamedMessageDelegate <0>__OnRequestSync;
public static HandleNamedMessageDelegate <1>__OnReceiveSync;
}
private readonly MoonConfigList moonConfigList;
[NonSerialized]
private readonly ConfigEntry<bool> pizzaPatch;
internal static MoonConfig ActiveSettings { get; private set; }
internal static bool PizzaPatch { get; private set; } = true;
internal PizzaProbabilityConfig(ConfigFile config)
{
InitInstance(this);
moonConfigList = new MoonConfigList(config);
ActiveSettings = moonConfigList.Get();
pizzaPatch = config.Bind<bool>("PizzaTowerEscapeMusic", "PizzaPatch", PizzaPatch, (ConfigDescription)null);
PizzaPatch = pizzaPatch.Value;
config.Remove(((ConfigEntryBase)pizzaPatch).Definition);
pizzaPatch = config.Bind<bool>("Global", "PizzaPatch", PizzaPatch, "Patches PizzaTowerEscapeMusic's 'ApparatusTaken' event to only activate when a meltdown occurs. Disables FacilityMeltdown's provided music.");
PizzaPatch = pizzaPatch.Value;
}
internal static void RegisterMoons(StartOfRound round)
{
SelectableLevel[] levels = round.levels;
foreach (SelectableLevel val in levels)
{
SyncedInstance<PizzaProbabilityConfig>.Default.moonConfigList.Add(val.PlanetName);
}
}
internal static MoonConfig GetGlobalSettings()
{
return ActiveSettings = SyncedInstance<PizzaProbabilityConfig>.Instance.moonConfigList.Get();
}
internal static MoonConfig GetMoonSettings(string moonName)
{
ActiveSettings = SyncedInstance<PizzaProbabilityConfig>.Instance.moonConfigList.Get(moonName);
if (ActiveSettings.MoonName == "")
{
PizzaProbabilityMod.Logger.LogInfo((object)("No special offers are available in " + moonName + ". (Using global settings.)"));
}
else
{
PizzaProbabilityMod.Logger.LogInfo((object)("Special offers are available in " + moonName + ". (Using moon-specific settings.)"));
ActiveSettings.OutputAll();
}
return ActiveSettings;
}
internal static void InitializeLocalPlayer()
{
//IL_004c: 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_0057: Expected O, but got Unknown
//IL_0021: 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_002c: Expected O, but got Unknown
if (SyncedInstance<PizzaProbabilityConfig>.IsHost)
{
CustomMessagingManager messageManager = SyncedInstance<PizzaProbabilityConfig>.MessageManager;
object obj = <>O.<0>__OnRequestSync;
if (obj == null)
{
HandleNamedMessageDelegate val = OnRequestSync;
<>O.<0>__OnRequestSync = val;
obj = (object)val;
}
messageManager.RegisterNamedMessageHandler("PizzaProbability_OnRequestConfigSync", (HandleNamedMessageDelegate)obj);
return;
}
CustomMessagingManager messageManager2 = SyncedInstance<PizzaProbabilityConfig>.MessageManager;
object obj2 = <>O.<1>__OnReceiveSync;
if (obj2 == null)
{
HandleNamedMessageDelegate val2 = OnReceiveSync;
<>O.<1>__OnReceiveSync = val2;
obj2 = (object)val2;
}
messageManager2.RegisterNamedMessageHandler("PizzaProbability_OnReceiveConfigSync", (HandleNamedMessageDelegate)obj2);
RequestSync();
}
private static void RequestSync()
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
if (!SyncedInstance<PizzaProbabilityConfig>.IsClient)
{
return;
}
PizzaProbabilityMod.Logger.LogInfo((object)"Ordering a pizza... (Config requested from host.)");
FastBufferWriter val = default(FastBufferWriter);
((FastBufferWriter)(ref val))..ctor(SyncedInstance<PizzaProbabilityConfig>.IntSize, (Allocator)2, -1);
try
{
SyncedInstance<PizzaProbabilityConfig>.MessageManager.SendNamedMessage("PizzaProbability_OnRequestConfigSync", 0uL, val, (NetworkDelivery)3);
}
finally
{
((IDisposable)(FastBufferWriter)(ref val)).Dispose();
}
}
private static void OnRequestSync(ulong clientId, FastBufferReader _)
{
//IL_0047: 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_0068: Unknown result type (might be due to invalid IL or missing references)
if (!SyncedInstance<PizzaProbabilityConfig>.IsHost)
{
return;
}
PizzaProbabilityMod.Logger.LogInfo((object)$"Recieved an order from customer #{clientId}. (Config requested by client.)");
byte[] array = SyncedInstance<PizzaProbabilityConfig>.SerializeToBytes(SyncedInstance<PizzaProbabilityConfig>.Instance);
int num = array.Length;
FastBufferWriter val = default(FastBufferWriter);
((FastBufferWriter)(ref val))..ctor(num + SyncedInstance<PizzaProbabilityConfig>.IntSize, (Allocator)2, -1);
try
{
((FastBufferWriter)(ref val)).WriteValueSafe<int>(ref num, default(ForPrimitives));
((FastBufferWriter)(ref val)).WriteBytesSafe(array, -1, 0);
SyncedInstance<PizzaProbabilityConfig>.MessageManager.SendNamedMessage("PizzaProbability_OnReceiveConfigSync", clientId, val, (NetworkDelivery)4);
PizzaProbabilityMod.Logger.LogInfo((object)$"Sent a pizza to customer #{clientId}. (Config sent to client.)");
}
catch (Exception arg)
{
PizzaProbabilityMod.Logger.LogError((object)$"Cannot to deliver to customer #{clientId}. (Config failed to sync with client.)\n{arg}");
}
finally
{
((IDisposable)(FastBufferWriter)(ref val)).Dispose();
}
}
private static void OnReceiveSync(ulong _, FastBufferReader reader)
{
//IL_0024: 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)
if (!((FastBufferReader)(ref reader)).TryBeginRead(SyncedInstance<PizzaProbabilityConfig>.IntSize))
{
PizzaProbabilityMod.Logger.LogError((object)"Recieved the wrong order. (Config failed to sync with host.)");
return;
}
int num = default(int);
((FastBufferReader)(ref reader)).ReadValueSafe<int>(ref num, default(ForPrimitives));
if (!((FastBufferReader)(ref reader)).TryBeginRead(num))
{
PizzaProbabilityMod.Logger.LogError((object)"Recieved a cold pizza. (Config failed to sync with host.)");
return;
}
byte[] data = new byte[num];
((FastBufferReader)(ref reader)).ReadBytesSafe(ref data, num, 0);
SyncedInstance<PizzaProbabilityConfig>.SyncInstance(data);
PizzaProbabilityMod.Logger.LogInfo((object)"The pizza is here! (Config received from host.)");
GetGlobalSettings().OutputAll();
}
}
[Serializable]
internal class SyncedInstance<T>
{
[NonSerialized]
protected static int IntSize = 4;
protected static T Default { get; private set; }
protected static T Instance { get; private set; }
protected static bool IsHost => NetworkManager.Singleton.IsHost;
protected static bool IsClient => NetworkManager.Singleton.IsClient;
protected static CustomMessagingManager MessageManager => NetworkManager.Singleton.CustomMessagingManager;
protected void InitInstance(T instance)
{
Default = instance;
Instance = instance;
IntSize = 4;
}
protected static void SyncInstance(byte[] data)
{
Instance = DeserializeFromBytes(data);
}
internal static void RevertSync()
{
Instance = Default;
}
protected static byte[] SerializeToBytes(T val)
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
using MemoryStream memoryStream = new MemoryStream();
try
{
binaryFormatter.Serialize(memoryStream, val);
return memoryStream.ToArray();
}
catch (Exception arg)
{
PizzaProbabilityMod.Logger.LogError((object)$"Is cereal a pizza topping? (Error serializing instance.)\n{arg}");
return null;
}
}
private static T DeserializeFromBytes(byte[] data)
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
using MemoryStream serializationStream = new MemoryStream(data);
try
{
return (T)binaryFormatter.Deserialize(serializationStream);
}
catch (Exception arg)
{
PizzaProbabilityMod.Logger.LogError((object)$"Why is there cereal on my pizza? (Error deserializing instance.)\n{arg}");
return default(T);
}
}
}
}