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.Logging;
using ExitGames.Client.Photon;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
[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: AssemblyCompany("lansmurf.PeakCoinMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Adds a coin and shopkeeper system to PEAK.")]
[assembly: AssemblyFileVersion("1.2.0.0")]
[assembly: AssemblyInformationalVersion("1.2.0+a3a2b80850bc8d2804fde94a6bf8d4164019015c")]
[assembly: AssemblyProduct("lansmurf.PeakCoinMod")]
[assembly: AssemblyTitle("lansmurf.PeakCoinMod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.2.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.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace CoinModProject
{
public static class PluginInfo
{
public const string PLUGIN_GUID = "lansmurf.PeakCoinMod";
public const string PLUGIN_NAME = "lansmurf.PeakCoinMod";
public const string PLUGIN_VERSION = "1.2.0";
}
}
namespace CoinMod
{
[BepInPlugin("com.lansmurf.peakcoinmod", "Peak Coin Mod", "4.1.0")]
public class CoinPlugin : BaseUnityPlugin
{
[CompilerGenerated]
private sealed class <InitializeWhenReady>d__2 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public CoinPlugin <>4__this;
private GameObject <modHostObject>5__1;
private Harmony <harmony>5__2;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <InitializeWhenReady>d__2(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<modHostObject>5__1 = null;
<harmony>5__2 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Expected O, but got Unknown
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Expected O, but got Unknown
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Expected O, but got Unknown
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_00ee: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitUntil((Func<bool>)(() => (Object)(object)Player.localPlayer != (Object)null));
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
Log.LogInfo((object)"Game is ready! Initializing PeakCoinMod systems...");
<modHostObject>5__1 = new GameObject("PeakCoinMod_Systems");
Object.DontDestroyOnLoad((Object)(object)<modHostObject>5__1);
<modHostObject>5__1.AddComponent<ShopManager>();
<modHostObject>5__1.AddComponent<CoinUI>();
<harmony>5__2 = new Harmony("com.lansmurf.peakcoinmod.player_setup");
<harmony>5__2.Patch((MethodBase)AccessTools.Method(typeof(Player), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(CoinPlugin), "PlayerAwakePostfix", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
if ((Object)(object)((Component)Player.localPlayer).GetComponent<PlayerCoinManager>() == (Object)null)
{
((Component)Player.localPlayer).gameObject.AddComponent<PlayerCoinManager>();
}
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();
}
}
internal static ManualLogSource Log;
private void Awake()
{
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Expected O, but got Unknown
Log = ((BaseUnityPlugin)this).Logger;
Log.LogInfo((object)"Peak Coin Mod v4.1.0 is loading!");
Harmony val = new Harmony("com.lansmurf.peakcoinmod.harmony");
val.PatchAll();
((MonoBehaviour)this).StartCoroutine(InitializeWhenReady());
Log.LogInfo((object)"Peak Coin Mod is ready and waiting for game to load...");
}
[IteratorStateMachine(typeof(<InitializeWhenReady>d__2))]
private IEnumerator InitializeWhenReady()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <InitializeWhenReady>d__2(0)
{
<>4__this = this
};
}
public static void PlayerAwakePostfix(Player __instance)
{
if ((Object)(object)((Component)__instance).gameObject.GetComponent<PlayerCoinManager>() == (Object)null)
{
((Component)__instance).gameObject.AddComponent<PlayerCoinManager>();
}
}
}
public class CoinUI : MonoBehaviour
{
private TextMeshProUGUI coinText;
private Canvas canvas;
public static CoinUI Instance { get; private set; }
private void Awake()
{
if ((Object)(object)Instance != (Object)null)
{
Object.Destroy((Object)(object)((Component)this).gameObject);
}
else
{
Instance = this;
}
}
private void Start()
{
CreateCoinUICanvas();
}
private void CreateCoinUICanvas()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Expected O, but got Unknown
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Expected O, but got Unknown
//IL_0104: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
//IL_0122: Unknown result type (might be due to invalid IL or missing references)
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
//IL_0164: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject("PeakCoinMod_CoinCanvas");
canvas = val.AddComponent<Canvas>();
canvas.renderMode = (RenderMode)0;
canvas.sortingOrder = 99;
val.AddComponent<CanvasScaler>();
val.AddComponent<GraphicRaycaster>();
Object.DontDestroyOnLoad((Object)(object)val);
GameObject val2 = new GameObject("CoinCounterText");
val2.transform.SetParent(val.transform, false);
coinText = val2.AddComponent<TextMeshProUGUI>();
TextMeshProUGUI val3 = GUIManager.instance?.interactNameText;
if ((Object)(object)val3 != (Object)null)
{
((TMP_Text)coinText).font = ((TMP_Text)val3).font;
((TMP_Text)coinText).fontMaterial = ((TMP_Text)val3).fontMaterial;
((TMP_Text)coinText).fontSize = 24f;
((Graphic)coinText).color = Color.yellow;
((TMP_Text)coinText).alignment = (TextAlignmentOptions)513;
}
else
{
((TMP_Text)coinText).fontSize = 24f;
((Graphic)coinText).color = Color.white;
}
RectTransform component = val2.GetComponent<RectTransform>();
component.anchorMin = new Vector2(0f, 1f);
component.anchorMax = new Vector2(0f, 1f);
component.pivot = new Vector2(0f, 1f);
component.anchoredPosition = new Vector2(20f, -20f);
UpdateCoinCount(0);
}
public void UpdateCoinCount(int newAmount)
{
if ((Object)(object)coinText != (Object)null)
{
((TMP_Text)coinText).text = $"Coins: {newAmount}";
}
}
}
public class PlayerCoinManager : MonoBehaviourPun, IInRoomCallbacks
{
public static PlayerCoinManager LocalInstance { get; private set; }
public int SharedCoins { get; private set; }
private void Awake()
{
if (((MonoBehaviourPun)this).photonView.IsMine)
{
LocalInstance = this;
}
}
private void OnEnable()
{
PhotonNetwork.AddCallbackTarget((object)this);
}
private void OnDisable()
{
PhotonNetwork.RemoveCallbackTarget((object)this);
}
private void Start()
{
if (!PhotonNetwork.IsMasterClient)
{
((MonoBehaviourPun)this).photonView.RPC("RPC_Client_RequestSync", (RpcTarget)2, Array.Empty<object>());
CoinPlugin.Log.LogInfo((object)"Client has started. Requesting coin sync from host.");
}
}
public void RequestPurchase(string itemName)
{
((MonoBehaviourPun)this).photonView.RPC("RPC_Host_ProcessPurchaseRequest", (RpcTarget)2, new object[1] { itemName });
}
public void RequestModifyCoins(int amount)
{
((MonoBehaviourPun)this).photonView.RPC("RPC_Host_ProcessCoinModification", (RpcTarget)2, new object[1] { amount });
}
[PunRPC]
private void RPC_Host_ProcessCoinModification(int amount)
{
if (!PhotonNetwork.IsMasterClient)
{
return;
}
PlayerCoinManager localInstance = LocalInstance;
if ((Object)(object)localInstance == (Object)null)
{
CoinPlugin.Log.LogError((object)"Host's local PlayerCoinManager not found! Coin modification failed.");
return;
}
int num = localInstance.SharedCoins + amount;
if (num < 0)
{
num = 0;
}
((MonoBehaviourPun)localInstance).photonView.RPC("RPC_Client_UpdateCoins", (RpcTarget)0, new object[1] { num });
}
[PunRPC]
private void RPC_Host_ProcessPurchaseRequest(string itemName, PhotonMessageInfo info)
{
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
if (PhotonNetwork.IsMasterClient)
{
PlayerCoinManager localInstance = LocalInstance;
ShopItemData value;
if ((Object)(object)localInstance == (Object)null)
{
CoinPlugin.Log.LogError((object)"Host's local PlayerCoinManager not found! Purchase failed.");
}
else if (ShopDatabase.ItemData.TryGetValue(itemName, out value) && localInstance.SharedCoins >= value.Price)
{
int num = localInstance.SharedCoins - value.Price;
((MonoBehaviourPun)localInstance).photonView.RPC("RPC_Client_UpdateCoins", (RpcTarget)0, new object[1] { num });
((MonoBehaviourPun)this).photonView.RPC("RPC_Client_ConfirmPurchase", info.Sender, new object[1] { itemName });
CoinPlugin.Log.LogInfo((object)$"Host approved purchase of {itemName} for {info.Sender.NickName}. New coin total: {num}");
}
}
}
[PunRPC]
private void RPC_Client_ConfirmPurchase(string itemName)
{
if ((Object)(object)ShopManager.Instance != (Object)null)
{
CoinPlugin.Log.LogInfo((object)("Purchase of " + itemName + " confirmed by host. Spawning item."));
ShopManager.Instance.SpawnPurchasedItem(itemName);
}
}
[PunRPC]
private void RPC_Client_UpdateCoins(int newTotal)
{
if ((Object)(object)LocalInstance != (Object)null)
{
LocalInstance.SharedCoins = newTotal;
}
if ((Object)(object)CoinUI.Instance != (Object)null)
{
CoinUI.Instance.UpdateCoinCount(newTotal);
}
if ((Object)(object)ShopManager.Instance != (Object)null)
{
ShopManager.Instance.RefreshShopDisplay();
}
CoinPlugin.Log.LogInfo((object)$"Team coin count has been updated to {newTotal}");
}
[PunRPC]
private void RPC_Client_RequestSync(PhotonMessageInfo info)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
if (PhotonNetwork.IsMasterClient)
{
PlayerCoinManager localInstance = LocalInstance;
if (!((Object)(object)localInstance == (Object)null))
{
((MonoBehaviourPun)localInstance).photonView.RPC("RPC_Client_UpdateCoins", info.Sender, new object[1] { localInstance.SharedCoins });
CoinPlugin.Log.LogInfo((object)$"Host received sync request. Sending {localInstance.SharedCoins} coins to {info.Sender.NickName}.");
}
}
}
public void OnPlayerEnteredRoom(Player newPlayer)
{
if (PhotonNetwork.IsMasterClient)
{
PlayerCoinManager localInstance = LocalInstance;
if (!((Object)(object)localInstance == (Object)null))
{
((MonoBehaviourPun)localInstance).photonView.RPC("RPC_Client_UpdateCoins", newPlayer, new object[1] { localInstance.SharedCoins });
CoinPlugin.Log.LogInfo((object)$"New player {newPlayer.NickName} joined. Host is sending them the current coin count: {localInstance.SharedCoins}.");
}
}
}
public void OnPlayerLeftRoom(Player otherPlayer)
{
}
public void OnRoomPropertiesUpdate(Hashtable propertiesThatChanged)
{
}
public void OnPlayerPropertiesUpdate(Player targetPlayer, Hashtable changedProps)
{
}
public void OnMasterClientSwitched(Player newMasterClient)
{
}
}
public enum ItemCategory
{
All,
Food,
Meds,
Tools,
Special
}
public class ShopItemData
{
public int Price { get; }
public ItemCategory Category { get; }
public ShopItemData(int price, ItemCategory category)
{
Price = price;
Category = category;
}
}
public static class ShopDatabase
{
public static readonly int DefaultPrice = 9999;
public static readonly ItemCategory DefaultCategory = ItemCategory.Special;
public static readonly Dictionary<string, ShopItemData> ItemData = new Dictionary<string, ShopItemData>
{
{
"Marshmallow",
new ShopItemData(16, ItemCategory.Food)
},
{
"Lollipop",
new ShopItemData(20, ItemCategory.Food)
},
{
"Airplane Food",
new ShopItemData(11, ItemCategory.Food)
},
{
"Granola Bar",
new ShopItemData(7, ItemCategory.Food)
},
{
"ScoutCookies",
new ShopItemData(12, ItemCategory.Food)
},
{
"TrailMix",
new ShopItemData(5, ItemCategory.Food)
},
{
"Bandages",
new ShopItemData(8, ItemCategory.Meds)
},
{
"Heat Pack",
new ShopItemData(11, ItemCategory.Meds)
},
{
"Antidote",
new ShopItemData(23, ItemCategory.Meds)
},
{
"FirstAidKit",
new ShopItemData(30, ItemCategory.Meds)
},
{
"Cure-All",
new ShopItemData(65, ItemCategory.Meds)
},
{
"ScoutEffigy",
new ShopItemData(75, ItemCategory.Meds)
},
{
"Cure-Some",
new ShopItemData(25, ItemCategory.Meds)
},
{
"EnergyElixir",
new ShopItemData(32, ItemCategory.Meds)
},
{
"Energy Drink",
new ShopItemData(15, ItemCategory.Meds)
},
{
"Sports Drink",
new ShopItemData(10, ItemCategory.Meds)
},
{
"Napberry",
new ShopItemData(9, ItemCategory.Meds)
},
{
"Flare",
new ShopItemData(6, ItemCategory.Tools)
},
{
"Lantern",
new ShopItemData(25, ItemCategory.Tools)
},
{
"Compass",
new ShopItemData(20, ItemCategory.Tools)
},
{
"Bugle",
new ShopItemData(18, ItemCategory.Tools)
},
{
"PortableStovetopItem",
new ShopItemData(45, ItemCategory.Tools)
},
{
"RopeShooter",
new ShopItemData(38, ItemCategory.Tools)
},
{
"RopeSpool",
new ShopItemData(22, ItemCategory.Tools)
},
{
"Anti-Rope Spool",
new ShopItemData(22, ItemCategory.Tools)
},
{
"RopeShooterAnti",
new ShopItemData(42, ItemCategory.Tools)
},
{
"ChainShooter",
new ShopItemData(40, ItemCategory.Tools)
},
{
"Piton",
new ShopItemData(20, ItemCategory.Tools)
},
{
"ShelfShroom",
new ShopItemData(5, ItemCategory.Tools)
},
{
"Backpack",
new ShopItemData(60, ItemCategory.Tools)
},
{
"Binoculars",
new ShopItemData(15, ItemCategory.Tools)
},
{
"Parasol",
new ShopItemData(18, ItemCategory.Tools)
},
{
"Megaphone",
new ShopItemData(12, ItemCategory.Tools)
},
{
"Bugle_Magic",
new ShopItemData(88, ItemCategory.Special)
},
{
"Lantern_Faerie",
new ShopItemData(70, ItemCategory.Special)
},
{
"PandorasBox",
new ShopItemData(125, ItemCategory.Special)
},
{
"HealingDart Variant",
new ShopItemData(35, ItemCategory.Special)
},
{
"Cursed Skull",
new ShopItemData(100, ItemCategory.Special)
},
{
"Pirate Compass",
new ShopItemData(80, ItemCategory.Special)
},
{
"Bugle_Scoutmaster Variant",
new ShopItemData(45, ItemCategory.Special)
},
{
"MagicBean",
new ShopItemData(40, ItemCategory.Special)
},
{
"Strange Gem",
new ShopItemData(50, ItemCategory.Special)
},
{
"BounceShroom",
new ShopItemData(8, ItemCategory.Special)
},
{
"Warp Compass",
new ShopItemData(75, ItemCategory.Special)
},
{
"Frisbee",
new ShopItemData(3, ItemCategory.Special)
},
{
"BingBong",
new ShopItemData(9999, ItemCategory.Special)
}
};
}
public class ShopManager : MonoBehaviour
{
private Campfire activeCampfire;
private const float MaxInteractionDistance = 10f;
private GameObject shopPanel;
private RectTransform itemContentRect;
private TextMeshProUGUI coinText;
private GameObject itemListingPrefab;
private RectTransform categoryButtonContainer;
private GameObject categoryButtonPrefab;
private static List<Item> allItems = new List<Item>();
private static bool hasInitializedItems = false;
private ItemCategory currentCategory = ItemCategory.All;
private Dictionary<ItemCategory, Button> categoryButtons = new Dictionary<ItemCategory, Button>();
public static ShopManager Instance { get; private set; }
public bool isShopOpen { get; private set; } = false;
public void RefreshShopDisplay()
{
if (isShopOpen)
{
PopulateItemGrid();
}
}
public void SpawnPurchasedItem(string itemName)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: 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_0048: 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_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)Character.localCharacter != (Object)null)
{
Vector3 val = Character.localCharacter.Center + ((Component)Character.localCharacter).transform.forward * 1.5f + Vector3.up * 0.5f;
PhotonNetwork.Instantiate("0_Items/" + itemName, val, Quaternion.identity, (byte)0, (object[])null);
}
}
private void TryToBuyItem(Item itemPrefab, int price)
{
Player localPlayer = Player.localPlayer;
PlayerCoinManager playerCoinManager = ((localPlayer != null) ? ((Component)localPlayer).GetComponent<PlayerCoinManager>() : null);
if (!((Object)(object)playerCoinManager == (Object)null))
{
CoinPlugin.Log.LogInfo((object)("Requesting to purchase " + ((Object)itemPrefab).name + " from host."));
playerCoinManager.RequestPurchase(((Object)itemPrefab).name);
}
}
private void Awake()
{
if ((Object)(object)Instance != (Object)null)
{
Object.Destroy((Object)(object)((Component)this).gameObject);
}
else
{
Instance = this;
}
}
private void Update()
{
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
if (isShopOpen && ((Object)(object)activeCampfire == (Object)null || (Object)(object)Character.localCharacter == (Object)null || Vector3.Distance(Character.localCharacter.Center, ((Component)activeCampfire).transform.position) > 10f))
{
CloseShopGUI();
}
}
public void OpenShopGUI(Campfire campfire)
{
if (!isShopOpen)
{
if ((Object)(object)shopPanel == (Object)null)
{
CreateShopUI();
}
activeCampfire = campfire;
isShopOpen = true;
shopPanel.SetActive(true);
if (!hasInitializedItems)
{
InitializeItemList();
}
SetCategory(ItemCategory.All);
}
}
public void CloseShopGUI()
{
if (isShopOpen)
{
activeCampfire = null;
isShopOpen = false;
shopPanel.SetActive(false);
}
}
private void SetCategory(ItemCategory category)
{
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
currentCategory = category;
foreach (KeyValuePair<ItemCategory, Button> categoryButton in categoryButtons)
{
Image component = ((Component)categoryButton.Value).GetComponent<Image>();
if ((Object)(object)component != (Object)null)
{
((Graphic)component).color = ((categoryButton.Key == currentCategory) ? new Color(0.3f, 0.5f, 0.8f) : new Color(0.15f, 0.25f, 0.4f));
}
}
PopulateItemGrid();
}
private void PopulateItemGrid()
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Expected O, but got Unknown
//IL_0216: Unknown result type (might be due to invalid IL or missing references)
//IL_0225: Unknown result type (might be due to invalid IL or missing references)
//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
//IL_02d3: Expected O, but got Unknown
foreach (Transform item in (Transform)itemContentRect)
{
Transform val = item;
Object.Destroy((Object)(object)((Component)val).gameObject);
}
Player localPlayer = Player.localPlayer;
int valueOrDefault = ((localPlayer == null) ? null : ((Component)localPlayer).GetComponent<PlayerCoinManager>()?.SharedCoins).GetValueOrDefault();
((TMP_Text)coinText).text = $"Team Coins: {valueOrDefault}";
var orderedEnumerable = from x in allItems.Select(delegate(Item item)
{
ShopDatabase.ItemData.TryGetValue(((Object)item).name, out var value);
return new
{
Item = item,
Price = (value?.Price ?? ShopDatabase.DefaultPrice),
Category = (value?.Category ?? ItemCategory.Special)
};
})
where ShopDatabase.ItemData.ContainsKey(((Object)x.Item).name)
where currentCategory == ItemCategory.All || x.Category == currentCategory
orderby x.Price
select x;
foreach (var itemData in orderedEnumerable)
{
GameObject val2 = Object.Instantiate<GameObject>(itemListingPrefab, (Transform)(object)itemContentRect);
Image component = ((Component)val2.transform.Find("ItemIcon")).GetComponent<Image>();
TextMeshProUGUI component2 = ((Component)val2.transform.Find("ItemName")).GetComponent<TextMeshProUGUI>();
Button component3 = ((Component)val2.transform.Find("BuyButton")).GetComponent<Button>();
TextMeshProUGUI componentInChildren = ((Component)component3).GetComponentInChildren<TextMeshProUGUI>();
if ((Object)(object)itemData.Item.UIData?.icon != (Object)null)
{
Texture2D icon = itemData.Item.UIData.icon;
component.sprite = Sprite.Create(icon, new Rect(0f, 0f, (float)((Texture)icon).width, (float)((Texture)icon).height), new Vector2(0.5f, 0.5f));
}
((TMP_Text)component2).text = itemData.Item.UIData?.itemName ?? ((Object)itemData.Item).name;
((TMP_Text)componentInChildren).text = $"Buy ({itemData.Price})";
((Selectable)component3).interactable = valueOrDefault >= itemData.Price;
((UnityEventBase)component3.onClick).RemoveAllListeners();
((UnityEvent)component3.onClick).AddListener((UnityAction)delegate
{
TryToBuyItem(itemData.Item, itemData.Price);
});
val2.SetActive(true);
}
}
private static void InitializeItemList()
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
Dictionary<string, Item> dictionary = new Dictionary<string, Item>();
Item[] array = Resources.FindObjectsOfTypeAll<Item>();
Item[] array2 = array;
foreach (Item val in array2)
{
if ((Object)(object)val != (Object)null)
{
Scene scene = ((Component)val).gameObject.scene;
if (((Scene)(ref scene)).handle == 0 && !string.IsNullOrEmpty(val.UIData?.itemName) && ShopDatabase.ItemData.ContainsKey(((Object)val).name) && !dictionary.ContainsKey(val.UIData.itemName))
{
dictionary.Add(val.UIData.itemName, val);
}
}
}
allItems = dictionary.Values.ToList();
hasInitializedItems = true;
}
private void CreateShopUI()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Expected O, but got Unknown
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Expected O, but got Unknown
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_00fd: Expected O, but got Unknown
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
//IL_0168: Unknown result type (might be due to invalid IL or missing references)
//IL_017f: Unknown result type (might be due to invalid IL or missing references)
//IL_0196: Unknown result type (might be due to invalid IL or missing references)
//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
//IL_01be: Unknown result type (might be due to invalid IL or missing references)
//IL_0201: Unknown result type (might be due to invalid IL or missing references)
//IL_0236: Unknown result type (might be due to invalid IL or missing references)
//IL_024d: Unknown result type (might be due to invalid IL or missing references)
//IL_0264: Unknown result type (might be due to invalid IL or missing references)
//IL_027b: Unknown result type (might be due to invalid IL or missing references)
//IL_029e: Unknown result type (might be due to invalid IL or missing references)
//IL_02a5: Expected O, but got Unknown
//IL_02d9: Unknown result type (might be due to invalid IL or missing references)
//IL_02f9: Unknown result type (might be due to invalid IL or missing references)
//IL_0310: Unknown result type (might be due to invalid IL or missing references)
//IL_0327: Unknown result type (might be due to invalid IL or missing references)
//IL_033e: Unknown result type (might be due to invalid IL or missing references)
//IL_0355: Unknown result type (might be due to invalid IL or missing references)
//IL_0378: Unknown result type (might be due to invalid IL or missing references)
//IL_037f: Expected O, but got Unknown
//IL_03a7: Unknown result type (might be due to invalid IL or missing references)
//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
//IL_03c9: Unknown result type (might be due to invalid IL or missing references)
//IL_03e7: Unknown result type (might be due to invalid IL or missing references)
//IL_03f1: Expected O, but got Unknown
//IL_0420: Unknown result type (might be due to invalid IL or missing references)
//IL_0427: Expected O, but got Unknown
//IL_0455: Unknown result type (might be due to invalid IL or missing references)
//IL_046c: Unknown result type (might be due to invalid IL or missing references)
//IL_0483: Unknown result type (might be due to invalid IL or missing references)
//IL_049a: Unknown result type (might be due to invalid IL or missing references)
//IL_04c9: Unknown result type (might be due to invalid IL or missing references)
//IL_04fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0505: Expected O, but got Unknown
//IL_053b: Unknown result type (might be due to invalid IL or missing references)
//IL_0548: Unknown result type (might be due to invalid IL or missing references)
//IL_0555: Unknown result type (might be due to invalid IL or missing references)
//IL_056c: Unknown result type (might be due to invalid IL or missing references)
//IL_058f: Unknown result type (might be due to invalid IL or missing references)
//IL_0596: Expected O, but got Unknown
//IL_05c8: Unknown result type (might be due to invalid IL or missing references)
//IL_05e3: Unknown result type (might be due to invalid IL or missing references)
//IL_05fe: Unknown result type (might be due to invalid IL or missing references)
//IL_060f: Unknown result type (might be due to invalid IL or missing references)
//IL_062d: Unknown result type (might be due to invalid IL or missing references)
//IL_0637: Expected O, but got Unknown
//IL_0644: Unknown result type (might be due to invalid IL or missing references)
//IL_065b: Unknown result type (might be due to invalid IL or missing references)
//IL_06ba: Unknown result type (might be due to invalid IL or missing references)
//IL_06fa: Unknown result type (might be due to invalid IL or missing references)
//IL_071a: Unknown result type (might be due to invalid IL or missing references)
//IL_0731: Unknown result type (might be due to invalid IL or missing references)
//IL_0748: Unknown result type (might be due to invalid IL or missing references)
//IL_075f: Unknown result type (might be due to invalid IL or missing references)
//IL_0776: Unknown result type (might be due to invalid IL or missing references)
//IL_0786: Unknown result type (might be due to invalid IL or missing references)
//IL_07b6: Unknown result type (might be due to invalid IL or missing references)
//IL_07e9: Unknown result type (might be due to invalid IL or missing references)
//IL_07f3: Expected O, but got Unknown
GameObject val = new GameObject("PeakCoinMod_ShopCanvas");
Canvas val2 = val.AddComponent<Canvas>();
val2.renderMode = (RenderMode)0;
val2.sortingOrder = 100;
val.AddComponent<CanvasScaler>();
val.AddComponent<GraphicRaycaster>();
Object.DontDestroyOnLoad((Object)(object)val);
shopPanel = new GameObject("ShopPanel");
shopPanel.transform.SetParent(val.transform, false);
Image val3 = shopPanel.AddComponent<Image>();
((Graphic)val3).color = new Color(0.1f, 0.1f, 0.1f, 0.9f);
RectTransform component = shopPanel.GetComponent<RectTransform>();
component.anchorMin = new Vector2(0.5f, 0.5f);
component.anchorMax = new Vector2(0.5f, 0.5f);
component.pivot = new Vector2(0.5f, 0.5f);
component.sizeDelta = new Vector2(1000f, 750f);
GameObject val4 = new GameObject("Title");
val4.transform.SetParent(shopPanel.transform, false);
TextMeshProUGUI val5 = val4.AddComponent<TextMeshProUGUI>();
((TMP_Text)val5).text = "Campfire Shop";
((TMP_Text)val5).fontSize = 32f;
((Graphic)val5).color = Color.white;
((TMP_Text)val5).alignment = (TextAlignmentOptions)514;
RectTransform component2 = val4.GetComponent<RectTransform>();
component2.anchorMin = new Vector2(0f, 1f);
component2.anchorMax = new Vector2(1f, 1f);
component2.pivot = new Vector2(0.5f, 1f);
component2.anchoredPosition = new Vector2(0f, -20f);
coinText = new GameObject("CoinText").AddComponent<TextMeshProUGUI>();
((TMP_Text)coinText).transform.SetParent(shopPanel.transform, false);
((TMP_Text)coinText).fontSize = 20f;
((Graphic)coinText).color = Color.yellow;
((TMP_Text)coinText).alignment = (TextAlignmentOptions)514;
RectTransform component3 = ((Component)coinText).GetComponent<RectTransform>();
component3.anchorMin = new Vector2(0f, 1f);
component3.anchorMax = new Vector2(1f, 1f);
component3.pivot = new Vector2(0.5f, 1f);
component3.anchoredPosition = new Vector2(0f, -60f);
GameObject val6 = new GameObject("CategoryPanel", new Type[1] { typeof(RectTransform) });
val6.transform.SetParent(shopPanel.transform, false);
((Graphic)val6.AddComponent<Image>()).color = new Color(0.05f, 0.05f, 0.05f, 0.8f);
RectTransform component4 = val6.GetComponent<RectTransform>();
component4.anchorMin = new Vector2(0f, 0f);
component4.anchorMax = new Vector2(0f, 1f);
component4.pivot = new Vector2(0f, 1f);
component4.offsetMin = new Vector2(20f, 80f);
component4.offsetMax = new Vector2(220f, -100f);
GameObject val7 = new GameObject("CategoryButtonContainer", new Type[1] { typeof(RectTransform) });
val7.transform.SetParent(val6.transform, false);
categoryButtonContainer = val7.GetComponent<RectTransform>();
categoryButtonContainer.anchorMin = Vector2.zero;
categoryButtonContainer.anchorMax = Vector2.one;
categoryButtonContainer.sizeDelta = Vector2.zero;
VerticalLayoutGroup val8 = val7.AddComponent<VerticalLayoutGroup>();
((LayoutGroup)val8).padding = new RectOffset(10, 10, 10, 10);
((HorizontalOrVerticalLayoutGroup)val8).spacing = 10f;
((HorizontalOrVerticalLayoutGroup)val8).childForceExpandHeight = false;
GameObject val9 = new GameObject("ItemPanel", new Type[1] { typeof(RectTransform) });
val9.transform.SetParent(shopPanel.transform, false);
RectTransform component5 = val9.GetComponent<RectTransform>();
component5.anchorMin = new Vector2(0f, 0f);
component5.anchorMax = new Vector2(1f, 1f);
component5.offsetMin = new Vector2(240f, 80f);
component5.offsetMax = new Vector2(-20f, -100f);
ScrollRect val10 = val9.AddComponent<ScrollRect>();
((Graphic)val9.AddComponent<Image>()).color = new Color(0f, 0f, 0f, 0.5f);
val10.horizontal = false;
val10.vertical = true;
GameObject val11 = new GameObject("Viewport", new Type[1] { typeof(RectTransform) });
val11.transform.SetParent(val9.transform, false);
val11.AddComponent<Mask>().showMaskGraphic = false;
val11.AddComponent<Image>();
RectTransform component6 = val11.GetComponent<RectTransform>();
component6.anchorMin = Vector2.zero;
component6.anchorMax = Vector2.one;
component6.sizeDelta = Vector2.zero;
component6.pivot = new Vector2(0f, 1f);
GameObject val12 = new GameObject("ItemContent", new Type[1] { typeof(RectTransform) });
val12.transform.SetParent(val11.transform, false);
itemContentRect = val12.GetComponent<RectTransform>();
itemContentRect.anchorMin = new Vector2(0f, 1f);
itemContentRect.anchorMax = new Vector2(0f, 1f);
itemContentRect.pivot = new Vector2(0f, 1f);
itemContentRect.sizeDelta = Vector2.zero;
GridLayoutGroup val13 = val12.AddComponent<GridLayoutGroup>();
((LayoutGroup)val13).padding = new RectOffset(15, 15, 15, 15);
val13.spacing = new Vector2(15f, 15f);
val13.cellSize = new Vector2(150f, 180f);
val13.constraint = (Constraint)1;
val13.constraintCount = 4;
ContentSizeFitter val14 = val12.AddComponent<ContentSizeFitter>();
val14.verticalFit = (FitMode)2;
val10.viewport = component6;
val10.content = itemContentRect;
Button val15 = new GameObject("CloseButton", new Type[1] { typeof(RectTransform) }).AddComponent<Button>();
((Component)val15).transform.SetParent(shopPanel.transform, false);
((Graphic)((Component)val15).gameObject.AddComponent<Image>()).color = new Color(0.8f, 0.2f, 0.2f);
RectTransform component7 = ((Component)val15).GetComponent<RectTransform>();
component7.anchorMin = new Vector2(0.5f, 0f);
component7.anchorMax = new Vector2(0.5f, 0f);
component7.pivot = new Vector2(0.5f, 0f);
component7.sizeDelta = new Vector2(150f, 40f);
component7.anchoredPosition = new Vector2(0f, 20f);
TextMeshProUGUI val16 = new GameObject("Text").AddComponent<TextMeshProUGUI>();
((TMP_Text)val16).transform.SetParent(((Component)val15).transform, false);
((TMP_Text)val16).text = "Close";
((Graphic)val16).color = Color.white;
((TMP_Text)val16).alignment = (TextAlignmentOptions)514;
((TMP_Text)val16).fontSize = 20f;
((UnityEvent)val15.onClick).AddListener(new UnityAction(CloseShopGUI));
CreateItemListingPrefab();
CreateCategoryButtonPrefab();
PopulateCategoryTabs();
shopPanel.SetActive(false);
}
private void PopulateCategoryTabs()
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Expected O, but got Unknown
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: Expected O, but got Unknown
foreach (Transform item in (Transform)categoryButtonContainer)
{
Transform val = item;
Object.Destroy((Object)(object)((Component)val).gameObject);
}
categoryButtons.Clear();
foreach (ItemCategory value in Enum.GetValues(typeof(ItemCategory)))
{
ItemCategory localCategory = value;
GameObject val2 = Object.Instantiate<GameObject>(categoryButtonPrefab, (Transform)(object)categoryButtonContainer);
TextMeshProUGUI componentInChildren = val2.GetComponentInChildren<TextMeshProUGUI>();
((TMP_Text)componentInChildren).text = localCategory.ToString();
Button component = val2.GetComponent<Button>();
((UnityEvent)component.onClick).AddListener((UnityAction)delegate
{
SetCategory(localCategory);
});
categoryButtons[localCategory] = component;
val2.SetActive(true);
}
}
private void CreateItemListingPrefab()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Expected O, but got Unknown
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: Expected O, but got Unknown
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: Expected O, but got Unknown
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_0165: Unknown result type (might be due to invalid IL or missing references)
//IL_016c: Expected O, but got Unknown
//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
//IL_01f0: Expected O, but got Unknown
//IL_0210: Unknown result type (might be due to invalid IL or missing references)
itemListingPrefab = new GameObject("ItemListingPrefab");
((Graphic)itemListingPrefab.AddComponent<Image>()).color = new Color(0.2f, 0.2f, 0.2f, 1f);
VerticalLayoutGroup val = itemListingPrefab.AddComponent<VerticalLayoutGroup>();
((LayoutGroup)val).padding = new RectOffset(5, 5, 5, 5);
((HorizontalOrVerticalLayoutGroup)val).spacing = 5f;
((LayoutGroup)val).childAlignment = (TextAnchor)1;
((HorizontalOrVerticalLayoutGroup)val).childForceExpandHeight = false;
((HorizontalOrVerticalLayoutGroup)val).childForceExpandWidth = true;
GameObject val2 = new GameObject("ItemIcon", new Type[1] { typeof(RectTransform) });
val2.transform.SetParent(itemListingPrefab.transform, false);
val2.AddComponent<Image>();
LayoutElement val3 = val2.AddComponent<LayoutElement>();
val3.minHeight = 80f;
val3.preferredHeight = 80f;
GameObject val4 = new GameObject("ItemName", new Type[1] { typeof(RectTransform) });
val4.transform.SetParent(itemListingPrefab.transform, false);
TextMeshProUGUI val5 = val4.AddComponent<TextMeshProUGUI>();
((Graphic)val5).color = Color.white;
((TMP_Text)val5).fontSize = 16f;
((TMP_Text)val5).alignment = (TextAlignmentOptions)514;
val4.AddComponent<LayoutElement>().minHeight = 40f;
GameObject val6 = new GameObject("BuyButton", new Type[1] { typeof(RectTransform) });
val6.transform.SetParent(itemListingPrefab.transform, false);
val6.AddComponent<Button>();
((Graphic)val6.AddComponent<Image>()).color = new Color(0.2f, 0.5f, 0.2f);
LayoutElement val7 = val6.AddComponent<LayoutElement>();
val7.minHeight = 30f;
val7.preferredHeight = 30f;
GameObject val8 = new GameObject("Text", new Type[1] { typeof(RectTransform) });
val8.transform.SetParent(val6.transform, false);
TextMeshProUGUI val9 = val8.AddComponent<TextMeshProUGUI>();
((Graphic)val9).color = Color.white;
((TMP_Text)val9).fontSize = 14f;
((TMP_Text)val9).alignment = (TextAlignmentOptions)514;
itemListingPrefab.SetActive(false);
}
private void CreateCategoryButtonPrefab()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00bf: Expected O, but got Unknown
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
categoryButtonPrefab = new GameObject("CategoryButtonPrefab");
Image val = categoryButtonPrefab.AddComponent<Image>();
((Graphic)val).color = new Color(0.15f, 0.25f, 0.4f);
categoryButtonPrefab.AddComponent<LayoutElement>().minHeight = 50f;
Button val2 = categoryButtonPrefab.AddComponent<Button>();
ColorBlock colors = ((Selectable)val2).colors;
((ColorBlock)(ref colors)).highlightedColor = new Color(0.2f, 0.4f, 0.6f);
((ColorBlock)(ref colors)).pressedColor = new Color(0.1f, 0.2f, 0.3f);
((Selectable)val2).colors = colors;
GameObject val3 = new GameObject("Text", new Type[1] { typeof(RectTransform) });
val3.transform.SetParent(categoryButtonPrefab.transform, false);
TextMeshProUGUI val4 = val3.AddComponent<TextMeshProUGUI>();
((Graphic)val4).color = Color.white;
((TMP_Text)val4).fontSize = 20f;
((TMP_Text)val4).alignment = (TextAlignmentOptions)514;
categoryButtonPrefab.SetActive(false);
}
}
}
namespace CoinMod.Patches
{
[HarmonyPatch(typeof(Campfire))]
public static class CampfirePatches
{
[HarmonyPatch("GetInteractTime")]
[HarmonyPrefix]
public static bool SetInstantInteractTime(Campfire __instance, Character interactor, ref float __result)
{
if ((Object)(object)interactor != (Object)null && (Object)(object)interactor.data.currentItem == (Object)null && __instance.Lit)
{
__result = 0f;
return false;
}
return true;
}
[HarmonyPatch("IsInteractible")]
[HarmonyPostfix]
public static void AllowEmptyHandedInteraction(Campfire __instance, Character interactor, ref bool __result)
{
if (!__result && __instance.Lit && (Object)(object)interactor?.data.currentItem == (Object)null)
{
__result = true;
}
}
[HarmonyPatch("IsConstantlyInteractable")]
[HarmonyPostfix]
public static void AllowEmptyHandedConstantInteraction(Campfire __instance, Character interactor, ref bool __result)
{
if (!__result && __instance.Lit && (Object)(object)interactor?.data.currentItem == (Object)null)
{
__result = true;
}
}
[HarmonyPatch("GetInteractionText")]
[HarmonyPostfix]
public static void OverwriteInteractionText(Campfire __instance, ref string __result)
{
if (__instance.Lit)
{
Character localCharacter = Character.localCharacter;
if (!((Object)(object)localCharacter == (Object)null) && (Object)(object)localCharacter.data.currentItem == (Object)null)
{
__result = "Shop";
}
}
}
[HarmonyPatch("Interact")]
[HarmonyPrefix]
public static bool HandleShopInteraction(Campfire __instance, Character interactor)
{
if (__instance.Lit && (Object)(object)interactor.data.currentItem == (Object)null)
{
if ((Object)(object)ShopManager.Instance != (Object)null)
{
ShopManager.Instance.OpenShopGUI(__instance);
}
else
{
CoinPlugin.Log.LogError((object)"ShopManager.Instance is null! Cannot open shop.");
}
return false;
}
return true;
}
}
[HarmonyPatch(typeof(GUIManager))]
public static class GUIManagerPatches
{
private static FieldInfo _windowShowingCursorField = AccessTools.Field(typeof(GUIManager), "<windowShowingCursor>k__BackingField");
private static FieldInfo _windowBlockingInputField = AccessTools.Field(typeof(GUIManager), "<windowBlockingInput>k__BackingField");
[HarmonyPatch("UpdateWindowStatus")]
[HarmonyPostfix]
public static void ForceCursorStateForShop(GUIManager __instance)
{
if ((Object)(object)ShopManager.Instance == (Object)null)
{
return;
}
if (_windowShowingCursorField == null || _windowBlockingInputField == null)
{
if (ShopManager.Instance.isShopOpen)
{
CoinPlugin.Log.LogError((object)"Could not find GUIManager fields! Cursor will not work.");
}
}
else if (ShopManager.Instance.isShopOpen)
{
_windowShowingCursorField.SetValue(__instance, true);
_windowBlockingInputField.SetValue(__instance, true);
}
}
}
[HarmonyPatch(typeof(Luggage))]
public static class LuggagePatches
{
[HarmonyPatch("Interact_CastFinished")]
[HarmonyPostfix]
public static void GiveCoinsOnOpenPatch(Character interactor)
{
if ((Object)(object)interactor != (Object)null && interactor.IsLocal)
{
PlayerCoinManager component = ((Component)Player.localPlayer).GetComponent<PlayerCoinManager>();
if ((Object)(object)component != (Object)null)
{
int num = Random.Range(10, 51);
component.RequestModifyCoins(num);
CoinPlugin.Log.LogInfo((object)$"You opened luggage and requested {num} coins for the team!");
}
}
}
}
}