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;
}
}
}