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.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Photon.Pun;
using UnityEngine;
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: AssemblyTitle("InventoryPlus")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("InventoryPlus")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("c15a98e4-d38c-4e0e-a71d-d8ffa4752dc2")]
[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 TieEmTogether;
[BepInPlugin("R3dRazor.TieEmTogether", "Tie Em Together", "1.1.0")]
[BepInProcess("PEAK.exe")]
public class TieEmTogether : BaseUnityPlugin
{
[CompilerGenerated]
private sealed class <Start>d__19 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public TieEmTogether <>4__this;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <Start>d__19(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = null;
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
<>4__this.CreateCustomHoldPrompt();
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();
}
}
[CompilerGenerated]
private sealed class <WaitForAnyInput>d__22 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public Action<string> onBindSelected;
public TieEmTogether <>4__this;
private float <triggerAxis>5__1;
private float <dpadH>5__2;
private float <dpadV>5__3;
private int <i>5__4;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <WaitForAnyInput>d__22(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
((BaseUnityPlugin)<>4__this).Logger.LogInfo((object)"Waiting for any controller input...");
break;
case 1:
<>1__state = -1;
break;
}
<i>5__4 = 0;
while (<i>5__4 <= 19)
{
if (Input.GetKeyDown((KeyCode)(330 + <i>5__4)))
{
onBindSelected?.Invoke($"JoystickButton{<i>5__4}");
return false;
}
<i>5__4++;
}
<triggerAxis>5__1 = Input.GetAxis("3rd Axis");
if (<triggerAxis>5__1 > 0.5f)
{
onBindSelected?.Invoke("RightTrigger");
return false;
}
if (<triggerAxis>5__1 < -0.5f)
{
onBindSelected?.Invoke("LeftTrigger");
return false;
}
<dpadH>5__2 = Input.GetAxis("DPadHorizontal");
<dpadV>5__3 = Input.GetAxis("DPadVertical");
if (Mathf.Abs(<dpadH>5__2) > 0.5f)
{
onBindSelected?.Invoke((<dpadH>5__2 > 0f) ? "DPadRight" : "DPadLeft");
return false;
}
if (Mathf.Abs(<dpadV>5__3) > 0.5f)
{
onBindSelected?.Invoke((<dpadV>5__3 > 0f) ? "DPadUp" : "DPadDown");
return false;
}
<>2__current = null;
<>1__state = 1;
return true;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private const string modGUID = "R3dRazor.TieEmTogether";
private const string modName = "Tie Em Together";
private const string modVersion = "1.1.0";
private const ushort RopeItemID = 65;
private const float holdDuration = 2f;
private readonly Harmony harmony = new Harmony("R3dRazor.TieEmTogether");
private readonly int instanceId = Environment.TickCount;
private GameObject customHoldPromptGO;
private Image customHoldPromptFillImage;
private bool promptVisible = false;
private bool showPromptWarningLogged = false;
private bool isHoldingKey = false;
private float holdTimer = 0f;
private bool actionTriggered = false;
private ConfigEntry<bool> enableMaxCap;
private ConfigEntry<float> maxRopeLength;
private ConfigEntry<KeyCode> combineKey;
private ConfigEntry<string> controllerBind;
private void Awake()
{
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Expected O, but got Unknown
enableMaxCap = ((BaseUnityPlugin)this).Config.Bind<bool>("Rope Combining", "Enable Max Rope Length Cap", false, "Whether the rope length should be capped at a maximum value.");
maxRopeLength = ((BaseUnityPlugin)this).Config.Bind<float>("Rope Combining", "Max Rope Length", 60f, "The maximum rope length allowed when combining. Only used if the cap is enabled. Default Game Value is 60");
combineKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "Combine Key", (KeyCode)99, "The key used to hold and trigger the rope combine action.");
controllerBind = ((BaseUnityPlugin)this).Config.Bind<string>("Keybinds", "ControllerCombineKey", "None", new ConfigDescription("Controller axis or D-pad input to trigger rope combine. Dropdown supported.", (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[7] { "DPadRight", "DPadLeft", "DPadUp", "DPadDown", "RightTrigger", "LeftTrigger", "None" }), Array.Empty<object>()));
string[] source = new string[7] { "DPadRight", "DPadLeft", "DPadUp", "DPadDown", "RightTrigger", "LeftTrigger", "None" };
if (!source.Contains(controllerBind.Value))
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("'" + controllerBind.Value + "' is not a supported controller axis bind. Use dropdown values only."));
}
((BaseUnityPlugin)this).Logger.LogInfo((object)"Config loaded.");
harmony.PatchAll();
if ((Object)(object)((Component)this).GetComponent<PhotonView>() == (Object)null)
{
((Component)this).gameObject.AddComponent<PhotonView>();
}
((BaseUnityPlugin)this).Logger.LogInfo((object)"Tie Em Together mod loaded!");
}
[IteratorStateMachine(typeof(<Start>d__19))]
private IEnumerator Start()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <Start>d__19(0)
{
<>4__this = this
};
}
private void Update()
{
HandleHoldKey();
}
private void HandleHoldKey()
{
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
if (Time.timeScale == 0f)
{
if (!IsControllerBindPressed() && promptVisible)
{
ShowCustomHoldPrompt(show: false);
}
return;
}
Player localPlayer = Player.localPlayer;
if (!CanPerformCombine(localPlayer) || !HasAtLeastTwoRopes(localPlayer))
{
if (promptVisible)
{
ShowCustomHoldPrompt(show: false);
}
}
else if (Input.GetKey(combineKey.Value) || IsControllerBindPressed())
{
if (!isHoldingKey)
{
isHoldingKey = true;
holdTimer = 0f;
actionTriggered = false;
((BaseUnityPlugin)this).Logger.LogInfo((object)"Started holding key to combine ropes...");
ShowCustomHoldPrompt(show: true);
}
if (actionTriggered)
{
return;
}
holdTimer += Time.deltaTime;
UpdateCustomHoldPromptFill(holdTimer / 2f);
if (!(holdTimer >= 2f))
{
return;
}
((BaseUnityPlugin)this).Logger.LogInfo((object)"Hold duration met — attempting to combine ropes.");
if (PhotonNetwork.IsMasterClient)
{
TryCombineRopes(localPlayer);
}
else
{
PhotonView component = ((Component)localPlayer).GetComponent<PhotonView>();
PhotonView component2 = ((Component)this).GetComponent<PhotonView>();
if ((Object)(object)component2 != (Object)null && (Object)(object)component != (Object)null)
{
component2.RPC("RPC_TryCombineRopes", (RpcTarget)2, new object[1] { component.ViewID });
}
else
{
((BaseUnityPlugin)this).Logger.LogWarning((object)"Could not send RPC_TryCombineRopes — missing PhotonView.");
}
}
actionTriggered = true;
ShowCustomHoldPrompt(show: false);
}
else
{
if (isHoldingKey && !actionTriggered)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Canceled rope combine — key released early.");
}
isHoldingKey = false;
holdTimer = 0f;
actionTriggered = false;
ShowCustomHoldPrompt(show: false);
}
}
[IteratorStateMachine(typeof(<WaitForAnyInput>d__22))]
private IEnumerator WaitForAnyInput(Action<string> onBindSelected)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <WaitForAnyInput>d__22(0)
{
<>4__this = this,
onBindSelected = onBindSelected
};
}
private bool IsControllerBindPressed()
{
string value = controllerBind.Value;
if (string.IsNullOrEmpty(value) || value == "None")
{
return false;
}
return value switch
{
"RightTrigger" => Input.GetAxis("3rd Axis") > 0.5f,
"LeftTrigger" => Input.GetAxis("3rd Axis") < -0.5f,
"DPadRight" => Input.GetAxis("DPadHorizontal") > 0.5f,
"DPadLeft" => Input.GetAxis("DPadHorizontal") < -0.5f,
"DPadUp" => Input.GetAxis("DPadVertical") > 0.5f,
"DPadDown" => Input.GetAxis("DPadVertical") < -0.5f,
_ => false,
};
}
private bool IsHoldingRope(Player player)
{
if ((Object)(object)player == (Object)null || player.tempFullSlot == null || player.tempFullSlot.IsEmpty())
{
return false;
}
return (Object)(object)player.tempFullSlot.prefab != (Object)null && player.tempFullSlot.prefab.itemID == 65;
}
private void CreateCustomHoldPrompt()
{
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Expected O, but got Unknown
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Expected O, but got Unknown
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
//IL_0124: Unknown result type (might be due to invalid IL or missing references)
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
//IL_0135: Unknown result type (might be due to invalid IL or missing references)
//IL_0161: Unknown result type (might be due to invalid IL or missing references)
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
//IL_0189: Expected O, but got Unknown
//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
//IL_0208: Unknown result type (might be due to invalid IL or missing references)
//IL_0226: Unknown result type (might be due to invalid IL or missing references)
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[{instanceId}] CreateCustomHoldPrompt called.");
if ((Object)(object)customHoldPromptGO != (Object)null)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[{instanceId}] Custom hold prompt already created.");
return;
}
GameObject val = new GameObject("TieEmTogetherCanvas");
Object.DontDestroyOnLoad((Object)(object)val);
Canvas val2 = val.AddComponent<Canvas>();
val2.renderMode = (RenderMode)0;
val2.sortingOrder = 1000;
val.AddComponent<CanvasScaler>();
val.AddComponent<GraphicRaycaster>();
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[{instanceId}] Canvas created.");
customHoldPromptGO = new GameObject("HoldPrompt");
customHoldPromptGO.transform.SetParent(val.transform);
((BaseUnityPlugin)this).Logger.LogInfo((object)"HoldPrompt GameObject created.");
RectTransform val3 = customHoldPromptGO.AddComponent<RectTransform>();
val3.sizeDelta = new Vector2(200f, 30f);
Vector2 val4 = default(Vector2);
((Vector2)(ref val4))..ctor(0.5f, 0.5f);
val3.anchorMax = val4;
val3.anchorMin = val4;
val3.anchoredPosition = Vector2.zero;
Image val5 = customHoldPromptGO.AddComponent<Image>();
((Graphic)val5).color = new Color(0f, 0f, 0f, 0.6f);
((BaseUnityPlugin)this).Logger.LogInfo((object)"Background image added.");
GameObject val6 = new GameObject("Fill");
val6.transform.SetParent(customHoldPromptGO.transform);
RectTransform val7 = val6.AddComponent<RectTransform>();
val7.anchorMin = new Vector2(0f, 0f);
val7.anchorMax = new Vector2(0f, 1f);
val7.pivot = new Vector2(0f, 0.5f);
val7.anchoredPosition = Vector2.zero;
val7.sizeDelta = new Vector2(0f, 30f);
customHoldPromptFillImage = val6.AddComponent<Image>();
((Graphic)customHoldPromptFillImage).color = Color.green;
((BaseUnityPlugin)this).Logger.LogInfo((object)"Fill image created.");
customHoldPromptGO.SetActive(false);
promptVisible = false;
((BaseUnityPlugin)this).Logger.LogInfo((object)"Custom hold prompt created and hidden.");
}
private void UpdateCustomHoldPromptFill(float fillAmount)
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)customHoldPromptFillImage == (Object)null))
{
RectTransform rectTransform = ((Graphic)customHoldPromptFillImage).rectTransform;
rectTransform.sizeDelta = new Vector2(200f * Mathf.Clamp01(fillAmount), 30f);
}
}
private void ShowCustomHoldPrompt(bool show)
{
if ((Object)(object)customHoldPromptGO == (Object)null)
{
if (!showPromptWarningLogged)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)$"[{instanceId}] ShowCustomHoldPrompt called but customHoldPromptGO is null");
showPromptWarningLogged = true;
}
}
else if (promptVisible != show)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[{instanceId}] Showing prompt: {show}");
customHoldPromptGO.SetActive(show);
if (!show)
{
UpdateCustomHoldPromptFill(0f);
}
promptVisible = show;
showPromptWarningLogged = false;
}
}
private bool CanPerformCombine(Player player)
{
if ((Object)(object)player == (Object)null || player.itemSlots == null)
{
return false;
}
Character character = player.character;
if ((Object)(object)character == (Object)null || (Object)(object)character.data == (Object)null)
{
return false;
}
return !character.data.dead && !character.data.fullyPassedOut && !character.data.isClimbingAnything;
}
private bool HasAtLeastTwoRopes(Player player)
{
if (player?.itemSlots == null)
{
return false;
}
int num = player.itemSlots.Count((ItemSlot slot) => slot != null && !slot.IsEmpty() && (Object)(object)slot.prefab != (Object)null && slot.prefab.itemID == 65);
return num >= 2;
}
[PunRPC]
private void RPC_TryCombineRopes(int viewID)
{
PhotonView val = PhotonView.Find(viewID);
if ((Object)(object)val == (Object)null)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("RPC_TryCombineRopes: PhotonView not found for ViewID: " + viewID));
return;
}
Player component = ((Component)val).GetComponent<Player>();
if ((Object)(object)component == (Object)null)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)"RPC_TryCombineRopes: Player not found on PhotonView.");
}
else
{
TryCombineRopes(component);
}
}
private void TryCombineRopes(Player player)
{
if ((Object)(object)player == (Object)null)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)"Player is null!");
return;
}
ItemSlot[] array = player.itemSlots.Where((ItemSlot slot) => slot != null && !slot.IsEmpty() && (Object)(object)slot.prefab != (Object)null && slot.prefab.itemID == 65).Take(2).ToArray();
if (array.Length < 2)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Less than two ropes found. Cannot combine.");
return;
}
ItemSlot val = array[0];
ItemSlot val2 = array[1];
FloatItemData val3 = default(FloatItemData);
FloatItemData val4 = default(FloatItemData);
if (!val.data.TryGetDataEntry<FloatItemData>((DataEntryKey)10, ref val3) || !val2.data.TryGetDataEntry<FloatItemData>((DataEntryKey)10, ref val4))
{
((BaseUnityPlugin)this).Logger.LogWarning((object)"One of the ropes is missing Fuel data.");
return;
}
float value = val3.Value;
float value2 = val4.Value;
((BaseUnityPlugin)this).Logger.LogInfo((object)$"Lengths before combine: {value} + {value2}");
float num = value + value2;
if (enableMaxCap.Value)
{
num = Mathf.Min(num, maxRopeLength.Value);
}
val2.EmptyOut();
val3.Value = num;
((BaseUnityPlugin)this).Logger.LogInfo((object)$"Combined two ropes: {value} + {value2} => {num}");
}
}