Decompiled source of NoDropBackpack v0.0.1

NoDropBackpack.dll

Decompiled 22 minutes ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using HarmonyLib;
using Photon.Pun;
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("NoDropBackpack")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NoDropBackpack")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("57a53cff-c120-4551-af66-86b4a83a891e")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace NoDropBackpack;

[HarmonyPatch(typeof(CharacterAfflictions), "UpdateWeight")]
internal static class IgnoreBackpackWeightWhileCarrying_Patch
{
	private static void Postfix(CharacterAfflictions __instance)
	{
		try
		{
			Character character = __instance.character;
			if ((Object)(object)character == (Object)null || (Object)(object)character.data == (Object)null)
			{
				return;
			}
			Character carriedPlayer = character.data.carriedPlayer;
			if (!((Object)(object)carriedPlayer == (Object)null) && !((Object)(object)carriedPlayer.data == (Object)null) && carriedPlayer.data.fullyPassedOut)
			{
				int num = ComputeBackpackWeight(((Object)(object)character.player != (Object)null) ? character.player.backpackSlot : null);
				if (num > 0)
				{
					float currentStatus = __instance.GetCurrentStatus((STATUSTYPE)7);
					float num2 = Mathf.Max(0f, currentStatus - 0.025f * (float)num);
					__instance.SetStatus((STATUSTYPE)7, num2, true);
				}
			}
		}
		catch (Exception arg)
		{
			Debug.LogError((object)$"[NoWeightBackpack] Postfix error: {arg}");
		}
	}

	private static int ComputeBackpackWeight(BackpackSlot backpackSlot)
	{
		if (backpackSlot == null || ((ItemSlot)backpackSlot).IsEmpty() || ((ItemSlot)backpackSlot).data == null)
		{
			return 0;
		}
		BackpackData val = default(BackpackData);
		if (!((ItemSlot)backpackSlot).data.TryGetDataEntry<BackpackData>((DataEntryKey)7, ref val) || val == null)
		{
			return 0;
		}
		int num = 0;
		ItemSlot[] itemSlots = val.itemSlots;
		if (itemSlots != null)
		{
			foreach (ItemSlot val2 in itemSlots)
			{
				if (val2 != null && !val2.IsEmpty() && (Object)(object)val2.prefab != (Object)null)
				{
					num += val2.prefab.CarryWeight;
				}
			}
		}
		Item val3 = default(Item);
		if (ItemDatabase.TryGetItem(((ItemSlot)backpackSlot).GetPrefabName(), ref val3) && (Object)(object)val3 != (Object)null)
		{
			num += val3.CarryWeight;
		}
		return num;
	}
}
[BepInPlugin("jaeryeong.peak.nodropbackpack", "NoDropBackpack", "1.0.0")]
public class NoDropBackpackPlugin : BaseUnityPlugin
{
	public const string PluginGuid = "jaeryeong.peak.nodropbackpack";

	public const string PluginName = "NoDropBackpack";

	public const string PluginVersion = "1.0.0";

	private void Awake()
	{
		Harmony.CreateAndPatchAll(typeof(NoDropBackpackPlugin).Assembly, "jaeryeong.peak.nodropbackpack");
		((BaseUnityPlugin)this).Logger.LogInfo((object)"[NoDropBackpack] v1.0.0 loaded");
	}
}
[HarmonyPatch(typeof(CharacterCarrying), "RPCA_StartCarry")]
internal static class KeepBackpackOnCarry_Patch
{
	private static readonly Action<CharacterCarrying, bool> TogglePhysics = AccessTools.MethodDelegate<Action<CharacterCarrying, bool>>(AccessTools.Method(typeof(CharacterCarrying), "ToggleCarryPhysics", (Type[])null, (Type[])null), (object)null, true);

	private static readonly Action<CharacterCarrying, Character> DropDel = AccessTools.MethodDelegate<Action<CharacterCarrying, Character>>(AccessTools.Method(typeof(CharacterCarrying), "Drop", (Type[])null, (Type[])null), (object)null, true);

	private static readonly Action<CharacterAfflictions> UpdateWeightDel = AccessTools.MethodDelegate<Action<CharacterAfflictions>>(AccessTools.Method(typeof(CharacterAfflictions), "UpdateWeight", (Type[])null, (Type[])null), (object)null, true);

	private static bool Prefix(CharacterCarrying __instance, PhotonView targetView, Character ___character)
	{
		try
		{
			if ((Object)(object)___character == (Object)null || (Object)(object)targetView == (Object)null)
			{
				return true;
			}
			Character component = ((Component)targetView).GetComponent<Character>();
			if ((Object)(object)component == (Object)null)
			{
				return true;
			}
			BackpackSlot val = (((Object)(object)___character.player != (Object)null) ? ___character.player.backpackSlot : null);
			if (val == null || ((ItemSlot)val).IsEmpty())
			{
				return true;
			}
			Character carriedPlayer = ___character.data.carriedPlayer;
			if ((Object)(object)carriedPlayer != (Object)null)
			{
				DropDel(__instance, carriedPlayer);
				return false;
			}
			TogglePhysics(component.refs.carriying, arg2: true);
			component.data.isCarried = true;
			___character.data.carriedPlayer = component;
			component.data.carrier = ___character;
			component.refs.afflictions.SubtractStatus((STATUSTYPE)14, 1f, true, false);
			component.refs.afflictions.SubtractStatus((STATUSTYPE)11, 1f, true, false);
			foreach (Character allPlayerCharacter in PlayerHandler.GetAllPlayerCharacters())
			{
				UpdateWeightDel(allPlayerCharacter.refs.afflictions);
			}
			Debug.Log((object)("[NoDropBackpack] " + ((Object)___character).name + " picked up " + ((Object)component).name + " while keeping backpack."));
			return false;
		}
		catch (Exception arg)
		{
			Debug.LogError((object)$"[NoDropBackpack] Prefix error, falling back to vanilla behaviour: {arg}");
			return true;
		}
	}
}