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.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using ReservedItemSlotCore;
using ReservedItemSlotCore.Config;
using ReservedItemSlotCore.Data;
using ReservedSprayPaintSlot.Config;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("ReservedSprayPaintSlot")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ReservedSprayPaintSlot")]
[assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("d5fcfd75-740b-418d-b185-a0bbdea6fa40")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ReservedSprayPaintSlot
{
[BepInPlugin("FlipMods.ReservedSprayPaintSlot", "ReservedSprayPaintSlot", "1.1.1")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
public static Plugin instance;
private static ManualLogSource logger;
private Harmony _harmony;
public static ReservedItemSlotData sprayPaintSlotData;
public static ReservedItemData sprayPaintData;
public static List<ReservedItemData> additionalItemData = new List<ReservedItemData>();
private void Awake()
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Expected O, but got Unknown
instance = this;
CreateCustomLogger();
ConfigSettings.BindConfigSettings();
CreateReservedItemSlots();
CreateAdditionalReservedItemSlots();
_harmony = new Harmony("ReservedSprayPaintSlot");
PatchAll();
Log("ReservedSprayPaintSlot loaded");
}
private void CreateReservedItemSlots()
{
//IL_003e: 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)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Expected O, but got Unknown
sprayPaintSlotData = ReservedItemSlotData.CreateReservedItemSlotData("spray_paint", ConfigSettings.overrideItemSlotPriority.Value, ConfigSettings.overridePurchasePrice.Value);
sprayPaintData = sprayPaintSlotData.AddItemToReservedItemSlot(new ReservedItemData("페인트 스프레이", (PlayerBone)1, new Vector3(0.26f, -0.05f, 0.2f), new Vector3(-105f, 0f, 0f)));
}
private void CreateAdditionalReservedItemSlots()
{
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_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_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Expected O, but got Unknown
string[] array = ConfigSettings.ParseAdditionalItems();
string[] array2 = array;
foreach (string text in array2)
{
if (!sprayPaintSlotData.ContainsItem(text))
{
LogWarning("Adding additional item to reserved item slot. Item: " + text);
ReservedItemData val = new ReservedItemData(text, (PlayerBone)0, default(Vector3), default(Vector3));
additionalItemData.Add(val);
sprayPaintSlotData.AddItemToReservedItemSlot(val);
}
}
}
private void PatchAll()
{
IEnumerable<Type> enumerable;
try
{
enumerable = Assembly.GetExecutingAssembly().GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
enumerable = ex.Types.Where((Type t) => t != null);
}
foreach (Type item in enumerable)
{
_harmony.PatchAll(item);
}
}
private void CreateCustomLogger()
{
try
{
logger = Logger.CreateLogSource($"{((BaseUnityPlugin)this).Info.Metadata.Name}-{((BaseUnityPlugin)this).Info.Metadata.Version}");
}
catch
{
logger = ((BaseUnityPlugin)this).Logger;
}
}
public static void Log(string message)
{
logger.LogInfo((object)message);
}
public static void LogError(string message)
{
logger.LogError((object)message);
}
public static void LogWarning(string message)
{
logger.LogWarning((object)message);
}
public static bool IsModLoaded(string guid)
{
return Chainloader.PluginInfos.ContainsKey(guid);
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "FlipMods.ReservedSprayPaintSlot";
public const string PLUGIN_NAME = "ReservedSprayPaintSlot";
public const string PLUGIN_VERSION = "1.1.1";
}
}
namespace ReservedSprayPaintSlot.Patches
{
[HarmonyPatch]
internal static class SprayPaintPatcher
{
public static PlayerControllerB localPlayerController => StartOfRound.Instance?.localPlayerController;
public static PlayerControllerB GetPreviousPlayerHeldBy(SprayPaintItem sprayPaintItem)
{
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Expected O, but got Unknown
return (PlayerControllerB)Traverse.Create((object)sprayPaintItem).Field("previousPlayerHeldBy").GetValue();
}
public static SprayPaintItem GetMainSprayPaint(PlayerControllerB playerController)
{
return GetCurrentlySelectedSprayPaint(playerController) ?? GetReservedSprayPaint(playerController);
}
public static SprayPaintItem GetReservedSprayPaint(PlayerControllerB playerController)
{
ReservedItemSlotData val = default(ReservedItemSlotData);
ReservedPlayerData value;
return (SprayPaintItem)((SessionManager.TryGetUnlockedItemSlotData(Plugin.sprayPaintSlotData.slotName, ref val) && ReservedPlayerData.allPlayerData.TryGetValue(playerController, out value)) ? /*isinst with value type is only supported in some contexts*/: null);
}
public static SprayPaintItem GetCurrentlySelectedSprayPaint(PlayerControllerB playerController)
{
return (SprayPaintItem)((playerController.currentItemSlot >= 0 && playerController.currentItemSlot < playerController.ItemSlots.Length) ? /*isinst with value type is only supported in some contexts*/: null);
}
}
[HarmonyPatch]
public class SprayPaintTweaks
{
public static float GetSprayCanTankValue(SprayPaintItem sprayPaintItem)
{
return (float)Traverse.Create((object)sprayPaintItem).Field("sprayCanTank").GetValue();
}
public static void SetSprayCanTankValue(SprayPaintItem sprayPaintItem, float value)
{
Traverse.Create((object)sprayPaintItem).Field("sprayCanTank").SetValue((object)value);
}
[HarmonyPatch(typeof(SprayPaintItem), "Start")]
[HarmonyPrefix]
public static void InitSprayPaint(SprayPaintItem __instance)
{
SetSprayCanTankValue(__instance, ConfigSettings.sprayPaintCapacityMultiplier.Value);
}
[HarmonyPatch(typeof(SprayPaintItem), "LoadItemSaveData")]
[HarmonyPostfix]
public static void OnLoadValues(int saveData, SprayPaintItem __instance)
{
float value = Mathf.Clamp(GetSprayCanTankValue(__instance) * ConfigSettings.sprayPaintCapacityMultiplier.Value, 0f, ConfigSettings.sprayPaintCapacityMultiplier.Value);
SetSprayCanTankValue(__instance, value);
Plugin.Log("Loading spraypaint save data. Remaining capacity: " + value);
}
[HarmonyPatch(typeof(SprayPaintItem), "GetItemDataToSave")]
[HarmonyPostfix]
public static void OnSaveValues(ref int __result, SprayPaintItem __instance)
{
__result = (int)Mathf.Clamp((float)__result / ConfigSettings.sprayPaintCapacityMultiplier.Value, 0f, 100f);
}
}
}
namespace ReservedSprayPaintSlot.Config
{
public static class ConfigSettings
{
public static ConfigEntry<float> sprayPaintCapacityMultiplier;
public static ConfigEntry<int> overrideItemSlotPriority;
public static ConfigEntry<int> overridePurchasePrice;
public static ConfigEntry<string> additionalItemsInSlot;
public static Dictionary<string, ConfigEntryBase> currentConfigEntries = new Dictionary<string, ConfigEntryBase>();
public static void BindConfigSettings()
{
Plugin.Log("BindingConfigs");
sprayPaintCapacityMultiplier = AddConfigEntry<float>(((BaseUnityPlugin)Plugin.instance).Config.Bind<float>("Client-side", "SprayPaintCapacityMultiplier", 10f, "Extends the max capacity of spraypaint cans by this multiplier. This setting will soon be host only, and will sync with all non-host clients."));
overrideItemSlotPriority = AddConfigEntry<int>(((BaseUnityPlugin)Plugin.instance).Config.Bind<int>("Server-side", "SprayPaintPriorityOverride", 25, "Manually set the priority for this item slot. Higher priority slots will come first in the reserved item slots, which will appear below the other slots. Negative priority items will appear on the left side of the screen, this is disabled in the core mod's config."));
overridePurchasePrice = AddConfigEntry<int>(((BaseUnityPlugin)Plugin.instance).Config.Bind<int>("Server-side", "SprayPaintSlotPriceOverride", 50, "Manually set the price for this item in the store. Setting 0 will force this item to be unlocked immediately after the game starts."));
additionalItemsInSlot = AddConfigEntry<string>(((BaseUnityPlugin)Plugin.instance).Config.Bind<string>("Server-side", "AdditionalItemsInSlot", "", "Syntax: \"Item1,Item name2\" (without quotes). When adding items, use the item's name as it appears in game. Include spaces if there are spaces in the item name. Adding items that do not exist, or that are from a mod which is not enabled will not cause any problems.\nNOTE: IF YOU ARE USING A TRANSLATION MOD, YOU MAY NEED TO ADD THE TRANSLATED NAME OF ANY ITEM YOU WANT IN THIS SLOT."));
additionalItemsInSlot.Value = additionalItemsInSlot.Value.Replace(", ", ",");
sprayPaintCapacityMultiplier.Value = Mathf.Max(sprayPaintCapacityMultiplier.Value, 0f);
TryRemoveOldConfigSettings();
}
public static ConfigEntry<T> AddConfigEntry<T>(ConfigEntry<T> configEntry)
{
currentConfigEntries.Add(((ConfigEntryBase)configEntry).Definition.Key, (ConfigEntryBase)(object)configEntry);
return configEntry;
}
public static string[] ParseAdditionalItems()
{
return ConfigSettings.ParseItemNames(additionalItemsInSlot.Value);
}
public static void TryRemoveOldConfigSettings()
{
HashSet<string> hashSet = new HashSet<string>();
HashSet<string> hashSet2 = new HashSet<string>();
foreach (ConfigEntryBase value in currentConfigEntries.Values)
{
hashSet.Add(value.Definition.Section);
hashSet2.Add(value.Definition.Key);
}
try
{
ConfigFile config = ((BaseUnityPlugin)Plugin.instance).Config;
string configFilePath = config.ConfigFilePath;
if (!File.Exists(configFilePath))
{
return;
}
string text = File.ReadAllText(configFilePath);
string[] array = File.ReadAllLines(configFilePath);
string text2 = "";
for (int i = 0; i < array.Length; i++)
{
array[i] = array[i].Replace("\n", "");
if (array[i].Length <= 0)
{
continue;
}
if (array[i].StartsWith("["))
{
if (text2 != "" && !hashSet.Contains(text2))
{
text2 = "[" + text2 + "]";
int num = text.IndexOf(text2);
int num2 = text.IndexOf(array[i]);
text = text.Remove(num, num2 - num);
}
text2 = array[i].Replace("[", "").Replace("]", "").Trim();
}
else
{
if (!(text2 != ""))
{
continue;
}
if (i <= array.Length - 4 && array[i].StartsWith("##"))
{
int j;
for (j = 1; i + j < array.Length && array[i + j].Length > 3; j++)
{
}
if (hashSet.Contains(text2))
{
int num3 = array[i + j - 1].IndexOf("=");
string item = array[i + j - 1].Substring(0, num3 - 1);
if (!hashSet2.Contains(item))
{
int num4 = text.IndexOf(array[i]);
int num5 = text.IndexOf(array[i + j - 1]) + array[i + j - 1].Length;
text = text.Remove(num4, num5 - num4);
}
}
i += j - 1;
}
else if (array[i].Length > 3)
{
text = text.Replace(array[i], "");
}
}
}
if (!hashSet.Contains(text2))
{
text2 = "[" + text2 + "]";
int num6 = text.IndexOf(text2);
text = text.Remove(num6, text.Length - num6);
}
while (text.Contains("\n\n\n"))
{
text = text.Replace("\n\n\n", "\n\n");
}
File.WriteAllText(configFilePath, text);
config.Reload();
}
catch
{
}
}
}
}