using System;
using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using FruityCompany.Behaviours;
using GameNetcodeStuff;
using HarmonyLib;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("FruityCompany")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("FruityCompany")]
[assembly: AssemblyTitle("FruityCompany")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
}
namespace FruityCompany
{
[BepInPlugin("Kaiser.FruityCompany", "FruityCompany", "1.0.0.0")]
public class FruityCompany : BaseUnityPlugin
{
private const string GUID = "Kaiser.FruityCompany";
private const string NAME = "FruityCompany";
private const string VERSION = "1.0.0.0";
private readonly Harmony harmony = new Harmony("Kaiser.FruityCompany");
internal ManualLogSource mls;
public static FruityCompany Instance { get; private set; }
private void Awake()
{
Instance = this;
mls = Logger.CreateLogSource("Kaiser.FruityCompany");
harmony.PatchAll(typeof(NightVisionPatch));
mls.LogInfo((object)"Patched NightVisionPatch");
string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "fruitycompany");
AssetBundle val = AssetBundle.LoadFromFile(text);
Item val2 = val.LoadAsset<Item>("Assets/SnusCanItem.asset");
val2.holdButtonUse = true;
SnusCan snusCan = val2.spawnPrefab.AddComponent<SnusCan>();
AudioClip snusUseSound = val.LoadAsset<AudioClip>("Assets/snus_use.mp3");
snusCan.snusUseSound = snusUseSound;
((GrabbableObject)snusCan).grabbable = true;
((GrabbableObject)snusCan).grabbableToEnemies = true;
((GrabbableObject)snusCan).itemProperties = val2;
NetworkPrefabs.RegisterNetworkPrefab(val2.spawnPrefab);
Utilities.FixMixerGroups(val2.spawnPrefab);
Items.RegisterScrap(val2, 1000, (LevelTypes)(-1));
harmony.PatchAll(typeof(FruityCompany));
mls.LogInfo((object)"Loaded FruityCompany");
}
}
}
namespace FruityCompany.Behaviours
{
[HarmonyPatch(typeof(PlayerControllerB))]
internal class NightVisionPatch
{
private static MethodInfo TargetMethod()
{
return typeof(PlayerControllerB).GetMethod("SetNightVisionEnabled", BindingFlags.Instance | BindingFlags.NonPublic);
}
[HarmonyPrefix]
private static void Prefix(PlayerControllerB __instance)
{
if (!((Object)(object)__instance.nightVision == (Object)null))
{
SnusEffect component = ((Component)__instance).GetComponent<SnusEffect>();
if ((Object)(object)component != (Object)null && ((Behaviour)component).enabled)
{
__instance.nightVision.intensity = 100000f;
__instance.nightVision.range = 100000f;
__instance.nightVision.shadowStrength = 0f;
__instance.nightVision.shadows = (LightShadows)0;
__instance.nightVision.shape = (LightShape)2;
((Behaviour)__instance.nightVision).enabled = true;
}
}
}
}
public class SnusEffect : MonoBehaviour
{
private void Start()
{
FruityCompany.Instance.mls.LogInfo((object)"SnusEffect Start called");
PlayerControllerB component = ((Component)this).GetComponent<PlayerControllerB>();
if ((Object)(object)component != (Object)null)
{
FruityCompany.Instance.mls.LogInfo((object)"Enabling night vision from SnusEffect Start");
((Behaviour)component.nightVision).enabled = true;
}
}
private void OnDestroy()
{
FruityCompany.Instance.mls.LogInfo((object)"SnusEffect OnDestroy called");
PlayerControllerB component = ((Component)this).GetComponent<PlayerControllerB>();
if ((Object)(object)component != (Object)null)
{
FruityCompany.Instance.mls.LogInfo((object)"Disabling night vision from SnusEffect OnDestroy");
((Behaviour)component.nightVision).enabled = false;
component.nightVision.intensity = 1f;
component.nightVision.range = 12f;
component.nightVision.shadowStrength = 1f;
component.nightVision.shadows = (LightShadows)2;
typeof(PlayerControllerB).GetMethod("SetNightVisionEnabled", BindingFlags.Instance | BindingFlags.NonPublic)?.Invoke(component, new object[1] { false });
}
}
}
internal class SnusCan : PhysicsProp
{
private float originalSprintMeter;
private float originalMovementSpeed;
private float originalMovementSpeedForReal;
private bool originalNightVisionState;
private float originalDrunkness;
private bool isInUse = false;
private int remainingUses = 3;
public AudioClip snusUseSound;
private AudioSource audioSource;
private void Start()
{
audioSource = ((Component)this).gameObject.AddComponent<AudioSource>();
audioSource.playOnAwake = false;
}
public override void ItemActivate(bool used, bool buttonDown = true)
{
//IL_0249: Unknown result type (might be due to invalid IL or missing references)
//IL_024f: Unknown result type (might be due to invalid IL or missing references)
((GrabbableObject)this).ItemActivate(used, buttonDown);
if (!buttonDown || !((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null))
{
return;
}
FruityCompany.Instance.mls.LogInfo((object)$"SnusCan ItemActivate called. Remaining uses: {remainingUses}");
if (remainingUses <= 0)
{
FruityCompany.Instance.mls.LogInfo((object)"No uses remaining");
HUDManager.Instance.DisplayTip("SNUS", "None left!", false, false, "LC_Tip1");
return;
}
audioSource.PlayOneShot(snusUseSound);
remainingUses--;
FruityCompany.Instance.mls.LogInfo((object)$"Uses decremented to: {remainingUses}");
originalMovementSpeed = ((GrabbableObject)this).playerHeldBy.movementSpeed;
if ((double)((GrabbableObject)this).playerHeldBy.movementSpeed > 4.5)
{
originalMovementSpeedForReal = ((GrabbableObject)this).playerHeldBy.movementSpeed;
}
FruityCompany.Instance.mls.LogInfo((object)$"Original movement speed: {originalMovementSpeed}");
((GrabbableObject)this).playerHeldBy.movementSpeed = originalMovementSpeed * 1.75f;
FruityCompany.Instance.mls.LogInfo((object)$"New movement speed: {((GrabbableObject)this).playerHeldBy.movementSpeed}");
FruityCompany.Instance.mls.LogInfo((object)"Adding SnusEffect component");
((Component)((GrabbableObject)this).playerHeldBy).gameObject.AddComponent<SnusEffect>();
if (isInUse)
{
FruityCompany.Instance.mls.LogInfo((object)"Already in use - applying additional effects");
originalDrunkness = ((GrabbableObject)this).playerHeldBy.drunkness;
FruityCompany.Instance.mls.LogInfo((object)$"Original drunkness: {originalDrunkness}");
((GrabbableObject)this).playerHeldBy.drunkness = originalDrunkness + 1f;
FruityCompany.Instance.mls.LogInfo((object)$"New drunkness: {((GrabbableObject)this).playerHeldBy.drunkness}");
((GrabbableObject)this).playerHeldBy.DamagePlayer(20, true, true, (CauseOfDeath)0, 0, false, default(Vector3));
FruityCompany.Instance.mls.LogInfo((object)"Applied 20 damage");
((GrabbableObject)this).playerHeldBy.movementSpeed = 1f;
FruityCompany.Instance.mls.LogInfo((object)"Set movement speed to 1");
}
if (remainingUses <= 0)
{
FruityCompany.Instance.mls.LogInfo((object)"Item used up - setting scrap value to 0");
((GrabbableObject)this).itemUsedUp = true;
((GrabbableObject)this).SetScrapValue(0);
}
HUDManager.Instance.DisplayTip("SNUS", "Popped a snus!", false, false, "LC_Tip1");
isInUse = true;
((MonoBehaviour)this).StartCoroutine(ResetEffectsAfterTime(30f, ((GrabbableObject)this).playerHeldBy));
}
private IEnumerator ResetEffectsAfterTime(float duration, PlayerControllerB player)
{
FruityCompany.Instance.mls.LogInfo((object)$"Starting ResetEffectsAfterTime coroutine for {duration} seconds");
yield return (object)new WaitForSeconds(duration);
if ((Object)(object)player != (Object)null)
{
FruityCompany.Instance.mls.LogInfo((object)"Resetting effects");
player.movementSpeed = originalMovementSpeedForReal;
FruityCompany.Instance.mls.LogInfo((object)$"Reset movement speed to: {originalMovementSpeed}");
player.drunkness = 0f;
FruityCompany.Instance.mls.LogInfo((object)"Reset drunkness to 0");
SnusEffect effect = ((Component)player).GetComponent<SnusEffect>();
if ((Object)(object)effect != (Object)null)
{
FruityCompany.Instance.mls.LogInfo((object)"Destroying SnusEffect component");
Object.Destroy((Object)(object)effect);
}
isInUse = false;
FruityCompany.Instance.mls.LogInfo((object)"Effects reset complete");
}
else
{
FruityCompany.Instance.mls.LogInfo((object)"Player was null during reset");
}
}
}
}