Decompiled source of DataCompany v1.0.3

DataCompanyMod.dll

Decompiled a year ago
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.Configuration;
using BepInEx.Logging;
using DataCompanyMod.Patches;
using DataCompanyMod.ScrapItems;
using GameNetcodeStuff;
using HarmonyLib;
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: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: AssemblyCompany("DataCompanyMod")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Chdata's Data Company")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+663b8bdef55fbee75665a80b40db2e5a0965cf61")]
[assembly: AssemblyProduct("DataCompanyMod")]
[assembly: AssemblyTitle("DataCompanyMod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.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 DataCompanyMod
{
	[BepInPlugin("DataCompanyMod", "DataCompanyMod", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		private readonly Harmony harmony = new Harmony("DataCompanyMod");

		internal static ManualLogSource Logger;

		private ConfigEntry<int> configStaleBreadRarity;

		public static AssetBundle ChdataAssetBundle;

		public static Item StaleBreadItem;

		private void Awake()
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Expected O, but got Unknown
			Logger = ((BaseUnityPlugin)this).Logger;
			Logger.LogInfo((object)"DATA COMPANY LOADED");
			Logger.LogInfo((object)"DATA COMPANY LOADED");
			Logger.LogInfo((object)"DATA COMPANY LOADED");
			configStaleBreadRarity = ((BaseUnityPlugin)this).Config.Bind<int>("Settings", "Stale Bread Rarity", 30, new ConfigDescription("How rare Stale Bread is to find. Lower values = More rare. 0 to MAYBE prevent spawning.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
			LoadAssets();
			harmony.PatchAll(typeof(Plugin));
			harmony.PatchAll(typeof(Cheats));
			harmony.PatchAll(typeof(StaleBread));
		}

		private void LoadAssets()
		{
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "datacompany.assetbundle");
			Logger.LogDebug((object)text);
			ChdataAssetBundle = AssetBundle.LoadFromFile(text);
			if ((Object)(object)ChdataAssetBundle == (Object)null)
			{
				Logger.LogError((object)"Failed to load Chdata's Assets Bundle. File \"datacompany.assetbundle\" belongs in the same folder as the .dll");
			}
			else
			{
				Logger.LogDebug((object)"Succeeded in loading Chdata Assets Bundle.");
			}
			StaleBreadItem = ChdataAssetBundle.LoadAsset<Item>("Assets/Import/StaleBread/StaleBread.asset");
			if ((Object)(object)StaleBreadItem == (Object)null)
			{
				Logger.LogError((object)"Failed to load Stale Bread item. File \"datacompany.assetbundle\" belongs in the same folder as the .dll");
				return;
			}
			Logger.LogDebug((object)"Succeeded in loading Stale Bread item.");
			NetworkPrefabs.RegisterNetworkPrefab(StaleBreadItem.spawnPrefab);
			Items.RegisterScrap(StaleBreadItem, configStaleBreadRarity.Value, (LevelTypes)510);
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "DataCompanyMod";

		public const string PLUGIN_NAME = "DataCompanyMod";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace DataCompanyMod.ScrapItems
{
	internal class StaleBread
	{
		[HarmonyPatch(typeof(PlayerControllerB), "DropAllHeldItems")]
		[HarmonyPrefix]
		private static bool OnDropAllHeldItems(PlayerControllerB __instance, bool itemsFall, bool disconnecting)
		{
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: 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)
			int num = 0;
			for (int i = 0; i < __instance.ItemSlots.Length; i++)
			{
				GrabbableObject val = __instance.ItemSlots[i];
				if ((Object)(object)val == (Object)null)
				{
					continue;
				}
				if (val.itemProperties.itemName == "Stale bread")
				{
					num++;
					continue;
				}
				if (itemsFall)
				{
					val.parentObject = null;
					val.heldByPlayerOnServer = false;
					if (__instance.isInElevator)
					{
						((Component)val).transform.SetParent(__instance.playersManager.elevatorTransform, true);
					}
					else
					{
						((Component)val).transform.SetParent(__instance.playersManager.propsContainer, true);
					}
					__instance.SetItemInElevator(__instance.isInHangarShipRoom, __instance.isInElevator, val);
					val.EnablePhysics(true);
					val.EnableItemMeshes(true);
					((Component)val).transform.localScale = val.originalScale;
					val.isHeld = false;
					val.isPocketed = false;
					val.startFallingPosition = ((Component)val).transform.parent.InverseTransformPoint(((Component)val).transform.position);
					val.FallToGround(true);
					val.fallTime = Random.Range(-0.3f, 0.05f);
					if (((NetworkBehaviour)__instance).IsOwner)
					{
						val.DiscardItemOnClient();
					}
					else if (!val.itemProperties.syncDiscardFunction)
					{
						val.playerHeldBy = null;
					}
				}
				if (((NetworkBehaviour)__instance).IsOwner && !disconnecting)
				{
					((Behaviour)HUDManager.Instance.holdingTwoHandedItem).enabled = false;
					((Behaviour)HUDManager.Instance.itemSlotIcons[i]).enabled = false;
					HUDManager.Instance.ClearControlTips();
					__instance.activatingItem = false;
				}
				__instance.ItemSlots[i] = null;
			}
			if (__instance.isHoldingObject)
			{
				__instance.isHoldingObject = false;
				if ((Object)(object)__instance.currentlyHeldObjectServer != (Object)null)
				{
					((object)__instance).GetType().GetMethod("SetSpecialGrabAnimationBool", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(__instance, new object[2] { false, __instance.currentlyHeldObjectServer });
				}
				__instance.playerBodyAnimator.SetBool("cancelHolding", true);
				__instance.playerBodyAnimator.SetTrigger("Throw");
			}
			__instance.activatingItem = false;
			__instance.twoHanded = false;
			__instance.carryWeight = 1f;
			__instance.currentlyHeldObjectServer = null;
			if (num >= 4)
			{
				((MonoBehaviour)__instance).StartCoroutine(SpawnBreadAtPlayer(__instance));
			}
			return false;
		}

		[HarmonyPatch(typeof(ShipTeleporter), "TeleportPlayerOutWithInverseTeleporter")]
		[HarmonyPostfix]
		private static void OnTeleportPlayerOutWithInverseTeleporter(ShipTeleporter __instance, int playerObj, Vector3 teleportPos)
		{
			//IL_0041: 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_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[playerObj];
			if (val.isPlayerDead)
			{
				return;
			}
			GrabbableObject[] array = Object.FindObjectsOfType<GrabbableObject>();
			foreach (GrabbableObject val2 in array)
			{
				if (!(val2.itemProperties.itemName != "Stale bread") && !(Vector3.Distance(((Component)val2).transform.position, __instance.teleportOutPosition.position) >= 2f))
				{
					Vector3 serverPlayerPosition = val.serverPlayerPosition;
					serverPlayerPosition.y += 1f;
					DropGrabbableObjectAtPosition(val2, serverPlayerPosition);
				}
			}
		}

		private static IEnumerator SpawnBreadAtPlayer(PlayerControllerB thePlayer)
		{
			yield return (object)new WaitForSeconds(0.5f);
			if (!thePlayer.isPlayerDead)
			{
				CreateBreadAtLocation(thePlayer.serverPlayerPosition);
			}
		}

		public static void CreateBreadAtLocation(Vector3 spawnPos)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: 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)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: 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)
			spawnPos.y += 1f;
			GameObject obj = Object.Instantiate<GameObject>(Plugin.StaleBreadItem.spawnPrefab, spawnPos, Quaternion.identity);
			GrabbableObject component = obj.GetComponent<GrabbableObject>();
			((Component)component).transform.rotation = Quaternion.Euler(component.itemProperties.restingRotation);
			component.fallTime = 0f;
			component.scrapValue = Random.Range(8, 15);
			NetworkObject component2 = obj.GetComponent<NetworkObject>();
			component2.Spawn(false);
			List<int> list = new List<int>();
			List<NetworkObjectReference> list2 = new List<NetworkObjectReference>();
			list.Add(component.scrapValue);
			list2.Add(NetworkObjectReference.op_Implicit(component2));
			GrabbableObject val = component;
			int num = 0;
			NetworkObjectReference[] array = (NetworkObjectReference[])(object)new NetworkObjectReference[list2.Count];
			foreach (NetworkObjectReference item in list2)
			{
				array[num] = item;
				num++;
			}
			NetworkObjectReference[] spawnedScrap = array;
			int num2 = 0;
			int[] array2 = new int[list.Count];
			foreach (int item2 in list)
			{
				array2[num2] = item2;
				num2++;
			}
			((MonoBehaviour)val).StartCoroutine(WaitForScrapToSpawnToSync(spawnedScrap, array2));
		}

		private static IEnumerator WaitForScrapToSpawnToSync(NetworkObjectReference[] spawnedScrap, int[] scrapValues)
		{
			yield return (object)new WaitForSeconds(1f);
			RoundManager.Instance.SyncScrapValuesClientRpc(spawnedScrap, scrapValues);
		}

		public static void DropGrabbableObjectAtPosition(GrabbableObject grabbableObject, Vector3 telePos)
		{
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: 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)
			grabbableObject.parentObject = null;
			grabbableObject.heldByPlayerOnServer = false;
			PlayerControllerB playerHeldBy = grabbableObject.playerHeldBy;
			if ((Object)(object)playerHeldBy != (Object)null)
			{
				if (playerHeldBy.isInElevator)
				{
					((Component)grabbableObject).transform.SetParent(playerHeldBy.playersManager.elevatorTransform, true);
				}
				else
				{
					((Component)grabbableObject).transform.SetParent(playerHeldBy.playersManager.propsContainer, true);
				}
				playerHeldBy.SetItemInElevator(playerHeldBy.isInHangarShipRoom, playerHeldBy.isInElevator, grabbableObject);
			}
			grabbableObject.EnablePhysics(true);
			grabbableObject.EnableItemMeshes(true);
			((Component)grabbableObject).transform.localScale = grabbableObject.originalScale;
			grabbableObject.isHeld = false;
			grabbableObject.isPocketed = false;
			((Component)grabbableObject).transform.position = telePos;
			grabbableObject.startFallingPosition = telePos;
			grabbableObject.FallToGround(true);
			grabbableObject.fallTime = Random.Range(-0.3f, 0.05f);
			if (!((Object)(object)playerHeldBy != (Object)null))
			{
				return;
			}
			if (((NetworkBehaviour)playerHeldBy).IsOwner)
			{
				grabbableObject.DiscardItemOnClient();
			}
			else if (!grabbableObject.itemProperties.syncDiscardFunction)
			{
				grabbableObject.playerHeldBy = null;
			}
			int num = -1;
			for (int i = 0; i < playerHeldBy.ItemSlots.Length; i++)
			{
				if ((Object)(object)playerHeldBy.ItemSlots[i] == (Object)(object)grabbableObject)
				{
					num = i;
					break;
				}
			}
			if (num != -1)
			{
				if (((NetworkBehaviour)playerHeldBy).IsOwner)
				{
					((Behaviour)HUDManager.Instance.holdingTwoHandedItem).enabled = false;
					((Behaviour)HUDManager.Instance.itemSlotIcons[num]).enabled = false;
					HUDManager.Instance.ClearControlTips();
					playerHeldBy.activatingItem = false;
				}
				playerHeldBy.ItemSlots[num] = null;
			}
		}
	}
}
namespace DataCompanyMod.Patches
{
	internal class Cheats
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}