using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using ExitGames.Client.Photon;
using HarmonyLib;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
using UnityEngine.SceneManagement;
using Zorro.Core.Serizalization;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("PEAK Tag")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PEAK Tag")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("a79f76bb-595e-4baf-a566-700e65990610")]
[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 PEAKTag;
[BepInPlugin("tony4twentys.PEAK_Tag", "PEAK Tag", "1.1.0")]
public class PEAKTagPlugin : BaseUnityPlugin, IInRoomCallbacks
{
private struct GiftDef
{
public ushort id;
public string name;
}
private enum PowerType
{
None,
PlayerStun,
PlayerWarp,
PlayerItemDrop
}
[HarmonyPatch(typeof(RunManager), "StartRun")]
private static class StartRunPatch
{
private static void Postfix()
{
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
if (PhotonNetwork.IsMasterClient)
{
Scene activeScene = SceneManager.GetActiveScene();
if (!string.Equals(((Scene)(ref activeScene)).name, "Airport", StringComparison.OrdinalIgnoreCase))
{
Instance?.StartRunHostFlow();
}
}
}
}
[HarmonyPatch(typeof(Campfire), "Light_Rpc")]
private static class CampfireLightPost
{
private static void Postfix(Campfire __instance)
{
if (!PhotonNetwork.IsMasterClient || (Object)(object)Instance == (Object)null)
{
return;
}
Instance._campfireItCooldownUntil = PhotonNetwork.Time + (double)((Instance._campfireCooldownSec != null) ? Instance._campfireCooldownSec.Value : 60f);
Character val = FindCharacterByViewID(Instance._itViewId);
if ((Object)(object)val != (Object)null)
{
float seconds = ((Instance._campfireRagdollSec != null) ? Instance._campfireRagdollSec.Value : 5f);
Instance.RagdollWithGrayscale(val, seconds);
return;
}
List<Character> allCharacters = Character.AllCharacters;
int count = allCharacters.Count;
List<Character> list = new List<Character>();
for (int i = 0; i < count; i++)
{
Character val2 = allCharacters[i];
if (IsAlive(val2) && !val2.isBot)
{
list.Add(val2);
}
}
if (list.Count > 0)
{
Character who = list[Random.Range(0, list.Count)];
((BaseUnityPlugin)Instance).Logger.LogInfo((object)"[Tag] Campfire lit but no IT in room; choosing a new IT immediately.");
Instance.SetItNow(who, 1.5);
float seconds2 = Instance._campfireRagdollSec?.Value ?? 5f;
Instance.RagdollWithGrayscale(who, seconds2);
}
}
}
[HarmonyPatch(typeof(ScoutmasterSpawner), "SpawnScoutmaster")]
private static class BlockScoutmasterSpawn
{
private static bool Prefix()
{
if (!PhotonNetwork.IsMasterClient)
{
return true;
}
PEAKTagPlugin instance = Instance;
if (instance != null)
{
ManualLogSource logger = ((BaseUnityPlugin)instance).Logger;
if (logger != null)
{
logger.LogInfo((object)"[Tag] Blocked Scoutmaster spawn (host-only).");
}
}
return false;
}
}
[HarmonyPatch(typeof(Item))]
private static class ItemCarryWeightZeroPatch
{
[HarmonyPatch("get_CarryWeight")]
[HarmonyPostfix]
private static void CarryWeightPostfix(ref int __result)
{
if (PhotonNetwork.IsMasterClient)
{
__result = 0;
}
}
}
[CompilerGenerated]
private sealed class <BoostGiftLoop>d__101 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public PEAKTagPlugin <>4__this;
private float <wait>5__1;
private Character <itChar>5__2;
private bool <doLolli>5__3;
private bool <doEnergy>5__4;
private bool <doBonus>5__5;
private int <times>5__6;
private int <times>5__7;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <BoostGiftLoop>d__101(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<itChar>5__2 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
break;
case 1:
<>1__state = -1;
<itChar>5__2 = FindCharacterByViewID(<>4__this._itViewId);
if (!IsAlive(<itChar>5__2))
{
break;
}
<>4__this.PickBoostSet(out <doLolli>5__3, out <doEnergy>5__4, out <doBonus>5__5);
if (<doLolli>5__3)
{
if (<>4__this._lolliChainCo != null)
{
((MonoBehaviour)<>4__this).StopCoroutine(<>4__this._lolliChainCo);
}
<times>5__6 = Mathf.Max(1, (<>4__this._infiniteMultiplier != null) ? <>4__this._infiniteMultiplier.Value : 3);
<>4__this._lolliChainCo = ((MonoBehaviour)<>4__this).StartCoroutine(<>4__this.ChainFeed(<itChar>5__2, 44, <times>5__6, "Lollipop"));
}
if (<doEnergy>5__4)
{
if (<>4__this._drinkChainCo != null)
{
((MonoBehaviour)<>4__this).StopCoroutine(<>4__this._drinkChainCo);
}
<times>5__7 = Mathf.Max(1, (<>4__this._boostMultiplier != null) ? <>4__this._boostMultiplier.Value : 3);
<>4__this._drinkChainCo = ((MonoBehaviour)<>4__this).StartCoroutine(<>4__this.ChainFeed(<itChar>5__2, 27, <times>5__7, "Energy Drink"));
}
if (<doBonus>5__5)
{
<>4__this.GiveFullBonusStamina(<itChar>5__2);
}
<>4__this.GivePowerGiftToIt(<itChar>5__2);
<itChar>5__2 = null;
break;
}
if (PhotonNetwork.IsMasterClient && PhotonNetwork.InRoom)
{
<wait>5__1 = ((<>4__this._boostGiftIntervalSec != null) ? Mathf.Max(5f, <>4__this._boostGiftIntervalSec.Value) : 90f);
<>2__current = (object)new WaitForSecondsRealtime(<wait>5__1);
<>1__state = 1;
return true;
}
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 <ChainFeed>d__104 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public Character receiver;
public ushort itemID;
public int times;
public string label;
public PEAKTagPlugin <>4__this;
private int <i>5__1;
private Item <spawned>5__2;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <ChainFeed>d__104(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<spawned>5__2 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Expected O, but got Unknown
int num = <>1__state;
if (num != 0)
{
if (num != 1)
{
return false;
}
<>1__state = -1;
goto IL_00d7;
}
<>1__state = -1;
if ((Object)(object)receiver?.refs?.view == (Object)null)
{
return false;
}
<i>5__1 = 0;
goto IL_00f1;
IL_00f1:
if (<i>5__1 < times)
{
if (!<>4__this.ForceFeedOnce(receiver, itemID, label, out <spawned>5__2))
{
return false;
}
((MonoBehaviour)<>4__this).StartCoroutine(<>4__this.CleanupAfter(<spawned>5__2));
if (<i>5__1 < times - 1)
{
<>2__current = (object)new WaitForSeconds(13f);
<>1__state = 1;
return true;
}
goto IL_00d7;
}
return false;
IL_00d7:
<spawned>5__2 = null;
<i>5__1++;
goto IL_00f1;
}
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 <CleanupAfter>d__106 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public Item item;
public PEAKTagPlugin <>4__this;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <CleanupAfter>d__106(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitForSeconds(2f);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
if (Object.op_Implicit((Object)(object)item) && Object.op_Implicit((Object)(object)((MonoBehaviourPun)item).photonView))
{
PhotonNetwork.Destroy(((MonoBehaviourPun)item).photonView);
}
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 <DeferRefreshItEyes>d__146 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public int guardItViewId;
public PEAKTagPlugin <>4__this;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <DeferRefreshItEyes>d__146(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitForSeconds(0.25f);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
if (<>4__this._itViewId == guardItViewId)
{
<>4__this.RefreshItEyes();
}
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 <DeferRefreshItEyesAfterRagdoll>d__147 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public Character itChar;
public float ragdollDuration;
public PEAKTagPlugin <>4__this;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <DeferRefreshItEyesAfterRagdoll>d__147(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitForSeconds(0.5f);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
<>4__this.RefreshItEyes();
((BaseUnityPlugin)<>4__this).Logger.LogInfo((object)"[Tag] Eyes refreshed for initial IT after ragdoll application.");
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 <EquipBackpacksAfterDelay>d__77 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public PEAKTagPlugin <>4__this;
private float <timeout>5__1;
private float <t>5__2;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <EquipBackpacksAfterDelay>d__77(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Expected O, but got Unknown
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitForSeconds(15f);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
<timeout>5__1 = 45f;
<t>5__2 = 0f;
break;
case 2:
<>1__state = -1;
<t>5__2 += 2f;
break;
}
if (PhotonNetwork.IsMasterClient && <t>5__2 < <timeout>5__1)
{
<>4__this.GiveBackpacksNow();
if (AllHumansHaveBackpacks())
{
return false;
}
<>2__current = (object)new WaitForSeconds(2f);
<>1__state = 2;
return true;
}
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 <FreezeAfflictionsLoop>d__144 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public PEAKTagPlugin <>4__this;
private int <statusCount>5__1;
private float[] <snapshot>5__2;
private List<Character> <characters>5__3;
private int <count>5__4;
private int <i>5__5;
private int <i>5__6;
private Character <c>5__7;
private PhotonView <view>5__8;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <FreezeAfflictionsLoop>d__144(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<snapshot>5__2 = null;
<characters>5__3 = null;
<c>5__7 = null;
<view>5__8 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0177: Unknown result type (might be due to invalid IL or missing references)
//IL_0181: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<statusCount>5__1 = Enum.GetNames(typeof(STATUSTYPE)).Length;
<snapshot>5__2 = new float[<statusCount>5__1];
break;
case 1:
<>1__state = -1;
break;
}
if (PhotonNetwork.IsMasterClient && PhotonNetwork.InRoom)
{
try
{
<i>5__5 = 0;
while (<i>5__5 < <statusCount>5__1)
{
<snapshot>5__2[<i>5__5] = 0f;
<i>5__5++;
}
<characters>5__3 = Character.AllCharacters;
<count>5__4 = <characters>5__3.Count;
<i>5__6 = 0;
while (<i>5__6 < <count>5__4)
{
<c>5__7 = <characters>5__3[<i>5__6];
if (IsAlive(<c>5__7))
{
<view>5__8 = <c>5__7.refs?.view;
if (<view>5__8 != null)
{
<view>5__8.RPC("ApplyStatusesFromFloatArrayRPC", (RpcTarget)0, new object[1] { <snapshot>5__2 });
}
}
<c>5__7 = null;
<view>5__8 = null;
<i>5__6++;
}
<characters>5__3 = null;
}
catch
{
}
<>2__current = (object)new WaitForSeconds(1f);
<>1__state = 1;
return true;
}
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 <GiftLoop>d__94 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public PEAKTagPlugin <>4__this;
private float <secs>5__1;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <GiftLoop>d__94(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
break;
case 1:
<>1__state = -1;
<>4__this.TryGiveRandomGiftsToAll();
break;
}
if (PhotonNetwork.IsMasterClient && PhotonNetwork.InRoom && (<>4__this._giftEnabled == null || <>4__this._giftEnabled.Value))
{
<secs>5__1 = ((<>4__this._giftIntervalSec != null) ? Mathf.Max(10f, <>4__this._giftIntervalSec.Value) : 300f);
<>2__current = (object)new WaitForSecondsRealtime(<secs>5__1);
<>1__state = 1;
return true;
}
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 <GrayscaleWindow>d__121 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public Character who;
public float seconds;
public PEAKTagPlugin <>4__this;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <GrayscaleWindow>d__121(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
if ((Object)(object)who?.refs?.view == (Object)null)
{
return false;
}
<>2__current = (object)new WaitForSeconds(seconds);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
try
{
who.refs.view.RPC("OnRevive_RPC", (RpcTarget)3, Array.Empty<object>());
}
catch
{
}
if ((Object)(object)who.refs?.view != (Object)null && who.refs.view.ViewID == <>4__this._itViewId)
{
TryMarkEyes(who, makePassedOut: true);
}
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 <HostRunStartFlowCo>d__74 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public PEAKTagPlugin <>4__this;
private float <delaySeconds>5__1;
private float <waited>5__2;
private List<Character> <characters>5__3;
private int <count>5__4;
private List<Character> <list>5__5;
private Character <chosen>5__6;
private int <viewId>5__7;
private float <rag>5__8;
private int <i>5__9;
private Character <c>5__10;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <HostRunStartFlowCo>d__74(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<characters>5__3 = null;
<list>5__5 = null;
<chosen>5__6 = null;
<c>5__10 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
//IL_02f2: Unknown result type (might be due to invalid IL or missing references)
//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
//IL_030d: Expected O, but got Unknown
//IL_030e: Unknown result type (might be due to invalid IL or missing references)
//IL_0329: Expected O, but got Unknown
//IL_0331: Expected O, but got Unknown
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
//IL_013e: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>4__this.StopItWatcher();
<>4__this.StopGiftLoop();
<>4__this.StopBoostGiftLoop();
<>4__this.StopNonItDistanceWatch();
<>4__this.StopFreezeAfflictions();
<>4__this.ResetScoreboardStats();
<>4__this.ClearPlayerPowers();
<>4__this.StartFreezeAfflictions();
((MonoBehaviour)<>4__this).StartCoroutine(<>4__this.EquipBackpacksAfterDelay());
<delaySeconds>5__1 = ((<>4__this._initialItDelaySec != null) ? <>4__this._initialItDelaySec.Value : 60f);
((BaseUnityPlugin)<>4__this).Logger.LogInfo((object)$"[Tag] Waiting {<delaySeconds>5__1} seconds before picking initial IT...");
<waited>5__2 = 0f;
break;
case 1:
<>1__state = -1;
<waited>5__2 += 1f;
break;
}
if (<waited>5__2 < <delaySeconds>5__1)
{
if (!PhotonNetwork.IsMasterClient || !PhotonNetwork.InRoom)
{
return false;
}
Scene activeScene = SceneManager.GetActiveScene();
if (string.Equals(((Scene)(ref activeScene)).name, "Airport", StringComparison.OrdinalIgnoreCase))
{
return false;
}
<>2__current = (object)new WaitForSeconds(1f);
<>1__state = 1;
return true;
}
<characters>5__3 = Character.AllCharacters;
<count>5__4 = <characters>5__3.Count;
<list>5__5 = new List<Character>();
<i>5__9 = 0;
while (<i>5__9 < <count>5__4)
{
<c>5__10 = <characters>5__3[<i>5__9];
if ((Object)(object)<c>5__10 != (Object)null && !<c>5__10.isBot && (Object)(object)<c>5__10.refs?.view != (Object)null && !<c>5__10.data.dead)
{
<list>5__5.Add(<c>5__10);
}
<c>5__10 = null;
<i>5__9++;
}
if (<list>5__5.Count == 0)
{
return false;
}
<chosen>5__6 = <list>5__5[Random.Range(0, <list>5__5.Count)];
<viewId>5__7 = <chosen>5__6.refs.view.ViewID;
<>4__this._prevItViewId = <>4__this._itViewId;
<>4__this._itViewId = <viewId>5__7;
<>4__this._graceUntil = PhotonNetwork.Time + 1.5;
Room currentRoom = PhotonNetwork.CurrentRoom;
Hashtable val = new Hashtable();
((Dictionary<object, object>)val).Add((object)"tag_itViewId", (object)<viewId>5__7);
((Dictionary<object, object>)val).Add((object)"tag_graceUntil", (object)<>4__this._graceUntil);
currentRoom.SetCustomProperties(val, (Hashtable)null, (WebFlags)null);
((BaseUnityPlugin)<>4__this).Logger.LogInfo((object)$"[Tag] Initial IT chosen: {SafeName(<chosen>5__6)} (ViewID {<viewId>5__7}).");
<rag>5__8 = ((<>4__this._initialItRagdollSec != null) ? <>4__this._initialItRagdollSec.Value : 10f);
((BaseUnityPlugin)<>4__this).Logger.LogInfo((object)$"[Tag] Ragdolling initial IT for {<rag>5__8} seconds...");
<>4__this.RagdollWithGrayscale(<chosen>5__6, <rag>5__8);
((MonoBehaviour)<>4__this).StartCoroutine(<>4__this.DeferRefreshItEyesAfterRagdoll(<chosen>5__6, <rag>5__8));
<>4__this.StartGiftLoop();
<>4__this.StartBoostGiftLoop();
<>4__this.PreOpenAllLuggageNoLoot();
<>4__this.StartNonItDistanceWatch();
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 <ItWatch>d__86 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public Character it;
public PEAKTagPlugin <>4__this;
private PlayerEyeLook <eye>5__1;
private CharacterData <data>5__2;
private double <now>5__3;
private Character <target>5__4;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <ItWatch>d__86(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<eye>5__1 = null;
<data>5__2 = null;
<target>5__4 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Expected O, but got Unknown
//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
//IL_01c5: Expected O, but got Unknown
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
//IL_0148: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
{
<>1__state = -1;
Character obj = it;
<eye>5__1 = ((obj != null) ? ((Component)obj).GetComponent<PlayerEyeLook>() : null);
<data>5__2 = it?.data;
if ((Object)(object)<eye>5__1 == (Object)null || (Object)(object)<data>5__2 == (Object)null)
{
return false;
}
break;
}
case 1:
<>1__state = -1;
break;
case 2:
<>1__state = -1;
break;
case 3:
<>1__state = -1;
break;
}
if (PhotonNetwork.IsMasterClient && (Object)(object)it != (Object)null && <data>5__2.isReaching && <>4__this._itViewId == it.refs.view.ViewID)
{
<now>5__3 = PhotonNetwork.Time;
if (<now>5__3 < <>4__this._graceUntil)
{
<>2__current = (object)new WaitForSeconds(0.05f);
<>1__state = 1;
return true;
}
if (<eye>5__1.lookingAtCharacter && (Object)(object)<eye>5__1.character != (Object)null && <eye>5__1.distance <= 1.5f)
{
if (TaggingBlockedByCampfire(it, <eye>5__1.character))
{
<>2__current = (object)new WaitForSeconds(0.05f);
<>1__state = 2;
return true;
}
<target>5__4 = <eye>5__1.character;
if (IsAlive(<target>5__4) && (Object)(object)<target>5__4 != (Object)(object)it)
{
<>4__this.HostPerformTag(it, <target>5__4);
return false;
}
<target>5__4 = null;
}
<>2__current = (object)new WaitForSeconds(0.05f);
<>1__state = 3;
return true;
}
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 <NonItDistanceWatchLoop>d__98 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public PEAKTagPlugin <>4__this;
private float <wait>5__1;
private Character <itChar>5__2;
private float <gap>5__3;
private Vector3 <itPos>5__4;
private List<Character> <characters>5__5;
private int <count>5__6;
private int <i>5__7;
private Character <c>5__8;
private float <dy>5__9;
private Vector3 <near>5__10;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <NonItDistanceWatchLoop>d__98(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<itChar>5__2 = null;
<characters>5__5 = null;
<c>5__8 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Expected O, but got Unknown
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_019b: Unknown result type (might be due to invalid IL or missing references)
//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
//IL_01c8: 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_01f1: Unknown result type (might be due to invalid IL or missing references)
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
break;
case 1:
<>1__state = -1;
<itChar>5__2 = FindCharacterByViewID(<>4__this._itViewId);
if (!IsAlive(<itChar>5__2))
{
break;
}
<gap>5__3 = ((<>4__this._nonItWarpVerticalGapMeters != null) ? Mathf.Max(5f, <>4__this._nonItWarpVerticalGapMeters.Value) : 80f);
<itPos>5__4 = <itChar>5__2.Center;
<characters>5__5 = Character.AllCharacters;
<count>5__6 = <characters>5__5.Count;
<i>5__7 = 0;
while (<i>5__7 < <count>5__6)
{
<c>5__8 = <characters>5__5[<i>5__7];
if (IsAlive(<c>5__8) && !<c>5__8.isBot && (Object)(object)<c>5__8 != (Object)(object)<itChar>5__2)
{
<dy>5__9 = <itPos>5__4.y - <c>5__8.Center.y;
if (<dy>5__9 > <gap>5__3)
{
try
{
<near>5__10 = <itPos>5__4 + new Vector3(Random.Range(-2f, 2f), 0f, Random.Range(-2f, 2f));
<c>5__8.refs.view.RPC("WarpPlayerRPC", (RpcTarget)0, new object[2] { <near>5__10, true });
}
catch
{
}
}
}
<c>5__8 = null;
<i>5__7++;
}
<itChar>5__2 = null;
<characters>5__5 = null;
break;
}
if (PhotonNetwork.IsMasterClient && PhotonNetwork.InRoom)
{
<wait>5__1 = ((<>4__this._nonItWarpCheckIntervalSec != null) ? Mathf.Max(1f, <>4__this._nonItWarpCheckIntervalSec.Value) : 5f);
<>2__current = (object)new WaitForSeconds(<wait>5__1);
<>1__state = 1;
return true;
}
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 <ReassertEyeMark>d__76 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public int itViewId;
public PEAKTagPlugin <>4__this;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <ReassertEyeMark>d__76(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitForSeconds(0.25f);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
if (<>4__this._itViewId == itViewId)
{
<>4__this.RefreshItEyes();
}
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();
}
}
public static PEAKTagPlugin Instance;
private const string PROP_IT = "tag_itViewId";
private const string PROP_GRACE_UNTIL = "tag_graceUntil";
private const float TAG_DISTANCE = 1.5f;
private const double NEW_IT_GRACE = 1.5;
private const float TAG_TICK_SEC = 0.05f;
private const float BACKPACK_DELAY_SEC = 15f;
private const float INITIAL_IT_DELAY_SEC = 60f;
private const float FALL_SECONDS_ON_TAG = 5f;
private const float CAMPFIRE_SAFE_RADIUS = 15f;
private const float EYE_REASSERT_DELAY = 0.25f;
private bool _scoreboardVisible = false;
private ConfigEntry<KeyCode> _scoreboardKey;
private ConfigEntry<KeyCode> _scoreboardModifierKey;
private ConfigEntry<bool> _scoreboardRequireModifier;
private ConfigEntry<bool> _scoreboardShowOnStart;
private ConfigEntry<Color> _scoreboardBackgroundColor;
private ConfigEntry<Color> _scoreboardTextColor;
private ConfigEntry<Color> _scoreboardHeaderColor;
private ConfigEntry<int> _scoreboardFontSize;
private ConfigEntry<float> _scoreboardWidth;
private ConfigEntry<float> _scoreboardHeight;
private ConfigEntry<float> _scoreboardX;
private ConfigEntry<float> _scoreboardY;
private const float IT_WARP_CHECK_INTERVAL = 5f;
private const float NONIT_WARP_VERTICAL_GAP = 80f;
private const float FREEZE_TICK_SEC = 1f;
private Coroutine _giftCo;
private ConfigEntry<bool> _giftEnabled;
private ConfigEntry<float> _giftIntervalSec;
private ConfigEntry<bool> _giftExcludeRescueHook;
private readonly GiftDef[] _giftPool = new GiftDef[12]
{
new GiftDef
{
id = 1,
name = "Anti-Rope Spool"
},
new GiftDef
{
id = 37,
name = "Balloon Bunch"
},
new GiftDef
{
id = 79,
name = "Bounce Shroom"
},
new GiftDef
{
id = 17,
name = "Chain Launcher"
},
new GiftDef
{
id = 18,
name = "Piton"
},
new GiftDef
{
id = 36,
name = "Coconut"
},
new GiftDef
{
id = 45,
name = "Magic Bean"
},
new GiftDef
{
id = 100,
name = "Rescue Hook"
},
new GiftDef
{
id = 63,
name = "Rope Cannon"
},
new GiftDef
{
id = 64,
name = "Anti-Rope Cannon"
},
new GiftDef
{
id = 107,
name = "Scout Cannon"
},
new GiftDef
{
id = 68,
name = "Shelf Shroom"
}
};
private ConfigEntry<float> _campfireCooldownSec;
private ConfigEntry<float> _campfireRagdollSec;
private ConfigEntry<float> _initialItDelaySec;
private ConfigEntry<float> _initialItRagdollSec;
private ConfigEntry<float> _nonItWarpCheckIntervalSec;
private ConfigEntry<float> _nonItWarpVerticalGapMeters;
private ConfigEntry<float> _playerStunPowerChance;
private ConfigEntry<float> _playerStunPowerTime;
private ConfigEntry<float> _playerWarpPowerChance;
private ConfigEntry<float> _playerItemDropChance;
private const float BUFF_BASE_SECONDS = 13f;
private const ushort LOLLIPOP_ID = 44;
private const ushort ENERGY_ID = 27;
private ConfigEntry<int> _infiniteMultiplier;
private ConfigEntry<int> _boostMultiplier;
private ConfigEntry<float> _boostGiftIntervalSec;
private Coroutine _boostGiftCo;
private Coroutine _lolliChainCo;
private Coroutine _drinkChainCo;
private int _itViewId = -1;
private int _prevItViewId = -1;
private double _graceUntil = 0.0;
private double _campfireItCooldownUntil = 0.0;
private Coroutine _itWatcherCo;
private int _itWatcherViewId = -1;
private Coroutine _runStartCo;
private Coroutine _nonItDistanceWatchCo;
private Coroutine _freezeAfflictionsCo;
private static readonly List<Campfire> _campfires = new List<Campfire>(32);
private float _campfireCacheNextRebuildTime = 0f;
private readonly Dictionary<int, int> _tagsMade = new Dictionary<int, int>();
private readonly Dictionary<int, int> _tagsGot = new Dictionary<int, int>();
private Dictionary<int, PowerType> _playerPowers = new Dictionary<int, PowerType>();
private Dictionary<int, bool> _powerAvailable = new Dictionary<int, bool>();
private Harmony _harmony;
private void Awake()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Expected O, but got Unknown
//IL_0354: Unknown result type (might be due to invalid IL or missing references)
//IL_0379: Unknown result type (might be due to invalid IL or missing references)
//IL_039e: Unknown result type (might be due to invalid IL or missing references)
Instance = this;
_harmony = new Harmony("tony4twentys.PEAK_Tag");
_harmony.PatchAll();
TryPatchReachingRpcs();
TryPatchEyePersistence();
TryPatchLuggageNoLoot();
TryPatchLuggageSpawnRoutineBlock();
TryPatchLuggageAwakeAutoOpen();
TryPatchHostAfflictions();
PhotonNetwork.AddCallbackTarget((object)this);
SceneManager.activeSceneChanged += OnSceneChanged;
_giftEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Gifts", "Enabled", true, "Give players a random helpful item periodically (host-only)");
_giftIntervalSec = ((BaseUnityPlugin)this).Config.Bind<float>("Gifts", "IntervalSeconds", 120f, "Seconds between random gifts to each player");
_giftExcludeRescueHook = ((BaseUnityPlugin)this).Config.Bind<bool>("Gifts", "ExcludeRescueHook", true, "Exclude Rescue Hook (id 100) from the random gift pool");
_campfireCooldownSec = ((BaseUnityPlugin)this).Config.Bind<float>("Campfires", "ItCooldownSeconds", 60f, "Seconds after a campfire lights during which IT cannot tag (host-only)");
_campfireRagdollSec = ((BaseUnityPlugin)this).Config.Bind<float>("Campfires", "ItRagdollSecondsOnLight", 5f, "Seconds to ragdoll the current IT when a campfire lights");
_initialItDelaySec = ((BaseUnityPlugin)this).Config.Bind<float>("IT", "InitialItDelaySeconds", 20f, "Seconds to wait before picking the initial IT (default: 20s)");
_initialItRagdollSec = ((BaseUnityPlugin)this).Config.Bind<float>("IT", "InitialRagdollSeconds", 10f, "Seconds to ragdoll the initial IT (also grayscale duration)");
_nonItWarpCheckIntervalSec = ((BaseUnityPlugin)this).Config.Bind<float>("IT", "WarpCheckInterval", 5f, "Seconds between non-IT vertical distance checks");
_nonItWarpVerticalGapMeters = ((BaseUnityPlugin)this).Config.Bind<float>("IT", "WarpDistanceMeters", 80f, "Vertical gap (meters) below IT that will trigger a warp for non-IT players");
_playerStunPowerChance = ((BaseUnityPlugin)this).Config.Bind<float>("PlayerPowers", "PlayerStunPowerChance", 0.05f, "Chance (0.0-1.0) for Player Stun power (global ragdoll)");
_playerStunPowerTime = ((BaseUnityPlugin)this).Config.Bind<float>("PlayerPowers", "PlayerStunPowerTime", 5f, "Duration in seconds for Player Stun power ragdoll effect");
_playerWarpPowerChance = ((BaseUnityPlugin)this).Config.Bind<float>("PlayerPowers", "PlayerWarpPowerChance", 0.05f, "Chance (0.0-1.0) for Player Warp power (warp non-IT to lowest Y)");
_playerItemDropChance = ((BaseUnityPlugin)this).Config.Bind<float>("PlayerPowers", "PlayerItemDropChance", 0.05f, "Chance (0.0-1.0) for Player Item Drop power (drop all items)");
_infiniteMultiplier = ((BaseUnityPlugin)this).Config.Bind<int>("Chains", "InfiniteStaminaTimeMultiplier", 3, "Base ~13s x this value");
_boostMultiplier = ((BaseUnityPlugin)this).Config.Bind<int>("Chains", "BoostSprintAndClimbMultiplier", 3, "Base ~13s x this value");
_boostGiftIntervalSec = ((BaseUnityPlugin)this).Config.Bind<float>("BoostGifts", "IntervalSeconds", 90f, "Seconds between boost rolls for the current IT (50/30/20 split).");
_scoreboardKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Scoreboard", "Key", (KeyCode)115, "Key to toggle scoreboard visibility");
_scoreboardModifierKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Scoreboard", "ModifierKey", (KeyCode)308, "Modifier key for scoreboard (default: Alt+S)");
_scoreboardRequireModifier = ((BaseUnityPlugin)this).Config.Bind<bool>("Scoreboard", "RequireModifier", true, "Require modifier key to toggle scoreboard (set to false to use just the key)");
_scoreboardShowOnStart = ((BaseUnityPlugin)this).Config.Bind<bool>("Scoreboard", "ShowOnStart", false, "Show scoreboard when the game starts");
_scoreboardBackgroundColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Scoreboard", "BackgroundColor", new Color(0f, 0f, 0f, 0.8f), "Background color of the scoreboard");
_scoreboardTextColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Scoreboard", "TextColor", Color.white, "Text color of the scoreboard");
_scoreboardHeaderColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Scoreboard", "HeaderColor", Color.white, "Header color of the scoreboard");
_scoreboardFontSize = ((BaseUnityPlugin)this).Config.Bind<int>("Scoreboard", "FontSize", 16, "Font size of the scoreboard text");
_scoreboardWidth = ((BaseUnityPlugin)this).Config.Bind<float>("Scoreboard", "Width", 350f, "Width of the scoreboard");
_scoreboardHeight = ((BaseUnityPlugin)this).Config.Bind<float>("Scoreboard", "Height", 250f, "Height of the scoreboard");
_scoreboardX = ((BaseUnityPlugin)this).Config.Bind<float>("Scoreboard", "X", 10f, "X position of the scoreboard");
_scoreboardY = ((BaseUnityPlugin)this).Config.Bind<float>("Scoreboard", "Y", 10f, "Y position of the scoreboard");
_scoreboardVisible = _scoreboardShowOnStart.Value;
((BaseUnityPlugin)this).Logger.LogInfo((object)"[Tag] Loaded v1.1.0 (OPTIMIZED + Player Powers System + freeze @ run start, centralized eyes, no SFX/VFX patches).");
}
private void OnDestroy()
{
PhotonNetwork.RemoveCallbackTarget((object)this);
SceneManager.activeSceneChanged -= OnSceneChanged;
try
{
Harmony harmony = _harmony;
if (harmony != null)
{
harmony.UnpatchSelf();
}
}
catch
{
}
}
private void OnSceneChanged(Scene oldScene, Scene newScene)
{
if (((Scene)(ref newScene)).name == "Airport")
{
StopItWatcher();
StopGiftLoop();
StopBoostGiftLoop();
StopNonItDistanceWatch();
StopFreezeAfflictions();
_prevItViewId = -1;
_itViewId = -1;
_graceUntil = 0.0;
_runStartCo = null;
ClearPlayerPowers();
((BaseUnityPlugin)this).Logger.LogInfo((object)"[Tag] Reset at Airport.");
}
else if (PhotonNetwork.IsMasterClient && PhotonNetwork.InRoom)
{
RefreshItEyes();
}
}
private void StartRunHostFlow()
{
if (_runStartCo != null)
{
((MonoBehaviour)this).StopCoroutine(_runStartCo);
}
_runStartCo = ((MonoBehaviour)this).StartCoroutine(HostRunStartFlowCo());
}
[IteratorStateMachine(typeof(<HostRunStartFlowCo>d__74))]
private IEnumerator HostRunStartFlowCo()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <HostRunStartFlowCo>d__74(0)
{
<>4__this = this
};
}
private void SetItNow(Character who, double grace)
{
//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_0074: Expected O, but got Unknown
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: Expected O, but got Unknown
//IL_0093: Expected O, but got Unknown
if (!((Object)(object)who?.refs?.view == (Object)null))
{
int viewID = who.refs.view.ViewID;
_prevItViewId = _itViewId;
_itViewId = viewID;
_graceUntil = PhotonNetwork.Time + grace;
Room currentRoom = PhotonNetwork.CurrentRoom;
Hashtable val = new Hashtable();
((Dictionary<object, object>)val).Add((object)"tag_itViewId", (object)viewID);
((Dictionary<object, object>)val).Add((object)"tag_graceUntil", (object)_graceUntil);
currentRoom.SetCustomProperties(val, (Hashtable)null, (WebFlags)null);
RefreshItEyes();
((MonoBehaviour)this).StartCoroutine(DeferRefreshItEyes(_itViewId));
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Current IT: {SafeName(who)} (ViewID {viewID}).");
}
}
[IteratorStateMachine(typeof(<ReassertEyeMark>d__76))]
private IEnumerator ReassertEyeMark(int itViewId)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <ReassertEyeMark>d__76(0)
{
<>4__this = this,
itViewId = itViewId
};
}
[IteratorStateMachine(typeof(<EquipBackpacksAfterDelay>d__77))]
private IEnumerator EquipBackpacksAfterDelay()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <EquipBackpacksAfterDelay>d__77(0)
{
<>4__this = this
};
}
private int GiveBackpacksNow()
{
if (!PhotonNetwork.IsMasterClient)
{
return 0;
}
int num = 0;
List<Character> allCharacters = Character.AllCharacters;
int count = allCharacters.Count;
for (int i = 0; i < count; i++)
{
Character c = allCharacters[i];
if (IsAlive(c) && EquipBackpackOnCharacter(c))
{
num++;
}
}
return num;
}
private bool EquipBackpackOnCharacter(Character c)
{
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Expected O, but got Unknown
//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
try
{
Player val = ((c != null) ? c.player : null);
if ((Object)(object)val == (Object)null || val.backpackSlot == null || val.backpackSlot.hasBackpack)
{
return false;
}
if (((ItemSlot)val.backpackSlot).data == null)
{
ItemInstanceData val2 = new ItemInstanceData(Guid.NewGuid());
ItemInstanceDataHandler.AddInstanceData(val2);
((ItemSlot)val.backpackSlot).data = val2;
}
BackpackData val3 = default(BackpackData);
if (!((ItemSlot)val.backpackSlot).data.TryGetDataEntry<BackpackData>((DataEntryKey)7, ref val3) || val3 == null)
{
((ItemSlot)val.backpackSlot).data.RegisterNewEntry<BackpackData>((DataEntryKey)7);
((ItemSlot)val.backpackSlot).data.TryGetDataEntry<BackpackData>((DataEntryKey)7, ref val3);
}
val.backpackSlot.hasBackpack = true;
InventorySyncData val4 = default(InventorySyncData);
((InventorySyncData)(ref val4))..ctor(val.itemSlots, val.backpackSlot, val.tempFullSlot);
((MonoBehaviourPun)val).photonView.RPC("SyncInventoryRPC", (RpcTarget)1, new object[2]
{
IBinarySerializable.ToManagedArray<InventorySyncData>(val4),
false
});
return true;
}
catch
{
return false;
}
}
private static bool AllHumansHaveBackpacks()
{
List<Character> allCharacters = Character.AllCharacters;
int count = allCharacters.Count;
for (int i = 0; i < count; i++)
{
Character val = allCharacters[i];
if (IsAlive(val) && !val.isBot)
{
Player player = val.player;
if (player == null || !(player.backpackSlot?.hasBackpack).GetValueOrDefault())
{
return false;
}
}
}
return true;
}
private void TryPatchReachingRpcs()
{
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Expected O, but got Unknown
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Expected O, but got Unknown
try
{
_harmony.Patch((MethodBase)AccessTools.Method(typeof(CharacterGrabbing), "RPCA_StartReaching", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(PEAKTagPlugin).GetMethod("ReachStartPostfix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
_harmony.Patch((MethodBase)AccessTools.Method(typeof(CharacterGrabbing), "RPCA_StopReaching", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(PEAKTagPlugin).GetMethod("ReachStopPostfix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("[Tag] Reach RPC patch failed: " + ex.Message));
}
}
private static void ReachStartPostfix(object __instance)
{
if (PhotonNetwork.IsMasterClient)
{
Character value = Traverse.Create(__instance).Field("character").GetValue<Character>();
if (!((Object)(object)value?.refs?.view == (Object)null) && Instance._itViewId == value.refs.view.ViewID)
{
Instance.StartItWatcher(value);
}
}
}
private static void ReachStopPostfix(object __instance)
{
if (PhotonNetwork.IsMasterClient)
{
Character value = Traverse.Create(__instance).Field("character").GetValue<Character>();
if (!((Object)(object)value?.refs?.view == (Object)null) && Instance._itWatcherViewId == value.refs.view.ViewID)
{
Instance.StopItWatcher();
}
}
}
private void StartItWatcher(Character it)
{
StopItWatcher();
if (!((Object)(object)it == (Object)null) && !((Object)(object)it.refs?.view == (Object)null))
{
_itWatcherViewId = it.refs.view.ViewID;
_itWatcherCo = ((MonoBehaviour)this).StartCoroutine(ItWatch(it));
}
}
private void StopItWatcher()
{
if (_itWatcherCo != null)
{
((MonoBehaviour)this).StopCoroutine(_itWatcherCo);
_itWatcherCo = null;
}
_itWatcherViewId = -1;
}
[IteratorStateMachine(typeof(<ItWatch>d__86))]
private IEnumerator ItWatch(Character it)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <ItWatch>d__86(0)
{
<>4__this = this,
it = it
};
}
private void HostPerformTag(Character it, Character target)
{
if (PhotonNetwork.IsMasterClient && !((Object)(object)target?.refs?.view == (Object)null) && !((Object)(object)it?.refs?.view == (Object)null) && !TaggingBlockedByCampfire(it, target))
{
SetItNow(target, 1.5);
RagdollWithGrayscale(target, 5f);
ApplyHeadStartBoostsTo(it);
int ownerActorNr = it.refs.view.OwnerActorNr;
int ownerActorNr2 = target.refs.view.OwnerActorNr;
_tagsMade[ownerActorNr] = (_tagsMade.TryGetValue(ownerActorNr, out var value) ? value : 0) + 1;
_tagsGot[ownerActorNr2] = (_tagsGot.TryGetValue(ownerActorNr2, out var value2) ? value2 : 0) + 1;
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] {SafeName(it)} tagged {SafeName(target)}. New IT (grace {1.5:0.00}s).");
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Stats updated - {SafeName(it)}: {_tagsMade[ownerActorNr]} tags made, {SafeName(target)}: {_tagsGot[ownerActorNr2]} tags got");
StopItWatcher();
}
}
private void TryPatchEyePersistence()
{
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Expected O, but got Unknown
try
{
_harmony.Patch((MethodBase)AccessTools.Method(typeof(CharacterCustomization), "OnRevive_RPC", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(PEAKTagPlugin).GetMethod("EyeReassertPostfix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("[Tag] Eye persistence patch failed: " + ex.Message));
}
}
private static void EyeReassertPostfix(object __instance)
{
try
{
Character val = null;
Component val2 = (Component)((__instance is Component) ? __instance : null);
if (val2 != null)
{
val = val2.GetComponent<Character>();
}
if ((Object)(object)val == (Object)null)
{
Traverse val3 = Traverse.Create(__instance);
val = val3.Field("_character").GetValue<Character>() ?? val3.Field("character").GetValue<Character>();
}
if (!((Object)(object)val?.refs?.view == (Object)null) && Instance._itViewId == val.refs.view.ViewID)
{
val.refs.view.RPC("CharacterPassedOut", (RpcTarget)3, Array.Empty<object>());
}
}
catch
{
}
}
private void StartGiftLoop()
{
if (_giftCo == null && (_giftEnabled == null || _giftEnabled.Value))
{
_giftCo = ((MonoBehaviour)this).StartCoroutine(GiftLoop());
}
}
private void StopGiftLoop()
{
if (_giftCo != null)
{
((MonoBehaviour)this).StopCoroutine(_giftCo);
_giftCo = null;
}
}
[IteratorStateMachine(typeof(<GiftLoop>d__94))]
private IEnumerator GiftLoop()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <GiftLoop>d__94(0)
{
<>4__this = this
};
}
private void TryGiveRandomGiftsToAll()
{
try
{
List<GiftDef> list = new List<GiftDef>(_giftPool.Length);
bool flag = _giftExcludeRescueHook?.Value ?? true;
for (int i = 0; i < _giftPool.Length; i++)
{
GiftDef item = _giftPool[i];
if (!flag || item.id != 100)
{
list.Add(item);
}
}
if (list.Count == 0)
{
return;
}
List<Character> allCharacters = Character.AllCharacters;
int count = allCharacters.Count;
for (int j = 0; j < count; j++)
{
Character val = allCharacters[j];
if (IsAlive(val) && !val.isBot && (Object)(object)val.refs?.items != (Object)null)
{
GiftDef gift = list[Random.Range(0, list.Count)];
TryGiveItemTo(val, gift);
}
}
}
catch
{
}
}
private void StartNonItDistanceWatch()
{
if (_nonItDistanceWatchCo == null)
{
_nonItDistanceWatchCo = ((MonoBehaviour)this).StartCoroutine(NonItDistanceWatchLoop());
}
}
private void StopNonItDistanceWatch()
{
if (_nonItDistanceWatchCo != null)
{
((MonoBehaviour)this).StopCoroutine(_nonItDistanceWatchCo);
_nonItDistanceWatchCo = null;
}
}
[IteratorStateMachine(typeof(<NonItDistanceWatchLoop>d__98))]
private IEnumerator NonItDistanceWatchLoop()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <NonItDistanceWatchLoop>d__98(0)
{
<>4__this = this
};
}
private void StartBoostGiftLoop()
{
if (_boostGiftCo == null)
{
_boostGiftCo = ((MonoBehaviour)this).StartCoroutine(BoostGiftLoop());
}
}
private void StopBoostGiftLoop()
{
if (_boostGiftCo != null)
{
((MonoBehaviour)this).StopCoroutine(_boostGiftCo);
_boostGiftCo = null;
}
if (_lolliChainCo != null)
{
((MonoBehaviour)this).StopCoroutine(_lolliChainCo);
_lolliChainCo = null;
}
if (_drinkChainCo != null)
{
((MonoBehaviour)this).StopCoroutine(_drinkChainCo);
_drinkChainCo = null;
}
}
[IteratorStateMachine(typeof(<BoostGiftLoop>d__101))]
private IEnumerator BoostGiftLoop()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <BoostGiftLoop>d__101(0)
{
<>4__this = this
};
}
private void ApplyHeadStartBoostsTo(Character who)
{
if (!((Object)(object)who == (Object)null))
{
if (_lolliChainCo != null)
{
((MonoBehaviour)this).StopCoroutine(_lolliChainCo);
}
if (_drinkChainCo != null)
{
((MonoBehaviour)this).StopCoroutine(_drinkChainCo);
}
int times = Mathf.Max(1, (_infiniteMultiplier != null) ? _infiniteMultiplier.Value : 3);
int times2 = Mathf.Max(1, (_boostMultiplier != null) ? _boostMultiplier.Value : 3);
_lolliChainCo = ((MonoBehaviour)this).StartCoroutine(ChainFeed(who, 44, times, "Lollipop (HeadStart)"));
_drinkChainCo = ((MonoBehaviour)this).StartCoroutine(ChainFeed(who, 27, times2, "Energy (HeadStart)"));
}
}
private void PickBoostSet(out bool doLolli, out bool doEnergy, out bool doBonus)
{
doLolli = (doEnergy = (doBonus = false));
float value = Random.value;
int num = ((value < 0.5f) ? 1 : ((value < 0.8f) ? 2 : 3));
List<int> list = new List<int> { 0, 1, 2 };
for (int i = 0; i < num; i++)
{
int index = Random.Range(0, list.Count);
int num2 = list[index];
list.RemoveAt(index);
switch (num2)
{
case 0:
doLolli = true;
break;
case 1:
doEnergy = true;
break;
default:
doBonus = true;
break;
}
}
}
[IteratorStateMachine(typeof(<ChainFeed>d__104))]
private IEnumerator ChainFeed(Character receiver, ushort itemID, int times, string label)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <ChainFeed>d__104(0)
{
<>4__this = this,
receiver = receiver,
itemID = itemID,
times = times,
label = label
};
}
private bool ForceFeedOnce(Character receiver, ushort itemID, string label, out Item spawnedItem)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
spawnedItem = null;
Item val = default(Item);
if (!ItemDatabase.TryGetItem(itemID, ref val) || (Object)(object)val == (Object)null)
{
return false;
}
Vector3 val2 = ((Component)receiver).transform.position + Vector3.up * 0.5f;
GameObject val3 = PhotonNetwork.InstantiateItemRoom(((Object)((Component)val).gameObject).name, val2, Quaternion.identity);
if (!Object.op_Implicit((Object)(object)val3))
{
return false;
}
Item component = val3.GetComponent<Item>();
if (!Object.op_Implicit((Object)(object)component) || !Object.op_Implicit((Object)(object)((MonoBehaviourPun)component).photonView))
{
return false;
}
receiver.FeedItem(component);
spawnedItem = component;
return true;
}
[IteratorStateMachine(typeof(<CleanupAfter>d__106))]
private IEnumerator CleanupAfter(Item item)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <CleanupAfter>d__106(0)
{
<>4__this = this,
item = item
};
}
private void GiveFullBonusStamina(Character target)
{
if (!((Object)(object)target?.refs?.view == (Object)null))
{
int num = ((PhotonNetwork.CurrentRoom == null) ? 1 : PhotonNetwork.CurrentRoom.PlayerCount);
target.refs.view.RPC("MoraleBoost", target.refs.view.Owner, new object[2] { 1f, num });
}
}
public void OnRoomPropertiesUpdate(Hashtable changed)
{
if (changed == null)
{
return;
}
if (((Dictionary<object, object>)(object)changed).ContainsKey((object)"tag_itViewId"))
{
_prevItViewId = _itViewId;
_itViewId = (int)changed[(object)"tag_itViewId"];
RefreshItEyes();
((MonoBehaviour)this).StartCoroutine(DeferRefreshItEyes(_itViewId));
if (_itWatcherViewId != _itViewId)
{
StopItWatcher();
}
}
if (!((Dictionary<object, object>)(object)changed).ContainsKey((object)"tag_graceUntil"))
{
return;
}
object obj = changed[(object)"tag_graceUntil"];
if (obj is double graceUntil)
{
_graceUntil = graceUntil;
}
else if (obj is float)
{
float num = (float)obj;
if (true)
{
_graceUntil = num;
}
}
}
public void OnMasterClientSwitched(Player newMasterClient)
{
if (PhotonNetwork.IsMasterClient)
{
StartGiftLoop();
StartNonItDistanceWatch();
StartBoostGiftLoop();
StartFreezeAfflictions();
RefreshItEyes();
}
else
{
StopGiftLoop();
StopNonItDistanceWatch();
StopBoostGiftLoop();
StopFreezeAfflictions();
ClearPlayerPowers();
}
}
void IInRoomCallbacks.OnPlayerEnteredRoom(Player newPlayer)
{
((MonoBehaviour)this).StartCoroutine(DeferRefreshItEyes(_itViewId));
}
void IInRoomCallbacks.OnPlayerLeftRoom(Player otherPlayer)
{
RefreshItEyes();
}
void IInRoomCallbacks.OnPlayerPropertiesUpdate(Player targetPlayer, Hashtable changedProps)
{
}
private static bool IsUnlitCampfireNear(Vector3 pos, float radius)
{
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Invalid comparison between Unknown and I4
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
RefreshCampfireCache();
float num = radius * radius;
for (int i = 0; i < _campfires.Count; i++)
{
Campfire val = _campfires[i];
if (!((Object)(object)val == (Object)null) && (int)val.state == 0)
{
Vector3 val2 = ((Component)val).transform.position - pos;
if (((Vector3)(ref val2)).sqrMagnitude <= num)
{
return true;
}
}
}
return false;
}
private static bool TaggingBlockedByCampfire(Character it, Character target)
{
//IL_00ba: 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_00bf: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: 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)
if (!PhotonNetwork.IsMasterClient)
{
return false;
}
try
{
if ((Object)(object)Instance != (Object)null && PhotonNetwork.Time < Instance._campfireItCooldownUntil)
{
int? obj;
if (it == null)
{
obj = null;
}
else
{
CharacterRefs refs = it.refs;
if (refs == null)
{
obj = null;
}
else
{
PhotonView view = refs.view;
obj = ((view != null) ? new int?(view.ViewID) : null);
}
}
int? num = obj;
int valueOrDefault = num.GetValueOrDefault(-1);
if (valueOrDefault != -1 && valueOrDefault == Instance._itViewId)
{
return true;
}
}
Vector3 pos = ((it != null) ? it.Center : Vector3.zero);
Vector3 pos2 = ((target != null) ? target.Center : Vector3.zero);
if (IsUnlitCampfireNear(pos, 15f))
{
return true;
}
if (IsUnlitCampfireNear(pos2, 15f))
{
return true;
}
}
catch
{
}
return false;
}
private static void RefreshCampfireCache()
{
float realtimeSinceStartup = Time.realtimeSinceStartup;
if ((Object)(object)Instance == (Object)null || realtimeSinceStartup < Instance._campfireCacheNextRebuildTime)
{
return;
}
Instance._campfireCacheNextRebuildTime = realtimeSinceStartup + 5f;
_campfires.Clear();
try
{
Campfire[] array = Object.FindObjectsOfType<Campfire>();
if (array != null && array.Length != 0)
{
_campfires.AddRange(array);
}
}
catch
{
}
}
private static bool IsAlive(Character c)
{
return (Object)(object)c != (Object)null && (Object)(object)c.data != (Object)null && !c.data.dead && c.data.fullyConscious;
}
private static Character FindCharacterByViewID(int viewId)
{
foreach (Character allCharacter in Character.AllCharacters)
{
if ((Object)(object)allCharacter?.refs?.view != (Object)null && allCharacter.refs.view.ViewID == viewId)
{
return allCharacter;
}
}
return null;
}
private void RagdollWithGrayscale(Character who, float seconds)
{
if ((Object)(object)who?.refs?.view == (Object)null)
{
return;
}
try
{
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Applying ragdoll + grayscale to {SafeName(who)} for {seconds} seconds");
who.refs.view.RPC("CharacterPassedOut", (RpcTarget)3, Array.Empty<object>());
who.refs.view.RPC("RPCA_Fall", (RpcTarget)0, new object[1] { seconds });
((MonoBehaviour)this).StartCoroutine(GrayscaleWindow(who, seconds));
((BaseUnityPlugin)this).Logger.LogInfo((object)("[Tag] Ragdoll + grayscale applied successfully to " + SafeName(who)));
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("[Tag] Failed to apply ragdoll + grayscale to " + SafeName(who) + ": " + ex.Message));
}
}
private static void TryRagdoll(Character who, float seconds)
{
try
{
if (who == null)
{
return;
}
CharacterRefs refs = who.refs;
if (refs != null)
{
PhotonView view = refs.view;
if (view != null)
{
view.RPC("RPCA_Fall", (RpcTarget)0, new object[1] { seconds });
}
}
}
catch
{
}
}
private static void TryMarkEyes(Character who, bool makePassedOut)
{
try
{
if (!((Object)(object)who?.refs?.view == (Object)null))
{
if (makePassedOut)
{
who.refs.view.RPC("CharacterPassedOut", (RpcTarget)3, Array.Empty<object>());
}
else
{
who.refs.view.RPC("OnRevive_RPC", (RpcTarget)3, Array.Empty<object>());
}
}
}
catch
{
}
}
[IteratorStateMachine(typeof(<GrayscaleWindow>d__121))]
private IEnumerator GrayscaleWindow(Character who, float seconds)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <GrayscaleWindow>d__121(0)
{
<>4__this = this,
who = who,
seconds = seconds
};
}
private static string SafeName(Character c)
{
object obj;
if (c == null)
{
obj = null;
}
else
{
CharacterRefs refs = c.refs;
if (refs == null)
{
obj = null;
}
else
{
PhotonView view = refs.view;
if (view == null)
{
obj = null;
}
else
{
Player owner = view.Owner;
obj = ((owner != null) ? owner.NickName : null);
}
}
}
if (obj == null)
{
obj = ((c != null) ? ((Object)c).name : null) ?? "Unknown";
}
return (string)obj;
}
private bool TryGiveItemTo(Character c, GiftDef gift)
{
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Expected O, but got Unknown
//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
try
{
Player player = c.player;
if ((Object)(object)player == (Object)null)
{
return false;
}
ItemSlot val = default(ItemSlot);
if (HasPocketSpace(player) && player.AddItem(gift.id, (ItemInstanceData)null, ref val) && val != null && val.itemSlotID <= 2)
{
return true;
}
if (TryGetBackpackFreeSlot(player, out var data, out var freeIndex))
{
Item val2 = default(Item);
if (!ItemDatabase.TryGetItem(gift.id, ref val2))
{
return false;
}
ItemInstanceData val3 = new ItemInstanceData(Guid.NewGuid());
ItemInstanceDataHandler.AddInstanceData(val3);
data.AddItem(val2, val3, freeIndex);
InventorySyncData val4 = default(InventorySyncData);
((InventorySyncData)(ref val4))..ctor(player.itemSlots, player.backpackSlot, player.tempFullSlot);
((MonoBehaviourPun)player).photonView.RPC("SyncInventoryRPC", (RpcTarget)1, new object[2]
{
IBinarySerializable.ToManagedArray<InventorySyncData>(val4),
false
});
return true;
}
return false;
}
catch
{
return false;
}
}
private static bool HasPocketSpace(Player p)
{
for (int i = 0; i < p.itemSlots.Length; i++)
{
if (p.itemSlots[i].IsEmpty())
{
return true;
}
}
return false;
}
private static bool TryGetBackpackFreeSlot(Player p, out BackpackData data, out byte freeIndex)
{
data = null;
freeIndex = byte.MaxValue;
if (p.backpackSlot == null || !p.backpackSlot.hasBackpack || ((ItemSlot)p.backpackSlot).data == null)
{
return false;
}
if (!((ItemSlot)p.backpackSlot).data.TryGetDataEntry<BackpackData>((DataEntryKey)7, ref data) || data == null)
{
if (PhotonNetwork.IsMasterClient)
{
((ItemSlot)p.backpackSlot).data.RegisterNewEntry<BackpackData>((DataEntryKey)7);
((ItemSlot)p.backpackSlot).data.TryGetDataEntry<BackpackData>((DataEntryKey)7, ref data);
}
if (data == null)
{
return false;
}
}
for (byte b = 0; b < data.itemSlots.Length; b++)
{
if (data.itemSlots[b].IsEmpty())
{
freeIndex = b;
return true;
}
}
return false;
}
private void TryPatchLuggageAwakeAutoOpen()
{
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Expected O, but got Unknown
try
{
_harmony.Patch((MethodBase)AccessTools.Method(typeof(Luggage), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(PEAKTagPlugin).GetMethod("LuggageAwake_AutoOpen_Postfix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("[Tag] Failed to patch Luggage.Awake: " + ex.Message));
}
}
private static void LuggageAwake_AutoOpen_Postfix(object __instance)
{
try
{
if (PhotonNetwork.IsMasterClient)
{
Component val = (Component)((__instance is Component) ? __instance : null);
PhotonView val2 = (Object.op_Implicit((Object)(object)val) ? val.GetComponent<PhotonView>() : null);
if ((Object)(object)val2 != (Object)null)
{
val2.RPC("OpenLuggageRPC", (RpcTarget)0, new object[1] { false });
}
}
}
catch
{
}
}
private void TryPatchLuggageSpawnRoutineBlock()
{
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Expected O, but got Unknown
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Expected O, but got Unknown
try
{
_harmony.Patch((MethodBase)AccessTools.Method(typeof(Luggage), "SpawnItemRoutine", (Type[])null, (Type[])null), new HarmonyMethod(typeof(PEAKTagPlugin).GetMethod("LuggageSpawnRoutine_Prefix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
_harmony.Patch((MethodBase)AccessTools.Method(typeof(Luggage), "SpawnItems", (Type[])null, (Type[])null), new HarmonyMethod(typeof(PEAKTagPlugin).GetMethod("LuggageSpawnRoutine_Prefix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("[Tag] Failed to patch Luggage spawn routines: " + ex.Message));
}
}
private static bool LuggageSpawnRoutine_Prefix()
{
return false;
}
private void TryPatchLuggageNoLoot()
{
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Expected O, but got Unknown
try
{
_harmony.Patch((MethodBase)AccessTools.Method(typeof(Luggage), "OpenLuggageRPC", new Type[1] { typeof(bool) }, (Type[])null), new HarmonyMethod(typeof(PEAKTagPlugin).GetMethod("LuggageOpen_NoLoot_Prefix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("[Tag] Failed to patch Luggage.OpenLuggageRPC: " + ex.Message));
}
}
private void TryPatchHostAfflictions()
{
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Expected O, but got Unknown
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Expected O, but got Unknown
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Expected O, but got Unknown
try
{
_harmony.Patch((MethodBase)AccessTools.Method(typeof(CharacterAfflictions), "AddAffliction", (Type[])null, (Type[])null), new HarmonyMethod(typeof(PEAKTagPlugin).GetMethod("AddAffliction_HostBlock_Prefix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
_harmony.Patch((MethodBase)AccessTools.Method(typeof(CharacterAfflictions), "AddStatus", (Type[])null, (Type[])null), new HarmonyMethod(typeof(PEAKTagPlugin).GetMethod("AddStatus_HostBlock_Prefix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
_harmony.Patch((MethodBase)AccessTools.Method(typeof(CharacterAfflictions), "SetStatus", (Type[])null, (Type[])null), new HarmonyMethod(typeof(PEAKTagPlugin).GetMethod("SetStatus_HostBlock_Prefix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
((BaseUnityPlugin)this).Logger.LogInfo((object)"[Tag] Host affliction blocking patches applied successfully.");
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("[Tag] Failed to patch host afflictions: " + ex.Message));
}
}
private static void LuggageOpen_NoLoot_Prefix(ref bool spawnItems)
{
spawnItems = false;
}
private static bool AddAffliction_HostBlock_Prefix(CharacterAfflictions __instance)
{
if (__instance != null)
{
Character character = __instance.character;
if (((character != null) ? new bool?(character.IsLocal) : null).GetValueOrDefault() && PhotonNetwork.IsMasterClient)
{
return false;
}
}
return true;
}
private static bool AddStatus_HostBlock_Prefix(CharacterAfflictions __instance)
{
if (__instance != null)
{
Character character = __instance.character;
if (((character != null) ? new bool?(character.IsLocal) : null).GetValueOrDefault() && PhotonNetwork.IsMasterClient)
{
return false;
}
}
return true;
}
private static bool SetStatus_HostBlock_Prefix(CharacterAfflictions __instance)
{
if (__instance != null)
{
Character character = __instance.character;
if (((character != null) ? new bool?(character.IsLocal) : null).GetValueOrDefault() && PhotonNetwork.IsMasterClient)
{
return false;
}
}
return true;
}
public void PreOpenAllLuggageNoLoot()
{
if (!PhotonNetwork.IsMasterClient)
{
return;
}
try
{
IEnumerable aLL_LUGGAGE = Luggage.ALL_LUGGAGE;
if (aLL_LUGGAGE == null)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)"[Tag] Luggage.ALL_LUGGAGE not available.");
return;
}
int num = 0;
foreach (object item in aLL_LUGGAGE)
{
Component val = (Component)((item is Component) ? item : null);
PhotonView val2 = ((val != null) ? val.GetComponent<PhotonView>() : null);
if (val2 != null)
{
val2.RPC("OpenLuggageRPC", (RpcTarget)0, new object[1] { false });
num++;
}
}
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Pre-opened {num} luggage (no loot).");
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("[Tag] Pre-open luggage sweep failed: " + ex.Message));
}
}
private void StartFreezeAfflictions()
{
if (_freezeAfflictionsCo == null)
{
_freezeAfflictionsCo = ((MonoBehaviour)this).StartCoroutine(FreezeAfflictionsLoop());
}
}
private void StopFreezeAfflictions()
{
if (_freezeAfflictionsCo != null)
{
((MonoBehaviour)this).StopCoroutine(_freezeAfflictionsCo);
_freezeAfflictionsCo = null;
}
}
private void ResetScoreboardStats()
{
_tagsMade.Clear();
_tagsGot.Clear();
((BaseUnityPlugin)this).Logger.LogInfo((object)"[Tag] Scoreboard stats reset for new run.");
}
private void Update()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
if (Input.GetKeyDown(_scoreboardKey.Value))
{
bool key = Input.GetKey(_scoreboardModifierKey.Value);
if (!_scoreboardRequireModifier.Value || key)
{
_scoreboardVisible = !_scoreboardVisible;
((BaseUnityPlugin)this).Logger.LogInfo((object)("[Tag] Scoreboard " + (_scoreboardVisible ? "shown" : "hidden") + "."));
}
}
if (PhotonNetwork.IsMasterClient)
{
CheckAndActivatePowers();
}
}
private void OnGUI()
{
if (_scoreboardVisible)
{
RenderScoreboard();
}
}
private void RenderScoreboard()
{
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Expected O, but got Unknown
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
//IL_0091: Expected O, but got Unknown
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00c3: Expected O, but got Unknown
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
//IL_0120: 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_0164: Unknown result type (might be due to invalid IL or missing references)
//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
//IL_01ea: Expected O, but got Unknown
//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
//IL_03b0: Unknown result type (might be due to invalid IL or missing references)
//IL_046a: Unknown result type (might be due to invalid IL or missing references)
if (_scoreboardBackgroundColor == null || _scoreboardTextColor == null || _scoreboardHeaderColor == null || _scoreboardFontSize == null || _scoreboardWidth == null || _scoreboardHeight == null || _scoreboardX == null || _scoreboardY == null)
{
return;
}
GUIStyle val = new GUIStyle();
val.fontSize = _scoreboardFontSize.Value + 4;
val.fontStyle = (FontStyle)1;
val.normal.textColor = Color.white;
val.alignment = (TextAnchor)4;
GUIStyle val2 = new GUIStyle();
val2.fontSize = _scoreboardFontSize.Value;
val2.normal.textColor = Color.white;
val2.alignment = (TextAnchor)0;
GUIStyle val3 = new GUIStyle(val2);
val3.normal.textColor = Color.yellow;
val3.fontStyle = (FontStyle)1;
Rect val4 = default(Rect);
((Rect)(ref val4))..ctor(_scoreboardX.Value, _scoreboardY.Value, _scoreboardWidth.Value, _scoreboardHeight.Value);
GUI.color = _scoreboardBackgroundColor.Value;
GUI.Box(val4, "");
GUI.color = Color.white;
Rect val5 = default(Rect);
((Rect)(ref val5))..ctor(_scoreboardX.Value, _scoreboardY.Value, _scoreboardWidth.Value, 40f);
GUI.Label(val5, "PEAK TAG SCOREBOARD", val);
Rect val6 = default(Rect);
((Rect)(ref val6))..ctor(_scoreboardX.Value + 10f, _scoreboardY.Value + 50f, _scoreboardWidth.Value - 20f, _scoreboardHeight.Value - 60f);
if (_tagsMade.Count == 0 && _tagsGot.Count == 0)
{
GUIStyle val7 = new GUIStyle(val2);
val7.alignment = (TextAnchor)4;
GUI.Label(val6, "No tags recorded yet.\nStart playing to see scores!", val7);
return;
}
HashSet<int> hashSet = new HashSet<int>();
foreach (KeyValuePair<int, int> item in _tagsMade)
{
hashSet.Add(item.Key);
}
foreach (KeyValuePair<int, int> item2 in _tagsGot)
{
hashSet.Add(item2.Key);
}
List<int> list = new List<int>(hashSet);
list.Sort(delegate(int a, int b)
{
_tagsMade.TryGetValue(a, out var value3);
_tagsGot.TryGetValue(a, out var value4);
_tagsMade.TryGetValue(b, out var value5);
_tagsGot.TryGetValue(b, out var value6);
int value7 = value3 - value4;
return (value5 - value6).CompareTo(value7);
});
float num = 0f;
float num2 = _scoreboardFontSize.Value + 8;
Rect val9 = default(Rect);
foreach (int item3 in list)
{
if (num + num2 > ((Rect)(ref val6)).height)
{
break;
}
Room currentRoom = PhotonNetwork.CurrentRoom;
Player val8 = ((currentRoom != null) ? currentRoom.GetPlayer(item3, false) : null);
string text = ((val8 != null) ? val8.NickName : null) ?? $"Player {item3}";
_tagsMade.TryGetValue(item3, out var value);
_tagsGot.TryGetValue(item3, out var value2);
int num3 = value - value2;
string text2 = $"{text}: {value} tags, {value2} tagged (Net: {num3:+0;-0})";
((Rect)(ref val9))..ctor(((Rect)(ref val6)).x, ((Rect)(ref val6)).y + num, ((Rect)(ref val6)).width, num2);
GUI.Label(val9, text2, val2);
num += num2;
}
if (_itViewId == -1)
{
return;
}
Character val10 = FindCharacterByViewID(_itViewId);
if ((Object)(object)val10 != (Object)null)
{
CharacterRefs refs = val10.refs;
object obj;
if (refs == null)
{
obj = null;
}
else
{
PhotonView view = refs.view;
obj = ((view != null) ? view.Owner : null);
}
Player val11 = (Player)obj;
if (val11 != null)
{
num += 15f;
Rect val12 = default(Rect);
((Rect)(ref val12))..ctor(((Rect)(ref val6)).x, ((Rect)(ref val6)).y + num, ((Rect)(ref val6)).width, num2);
GUI.Label(val12, "Current IT: " + val11.NickName, val3);
}
}
}
[IteratorStateMachine(typeof(<FreezeAfflictionsLoop>d__144))]
private IEnumerator FreezeAfflictionsLoop()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <FreezeAfflictionsLoop>d__144(0)
{
<>4__this = this
};
}
private void RefreshItEyes()
{
try
{
List<Character> allCharacters = Character.AllCharacters;
int count = allCharacters.Count;
for (int i = 0; i < count; i++)
{
Character val = allCharacters[i];
if (!((Object)(object)val?.refs?.view == (Object)null) && !((Object)(object)val.data == (Object)null))
{
if (val.refs.view.ViewID == _itViewId)
{
TryMarkEyes(val, makePassedOut: true);
}
else if (!val.data.passedOut && !val.data.fullyPassedOut && !val.data.dead)
{
TryMarkEyes(val, makePassedOut: false);
}
}
}
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("[Tag] RefreshItEyes exception: " + ex.Message));
}
}
[IteratorStateMachine(typeof(<DeferRefreshItEyes>d__146))]
private IEnumerator DeferRefreshItEyes(int guardItViewId)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <DeferRefreshItEyes>d__146(0)
{
<>4__this = this,
guardItViewId = guardItViewId
};
}
[IteratorStateMachine(typeof(<DeferRefreshItEyesAfterRagdoll>d__147))]
private IEnumerator DeferRefreshItEyesAfterRagdoll(Character itChar, float ragdollDuration)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <DeferRefreshItEyesAfterRagdoll>d__147(0)
{
<>4__this = this,
itChar = itChar,
ragdollDuration = ragdollDuration
};
}
private void TriggerPowerReadyAudioCue(Character itCharacter)
{
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)itCharacter == (Object)null) && !((Object)(object)itCharacter.refs?.view == (Object)null))
{
Vector3 center = itCharacter.Center;
itCharacter.refs.view.RPC("WarpPlayerRPC", (RpcTarget)0, new object[2] { center, true });
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Triggered power ready audio cue at IT position: {center}");
}
}
private bool IsPowerActivationTriggered(Character character)
{
if ((Object)(object)character?.data == (Object)null)
{
return false;
}
bool isCrouching = character.data.isCrouching;
bool isReaching = character.data.isReaching;
return isCrouching && isReaching;
}
private void ApplyPlayerStunEffect(Character itCharacter)
{
if ((Object)(object)itCharacter == (Object)null)
{
return;
}
((BaseUnityPlugin)this).Logger.LogInfo((object)("[Tag] Player Stun Power activated by " + SafeName(itCharacter)));
float num = _playerStunPowerTime?.Value ?? 5f;
List<Character> allCharacters = Character.AllCharacters;
int count = allCharacters.Count;
for (int i = 0; i < count; i++)
{
Character val = allCharacters[i];
if (IsAlive(val) && !val.isBot && (Object)(object)val != (Object)(object)itCharacter)
{
try
{
val.refs.view.RPC("RPCA_Fall", (RpcTarget)0, new object[1] { num });
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Applied {num}s ragdoll to {SafeName(val)}");
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("[Tag] Failed to ragdoll " + SafeName(val) + ": " + ex.Message));
}
}
}
}
private void ApplyPlayerWarpEffect(Character itCharacter)
{
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0158: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)itCharacter == (Object)null)
{
return;
}
((BaseUnityPlugin)this).Logger.LogInfo((object)("[Tag] Player Warp Power activated by " + SafeName(itCharacter)));
Character val = null;
float num = float.MaxValue;
List<Character> allCharacters = Character.AllCharacters;
int count = allCharacters.Count;
for (int i = 0; i < count; i++)
{
Character val2 = allCharacters[i];
if (IsAlive(val2) && !val2.isBot && (Object)(object)val2 != (Object)(object)itCharacter && val2.Center.y < num)
{
num = val2.Center.y;
val = val2;
}
}
if ((Object)(object)val == (Object)null)
{
return;
}
for (int j = 0; j < count; j++)
{
Character val3 = allCharacters[j];
if (IsAlive(val3) && !val3.isBot && (Object)(object)val3 != (Object)(object)itCharacter && (Object)(object)val3 != (Object)(object)val)
{
try
{
Vector3 val4 = val.Center + new Vector3(Random.Range(-2f, 2f), 0f, Random.Range(-2f, 2f));
val3.refs.view.RPC("WarpPlayerRPC", (RpcTarget)0, new object[2] { val4, true });
((BaseUnityPlugin)this).Logger.LogInfo((object)("[Tag] Warped " + SafeName(val3) + " to " + SafeName(val) + "'s area"));
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("[Tag] Failed to warp " + SafeName(val3) + ": " + ex.Message));
}
}
}
}
private void ApplyPlayerItemDropEffect(Character itCharacter)
{
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_0316: Unknown result type (might be due to invalid IL or missing references)
//IL_0235: Unknown result type (might be due to invalid IL or missing references)
//IL_023a: Unknown result type (might be due to invalid IL or missing references)
//IL_0244: Unknown result type (might be due to invalid IL or missing references)
//IL_0249: Unknown result type (might be due to invalid IL or missing references)
//IL_024e: Unknown result type (might be due to invalid IL or missing references)
//IL_025c: Unknown result type (might be due to invalid IL or missing references)
//IL_025e: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)itCharacter == (Object)null)
{
return;
}
((BaseUnityPlugin)this).Logger.LogInfo((object)("[Tag] Player Item Drop Power activated by " + SafeName(itCharacter)));
List<Character> allCharacters = Character.AllCharacters;
int count = allCharacters.Count;
BackpackData val4 = default(BackpackData);
InventorySyncData val7 = default(InventorySyncData);
for (int i = 0; i < count; i++)
{
Character val = allCharacters[i];
if (!IsAlive(val) || val.isBot || !((Object)(object)val != (Object)(object)itCharacter))
{
continue;
}
try
{
Player player = val.player;
if ((Object)(object)player == (Object)null)
{
continue;
}
for (int j = 0; j < 3; j++)
{
if (j >= player.itemSlots.Length || player.itemSlots[j].IsEmpty())
{
continue;
}
Item prefab = player.itemSlots[j].prefab;
if ((Object)(object)prefab != (Object)null)
{
Vector3 val2 = val.Center + Vector3.up * 0.5f;
GameObject val3 = PhotonNetwork.InstantiateItemRoom(((Object)((Component)prefab).gameObject).name, val2, Quaternion.identity);
if ((Object)(object)val3 != (Object)null)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Dropped {((Object)prefab).name} from {SafeName(val)}'s pocket {j}");
}
player.itemSlots[j].prefab = null;
player.itemSlots[j].data = null;
}
}
if (player.backpackSlot == null || !player.backpackSlot.hasBackpack || ((ItemSlot)player.backpackSlot).data == null || !((ItemSlot)player.backpackSlot).data.TryGetDataEntry<BackpackData>((DataEntryKey)7, ref val4) || val4 == null)
{
continue;
}
for (byte b = 0; b < val4.itemSlots.Length; b++)
{
if (!val4.itemSlots[b].IsEmpty())
{
Item prefab2 = val4.itemSlots[b].prefab;
if ((Object)(object)prefab2 != (Object)null)
{
Vector3 val5 = val.Center + Vector3.up * 0.5f;
GameObject val6 = PhotonNetwork.InstantiateItemRoom(((Object)((Component)prefab2).gameObject).name, val5, Quaternion.identity);
if ((Object)(object)val6 != (Object)null)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Dropped {((Object)prefab2).name} from {SafeName(val)}'s backpack slot {b}");
}
val4.itemSlots[b].prefab = null;
val4.itemSlots[b].data = null;
}
}
}
((InventorySyncData)(ref val7))..ctor(player.itemSlots, player.backpackSlot, player.tempFullSlot);
((MonoBehaviourPun)player).photonView.RPC("SyncInventoryRPC", (RpcTarget)1, new object[2]
{
IBinarySerializable.ToManagedArray<InventorySyncData>(val7),
false
});
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("[Tag] Failed to drop items from " + SafeName(val) + ": " + ex.Message));
}
}
}
private void GivePowerGiftToIt(Character itCharacter)
{
if ((Object)(object)itCharacter == (Object)null)
{
return;
}
float num = _playerStunPowerChance.Value + _playerWarpPowerChance.Value + _playerItemDropChance.Value;
float num2 = 1f - num;
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Power Gift Roll - Total Power: {num:P1}, No Power: {num2:P1}");
float num3 = Random.Range(0f, 1f);
if (num3 < num2)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Power Gift Roll Result: No Power (roll: {num3:F3} < {num2:F3})");
return;
}
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Power Gift Roll Result: Power Given (roll: {num3:F3} >= {num2:F3})");
float num4 = (num3 - num2) / num;
float num5 = 0f;
num5 += _playerStunPowerChance.Value / num;
if (num4 < num5)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Power Gift Result: Player Stun Power (roll: {num4:F3} < {num5:F3})");
AssignPowerToIt(itCharacter, PowerType.PlayerStun);
return;
}
num5 += _playerWarpPowerChance.Value / num;
if (num4 < num5)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Power Gift Result: Player Warp Power (roll: {num4:F3} < {num5:F3})");
AssignPowerToIt(itCharacter, PowerType.PlayerWarp);
}
else
{
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Power Gift Result: Player Item Drop Power (roll: {num4:F3} >= {num5:F3})");
AssignPowerToIt(itCharacter, PowerType.PlayerItemDrop);
}
}
private void AssignPowerToIt(Character itCharacter, PowerType powerType)
{
if (!((Object)(object)itCharacter?.refs?.view == (Object)null))
{
int ownerActorNr = itCharacter.refs.view.OwnerActorNr;
_playerPowers[ownerActorNr] = powerType;
_powerAvailable[ownerActorNr] = true;
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] Assigned {powerType} power to {SafeName(itCharacter)} (ActorID: {ownerActorNr})");
TriggerPowerReadyAudioCue(itCharacter);
}
}
private void CheckAndActivatePowers()
{
if (!PhotonNetwork.IsMasterClient)
{
return;
}
List<Character> allCharacters = Character.AllCharacters;
int count = allCharacters.Count;
for (int i = 0; i < count; i++)
{
Character val = allCharacters[i];
if (!IsAlive(val) || val.isBot)
{
continue;
}
PhotonView val2 = val.refs?.view;
if (val2 == null)
{
continue;
}
int ownerActorNr = val2.OwnerActorNr;
if (_powerAvailable.TryGetValue(ownerActorNr, out var value) && value && val2.ViewID == _itViewId && IsPowerActivationTriggered(val) && _playerPowers.TryGetValue(ownerActorNr, out var value2))
{
switch (value2)
{
case PowerType.PlayerStun:
ApplyPlayerStunEffect(val);
break;
case PowerType.PlayerWarp:
ApplyPlayerWarpEffect(val);
break;
case PowerType.PlayerItemDrop:
ApplyPlayerItemDropEffect(val);
break;
}
_powerAvailable[ownerActorNr] = false;
_playerPowers[ownerActorNr] = PowerType.None;
((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Tag] {SafeName(val)} used their {value2} power");
}
}
}
private void ClearPlayerPowers()
{
_playerPowers.Clear();
_powerAvailable.Clear();
((BaseUnityPlugin)this).Logger.LogInfo((object)"[Tag] Cleared all player powers");
}
}