Decompiled source of FairShare v1.0.1

FairShare.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
using System.Reflection;
using System.Runtime.CompilerServices;
using BepInEx;
using BepInEx.Logging;
using FishNet;
using FishNet.Broadcast;
using FishNet.Connection;
using FishNet.Managing;
using FishNet.Object;
using FishNet.Transporting;
using HarmonyLib;
using UnityEngine;

[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace FairShare;

public struct FairShareBroadcast : IBroadcast
{
	public byte ItemID;

	public byte SkinIndex;
}
[BepInPlugin("orbnation.howtofish.fairshare", "FairShare", "1.0.0")]
public class Plugin : BaseUnityPlugin
{
	public const string PluginGuid = "orbnation.howtofish.fairshare";

	public const string PluginName = "FairShare";

	public const string PluginVersion = "1.0.0";

	internal static ManualLogSource Log;

	private bool _clientHandlerRegistered;

	private bool _serverHandlerRegistered;

	private void Awake()
	{
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Expected O, but got Unknown
		Log = ((BaseUnityPlugin)this).Logger;
		Harmony val = new Harmony("orbnation.howtofish.fairshare");
		val.PatchAll();
		((MonoBehaviour)this).StartCoroutine(WatchForNetworkManager());
		Log.LogInfo((object)string.Format("{0} v{1} loaded.", "FairShare", "1.0.0"));
	}

	private IEnumerator WatchForNetworkManager()
	{
		while (true)
		{
			NetworkManager nm = InstanceFinder.NetworkManager;
			if ((Object)(object)nm != (Object)null)
			{
				if (!_clientHandlerRegistered)
				{
					nm.ClientManager.OnClientConnectionState += OnClientConnectionState;
					_clientHandlerRegistered = true;
				}
				if (!_serverHandlerRegistered)
				{
					nm.ServerManager.OnServerConnectionState += OnServerConnectionState;
					_serverHandlerRegistered = true;
				}
			}
			yield return (object)new WaitForSeconds(1f);
		}
	}

	private void OnClientConnectionState(ClientConnectionStateArgs args)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Invalid comparison between Unknown and I4
		if ((int)args.ConnectionState == 8)
		{
			InstanceFinder.ClientManager.RegisterBroadcast<FairShareBroadcast>((Action<FairShareBroadcast, Channel>)OnSkinShareReceived);
		}
	}

	private void OnServerConnectionState(ServerConnectionStateArgs args)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Invalid comparison between Unknown and I4
		if ((int)args.ConnectionState == 8)
		{
			InstanceFinder.ServerManager.RegisterBroadcast<FairShareBroadcast>((Action<NetworkConnection, FairShareBroadcast, Channel>)OnServerReceivedShare, true);
		}
	}

	private void OnServerReceivedShare(NetworkConnection sender, FairShareBroadcast msg, Channel channel)
	{
		Log.LogInfo((object)$"Relaying skin share from {sender.ClientId}: item {msg.ItemID}, skin {msg.SkinIndex}");
		InstanceFinder.ServerManager.Broadcast<FairShareBroadcast>(msg, true, (Channel)0);
	}

	private void OnSkinShareReceived(FairShareBroadcast msg, Channel channel)
	{
		Log.LogInfo((object)$"Unlocking shared skin: item {msg.ItemID}, skin {msg.SkinIndex}");
		SaveManager.UnlockSkin(msg.ItemID, msg.SkinIndex);
	}
}
[HarmonyPatch(typeof(SlotMachine), "OnRollFinished")]
public static class SlotMachine_OnRollFinished_Patch
{
	[HarmonyPostfix]
	public static void Postfix(Player ____playerWhoRolled, byte ____itemIndex, byte ____skinIndex)
	{
		if (!((Object)(object)____playerWhoRolled == (Object)null) && !(((NetworkBehaviour)____playerWhoRolled).Owner == (NetworkConnection)null) && ((NetworkBehaviour)____playerWhoRolled).Owner.IsLocalClient)
		{
			FairShareBroadcast fairShareBroadcast = new FairShareBroadcast
			{
				ItemID = ____itemIndex,
				SkinIndex = ____skinIndex
			};
			Plugin.Log.LogInfo((object)$"Sharing rolled skin with lobby: item {fairShareBroadcast.ItemID}, skin {fairShareBroadcast.SkinIndex}");
			InstanceFinder.ClientManager.Broadcast<FairShareBroadcast>(fairShareBroadcast, (Channel)0);
		}
	}
}