Decompiled source of StreamToEarn PEAK TikTok Integration v1.0.0
S2E_PEAK/PeakMod.dll
Decompiled 3 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; using System.Threading; using System.Threading.Tasks; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Photon.Pun; using UnityEngine; using UnityEngine.SceneManagement; using Zorro.Core; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("PeakMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("PeakMod")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("1b91e668-275d-46ee-97d0-6582cb9ce3b6")] [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 PeakMod; internal static class BananaPeelController { private static ManualLogSource Logger = Logger.CreateLogSource("PEAKTikTok"); internal static void TriggerSlipEffect() { try { Character localCharacter = Character.localCharacter; if ((Object)(object)localCharacter == (Object)null) { Logger.LogError((object)"❌ Локальний персонаж не знайдений!"); return; } Logger.LogInfo((object)"\ud83c\udf4c Викликаємо посковзування для локального гравця"); SlipperyJellyfish val = FindOrCreateJellyfish(); if ((Object)(object)val != (Object)null) { val.Trigger(localCharacter.refs.view.ViewID); Logger.LogInfo((object)"✅ Ефект посковзування застосовано через медузу!"); } else { Logger.LogError((object)"❌ Не вдалося знайти або створити медузу!"); } } catch (Exception ex) { Logger.LogError((object)("❌ Помилка при виклику посковзування: " + ex.Message)); } } private static SlipperyJellyfish FindOrCreateJellyfish() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown try { SlipperyJellyfish[] array = Object.FindObjectsByType<SlipperyJellyfish>((FindObjectsSortMode)0); if (array.Length != 0) { Logger.LogInfo((object)"\ud83c\udf90 Знайдено існуючу медузу"); return array[0]; } GameObject val = new GameObject("TempSlipperyJellyfish"); SlipperyJellyfish result = val.AddComponent<SlipperyJellyfish>(); Logger.LogInfo((object)"\ud83c\udf90 Створено тимчасову медузу"); return result; } catch (Exception ex) { Logger.LogError((object)("❌ Помилка при пошуку/створенні медузи: " + ex.Message)); return null; } } internal static void SpawnBananaPeelNearPlayer() { try { Character localCharacter = Character.localCharacter; if ((Object)(object)localCharacter == (Object)null) { Logger.LogError((object)"❌ Локальний персонаж не знайдений!"); return; } Logger.LogInfo((object)"\ud83c\udf4c Створюємо віртуальну бананову шкурку біля гравця"); CoroutineRunner.StartDelayedSlipEffect(1f); } catch (Exception ex) { Logger.LogError((object)("❌ Помилка при створенні бананової шкурки: " + ex.Message)); } } } internal static class CoroutineRunner { [CompilerGenerated] private sealed class <DelayedSlipEffectCoroutine>d__2 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public float delay; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DelayedSlipEffectCoroutine>d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; Logger.LogInfo((object)$"⏳ Очікуємо {delay} секунд до посковзування..."); <>2__current = (object)new WaitForSeconds(delay); <>1__state = 1; return true; case 1: <>1__state = -1; Logger.LogInfo((object)"\ud83c\udf4c Час посковзування настав!"); BananaPeelController.TriggerSlipEffect(); 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 <RepeatedSlipEffectCoroutine>d__5 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public float interval; public int count; private int <i>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <RepeatedSlipEffectCoroutine>d__5(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; goto IL_0094; } <>1__state = -1; <i>5__1 = 0; goto IL_00a5; IL_0094: <i>5__1++; goto IL_00a5; IL_00a5: if (<i>5__1 < count) { Logger.LogInfo((object)$"\ud83c\udf4c Посковзування {<i>5__1 + 1} з {count}"); BananaPeelController.TriggerSlipEffect(); if (<i>5__1 < count - 1) { <>2__current = (object)new WaitForSeconds(interval); <>1__state = 1; return true; } goto IL_0094; } Logger.LogInfo((object)"✅ Серія посковзувань завершена!"); 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(); } } private static ManualLogSource Logger = Logger.CreateLogSource("PEAKTikTok"); internal static void StartDelayedSlipEffect(float delay) { if ((Object)(object)PEAKTikTok.Instance != (Object)null) { ((MonoBehaviour)PEAKTikTok.Instance).StartCoroutine(DelayedSlipEffectCoroutine(delay)); } else { Logger.LogError((object)"❌ PEAKTikTok.Instance is null, cannot start coroutine!"); } } [IteratorStateMachine(typeof(<DelayedSlipEffectCoroutine>d__2))] private static IEnumerator DelayedSlipEffectCoroutine(float delay) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DelayedSlipEffectCoroutine>d__2(0) { delay = delay }; } internal static void StartCustomCoroutine(IEnumerator coroutine) { if ((Object)(object)PEAKTikTok.Instance != (Object)null) { ((MonoBehaviour)PEAKTikTok.Instance).StartCoroutine(coroutine); } else { Logger.LogError((object)"❌ PEAKTikTok.Instance is null, cannot start coroutine!"); } } internal static void StartRepeatedSlipEffect(float interval, int count) { if ((Object)(object)PEAKTikTok.Instance != (Object)null) { ((MonoBehaviour)PEAKTikTok.Instance).StartCoroutine(RepeatedSlipEffectCoroutine(interval, count)); } else { Logger.LogError((object)"❌ PEAKTikTok.Instance is null, cannot start coroutine!"); } } [IteratorStateMachine(typeof(<RepeatedSlipEffectCoroutine>d__5))] private static IEnumerator RepeatedSlipEffectCoroutine(float interval, int count) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <RepeatedSlipEffectCoroutine>d__5(0) { interval = interval, count = count }; } } internal class CustomItemPickup : MonoBehaviour { [CompilerGenerated] private sealed class <CooldownCoroutine>d__13 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public CustomItemPickup <>4__this; private bool <originalNearby>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CooldownCoroutine>d__13(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <originalNearby>5__1 = <>4__this.playerNearby; <>4__this.playerNearby = false; <>2__current = (object)new WaitForSeconds(0.5f); <>1__state = 1; return true; case 1: <>1__state = -1; if (!<>4__this.isPickedUp) { <>4__this.playerNearby = <originalNearby>5__1; } 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(); } } private static ManualLogSource Logger = Logger.CreateLogSource("CustomPickup"); private ushort itemID; private string itemName; public bool isPickedUp = false; private bool playerNearby = false; internal void Initialize(ushort id, string name) { itemID = id; itemName = name; Logger.LogInfo((object)$"\ud83d\udd27 CustomPickup initialized: {itemName} (ID: {itemID})"); } private void Start() { SphereCollider val = ((Component)this).gameObject.AddComponent<SphereCollider>(); ((Collider)val).isTrigger = true; val.radius = 1.5f; Logger.LogInfo((object)("\ud83c\udfaf Added trigger to real item: " + itemName)); } private void Update() { if (isPickedUp) { return; } CheckPlayerDistance(); if (playerNearby && (Input.GetKeyDown((KeyCode)101) || Input.GetKeyDown((KeyCode)102))) { if (IsClosestItem()) { Logger.LogInfo((object)("\ud83d\udd18 Pickup key pressed for closest real item: " + itemName)); TryPickupRealItem(); } else { Logger.LogInfo((object)("\ud83d\udeab Ignoring pickup - " + itemName + " is not closest")); } } } private bool IsClosestItem() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) try { Character localCharacter = Character.localCharacter; if ((Object)(object)localCharacter == (Object)null) { return false; } Vector3 position = ((Component)localCharacter).transform.position; float num = Vector3.Distance(((Component)this).transform.position, position); CustomItemPickup[] array = Object.FindObjectsOfType<CustomItemPickup>(); CustomItemPickup[] array2 = array; foreach (CustomItemPickup customItemPickup in array2) { if (!((Object)(object)customItemPickup == (Object)(object)this) && !customItemPickup.isPickedUp) { float num2 = Vector3.Distance(((Component)customItemPickup).transform.position, position); if (num2 < num && num2 <= 2f) { return false; } } } return true; } catch (Exception ex) { Logger.LogError((object)("❌ Error checking closest item: " + ex.Message)); return false; } } private void CheckPlayerDistance() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) try { Character localCharacter = Character.localCharacter; if (!((Object)(object)localCharacter == (Object)null)) { float num = Vector3.Distance(((Component)this).transform.position, ((Component)localCharacter).transform.position); bool flag = playerNearby; playerNearby = num <= 2f; if (playerNearby && !flag) { Logger.LogInfo((object)$"\ud83d\udc64 Player can pickup real item: {itemName} (distance: {num:F2}m)"); } } } catch (Exception ex) { Logger.LogError((object)("❌ Error checking distance for real item: " + ex.Message)); } } private void OnTriggerEnter(Collider other) { Logger.LogInfo((object)("\ud83c\udfaf Real item trigger: " + ((Object)other).name)); } private void TryPickupRealItem() { try { if (isPickedUp) { return; } Character localCharacter = Character.localCharacter; if ((Object)(object)((localCharacter != null) ? localCharacter.player : null) == (Object)null) { Logger.LogError((object)("❌ No character for real pickup: " + itemName)); return; } Logger.LogInfo((object)$"\ud83e\udd0f Attempting real pickup: {itemName} (ID: {itemID})"); ItemSlot val = default(ItemSlot); if (localCharacter.player.AddItem((ushort)(byte)itemID, (ItemInstanceData)null, ref val)) { Logger.LogInfo((object)$"✅ Real pickup successful: {itemName} -> slot {val.itemSlotID}"); AudioSource component = ((Component)this).GetComponent<AudioSource>(); if ((Object)(object)((component != null) ? component.clip : null) != (Object)null) { component.Play(); } isPickedUp = true; SetGlobalPickupCooldown(); Object.Destroy((Object)(object)((Component)this).gameObject, 0.1f); } else { Logger.LogWarning((object)("⚠\ufe0f Real pickup failed: " + itemName + " (inventory full)")); } } catch (Exception ex) { Logger.LogError((object)("❌ Real pickup error for " + itemName + ": " + ex.Message)); } } private void SetGlobalPickupCooldown() { try { CustomItemPickup[] array = Object.FindObjectsOfType<CustomItemPickup>(); CustomItemPickup[] array2 = array; foreach (CustomItemPickup customItemPickup in array2) { if ((Object)(object)customItemPickup != (Object)null && !customItemPickup.isPickedUp) { ((MonoBehaviour)customItemPickup).StartCoroutine(customItemPickup.CooldownCoroutine()); } } } catch (Exception ex) { Logger.LogError((object)("❌ Error setting global cooldown: " + ex.Message)); } } [IteratorStateMachine(typeof(<CooldownCoroutine>d__13))] private IEnumerator CooldownCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CooldownCoroutine>d__13(0) { <>4__this = this }; } } [HarmonyPatch(typeof(Character), "Die")] internal static class DeathPositionPatch { private static ManualLogSource Logger = Logger.CreateLogSource("DeathPatch"); internal static void Prefix(Character __instance) { //IL_0017: 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) if ((Object)(object)__instance == (Object)(object)Character.localCharacter) { PlayerReviveController.SaveDeathPosition(((Component)__instance).transform.position); Logger.LogInfo((object)$"\ud83d\udc80 Saved death position via patch: {((Component)__instance).transform.position}"); } } } [BepInPlugin("com.streamtoearn.peaktiktok", "PEAKTikTok", "1.0.0")] internal class PEAKTikTokPlugin : BaseUnityPlugin { private static ManualLogSource Logger; private static Harmony harmony; private void Awake() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)"\ud83d\ude80 PEAKTikTok Plugin Awake called!"); try { harmony = new Harmony("com.streamtoearn.peaktiktok"); harmony.PatchAll(); Logger.LogInfo((object)"\ud83d\udd27 Harmony patches applied!"); GameObject val = new GameObject("ModLauncher"); val.AddComponent<ModLauncher>(); Object.DontDestroyOnLoad((Object)(object)val); Logger.LogInfo((object)"✅ Mod launcher initialized!"); } catch (Exception ex) { Logger.LogError((object)("❌ Failed to initialize: " + ex.Message)); } } private void OnDestroy() { Harmony obj = harmony; if (obj != null) { obj.UnpatchAll("com.streamtoearn.peaktiktok"); } } } internal class EventResult { internal bool Success { get; set; } internal string Message { get; set; } internal Dictionary<string, object> Data { get; set; } internal EventResult() { Data = new Dictionary<string, object>(); } internal static EventResult SuccessResult(string message = "", Dictionary<string, object> data = null) { return new EventResult { Success = true, Message = (message ?? ""), Data = (data ?? new Dictionary<string, object>()) }; } internal static EventResult FailureResult(string message = "", Dictionary<string, object> data = null) { return new EventResult { Success = false, Message = (message ?? ""), Data = (data ?? new Dictionary<string, object>()) }; } internal static EventResult FromException(Exception ex, string context = "") { string message = (string.IsNullOrEmpty(context) ? ("Error: " + ex.Message) : ("Error in " + context + ": " + ex.Message)); return FailureResult(message, new Dictionary<string, object> { ["exception"] = ex.GetType().Name, ["stackTrace"] = ex.StackTrace }); } public override string ToString() { return $"EventResult[Success={Success}, Message='{Message}', DataCount={Data?.Count ?? 0}]"; } } internal class EventResponse { public bool Success { get; set; } public string Message { get; set; } public Dictionary<string, object> Data { get; set; } internal EventResponse() { Data = new Dictionary<string, object>(); } internal static EventResponse FromResult(EventResult result) { return new EventResponse { Success = result.Success, Message = result.Message, Data = result.Data }; } } internal class HttpServer : MonoBehaviour { private HttpListener listener; private bool isRunning; private CancellationTokenSource cancellationTokenSource; private static readonly string[] AllowedOrigins = new string[2] { "https://app.streamtoearn.io", "https://alt.streamtoearn.io" }; private static ManualLogSource Logger = Logger.CreateLogSource("HttpServer"); internal static HttpServer Instance { get; private set; } private void Start() { Instance = this; cancellationTokenSource = new CancellationTokenSource(); Logger.LogInfo((object)"\ud83d\ude80 Starting HTTP Server..."); StartServer(); } private void StartServer() { try { listener = new HttpListener(); listener.Prefixes.Add("http://127.0.0.1:55001/"); listener.Prefixes.Add("http://localhost:55001/"); listener.Start(); isRunning = true; Logger.LogInfo((object)"\ud83d\udce1 HTTP Server started on http://localhost:55001/"); Task.Run(async delegate { await ProcessRequestsAsync(cancellationTokenSource.Token); }).Forget(); } catch (Exception ex) { Logger.LogError((object)("❌ Failed to start HTTP server: " + ex.Message)); } } private async Task ProcessRequestsAsync(CancellationToken cancellationToken) { while (isRunning && !cancellationToken.IsCancellationRequested) { try { Task<HttpListenerContext> contextTask = listener.GetContextAsync(); HttpListenerContext context = await contextTask; Task.Run(delegate { HandleRequestSafe(context); }).Forget(); } catch (ObjectDisposedException) { break; } catch (HttpListenerException ex2) { if (ex2.ErrorCode != 995) { Logger.LogError((object)("❌ HTTP Listener error: " + ex2.Message)); } break; } catch (Exception ex) { Logger.LogError((object)("❌ Unexpected error in HTTP server: " + ex.Message)); await Task.Delay(1000, cancellationToken); } } } private void HandleRequestSafe(HttpListenerContext context) { try { HandleRequest(context); } catch (Exception ex) { Logger.LogError((object)("❌ Error handling HTTP request: " + ex.Message)); try { context.Response.StatusCode = 500; context.Response.Close(); } catch { } } } private void HandleRequest(HttpListenerContext context) { HttpListenerRequest request = context.Request; HttpListenerResponse response = context.Response; try { Logger.LogInfo((object)$"\ud83d\udce5 {request.HttpMethod} {request.Url?.AbsolutePath} from {request.RemoteEndPoint}"); string origin = request.Headers["Origin"]; bool flag = ValidateOrigin(origin); SetCorsHeaders(response, origin, flag); if (!flag) { Logger.LogWarning((object)"\ud83d\udeab Request blocked - unauthorized access attempt"); response.StatusCode = 403; response.Close(); return; } if (request.HttpMethod == "OPTIONS") { response.StatusCode = 200; response.Close(); return; } string requestBody = ""; if (request.HasEntityBody) { using StreamReader streamReader = new StreamReader(request.InputStream, request.ContentEncoding ?? Encoding.UTF8); requestBody = streamReader.ReadToEnd(); } Logger.LogInfo((object)("\ud83d\udce6 Request body: " + requestBody)); string path = request.Url?.AbsolutePath ?? "/"; MainThreadDispatcher.Enqueue(delegate { RequestHandler.HandleRequest(path, requestBody); }); SendResponse(response, "OK"); } catch (Exception ex) { Logger.LogError((object)("❌ Request handling error: " + ex.Message)); SendResponse(response, "Internal Server Error", 500); } } private bool ValidateOrigin(string origin) { if (string.IsNullOrEmpty(origin)) { Logger.LogWarning((object)"⚠\ufe0f Blocked request without Origin header"); return false; } string[] allowedOrigins = AllowedOrigins; foreach (string value in allowedOrigins) { if (origin.StartsWith(value, StringComparison.OrdinalIgnoreCase)) { Logger.LogInfo((object)("✅ Allowed request from: " + origin)); return true; } } Logger.LogWarning((object)("⚠\ufe0f Blocked request from unauthorized origin: " + origin)); return false; } private void SetCorsHeaders(HttpListenerResponse response, string origin, bool isAllowed) { if (isAllowed) { response.Headers.Add("Access-Control-Allow-Origin", origin ?? "*"); } response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Authorization, Superdupertoken"); response.Headers.Add("Access-Control-Max-Age", "3600"); } private void SendResponse(HttpListenerResponse response, string content, int statusCode = 200) { try { response.StatusCode = statusCode; response.ContentType = "text/plain; charset=utf-8"; byte[] bytes = Encoding.UTF8.GetBytes(content); response.ContentLength64 = bytes.Length; using (Stream stream = response.OutputStream) { stream.Write(bytes, 0, bytes.Length); } response.Close(); } catch (Exception ex) { Logger.LogError((object)("❌ Error sending response: " + ex.Message)); } } internal void StopServer() { try { isRunning = false; cancellationTokenSource?.Cancel(); if (listener != null && listener.IsListening) { listener.Stop(); listener.Close(); } cancellationTokenSource?.Dispose(); Logger.LogInfo((object)"\ud83d\udcf4 HTTP Server stopped"); } catch (Exception ex) { Logger.LogError((object)("❌ Error stopping HTTP server: " + ex.Message)); } } private void OnDestroy() { StopServer(); } private void OnApplicationQuit() { StopServer(); } } [HarmonyPatch(typeof(Item), "Interact")] internal static class ItemInteractionPatch { private static ManualLogSource Logger = Logger.CreateLogSource("ItemInteractionPatch"); internal static bool Prefix(Item __instance, Character interactor) { try { if (IsOurSpawnedItem(__instance)) { Logger.LogInfo((object)("\ud83c\udfaf Intercepting interaction with our item: " + ((Object)__instance).name)); if ((Object)(object)interactor == (Object)(object)Character.localCharacter) { Logger.LogInfo((object)$"\ud83d\udc64 Local player interacting with: {((Object)__instance).name} (ID: {__instance.itemID})"); if (!HasInventorySpace(interactor)) { Logger.LogWarning((object)("⚠\ufe0f Inventory full, cannot pickup " + ((Object)__instance).name)); return true; } if (AddItemToInventory(__instance, interactor)) { Logger.LogInfo((object)("✅ Successfully added " + ((Object)__instance).name + " to inventory")); Object.Destroy((Object)(object)((Component)__instance).gameObject); return false; } } } return true; } catch (Exception ex) { Logger.LogError((object)("❌ ItemInteractionPatch error: " + ex.Message)); return true; } } private static bool HasInventorySpace(Character character) { try { if ((Object)(object)((character != null) ? character.player : null) == (Object)null) { return false; } for (byte b = 0; b <= 2; b++) { ItemSlot itemSlot = character.player.GetItemSlot(b); if (itemSlot != null && itemSlot.IsEmpty()) { return true; } } ItemSlot itemSlot2 = character.player.GetItemSlot((byte)3); if (itemSlot2 != null && !itemSlot2.IsEmpty()) { for (byte b2 = 4; b2 <= 7; b2++) { try { ItemSlot itemSlot3 = character.player.GetItemSlot(b2); if (itemSlot3 != null && itemSlot3.IsEmpty()) { return true; } } catch { } } } return false; } catch (Exception ex) { Logger.LogError((object)("❌ Error checking inventory space: " + ex.Message)); return false; } } private static bool IsOurSpawnedItem(Item item) { return ((Object)item).name.Contains("(Clone)") && (Object)(object)((Component)item).GetComponent<SpawnedItemMarker>() != (Object)null; } private static bool AddItemToInventory(Item item, Character character) { try { if ((Object)(object)((character != null) ? character.player : null) == (Object)null) { return false; } return TryAddItemToSafeSlots(character.player, item.itemID); } catch (Exception ex) { Logger.LogError((object)("❌ Error adding item to inventory: " + ex.Message)); return false; } } private static bool TryAddItemToSafeSlots(Player player, ushort itemID) { try { ItemSlot val = default(ItemSlot); for (byte b = 0; b <= 2; b++) { ItemSlot itemSlot = player.GetItemSlot(b); if (itemSlot != null && itemSlot.IsEmpty() && player.AddItem((ushort)(byte)itemID, (ItemInstanceData)null, ref val) && val.itemSlotID == b) { Logger.LogInfo((object)$"✅ Added to regular slot {b}"); PlayPickupSound(); return true; } } ItemSlot itemSlot2 = player.GetItemSlot((byte)3); if (itemSlot2 != null && !itemSlot2.IsEmpty()) { ItemSlot val2 = default(ItemSlot); for (byte b2 = 4; b2 <= 7; b2++) { try { ItemSlot itemSlot3 = player.GetItemSlot(b2); if (itemSlot3 != null && itemSlot3.IsEmpty() && player.AddItem((ushort)(byte)itemID, (ItemInstanceData)null, ref val2) && val2.itemSlotID == b2) { Logger.LogInfo((object)$"✅ Added to backpack slot {b2}"); PlayPickupSound(); return true; } } catch { } } } return false; } catch (Exception ex) { Logger.LogError((object)("❌ Error in TryAddItemToSafeSlots: " + ex.Message)); return false; } } private static void PlayPickupSound() { try { Logger.LogInfo((object)"\ud83d\udd0a Played pickup sound"); } catch (Exception ex) { Logger.LogWarning((object)("⚠\ufe0f Could not play pickup sound: " + ex.Message)); } } } [HarmonyPatch(typeof(Item), "Update")] internal static class ItemUpdatePatch { private static ManualLogSource Logger = Logger.CreateLogSource("ItemUpdatePatch"); internal static bool Prefix(Item __instance) { try { if (IsOurSpawnedItem(__instance)) { HandleOurItemUpdate(__instance); return false; } if ((Object)(object)((MonoBehaviourPun)__instance).photonView == (Object)null) { Logger.LogWarning((object)("⚠\ufe0f Item " + ((Object)__instance).name + " has null photonView, skipping update")); return false; } return true; } catch (Exception ex) { Logger.LogError((object)("❌ ItemUpdatePatch error: " + ex.Message)); return false; } } private static bool IsOurSpawnedItem(Item item) { return (Object)(object)((Component)item).GetComponent<SpawnedItemMarker>() != (Object)null; } private static void HandleOurItemUpdate(Item item) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) try { if ((Object)(object)item == (Object)null || !((Behaviour)item).enabled) { return; } if (((Component)item).transform.position.y < -1000f) { Logger.LogInfo((object)("\ud83d\uddd1\ufe0f Destroying item " + ((Object)item).name + " - fell below world")); Object.Destroy((Object)(object)((Component)item).gameObject); return; } SpawnedItemMarker component = ((Component)item).GetComponent<SpawnedItemMarker>(); if (!((Object)(object)component != (Object)null) || !(Time.time - component.spawnTime > 30f)) { return; } Rigidbody component2 = ((Component)item).GetComponent<Rigidbody>(); if ((Object)(object)component2 != (Object)null) { Vector3 velocity = component2.velocity; if (!(((Vector3)(ref velocity)).magnitude < 0.1f)) { } } } catch (Exception ex) { Logger.LogError((object)("❌ Error in our item update: " + ex.Message)); } } } internal class SpawnedItemMarker : MonoBehaviour { private static ManualLogSource Logger = Logger.CreateLogSource("SpawnedItemMarker"); internal string spawnedBy = "PEAKTikTok"; internal float spawnTime; internal string itemName; private void Start() { spawnTime = Time.time; itemName = ((Object)((Component)this).gameObject).name; Logger.LogInfo((object)("\ud83c\udff7\ufe0f Spawned item marker created for: " + itemName)); } private void Update() { try { Item component = ((Component)this).GetComponent<Item>(); if ((Object)(object)component == (Object)null) { Logger.LogWarning((object)"⚠\ufe0f Item component missing on spawned item, destroying..."); Object.Destroy((Object)(object)((Component)this).gameObject); return; } if (Time.time - spawnTime > 1f && !((Behaviour)component).enabled) { Logger.LogWarning((object)"⚠\ufe0f Item component disabled, re-enabling..."); ((Behaviour)component).enabled = true; } if (Time.time - spawnTime > 300f) { Logger.LogInfo((object)("\ud83d\uddd1\ufe0f Auto-cleaning old spawned item: " + itemName)); Object.Destroy((Object)(object)((Component)this).gameObject); } } catch (Exception ex) { Logger.LogError((object)("❌ Error in SpawnedItemMarker update: " + ex.Message)); } } } internal static class ItemSpawner { private static ManualLogSource Logger = Logger.CreateLogSource("PEAKTikTok"); private static Dictionary<string, float> itemCooldowns = new Dictionary<string, float>(); private const float ITEM_COOLDOWN = 0.8f; private static readonly Dictionary<string, string> ItemMap = new Dictionary<string, string> { { "airplanefood", "Airplane Food" }, { "granolabar", "Granola Bar" }, { "energydrink", "Energy Drink" }, { "marshmallow", "Marshmallow" }, { "trailmix", "TrailMix" }, { "scoutcookies", "ScoutCookies" }, { "lollipop", "Lollipop" }, { "coconut", "Item_Coconut" }, { "coconuthalf", "Item_Coconut_half" }, { "honeycomb", "Item_Honeycomb" }, { "egg", "Egg" }, { "appleberrygreen", "Apple Berry Green" }, { "appleberryred", "Apple Berry Red" }, { "appleberryyellow", "Apple Berry Yellow" }, { "berrynanablue", "Berrynana Blue" }, { "berrynanabrown", "Berrynana Brown" }, { "berrynanapink", "Berrynana Pink" }, { "berrynanayellow", "Berrynana Yellow" }, { "clusterberryblack", "Clusterberry Black" }, { "clusterberryred", "Clusterberry Red" }, { "clusterberryyellow", "Clusterberry Yellow" }, { "kingberrygreen", "Kingberry Green" }, { "kingberrypurple", "Kingberry Purple" }, { "kingberryyellow", "Kingberry Yellow" }, { "napberry", "Napberry" }, { "pepperberry", "Pepper Berry" }, { "winterberryorange", "Winterberry Orange" }, { "winterberryyellow", "Winterberry Yellow" }, { "mushroomchubby", "Mushroom Chubby" }, { "mushroomcluster", "Mushroom Cluster" }, { "mushroomclusterpoison", "Mushroom Cluster Poison" }, { "mushroomglow", "Mushroom Glow" }, { "mushroomlace", "Mushroom Lace" }, { "mushroomlacepoison", "Mushroom Lace Poison" }, { "mushroomnormie", "Mushroom Normie" }, { "mushroomnormiepoison", "Mushroom Normie Poison" }, { "shelfshroom", "ShelfShroom" }, { "bounce", "BounceShroom" }, { "healingpuff", "HealingPuffShroom" }, { "antidote", "Antidote" }, { "bandage", "Bandages" }, { "firstaidkit", "FirstAidKit" }, { "cureall", "Cure-All" }, { "medicinalroot", "MedicinalRoot" }, { "heatpack", "Heat Pack" }, { "healingdart", "HealingDart Variant" }, { "backpack", "Backpack" }, { "binoculars", "Binoculars" }, { "compass", "Compass" }, { "piratecompass", "Pirate Compass" }, { "warpcompass", "Warp Compass" }, { "lantern", "Lantern" }, { "lanternfaerie", "Lantern_Faerie" }, { "flare", "Flare" }, { "rope", "RopeSpool" }, { "antirope", "Anti-Rope Spool" }, { "ropecannon", "RopeShooter" }, { "ropecannonanti", "RopeShooterAnti" }, { "chaincannon", "ChainShooter" }, { "climbingspike", "ClimbingSpike" }, { "firewood", "FireWood" }, { "stove", "PortableStovetopItem" }, { "bugle", "Bugle" }, { "buglemagic", "Bugle_Magic" }, { "buglescoutmaster", "Bugle_Scoutmaster Variant" }, { "beehive", "Beehive" }, { "book", "Guidebook" }, { "guidepage", "GuidebookPage" }, { "flagseagull", "Flag_Plantable_Seagull" }, { "flagturtle", "Flag_Plantable_Turtle" }, { "shellbig", "Shell Big" }, { "stone", "Stone" }, { "nestegg", "NestEgg" }, { "pandorasbox", "PandorasBox" }, { "passport", "Passport" }, { "toy", "BingBong" }, { "toyscout", "Toy" }, { "scouteffigy", "ScoutEffigy" }, { "cursedskull", "Cursed Skull" }, { "magicbean", "MagicBean" }, { "bugfix", "Bugfix" } }; private static readonly Dictionary<byte, string> IDToKeyMap = new Dictionary<byte, string> { { 36, "coconut" } }; internal static string GetItemKeyByID(byte itemID) { if (IDToKeyMap.TryGetValue(itemID, out var value)) { return value; } try { if (SingletonAsset<ItemDatabase>.Instance?.itemLookup != null) { foreach (KeyValuePair<ushort, Item> item in SingletonAsset<ItemDatabase>.Instance.itemLookup) { if (item.Value.itemID != itemID) { continue; } foreach (KeyValuePair<string, string> item2 in ItemMap) { if (item2.Value == ((Object)item.Value).name) { return item2.Key; } } } } } catch (Exception ex) { Logger.LogError((object)$"❌ Error finding item key for ID {itemID}: {ex.Message}"); } return "coconut"; } private static Item FindItemInDatabase(string itemName) { try { if (SingletonAsset<ItemDatabase>.Instance?.itemLookup == null) { Logger.LogError((object)"❌ ItemDatabase недоступна!"); return null; } foreach (KeyValuePair<ushort, Item> item in SingletonAsset<ItemDatabase>.Instance.itemLookup) { Item value = item.Value; if ((Object)(object)value != (Object)null && ((Object)value).name == itemName) { Logger.LogInfo((object)$"✅ Знайдено: {((Object)value).name} (ID: {value.itemID})"); return value; } } Logger.LogError((object)("❌ Предмет '" + itemName + "' не знайдено!")); return null; } catch (Exception ex) { Logger.LogError((object)("❌ Помилка пошуку: " + ex.Message)); return null; } } private static Vector3 GetCurrentPlayerPosition() { //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) try { Character localCharacter = Character.localCharacter; if ((Object)(object)localCharacter == (Object)null) { Logger.LogError((object)"❌ Local character is null!"); return Vector3.zero; } CharacterRefs refs = localCharacter.refs; object obj; if (refs == null) { obj = null; } else { Bodypart hip = refs.hip; obj = ((hip != null) ? ((Component)hip).transform : null); } if ((Object)obj != (Object)null) { Vector3 position = ((Component)localCharacter.refs.hip).transform.position; Logger.LogInfo((object)$"\ud83e\uddb4 Using LIVE hip position: {position}"); return position; } Vector3 position2 = ((Component)localCharacter).transform.position; Logger.LogWarning((object)$"⚠\ufe0f Using fallback transform position: {position2}"); return position2; } catch (Exception ex) { Logger.LogError((object)("❌ Error getting player position: " + ex.Message)); return Vector3.zero; } } private static Vector3 CalculateSpawnPositionFromPlayer(Vector3 playerPosition, float radius, int itemIndex, int totalItems) { //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) try { Logger.LogInfo((object)$"\ud83c\udfaf Calculating spawn for item {itemIndex + 1}/{totalItems} from player at {playerPosition}"); Vector3 val = default(Vector3); if (totalItems == 1) { float num = Random.Range(0f, (float)Math.PI * 2f); float num2 = Random.Range(0.8f, radius); ((Vector3)(ref val))..ctor(Mathf.Cos(num) * num2, 0.5f, Mathf.Sin(num) * num2); Logger.LogInfo((object)$"\ud83c\udfaf Single item random spawn: angle={num:F2}, distance={num2:F2}"); } else { float num3 = (float)Math.PI * 2f * (float)itemIndex / (float)totalItems; ((Vector3)(ref val))..ctor(Mathf.Cos(num3) * radius, 0.5f, Mathf.Sin(num3) * radius); Logger.LogInfo((object)$"\ud83c\udfaf Circle spawn: angle={num3:F2}, distance={radius:F2}"); } Vector3 val2 = playerPosition + val; Logger.LogInfo((object)$"\ud83c\udfaf Final spawn position: {val2}"); Logger.LogInfo((object)$"\ud83c\udfaf Offset from player: {val}"); return val2; } catch (Exception ex) { Logger.LogError((object)("❌ Error calculating spawn position: " + ex.Message)); return playerPosition + Vector3.forward * 1.5f + Vector3.up * 0.5f; } } private static Vector3 GetPlayerPositionViaReflection() { //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) try { Character localCharacter = Character.localCharacter; if ((Object)(object)localCharacter == (Object)null) { return Vector3.zero; } MethodInfo method = ((object)localCharacter).GetType().GetMethod("HipPos", BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { Vector3 val = (Vector3)method.Invoke(localCharacter, null); Logger.LogInfo((object)$"\ud83d\udd27 Reflection hip position: {val}"); return val; } Vector3 center = localCharacter.Center; Logger.LogInfo((object)$"\ud83c\udfaf Center position: {center}"); return center; } catch (Exception ex) { Logger.LogError((object)("❌ Reflection method failed: " + ex.Message)); return Vector3.zero; } } private static Vector3 GetMostAccuratePlayerPosition() { //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: 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_009b: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) try { Character localCharacter = Character.localCharacter; if ((Object)(object)localCharacter == (Object)null) { return Vector3.zero; } CharacterRefs refs = localCharacter.refs; object obj; if (refs == null) { obj = null; } else { Bodypart hip = refs.hip; obj = ((hip != null) ? ((Component)hip).transform : null); } if ((Object)obj != (Object)null) { Vector3 position = ((Component)localCharacter.refs.hip).transform.position; Logger.LogInfo((object)$"✅ Live hip position: {position}"); return position; } Vector3 playerPositionViaReflection = GetPlayerPositionViaReflection(); if (playerPositionViaReflection != Vector3.zero) { return playerPositionViaReflection; } Vector3 center = localCharacter.Center; Logger.LogWarning((object)$"⚠\ufe0f Using Center as last resort: {center}"); return center; } catch (Exception ex) { Logger.LogError((object)("❌ All position methods failed: " + ex.Message)); return Vector3.zero; } } internal static EventResult SpawnRealItem(string itemKey, int quantity = 1, float spawnRadius = 1f) { //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0259: 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) //IL_026a: Unknown result type (might be due to invalid IL or missing references) //IL_02d8: Unknown result type (might be due to invalid IL or missing references) //IL_02df: Unknown result type (might be due to invalid IL or missing references) //IL_02e6: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) try { Logger.LogInfo((object)$"\ud83c\udfae SpawnRealItem START: {itemKey} x{quantity}, radius: {spawnRadius}"); if (string.IsNullOrEmpty(itemKey)) { return EventResult.FailureResult("Item key is empty"); } string key = itemKey.ToLowerInvariant(); if (!ItemMap.TryGetValue(key, out var value)) { return EventResult.FailureResult("Unknown item: '" + itemKey + "'"); } Character localCharacter = Character.localCharacter; if ((Object)(object)localCharacter == (Object)null) { return EventResult.FailureResult("No local character available"); } Item val = FindItemInDatabase(value); if ((Object)(object)val == (Object)null) { return EventResult.FailureResult("Item prefab not found: " + value); } quantity = Math.Min(quantity, 10); int num = 0; List<Vector3> list = new List<Vector3>(); for (int i = 0; i < quantity; i++) { Vector3 mostAccuratePlayerPosition = GetMostAccuratePlayerPosition(); if (mostAccuratePlayerPosition == Vector3.zero) { Logger.LogError((object)"❌ Could not get valid player position!"); continue; } Logger.LogInfo((object)$"\ud83d\udc64 Fresh player position for item {i + 1}: {mostAccuratePlayerPosition}"); Vector3 val2 = CalculateSpawnPositionFromPlayer(mostAccuratePlayerPosition, spawnRadius, i, quantity); Logger.LogInfo((object)$"\ud83c\udfaf Calculated spawn position {i + 1}: {val2}"); Logger.LogInfo((object)$"\ud83d\udccf Distance from player: {Vector3.Distance(val2, mostAccuratePlayerPosition):F2}m"); GameObject val3 = SpawnOriginalItem(val, val2); if ((Object)(object)val3 != (Object)null) { num++; list.Add(val2); Vector3 position = val3.transform.position; Logger.LogInfo((object)$"✅ Item {i + 1} spawned at: {position}"); Vector3 currentPlayerPosition = GetCurrentPlayerPosition(); float num2 = Vector3.Distance(position, currentPlayerPosition); Logger.LogInfo((object)$"✅ Final distance verification: {num2:F2}m"); } else { Logger.LogError((object)$"❌ Failed to spawn item {i + 1}"); } } Vector3 currentPlayerPosition2 = GetCurrentPlayerPosition(); Logger.LogInfo((object)$"\ud83d\udc64 FINAL verification - player position: {currentPlayerPosition2}"); return EventResult.SuccessResult($"Spawned {num}x real '{itemKey}' items near player", new Dictionary<string, object> { ["item"] = itemKey, ["spawned"] = num, ["positions"] = list, ["method"] = "real_game_items_fixed", ["finalPlayerPosition"] = new { currentPlayerPosition2.x, currentPlayerPosition2.y, currentPlayerPosition2.z } }); } catch (Exception ex) { return EventResult.FromException(ex, "SpawnRealItem"); } } private static GameObject SpawnOriginalItem(Item itemPrefab, Vector3 position) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) try { Logger.LogInfo((object)$"\ud83c\udfae Creating local item at position: {position}"); GameObject val = Object.Instantiate<GameObject>(((Component)itemPrefab).gameObject, position, Quaternion.identity); val.SetActive(true); Item component = val.GetComponent<Item>(); if ((Object)(object)component != (Object)null) { ((Behaviour)component).enabled = true; } Rigidbody component2 = val.GetComponent<Rigidbody>(); if ((Object)(object)component2 != (Object)null) { component2.isKinematic = false; component2.useGravity = true; component2.constraints = (RigidbodyConstraints)0; Vector3 val2 = default(Vector3); ((Vector3)(ref val2))..ctor(Random.Range(-0.1f, 0.1f), Random.Range(0.2f, 0.5f), Random.Range(-0.1f, 0.1f)); component2.AddForce(val2, (ForceMode)1); } Collider[] components = val.GetComponents<Collider>(); Collider[] array = components; foreach (Collider val3 in array) { val3.enabled = true; val3.isTrigger = false; } SpawnedItemMarker spawnedItemMarker = val.AddComponent<SpawnedItemMarker>(); spawnedItemMarker.spawnedBy = "PEAKTikTok"; spawnedItemMarker.spawnTime = Time.time; spawnedItemMarker.itemName = ((Object)itemPrefab).name; Logger.LogInfo((object)"✅ Created local item with patch support"); return val; } catch (Exception ex) { Logger.LogError((object)("❌ Failed to create local item: " + ex.Message)); return null; } } private static Vector3 CalculateRealSpawnPosition(Character character, float radius, int index, int total) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) Vector3 position = ((Component)character).transform.position; Vector3 forward = ((Component)character).transform.forward; Vector3 val = forward * 1f; Vector3 val2 = default(Vector3); ((Vector3)(ref val2))..ctor(Random.Range(-0.3f, 0.3f), 0.3f, Random.Range(-0.3f, 0.3f)); Vector3 val3 = position + val + val2; Logger.LogInfo((object)$"\ud83c\udfaf Simple spawn for item {index + 1}: {val3} (distance: {Vector3.Distance(val3, position):F2}m)"); return val3; } private static Vector3 GetRealPlayerPosition(Character character) { //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) try { Vector3 center = character.Center; Logger.LogInfo((object)$"\ud83c\udfaf Center position: {center}"); try { MethodInfo method = ((object)character).GetType().GetMethod("HipPos", BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { Vector3 val = (Vector3)method.Invoke(character, null); Logger.LogInfo((object)$"\ud83e\uddb4 Hip position (reflection): {val}"); return val; } } catch (Exception ex) { Logger.LogWarning((object)("⚠\ufe0f Could not get HipPos via reflection: " + ex.Message)); } return center; } catch (Exception ex2) { Logger.LogError((object)("❌ Error getting position: " + ex2.Message)); return ((Component)character).transform.position; } } private static Vector3 CalculateSpawnPosition(Character character, float radius, int index, int total) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009a: 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_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) Vector3 position = ((Component)character).transform.position; Logger.LogInfo((object)$"\ud83c\udfaf INPUT: Player at {position}, radius={radius}, item {index + 1}/{total}"); Vector3 val2; if (total == 1) { float num = Random.Range(0f, (float)Math.PI * 2f); float num2 = Random.Range(0.3f, radius); Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(Mathf.Cos(num) * num2, 0.1f, Mathf.Sin(num) * num2); val2 = position + val; Logger.LogInfo((object)$"\ud83c\udfaf RANDOM SPAWN: angle={num:F2}, radius={num2:F2}, offset={val}"); } else { float num3 = (float)Math.PI * 2f * (float)index / (float)total; Vector3 val3 = default(Vector3); ((Vector3)(ref val3))..ctor(Mathf.Cos(num3) * radius, 0.1f, Mathf.Sin(num3) * radius); val2 = position + val3; Logger.LogInfo((object)$"\ud83c\udfaf CIRCLE SPAWN: angle={num3:F2}, offset={val3}"); } Logger.LogInfo((object)$"\ud83c\udfaf FINAL POSITION: {val2}"); Logger.LogInfo((object)$"\ud83c\udfaf Distance from player: {Vector3.Distance(val2, position):F2}m"); return val2; } private static GameObject CreateLocalItem(Item itemPrefab, Vector3 position) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) try { GameObject val = Object.Instantiate<GameObject>(((Component)itemPrefab).gameObject, position, Quaternion.identity); PhotonView[] components = val.GetComponents<PhotonView>(); PhotonView[] array = components; foreach (PhotonView val2 in array) { try { Object.DestroyImmediate((Object)(object)val2); } catch (Exception ex) { Logger.LogWarning((object)("⚠\ufe0f Could not remove PhotonView: " + ex.Message)); } } val.SetActive(true); Item component = val.GetComponent<Item>(); if ((Object)(object)component != (Object)null) { ((Behaviour)component).enabled = true; } Rigidbody component2 = val.GetComponent<Rigidbody>(); if ((Object)(object)component2 != (Object)null) { component2.isKinematic = false; component2.useGravity = true; component2.constraints = (RigidbodyConstraints)0; } Collider[] components2 = val.GetComponents<Collider>(); Collider[] array2 = components2; foreach (Collider val3 in array2) { val3.enabled = true; val3.isTrigger = false; } Logger.LogInfo((object)"✅ Created local item without PhotonView"); return val; } catch (Exception ex2) { Logger.LogError((object)("❌ Failed to create local item: " + ex2.Message)); return null; } } internal static bool GiveItemToPlayer(string itemKey, int quantity = 1) { //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013a: 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_014d: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) try { Logger.LogInfo((object)$"\ud83c\udf92 GiveItemToPlayer: {itemKey} x{quantity}"); string key = itemKey.ToLowerInvariant(); if (!ItemMap.TryGetValue(key, out var value)) { Logger.LogError((object)("❌ Невідомий предмет: '" + itemKey + "'")); return false; } Character localCharacter = Character.localCharacter; if ((Object)(object)((localCharacter != null) ? localCharacter.player : null) == (Object)null) { Logger.LogError((object)"❌ Немає персонажа!"); return false; } Item val = FindItemInDatabase(value); if ((Object)(object)val == (Object)null) { return false; } quantity = Math.Min(quantity, 10); int num = 0; int num2 = 0; for (int i = 0; i < quantity; i++) { if (AddItemToSafeSlot(localCharacter.player, (byte)val.itemID)) { num++; Logger.LogInfo((object)$"✅ Додано предмет {i + 1}/{quantity} в інвентар"); continue; } Logger.LogInfo((object)$"\ud83c\udf92 Інвентар повний, спавним предмет {i + 1} біля гравця"); Vector3 mostAccuratePlayerPosition = GetMostAccuratePlayerPosition(); if (mostAccuratePlayerPosition != Vector3.zero) { Vector3 position = CalculateSpawnPositionFromPlayer(mostAccuratePlayerPosition, 1.5f, num2, quantity - num); GameObject val2 = SpawnOriginalItem(val, position); if ((Object)(object)val2 != (Object)null) { num2++; Logger.LogInfo((object)$"✅ Заспавнено предмет {i + 1} біля гравця"); } } } Logger.LogInfo((object)$"\ud83c\udf92 Результат: {num}/{quantity} в інвентарі, {num2}/{quantity} заспавнено"); return num + num2 > 0; } catch (Exception ex) { Logger.LogError((object)("❌ GiveItemToPlayer помилка: " + ex.Message)); return false; } } private static bool AddItemToSafeSlot(Player player, byte itemID) { try { ItemSlot val = default(ItemSlot); for (byte b = 0; b <= 2; b++) { ItemSlot itemSlot = player.GetItemSlot(b); if (itemSlot != null && itemSlot.IsEmpty() && player.AddItem((ushort)itemID, (ItemInstanceData)null, ref val) && val.itemSlotID == b) { Logger.LogInfo((object)$"✅ Додано в звичайний слот {b}"); return true; } } ItemSlot itemSlot2 = player.GetItemSlot((byte)3); ItemSlot val2 = default(ItemSlot); if (itemSlot2 != null && !itemSlot2.IsEmpty() && player.AddItem((ushort)itemID, (ItemInstanceData)null, ref val2)) { if (val2.itemSlotID <= 7) { Logger.LogInfo((object)$"✅ Додано в слот {val2.itemSlotID}"); return true; } Logger.LogWarning((object)$"⚠\ufe0f Предмет потрапив в слот руки ({val2.itemSlotID}), видаляємо"); val2.SetItem((Item)null, (ItemInstanceData)null); return false; } Logger.LogWarning((object)"⚠\ufe0f Немає вільних безпечних слотів"); return false; } catch (Exception ex) { Logger.LogError((object)("❌ AddItemToSafeSlot помилка: " + ex.Message)); return false; } } internal static bool GiveItemToPlayerSafe(string itemKey, int quantity = 1) { try { if (string.IsNullOrEmpty(itemKey)) { Logger.LogWarning((object)"⚠\ufe0f Empty item key"); return false; } if (quantity <= 0 || quantity > 10) { Logger.LogWarning((object)$"⚠\ufe0f Invalid quantity: {quantity}"); return false; } Character localCharacter = Character.localCharacter; if ((Object)(object)((localCharacter != null) ? localCharacter.player : null) == (Object)null) { Logger.LogWarning((object)"⚠\ufe0f No local character available"); return false; } return GiveItemToPlayer(itemKey, quantity); } catch (Exception ex) { Logger.LogError((object)("❌ GiveItemToPlayerSafe error: " + ex.Message)); return false; } } internal static EventResult GiveItemSafe(string itemKey, int quantity = 1) { //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01ea: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0215: 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_0250: Unknown result type (might be due to invalid IL or missing references) try { Logger.LogInfo((object)$"\ud83c\udf92 GiveItemSafe: {itemKey} x{quantity}"); if (string.IsNullOrEmpty(itemKey)) { return EventResult.FailureResult("Item key is empty or null"); } if (quantity <= 0) { return EventResult.FailureResult($"Invalid quantity: {quantity}. Must be greater than 0"); } if (quantity > 10) { return EventResult.FailureResult($"Quantity too large: {quantity}. Maximum is 10"); } string key = itemKey.ToLowerInvariant(); if (!ItemMap.TryGetValue(key, out var value)) { string[] availableItems = GetAvailableItems(); return EventResult.FailureResult("Unknown item: '" + itemKey + "'", new Dictionary<string, object> { ["requestedItem"] = itemKey, ["availableItems"] = availableItems }); } Character localCharacter = Character.localCharacter; if ((Object)(object)((localCharacter != null) ? localCharacter.player : null) == (Object)null) { return EventResult.FailureResult("No local character or player available"); } Item val = FindItemInDatabase(value); if ((Object)(object)val == (Object)null) { return EventResult.FailureResult("Item prefab not found in database: " + value); } quantity = Math.Min(quantity, 10); int num = 0; int num2 = 0; List<byte> list = new List<byte>(); List<Vector3> list2 = new List<Vector3>(); for (int i = 0; i < quantity; i++) { if (AddItemToSafeSlotWithSlotInfo(localCharacter.player, (byte)val.itemID, out var slotIndex)) { num++; list.Add(slotIndex); Logger.LogInfo((object)$"✅ Added to inventory slot {slotIndex}"); continue; } Logger.LogInfo((object)$"\ud83c\udf92 Inventory full, spawning item {i + 1} near player"); Vector3 mostAccuratePlayerPosition = GetMostAccuratePlayerPosition(); if (mostAccuratePlayerPosition != Vector3.zero) { Vector3 val2 = CalculateSpawnPositionFromPlayer(mostAccuratePlayerPosition, 1.5f, num2, quantity - num); GameObject val3 = SpawnOriginalItem(val, val2); if ((Object)(object)val3 != (Object)null) { num2++; list2.Add(val2); Logger.LogInfo((object)$"✅ Spawned item {i + 1} near player at {val2}"); } else { Logger.LogError((object)$"❌ Failed to spawn item {i + 1} near player"); } } else { Logger.LogError((object)$"❌ Could not get player position for spawning item {i + 1}"); } } int num3 = num + num2; if (num3 <= 0) { return EventResult.FailureResult("Could not add items to inventory or spawn near player"); } string message = ((num > 0 && num2 > 0) ? $"Added {num}x '{itemKey}' to inventory and spawned {num2}x near player" : ((num <= 0) ? $"Inventory full! Spawned {num2}x '{itemKey}' near player" : $"Successfully added {num}x '{itemKey}' to inventory")); return EventResult.SuccessResult(message, new Dictionary<string, object> { ["item"] = itemKey, ["requested"] = quantity, ["addedToInventory"] = num, ["spawnedNearPlayer"] = num2, ["totalProcessed"] = num3, ["safeSlots"] = list.ToArray(), ["spawnedPositions"] = list2, ["prefabName"] = value, ["method"] = "inventory_with_fallback_spawn" }); } catch (Exception ex) { return EventResult.FromException(ex, "GiveItemSafe"); } } private static bool AddItemToSafeSlotWithSlotInfo(Player player, byte itemID, out byte slotIndex) { slotIndex = byte.MaxValue; try { ItemSlot val = default(ItemSlot); for (byte b = 0; b <= 2; b++) { ItemSlot itemSlot = player.GetItemSlot(b); if (itemSlot != null && itemSlot.IsEmpty() && player.AddItem((ushort)itemID, (ItemInstanceData)null, ref val) && val.itemSlotID == b) { slotIndex = b; Logger.LogInfo((object)$"✅ Додано в звичайний слот {b}"); return true; } } ItemSlot itemSlot2 = player.GetItemSlot((byte)3); if (itemSlot2 != null && !itemSlot2.IsEmpty()) { ItemSlot val2 = default(ItemSlot); for (byte b2 = 4; b2 <= 7; b2++) { try { ItemSlot itemSlot3 = player.GetItemSlot(b2); if (itemSlot3 != null && itemSlot3.IsEmpty() && player.AddItem((ushort)itemID, (ItemInstanceData)null, ref val2)) { if (val2.itemSlotID == b2 && b2 <= 7) { slotIndex = b2; Logger.LogInfo((object)$"✅ Додано в слот рюкзака {b2}"); return true; } val2.SetItem((Item)null, (ItemInstanceData)null); Logger.LogWarning((object)$"⚠\ufe0f Предмет потрапив не в той слот ({val2.itemSlotID} замість {b2})"); } } catch (Exception ex) { Logger.LogDebug((object)$"Слот {b2} недоступний: {ex.Message}"); } } } Logger.LogWarning((object)"⚠\ufe0f Немає вільних безпечних слотів"); return false; } catch (Exception ex2) { Logger.LogError((object)("❌ AddItemToSafeSlotWithSlotInfo помилка: " + ex2.Message)); return false; } } internal static EventResult GetItemInfo(string itemKey) { try { if (string.IsNullOrEmpty(itemKey)) { return EventResult.FailureResult("Item key is empty"); } string key = itemKey.ToLowerInvariant(); if (!ItemMap.TryGetValue(key, out var value)) { return EventResult.FailureResult("Unknown item: '" + itemKey + "'"); } Item val = FindItemInDatabase(value); if ((Object)(object)val == (Object)null) { return EventResult.FailureResult("Item prefab not found: " + value); } return EventResult.SuccessResult("Item info for '" + itemKey + "'", new Dictionary<string, object> { ["itemKey"] = itemKey, ["prefabName"] = value, ["itemID"] = val.itemID, ["displayName"] = ((Object)val).name, ["exists"] = true }); } catch (Exception ex) { return EventResult.FromException(ex, "GetItemInfo"); } } internal static EventResult GetInventoryInfo() { try { Character localCharacter = Character.localCharacter; if ((Object)(object)((localCharacter != null) ? localCharacter.player : null) == (Object)null) { return EventResult.FailureResult("No local character available"); } Player player = localCharacter.player; object field = player.GetField<object>("inventory"); if (field == null) { return EventResult.FailureResult("Could not access inventory"); } return EventResult.SuccessResult("Inventory info retrieved", new Dictionary<string, object> { ["hasCharacter"] = true, ["hasPlayer"] = true, ["hasInventory"] = field != null }); } catch (Exception ex) { return EventResult.FromException(ex, "GetInventoryInfo"); } } internal static string[] GetAvailableItems() { string[] array = new string[ItemMap.Count]; ItemMap.Keys.CopyTo(array, 0); return array; } internal static bool ItemExists(string itemKey) { return ItemMap.ContainsKey(itemKey.ToLowerInvariant()); } internal static void CleanupCooldowns() { List<string> list = new List<string>(); float time = Time.time; foreach (KeyValuePair<string, float> itemCooldown in itemCooldowns) { if (time - itemCooldown.Value > 60f) { list.Add(itemCooldown.Key); } } foreach (string item in list) { itemCooldowns.Remove(item); } } internal static EventResult CleanupCooldownsSafe() { try { int count = itemCooldowns.Count; CleanupCooldowns(); int count2 = itemCooldowns.Count; int num = count - count2; return EventResult.SuccessResult("Cleanup completed", new Dictionary<string, object> { ["initialCount"] = count, ["finalCount"] = count2, ["removed"] = num }); } catch (Exception ex) { return EventResult.FromException(ex, "CleanupCooldowns"); } } } internal class MainThreadDispatcher : MonoBehaviour { private static MainThreadDispatcher _instance; private readonly Queue<Action> _executionQueue = new Queue<Action>(); private static ManualLogSource Logger = Logger.CreateLogSource("MainThreadDispatcher"); internal static MainThreadDispatcher Instance { get { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown if ((Object)(object)_instance == (Object)null) { GameObject val = new GameObject("MainThreadDispatcher"); _instance = val.AddComponent<MainThreadDispatcher>(); Object.DontDestroyOnLoad((Object)(object)val); Logger.LogInfo((object)"✅ MainThreadDispatcher created"); } return _instance; } } internal static void Enqueue(Action action) { if (action != null) { Instance.EnqueueInternal(action); } } internal static void Enqueue(Action action, Action<Exception> onError) { if (action == null) { return; } Instance.EnqueueInternal(delegate { try { action(); } catch (Exception ex) { Logger.LogError((object)("❌ MainThread execution error: " + ex.Message)); onError?.Invoke(ex); } }); } private void EnqueueInternal(Action action) { lock (_executionQueue) { _executionQueue.Enqueue(action); } } private void Update() { lock (_executionQueue) { while (_executionQueue.Count > 0) { try { _executionQueue.Dequeue()(); } catch (Exception ex) { Logger.LogError((object)("❌ MainThread action error: " + ex.Message)); } } } } private void OnDestroy() { lock (_executionQueue) { _executionQueue.Clear(); } _instance = null; Logger.LogInfo((object)"\ud83d\uddd1\ufe0f MainThreadDispatcher destroyed"); } } public class ModLauncher : MonoBehaviour { private static ManualLogSource Logger = Logger.CreateLogSource("ModLauncher"); private GameObject modCore; public void Start() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown try { Logger.LogInfo((object)"\ud83d\ude80 ModLauncher starting..."); modCore = new GameObject("ModCore"); modCore.AddComponent<PEAKTikTok>(); Object.DontDestroyOnLoad((Object)(object)modCore); Logger.LogInfo((object)"✅ Mod core initialized"); } catch (Exception ex) { Logger.LogError((object)("❌ ModLauncher failed: " + ex.Message)); } } public void OnDestroy() { if ((Object)(object)modCore != (Object)null) { Object.Destroy((Object)(object)modCore); } } } internal class PEAKTikTok : MonoBehaviour { private static ManualLogSource Logger = Logger.CreateLogSource("PEAKTikTok"); internal static PEAKTikTok Instance { get; private set; } private void Start() { Instance = this; Logger.LogInfo((object)"\ud83d\udce2 PEAK TikTok Mod loading..."); try { MainThreadDispatcher instance = MainThreadDispatcher.Instance; Logger.LogInfo((object)"✅ MainThreadDispatcher initialized"); ((Component)this).gameObject.AddComponent<HttpServer>(); Logger.LogInfo((object)"✅ HTTP Server component added"); ((MonoBehaviour)this).InvokeRepeating("CleanupCooldowns", 60f, 60f); Logger.LogInfo((object)"✅ Cooldown cleanup scheduled"); Logger.LogInfo((object)"\ud83c\udf89 PEAK TikTok Mod loaded successfully!"); } catch (Exception ex) { Logger.LogError((object)("❌ Failed to initialize PEAK TikTok Mod: " + ex.Message)); Logger.LogError((object)("Stack trace: " + ex.StackTrace)); } } private void Update() { PlayerReviveController.TrackDeathPosition(); } private void CleanupCooldowns() { try { EventResult eventResult = ItemSpawner.CleanupCooldownsSafe(); if (eventResult.Success) { Logger.LogInfo((object)("\ud83e\uddf9 " + eventResult.Message)); } else { Logger.LogWarning((object)("⚠\ufe0f Cleanup warning: " + eventResult.Message)); } } catch (Exception ex) { Logger.LogError((object)("❌ Cleanup error: " + ex.Message)); } } private void OnDestroy() { Logger.LogInfo((object)"\ud83d\uddd1\ufe0f PEAKTikTok destroyed"); } private void OnApplicationQuit() { Logger.LogInfo((object)"\ud83d\udeaa Application quitting - PEAKTikTok cleanup"); } } internal static class PlayerGravityController { private static ManualLogSource Logger = Logger.CreateLogSource("PlayerGravityController"); private static bool _active = false; private static float _originalJumpGravity = 10f; private static float _originalMaxGravity = -20f; private static float _originalJumpImpulse = 1f; private static float _originalBalloonFloatMultiplier = 1f; private static float _originalBalloonJumpMultiplier = 1f; internal static bool IsActive => _active; internal static EventResult ApplyGravityEffect(string gravityType, float duration = 30f) { try { if (_active) { ResetGravity(); } Character localCharacter = Character.localCharacter; if ((Object)(object)localCharacter == (Object)null || localCharacter.data.dead || localCharacter.data.fullyPassedOut) { return EventResult.FailureResult("Character not available for gravity effect"); } CharacterMovement component = ((Component)localCharacter).GetComponent<CharacterMovement>(); if ((Object)(object)component == (Object)null) { return EventResult.FailureResult("CharacterMovement component not found"); } if (!_active) { SaveOriginalValues(component); } _active = true; switch (gravityType.ToLowerInvariant()) { case "floaty": component.jumpGravity = 3f; component.maxGravity = -5f; component.balloonFloatMultiplier = 0.3f; component.balloonJumpMultiplier = 1.5f; Logger.LogInfo((object)"\ud83c\udf88 Applied floaty gravity effect"); break; case "heavy": component.jumpGravity = 25f; component.maxGravity = -100f; component.balloonFloatMultiplier = 3f; component.balloonJumpMultiplier = 0.5f; Logger.LogInfo((object)"\ud83e\udea8 Applied heavy gravity effect"); break; case "zero": component.jumpGravity = 0.1f; component.maxGravity = -0.1f; component.balloonFloatMultiplier = 0.01f; component.balloonJumpMultiplier = 3f; Logger.LogInfo((object)"\ud83d\ude80 Applied zero gravity effect"); break; case "reverse": component.jumpGravity = -8f; component.maxGravity = 15f; component.balloonFloatMultiplier = -2f; component.balloonJumpMultiplier = 2f; Logger.LogInfo((object)"\ud83d\udd04 Applied reverse gravity effect"); break; case "superjump": component.jumpGravity = _originalJumpGravity; component.maxGravity = -40f; component.jumpImpulse = _originalJumpImpulse * 2.5f; component.balloonJumpMultiplier = 3f; Logger.LogInfo((object)"\ud83e\udd98 Applied super jump effect"); break; case "moonjump": component.jumpGravity = 4f; component.maxGravity = -8f; component.jumpImpulse = _originalJumpImpulse * 1.8f; component.balloonFloatMultiplier = 0.4f; component.balloonJumpMultiplier = 2f; Logger.LogInfo((object)"\ud83c\udf19 Applied moon jump effect"); break; default: _active = false; return EventResult.FailureResult("Unknown gravity type: " + gravityType + ". Available: floaty, heavy, zero, reverse, superjump, moonjump"); } Task.Run(() => ResetGravityAfterDelay(duration)).Forget(); return EventResult.SuccessResult($"Gravity effect '{gravityType}' applied for {duration} seconds", new Dictionary<string, object> { ["gravityType"] = gravityType, ["duration"] = duration, ["jumpGravity"] = component.jumpGravity, ["maxGravity"] = component.maxGravity, ["balloonFloatMultiplier"] = component.balloonFloatMultiplier, ["balloonJumpMultiplier"] = component.balloonJumpMultiplier }); } catch (Exception ex) { _active = false; return EventResult.FromException(ex, "ApplyGravityEffect"); } } private static void SaveOriginalValues(CharacterMovement movement) { try { _originalJumpGravity = movement.jumpGravity; _originalMaxGravity = movement.maxGravity; _originalJumpImpulse = movement.jumpImpulse; _originalBalloonFloatMultiplier = movement.balloonFloatMultiplier; _originalBalloonJumpMultiplier = movement.balloonJumpMultiplier; Logger.LogInfo((object)$"\ud83d\udcbe Saved original values: jumpGravity={_originalJumpGravity}, maxGravity={_originalMaxGravity}, jumpImpulse={_originalJumpImpulse}"); Logger.LogInfo((object)$"\ud83d\udcbe Balloon multipliers: float={_originalBalloonFloatMultiplier}, jump={_originalBalloonJumpMultiplier}"); } catch (Exception ex) { Logger.LogError((object)("❌ Error saving original values: " + ex.Message)); _originalJumpGravity = 10f; _originalMaxGravity = -20f; _originalJumpImpulse = 7f; _originalBalloonFloatMultiplier = 1f; _originalBalloonJumpMultiplier = 1f; } } internal static EventResult ResetGravity() { try { if (!_active) { return EventResult.FailureResult("No gravity effect is currently active"); } Character localCharacter = Character.localCharacter; if ((Object)(object)localCharacter == (Object)null) { _active = false; return EventResult.FailureResult("Character not available"); } CharacterMovement component = ((Component)localCharacter).GetComponent<CharacterMovement>(); if ((Object)(object)component == (Object)null) { _active = false; return EventResult.FailureResult("CharacterMovement component not found"); } RestoreOriginalValues(component); _active = false; Logger.LogInfo((object)"\ud83d\udd04 Gravity effect reset to normal"); return EventResult.SuccessResult("Gravity effect reset to normal", new Dictionary<string, object> { ["jumpGravity"] = component.jumpGravity, ["maxGravity"] = component.maxGravity, ["jumpImpulse"] = component.jumpImpulse, ["balloonFloatMultiplier"] = component.balloonFloatMultiplier, ["balloonJumpMultiplier"] = component.balloonJumpMultiplier }); } catch (Exception ex) { _active = false; return EventResult.FromException(ex, "ResetGravity"); } } private static void RestoreOriginalValues(CharacterMovement movement) { try { movement.jumpGravity = _originalJumpGravity; movement.maxGravity = _originalMaxGravity; movement.jumpImpulse = _originalJumpImpulse; movement.balloonFloatMultiplier = _originalBalloonFloatMultiplier; movement.balloonJumpMultiplier = _originalBalloonJumpMultiplier; Logger.LogInfo((object)$"\ud83d\udd04 Restored original values: jumpGravity={_originalJumpGravity}, maxGravity={_originalMaxGravity}"); } catch (Exception ex) { Logger.LogError((object)("❌ Error restoring original values: " + ex.Message)); } } private static async Task ResetGravityAfterDelay(float duration) { try { await Task.Delay(TimeSpan.FromSeconds(duration)); MainThreadDispatcher.Enqueue(delegate { if (_active) { EventResult eventResult = ResetGravity(); if (eventResult.Success) { Logger.LogInfo((object)"⏰ Gravity effect automatically reset after duration"); } else { Logger.LogWarning((object)("⚠\ufe0f Auto reset failed: " + eventResult.Message)); _active = false; } } }); } catch (Exception ex2) { Exception ex = ex2; Logger.LogError((object)("❌ Error in ResetGravityAfterDelay: " + ex.Message)); MainThreadDispatcher.Enqueue(delegate { _active = false; }); } } internal static EventResult GetGravityStatus() { try { Character localCharacter = Character.localCharacter; if ((Object)(object)localCharacter == (Object)null) { return EventResult.FailureResult("No local character"); } CharacterMovement component = ((Component)localCharacter).GetComponent<CharacterMovement>(); if ((Object)(object)component == (Object)null) { return EventResult.FailureResult("No CharacterMovement component"); } return EventResult.SuccessResult("Gravity status retrieved", new Dictionary<string, object> { ["isActive"] = _active, ["currentJumpGravity"] = component.jumpGravity, ["currentMaxGravity"] = component.maxGravity, ["currentJumpImpulse"] = component.jumpImpulse, ["currentBalloonFloatMultiplier"] = component.balloonFloatMultiplier, ["currentBalloonJumpMultiplier"] = component.balloonJumpMultiplier, ["originalJumpGravity"] = _originalJumpGravity, ["originalMaxGravity"] = _originalMaxGravity, ["originalJumpImpulse"] = _originalJumpImpulse, ["originalBalloonFloatMultiplier"] = _originalBalloonFloatMultiplier, ["originalBalloonJumpMultiplier"] = _originalBalloonJumpMultiplier }); } catch (Exception ex) { return EventResult.FromException(ex, "GetGravityStatus"); } } internal static string[] GetAvailableGravityEffects() { return new string[6] { "floaty", "heavy", "zero", "reverse", "superjump", "moonjump" }; } } internal static class PlayerInventoryController { private static ManualLogSource Logger = Logger.CreateLogSource("PlayerInventoryController"); internal static EventResult DropAllItems(bool includeBackpack = true) { try { Character localCharacter = Character.localCharacter; if ((Object)(object)localCharacter?.refs?.items == (Object)null) { return EventResult.FailureResult("Local character or items not found"); } Logger.LogInfo((object)$"\ud83c\udf92 Dropping all items from inventory (includeBackpack: {includeBackpack})"); CharacterItems items = localCharacter.refs.items; MethodInfo method = ((object)items).GetType().GetMethod("DropAllItems", BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { method.Invoke(items, new object[1] { includeBackpack }); Logger.LogInfo((object)"\ud83c\udf92 Successfully dropped all items"); return EventResult.SuccessResult("Dropped all items from inventory", new Dictionary<string, object> { ["includeBackpack"] = includeBackpack, ["method"] = "DropAllItems" }); } Logger.LogError((object)"❌ DropAllItems method not found"); return EventResult.FailureResult("DropAllItems method not found"); } catch (Exception ex) { return EventResult.FromException(ex, "DropAllItems"); } } internal static EventResult DropHandItem() { //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Expected O, but got Unknown //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Unknown result type (might be due to invalid IL or missing references) //IL_026c: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_027a: Unknown result type (might be due to invalid IL or missing references) try { Character localCharacter = Character.localCharacter; if ((Object)(object)localCharacter == (Object)null || (Object)(object)localCharacter.refs?.items == (Object)null) { return EventResult.FailureResult("Local character not found"); } Logger.LogInfo((object)"\ud83e\udd32 Attempting to drop item from hand"); if (!localCharacter.refs.items.currentSelectedSlot.IsSome) { return EventResult.FailureResult("No item equipped in hand"); } byte value = localCharacter.refs.items.currentSelectedSlot.Value; ItemSlot itemSlot = localCharacter.player.GetItemSlot(value); if (itemSlot == null || itemSlot.IsEmpty()) { return EventResult.FailureResult("No item in current slot"); } string itemName = itemSlot.prefab.GetItemName((ItemInstanceData)null); if (!itemSlot.prefab.UIData.canDrop) { return EventResult.FailureResult("Item '" + itemName + "' cannot be dropped"); } Bodypart hip = localCharacter.refs.hip; if ((Object)(object)((hip != null) ? ((Component)hip).transform : null) == (Object)null) { return EventResult.FailureResult("Could not get hip transform"); } Vector3 val = ((Component)hip).transform.position + ((Component)hip).transform.forward * 0.8f + Vector3.up * 0.5f; FieldInfo field = ((object)localCharacter.refs.items).GetType().GetField("photonView", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { PhotonView val2 = (PhotonView)field.GetValue(localCharacter.refs.items); if ((Object)(object)val2 != (Object)null) { localCharacter.refs.items.EquipSlot(Optionable<byte>.None); val2.RPC("DropItemFromSlotRPC", (RpcTarget)0, new object[2] { value, val }); Logger.LogInfo((object)("\ud83e\udd32 Dropped item from hand: " + itemName)); return EventResult.SuccessResult("Dropped item from hand: " + itemName, new Dictionary<string, object> { ["itemName"] = itemName, ["slotIndex"] = value, ["dropPosition"] = new { val.x, val.y, val.z } }); } } return EventResult.FailureResult("Failed to access PhotonView for RPC call"); } catch (Exception ex) { return EventResult.FromException(ex, "DropHandItem"); } } internal static EventResult DropItemFromSlot(byte slotIndex) { //IL_0402: Unknown result type (might be due to invalid IL or missing references) //IL_0407: Unknown result type (might be due to invalid IL or missing references) //IL_0411: Unknown result type (might be due to invalid IL or missing references) //IL_0416: Unknown result type (might be due to invalid IL or missing references) //IL_041b: Unknown result type (might be due to invalid IL or missing references) //IL_0425: Unknown result type (might be due to invalid IL or missing references) //IL_042a: Unknown result type (might be due to invalid IL or missing references) //IL_042f: Unknown result type (might be due to invalid IL or missing references) //IL_0478: Unknown result type (might be due to invalid IL or missing references) //IL_047f: Expected O, but got Unknown //IL_03a3: Unknown result type (might be due to invalid IL or missing references) //IL_03af: Unknown result type (might be due to invalid IL or missing references) //IL_03b9: Unknown result type (might be due to invalid IL or missing references) //IL_03be: Unknown result type (might be due to invalid IL or missing references) //IL_03c3: Unknown result type (might be due to invalid IL or missing references) //IL_03cd: Unknown result type (might be due to invalid IL or missing references) //IL_03d2: Unknown result type (might be due to invalid IL or missing references) //IL_03d7: Unknown result type (might be due to invalid IL or missing references) //IL_0353: Unknown result type (might be due to invalid IL or missing references) //IL_035e: Unknown result type (might be due to invalid IL or missing references) //IL_0368: Unknown result type (might be due to invalid IL or missing references) //IL_036d: Unknown result type (might be due to invalid IL or missing references) //IL_0372: Unknown result type (might be due to invalid IL or missing references) //IL_037c: Unknown result type (might be due to invalid IL or missing references) //IL_0381: Unknown result type (might be due to invalid IL or missing references) //IL_0386: Unknown result type (might be due to invalid IL or missing references) //IL_050a: Unknown result type (might be due to invalid IL or missing references) //IL_0581: Unknown result type (might be due to invalid IL or missing references) //IL_0588: Unknown result type (might be due to invalid IL or missing references) //IL_058f: Unknown result type (might be due to invalid IL or missing references) //IL_04d5: Unknown result type (might be due to invalid IL or missing references) try { Character localCharacter = Character.localCharacter; if ((Object)(object)((localCharacter != null) ? localCharacter.player : null) == (Object)null) { return EventResult.FailureResult("Local character or player not found"); } Logger.LogInfo((object)$"\ud83c\udfaf Attempting to drop item from slot {slotIndex}"); if (slotIndex > 3) { return EventResult.FailureResult($"Invalid slot index: {slotIndex}. Valid range is 0-3."); } ItemSlot val = null; try { val = localCharacter.player.GetItemSlot(slotIndex); } catch (Exception ex) { Logger.LogError((object)$"❌ Error accessing slot {slotIndex}: {ex.Message}"); return EventResult.FailureResult($"Cannot access slot {slotIndex}: {ex.Message}"); } if (val == null) { return EventResult.FailureResult($"Slot {slotIndex} is null or does not exist"); } if (val.IsEmpty()) { return EventResult.FailureResult($"No item in slot {slotIndex}"); } string text = "Unknown Item"; byte b = 0; try { if ((Object)(object)val.prefab != (Object)null) { text = val.prefab.GetItemName((ItemInstanceData)null); b = (byte)val.prefab.itemID; Logger.LogInfo((object)$"\ud83c\udf92 Item found in slot {slotIndex}: {text} (ID: {b})"); } else { try { object field = val.GetField<object>("data"); if (field != null) { b = field.GetField("itemID", (byte)0); text = $"Item_ID_{b}"; Logger.LogInfo((object)$"\ud83d\udd27 Got item via reflection: {text} (ID: {b})"); } else { text = $"Slot_{slotIndex}_Item"; b = 1; Logger.LogWarning((object)$"⚠\ufe0f Using fallback for slot {slotIndex}"); } } catch (Exception ex2) { Logger.LogWarning((object)("⚠\ufe0f Reflection failed: " + ex2.Message)); text = $"Slot_{slotIndex}_Item"; b = 1; } } } catch (Exception ex3) { Logger.LogWarning((object)("⚠\ufe0f Could not get item info: " + ex3.Message)); text = $"Slot_{slotIndex}_Item"; b = 1; } bool flag = true; try { if (val.prefab?.UIData != null) { flag = val.prefab.UIData.canDrop; } else { flag = true; Logger.LogInfo((object)$"✅ Allowing drop for slot {slotIndex} (no UIData check)"); } } catch (Exception ex4) { Logger.LogWarning((object)("⚠\ufe0f Could not check canDrop: " + ex4.Message)); flag = true; } if (!flag) { return EventResult.FailureResult("Item '" + text + "' cannot be dropped"); } Vector3 val2; try { Bodypart hip = localCharacter.refs.hip; if ((Object)(object)((hip != null) ? ((Component)hip).transform : null) == (Object)null) { val2 = ((Component)localCharacter).transform.position + ((Component)localCharacter).transform.forward * 0.6f + Vector3.up * 0.5f; Logger.LogWarning((object)"⚠\ufe0f Using fallback position - hip transform not found"); } else { val2 = ((Component)hip).transform.position + ((Component)hip).transform.forward * 0.6f + Vector3.up * 0.5f; } } catch (Exception ex5) { Logger.LogWarning((object)("⚠\ufe0f Error getting hip position: " + ex5.Message)); val2 = ((Component)localCharacter).transform.position + Vector3.forward * 0.6f + Vector3.up * 0.5f; } try { FieldInfo field2 = ((object)localCharacter.refs.items).GetType().GetField("photonView", BindingFlags.Instance | BindingFlags.NonPublic); if (field2 != null) { PhotonView val3 = (PhotonView)field2.GetValue(localCharacter.refs.items); if ((Object)(object)val3 != (Object)null) { if (localCharacter.refs.items.currentSelectedSlot.IsSome && localCharacter.refs.items.currentSelectedSlot.Value == slotIndex) { localCharacter.refs.items.EquipSlot(Optionable<byte>.None); Logger.LogInfo((object)"\ud83d\udd13 Unequipped item from hand before dropping"); } val3.RPC("DropItemFromSlotRPC", (RpcTarget)0, new object[2] { slotIndex, val2 }); Logger.LogInfo((object)$"\ud83c\udfaf Dropped item from slot {slotIndex}: {text}"); return EventResult.SuccessResult($"Dropped item from slot {slotIndex}: {text}", new Dictionary<string, object> { ["itemName"] = text, ["slotIndex"] = slotIndex, ["itemID"] = b, ["dropPosition"] = new { val2.x, val2.y, val2.z } }); } return EventResult.FailureResult("PhotonView is null"); } return EventResult.FailureResult("Could not access photonView field"); } catch (Exception ex6) { Logger.LogError((object)("❌ Error in PhotonView RPC: " + ex6.Message)); return EventResult.FailureResult("Failed to drop item via RPC: " + ex6.Message); } } catch (Exception ex7) { return EventResult.FromException(ex7, "DropItemFromSlot"); } }