diff --git a/DevourClient/ClientMain.cs b/DevourClient/ClientMain.cs index b4f0903..ded4963 100644 --- a/DevourClient/ClientMain.cs +++ b/DevourClient/ClientMain.cs @@ -1,13 +1,10 @@ -using DevourClient.Helpers; -using DevourClient.Localization; -using MelonLoader; -using System.Threading.Tasks; -using Il2CppPhoton.Bolt; -using UnityEngine; -using Il2Cpp; using System; -using System.Collections; -using System.Collections.Generic; +using DevourClient.Features; +using DevourClient.Helpers; +using DevourClient.UI; +using Il2CppPhoton.Bolt; +using MelonLoader; +using UnityEngine; namespace DevourClient { @@ -18,7 +15,7 @@ namespace DevourClient { } - enum CurrentTab : int + internal enum CurrentTab : int { Visuals = 0, Entities = 1, @@ -30,61 +27,63 @@ namespace DevourClient Network = 7 } - static Rect windowRect = new Rect(Settings.Settings.x + 10, Settings.Settings.y + 10, 800, 750); - static CurrentTab current_tab = CurrentTab.Visuals; + internal static Rect windowRect = new Rect(Settings.Settings.x + 10, Settings.Settings.y + 10, 800, 750); + internal static CurrentTab current_tab = CurrentTab.Visuals; - static bool flashlight_toggle = false; - static bool flashlight_colorpick = false; - static bool player_esp_colorpick = false; - static bool azazel_esp_colorpick = false; - static bool spoofLevel = false; - static float spoofLevelValue = 0; - - // UI variables - static bool fly = false; - static float fly_speed = 5; - static bool fastMove = false; - static float _PlayerSpeedMultiplier = 1; + internal static bool flashlight_toggle = false; + internal static bool flashlight_colorpick = false; + internal static bool player_esp_colorpick = false; + internal static bool azazel_esp_colorpick = false; + internal static bool spoofLevel = false; + internal static float spoofLevelValue = 0; + + internal static bool fly = false; + internal static float fly_speed = 5; + internal static bool fastMove = false; + internal static float _PlayerSpeedMultiplier = 1; public static bool _IsAutoRespawn = false; public static bool unlimitedUV = false; public static bool exp_modifier = false; public static float exp = 1000f; public static bool _walkInLobby = false; public static bool infinite_mirrors = false; - static bool radialMenuEnabled = true; - static bool player_esp = false; - static bool player_skel_esp = false; - static bool player_snapline = false; - static bool azazel_esp = false; - static bool azazel_skel_esp = false; - static bool azazel_snapline = false; - // These variables are now managed by ESP.ItemESPConfig system - static bool item_esp => ESP.ItemESPConfig.ItemESP; - static bool goat_rat_esp => ESP.ItemESPConfig.GoatRatESP; - static bool demon_esp => ESP.ItemESPConfig.DemonESP; - static bool fullbright = false; - static bool need_fly_reset = false; - static bool crosshair = false; - static bool in_game_cache = false; - static bool showCoordinates = false; - static bool recallEnabled = false; - private const int ITEM_FARM_REPEAT_COUNT = 5; - private const float ITEM_FARM_DELAY = 0.15f; - private static bool autoItemFarm = false; - static bool should_show_start_message = true; - static Texture2D crosshairTexture = default!; - static string lastESPScene = string.Empty; + internal static bool radialMenuEnabled = true; + internal static bool player_esp = false; + internal static bool player_skel_esp = false; + internal static bool player_snapline = false; + internal static bool azazel_esp = false; + internal static bool azazel_skel_esp = false; + internal static bool azazel_snapline = false; + internal static bool item_esp => ESP.ItemESPConfig.ItemESP; + internal static bool goat_rat_esp => ESP.ItemESPConfig.GoatRatESP; + internal static bool demon_esp => ESP.ItemESPConfig.DemonESP; + internal static bool fullbright = false; + internal static bool need_fly_reset = false; + internal static bool crosshair = false; + internal static bool in_game_cache = false; + internal static bool showCoordinates = false; + internal static bool recallEnabled = false; + internal static bool instantInteraction = false; + public static bool InstantInteractionEnabled => instantInteraction; + public static bool godMode = false; + public static int godModeOriginalLayer = -1; - // Network variables - static int selectedRegion = 0; - static int lobbySize = 4; - static bool isPrivateLobby = false; + internal const int ITEM_FARM_REPEAT_COUNT = 5; + internal const float ITEM_FARM_DELAY = 0.15f; + internal static bool autoItemFarm = false; + internal static bool should_show_start_message = true; + internal static Texture2D? crosshairTexture = default!; + internal static string lastESPScene = string.Empty; - private static int frameCount = 0; - private static int lastMemoryLog = 0; - private const int GC_GEN0_INTERVAL = 300; - private const int GC_FULL_INTERVAL = 3600; - private const int MEMORY_LOG_INTERVAL = 1800; + internal static int selectedRegion = 0; + internal static int lobbySize = 4; + internal static bool isPrivateLobby = false; + + internal static int frameCount = 0; + internal static int lastMemoryLog = 0; + internal const int GC_GEN0_INTERVAL = 300; + internal const int GC_FULL_INTERVAL = 3600; + internal const int MEMORY_LOG_INTERVAL = 1800; public void Start() { @@ -96,2161 +95,42 @@ namespace DevourClient long startMemory = GC.GetTotalMemory(false); MelonLogger.Msg($"[Memory Monitor] Startup managed memory: {startMemory / 1024 / 1024} MB"); - crosshairTexture = Helpers.GUIHelper.GetCircularTexture(5, 5); + crosshairTexture = GUIHelper.GetCircularTexture(5, 5); - Helpers.Entities.StartAllCoroutines(); + Entities.StartAllCoroutines(); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetLocalPlayer())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetGoatsAndRats())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetSurvivalInteractables())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetKeys())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetDemons())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetSpiders())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetGhosts())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetBoars())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetCorpses())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetCrows())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetLumps())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetDirtyHeads())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetAzazels())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetAllPlayers())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetMonkeys())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetDolls())); - Helpers.Entities.RegisterCoroutine(MelonCoroutines.Start(Helpers.Entities.GetCollectables())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetLocalPlayer())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetGoatsAndRats())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetSurvivalInteractables())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetKeys())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetDemons())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetSpiders())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetGhosts())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetBoars())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetCorpses())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetCrows())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetLumps())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetDirtyHeads())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetAzazels())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetAllPlayers())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetMonkeys())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetDolls())); + Entities.RegisterCoroutine(MelonCoroutines.Start(Entities.GetCollectables())); } public void Update() { - if (Input.GetKeyDown(KeyCode.Insert)) - { - try - { - Il2Cpp.GameUI gameUI = UnityEngine.Object.FindObjectOfType(); - if (Settings.Settings.menu_enable) - { - gameUI.HideMouseCursor(); - } - else - { - gameUI.ShowMouseCursor(); - } - } - catch { } - - Settings.Settings.menu_enable = !Settings.Settings.menu_enable; - } - - if (Player.IsInGame()) - { - if (flashlight_toggle && !fullbright) - { - Hacks.Misc.BigFlashlight(false); - } - else if (!flashlight_toggle && !fullbright) - { - Hacks.Misc.BigFlashlight(true); - } - - if (fullbright && !flashlight_toggle) - { - Hacks.Misc.Fullbright(false); - } - else if (!fullbright && !flashlight_toggle) - { - Hacks.Misc.Fullbright(true); - } - - if (_IsAutoRespawn && Helpers.Player.IsPlayerCrawling()) - { - Hacks.Misc.AutoRespawn(); - } - - if (crosshair && !in_game_cache) - { - in_game_cache = true; - } - } - else - { - - if (crosshair && in_game_cache) - { - in_game_cache = false; - } - } - - if (spoofLevel) - { - Hacks.Misc.SetRank((int)spoofLevelValue); - } - - if (Input.GetKeyDown(Settings.Settings.flyKey)) - { - fly = !fly; - } - - // Z-key radial menu logic is managed by RadialMenuManager - RadialMenuManager.Enabled = radialMenuEnabled; - RadialMenuManager.HandleUpdate(); - - if (Player.IsInGameOrLobby()) - { - if (fly && !need_fly_reset) - { - Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); - if (nb) - { - Collider coll = nb.GetComponentInChildren(); - if (coll) - { - coll.enabled = false; - need_fly_reset = true; - } - } - } - - else if (!fly && need_fly_reset) - { - Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); - if (nb) - { - Collider coll = nb.GetComponentInChildren(); - if (coll) - { - coll.enabled = true; - need_fly_reset = false; - } - } - } - - if (fly) - { - Hacks.Misc.Fly(fly_speed); - } - - } - - if (Helpers.Map.GetActiveScene() == "Menu") - { - Hacks.Misc.WalkInLobby(_walkInLobby); - } - - if (fastMove) - { - try - { - Helpers.Entities.LocalPlayer_.p_GameObject.GetComponent().TimeScale = _PlayerSpeedMultiplier; - } - catch { return; } - } - - - frameCount++; - - if (frameCount % GC_GEN0_INTERVAL == 0) - { - GC.Collect(0, GCCollectionMode.Optimized); - } - - if (frameCount % GC_FULL_INTERVAL == 0) - { - GC.Collect(); - GC.WaitForPendingFinalizers(); - GC.Collect(); - frameCount = 0; - } - - if (frameCount - lastMemoryLog >= MEMORY_LOG_INTERVAL) - { - long memoryUsed = GC.GetTotalMemory(false); - MelonLogger.Msg($"[Memory Monitor] Current managed memory: {memoryUsed / 1024 / 1024} MB | Frame: {frameCount}"); - lastMemoryLog = frameCount; - } + ClientRuntime.Tick(); } public void OnGUI() { - string currentScene = Helpers.Map.GetActiveScene(); - if (currentScene != lastESPScene) - { - ESP.ItemESPConfig.ResetAllStates(); - lastESPScene = currentScene; - } - - if (should_show_start_message) - { - if (DevourClient.Hacks.Misc.ShowMessageBox("Welcome to DevourClient.\n\nPress the INS key to open the menu.") == 0) - should_show_start_message = false; - } - - Color originalBackgroundColor = GUI.backgroundColor; - GUISkin originalSkin = GUI.skin; - - try - { - GUI.backgroundColor = Color.grey; - - GUI.skin.button.normal.background = GUIHelper.MakeTex(2, 2, Color.black); - GUI.skin.button.normal.textColor = Color.white; - GUI.skin.button.hover.background = GUIHelper.MakeTex(2, 2, Color.green); - GUI.skin.button.hover.textColor = Color.black; - - GUI.skin.toggle.onNormal.textColor = Color.yellow; - - GUI.skin.textField.normal.background = GUIHelper.MakeTex(2, 2, new Color(0.2f, 0.2f, 0.2f, 0.8f)); - GUI.skin.textField.normal.textColor = Color.white; - GUI.skin.textField.focused.background = GUIHelper.MakeTex(2, 2, new Color(0.3f, 0.5f, 0.3f, 0.9f)); - GUI.skin.textField.focused.textColor = Color.white; - GUI.skin.textField.hover.background = GUIHelper.MakeTex(2, 2, new Color(0.25f, 0.25f, 0.25f, 0.85f)); - GUI.skin.textField.border = new RectOffset(4, 4, 4, 4); - GUI.skin.textField.padding = new RectOffset(6, 6, 4, 4); - GUI.skin.textField.fontSize = 14; - GUI.skin.textField.alignment = TextAnchor.MiddleLeft; - - GUI.skin.label.normal.textColor = Color.white; - - GUI.skin.horizontalSlider.normal.background = GUIHelper.MakeTex(2, 2, new Color(0.3f, 0.3f, 0.3f, 0.8f)); - GUI.skin.horizontalSliderThumb.normal.background = GUIHelper.MakeTex(2, 2, Color.white); - - if (UnityEngine.Event.current.type == EventType.Repaint) - { - if (player_esp || player_snapline || player_skel_esp) - { - foreach (Helpers.BasePlayer p in Helpers.Entities.Players) - { - if (p == null) - { - continue; - } - - GameObject player = p.p_GameObject; - if (player != null) - { - Il2Cpp.NolanBehaviour nb = player.GetComponent(); - if (nb.entity.IsOwner) - { - continue; - } - - if (player_skel_esp) - { - Render.Render.DrawAllBones(Hacks.Misc.GetAllBones(nb.animator), Settings.Settings.player_esp_color); - } - - Render.Render.DrawBoxESP(player, -0.25f, 1.75f, p.Name, Settings.Settings.player_esp_color, player_snapline, player_esp); - } - } - } - - // Goat/Rat ESP - now using separate ESP type filtering - if (goat_rat_esp) - { - foreach (Il2Cpp.GoatBehaviour goat in Helpers.Entities.GoatsAndRats) - { - if (goat != null) - { - string itemName = goat.name.Replace("Survival", "").Replace("(Clone)", ""); - - // Check if ESP should be shown for this item - if (ESP.ItemESPConfig.ShouldShowESP(itemName)) - { - string translatedName = MultiLanguageSystem.Translate(itemName); - Render.Render.DrawNameESP(goat.transform.position, translatedName, new Color(0.94f, 0.61f, 0.18f, 1.0f)); - } - } - } - } - - // Item ESP - now using separate ESP type filtering - if (item_esp) - { - foreach (Il2Cpp.SurvivalInteractable obj in Helpers.Entities.SurvivalInteractables) - { - if (obj != null) - { - string itemName = obj.prefabName.Replace("Survival", ""); - - // Check if ESP should be shown for this item - if (ESP.ItemESPConfig.ShouldShowESP(itemName)) - { - string translatedName = MultiLanguageSystem.Translate(itemName); - Render.Render.DrawNameESP(obj.transform.position, translatedName, new Color(1.0f, 1.0f, 1.0f)); - } - } - } - - foreach (Il2Cpp.KeyBehaviour key in Helpers.Entities.Keys) - { - if (key != null) - { - // Check if ESP should be shown for keys - if (ESP.ItemESPConfig.ShouldShowESP("Key")) - { - string translatedName = MultiLanguageSystem.Translate("Key"); - Render.Render.DrawNameESP(key.transform.position, translatedName, new Color(1.0f, 1.0f, 1.0f)); - } - } - } - } - - // Collectables ESP - render all collectable items with maxdistance check - // Note: Collectables ESP is independent of item_esp, check directly - if (Helpers.Entities.Collectables != null) - { - // Check if Collectables ESP is enabled - if (ESP.ItemESPConfig.GetESPState(ESP.ItemESPConfig.ESPType.Collectables)) - { - // Get player position for distance calculation - Vector3 playerPosition = Vector3.zero; - if (Camera.main != null) - { - playerPosition = Camera.main.transform.position; - } - else if (Player.GetPlayer() != null) - { - playerPosition = Player.GetPlayer().transform.position; - } - - foreach (Il2Cpp.CollectableInteractable collectable in Helpers.Entities.Collectables) - { - if (collectable != null && collectable.gameObject != null) - { - string itemName = collectable.gameObject.name.Replace("Survival", "").Replace("(Clone)", "").Trim(); - - // Get display name based on collectable type - string displayName = ""; - Color espColor = new Color(1.0f, 0.84f, 0.0f, 1.0f); // Gold color for all collectables - - // Determine collectable type and set display name - string lowerName = itemName.ToLower(); - if (lowerName.Contains("rose") || lowerName.Contains("collectable")) - { - displayName = MultiLanguageSystem.Translate("Rose"); - } - else if (lowerName.Contains("patch")) - { - displayName = MultiLanguageSystem.Translate("Patch"); - } - else if (lowerName.Contains("cherry") || lowerName.Contains("blossom")) - { - displayName = MultiLanguageSystem.Translate("Cherry Blossom"); - } - else if (lowerName.Contains("horseshoe")) - { - displayName = MultiLanguageSystem.Translate("Horseshoe"); - } - else if (lowerName.Contains("barbed") || lowerName.Contains("wire")) - { - displayName = MultiLanguageSystem.Translate("Barbed Wire"); - } - else if (lowerName.Contains("feather")) - { - displayName = MultiLanguageSystem.Translate("Feather"); - } - else if (lowerName.Contains("ticket")) - { - displayName = MultiLanguageSystem.Translate("Ticket"); - } - else if (lowerName.Contains("pumpkin")) - { - displayName = MultiLanguageSystem.Translate("Pumpkin"); - } - else if (lowerName.Contains("present")) - { - displayName = MultiLanguageSystem.Translate("Present"); - } - else - { - displayName = itemName; - } - - if (!string.IsNullOrEmpty(displayName)) - { - Render.Render.DrawNameESP(collectable.transform.position, displayName, espColor); - } - } - } - } - } - - // Enemy ESP - now using separate ESP type filtering - if (demon_esp) - { - // Demon (Farmhouse) - foreach (Il2Cpp.SurvivalDemonBehaviour demon in Helpers.Entities.Demons) - { - if (demon != null) - { - string enemyName = demon.name.Replace("Survival", "").Replace("(Clone)", ""); - - // Check if ESP should be shown for this enemy - if (ESP.ItemESPConfig.ShouldShowESP(enemyName)) - { - string translatedName = MultiLanguageSystem.Translate(enemyName); - Render.Render.DrawNameESP(demon.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); - } - } - } - - // Spider (Inn) - foreach (Il2Cpp.SpiderBehaviour spider in Helpers.Entities.Spiders) - { - if (spider != null && ESP.ItemESPConfig.ShouldShowESP("Spider")) - { - string translatedName = MultiLanguageSystem.Translate("Spider"); - Render.Render.DrawNameESP(spider.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); - } - } - - // Ghost (Town) - foreach (Il2Cpp.GhostBehaviour ghost in Helpers.Entities.Ghosts) - { - if (ghost != null && ESP.ItemESPConfig.ShouldShowESP("Ghost")) - { - string translatedName = MultiLanguageSystem.Translate("Ghost"); - Render.Render.DrawNameESP(ghost.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); - } - } - - // Boar/Pig (Slaughterhouse) - foreach (Il2Cpp.BoarBehaviour boar in Helpers.Entities.Boars) - { - if (boar != null && ESP.ItemESPConfig.ShouldShowESP("Boar")) - { - string translatedName = MultiLanguageSystem.Translate("Boar"); - Render.Render.DrawNameESP(boar.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); - } - } - - // Corpse (Slaughterhouse) - foreach (Il2Cpp.CorpseBehaviour corpse in Helpers.Entities.Corpses) - { - if (corpse != null && ESP.ItemESPConfig.ShouldShowESP("Corpse")) - { - string translatedName = MultiLanguageSystem.Translate("Corpse"); - Render.Render.DrawNameESP(corpse.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); - } - } - - // Crow (Manor) - foreach (Il2Cpp.CrowBehaviour crow in Helpers.Entities.Crows) - { - if (crow != null && ESP.ItemESPConfig.ShouldShowESP("Crow")) - { - string translatedName = MultiLanguageSystem.Translate("Crow"); - Render.Render.DrawNameESP(crow.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); - } - } - - // Lump (Manor) - foreach (Il2Cpp.ManorLumpController lump in Helpers.Entities.Lumps) - { - if (lump != null && ESP.ItemESPConfig.ShouldShowESP("Lump")) - { - string translatedName = MultiLanguageSystem.Translate("Lump"); - Render.Render.DrawNameESP(lump.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); - } - } - - // DirtyHead (Manor) - foreach (Il2Cpp.GoatBehaviour dirtyHead in Helpers.Entities.DirtyHeads) - { - if (dirtyHead != null && ESP.ItemESPConfig.ShouldShowESP("DirtyHead")) - { - string translatedName = MultiLanguageSystem.Translate("DirtyHead"); - Render.Render.DrawNameESP(dirtyHead.transform.position, translatedName, new Color(0.94f, 0.61f, 0.18f, 1.0f)); - } - } - - // Monkey (Carnival) - foreach (Il2Cpp.MonkeyBehaviour monkey in Helpers.Entities.Monkeys) - { - if (monkey != null && ESP.ItemESPConfig.ShouldShowESP("Monkey")) - { - string translatedName = MultiLanguageSystem.Translate("Monkey"); - Render.Render.DrawNameESP(monkey.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); - } - } - - // Doll (Carnival) - foreach (Il2Cpp.GoatBehaviour doll in Helpers.Entities.Dolls) - { - if (doll != null) - { - string itemName = doll.name.Replace("Survival", "").Replace("(Clone)", ""); - - // Check if ESP should be shown for Doll - if (ESP.ItemESPConfig.ShouldShowESP(itemName)) - { - string translatedName = MultiLanguageSystem.Translate(itemName); - Render.Render.DrawNameESP(doll.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); - } - } - } - } - - if (azazel_esp || azazel_snapline || azazel_skel_esp) - { - foreach (Il2Cpp.SurvivalAzazelBehaviour survivalAzazel in Helpers.Entities.Azazels) - { - if (survivalAzazel != null) - { - if (azazel_skel_esp) - { - Render.Render.DrawAllBones(Hacks.Misc.GetAllBones(survivalAzazel.animator), Settings.Settings.azazel_esp_color); - } - - string translatedName = MultiLanguageSystem.Translate("Azazel"); - Render.Render.DrawBoxESP(survivalAzazel.gameObject, -0.25f, 2.0f, translatedName, Settings.Settings.azazel_esp_color, azazel_snapline, azazel_esp); - } - } - } - - // End of EventType.Repaint branch - } - - if (crosshair && in_game_cache) - { - const float crosshairSize = 4f; - - float xMin = Settings.Settings.width - (crosshairSize / 2f); - float yMin = Settings.Settings.height - (crosshairSize / 2f); - - if (crosshairTexture == null) - { - crosshairTexture = Helpers.GUIHelper.GetCircularTexture(5, 5); - } - - GUI.DrawTexture(new Rect(xMin, yMin, crosshairSize, crosshairSize), crosshairTexture); - } - - // Radial menu rendering - RadialMenuManager.HandleOnGUI(); - - if (Settings.Settings.menu_enable) - { - windowRect = GUI.Window(0, windowRect, (GUI.WindowFunction)Tabs, "DevourClient"); - } - } - catch (System.Exception ex) - { - MelonLogger.Msg($"OnGUI Error: {ex.Message}"); - } - finally - { - GUI.backgroundColor = originalBackgroundColor; - GUI.skin = originalSkin; - } + ClientMenu.Draw(); } - public static void Tabs(int windowID) + internal static void HandleItemCarry(string carryObjectName) { - GUILayout.BeginHorizontal(); - - if (GUILayout.Button(MultiLanguageSystem.Translate("Visuals"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F1)) - { - current_tab = CurrentTab.Visuals; - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Entities"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F2)) - { - current_tab = CurrentTab.Entities; - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Map"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F3)) - { - current_tab = CurrentTab.Map; - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("ESP"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F4)) - { - current_tab = CurrentTab.ESP; - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Items"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F5)) - { - current_tab = CurrentTab.Items; - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Misc"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F6)) - { - current_tab = CurrentTab.Misc; - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Players"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F7)) - { - current_tab = CurrentTab.Players; - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Network"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F8)) - { - current_tab = CurrentTab.Network; - } - - GUILayout.EndHorizontal(); - - switch (current_tab) - { - case CurrentTab.Visuals: - VisualsTab(); - break; - case CurrentTab.Entities: - EntitiesTab(); - break; - case CurrentTab.Map: - MapSpecificTab(); - break; - case CurrentTab.ESP: - EspTab(); - break; - case CurrentTab.Items: - ItemsTab(); - break; - case CurrentTab.Misc: - MiscTab(); - break; - case CurrentTab.Players: - PlayersTab(); - break; - case CurrentTab.Network: - NetworkTab(); - break; - - } - - GUI.DragWindow(); - } - - private static void VisualsTab() - { - // draw visuals - - flashlight_toggle = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 120, 30), flashlight_toggle, MultiLanguageSystem.Translate("Big Flashlight")); - fullbright = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 100, 120, 30), fullbright, MultiLanguageSystem.Translate("Fullbright")); - unlimitedUV = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 130, 130, 30), unlimitedUV, MultiLanguageSystem.Translate("Unlimited UV Light")); - crosshair = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 160, 130, 30), crosshair, MultiLanguageSystem.Translate("Crosshair")); - - - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 190, 130, 30), MultiLanguageSystem.Translate("Flashlight Color"))) - { - flashlight_colorpick = !flashlight_colorpick; - MelonLogger.Msg("Flashlight color picker : " + flashlight_colorpick.ToString()); - - } - - if (flashlight_colorpick) - { - Color flashlight_color_input = DevourClient.Helpers.GUIHelper.ColorPick(MultiLanguageSystem.Translate("Flashlight Color"), Settings.Settings.flashlight_color); - Settings.Settings.flashlight_color = flashlight_color_input; - - if (Player.IsInGame()) - { - Hacks.Misc.FlashlightColor(flashlight_color_input); - } - } - } - - private static void EntitiesTab() - { - //draw entities - - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 130, 30), MultiLanguageSystem.Translate("TP items to you"))) - { - Hacks.Misc.TPItems(); - MelonLogger.Msg("TP Items!"); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 110, 130, 30), MultiLanguageSystem.Translate("Freeze azazel"))) - { - Hacks.Misc.FreezeAzazel(); - } - - GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 150, 120, 30), MultiLanguageSystem.Translate("Azazel & Demons")); - - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("Sam")) && Player.IsInGameOrLobby() && BoltNetwork.IsServer) - { - Hacks.Misc.SpawnAzazel((PrefabId)BoltPrefabs.AzazelSam); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 80, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("SurvivalMolly")) && Player.IsInGameOrLobby() && BoltNetwork.IsServer) - { - Hacks.Misc.SpawnAzazel((PrefabId)BoltPrefabs.SurvivalAzazelMolly); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 150, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("Anna")) && Player.IsInGameOrLobby() && BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalAnnaNew, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 220, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("Zara")) && Player.IsInGameOrLobby() && BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.AzazelZara, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 290, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("SurvivalNathan")) && Player.IsInGameOrLobby() && BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.AzazelNathan, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 360, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("SurvivalApril")) && Player.IsInGameOrLobby() && BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.AzazelApril, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 430, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("SurvivalKai")) && Player.IsInGameOrLobby() && BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.AzazelKai, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Ghost")) && Player.IsInGameOrLobby() && BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.Ghost, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 80, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Inmate")) && Player.IsInGameOrLobby() && BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalInmate, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 150, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Demon")) && Player.IsInGameOrLobby() && BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalDemon, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 220, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Boar")) && Player.IsInGameOrLobby() && BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.Boar, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 290, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Corpse")) && BoltNetwork.IsServer && Player.IsInGameOrLobby()) - { - BoltNetwork.Instantiate(BoltPrefabs.Corpse, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 360, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Crow")) && BoltNetwork.IsServer && Player.IsInGameOrLobby()) - { - BoltNetwork.Instantiate(BoltPrefabs.Crow, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 430, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Lump")) && BoltNetwork.IsServer && Player.IsInGameOrLobby()) - { - BoltNetwork.Instantiate(BoltPrefabs.ManorLump, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 500, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Monkey")) && BoltNetwork.IsServer && Player.IsInGameOrLobby()) - { - BoltNetwork.Instantiate(BoltPrefabs.Monkey, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 260, 60, 25), MultiLanguageSystem.Translate("Rat"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalRat, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (Player.IsInGame() && !Player.IsPlayerCrawling()) - { - Hacks.Misc.CarryObject("SurvivalRat"); - } - } - - if (GUI.Button(new Rect(Settings.Settings.x + 80, Settings.Settings.y + 260, 60, 25), MultiLanguageSystem.Translate("Goat"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalGoat, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (Player.IsInGame() && !Player.IsPlayerCrawling()) - { - Hacks.Misc.CarryObject("SurvivalGoat"); - } - } - - if (GUI.Button(new Rect(Settings.Settings.x + 150, Settings.Settings.y + 260, 60, 25), MultiLanguageSystem.Translate("Spider")) && BoltNetwork.IsServer && Player.IsInGameOrLobby()) - { - BoltNetwork.Instantiate(BoltPrefabs.Spider, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 220, Settings.Settings.y + 260, 60, 25), MultiLanguageSystem.Translate("Pig"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalPig, Player.GetPlayer().transform.position, Quaternion.identity); - } - - if (Player.IsInGame() && !Player.IsPlayerCrawling()) - { - Hacks.Misc.CarryObject("SurvivalPig"); - } - } - } - - private static void MapSpecificTab() - { - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("Instant Win")) && Player.IsInGame() && BoltNetwork.IsSinglePlayer) - { - Hacks.Misc.InstantWin(); - MelonLogger.Msg("EZ Win"); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Burn a ritual object"))) - { - Hacks.Misc.BurnRitualObj(Helpers.Map.GetActiveScene(), false); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 150, 150, 30), MultiLanguageSystem.Translate("Burn all ritual objects"))) - { - Hacks.Misc.BurnRitualObj(Helpers.Map.GetActiveScene(), true); - } - - switch (Helpers.Map.GetActiveScene()) - { - case "Menu": - // Force Start Game button removed - only available in Network tab - break; - - case "Devour": - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) - { - try - { - Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); - - nb.TeleportTo(Helpers.Map.GetAzazel().transform.position, Quaternion.identity); - } - catch - { - MelonLogger.Msg("Azazel not found !"); - } - } - - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Despawn Demons"))) - { - Hacks.Misc.DespawnDemons(); - } - break; - case "Molly": - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) - { - try - { - Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); - - nb.TeleportTo(Helpers.Map.GetAzazel().transform.position, Quaternion.identity); - } - catch - { - MelonLogger.Msg("Azazel not found !"); - } - } - - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Despawn Inmates"))) - { - Hacks.Misc.DespawnDemons(); - } - break; - case "Inn": - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) - { - try - { - Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); - - nb.TeleportTo(Helpers.Map.GetAzazel().transform.position, Quaternion.identity); - } - catch - { - MelonLogger.Msg("Azazel not found !"); - } - } - - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Clean The Fountains"))) - { - Hacks.Misc.CleanFountain(); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 150, 150, 30), MultiLanguageSystem.Translate("Despawn Spiders"))) - { - Hacks.Misc.DespawnSpiders(); - } - break; - - case "Town": - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) - { - try - { - Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); - - nb.TeleportTo(Helpers.Map.GetAzazel().transform.position, Quaternion.identity); - } - catch - { - MelonLogger.Msg("Azazel not found !"); - } - } - - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Despawn Ghosts"))) - { - Hacks.Misc.DespawnGhosts(); - } - break; - - case "Slaughterhouse": - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) - { - try - { - Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); - - nb.TeleportTo(Helpers.Map.GetAzazel().transform.position, Quaternion.identity); - } - catch - { - MelonLogger.Msg("Azazel not found !"); - } - } - - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Despawn Boars"))) - { - Hacks.Misc.DespawnBoars(); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 150, 150, 30), MultiLanguageSystem.Translate("Despawn Corpses"))) - { - Hacks.Misc.DespawnCorpses(); - } - break; - - case "Manor": - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) - { - try - { - Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); - - nb.TeleportTo(Helpers.Map.GetAzazel().transform.position, Quaternion.identity); - } - catch - { - MelonLogger.Msg("Azazel not found !"); - } - } - - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Despawn Crows"))) - { - Hacks.Misc.DespawnCrows(); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 150, 150, 30), MultiLanguageSystem.Translate("Despawn Lumps"))) - { - Hacks.Misc.DespawnLumps(); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 370, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("Switch realm"))) - { - Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); - Vector3 pos = nb.transform.position; - - ManorDeadRealmTrigger realm = Il2Cpp.ManorDeadRealmTrigger.FindObjectOfType(); - if (realm == null) - { - MelonLogger.Warning("realm was null."); - return; - } - - if (realm.IsInDeadRealm) - { - // normal dimension - pos.x += 150f;// -10.216758f; - //pos.y = 0.009999979f; - //pos.z = -7.632657f; - - } - else - { - // other dimension - pos.x -= 150f;//-160.03688f; - //pos.y = 0.010014875f; - //pos.z = -7.5686994f; - } - - nb.locomotion.SetPosition(pos, false); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 370, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Switch realm (house)"))) - { - Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); - Vector3 pos = nb.transform.position; - - ManorDeadRealmTrigger realm = Il2Cpp.ManorDeadRealmTrigger.FindObjectOfType(); - if (realm == null) - { - MelonLogger.Warning("realm was null."); - return; - } - - if (realm.IsInDeadRealm) - { - // normal dimension - pos.x = -10.216758f; - pos.y = 0.009999979f; - pos.z = -7.632657f; - - } - else - { - // other dimension - pos.x = -160.03688f; - pos.y = 0.010014875f; - pos.z = -7.5686994f; - } - - nb.locomotion.SetPosition(pos, false); - } - - infinite_mirrors = GUI.Toggle(new Rect(Settings.Settings.x + 370, Settings.Settings.y + 150, 150, 20), infinite_mirrors, MultiLanguageSystem.Translate("Infinite mirrors")); - break; - - case "Carnival": - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) - { - try - { - Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); - - nb.TeleportTo(Helpers.Map.GetAzazel().transform.position, Quaternion.identity); - } - catch - { - MelonLogger.Msg("Azazel not found !"); - } - } - - if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Despawn Monkeys"))) - { - Hacks.Misc.DespawnMonkeys(); - } - break; - } - - GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 210, 100, 30), MultiLanguageSystem.Translate("Load Map:")); - - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 240, 90, 30), MultiLanguageSystem.Translate("Farmhouse")) && BoltNetwork.IsServer) - { - Helpers.Map.LoadMap("Devour"); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 110, Settings.Settings.y + 240, 90, 30), MultiLanguageSystem.Translate("Asylum")) && BoltNetwork.IsServer) - { - Helpers.Map.LoadMap("Molly"); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 210, Settings.Settings.y + 240, 90, 30), MultiLanguageSystem.Translate("Inn")) && BoltNetwork.IsServer) - { - Helpers.Map.LoadMap("Inn"); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 310, Settings.Settings.y + 240, 90, 30), MultiLanguageSystem.Translate("Town")) && BoltNetwork.IsServer) - { - Helpers.Map.LoadMap("Town"); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 280, 90, 30), MultiLanguageSystem.Translate("Slaughterhouse")) && BoltNetwork.IsServer) - { - Helpers.Map.LoadMap("Slaughterhouse"); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 110, Settings.Settings.y + 280, 90, 30), MultiLanguageSystem.Translate("Manor")) && BoltNetwork.IsServer) - { - Helpers.Map.LoadMap("Manor"); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 210, Settings.Settings.y + 280, 90, 30), MultiLanguageSystem.Translate("Carnival")) && BoltNetwork.IsServer) - { - Helpers.Map.LoadMap("Carnival"); - } - - } - - private static void EspTab() - { - player_esp = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 150, 20), player_esp, MultiLanguageSystem.Translate("Player ESP")); - player_skel_esp = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 100, 150, 20), player_skel_esp, MultiLanguageSystem.Translate("Skeleton ESP")); - player_snapline = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 130, 150, 20), player_snapline, MultiLanguageSystem.Translate("Player Snapline")); - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 160, 130, 30), MultiLanguageSystem.Translate("Player ESP Color"))) - { - player_esp_colorpick = !player_esp_colorpick; - } - - if (player_esp_colorpick) - { - Color player_esp_color_input = GUIHelper.ColorPick(MultiLanguageSystem.Translate("Player ESP Color"), Settings.Settings.player_esp_color); - Settings.Settings.player_esp_color = player_esp_color_input; - } - - azazel_esp = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 200, 150, 20), azazel_esp, MultiLanguageSystem.Translate("Azazel ESP")); - azazel_skel_esp = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 230, 150, 20), azazel_skel_esp, MultiLanguageSystem.Translate("Skeleton ESP")); - azazel_snapline = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 260, 150, 20), azazel_snapline, MultiLanguageSystem.Translate("Azazel Snapline")); - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 290, 130, 30), MultiLanguageSystem.Translate("Azazel ESP Color"))) - { - azazel_esp_colorpick = !azazel_esp_colorpick; - } - - if (azazel_esp_colorpick) - { - Color azazel_esp_color_input = GUIHelper.ColorPick(MultiLanguageSystem.Translate("Azazel ESP Color"), Settings.Settings.azazel_esp_color); - Settings.Settings.azazel_esp_color = azazel_esp_color_input; - } - - // ESP panel moved to the right, dynamically displayed based on map - DrawESPPanel(); - } - - /// - /// Draw dynamic ESP panel - display corresponding item types based on current map - /// - private static void DrawESPPanel() - { - string currentScene = Helpers.Map.GetActiveScene(); - - // Get ESP types supported by current map - List espTypes = ESP.ItemESPConfig.GetMapESPTypes(currentScene); - - // Don't display panel if in menu scene or no available ESP types - if (espTypes.Count == 0 && currentScene != "Menu") - { - // Even if no map-specific ESP types, show collectables - espTypes = new List(); - } - - // Right side panel position - float panelX = Settings.Settings.x + 370; - float panelY = Settings.Settings.y + 70; - float panelWidth = 180; - float itemHeight = 30; - float padding = 5; - - // Draw title - GUI.Label(new Rect(panelX, panelY, panelWidth, 25), - MultiLanguageSystem.Translate("ESP Settings"), - GUI.skin.box); - - // Draw map-specific ESP toggle list - float yOffset = panelY + 30; - if (espTypes.Count > 0) - { - foreach (var espType in espTypes) - { - string displayName = ESP.ItemESPConfig.GetESPTypeName(espType); - string translatedName = MultiLanguageSystem.Translate(displayName); - - bool currentState = ESP.ItemESPConfig.GetESPState(espType); - bool newState = GUI.Toggle( - new Rect(panelX + padding, yOffset, panelWidth - padding * 2, itemHeight - padding), - currentState, - translatedName - ); - - if (newState != currentState) - { - ESP.ItemESPConfig.SetESPState(espType, newState); - } - - yOffset += itemHeight; - } - - // Add separator before collectables - yOffset += 5; - GUI.Label(new Rect(panelX + padding, yOffset, panelWidth - padding * 2, 20), - "─────────", - new GUIStyle(GUI.skin.label) { alignment = TextAnchor.MiddleCenter }); - yOffset += 20; - } - - // Draw unified collectables ESP toggle (always available) - bool collectablesCurrentState = ESP.ItemESPConfig.GetESPState(ESP.ItemESPConfig.ESPType.Collectables); - bool collectablesNewState = GUI.Toggle( - new Rect(panelX + padding, yOffset, panelWidth - padding * 2, itemHeight - padding), - collectablesCurrentState, - MultiLanguageSystem.Translate("Collectables ESP") - ); - - if (collectablesNewState != collectablesCurrentState) - { - ESP.ItemESPConfig.SetESPState(ESP.ItemESPConfig.ESPType.Collectables, collectablesNewState); - } - yOffset += itemHeight; - - // Display current map name (debug info) - if (currentScene != "Menu") - { - string mapDisplayName = Helpers.Map.GetMapName(currentScene); - GUI.Label( - new Rect(panelX, yOffset + 10, panelWidth, 20), - $"Map: {mapDisplayName}", - new GUIStyle(GUI.skin.label) { fontSize = 10, alignment = TextAnchor.MiddleCenter } - ); - } - } - - private static void ItemsTab() - { - GUILayout.BeginHorizontal(); - - GUILayout.BeginVertical(); - - GUILayout.Label(MultiLanguageSystem.Translate("Items")); - - Settings.Settings.itemsScrollPosition = GUILayout.BeginScrollView(Settings.Settings.itemsScrollPosition, GUILayout.Width(220), GUILayout.Height(190)); - - if (GUILayout.Button(MultiLanguageSystem.Translate("Hay"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalHay, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - HandleItemCarry("SurvivalHay"); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("First aid"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalFirstAid, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - HandleItemCarry("SurvivalFirstAid"); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Battery"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalBattery, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - HandleItemCarry("SurvivalBattery"); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Gasoline"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalGasoline, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - HandleItemCarry("SurvivalGasoline"); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Fuse"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalFuse, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - HandleItemCarry("SurvivalFuse"); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Food"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalRottenFood, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - HandleItemCarry("SurvivalRottenFood"); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Bone"))) - { - - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalBone, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - HandleItemCarry("SurvivalBone"); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Bleach"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalBleach, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - HandleItemCarry("SurvivalBleach"); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Matchbox"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalMatchbox, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - HandleItemCarry("Matchbox-3"); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Spade"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalSpade, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - HandleItemCarry("SurvivalSpade"); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Cake"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalCake, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - HandleItemCarry("SurvivalCake"); - } - } - if (GUILayout.Button(MultiLanguageSystem.Translate("MusicBox"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalMusicBox, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - HandleItemCarry("MusicBox-Idle"); - } - } - if (GUILayout.Button(MultiLanguageSystem.Translate("Coin"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalCoin, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - HandleItemCarry("SurvivalCoin"); - } - } - - - GUILayout.EndScrollView(); - autoItemFarm = GUILayout.Toggle(autoItemFarm, MultiLanguageSystem.Translate("Auto farm items (x5)")); - GUILayout.EndVertical(); - - GUILayout.BeginVertical(); - - GUILayout.Label(MultiLanguageSystem.Translate("Ritual Objects")); - - Settings.Settings.rituelObjectsScrollPosition = GUILayout.BeginScrollView(Settings.Settings.rituelObjectsScrollPosition, GUILayout.Width(220), GUILayout.Height(190)); - - if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-1"))) - { - Hacks.Misc.CarryObject("Egg-Clean-1"); - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-2"))) - { - Hacks.Misc.CarryObject("Egg-Clean-2"); - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-3"))) - { - Hacks.Misc.CarryObject("Egg-Clean-3"); - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-4"))) - { - Hacks.Misc.CarryObject("Egg-Clean-4"); - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-5"))) - { - Hacks.Misc.CarryObject("Egg-Clean-5"); - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-6"))) - { - Hacks.Misc.CarryObject("Egg-Clean-6"); - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-7"))) - { - Hacks.Misc.CarryObject("Egg-Clean-7"); - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-8"))) - { - Hacks.Misc.CarryObject("Egg-Clean-8"); - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-9"))) - { - Hacks.Misc.CarryObject("Egg-Clean-9"); - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-10"))) - { - Hacks.Misc.CarryObject("Egg-Clean-10"); - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Ritual Book"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalRitualBook, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - Hacks.Misc.CarryObject("RitualBook-Active-1"); - } - } - - // if (GUILayout.Button("Dirty head")) - // { - // if (BoltNetwork.IsServer && !Player.IsInGame()) - // { - // BoltNetwork.Instantiate(BoltPrefabs.SurvivalHead, Player.GetPlayer().transform.position, Quaternion.identity); - // } - // else - // { - // Hacks.Misc.CarryObject("SurvivalHead"); - // } - // } - - // if (GUILayout.Button("Clean head")) - // { - // if (BoltNetwork.IsServer && !Player.IsInGame()) - // { - // BoltNetwork.Instantiate(BoltPrefabs.SurvivalCleanHead, Player.GetPlayer().transform.position, Quaternion.identity); - // } - // else - // { - // Hacks.Misc.CarryObject("SurvivalCleanHead"); - // } - // } - if (GUILayout.Button(MultiLanguageSystem.Translate("DollHead"))) - { - if (BoltNetwork.IsServer && !Player.IsInGame()) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalDollHead, Player.GetPlayer().transform.position, Quaternion.identity); - } - else - { - Hacks.Misc.CarryObject("SurvivalDollHead"); - } - } - - GUILayout.EndScrollView(); - GUILayout.EndVertical(); - - GUILayout.BeginVertical(); - - GUILayout.Label(MultiLanguageSystem.Translate("Spawnable Prefabs")); - - Settings.Settings.stuffsScrollPosition = GUILayout.BeginScrollView(Settings.Settings.stuffsScrollPosition, GUILayout.Width(220), GUILayout.Height(190)); - - if (GUILayout.Button(MultiLanguageSystem.Translate("Animal_Gate"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.Animal_Gate, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("AsylumDoor"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.AsylumDoor, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("AsylumDoubleDoor"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.AsylumDoubleDoor, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("AsylumWhiteDoor"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.AsylumWhiteDoor, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - - if (GUILayout.Button(MultiLanguageSystem.Translate("DevourDoorBack"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.DevourDoorBack, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("DevourDoorMain"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.DevourDoorMain, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("DevourDoorRoom"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.DevourDoorRoom, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Elevator_Door"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.Elevator_Door, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("InnDoor"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.InnDoor, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("InnDoubleDoor"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.InnDoubleDoor, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("InnShojiDoor"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.InnShojiDoor, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("InnShrine"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.InnShrine, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("InnWardrobe"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.InnWardrobe, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("InnWoodenDoor"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.InnWoodenDoor, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("PigExcrement"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.PigExcrement, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("SlaughterhouseFireEscapeDoor"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SlaughterhouseFireEscapeDoor, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalAltarMolly"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalAltarMolly, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalAltarSlaughterhouse"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalAltarSlaughterhouse, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalAltarTown"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalAltarTown, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - - if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalCultist"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalCultist, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalKai"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalKai, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalNathan"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalNathan, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalMolly"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalMolly, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalApril"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalApril, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalFrank"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalFrank, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalRose"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalRose, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalSmashableWindow"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.SurvivalSmashableWindow, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("TownDoor"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.TownDoor, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("TownDoor2"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.TownDoor2, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("TownPentagram"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.TownPentagram, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("TrashCan"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.TrashCan, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Truck_Shutter"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.Truck_Shutter, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("TV"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.TV, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - if (GUILayout.Button(MultiLanguageSystem.Translate("Mirror"))) - { - if (BoltNetwork.IsServer) - { - BoltNetwork.Instantiate(BoltPrefabs.ManorMirror, Player.GetPlayer().transform.position, Quaternion.identity); - } - } - - GUILayout.EndScrollView(); - GUILayout.EndVertical(); - GUILayout.EndHorizontal(); - } - - private static void HandleItemCarry(string carryObjectName) - { - if (string.IsNullOrEmpty(carryObjectName)) - { - return; - } - - if (autoItemFarm && Player.IsInGame()) - { - MelonCoroutines.Start(ItemFarmRoutine(carryObjectName)); - return; - } - - Hacks.Misc.CarryObject(carryObjectName); - } - - private static IEnumerator ItemFarmRoutine(string carryObjectName) - { - for (int i = 0; i < ITEM_FARM_REPEAT_COUNT; i++) - { - Hacks.Misc.CarryObject(carryObjectName); - yield return new WaitForSeconds(ITEM_FARM_DELAY); - TryDropCarriedItem(carryObjectName); - yield return new WaitForSeconds(ITEM_FARM_DELAY); - } - } - - private static void TryDropCarriedItem(string carryObjectName) - { - Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); - if (nb == null) - { - return; - } - - try - { - nb.PlopObject(); - TrySpawnDroppedItem(carryObjectName, nb); - } - catch (Exception ex) - { - MelonLogger.Warning($"Failed to drop carried item: {ex.Message}"); - } - } - - private static void TrySpawnDroppedItem(string carryObjectName, Il2Cpp.NolanBehaviour nb) - { - // Only host should spawn world items - if (!BoltNetwork.IsServer || nb == null) - { - return; - } - - Vector3 dropPosition = nb.transform.position + nb.transform.forward * 1.5f; - Quaternion dropRotation = Quaternion.identity; - - try - { - switch (carryObjectName) - { - case "SurvivalHay": - BoltNetwork.Instantiate(BoltPrefabs.SurvivalHay, dropPosition, dropRotation); - break; - case "SurvivalFirstAid": - BoltNetwork.Instantiate(BoltPrefabs.SurvivalFirstAid, dropPosition, dropRotation); - break; - case "SurvivalBattery": - BoltNetwork.Instantiate(BoltPrefabs.SurvivalBattery, dropPosition, dropRotation); - break; - case "SurvivalGasoline": - BoltNetwork.Instantiate(BoltPrefabs.SurvivalGasoline, dropPosition, dropRotation); - break; - case "SurvivalFuse": - BoltNetwork.Instantiate(BoltPrefabs.SurvivalFuse, dropPosition, dropRotation); - break; - case "SurvivalRottenFood": - BoltNetwork.Instantiate(BoltPrefabs.SurvivalRottenFood, dropPosition, dropRotation); - break; - case "SurvivalBone": - BoltNetwork.Instantiate(BoltPrefabs.SurvivalBone, dropPosition, dropRotation); - break; - case "SurvivalBleach": - BoltNetwork.Instantiate(BoltPrefabs.SurvivalBleach, dropPosition, dropRotation); - break; - case "Matchbox-3": - BoltNetwork.Instantiate(BoltPrefabs.SurvivalMatchbox, dropPosition, dropRotation); - break; - case "SurvivalSpade": - BoltNetwork.Instantiate(BoltPrefabs.SurvivalSpade, dropPosition, dropRotation); - break; - case "SurvivalCake": - BoltNetwork.Instantiate(BoltPrefabs.SurvivalCake, dropPosition, dropRotation); - break; - case "MusicBox-Idle": - BoltNetwork.Instantiate(BoltPrefabs.SurvivalMusicBox, dropPosition, dropRotation); - break; - case "SurvivalCoin": - BoltNetwork.Instantiate(BoltPrefabs.SurvivalCoin, dropPosition, dropRotation); - break; - default: - // Unknown item type – don't try to spawn - break; - } - } - catch (Exception ex) - { - MelonLogger.Warning($"Failed to spawn dropped item '{carryObjectName}': {ex.Message}"); - } - } - - - private static void MiscTab() - { - GUI.Label(new Rect(Settings.Settings.x + 320, Settings.Settings.y + 70, 150, 20), "Language :"); - - string currentLanguageName = MultiLanguageSystem.GetLanguageDisplayName(Settings.Settings.selectedLanguage); - if (GUI.Button(new Rect(Settings.Settings.x + 320, Settings.Settings.y + 95, 150, 30), currentLanguageName)) - { - Settings.Settings.showLanguageSelector = !Settings.Settings.showLanguageSelector; - } - - if (Settings.Settings.showLanguageSelector) - { - DevourClient.Localization.Language[] allLanguages = MultiLanguageSystem.GetAllLanguages(); - float yOffset = 130; - - GUI.Box(new Rect(Settings.Settings.x + 320, Settings.Settings.y + yOffset - 5, 150, allLanguages.Length * 25 + 10), ""); - - foreach (DevourClient.Localization.Language lang in allLanguages) - { - string displayName = MultiLanguageSystem.GetLanguageDisplayName(lang); - if (GUI.Button(new Rect(Settings.Settings.x + 325, Settings.Settings.y + yOffset, 140, 20), displayName)) - { - Settings.Settings.selectedLanguage = lang; - MultiLanguageSystem.CurrentLanguage = lang; - Settings.Settings.showLanguageSelector = false; - MelonLogger.Msg($"Language changed to: {displayName}"); - } - yOffset += 25; - } - } - - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 140, 28), MultiLanguageSystem.Translate("Unlock Achievements"))) - { - Thread AchievementsThread = new Thread(new ThreadStart(Hacks.Unlock.Achievements)); - AchievementsThread.Start(); - - MelonLogger.Msg("Achievements unlocked!"); - Hacks.Misc.ShowMessageBox("Achievements unlocked!"); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 160, Settings.Settings.y + 70, 140, 28), MultiLanguageSystem.Translate("Unlock Doors"))) - { - Hacks.Unlock.Doors(); - - MelonLogger.Msg("Doors unlocked!"); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 108, 140, 28), MultiLanguageSystem.Translate("Teleport Keys")) && Player.IsInGame()) - { - Hacks.Misc.TPKeys(); - MelonLogger.Msg("Keys teleported!"); - } - - if (GUI.Button(new Rect(Settings.Settings.x + 160, Settings.Settings.y + 108, 140, 28), MultiLanguageSystem.Translate("Play Random Sound"))) - { - Hacks.Misc.PlaySound(); - MelonLogger.Msg("Playing random sound!"); - } - - _walkInLobby = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 155, 140, 20), _walkInLobby, MultiLanguageSystem.Translate("Walk In Lobby")); - _IsAutoRespawn = GUI.Toggle(new Rect(Settings.Settings.x + 160, Settings.Settings.y + 155, 140, 20), _IsAutoRespawn, MultiLanguageSystem.Translate("Auto Respawn")); - - fly = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 180, 100, 20), fly, MultiLanguageSystem.Translate("Fly")); - if (GUI.Button(new Rect(Settings.Settings.x + 120, Settings.Settings.y + 180, 60, 20), Settings.Settings.flyKey.ToString())) - { - Settings.Settings.flyKey = Settings.Settings.GetKey(); - } - GUI.Label(new Rect(Settings.Settings.x + 20, Settings.Settings.y + 205, 80, 20), MultiLanguageSystem.Translate("Fly Speed") + ":"); - fly_speed = GUI.HorizontalSlider(new Rect(Settings.Settings.x + 100, Settings.Settings.y + 210, 150, 10), fly_speed, 5f, 20f); - GUI.Label(new Rect(Settings.Settings.x + 260, Settings.Settings.y + 205, 50, 20), ((int)fly_speed).ToString()); - - spoofLevel = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 250, 200, 20), spoofLevel, MultiLanguageSystem.Translate("Spoof Level")); - GUI.Label(new Rect(Settings.Settings.x + 20, Settings.Settings.y + 275, 80, 20), MultiLanguageSystem.Translate("Level") + ":"); - spoofLevelValue = GUI.HorizontalSlider(new Rect(Settings.Settings.x + 100, Settings.Settings.y + 280, 150, 10), spoofLevelValue, 0f, 666f); - GUI.Label(new Rect(Settings.Settings.x + 260, Settings.Settings.y + 275, 50, 20), ((int)spoofLevelValue).ToString()); - - exp_modifier = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 310, 200, 20), exp_modifier, MultiLanguageSystem.Translate("Exp Modifier")); - GUI.Label(new Rect(Settings.Settings.x + 20, Settings.Settings.y + 335, 80, 20), MultiLanguageSystem.Translate("Exp Value") + ":"); - exp = GUI.HorizontalSlider(new Rect(Settings.Settings.x + 100, Settings.Settings.y + 340, 150, 10), exp, 1000f, 6000f); - GUI.Label(new Rect(Settings.Settings.x + 260, Settings.Settings.y + 335, 50, 20), ((int)exp).ToString()); - - fastMove = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 370, 200, 20), fastMove, MultiLanguageSystem.Translate("Fast Move")); - GUI.Label(new Rect(Settings.Settings.x + 20, Settings.Settings.y + 395, 100, 20), MultiLanguageSystem.Translate("Speed Multiplier") + ":"); - _PlayerSpeedMultiplier = GUI.HorizontalSlider(new Rect(Settings.Settings.x + 130, Settings.Settings.y + 400, 120, 10), _PlayerSpeedMultiplier, (int)1f, (int)10f); - GUI.Label(new Rect(Settings.Settings.x + 260, Settings.Settings.y + 395, 50, 20), ((int)_PlayerSpeedMultiplier).ToString()); - - showCoordinates = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 430, 200, 20), showCoordinates, MultiLanguageSystem.Translate("Show Coordinates")); - - radialMenuEnabled = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 455, 200, 20), radialMenuEnabled, MultiLanguageSystem.Translate("Radial Menu (Z)")); - - // Display player coordinates at the bottom of Misc tab - if (showCoordinates && Player.IsInGameOrLobby()) - { - try - { - Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); - if (nb != null && nb.transform != null) - { - Vector3 pos = nb.transform.position; - string coordText = $"Position: X:{pos.x:F2} Y:{pos.y:F2} Z:{pos.z:F2}"; - - // Display at the bottom of Misc tab - GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 485, 400, 30), coordText); - } - } - catch (System.Exception ex) - { - // Silently handle errors to avoid spam - } - } - - } - - private static void PlayersTab() - { - if (Helpers.Map.GetActiveScene() != "Menu") - { - GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("Players") + ":"); - int i = 0; - foreach (BasePlayer bp in Entities.Players) - { - // Silently skip invalid player objects (avoid frequent log output) - if (bp == null || bp.Name == "") - { - continue; - } - - GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 110 + i, 150, 30), bp.Name); - - // All buttons in one row - int buttonX = (int)Settings.Settings.x + 70; - int buttonY = (int)Settings.Settings.y + 105 + i; - - if (GUI.Button(new Rect(buttonX, buttonY, 70, 30), MultiLanguageSystem.Translate("Kill"))) - { - bp.Kill(); - } - buttonX += 80; - - if (GUI.Button(new Rect(buttonX, buttonY, 70, 30), MultiLanguageSystem.Translate("Revive"))) - { - if (bp.p_GameObject != null) - { - Il2Cpp.NolanBehaviour nb = bp.p_GameObject.GetComponent(); - if (nb != null) - { - ReviveHelper.TryRevive(nb); - } - } - } - buttonX += 80; - - if (GUI.Button(new Rect(buttonX, buttonY, 90, 30), MultiLanguageSystem.Translate("Jumpscare"))) - { - bp.Jumpscare(); - } - buttonX += 100; - - if (GUI.Button(new Rect(buttonX, buttonY, 80, 30), MultiLanguageSystem.Translate("Teleport to"))) - { - bp.TP(); - } - buttonX += 90; - - if (GUI.Button(new Rect(buttonX, buttonY, 100, 30), MultiLanguageSystem.Translate("Lock in cage"))) - { - bp.LockInCage(); - } - buttonX += 110; - - if (GUI.Button(new Rect(buttonX, buttonY, 90, 30), MultiLanguageSystem.Translate("TP Azazel"))) - { - bp.TPAzazel(); - } - buttonX += 100; - - if (Helpers.Map.GetActiveScene() == "Town") - { - if (GUI.Button(new Rect(buttonX, buttonY, 90, 30), MultiLanguageSystem.Translate("Shoot Player"))) - { - bp.ShootPlayer(); - } - } - - i += 45; - } - } - else - { - GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 300, 30), MultiLanguageSystem.Translate("Waiting for the game to start")); - } - } - - private static void NetworkTab() - { - int yOffset = 70; - int xBase = (int)Settings.Settings.x + 10; - int yBase = (int)Settings.Settings.y; - - // Network information display - GUI.Label(new Rect(xBase, yBase + yOffset, 300, 30), - MultiLanguageSystem.Translate("Network Info") + ": " + Network.NetworkHelper.GetRoomInfo()); - yOffset += 40; - - // Room management section - GUI.Label(new Rect(xBase, yBase + yOffset, 300, 30), - $"=== {MultiLanguageSystem.Translate("Lobby Manager")} ==="); - yOffset += 35; - - // Region selection - click to cycle through - GUI.Label(new Rect(xBase, yBase + yOffset, 100, 30), - MultiLanguageSystem.Translate("Region") + ":"); - - string[] regionDisplayNames = Network.RegionHelper.GetRegionDisplayNames(); - - // Click button to cycle through regions - if (GUI.Button(new Rect(xBase + 110, yBase + yOffset, 200, 30), regionDisplayNames[selectedRegion])) - { - selectedRegion = (selectedRegion + 1) % regionDisplayNames.Length; - } - - yOffset += 40; - - // Room player limit - GUI.Label(new Rect(xBase, yBase + yOffset, 100, 30), - MultiLanguageSystem.Translate("Lobby Size") + ":"); - lobbySize = (int)GUI.HorizontalSlider(new Rect(xBase + 110, yBase + yOffset + 5, 120, 20), lobbySize, 1, 64); - GUI.Label(new Rect(xBase + 240, yBase + yOffset, 50, 30), lobbySize.ToString()); - yOffset += 35; - - // Private room option - isPrivateLobby = GUI.Toggle(new Rect(xBase, yBase + yOffset, 200, 30), - isPrivateLobby, MultiLanguageSystem.Translate("Private Lobby")); - yOffset += 35; - - // Create room button - if (GUI.Button(new Rect(xBase, yBase + yOffset, 300, 40), - MultiLanguageSystem.Translate("Create Lobby"))) - { - string regionCode = Network.RegionHelper.GetRegionCodeByIndex(selectedRegion); - Network.LobbyManager.CreateLobby(regionCode, lobbySize, isPrivateLobby); - } - yOffset += 50; - - // Lobby control section - GUI.Label(new Rect(xBase, yBase + yOffset, 300, 30), - $"=== {MultiLanguageSystem.Translate("Lobby Control")} ==="); - yOffset += 35; - - // Force start button (host only) - bool isHost = Network.NetworkHelper.IsHost(); - GUI.enabled = isHost; - if (GUI.Button(new Rect(xBase, yBase + yOffset, 300, 35), - MultiLanguageSystem.Translate("Force Start Game") + (isHost ? "" : " (" + MultiLanguageSystem.Translate("Host Only") + ")"))) - { - Network.LobbyManager.ForceLobbyStart(); - } - GUI.enabled = true; - yOffset += 45; - - // Network statistics - if (Network.NetworkHelper.IsNetworkRunning()) - { - yOffset += 10; - GUI.Label(new Rect(xBase, yBase + yOffset, 300, 30), - $"=== {MultiLanguageSystem.Translate("Network Stats")} ==="); - yOffset += 35; - - GUI.Label(new Rect(xBase, yBase + yOffset, 200, 30), - MultiLanguageSystem.Translate("Player Count") + ": " + Network.NetworkHelper.GetPlayerCount()); - yOffset += 30; - - if (!isHost) - { - GUI.Label(new Rect(xBase, yBase + yOffset, 200, 30), - "Ping: " + Network.NetworkHelper.GetPing() + "ms"); - yOffset += 30; - } - - GUI.Label(new Rect(xBase, yBase + yOffset, 200, 30), - MultiLanguageSystem.Translate("Connection ID") + ": " + Network.NetworkHelper.GetConnectionID()); - } + ItemHandling.HandleItemCarry(carryObjectName); } private void OnDestroy() @@ -2258,7 +138,6 @@ namespace DevourClient try { base.StopAllCoroutines(); - Dispose(); } catch (Exception ex) @@ -2288,7 +167,7 @@ namespace DevourClient long memoryBeforeCleanup = GC.GetTotalMemory(false); MelonLogger.Msg($"[Memory Monitor] Pre-cleanup managed memory: {memoryBeforeCleanup / 1024 / 1024} MB"); - Helpers.Entities.StopAllCoroutines(); + Entities.StopAllCoroutines(); if (crosshairTexture != null) { @@ -2296,9 +175,8 @@ namespace DevourClient crosshairTexture = null; } - Helpers.GUIHelper.Cleanup(); - - Helpers.Entities.CleanupCachedObjects(); + GUIHelper.Cleanup(); + Entities.CleanupCachedObjects(); GC.Collect(); GC.WaitForPendingFinalizers(); diff --git a/DevourClient/DevourClient.csproj b/DevourClient/DevourClient.csproj index 13b76b7..2b038a6 100644 --- a/DevourClient/DevourClient.csproj +++ b/DevourClient/DevourClient.csproj @@ -1,7 +1,7 @@ - + net6.0 - false + false enable enable Library @@ -12,4 +12,72 @@ 0 + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\net6\0Harmony.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Assembly-CSharp.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.user.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppcom.rlabrecque.steamworks.net.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\net6\Il2CppInterop.Runtime.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppmscorlib.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2CppOpsive.UltimateCharacterController.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.common.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.platform.photon.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\net6\MelonLoader.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Unity.TextMeshPro.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.AnimationModule.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.CoreModule.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.IMGUIModule.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.InputLegacyModule.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.PhysicsModule.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.TextRenderingModule.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.UI.dll + + + E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.UIModule.dll + + diff --git a/DevourClient/ESP/ItemESPConfig.cs b/DevourClient/ESP/ItemESPConfig.cs index 85ca850..f540f91 100644 --- a/DevourClient/ESP/ItemESPConfig.cs +++ b/DevourClient/ESP/ItemESPConfig.cs @@ -18,7 +18,7 @@ namespace DevourClient.ESP Gasoline, // Gasoline // Asylum (Molly) specific - RottonFood, // Rotten Food + RottenFood, // Rotten Food Fuse, // Fuse // Inn specific @@ -61,7 +61,7 @@ namespace DevourClient.ESP // Enemy ESP - Slaughterhouse Corpse, // Corpse - Roar, // Roar + Boar, // Boar Pig, // Pig // Enemy ESP - Manor @@ -99,7 +99,7 @@ namespace DevourClient.ESP ESPType.FirstAid, // Common: First Aid ESPType.Battery, // Common: Battery ESPType.Keys, // Common: Keys - ESPType.RottonFood, // Specific: Rotten Food + ESPType.RottenFood, // Specific: Rotten Food ESPType.Fuse, // Specific: Fuse ESPType.Inmates, // Enemy: Inmates ESPType.Rat // Enemy: Rat @@ -140,7 +140,7 @@ namespace DevourClient.ESP ESPType.Bone, // Specific: Bone ESPType.Gasoline, // Specific: Gasoline ESPType.Corpse, // Enemy: Corpse - ESPType.Roar, // Enemy: Roar + ESPType.Boar, // Enemy: Boar ESPType.Pig // Enemy: Pig } }, @@ -202,7 +202,7 @@ namespace DevourClient.ESP { ESPType.Gasoline, false }, // Asylum specific - { ESPType.RottonFood, false }, + { ESPType.RottenFood, false }, { ESPType.Fuse, false }, // Inn specific @@ -242,7 +242,7 @@ namespace DevourClient.ESP // Enemy - Slaughterhouse { ESPType.Corpse, false }, - { ESPType.Roar, false }, + { ESPType.Boar, false }, { ESPType.Pig, false }, // Enemy - Manor @@ -315,8 +315,8 @@ namespace DevourClient.ESP return "Gasoline ESP"; // Asylum specific - case ESPType.RottonFood: - return "Rotton Food ESP"; + case ESPType.RottenFood: + return "Rotten Food ESP"; case ESPType.Fuse: return "Fuse ESP"; @@ -375,8 +375,8 @@ namespace DevourClient.ESP // Enemy - Slaughterhouse case ESPType.Corpse: return "Corpse ESP"; - case ESPType.Roar: - return "Roar ESP"; + case ESPType.Boar: + return "Boar ESP"; case ESPType.Pig: return "Pig ESP"; @@ -439,10 +439,10 @@ namespace DevourClient.ESP return ESPType.Gasoline; // Asylum specific - case "rottonfoodpickup": - case "rotton food": - case "rottonfood": - return ESPType.RottonFood; + case "rottenfoodpickup": + case "rotten food": + case "rottenfood": + return ESPType.RottenFood; case "fusepickup": case "fuse": @@ -534,13 +534,12 @@ namespace DevourClient.ESP case "corpsebehaviour": return ESPType.Corpse; - case "roar": - case "roarbehaviour": - return ESPType.Roar; - - case "pig": + case "boar": case "boarbehaviour": + return ESPType.Boar; + + case "pig": case "pigbehaviour": return ESPType.Pig; @@ -623,7 +622,7 @@ namespace DevourClient.ESP GetESPState(ESPType.Keys) || GetESPState(ESPType.Hay) || GetESPState(ESPType.Gasoline) || - GetESPState(ESPType.RottonFood) || + GetESPState(ESPType.RottenFood) || GetESPState(ESPType.Fuse) || GetESPState(ESPType.Bleach) || GetESPState(ESPType.Egg) || @@ -652,7 +651,7 @@ namespace DevourClient.ESP GetESPState(ESPType.Spider) || GetESPState(ESPType.Ghost) || GetESPState(ESPType.Corpse) || - GetESPState(ESPType.Roar) || + GetESPState(ESPType.Boar) || GetESPState(ESPType.Pig) || GetESPState(ESPType.Crow) || GetESPState(ESPType.DirtyHead) || diff --git a/DevourClient/Features/ClientRuntime.cs b/DevourClient/Features/ClientRuntime.cs new file mode 100644 index 0000000..0aef131 --- /dev/null +++ b/DevourClient/Features/ClientRuntime.cs @@ -0,0 +1,167 @@ +using System; +using DevourClient.Helpers; +using UnityEngine; + +namespace DevourClient.Features +{ + internal static class ClientRuntime + { + internal static void Tick() + { + if (Settings.Settings.menuToggleKey != KeyCode.None && Input.GetKeyDown(Settings.Settings.menuToggleKey)) + { + try + { + Il2Cpp.GameUI gameUI = UnityEngine.Object.FindObjectOfType(); + if (Settings.Settings.menu_enable) + { + gameUI.HideMouseCursor(); + } + else + { + gameUI.ShowMouseCursor(); + } + } + catch { } + + Settings.Settings.menu_enable = !Settings.Settings.menu_enable; + } + + if (Player.IsInGame()) + { + if (ClientMain.flashlight_toggle && !ClientMain.fullbright) + { + Hacks.Misc.BigFlashlight(false); + } + else if (!ClientMain.flashlight_toggle && !ClientMain.fullbright) + { + Hacks.Misc.BigFlashlight(true); + } + + if (ClientMain.fullbright && !ClientMain.flashlight_toggle) + { + Hacks.Misc.Fullbright(false); + } + else if (!ClientMain.fullbright && !ClientMain.flashlight_toggle) + { + Hacks.Misc.Fullbright(true); + } + + if (ClientMain._IsAutoRespawn && Helpers.Player.IsPlayerCrawling()) + { + Hacks.Misc.AutoRespawn(); + } + + if (ClientMain.crosshair && !ClientMain.in_game_cache) + { + ClientMain.in_game_cache = true; + } + } + else + { + if (ClientMain.crosshair && ClientMain.in_game_cache) + { + ClientMain.in_game_cache = false; + } + } + + if (ClientMain.spoofLevel) + { + Hacks.Misc.SetRank((int)ClientMain.spoofLevelValue); + } + + if (Input.GetKeyDown(Settings.Settings.flyKey)) + { + ClientMain.fly = !ClientMain.fly; + } + + RadialMenuManager.Enabled = true; + RadialMenuManager.HandleUpdate(); + + if (Player.IsInGameOrLobby()) + { + if (ClientMain.fly && !ClientMain.need_fly_reset) + { + Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); + if (nb) + { + Collider coll = nb.GetComponentInChildren(); + if (coll) + { + coll.enabled = false; + ClientMain.need_fly_reset = true; + } + } + } + else if (!ClientMain.fly && ClientMain.need_fly_reset) + { + Il2Cpp.NolanBehaviour nb = Player.GetPlayer(); + if (nb) + { + Collider coll = nb.GetComponentInChildren(); + if (coll) + { + coll.enabled = true; + ClientMain.need_fly_reset = false; + } + } + } + + if (ClientMain.fly) + { + Hacks.Misc.Fly(ClientMain.fly_speed); + } + + Hacks.Misc.InstantInteractTick(ClientMain.InstantInteractionEnabled); + } + + if (Helpers.Map.GetActiveScene() == "Menu") + { + Hacks.Misc.WalkInLobby(ClientMain._walkInLobby); + } + + if (ClientMain.fastMove) + { + try + { + if (Helpers.Entities.LocalPlayer_.p_GameObject != null) + { + var locomotion = Helpers.Entities.LocalPlayer_.p_GameObject + .GetComponent(); + if (locomotion != null) + { + locomotion.TimeScale = ClientMain._PlayerSpeedMultiplier; + } + } + } + catch + { + return; + } + } + + ClientMain.frameCount++; + + if (ClientMain.frameCount % ClientMain.GC_GEN0_INTERVAL == 0) + { + GC.Collect(0, GCCollectionMode.Optimized); + } + + if (ClientMain.frameCount % ClientMain.GC_FULL_INTERVAL == 0) + { + GC.Collect(); + GC.WaitForPendingFinalizers(); + GC.Collect(); + ClientMain.frameCount = 0; + } + + if (ClientMain.frameCount - ClientMain.lastMemoryLog >= ClientMain.MEMORY_LOG_INTERVAL) + { + long memoryUsed = GC.GetTotalMemory(false); + MelonLoader.MelonLogger.Msg($"[Memory Monitor] Current managed memory: {memoryUsed / 1024 / 1024} MB | Frame: {ClientMain.frameCount}"); + ClientMain.lastMemoryLog = ClientMain.frameCount; + } + } + } +} + diff --git a/DevourClient/Features/ItemHandling.cs b/DevourClient/Features/ItemHandling.cs new file mode 100644 index 0000000..1590375 --- /dev/null +++ b/DevourClient/Features/ItemHandling.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections; +using UnityEngine; +using Il2CppPhoton.Bolt; + +namespace DevourClient.Features +{ + internal static class ItemHandling + { + internal static void HandleItemCarry(string carryObjectName) + { + if (string.IsNullOrEmpty(carryObjectName)) + { + return; + } + + if (ClientMain.autoItemFarm && DevourClient.Helpers.Player.IsInGame()) + { + MelonLoader.MelonCoroutines.Start(ItemFarmRoutine(carryObjectName)); + return; + } + + DevourClient.Hacks.Misc.CarryObject(carryObjectName); + } + + private static IEnumerator ItemFarmRoutine(string carryObjectName) + { + for (int i = 0; i < ClientMain.ITEM_FARM_REPEAT_COUNT; i++) + { + DevourClient.Hacks.Misc.CarryObject(carryObjectName); + yield return new WaitForSeconds(ClientMain.ITEM_FARM_DELAY); + TryDropCarriedItem(carryObjectName); + yield return new WaitForSeconds(ClientMain.ITEM_FARM_DELAY); + } + } + + private static void TryDropCarriedItem(string carryObjectName) + { + Il2Cpp.NolanBehaviour nb = DevourClient.Helpers.Player.GetPlayer(); + if (nb == null) + { + return; + } + + try + { + nb.PlopObject(); + TrySpawnDroppedItem(carryObjectName, nb); + } + catch (Exception ex) + { + MelonLoader.MelonLogger.Warning($"Failed to drop carried item: {ex.Message}"); + } + } + + private static void TrySpawnDroppedItem(string carryObjectName, Il2Cpp.NolanBehaviour nb) + { + if (!BoltNetwork.IsServer || nb == null) + { + return; + } + + Vector3 dropPosition = nb.transform.position + nb.transform.forward * 1.5f; + Quaternion dropRotation = Quaternion.identity; + + try + { + switch (carryObjectName) + { + case "SurvivalHay": + BoltNetwork.Instantiate(BoltPrefabs.SurvivalHay, dropPosition, dropRotation); + break; + case "SurvivalFirstAid": + BoltNetwork.Instantiate(BoltPrefabs.SurvivalFirstAid, dropPosition, dropRotation); + break; + case "SurvivalBattery": + BoltNetwork.Instantiate(BoltPrefabs.SurvivalBattery, dropPosition, dropRotation); + break; + case "SurvivalGasoline": + BoltNetwork.Instantiate(BoltPrefabs.SurvivalGasoline, dropPosition, dropRotation); + break; + case "SurvivalFuse": + BoltNetwork.Instantiate(BoltPrefabs.SurvivalFuse, dropPosition, dropRotation); + break; + case "SurvivalRottenFood": + BoltNetwork.Instantiate(BoltPrefabs.SurvivalRottenFood, dropPosition, dropRotation); + break; + case "SurvivalBone": + BoltNetwork.Instantiate(BoltPrefabs.SurvivalBone, dropPosition, dropRotation); + break; + case "SurvivalBleach": + BoltNetwork.Instantiate(BoltPrefabs.SurvivalBleach, dropPosition, dropRotation); + break; + case "Matchbox-3": + BoltNetwork.Instantiate(BoltPrefabs.SurvivalMatchbox, dropPosition, dropRotation); + break; + case "SurvivalSpade": + BoltNetwork.Instantiate(BoltPrefabs.SurvivalSpade, dropPosition, dropRotation); + break; + case "SurvivalCake": + BoltNetwork.Instantiate(BoltPrefabs.SurvivalCake, dropPosition, dropRotation); + break; + case "MusicBox-Idle": + BoltNetwork.Instantiate(BoltPrefabs.SurvivalMusicBox, dropPosition, dropRotation); + break; + case "SurvivalCoin": + BoltNetwork.Instantiate(BoltPrefabs.SurvivalCoin, dropPosition, dropRotation); + break; + } + } + catch (Exception ex) + { + MelonLoader.MelonLogger.Warning($"Failed to spawn dropped item '{carryObjectName}': {ex.Message}"); + } + } + } +} diff --git a/DevourClient/Hacks/Misc.cs b/DevourClient/Hacks/Misc.cs index b4fb228..5b2333d 100644 --- a/DevourClient/Hacks/Misc.cs +++ b/DevourClient/Hacks/Misc.cs @@ -1,4 +1,4 @@ -using UnityEngine; +using UnityEngine; using MelonLoader; using UnityEngine.UI; using System.Reflection; @@ -47,14 +47,14 @@ namespace DevourClient.Hacks public static void WalkInLobby(bool walk) { - GameObject LocalPlayer = Helpers.Entities.LocalPlayer_.p_GameObject; + GameObject? LocalPlayer = Helpers.Entities.LocalPlayer_.p_GameObject; if (LocalPlayer == null) { return; } //GetComponent called only once as AddComponent returns a component - UltimateCharacterLocomotionHandler cmp = Helpers.Entities.LocalPlayer_.p_GameObject.GetComponent(); + UltimateCharacterLocomotionHandler? cmp = LocalPlayer.GetComponent(); if (cmp == null) { @@ -143,7 +143,7 @@ namespace DevourClient.Hacks return; } - GameObject _localPlayer = Helpers.Entities.LocalPlayer_.p_GameObject; + GameObject? _localPlayer = Helpers.Entities.LocalPlayer_.p_GameObject; if (_localPlayer != null) { @@ -174,7 +174,17 @@ namespace DevourClient.Hacks public static void CarryObject(string name) { - Il2Cpp.NolanBehaviour nb = Helpers.Entities.LocalPlayer_.p_GameObject.GetComponent(); + GameObject? localPlayerGameObject = Helpers.Entities.LocalPlayer_.p_GameObject; + if (localPlayerGameObject == null) + { + return; + } + Il2Cpp.NolanBehaviour? nb = localPlayerGameObject.GetComponent(); + + if (nb == null) + { + return; + } nb.StartCarry(name); } @@ -203,11 +213,23 @@ namespace DevourClient.Hacks } public static void TPItems() { - Il2Cpp.NolanBehaviour Nolan = Player.GetPlayer(); - - foreach (Il2Cpp.SurvivalInteractable item in Helpers.Entities.SurvivalInteractables) + Il2Cpp.NolanBehaviour? Nolan = Player.GetPlayer(); + if (Nolan == null) { - item.transform.position = Nolan.transform.position + Nolan.transform.forward * UnityEngine.Random.RandomRange(1f, 3f); + return; + } + + if (Helpers.Entities.SurvivalInteractables != null) + { + foreach (Il2Cpp.SurvivalInteractable? item in Helpers.Entities.SurvivalInteractables) + { + if (item == null || item.transform == null) + { + continue; + } + + item.transform.position = Nolan.transform.position + Nolan.transform.forward * UnityEngine.Random.RandomRange(1f, 3f); + } } } @@ -298,7 +320,11 @@ namespace DevourClient.Hacks public static void Fullbright(bool reset) { - Il2Cpp.NolanBehaviour Nolan = Player.GetPlayer(); + Il2Cpp.NolanBehaviour? Nolan = Player.GetPlayer(); + if (Nolan == null) + { + return; + } if (Nolan == null) { return; @@ -330,7 +356,11 @@ namespace DevourClient.Hacks } public static void FlashlightColor(Color color) { - Il2Cpp.NolanBehaviour Nolan = Player.GetPlayer(); + Il2Cpp.NolanBehaviour? Nolan = Player.GetPlayer(); + if (Nolan == null) + { + return; + } Light flashlightSpot = Nolan.flashlightSpot; flashlightSpot.color = color; @@ -339,7 +369,11 @@ namespace DevourClient.Hacks public static void TPKeys() { //TOFIX: spawn manually the missing key in slaughterhouse - Il2Cpp.NolanBehaviour Nolan = Player.GetPlayer(); + Il2Cpp.NolanBehaviour? Nolan = Player.GetPlayer(); + if (Nolan == null) + { + return; + } foreach (Il2Cpp.KeyBehaviour keyBehaviour in Helpers.Entities.Keys) { @@ -353,7 +387,7 @@ namespace DevourClient.Hacks public static void SetRank(int rank) { - Il2Cpp.NolanRankController NolanRank = UnityEngine.Object.FindObjectOfType(); + Il2Cpp.NolanRankController? NolanRank = UnityEngine.Object.FindObjectOfType(); if (NolanRank == null) { return; @@ -364,77 +398,98 @@ namespace DevourClient.Hacks public static void DespawnDemons() { - foreach (Il2Cpp.SurvivalDemonBehaviour demon in Helpers.Entities.Demons) + if (Helpers.Entities.Demons != null) { - if (demon != null) + foreach (Il2Cpp.SurvivalDemonBehaviour demon in Helpers.Entities.Demons) { - demon.Despawn(); + if (demon != null) + { + demon.Despawn(); + } } } } public static void DespawnSpiders() { - foreach (Il2Cpp.SpiderBehaviour spider in Helpers.Entities.Spiders) + if (Helpers.Entities.Spiders != null) { - if (spider != null) + foreach (Il2Cpp.SpiderBehaviour? spider in Helpers.Entities.Spiders) { - spider.Despawn(); + if (spider != null) + { + spider.Despawn(); + } } } } public static void DespawnGhosts() { - foreach (Il2Cpp.GhostBehaviour ghost in Helpers.Entities.Ghosts) + if (Helpers.Entities.Ghosts != null) { - if (ghost != null) + foreach (Il2Cpp.GhostBehaviour ghost in Helpers.Entities.Ghosts) { - ghost.Despawn(); + if (ghost != null) + { + ghost.Despawn(); + } } } } public static void DespawnBoars() { - foreach (Il2Cpp.BoarBehaviour boar in Helpers.Entities.Boars) + if (Helpers.Entities.Boars != null) { - if (boar != null) + foreach (Il2Cpp.BoarBehaviour boar in Helpers.Entities.Boars) { - boar.Despawn(); + if (boar != null) + { + boar.Despawn(); + } } } } public static void DespawnCorpses() { - foreach (Il2Cpp.CorpseBehaviour corpse in Helpers.Entities.Corpses) + if (Helpers.Entities.Corpses != null) { - if (corpse != null) + foreach (Il2Cpp.CorpseBehaviour corpse in Helpers.Entities.Corpses) { - corpse.Despawn(); + if (corpse != null) + { + corpse.Despawn(); + } } } } public static void DespawnCrows() { - foreach (Il2Cpp.CrowBehaviour crow in Helpers.Entities.Crows) + if (Helpers.Entities.Crows != null) { - if (crow != null) + foreach (Il2Cpp.CrowBehaviour? crow in Helpers.Entities.Crows) { - crow.Despawn(); + if (crow != null) + { + crow.Despawn(); + } } } } public static void DespawnLumps() { - foreach (Il2Cpp.ManorLumpController lump in Helpers.Entities.Lumps) + if (Helpers.Entities.Lumps != null) { - if (lump != null) + foreach (Il2Cpp.ManorLumpController lump in Helpers.Entities.Lumps) { - lump.Dissolve(); + if (lump != null) + { + lump.Dissolve(); + } } } } @@ -504,6 +559,11 @@ namespace DevourClient.Hacks } } + public static void InstantInteractTick(bool enabled) + { + return; + } + public static void FreezeAzazel() { if (Helpers.Map.GetActiveScene() == "Menu") diff --git a/DevourClient/Helpers/GUIHelper.cs b/DevourClient/Helpers/GUIHelper.cs index fd78081..a81a4f0 100644 --- a/DevourClient/Helpers/GUIHelper.cs +++ b/DevourClient/Helpers/GUIHelper.cs @@ -9,12 +9,12 @@ namespace DevourClient.Helpers private static float G; private static float B; - private static Texture2D previewTexture = null; + private static Texture2D? previewTexture = null; private static Dictionary colorTextureCache = new Dictionary(); private static Dictionary circularTextureCache = new Dictionary(); private static Color lastPreviewColor = Color.clear; - private static GUIStyle cachedBoxStyle = null; + private static GUIStyle? cachedBoxStyle = null; public static Color ColorPick(string title, Color color) { @@ -59,7 +59,7 @@ namespace DevourClient.Helpers public static Texture2D MakeTex(int width, int height, Color col) { - if (colorTextureCache.TryGetValue(col, out Texture2D cachedTexture)) + if (colorTextureCache.TryGetValue(col, out Texture2D? cachedTexture)) { if (cachedTexture != null) { @@ -85,7 +85,7 @@ namespace DevourClient.Helpers { int cacheKey = width; - if (circularTextureCache.TryGetValue(cacheKey, out Texture2D cachedTexture)) + if (circularTextureCache.TryGetValue(cacheKey, out Texture2D? cachedTexture)) { if (cachedTexture != null) { diff --git a/DevourClient/Helpers/Map.cs b/DevourClient/Helpers/Map.cs index 400d81c..0e7b6b6 100644 --- a/DevourClient/Helpers/Map.cs +++ b/DevourClient/Helpers/Map.cs @@ -1,4 +1,4 @@ -namespace DevourClient.Helpers +namespace DevourClient.Helpers { class Map { @@ -31,8 +31,16 @@ } } - public static UnityEngine.GameObject GetAzazel() + public static UnityEngine.GameObject? GetAzazel() { + if (Helpers.Entities.Azazels == null || Helpers.Entities.Azazels.Length == 0) + { + return null; + } + if (Helpers.Entities.Azazels[0] == null) + { + return null; + } return Helpers.Entities.Azazels[0].gameObject; } diff --git a/DevourClient/Helpers/ReviveHelper.cs b/DevourClient/Helpers/ReviveHelper.cs index 2a3360f..0d0e523 100644 --- a/DevourClient/Helpers/ReviveHelper.cs +++ b/DevourClient/Helpers/ReviveHelper.cs @@ -2,6 +2,9 @@ using System; using DevourClient.Network; using MelonLoader; using UnityEngine; +using Il2CppPhoton.Bolt; +using Il2Cpp; +using Il2CppOpsive.UltimateCharacterController.Character; namespace DevourClient.Helpers { @@ -19,9 +22,19 @@ namespace DevourClient.Helpers return false; } - if (TryHostRevive(target)) + if (NetworkHelper.IsHost() && Player.IsInGame()) { - return true; + if (TryHostRevive(target)) + { + return true; + } + } + else + { + if (TryClientRevive(target)) + { + return true; + } } return TryInteractRevive(target); @@ -41,16 +54,70 @@ namespace DevourClient.Helpers try { - Il2Cpp.SurvivalReviveInteractable interactable = UnityEngine.Object.FindObjectOfType(); - if (interactable == null) + var reviverEntity = GetLocalPlayerEntity(); + if (reviverEntity == null) { - target.TeleportTo(HostFallbackPosition, Quaternion.identity); - MelonLogger.Msg("[ReviveHelper] Host fallback teleport executed (no interactable found)."); - return true; + return false; } - interactable.Interact(target.gameObject); - MelonLogger.Msg("[ReviveHelper] Host revive interactable triggered."); + var targetEntity = target.entity; + ReviveEvent.Post(GlobalTargets.Others, targetEntity, reviverEntity); + + var survival = UnityEngine.Object.FindObjectOfType(); + if (survival != null) + { + survival.OnReviveEvent(targetEntity, reviverEntity); + } + + target.OnReviveEvent(targetEntity, reviverEntity); + + try + { + target.inputDisabledFromKnockout = false; + if (target.devourInput != null) + { + target.devourInput.EnableGameplayInput(true); + } + + var layerManager = target.gameObject.GetComponent(); + if (layerManager != null) + { + var maskValue = layerManager.CharacterLayer.value; + if (maskValue != 0) + { + target.gameObject.layer = (int)Mathf.Log(maskValue, 2); + } + } + + target.EnableRevivedEffects(); + if (targetEntity.IsAttached) + { + var state = targetEntity.GetState(); + if (state != null) + { + state.Locked = false; + state.Reviving = null; + state.DemonHoldingPlayer = null; + } + } + } + catch (Exception ex) + { + MelonLogger.Error($"Error validating revive state: {ex}"); + } + + var nameplate = target.gameObject.GetComponent(); + if (nameplate != null) nameplate.OnReviveEvent(targetEntity, reviverEntity); + + var perkController = target.gameObject.GetComponent(); + if (perkController != null) perkController.OnReviveEvent(targetEntity, reviverEntity); + + if (Il2Cpp.IngameStatsTracker.singleton != null) + { + Il2Cpp.IngameStatsTracker.singleton.OnReviveEvent(targetEntity, reviverEntity); + } + + NotifySceneListeners(targetEntity, reviverEntity); return true; } catch (Exception ex) @@ -60,6 +127,32 @@ namespace DevourClient.Helpers } } + private static bool TryClientRevive(Il2Cpp.NolanBehaviour target) + { + if (!NetworkHelper.IsNetworkRunning()) + { + return false; + } + + try + { + var reviverEntity = GetLocalPlayerEntity(); + if (reviverEntity == null) + { + return false; + } + + var targetEntity = target.entity; + ReviveEvent.Post(GlobalTargets.OnlyServer, targetEntity, reviverEntity); + return true; + } + catch (Exception ex) + { + MelonLogger.Warning($"[ReviveHelper] Client revive failed: {ex.Message}"); + return false; + } + } + private static bool TryInteractRevive(Il2Cpp.NolanBehaviour target) { try @@ -84,21 +177,54 @@ namespace DevourClient.Helpers return false; } - // Legacy revive method migrated from StateHelper.BasePlayer.Revive(). - // This method preserves the original implementation from StateHelper. - // targetGameObject: The GameObject of the player to revive. - public static void ReviveLegacy(GameObject targetGameObject) + private static BoltEntity? GetLocalPlayerEntity() { - if (targetGameObject == null) + var players = GameObject.FindGameObjectsWithTag("Player"); + for (int i = 0; i < players.Length; i++) { - return; + var nb = players[i].GetComponent(); + if (nb != null && nb.entity != null && nb.entity.IsAttached && nb.entity.IsOwner) + { + return nb.entity; + } + } + return null; + } + + private static void NotifySceneListeners(BoltEntity player, BoltEntity reviver) + { + foreach (var pet in UnityEngine.Object.FindObjectsOfType()) + { + pet.OnReviveEvent(player, reviver); } - Il2Cpp.NolanBehaviour nb = targetGameObject.GetComponent(); - Il2Cpp.SurvivalReviveInteractable _reviveInteractable = UnityEngine.Object.FindObjectOfType(); + foreach (var mgr in UnityEngine.Object.FindObjectsOfType()) + { + mgr.OnReviveEvent(player, reviver); + } - if (_reviveInteractable.CanInteract(nb.gameObject) == true) { _reviveInteractable.Interact(nb.gameObject); } + foreach (var web in UnityEngine.Object.FindObjectsOfType()) + { + web.OnReviveEvent(player, reviver); + } + foreach (var crawl in UnityEngine.Object.FindObjectsOfType()) + { + crawl.OnReviveEvent(player, reviver); + } + + foreach (var deadRealm in UnityEngine.Object.FindObjectsOfType()) + { + deadRealm.OnReviveEvent(player, reviver); + } + + foreach (var poison in UnityEngine.Object.FindObjectsOfType()) + { + poison.OnReviveEvent(player, reviver); + } + foreach (var stairs in UnityEngine.Object.FindObjectsOfType()) + { + stairs.OnReviveEvent(player, reviver); + } } } } - diff --git a/DevourClient/Helpers/StateHelper.cs b/DevourClient/Helpers/StateHelper.cs index 226232f..7728193 100644 --- a/DevourClient/Helpers/StateHelper.cs +++ b/DevourClient/Helpers/StateHelper.cs @@ -9,7 +9,7 @@ namespace DevourClient.Helpers { public class BasePlayer { - public GameObject p_GameObject { get; set; } = default!; + public GameObject? p_GameObject { get; set; } = default!; public string Name { get; set; } = default!; public string Id { get; set; } = default!; @@ -165,22 +165,22 @@ namespace DevourClient.Helpers public static int MAX_PLAYERS = 4; //will change by calling CreateCustomizedLobby public static BasePlayer LocalPlayer_ = new BasePlayer(); - public static BasePlayer[] Players = default!; - public static Il2Cpp.GoatBehaviour[] GoatsAndRats = default!; - public static Il2Cpp.SurvivalInteractable[] SurvivalInteractables = default!; - public static Il2Cpp.KeyBehaviour[] Keys = default!; - public static Il2Cpp.SurvivalDemonBehaviour[] Demons = default!; - public static Il2Cpp.SpiderBehaviour[] Spiders = default!; - public static Il2Cpp.GhostBehaviour[] Ghosts = default!; - public static Il2Cpp.SurvivalAzazelBehaviour[] Azazels = default!; - public static Il2Cpp.BoarBehaviour[] Boars = default!; - public static Il2Cpp.CorpseBehaviour[] Corpses = default!; - public static Il2Cpp.CrowBehaviour[] Crows = default!; - public static Il2Cpp.ManorLumpController[] Lumps = default!; - public static Il2Cpp.GoatBehaviour[] DirtyHeads = default!; - public static Il2Cpp.MonkeyBehaviour[] Monkeys = default!; - public static Il2Cpp.GoatBehaviour[] Dolls = default!; - public static Il2Cpp.CollectableInteractable[] Collectables = default!; + public static BasePlayer[]? Players = default!; + public static Il2Cpp.GoatBehaviour[]? GoatsAndRats = default!; + public static Il2Cpp.SurvivalInteractable[]? SurvivalInteractables = default!; + public static Il2Cpp.KeyBehaviour[]? Keys = default!; + public static Il2Cpp.SurvivalDemonBehaviour[]? Demons = default!; + public static Il2Cpp.SpiderBehaviour[]? Spiders = default!; + public static Il2Cpp.GhostBehaviour[]? Ghosts = default!; + public static Il2Cpp.SurvivalAzazelBehaviour[]? Azazels = default!; + public static Il2Cpp.BoarBehaviour[]? Boars = default!; + public static Il2Cpp.CorpseBehaviour[]? Corpses = default!; + public static Il2Cpp.CrowBehaviour[]? Crows = default!; + public static Il2Cpp.ManorLumpController[]? Lumps = default!; + public static Il2Cpp.GoatBehaviour[]? DirtyHeads = default!; + public static Il2Cpp.MonkeyBehaviour[]? Monkeys = default!; + public static Il2Cpp.GoatBehaviour[]? Dolls = default!; + public static Il2Cpp.CollectableInteractable[]? Collectables = default!; // Coroutine lifecycle management private static List activeCoroutines = new List(); diff --git a/DevourClient/Hooks/Hooks.cs b/DevourClient/Hooks/Hooks.cs index 18e1435..2866fb3 100644 --- a/DevourClient/Hooks/Hooks.cs +++ b/DevourClient/Hooks/Hooks.cs @@ -1,5 +1,7 @@ -using HarmonyLib; +using HarmonyLib; using Il2Cpp; +using UnityEngine; +using System; namespace DevourClient.Hooks { @@ -17,8 +19,10 @@ namespace DevourClient.Hooks return; } } - } - + } + + + [HarmonyPatch(typeof(Il2Cpp.RankHelpers))] [HarmonyPatch(nameof(Il2Cpp.RankHelpers.CalculateExpGain))] //annotation boiler plate to tell Harmony what to patch. Refer to docs. static class RankHelpers_CalculateExpGain @@ -128,5 +132,20 @@ namespace DevourClient.Hooks __result = false; } } + + [HarmonyPatch(typeof(Il2Cpp.DevourInput))] + [HarmonyPatch(nameof(Il2Cpp.DevourInput.GetLongPress))] + static class DevourInput_GetLongPress_Patch + { + static bool Prefix(ref bool __result, string name, ref float duration, bool waitForRelease) + { + if (!DevourClient.ClientMain.InstantInteractionEnabled) + return true; + duration = 0.05f; + return true; + } + } + + } } diff --git a/DevourClient/Localization/MultiLanguageSystem.cs b/DevourClient/Localization/MultiLanguageSystem.cs index c3ad428..6002291 100644 --- a/DevourClient/Localization/MultiLanguageSystem.cs +++ b/DevourClient/Localization/MultiLanguageSystem.cs @@ -108,8 +108,8 @@ namespace DevourClient.Localization // Keep AddTranslation method for backward compatibility (used by AddCustomTranslation) private static void AddTranslation(string english, - string cn = null, string fr = null, string de = null, string es = null, - string ja = null, string ko = null, string ru = null, string pt = null, string it = null, string vi = null) + string? cn = null, string? fr = null, string? de = null, string? es = null, + string? ja = null, string? ko = null, string? ru = null, string? pt = null, string? it = null, string? vi = null) { var translations = new Dictionary { diff --git a/DevourClient/Localization/Translations/ChineseTranslations.cs b/DevourClient/Localization/Translations/ChineseTranslations.cs index 6a2cdcd..2cad203 100644 --- a/DevourClient/Localization/Translations/ChineseTranslations.cs +++ b/DevourClient/Localization/Translations/ChineseTranslations.cs @@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations { "Ping", "延迟" }, { "Play Random Sound", "播放随机音效" }, { "Player", "玩家" }, + { "Instant Interaction", "立即交互" }, { "Player Count", "玩家数" }, { "Player ESP", "玩家透视" }, { "Player ESP Color", "玩家透视颜色" }, @@ -207,17 +208,17 @@ namespace DevourClient.Localization.Translations { "Rat ESP", "老鼠透视" }, { "Region", "区域" }, { "Revive", "复活" }, - { "Radial Menu (Z)", "轮盘菜单 (Z)" }, + { "Radial Menu", "轮盘菜单" }, { "Ritual Book", "仪式书" }, { "Rose", "玫瑰" }, { "Ritual Book ESP", "仪式书透视" }, { "Ritual Object ESP", "仪式物品透视" }, { "Ritual Objects", "仪式物品" }, { "RitualBook", "仪式书" }, - { "Roar ESP", "咆哮者透视" }, + { "Boar ESP", "野猪透视" }, { "Role", "角色" }, { "RottenFood", "腐烂食物" }, - { "Rotton Food ESP", "腐烂食物透视" }, + { "Rotten Food ESP", "腐烂食物透视" }, { "Sam", "萨姆" }, { "Shoot Player", "射击玩家" }, { "Show Coordinates", "显示坐标" }, @@ -274,10 +275,22 @@ namespace DevourClient.Localization.Translations { "Unlimited UV Light", "无限紫外线" }, { "Unlock Achievements", "解锁成就" }, { "Unlock Doors", "解锁门" }, + { "God Mode", "上帝模式" }, { "Visuals", "视觉" }, { "Waiting for the game to start", "等待游戏开始" }, { "Walk In Lobby", "大厅行走" }, { "Zara", "扎拉" }, + { "Gardener", "园丁" }, + { "Butler", "管家" }, + { "Bridesmaid 1", "伴娘 1" }, + { "Bridesmaid 2", "伴娘 2" }, + { "Cook", "厨师" }, + { "Groomsman 1", "伴郎 1" }, + { "Groomsman 2", "伴郎 2" }, + { "Maid", "女仆" }, + { "Photographer", "摄影师" }, + { "Priest", "牧师" }, + { "Menu Key", "菜单键" }, }; } } diff --git a/DevourClient/Localization/Translations/EnglishTranslations.cs b/DevourClient/Localization/Translations/EnglishTranslations.cs index 8b757cc..02d84ed 100644 --- a/DevourClient/Localization/Translations/EnglishTranslations.cs +++ b/DevourClient/Localization/Translations/EnglishTranslations.cs @@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations { "Ping", "Ping" }, { "Play Random Sound", "Play Random Sound" }, { "Player", "Player" }, + { "Instant Interaction", "Instant Interaction" }, { "Player Count", "Player Count" }, { "Player ESP", "Player ESP" }, { "Player ESP Color", "Player ESP Color" }, @@ -207,17 +208,17 @@ namespace DevourClient.Localization.Translations { "Rat ESP", "Rat ESP" }, { "Region", "Region" }, { "Revive", "Revive" }, - { "Radial Menu (Z)", "Radial Menu (Z)" }, + { "Radial Menu", "Radial Menu" }, { "Ritual Book", "Ritual Book" }, { "Rose", "Rose" }, { "Ritual Book ESP", "Ritual Book ESP" }, { "Ritual Object ESP", "Ritual Object ESP" }, { "Ritual Objects", "Ritual Objects" }, { "RitualBook", "RitualBook" }, - { "Roar ESP", "Roar ESP" }, + { "Boar ESP", "Boar ESP" }, { "Role", "Role" }, { "RottenFood", "RottenFood" }, - { "Rotton Food ESP", "Rotton Food ESP" }, + { "Rotten Food ESP", "Rotten Food ESP" }, { "Sam", "Sam" }, { "Shoot Player", "Shoot Player" }, { "Show Coordinates", "Show Coordinates" }, @@ -274,10 +275,22 @@ namespace DevourClient.Localization.Translations { "Unlimited UV Light", "Unlimited UV Light" }, { "Unlock Achievements", "Unlock Achievements" }, { "Unlock Doors", "Unlock Doors" }, + { "God Mode", "God Mode" }, { "Visuals", "Visuals" }, { "Waiting for the game to start", "Waiting for the game to start" }, { "Walk In Lobby", "Walk In Lobby" }, { "Zara", "Zara" }, + { "Gardener", "Gardener" }, + { "Butler", "Butler" }, + { "Bridesmaid 1", "Bridesmaid 1" }, + { "Bridesmaid 2", "Bridesmaid 2" }, + { "Cook", "Cook" }, + { "Groomsman 1", "Groomsman 1" }, + { "Groomsman 2", "Groomsman 2" }, + { "Maid", "Maid" }, + { "Photographer", "Photographer" }, + { "Priest", "Priest" }, + { "Menu Key", "Menu Key" }, }; } } diff --git a/DevourClient/Localization/Translations/FrenchTranslations.cs b/DevourClient/Localization/Translations/FrenchTranslations.cs index aec9591..b3fb2df 100644 --- a/DevourClient/Localization/Translations/FrenchTranslations.cs +++ b/DevourClient/Localization/Translations/FrenchTranslations.cs @@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations { "Ping", "Ping" }, { "Play Random Sound", "Jouer son aléatoire" }, { "Player", "Joueur" }, + { "Instant Interaction", "Interaction instantanée" }, { "Player Count", "Nombre de joueurs" }, { "Player ESP", "ESP joueur" }, { "Player ESP Color", "Couleur ESP joueur" }, @@ -207,17 +208,17 @@ namespace DevourClient.Localization.Translations { "Rat ESP", "ESP rat" }, { "Region", "Région" }, { "Revive", "Réanimer" }, - { "Radial Menu (Z)", "Menu radial (Z)" }, + { "Radial Menu", "Menu radial" }, { "Ritual Book", "Livre rituel" }, { "Rose", "Rose" }, { "Ritual Book ESP", "ESP livre rituel" }, { "Ritual Object ESP", "ESP objet rituel" }, { "Ritual Objects", "Objets rituels" }, { "RitualBook", "Livre rituel" }, - { "Roar ESP", "ESP rugissement" }, + { "Boar ESP", "ESP Sanglier" }, { "Role", "Rôle" }, { "RottenFood", "Nourriture pourrie" }, - { "Rotton Food ESP", "ESP nourriture pourrie" }, + { "Rotten Food ESP", "ESP Nourriture Pourrie" }, { "Sam", "Sam" }, { "Shoot Player", "Tirer sur le joueur" }, { "Show Coordinates", "Afficher coordonnées" }, @@ -271,13 +272,25 @@ namespace DevourClient.Localization.Translations { "US South Central", "Centre-Sud des États-Unis" }, { "US West", "Ouest des États-Unis" }, { "Unlimited Stamina", "Endurance illimitée" }, - { "Unlimited UV Light", "UV illimitée" }, + { "Unlimited UV Light", "UV illimité" }, { "Unlock Achievements", "Débloquer succès" }, { "Unlock Doors", "Déverrouiller portes" }, + { "God Mode", "Mode Dieu" }, { "Visuals", "Visuels" }, - { "Waiting for the game to start", "En attente du démarrage" }, + { "Waiting for the game to start", "En attente du début de la partie" }, { "Walk In Lobby", "Marcher dans le lobby" }, { "Zara", "Zara" }, + { "Bridesmaid 1", "Demoiselle d'honneur 1" }, + { "Bridesmaid 2", "Demoiselle d'honneur 2" }, + { "Butler", "Majordome" }, + { "Cook", "Cuisinier" }, + { "Gardener", "Jardinier" }, + { "Groomsman 1", "Garçon d'honneur 1" }, + { "Groomsman 2", "Garçon d'honneur 2" }, + { "Maid", "Domestique" }, + { "Photographer", "Photographe" }, + { "Priest", "Prêtre" }, + { "Menu Key", "Touche Menu" }, }; } } diff --git a/DevourClient/Localization/Translations/GermanTranslations.cs b/DevourClient/Localization/Translations/GermanTranslations.cs index da22c2b..286fb38 100644 --- a/DevourClient/Localization/Translations/GermanTranslations.cs +++ b/DevourClient/Localization/Translations/GermanTranslations.cs @@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations { "Ping", "Ping" }, { "Play Random Sound", "Zufälligen Sound abspielen" }, { "Player", "Spieler" }, + { "Instant Interaction", "Sofortige Interaktion" }, { "Player Count", "Spieleranzahl" }, { "Player ESP", "Spieler ESP" }, { "Player ESP Color", "Spieler ESP Farbe" }, @@ -207,17 +208,17 @@ namespace DevourClient.Localization.Translations { "Rat ESP", "Ratte-ESP" }, { "Region", "Region" }, { "Revive", "Wiederbeleben" }, - { "Radial Menu (Z)", "Radiales Menü (Z)" }, + { "Radial Menu", "Radiales Menü" }, { "Ritual Book", "Ritualbuch" }, { "Rose", "Rose" }, { "Ritual Book ESP", "Ritualbuch-ESP" }, { "Ritual Object ESP", "Ritualobjekt ESP" }, { "Ritual Objects", "Rituelle Objekte" }, { "RitualBook", "Ritualbuch" }, - { "Roar ESP", "Brüllen-ESP" }, + { "Boar ESP", "Wildschwein-ESP" }, { "Role", "Rolle" }, { "RottenFood", "Verdorbenes Essen" }, - { "Rotton Food ESP", "Verdorbenes-Essen-ESP" }, + { "Rotten Food ESP", "Verrottetes Essen ESP" }, { "Sam", "Sam" }, { "Shoot Player", "Spieler erschießen" }, { "Show Coordinates", "Koordinaten anzeigen" }, @@ -270,14 +271,26 @@ namespace DevourClient.Localization.Translations { "US East", "USA Ost" }, { "US South Central", "USA Süd-Zentral" }, { "US West", "USA West" }, - { "Unlimited Stamina", "Unbegrenzte Ausdauer" }, - { "Unlimited UV Light", "Unbegrenzte UV" }, + { "Unlimited Stamina", "Unendliche Ausdauer" }, + { "Unlimited UV Light", "Unendliches UV-Licht" }, { "Unlock Achievements", "Erfolge freischalten" }, { "Unlock Doors", "Türen öffnen" }, + { "God Mode", "Gottmodus" }, { "Visuals", "Visuals" }, { "Waiting for the game to start", "Warte auf Spielstart" }, { "Walk In Lobby", "Im Lobby laufen" }, { "Zara", "Zara" }, + { "Bridesmaid 1", "Brautjungfer 1" }, + { "Bridesmaid 2", "Brautjungfer 2" }, + { "Butler", "Butler" }, + { "Cook", "Koch" }, + { "Gardener", "Gärtner" }, + { "Groomsman 1", "Trauzeuge 1" }, + { "Groomsman 2", "Trauzeuge 2" }, + { "Maid", "Dienstmädchen" }, + { "Photographer", "Fotograf" }, + { "Priest", "Priester" }, + { "Menu Key", "Menütaste" }, }; } } diff --git a/DevourClient/Localization/Translations/ItalianTranslations.cs b/DevourClient/Localization/Translations/ItalianTranslations.cs index 246a6f7..e208697 100644 --- a/DevourClient/Localization/Translations/ItalianTranslations.cs +++ b/DevourClient/Localization/Translations/ItalianTranslations.cs @@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations { "Ping", "Ping" }, { "Play Random Sound", "Riproduci suono casuale" }, { "Player", "Giocatore" }, + { "Instant Interaction", "Interazione istantanea" }, { "Player Count", "Numero di giocatori" }, { "Player ESP", "ESP giocatore" }, { "Player ESP Color", "Colore ESP giocatore" }, @@ -207,17 +208,17 @@ namespace DevourClient.Localization.Translations { "Rat ESP", "ESP ratto" }, { "Region", "Regione" }, { "Revive", "Rianima" }, - { "Radial Menu (Z)", "Menu radiale (Z)" }, + { "Radial Menu", "Menu radiale" }, { "Ritual Book", "Libro rituale" }, { "Rose", "Rosa" }, { "Ritual Book ESP", "ESP libro rituale" }, { "Ritual Object ESP", "ESP oggetto rituale" }, { "Ritual Objects", "Oggetti rituali" }, { "RitualBook", "Libro rituale" }, - { "Roar ESP", "ESP ruggito" }, + { "Boar ESP", "ESP Cinghiale" }, { "Role", "Ruolo" }, { "RottenFood", "Cibo marcio" }, - { "Rotton Food ESP", "ESP cibo marcio" }, + { "Rotten Food ESP", "ESP Cibo Avariato" }, { "Sam", "Sam" }, { "Shoot Player", "Spara al giocatore" }, { "Show Coordinates", "Mostra coordinate" }, @@ -271,13 +272,25 @@ namespace DevourClient.Localization.Translations { "US South Central", "Centro-Sud USA" }, { "US West", "Ovest USA" }, { "Unlimited Stamina", "Resistenza illimitata" }, - { "Unlimited UV Light", "UV illimitata" }, + { "Unlimited UV Light", "UV illimitato" }, { "Unlock Achievements", "Sblocca obiettivi" }, { "Unlock Doors", "Sblocca porte" }, - { "Visuals", "Visivi" }, - { "Waiting for the game to start", "In attesa dell'inizio del gioco" }, - { "Walk In Lobby", "Camminare in lobby" }, + { "God Mode", "Modalità Dio" }, + { "Visuals", "Visuali" }, + { "Waiting for the game to start", "In attesa dell'inizio della partita" }, + { "Walk In Lobby", "Cammina nel lobby" }, { "Zara", "Zara" }, + { "Bridesmaid 1", "Damigella 1" }, + { "Bridesmaid 2", "Damigella 2" }, + { "Butler", "Maggiordomo" }, + { "Cook", "Cuoco" }, + { "Gardener", "Giardiniere" }, + { "Groomsman 1", "Testimone 1" }, + { "Groomsman 2", "Testimone 2" }, + { "Maid", "Cameriera" }, + { "Photographer", "Fotografo" }, + { "Priest", "Prete" }, + { "Menu Key", "Tasto Menu" }, }; } } diff --git a/DevourClient/Localization/Translations/JapaneseTranslations.cs b/DevourClient/Localization/Translations/JapaneseTranslations.cs index 3af4799..67bbc8f 100644 --- a/DevourClient/Localization/Translations/JapaneseTranslations.cs +++ b/DevourClient/Localization/Translations/JapaneseTranslations.cs @@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations { "Ping", "Ping" }, { "Play Random Sound", "ランダム音再生" }, { "Player", "プレイヤー" }, + { "Instant Interaction", "即時インタラクション" }, { "Player Count", "プレイヤー数" }, { "Player ESP", "プレイヤーESP" }, { "Player ESP Color", "プレイヤーESP色" }, @@ -207,17 +208,17 @@ namespace DevourClient.Localization.Translations { "Rat ESP", "ネズミESP" }, { "Region", "地域" }, { "Revive", "蘇生" }, - { "Radial Menu (Z)", "ラジアルメニュー (Z)" }, + { "Radial Menu", "ラジアルメニュー" }, { "Ritual Book", "儀式の本" }, { "Rose", "バラ" }, { "Ritual Book ESP", "儀式の本ESP" }, { "Ritual Object ESP", "儀式オブジェクトESP" }, { "Ritual Objects", "儀式の品" }, { "RitualBook", "儀式の本" }, - { "Roar ESP", "咆哮ESP" }, + { "Boar ESP", "イノシシESP" }, { "Role", "役割" }, { "RottenFood", "腐った食べ物" }, - { "Rotton Food ESP", "腐った食べ物ESP" }, + { "Rotten Food ESP", "腐った食べ物ESP" }, { "Sam", "サム" }, { "Shoot Player", "プレイヤーを撃つ" }, { "Show Coordinates", "座標を表示" }, @@ -271,13 +272,25 @@ namespace DevourClient.Localization.Translations { "US South Central", "米国中南部" }, { "US West", "米国西部" }, { "Unlimited Stamina", "無限スタミナ" }, - { "Unlimited UV Light", "無限UV" }, - { "Unlock Achievements", "実績解除" }, - { "Unlock Doors", "ドアを開ける" }, + { "Unlimited UV Light", "無制限UV" }, + { "Unlock Achievements", "実績の解除" }, + { "Unlock Doors", "ドアの解除" }, + { "God Mode", "神モード" }, { "Visuals", "ビジュアル" }, { "Waiting for the game to start", "ゲーム開始を待っています" }, { "Walk In Lobby", "ロビーで歩く" }, { "Zara", "ザラ" }, + { "Bridesmaid 1", "ブライズメイド 1" }, + { "Bridesmaid 2", "ブライズメイド 2" }, + { "Butler", "執事" }, + { "Cook", "料理人" }, + { "Gardener", "庭師" }, + { "Groomsman 1", "グルームズマン 1" }, + { "Groomsman 2", "グルームズマン 2" }, + { "Maid", "メイド" }, + { "Photographer", "写真家" }, + { "Priest", "司祭" }, + { "Menu Key", "メニューキー" }, }; } } diff --git a/DevourClient/Localization/Translations/KoreanTranslations.cs b/DevourClient/Localization/Translations/KoreanTranslations.cs index 13ab649..2a5d072 100644 --- a/DevourClient/Localization/Translations/KoreanTranslations.cs +++ b/DevourClient/Localization/Translations/KoreanTranslations.cs @@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations { "Ping", "핑" }, { "Play Random Sound", "랜덤 사운드 재생" }, { "Player", "플레이어" }, + { "Instant Interaction", "즉시 상호작용" }, { "Player Count", "플레이어 수" }, { "Player ESP", "플레이어 ESP" }, { "Player ESP Color", "플레이어 ESP 색상" }, @@ -207,17 +208,17 @@ namespace DevourClient.Localization.Translations { "Rat ESP", "쥐 ESP" }, { "Region", "지역" }, { "Revive", "부활" }, - { "Radial Menu (Z)", "방사형 메뉴 (Z)" }, + { "Radial Menu", "방사형 메뉴" }, { "Ritual Book", "의식서" }, { "Rose", "장미" }, { "Ritual Book ESP", "의식서 ESP" }, { "Ritual Object ESP", "의식 물체 ESP" }, { "Ritual Objects", "의식 물품" }, { "RitualBook", "의식서" }, - { "Roar ESP", "으르렁 ESP" }, + { "Boar ESP", "멧돼지 ESP" }, { "Role", "역할" }, { "RottenFood", "썩은 음식" }, - { "Rotton Food ESP", "썩은 음식 ESP" }, + { "Rotten Food ESP", "썩은 음식 ESP" }, { "Sam", "샘" }, { "Shoot Player", "플레이어 쏘기" }, { "Show Coordinates", "좌표 표시" }, @@ -274,10 +275,22 @@ namespace DevourClient.Localization.Translations { "Unlimited UV Light", "무제한 UV" }, { "Unlock Achievements", "업적 잠금 해제" }, { "Unlock Doors", "문 잠금 해제" }, + { "God Mode", "신 모드" }, { "Visuals", "비주얼" }, { "Waiting for the game to start", "게임 시작 대기 중" }, { "Walk In Lobby", "로비에서 걷기" }, { "Zara", "자라" }, + { "Bridesmaid 1", "신부 들러리 1" }, + { "Bridesmaid 2", "신부 들러리 2" }, + { "Butler", "집사" }, + { "Cook", "요리사" }, + { "Gardener", "정원사" }, + { "Groomsman 1", "신랑 들러리 1" }, + { "Groomsman 2", "신랑 들러리 2" }, + { "Maid", "하녀" }, + { "Photographer", "사진가" }, + { "Priest", "사제" }, + { "Menu Key", "메뉴 키" }, }; } } diff --git a/DevourClient/Localization/Translations/PortugueseTranslations.cs b/DevourClient/Localization/Translations/PortugueseTranslations.cs index b5fae02..50b5876 100644 --- a/DevourClient/Localization/Translations/PortugueseTranslations.cs +++ b/DevourClient/Localization/Translations/PortugueseTranslations.cs @@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations { "Ping", "Ping" }, { "Play Random Sound", "Reproduzir som aleatório" }, { "Player", "Jogador" }, + { "Instant Interaction", "Interação instantânea" }, { "Player Count", "Número de jogadores" }, { "Player ESP", "ESP jogador" }, { "Player ESP Color", "Cor ESP jogador" }, @@ -207,17 +208,17 @@ namespace DevourClient.Localization.Translations { "Rat ESP", "ESP rato" }, { "Region", "Região" }, { "Revive", "Reviver" }, - { "Radial Menu (Z)", "Menu radial (Z)" }, + { "Radial Menu", "Menu radial" }, { "Ritual Book", "Livro ritual" }, { "Rose", "Rosa" }, { "Ritual Book ESP", "ESP livro ritual" }, { "Ritual Object ESP", "ESP objeto ritual" }, { "Ritual Objects", "Objetos rituais" }, { "RitualBook", "Livro ritual" }, - { "Roar ESP", "ESP rugido" }, + { "Boar ESP", "ESP Javali" }, { "Role", "Função" }, { "RottenFood", "Comida podre" }, - { "Rotton Food ESP", "ESP comida podre" }, + { "Rotten Food ESP", "ESP comida podre" }, { "Sam", "Sam" }, { "Shoot Player", "Atirar no jogador" }, { "Show Coordinates", "Mostrar coordenadas" }, @@ -271,13 +272,25 @@ namespace DevourClient.Localization.Translations { "US South Central", "Centro-Sul dos EUA" }, { "US West", "Oeste dos EUA" }, { "Unlimited Stamina", "Resistência ilimitada" }, - { "Unlimited UV Light", "UV ilimitada" }, + { "Unlimited UV Light", "UV ilimitado" }, { "Unlock Achievements", "Desbloquear conquistas" }, { "Unlock Doors", "Desbloquear portas" }, + { "God Mode", "Modo Deus" }, { "Visuals", "Visuais" }, { "Waiting for the game to start", "Aguardando início do jogo" }, { "Walk In Lobby", "Andar no lobby" }, { "Zara", "Zara" }, + { "Bridesmaid 1", "Dama de honra 1" }, + { "Bridesmaid 2", "Dama de honra 2" }, + { "Butler", "Mordomo" }, + { "Cook", "Cozinheiro" }, + { "Gardener", "Jardineiro" }, + { "Groomsman 1", "Padrinho 1" }, + { "Groomsman 2", "Padrinho 2" }, + { "Maid", "Empregada" }, + { "Photographer", "Fotógrafo" }, + { "Priest", "Padre" }, + { "Menu Key", "Tecla de Menu" }, }; } } diff --git a/DevourClient/Localization/Translations/RussianTranslations.cs b/DevourClient/Localization/Translations/RussianTranslations.cs index f7e036c..d709dfc 100644 --- a/DevourClient/Localization/Translations/RussianTranslations.cs +++ b/DevourClient/Localization/Translations/RussianTranslations.cs @@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations { "Ping", "Пинг" }, { "Play Random Sound", "Воспроизвести случайный звук" }, { "Player", "Игрок" }, + { "Instant Interaction", "Мгновенное взаимодействие" }, { "Player Count", "Количество игроков" }, { "Player ESP", "ESP игрока" }, { "Player ESP Color", "Цвет ESP игрока" }, @@ -207,17 +208,17 @@ namespace DevourClient.Localization.Translations { "Rat ESP", "ESP крысы" }, { "Region", "Регион" }, { "Revive", "Воскресить" }, - { "Radial Menu (Z)", "Радиальное меню (Z)" }, + { "Radial Menu", "Радиальное меню" }, { "Ritual Book", "Ритуальная книга" }, { "Rose", "Роза" }, { "Ritual Book ESP", "ESP ритуальной книги" }, { "Ritual Object ESP", "ESP ритуального предмета" }, { "Ritual Objects", "Ритуальные предметы" }, { "RitualBook", "Ритуальная книга" }, - { "Roar ESP", "ESP рёва" }, + { "Boar ESP", "ESP Кабана" }, { "Role", "Роль" }, { "RottenFood", "Гнилая еда" }, - { "Rotton Food ESP", "ESP гнилой еды" }, + { "Rotten Food ESP", "ESP Гнилая Еда" }, { "Sam", "Сэм" }, { "Shoot Player", "Стрелять в игрока" }, { "Show Coordinates", "Показать координаты" }, @@ -271,13 +272,25 @@ namespace DevourClient.Localization.Translations { "US South Central", "Юго-Центральная часть США" }, { "US West", "Запад США" }, { "Unlimited Stamina", "Безлимитная выносливость" }, - { "Unlimited UV Light", "Безлимитный УФ" }, + { "Unlimited UV Light", "Неограниченный УФ" }, { "Unlock Achievements", "Разблокировать достижения" }, { "Unlock Doors", "Открыть двери" }, - { "Visuals", "Визуалы" }, + { "God Mode", "Режим Бога" }, + { "Visuals", "Визуализация" }, { "Waiting for the game to start", "Ожидание начала игры" }, { "Walk In Lobby", "Ходить в лобби" }, { "Zara", "Зара" }, + { "Bridesmaid 1", "Подружка невесты 1" }, + { "Bridesmaid 2", "Подружка невесты 2" }, + { "Butler", "Дворецкий" }, + { "Cook", "Повар" }, + { "Gardener", "Садовник" }, + { "Groomsman 1", "Шафер 1" }, + { "Groomsman 2", "Шафер 2" }, + { "Maid", "Горничная" }, + { "Photographer", "Фотограф" }, + { "Priest", "Священник" }, + { "Menu Key", "Клавиша меню" }, }; } } diff --git a/DevourClient/Localization/Translations/SpanishTranslations.cs b/DevourClient/Localization/Translations/SpanishTranslations.cs index 0571f84..ef75a92 100644 --- a/DevourClient/Localization/Translations/SpanishTranslations.cs +++ b/DevourClient/Localization/Translations/SpanishTranslations.cs @@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations { "Ping", "Ping" }, { "Play Random Sound", "Reproducir sonido aleatorio" }, { "Player", "Jugador" }, + { "Instant Interaction", "Interacción instantánea" }, { "Player Count", "Número de jugadores" }, { "Player ESP", "ESP jugador" }, { "Player ESP Color", "Color ESP jugador" }, @@ -207,17 +208,17 @@ namespace DevourClient.Localization.Translations { "Rat ESP", "ESP rata" }, { "Region", "Región" }, { "Revive", "Revivir" }, - { "Radial Menu (Z)", "Menú radial (Z)" }, + { "Radial Menu", "Menú radial" }, { "Ritual Book", "Libro ritual" }, { "Rose", "Rosa" }, { "Ritual Book ESP", "ESP libro ritual" }, { "Ritual Object ESP", "ESP objeto ritual" }, { "Ritual Objects", "Objetos rituales" }, { "RitualBook", "Libro ritual" }, - { "Roar ESP", "ESP rugido" }, + { "Boar ESP", "ESP Jabalí" }, { "Role", "Rol" }, { "RottenFood", "Comida podrida" }, - { "Rotton Food ESP", "ESP comida podrida" }, + { "Rotten Food ESP", "ESP Comida Podrida" }, { "Sam", "Sam" }, { "Shoot Player", "Disparar al jugador" }, { "Show Coordinates", "Mostrar coordenadas" }, @@ -271,13 +272,25 @@ namespace DevourClient.Localization.Translations { "US South Central", "Centro-Sur de EE.UU." }, { "US West", "Oeste de EE.UU." }, { "Unlimited Stamina", "Resistencia ilimitada" }, - { "Unlimited UV Light", "UV ilimitada" }, + { "Unlimited UV Light", "UV ilimitado" }, { "Unlock Achievements", "Desbloquear logros" }, { "Unlock Doors", "Desbloquear puertas" }, + { "God Mode", "Modo Dios" }, { "Visuals", "Visuales" }, - { "Waiting for the game to start", "Esperando inicio del juego" }, + { "Waiting for the game to start", "Esperando a que empiece la partida" }, { "Walk In Lobby", "Caminar en lobby" }, { "Zara", "Zara" }, + { "Bridesmaid 1", "Dama de honor 1" }, + { "Bridesmaid 2", "Dama de honor 2" }, + { "Butler", "Mayordomo" }, + { "Cook", "Cocinero" }, + { "Gardener", "Jardinero" }, + { "Groomsman 1", "Padrino 1" }, + { "Groomsman 2", "Padrino 2" }, + { "Maid", "Criada" }, + { "Photographer", "Fotógrafo" }, + { "Priest", "Sacerdote" }, + { "Menu Key", "Tecla de Menú" }, }; } } diff --git a/DevourClient/Localization/Translations/VietnameseTranslations.cs b/DevourClient/Localization/Translations/VietnameseTranslations.cs index b58dc59..005e7c9 100644 --- a/DevourClient/Localization/Translations/VietnameseTranslations.cs +++ b/DevourClient/Localization/Translations/VietnameseTranslations.cs @@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations { "Ping", "Ping" }, { "Play Random Sound", "Phát âm thanh ngẫu nhiên" }, { "Player", "Người chơi" }, + { "Instant Interaction", "Tương tác tức thì" }, { "Player Count", "Số người chơi" }, { "Player ESP", "Người chơi ESP" }, { "Player ESP Color", "Màu người chơi ESP" }, @@ -207,17 +208,17 @@ namespace DevourClient.Localization.Translations { "Rat ESP", "Chuột ESP" }, { "Region", "Khu vực" }, { "Revive", "Hồi sinh" }, - { "Radial Menu (Z)", "Menu vòng tròn (Z)" }, + { "Radial Menu", "Menu vòng tròn" }, { "Ritual Book", "Sách nghi lễ" }, { "Rose", "Hoa hồng" }, { "Ritual Book ESP", "Sách nghi lễ ESP" }, { "Ritual Object ESP", "Vật phẩm nghi lễ ESP" }, { "Ritual Objects", "Vật phẩm nghi lễ" }, { "RitualBook", "RitualBook" }, - { "Roar ESP", "Tiếng gầm ESP" }, + { "Boar ESP", "Lợn rừng ESP" }, { "Role", "Vai trò" }, { "RottenFood", "RottenFood" }, - { "Rotton Food ESP", "Thức ăn thối ESP" }, + { "Rotten Food ESP", "Thức ăn thối ESP" }, { "Sam", "Sam" }, { "Shoot Player", "Bắn người chơi" }, { "Show Coordinates", "Hiển thị tọa độ" }, @@ -271,13 +272,25 @@ namespace DevourClient.Localization.Translations { "US South Central", "US Nam Trung" }, { "US West", "US Tây" }, { "Unlimited Stamina", "Thể lực vô hạn" }, - { "Unlimited UV Light", "Ánh sáng UV vô hạn" }, + { "Unlimited UV Light", "UV không giới hạn" }, { "Unlock Achievements", "Mở khóa thành tựu" }, { "Unlock Doors", "Mở khóa cửa" }, + { "God Mode", "Chế độ Thần" }, { "Visuals", "Hình ảnh" }, - { "Waiting for the game to start", "Đang chờ game bắt đầu" }, - { "Walk In Lobby", "Đi bộ trong phòng chờ" }, + { "Waiting for the game to start", "Đang chờ bắt đầu trò chơi" }, + { "Walk In Lobby", "Đi trong sảnh" }, { "Zara", "Zara" }, + { "Bridesmaid 1", "Phù dâu 1" }, + { "Bridesmaid 2", "Phù dâu 2" }, + { "Butler", "Quản gia" }, + { "Cook", "Đầu bếp" }, + { "Gardener", "Người làm vườn" }, + { "Groomsman 1", "Phù rể 1" }, + { "Groomsman 2", "Phù rể 2" }, + { "Maid", "Hầu gái" }, + { "Photographer", "Nhiếp ảnh gia" }, + { "Priest", "Linh mục" }, + { "Menu Key", "Phím Menu" }, }; } } diff --git a/DevourClient/MelonMain.cs b/DevourClient/MelonMain.cs index 65d1df1..f27d524 100644 --- a/DevourClient/MelonMain.cs +++ b/DevourClient/MelonMain.cs @@ -1,4 +1,4 @@ -/* +/* Note about license. As stated in the GPL FAQ : You are allowed to sell copies of the modified program commercially, but only under the terms of the GNU GPL. Thus, for instance, you must make the source code available to the users of the program as described in the GPL, @@ -9,6 +9,8 @@ If you decide to modify and then sell this software you have to agree with the G using UnityEngine; using Il2CppInterop.Runtime.Injection; +using HarmonyLib; +using System.Reflection; [assembly: MelonLoader.VerifyLoaderVersion(0, 6, 0, true)] //Minimum MelonLoader version is V6.0.0, sanity check for people who use 5.7 and wonder why it crashes :) [assembly: MelonLoader.MelonInfo(typeof(DevourClient.Load), "DevourClient", "2", "ALittlePatate & Jadis0x")] @@ -34,6 +36,25 @@ namespace DevourClient public override void OnInitializeMelon() { Init(); + try + { + var harmony = new HarmonyLib.Harmony("DevourClient.Hooks"); + harmony.PatchAll(Assembly.GetExecutingAssembly()); + MelonLoader.MelonLogger.Msg("Harmony patches applied."); + } + catch (System.Exception ex) + { + MelonLoader.MelonLogger.Error($"Failed to apply Harmony patches: {ex.Message}"); + } + } + public override void OnSceneWasLoaded(int buildIndex, string sceneName) + { + if (sceneName == "Menu" && ClientMain.godMode) + { + ClientMain.godMode = false; + ClientMain.godModeOriginalLayer = -1; + MelonLoader.MelonLogger.Msg("God Mode disabled on return to menu."); + } } } } diff --git a/DevourClient/Network/LobbyManager.cs b/DevourClient/Network/LobbyManager.cs index 747e5b6..efed9a0 100644 --- a/DevourClient/Network/LobbyManager.cs +++ b/DevourClient/Network/LobbyManager.cs @@ -28,7 +28,7 @@ namespace DevourClient.Network } // Get PhotonRegion - PhotonRegion region = GetPhotonRegion(regionCode); + PhotonRegion? region = GetPhotonRegion(regionCode); if (region == null) { MelonLogger.Error($"[LobbyManager] Failed to find region: {regionCode}"); @@ -36,7 +36,7 @@ namespace DevourClient.Network } // Find Menu controller - Il2CppHorror.Menu menu = FindMenuController(); + Il2CppHorror.Menu? menu = FindMenuController(); if (menu == null) { MelonLogger.Error("[LobbyManager] Failed to find MenuController"); @@ -92,7 +92,7 @@ namespace DevourClient.Network } } - private static PhotonRegion GetPhotonRegion(string regionCode) + private static PhotonRegion? GetPhotonRegion(string regionCode) { try { @@ -106,7 +106,7 @@ namespace DevourClient.Network } } - private static Il2CppHorror.Menu FindMenuController() + private static Il2CppHorror.Menu? FindMenuController() { try { @@ -156,7 +156,7 @@ namespace DevourClient.Network return; } - Il2CppHorror.Menu menu = FindMenuController(); + Il2CppHorror.Menu? menu = FindMenuController(); if (menu == null) { MelonLogger.Error("[LobbyManager] Failed to find MenuController"); @@ -177,7 +177,7 @@ namespace DevourClient.Network { try { - Il2CppHorror.Menu menu = FindMenuController(); + Il2CppHorror.Menu? menu = FindMenuController(); if (menu != null) { menu.ShowMessageModal(message); diff --git a/DevourClient/Network/RegionHelper.cs b/DevourClient/Network/RegionHelper.cs index de70ac2..c9b1475 100644 --- a/DevourClient/Network/RegionHelper.cs +++ b/DevourClient/Network/RegionHelper.cs @@ -62,7 +62,7 @@ namespace DevourClient.Network // Get display name by region code (multilanguage support) public static string GetDisplayNameByCode(string code) { - if (AvailableRegions.TryGetValue(code, out string englishName)) + if (AvailableRegions.TryGetValue(code, out string? englishName)) { // Use MultiLanguageSystem to translate region names return MultiLanguageSystem.Translate(englishName); diff --git a/DevourClient/RadialMenuManager.cs b/DevourClient/RadialMenuManager.cs index 9eda661..74ca8dc 100644 --- a/DevourClient/RadialMenuManager.cs +++ b/DevourClient/RadialMenuManager.cs @@ -21,7 +21,7 @@ namespace DevourClient private static bool _enabled = true; // Controls whether the radial menu is enabled // Material used to draw radial arcs (GL immediate mode) - private static Material _radialMaterial; + private static Material? _radialMaterial; // Public property to enable/disable the radial menu public static bool Enabled @@ -51,12 +51,13 @@ namespace DevourClient if (!_enabled || !Player.IsInGameOrLobby()) return; - if (Input.GetKeyDown(KeyCode.Z)) + KeyCode key = Settings.Settings.radialMenuKey; + if (key != KeyCode.None && Input.GetKeyDown(key)) { BuildForCurrentScene(); } - if (Input.GetKeyUp(KeyCode.Z) && _active) + if (key != KeyCode.None && Input.GetKeyUp(key) && _active) { if (_selectedIndex >= 0 && _selectedIndex < _options.Count) { diff --git a/DevourClient/Settings/Settings.cs b/DevourClient/Settings/Settings.cs index 7d554d7..edf721b 100644 --- a/DevourClient/Settings/Settings.cs +++ b/DevourClient/Settings/Settings.cs @@ -14,8 +14,10 @@ namespace DevourClient.Settings public static Color player_esp_color = new Color(0.00f, 1.00f, 0.00f, 1); public static Color azazel_esp_color = new Color(1.00f, 0.00f, 0.00f, 1); public static float speed = 1f; + public static KeyCode menuToggleKey = KeyCode.Insert; public static KeyCode flyKey = KeyCode.None; public static KeyCode teleportKey = KeyCode.B; + public static KeyCode radialMenuKey = KeyCode.Z; public static Vector2 itemsScrollPosition = Vector2.zero; public static Vector2 rituelObjectsScrollPosition = Vector2.zero; public static Vector2 stuffsScrollPosition = Vector2.zero; diff --git a/DevourClient/UI/ClientMenu.cs b/DevourClient/UI/ClientMenu.cs new file mode 100644 index 0000000..77ea123 --- /dev/null +++ b/DevourClient/UI/ClientMenu.cs @@ -0,0 +1,362 @@ +using DevourClient.Helpers; +using DevourClient.Localization; +using UnityEngine; + +namespace DevourClient.UI +{ + internal static class ClientMenu + { + internal static void Draw() + { + string currentScene = Helpers.Map.GetActiveScene(); + if (currentScene != ClientMain.lastESPScene) + { + ESP.ItemESPConfig.ResetAllStates(); + ClientMain.lastESPScene = currentScene; + } + + if (ClientMain.should_show_start_message) + { + if (DevourClient.Hacks.Misc.ShowMessageBox("Welcome to DevourClient.\n\nPress the INS key to open the menu.") == 0) + ClientMain.should_show_start_message = false; + } + + Color originalBackgroundColor = GUI.backgroundColor; + GUISkin originalSkin = GUI.skin; + + try + { + GUI.backgroundColor = Color.grey; + + GUI.skin.button.normal.background = GUIHelper.MakeTex(2, 2, Color.black); + GUI.skin.button.normal.textColor = Color.white; + GUI.skin.button.hover.background = GUIHelper.MakeTex(2, 2, Color.green); + GUI.skin.button.hover.textColor = Color.black; + + GUI.skin.toggle.onNormal.textColor = Color.yellow; + + GUI.skin.textField.normal.background = GUIHelper.MakeTex(2, 2, new Color(0.2f, 0.2f, 0.2f, 0.8f)); + GUI.skin.textField.normal.textColor = Color.white; + GUI.skin.textField.focused.background = GUIHelper.MakeTex(2, 2, new Color(0.3f, 0.5f, 0.3f, 0.9f)); + GUI.skin.textField.focused.textColor = Color.white; + GUI.skin.textField.hover.background = GUIHelper.MakeTex(2, 2, new Color(0.25f, 0.25f, 0.25f, 0.85f)); + GUI.skin.textField.border = new RectOffset(4, 4, 4, 4); + GUI.skin.textField.padding = new RectOffset(6, 6, 4, 4); + GUI.skin.textField.fontSize = 14; + GUI.skin.textField.alignment = TextAnchor.MiddleLeft; + + GUI.skin.label.normal.textColor = Color.white; + + GUI.skin.horizontalSlider.normal.background = GUIHelper.MakeTex(2, 2, new Color(0.3f, 0.3f, 0.3f, 0.8f)); + GUI.skin.horizontalSliderThumb.normal.background = GUIHelper.MakeTex(2, 2, Color.white); + + if (UnityEngine.Event.current.type == EventType.Repaint) + { + RenderRepaint(); + } + + if (ClientMain.crosshair && ClientMain.in_game_cache) + { + const float crosshairSize = 4f; + + float xMin = Settings.Settings.width - (crosshairSize / 2f); + float yMin = Settings.Settings.height - (crosshairSize / 2f); + + if (ClientMain.crosshairTexture == null) + { + ClientMain.crosshairTexture = Helpers.GUIHelper.GetCircularTexture(5, 5); + } + + GUI.DrawTexture(new Rect(xMin, yMin, crosshairSize, crosshairSize), ClientMain.crosshairTexture); + } + + RadialMenuManager.HandleOnGUI(); + + if (Settings.Settings.menu_enable) + { + ClientMain.windowRect = GUI.Window(0, ClientMain.windowRect, (GUI.WindowFunction)ClientTabs.DrawTabs, "DevourClient"); + } + } + catch (System.Exception ex) + { + MelonLoader.MelonLogger.Msg($"OnGUI Error: {ex.Message}"); + } + finally + { + GUI.backgroundColor = originalBackgroundColor; + GUI.skin = originalSkin; + } + } + + private static void RenderRepaint() + { + if (ClientMain.player_esp || ClientMain.player_snapline || ClientMain.player_skel_esp) + { + foreach (Helpers.BasePlayer p in Helpers.Entities.Players) + { + if (p == null) + { + continue; + } + + GameObject player = p.p_GameObject; + if (player != null) + { + Il2Cpp.NolanBehaviour nb = player.GetComponent(); + if (nb.entity.IsOwner) + { + continue; + } + + if (ClientMain.player_skel_esp) + { + Render.Render.DrawAllBones(DevourClient.Hacks.Misc.GetAllBones(nb.animator), Settings.Settings.player_esp_color); + } + + Render.Render.DrawBoxESP(player, -0.25f, 1.75f, p.Name, Settings.Settings.player_esp_color, ClientMain.player_snapline, ClientMain.player_esp); + } + } + } + + if (ClientMain.goat_rat_esp) + { + foreach (Il2Cpp.GoatBehaviour goat in Helpers.Entities.GoatsAndRats) + { + if (goat != null) + { + string itemName = goat.name.Replace("Survival", "").Replace("(Clone)", ""); + + if (ESP.ItemESPConfig.ShouldShowESP(itemName)) + { + string translatedName = MultiLanguageSystem.Translate(itemName); + Render.Render.DrawNameESP(goat.transform.position, translatedName, new Color(0.94f, 0.61f, 0.18f, 1.0f)); + } + } + } + } + + if (ClientMain.item_esp) + { + foreach (Il2Cpp.SurvivalInteractable obj in Helpers.Entities.SurvivalInteractables) + { + if (obj != null) + { + string itemName = obj.prefabName.Replace("Survival", ""); + + if (ESP.ItemESPConfig.ShouldShowESP(itemName)) + { + string translatedName = MultiLanguageSystem.Translate(itemName); + Render.Render.DrawNameESP(obj.transform.position, translatedName, new Color(1.0f, 1.0f, 1.0f)); + } + } + } + + foreach (Il2Cpp.KeyBehaviour key in Helpers.Entities.Keys) + { + if (key != null) + { + if (ESP.ItemESPConfig.ShouldShowESP("Key")) + { + string translatedName = MultiLanguageSystem.Translate("Key"); + Render.Render.DrawNameESP(key.transform.position, translatedName, new Color(1.0f, 1.0f, 1.0f)); + } + } + } + } + + if (Helpers.Entities.Collectables != null) + { + if (ESP.ItemESPConfig.GetESPState(ESP.ItemESPConfig.ESPType.Collectables)) + { + Vector3 playerPosition = Vector3.zero; + if (Camera.main != null) + { + playerPosition = Camera.main.transform.position; + } + else if (DevourClient.Helpers.Player.GetPlayer() != null) + { + playerPosition = DevourClient.Helpers.Player.GetPlayer().transform.position; + } + + foreach (Il2Cpp.CollectableInteractable collectable in Helpers.Entities.Collectables) + { + if (collectable != null && collectable.gameObject != null) + { + string itemName = collectable.gameObject.name.Replace("Survival", "").Replace("(Clone)", "").Trim(); + + string displayName = ""; + Color espColor = new Color(1.0f, 0.84f, 0.0f, 1.0f); + + string lowerName = itemName.ToLower(); + if (lowerName.Contains("rose") || lowerName.Contains("collectable")) + { + displayName = MultiLanguageSystem.Translate("Rose"); + } + else if (lowerName.Contains("patch")) + { + displayName = MultiLanguageSystem.Translate("Patch"); + } + else if (lowerName.Contains("cherry") || lowerName.Contains("blossom")) + { + displayName = MultiLanguageSystem.Translate("Cherry Blossom"); + } + else if (lowerName.Contains("horseshoe")) + { + displayName = MultiLanguageSystem.Translate("Horseshoe"); + } + else if (lowerName.Contains("barbed") || lowerName.Contains("wire")) + { + displayName = MultiLanguageSystem.Translate("Barbed Wire"); + } + else if (lowerName.Contains("feather")) + { + displayName = MultiLanguageSystem.Translate("Feather"); + } + else if (lowerName.Contains("ticket")) + { + displayName = MultiLanguageSystem.Translate("Ticket"); + } + else if (lowerName.Contains("pumpkin")) + { + displayName = MultiLanguageSystem.Translate("Pumpkin"); + } + else if (lowerName.Contains("present")) + { + displayName = MultiLanguageSystem.Translate("Present"); + } + else + { + displayName = itemName; + } + + if (!string.IsNullOrEmpty(displayName)) + { + Render.Render.DrawNameESP(collectable.transform.position, displayName, espColor); + } + } + } + } + } + + if (ClientMain.demon_esp) + { + foreach (Il2Cpp.SurvivalDemonBehaviour demon in Helpers.Entities.Demons) + { + if (demon != null) + { + string enemyName = demon.name.Replace("Survival", "").Replace("(Clone)", ""); + + if (ESP.ItemESPConfig.ShouldShowESP(enemyName)) + { + string translatedName = MultiLanguageSystem.Translate(enemyName); + Render.Render.DrawNameESP(demon.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); + } + } + } + + foreach (Il2Cpp.SpiderBehaviour spider in Helpers.Entities.Spiders) + { + if (spider != null && ESP.ItemESPConfig.ShouldShowESP("Spider")) + { + string translatedName = MultiLanguageSystem.Translate("Spider"); + Render.Render.DrawNameESP(spider.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); + } + } + + foreach (Il2Cpp.GhostBehaviour ghost in Helpers.Entities.Ghosts) + { + if (ghost != null && ESP.ItemESPConfig.ShouldShowESP("Ghost")) + { + string translatedName = MultiLanguageSystem.Translate("Ghost"); + Render.Render.DrawNameESP(ghost.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); + } + } + + foreach (Il2Cpp.BoarBehaviour boar in Helpers.Entities.Boars) + { + if (boar != null && ESP.ItemESPConfig.ShouldShowESP("Boar")) + { + string translatedName = MultiLanguageSystem.Translate("Boar"); + Render.Render.DrawNameESP(boar.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); + } + } + + foreach (Il2Cpp.CorpseBehaviour corpse in Helpers.Entities.Corpses) + { + if (corpse != null && ESP.ItemESPConfig.ShouldShowESP("Corpse")) + { + string translatedName = MultiLanguageSystem.Translate("Corpse"); + Render.Render.DrawNameESP(corpse.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); + } + } + + foreach (Il2Cpp.CrowBehaviour crow in Helpers.Entities.Crows) + { + if (crow != null && ESP.ItemESPConfig.ShouldShowESP("Crow")) + { + string translatedName = MultiLanguageSystem.Translate("Crow"); + Render.Render.DrawNameESP(crow.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); + } + } + + foreach (Il2Cpp.ManorLumpController lump in Helpers.Entities.Lumps) + { + if (lump != null && ESP.ItemESPConfig.ShouldShowESP("Lump")) + { + string translatedName = MultiLanguageSystem.Translate("Lump"); + Render.Render.DrawNameESP(lump.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); + } + } + + foreach (Il2Cpp.GoatBehaviour dirtyHead in Helpers.Entities.DirtyHeads) + { + if (dirtyHead != null && ESP.ItemESPConfig.ShouldShowESP("DirtyHead")) + { + string translatedName = MultiLanguageSystem.Translate("DirtyHead"); + Render.Render.DrawNameESP(dirtyHead.transform.position, translatedName, new Color(0.94f, 0.61f, 0.18f, 1.0f)); + } + } + + foreach (Il2Cpp.MonkeyBehaviour monkey in Helpers.Entities.Monkeys) + { + if (monkey != null && ESP.ItemESPConfig.ShouldShowESP("Monkey")) + { + string translatedName = MultiLanguageSystem.Translate("Monkey"); + Render.Render.DrawNameESP(monkey.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); + } + } + + foreach (Il2Cpp.GoatBehaviour doll in Helpers.Entities.Dolls) + { + if (doll != null) + { + string itemName = doll.name.Replace("Survival", "").Replace("(Clone)", ""); + + if (ESP.ItemESPConfig.ShouldShowESP(itemName)) + { + string translatedName = MultiLanguageSystem.Translate(itemName); + Render.Render.DrawNameESP(doll.transform.position, translatedName, new Color(1.0f, 0.0f, 0.0f, 1.0f)); + } + } + } + } + + if (ClientMain.azazel_esp || ClientMain.azazel_snapline || ClientMain.azazel_skel_esp) + { + foreach (Il2Cpp.SurvivalAzazelBehaviour survivalAzazel in Helpers.Entities.Azazels) + { + if (survivalAzazel != null) + { + if (ClientMain.azazel_skel_esp) + { + Render.Render.DrawAllBones(DevourClient.Hacks.Misc.GetAllBones(survivalAzazel.animator), Settings.Settings.azazel_esp_color); + } + + string translatedName = MultiLanguageSystem.Translate("Azazel"); + Render.Render.DrawBoxESP(survivalAzazel.gameObject, -0.25f, 2.0f, translatedName, Settings.Settings.azazel_esp_color, ClientMain.azazel_snapline, ClientMain.azazel_esp); + } + } + } + } + } +} diff --git a/DevourClient/UI/ClientTabs.ESP.cs b/DevourClient/UI/ClientTabs.ESP.cs new file mode 100644 index 0000000..971ea7b --- /dev/null +++ b/DevourClient/UI/ClientTabs.ESP.cs @@ -0,0 +1,116 @@ +using DevourClient.Helpers; +using DevourClient.Localization; +using UnityEngine; + +namespace DevourClient.UI +{ + internal static partial class ClientTabs + { + private static void EspTab() + { + ClientMain.player_esp = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 150, 20), ClientMain.player_esp, MultiLanguageSystem.Translate("Player ESP")); + ClientMain.player_skel_esp = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 100, 150, 20), ClientMain.player_skel_esp, MultiLanguageSystem.Translate("Skeleton ESP")); + ClientMain.player_snapline = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 130, 150, 20), ClientMain.player_snapline, MultiLanguageSystem.Translate("Player Snapline")); + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 160, 130, 30), MultiLanguageSystem.Translate("Player ESP Color"))) + { + ClientMain.player_esp_colorpick = !ClientMain.player_esp_colorpick; + } + + if (ClientMain.player_esp_colorpick) + { + Color player_esp_color_input = GUIHelper.ColorPick(MultiLanguageSystem.Translate("Player ESP Color"), Settings.Settings.player_esp_color); + Settings.Settings.player_esp_color = player_esp_color_input; + } + + ClientMain.azazel_esp = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 200, 150, 20), ClientMain.azazel_esp, MultiLanguageSystem.Translate("Azazel ESP")); + ClientMain.azazel_skel_esp = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 230, 150, 20), ClientMain.azazel_skel_esp, MultiLanguageSystem.Translate("Skeleton ESP")); + ClientMain.azazel_snapline = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 260, 150, 20), ClientMain.azazel_snapline, MultiLanguageSystem.Translate("Azazel Snapline")); + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 290, 130, 30), MultiLanguageSystem.Translate("Azazel ESP Color"))) + { + ClientMain.azazel_esp_colorpick = !ClientMain.azazel_esp_colorpick; + } + + if (ClientMain.azazel_esp_colorpick) + { + Color azazel_esp_color_input = GUIHelper.ColorPick(MultiLanguageSystem.Translate("Azazel ESP Color"), Settings.Settings.azazel_esp_color); + Settings.Settings.azazel_esp_color = azazel_esp_color_input; + } + + DrawESPPanel(); + } + + private static void DrawESPPanel() + { + string currentScene = Map.GetActiveScene(); + List espTypes = ESP.ItemESPConfig.GetMapESPTypes(currentScene); + if (espTypes.Count == 0 && currentScene != "Menu") + { + espTypes = new List(); + } + + float panelX = Settings.Settings.x + 370; + float panelY = Settings.Settings.y + 70; + float panelWidth = 180; + float itemHeight = 30; + float padding = 5; + + GUI.Label(new Rect(panelX, panelY, panelWidth, 25), + MultiLanguageSystem.Translate("ESP Settings"), + GUI.skin.box); + + float yOffset = panelY + 30; + if (espTypes.Count > 0) + { + foreach (var espType in espTypes) + { + string displayName = ESP.ItemESPConfig.GetESPTypeName(espType); + string translatedName = MultiLanguageSystem.Translate(displayName); + + bool currentState = ESP.ItemESPConfig.GetESPState(espType); + bool newState = GUI.Toggle( + new Rect(panelX + padding, yOffset, panelWidth - padding * 2, itemHeight - padding), + currentState, + translatedName + ); + + if (newState != currentState) + { + ESP.ItemESPConfig.SetESPState(espType, newState); + } + + yOffset += itemHeight; + } + + yOffset += 5; + GUI.Label(new Rect(panelX + padding, yOffset, panelWidth - padding * 2, 20), + "─────────", + new GUIStyle(GUI.skin.label) { alignment = TextAnchor.MiddleCenter }); + yOffset += 20; + } + + bool collectablesCurrentState = ESP.ItemESPConfig.GetESPState(ESP.ItemESPConfig.ESPType.Collectables); + bool collectablesNewState = GUI.Toggle( + new Rect(panelX + padding, yOffset, panelWidth - padding * 2, itemHeight - padding), + collectablesCurrentState, + MultiLanguageSystem.Translate("Collectables ESP") + ); + + if (collectablesNewState != collectablesCurrentState) + { + ESP.ItemESPConfig.SetESPState(ESP.ItemESPConfig.ESPType.Collectables, collectablesNewState); + } + yOffset += itemHeight; + + if (currentScene != "Menu") + { + string mapDisplayName = Map.GetMapName(currentScene); + GUI.Label( + new Rect(panelX, yOffset + 10, panelWidth, 20), + $"Map: {mapDisplayName}", + new GUIStyle(GUI.skin.label) { fontSize = 10, alignment = TextAnchor.MiddleCenter } + ); + } + } + } +} + diff --git a/DevourClient/UI/ClientTabs.Entities.cs b/DevourClient/UI/ClientTabs.Entities.cs new file mode 100644 index 0000000..8487ae7 --- /dev/null +++ b/DevourClient/UI/ClientTabs.Entities.cs @@ -0,0 +1,146 @@ +using DevourClient.Localization; +using DevourClient.Helpers; +using Il2CppPhoton.Bolt; +using UnityEngine; + +namespace DevourClient.UI +{ + internal static partial class ClientTabs + { + private static void EntitiesTab() + { + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 130, 30), MultiLanguageSystem.Translate("TP items to you"))) + { + DevourClient.Hacks.Misc.TPItems(); + MelonLoader.MelonLogger.Msg("TP Items!"); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 110, 130, 30), MultiLanguageSystem.Translate("Freeze azazel"))) + { + DevourClient.Hacks.Misc.FreezeAzazel(); + } + + GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 150, 120, 30), MultiLanguageSystem.Translate("Azazel & Demons")); + + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("Sam")) && DevourClient.Helpers.Player.IsInGameOrLobby() && BoltNetwork.IsServer) + { + DevourClient.Hacks.Misc.SpawnAzazel((PrefabId)BoltPrefabs.AzazelSam); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 80, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("SurvivalMolly")) && DevourClient.Helpers.Player.IsInGameOrLobby() && BoltNetwork.IsServer) + { + DevourClient.Hacks.Misc.SpawnAzazel((PrefabId)BoltPrefabs.SurvivalAzazelMolly); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 150, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("Anna")) && DevourClient.Helpers.Player.IsInGameOrLobby() && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalAnnaNew, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 220, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("Zara")) && DevourClient.Helpers.Player.IsInGameOrLobby() && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.AzazelZara, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 290, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("SurvivalNathan")) && DevourClient.Helpers.Player.IsInGameOrLobby() && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.AzazelNathan, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 360, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("SurvivalApril")) && DevourClient.Helpers.Player.IsInGameOrLobby() && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.AzazelApril, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 430, Settings.Settings.y + 180, 60, 25), MultiLanguageSystem.Translate("SurvivalKai")) && DevourClient.Helpers.Player.IsInGameOrLobby() && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.AzazelKai, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Ghost")) && DevourClient.Helpers.Player.IsInGameOrLobby() && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.Ghost, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 80, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Inmate")) && DevourClient.Helpers.Player.IsInGameOrLobby() && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalInmate, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 150, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Demon")) && DevourClient.Helpers.Player.IsInGameOrLobby() && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalDemon, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 220, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Boar")) && DevourClient.Helpers.Player.IsInGameOrLobby() && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.Boar, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 290, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Corpse")) && BoltNetwork.IsServer && DevourClient.Helpers.Player.IsInGameOrLobby()) + { + BoltNetwork.Instantiate(BoltPrefabs.Corpse, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 360, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Crow")) && BoltNetwork.IsServer && DevourClient.Helpers.Player.IsInGameOrLobby()) + { + BoltNetwork.Instantiate(BoltPrefabs.Crow, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 430, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Lump")) && BoltNetwork.IsServer && DevourClient.Helpers.Player.IsInGameOrLobby()) + { + BoltNetwork.Instantiate(BoltPrefabs.ManorLump, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 500, Settings.Settings.y + 220, 60, 25), MultiLanguageSystem.Translate("Monkey")) && BoltNetwork.IsServer && DevourClient.Helpers.Player.IsInGameOrLobby()) + { + BoltNetwork.Instantiate(BoltPrefabs.Monkey, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 260, 60, 25), MultiLanguageSystem.Translate("Rat"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalRat, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (DevourClient.Helpers.Player.IsInGame() && !DevourClient.Helpers.Player.IsPlayerCrawling()) + { + DevourClient.Hacks.Misc.CarryObject("SurvivalRat"); + } + } + + if (GUI.Button(new Rect(Settings.Settings.x + 80, Settings.Settings.y + 260, 60, 25), MultiLanguageSystem.Translate("Goat"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalGoat, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (DevourClient.Helpers.Player.IsInGame() && !DevourClient.Helpers.Player.IsPlayerCrawling()) + { + DevourClient.Hacks.Misc.CarryObject("SurvivalGoat"); + } + } + + if (GUI.Button(new Rect(Settings.Settings.x + 150, Settings.Settings.y + 260, 60, 25), MultiLanguageSystem.Translate("Spider")) && BoltNetwork.IsServer && DevourClient.Helpers.Player.IsInGameOrLobby()) + { + BoltNetwork.Instantiate(BoltPrefabs.Spider, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 220, Settings.Settings.y + 260, 60, 25), MultiLanguageSystem.Translate("Pig"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalPig, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (DevourClient.Helpers.Player.IsInGame() && !DevourClient.Helpers.Player.IsPlayerCrawling()) + { + DevourClient.Hacks.Misc.CarryObject("SurvivalPig"); + } + } + } + } +} + diff --git a/DevourClient/UI/ClientTabs.Items.cs b/DevourClient/UI/ClientTabs.Items.cs new file mode 100644 index 0000000..671689a --- /dev/null +++ b/DevourClient/UI/ClientTabs.Items.cs @@ -0,0 +1,416 @@ +using DevourClient.Localization; +using Il2CppPhoton.Bolt; +using UnityEngine; + +namespace DevourClient.UI +{ + internal static partial class ClientTabs + { + private static void ItemsTab() + { + GUILayout.BeginHorizontal(); + + GUILayout.BeginVertical(); + GUILayout.Label(MultiLanguageSystem.Translate("Items")); + Settings.Settings.itemsScrollPosition = GUILayout.BeginScrollView(Settings.Settings.itemsScrollPosition, GUILayout.Width(220), GUILayout.Height(190)); + + if (GUILayout.Button(MultiLanguageSystem.Translate("Hay"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalHay, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + ClientMain.HandleItemCarry("SurvivalHay"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("First aid"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalFirstAid, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + ClientMain.HandleItemCarry("SurvivalFirstAid"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Battery"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalBattery, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + ClientMain.HandleItemCarry("SurvivalBattery"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Gasoline"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalGasoline, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + ClientMain.HandleItemCarry("SurvivalGasoline"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Fuse"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalFuse, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + ClientMain.HandleItemCarry("SurvivalFuse"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Food"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalRottenFood, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + ClientMain.HandleItemCarry("SurvivalRottenFood"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Bone"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalBone, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + ClientMain.HandleItemCarry("SurvivalBone"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Bleach"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalBleach, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + ClientMain.HandleItemCarry("SurvivalBleach"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Matchbox"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalMatchbox, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + ClientMain.HandleItemCarry("Matchbox-3"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Spade"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalSpade, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + ClientMain.HandleItemCarry("SurvivalSpade"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Cake"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalCake, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + ClientMain.HandleItemCarry("SurvivalCake"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("MusicBox"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalMusicBox, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + ClientMain.HandleItemCarry("MusicBox-Idle"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Coin"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalCoin, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + ClientMain.HandleItemCarry("SurvivalCoin"); + } + } + + GUILayout.EndScrollView(); + ClientMain.autoItemFarm = GUILayout.Toggle(ClientMain.autoItemFarm, MultiLanguageSystem.Translate("Auto farm items (x5)")); + GUILayout.EndVertical(); + + GUILayout.BeginVertical(); + GUILayout.Label(MultiLanguageSystem.Translate("Ritual Objects")); + Settings.Settings.rituelObjectsScrollPosition = GUILayout.BeginScrollView(Settings.Settings.rituelObjectsScrollPosition, GUILayout.Width(220), GUILayout.Height(190)); + + if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-1"))) DevourClient.Hacks.Misc.CarryObject("Egg-Clean-1"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-2"))) DevourClient.Hacks.Misc.CarryObject("Egg-Clean-2"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-3"))) DevourClient.Hacks.Misc.CarryObject("Egg-Clean-3"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-4"))) DevourClient.Hacks.Misc.CarryObject("Egg-Clean-4"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-5"))) DevourClient.Hacks.Misc.CarryObject("Egg-Clean-5"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-6"))) DevourClient.Hacks.Misc.CarryObject("Egg-Clean-6"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-7"))) DevourClient.Hacks.Misc.CarryObject("Egg-Clean-7"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-8"))) DevourClient.Hacks.Misc.CarryObject("Egg-Clean-8"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-9"))) DevourClient.Hacks.Misc.CarryObject("Egg-Clean-9"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Egg-10"))) DevourClient.Hacks.Misc.CarryObject("Egg-Clean-10"); + + if (GUILayout.Button(MultiLanguageSystem.Translate("Ritual Book"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalRitualBook, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + DevourClient.Hacks.Misc.CarryObject("RitualBook-Active-1"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("DollHead"))) + { + if (BoltNetwork.IsServer && !DevourClient.Helpers.Player.IsInGame()) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalDollHead, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + else + { + DevourClient.Hacks.Misc.CarryObject("SurvivalDollHead"); + } + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Gardener"))) DevourClient.Hacks.Misc.CarryObject("Head-Clean-Gardener"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Butler"))) DevourClient.Hacks.Misc.CarryObject("Head-Clean-Butler"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Bridesmaid 1"))) DevourClient.Hacks.Misc.CarryObject("Head-Clean-Bridesmaid_01"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Bridesmaid 2"))) DevourClient.Hacks.Misc.CarryObject("Head-Clean-Bridesmaid_02"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Cook"))) DevourClient.Hacks.Misc.CarryObject("Head-Clean-Cook"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Groomsman 1"))) DevourClient.Hacks.Misc.CarryObject("Head-Clean-Groomsman_01"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Groomsman 2"))) DevourClient.Hacks.Misc.CarryObject("Head-Clean-Groomsman_02"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Maid"))) DevourClient.Hacks.Misc.CarryObject("Head-Clean-Maid"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Photographer"))) DevourClient.Hacks.Misc.CarryObject("Head-Clean-Photographer"); + if (GUILayout.Button(MultiLanguageSystem.Translate("Priest"))) DevourClient.Hacks.Misc.CarryObject("Head-Clean-Priest"); + + GUILayout.EndScrollView(); + GUILayout.EndVertical(); + + GUILayout.BeginVertical(); + GUILayout.Label(MultiLanguageSystem.Translate("Spawnable Prefabs")); + Settings.Settings.stuffsScrollPosition = GUILayout.BeginScrollView(Settings.Settings.stuffsScrollPosition, GUILayout.Width(220), GUILayout.Height(190)); + + DrawSpawnablePrefabs(); + + GUILayout.EndScrollView(); + GUILayout.EndVertical(); + + GUILayout.EndHorizontal(); + } + + private static void DrawSpawnablePrefabs() + { + if (GUILayout.Button(MultiLanguageSystem.Translate("Animal_Gate")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.Animal_Gate, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("AsylumDoor")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.AsylumDoor, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("AsylumDoubleDoor")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.AsylumDoubleDoor, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("AsylumWhiteDoor")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.AsylumWhiteDoor, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("DevourDoorBack")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.DevourDoorBack, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("DevourDoorMain")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.DevourDoorMain, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("DevourDoorRoom")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.DevourDoorRoom, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Elevator_Door")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.Elevator_Door, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("InnDoor")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.InnDoor, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("InnDoubleDoor")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.InnDoubleDoor, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("InnShojiDoor")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.InnShojiDoor, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("InnShrine")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.InnShrine, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("InnWardrobe")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.InnWardrobe, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("InnWoodenDoor")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.InnWoodenDoor, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("PigExcrement")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.PigExcrement, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("SlaughterhouseFireEscapeDoor")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SlaughterhouseFireEscapeDoor, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalAltarMolly")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalAltarMolly, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalAltarSlaughterhouse")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalAltarSlaughterhouse, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalAltarTown")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalAltarTown, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalCultist")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalCultist, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalKai")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalKai, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalNathan")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalNathan, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalMolly")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalMolly, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalApril")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalApril, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalFrank")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalFrank, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalRose")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalRose, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("SurvivalSmashableWindow")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.SurvivalSmashableWindow, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("TownDoor")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.TownDoor, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("TownDoor2")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.TownDoor2, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("TownPentagram")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.TownPentagram, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("TrashCan")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.TrashCan, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Truck_Shutter")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.Truck_Shutter, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("TV")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.TV, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Mirror")) && BoltNetwork.IsServer) + { + BoltNetwork.Instantiate(BoltPrefabs.ManorMirror, DevourClient.Helpers.Player.GetPlayer().transform.position, Quaternion.identity); + } + } + } +} + diff --git a/DevourClient/UI/ClientTabs.Map.cs b/DevourClient/UI/ClientTabs.Map.cs new file mode 100644 index 0000000..d397475 --- /dev/null +++ b/DevourClient/UI/ClientTabs.Map.cs @@ -0,0 +1,279 @@ +using DevourClient.Helpers; +using DevourClient.Localization; +using UnityEngine; + +namespace DevourClient.UI +{ + internal static partial class ClientTabs + { + private static void MapSpecificTab() + { + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("Instant Win")) && DevourClient.Helpers.Player.IsInGame() && Il2CppPhoton.Bolt.BoltNetwork.IsSinglePlayer) + { + DevourClient.Hacks.Misc.InstantWin(); + MelonLoader.MelonLogger.Msg("EZ Win"); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Burn a ritual object"))) + { + DevourClient.Hacks.Misc.BurnRitualObj(Map.GetActiveScene(), false); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 150, 150, 30), MultiLanguageSystem.Translate("Burn all ritual objects"))) + { + DevourClient.Hacks.Misc.BurnRitualObj(Map.GetActiveScene(), true); + } + + switch (Map.GetActiveScene()) + { + case "Menu": + break; + + case "Devour": + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) + { + try + { + Il2Cpp.NolanBehaviour nb = DevourClient.Helpers.Player.GetPlayer(); + nb.TeleportTo(Map.GetAzazel().transform.position, Quaternion.identity); + } + catch + { + MelonLoader.MelonLogger.Msg("Azazel not found !"); + } + } + + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Despawn Demons"))) + { + DevourClient.Hacks.Misc.DespawnDemons(); + } + break; + case "Molly": + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) + { + try + { + Il2Cpp.NolanBehaviour nb = DevourClient.Helpers.Player.GetPlayer(); + nb.TeleportTo(Map.GetAzazel().transform.position, Quaternion.identity); + } + catch + { + MelonLoader.MelonLogger.Msg("Azazel not found !"); + } + } + + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Despawn Inmates"))) + { + DevourClient.Hacks.Misc.DespawnDemons(); + } + break; + case "Inn": + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) + { + try + { + Il2Cpp.NolanBehaviour nb = DevourClient.Helpers.Player.GetPlayer(); + nb.TeleportTo(Map.GetAzazel().transform.position, Quaternion.identity); + } + catch + { + MelonLoader.MelonLogger.Msg("Azazel not found !"); + } + } + + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Clean The Fountains"))) + { + DevourClient.Hacks.Misc.CleanFountain(); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 150, 150, 30), MultiLanguageSystem.Translate("Despawn Spiders"))) + { + DevourClient.Hacks.Misc.DespawnSpiders(); + } + break; + + case "Town": + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) + { + try + { + Il2Cpp.NolanBehaviour nb = DevourClient.Helpers.Player.GetPlayer(); + nb.TeleportTo(Map.GetAzazel().transform.position, Quaternion.identity); + } + catch + { + MelonLoader.MelonLogger.Msg("Azazel not found !"); + } + } + + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Despawn Ghosts"))) + { + DevourClient.Hacks.Misc.DespawnGhosts(); + } + break; + + case "Slaughterhouse": + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) + { + try + { + Il2Cpp.NolanBehaviour nb = DevourClient.Helpers.Player.GetPlayer(); + nb.TeleportTo(Map.GetAzazel().transform.position, Quaternion.identity); + } + catch + { + MelonLoader.MelonLogger.Msg("Azazel not found !"); + } + } + + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Despawn Boars"))) + { + DevourClient.Hacks.Misc.DespawnBoars(); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 150, 150, 30), MultiLanguageSystem.Translate("Despawn Corpses"))) + { + DevourClient.Hacks.Misc.DespawnCorpses(); + } + break; + + case "Manor": + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) + { + try + { + Il2Cpp.NolanBehaviour nb = DevourClient.Helpers.Player.GetPlayer(); + nb.TeleportTo(Map.GetAzazel().transform.position, Quaternion.identity); + } + catch + { + MelonLoader.MelonLogger.Msg("Azazel not found !"); + } + } + + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Despawn Crows"))) + { + DevourClient.Hacks.Misc.DespawnCrows(); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 150, 150, 30), MultiLanguageSystem.Translate("Despawn Lumps"))) + { + DevourClient.Hacks.Misc.DespawnLumps(); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 370, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("Switch realm"))) + { + Il2Cpp.NolanBehaviour nb = DevourClient.Helpers.Player.GetPlayer(); + Vector3 pos = nb.transform.position; + + Il2Cpp.ManorDeadRealmTrigger realm = Il2Cpp.ManorDeadRealmTrigger.FindObjectOfType(); + if (realm == null) + { + MelonLoader.MelonLogger.Warning("realm was null."); + return; + } + + if (realm.IsInDeadRealm) + { + pos.x += 150f; + } + else + { + pos.x -= 150f; + } + + nb.locomotion.SetPosition(pos, false); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 370, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Switch realm (house)"))) + { + Il2Cpp.NolanBehaviour nb = DevourClient.Helpers.Player.GetPlayer(); + Vector3 pos = nb.transform.position; + + Il2Cpp.ManorDeadRealmTrigger realm = Il2Cpp.ManorDeadRealmTrigger.FindObjectOfType(); + if (realm == null) + { + MelonLoader.MelonLogger.Warning("realm was null."); + return; + } + + if (realm.IsInDeadRealm) + { + pos.x = -10.216758f; + pos.y = 0.009999979f; + pos.z = -7.632657f; + } + else + { + pos.x = -160.03688f; + pos.y = 0.010014875f; + pos.z = -7.5686994f; + } + + nb.locomotion.SetPosition(pos, false); + } + + ClientMain.infinite_mirrors = GUI.Toggle(new Rect(Settings.Settings.x + 370, Settings.Settings.y + 150, 150, 20), ClientMain.infinite_mirrors, MultiLanguageSystem.Translate("Infinite mirrors")); + break; + + case "Carnival": + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("TP to Azazel"))) + { + try + { + Il2Cpp.NolanBehaviour nb = DevourClient.Helpers.Player.GetPlayer(); + nb.TeleportTo(Map.GetAzazel().transform.position, Quaternion.identity); + } + catch + { + MelonLoader.MelonLogger.Msg("Azazel not found !"); + } + } + + if (GUI.Button(new Rect(Settings.Settings.x + 190, Settings.Settings.y + 110, 150, 30), MultiLanguageSystem.Translate("Despawn Monkeys"))) + { + DevourClient.Hacks.Misc.DespawnMonkeys(); + } + break; + } + + GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 210, 100, 30), MultiLanguageSystem.Translate("Load Map:")); + + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 240, 90, 30), MultiLanguageSystem.Translate("Farmhouse")) && Il2CppPhoton.Bolt.BoltNetwork.IsServer) + { + Map.LoadMap("Devour"); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 110, Settings.Settings.y + 240, 90, 30), MultiLanguageSystem.Translate("Asylum")) && Il2CppPhoton.Bolt.BoltNetwork.IsServer) + { + Map.LoadMap("Molly"); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 210, Settings.Settings.y + 240, 90, 30), MultiLanguageSystem.Translate("Inn")) && Il2CppPhoton.Bolt.BoltNetwork.IsServer) + { + Map.LoadMap("Inn"); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 310, Settings.Settings.y + 240, 90, 30), MultiLanguageSystem.Translate("Town")) && Il2CppPhoton.Bolt.BoltNetwork.IsServer) + { + Map.LoadMap("Town"); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 280, 90, 30), MultiLanguageSystem.Translate("Slaughterhouse")) && Il2CppPhoton.Bolt.BoltNetwork.IsServer) + { + Map.LoadMap("Slaughterhouse"); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 110, Settings.Settings.y + 280, 90, 30), MultiLanguageSystem.Translate("Manor")) && Il2CppPhoton.Bolt.BoltNetwork.IsServer) + { + Map.LoadMap("Manor"); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 210, Settings.Settings.y + 280, 90, 30), MultiLanguageSystem.Translate("Carnival")) && Il2CppPhoton.Bolt.BoltNetwork.IsServer) + { + Map.LoadMap("Carnival"); + } + } + } +} + diff --git a/DevourClient/UI/ClientTabs.Misc.cs b/DevourClient/UI/ClientTabs.Misc.cs new file mode 100644 index 0000000..975011f --- /dev/null +++ b/DevourClient/UI/ClientTabs.Misc.cs @@ -0,0 +1,173 @@ +using DevourClient.Localization; +using Il2CppOpsive.UltimateCharacterController.Character; +using UnityEngine; + +namespace DevourClient.UI +{ + internal static partial class ClientTabs + { + private static void MiscTab() + { + GUI.Label(new Rect(Settings.Settings.x + 320, Settings.Settings.y + 70, 150, 20), "Language :"); + + string currentLanguageName = MultiLanguageSystem.GetLanguageDisplayName(Settings.Settings.selectedLanguage); + if (GUI.Button(new Rect(Settings.Settings.x + 320, Settings.Settings.y + 95, 150, 30), currentLanguageName)) + { + Settings.Settings.showLanguageSelector = !Settings.Settings.showLanguageSelector; + } + + if (Settings.Settings.showLanguageSelector) + { + DevourClient.Localization.Language[] allLanguages = MultiLanguageSystem.GetAllLanguages(); + float yOffset = 130; + + GUI.Box(new Rect(Settings.Settings.x + 320, Settings.Settings.y + yOffset - 5, 150, allLanguages.Length * 25 + 10), ""); + + foreach (DevourClient.Localization.Language lang in allLanguages) + { + string displayName = MultiLanguageSystem.GetLanguageDisplayName(lang); + if (GUI.Button(new Rect(Settings.Settings.x + 325, Settings.Settings.y + yOffset, 140, 20), displayName)) + { + Settings.Settings.selectedLanguage = lang; + MultiLanguageSystem.CurrentLanguage = lang; + Settings.Settings.showLanguageSelector = false; + MelonLoader.MelonLogger.Msg($"Language changed to: {displayName}"); + } + yOffset += 25; + } + } + + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 140, 28), MultiLanguageSystem.Translate("Unlock Achievements"))) + { + Thread AchievementsThread = new Thread(new ThreadStart(DevourClient.Hacks.Unlock.Achievements)); + AchievementsThread.Start(); + + MelonLoader.MelonLogger.Msg("Achievements unlocked!"); + DevourClient.Hacks.Misc.ShowMessageBox("Achievements unlocked!"); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 160, Settings.Settings.y + 70, 140, 28), MultiLanguageSystem.Translate("Unlock Doors"))) + { + DevourClient.Hacks.Unlock.Doors(); + MelonLoader.MelonLogger.Msg("Doors unlocked!"); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 108, 140, 28), MultiLanguageSystem.Translate("Teleport Keys")) && DevourClient.Helpers.Player.IsInGame()) + { + DevourClient.Hacks.Misc.TPKeys(); + MelonLoader.MelonLogger.Msg("Keys teleported!"); + } + + if (GUI.Button(new Rect(Settings.Settings.x + 160, Settings.Settings.y + 108, 140, 28), MultiLanguageSystem.Translate("Play Random Sound"))) + { + DevourClient.Hacks.Misc.PlaySound(); + MelonLoader.MelonLogger.Msg("Playing random sound!"); + } + + ClientMain._walkInLobby = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 155, 140, 20), ClientMain._walkInLobby, MultiLanguageSystem.Translate("Walk In Lobby")); + ClientMain._IsAutoRespawn = GUI.Toggle(new Rect(Settings.Settings.x + 160, Settings.Settings.y + 155, 140, 20), ClientMain._IsAutoRespawn, MultiLanguageSystem.Translate("Auto Respawn")); + + ClientMain.fly = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 180, 100, 20), ClientMain.fly, MultiLanguageSystem.Translate("Fly")); + if (GUI.Button(new Rect(Settings.Settings.x + 120, Settings.Settings.y + 180, 60, 20), Settings.Settings.flyKey.ToString())) + { + Settings.Settings.flyKey = Settings.Settings.GetKey(); + } + GUI.Label(new Rect(Settings.Settings.x + 20, Settings.Settings.y + 205, 80, 20), MultiLanguageSystem.Translate("Fly Speed") + ":"); + ClientMain.fly_speed = GUI.HorizontalSlider(new Rect(Settings.Settings.x + 100, Settings.Settings.y + 210, 150, 10), ClientMain.fly_speed, 5f, 20f); + GUI.Label(new Rect(Settings.Settings.x + 260, Settings.Settings.y + 205, 50, 20), ((int)ClientMain.fly_speed).ToString()); + + ClientMain.spoofLevel = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 250, 200, 20), ClientMain.spoofLevel, MultiLanguageSystem.Translate("Spoof Level")); + GUI.Label(new Rect(Settings.Settings.x + 20, Settings.Settings.y + 275, 80, 20), MultiLanguageSystem.Translate("Level") + ":"); + ClientMain.spoofLevelValue = GUI.HorizontalSlider(new Rect(Settings.Settings.x + 100, Settings.Settings.y + 280, 150, 10), ClientMain.spoofLevelValue, 0f, 666f); + GUI.Label(new Rect(Settings.Settings.x + 260, Settings.Settings.y + 275, 50, 20), ((int)ClientMain.spoofLevelValue).ToString()); + + bool newGodMode = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 480, 200, 20), ClientMain.godMode, MultiLanguageSystem.Translate("God Mode")); + if (newGodMode != ClientMain.godMode) + { + ClientMain.godMode = newGodMode; + if (DevourClient.Helpers.Player.IsInGameOrLobby()) + { + var nb = DevourClient.Helpers.Player.GetPlayer(); + if (nb != null) + { + if (ClientMain.godMode) + { + ClientMain.godModeOriginalLayer = nb.gameObject.layer; + nb.gameObject.layer = LayerMask.NameToLayer("Default"); + } + else + { + int targetLayer = ClientMain.godModeOriginalLayer; + if (targetLayer < 0) + { + var layerManager = nb.gameObject.GetComponent(); + if (layerManager != null) + { + var maskValue = layerManager.CharacterLayer.value; + if (maskValue != 0 && (maskValue & (maskValue - 1)) == 0) + { + targetLayer = (int)Mathf.Log(maskValue, 2); + } + } + if (targetLayer < 0) + { + int playerLayer = LayerMask.NameToLayer("Player"); + if (playerLayer >= 0) targetLayer = playerLayer; + } + } + if (targetLayer >= 0) + { + nb.gameObject.layer = targetLayer; + } + ClientMain.godModeOriginalLayer = -1; + } + } + } + } + + ClientMain.exp_modifier = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 310, 200, 20), ClientMain.exp_modifier, MultiLanguageSystem.Translate("Exp Modifier")); + GUI.Label(new Rect(Settings.Settings.x + 20, Settings.Settings.y + 335, 80, 20), MultiLanguageSystem.Translate("Exp Value") + ":"); + ClientMain.exp = GUI.HorizontalSlider(new Rect(Settings.Settings.x + 100, Settings.Settings.y + 340, 150, 10), ClientMain.exp, 1000f, 6000f); + GUI.Label(new Rect(Settings.Settings.x + 260, Settings.Settings.y + 335, 50, 20), ((int)ClientMain.exp).ToString()); + + ClientMain.fastMove = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 370, 200, 20), ClientMain.fastMove, MultiLanguageSystem.Translate("Fast Move")); + GUI.Label(new Rect(Settings.Settings.x + 20, Settings.Settings.y + 395, 100, 20), MultiLanguageSystem.Translate("Speed Multiplier") + ":"); + ClientMain._PlayerSpeedMultiplier = GUI.HorizontalSlider(new Rect(Settings.Settings.x + 130, Settings.Settings.y + 400, 120, 10), ClientMain._PlayerSpeedMultiplier, (int)1f, (int)10f); + GUI.Label(new Rect(Settings.Settings.x + 260, Settings.Settings.y + 395, 50, 20), ((int)ClientMain._PlayerSpeedMultiplier).ToString()); + + ClientMain.showCoordinates = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 430, 200, 20), ClientMain.showCoordinates, MultiLanguageSystem.Translate("Show Coordinates")); + ClientMain.instantInteraction = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 455, 200, 20), ClientMain.instantInteraction, MultiLanguageSystem.Translate("Instant Interaction")); + + GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 505, 200, 20), MultiLanguageSystem.Translate("Radial Menu")); + if (GUI.Button(new Rect(Settings.Settings.x + 220, Settings.Settings.y + 505, 80, 20), Settings.Settings.radialMenuKey.ToString())) + { + Settings.Settings.radialMenuKey = Settings.Settings.GetKey(); + } + + GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 530, 200, 20), MultiLanguageSystem.Translate("Menu Key")); + if (GUI.Button(new Rect(Settings.Settings.x + 220, Settings.Settings.y + 530, 80, 20), Settings.Settings.menuToggleKey.ToString())) + { + Settings.Settings.menuToggleKey = Settings.Settings.GetKey(); + } + + if (ClientMain.showCoordinates && DevourClient.Helpers.Player.IsInGameOrLobby()) + { + try + { + Il2Cpp.NolanBehaviour nb = DevourClient.Helpers.Player.GetPlayer(); + if (nb != null && nb.transform != null) + { + Vector3 pos = nb.transform.position; + string coordText = $"Position: X:{pos.x:F2} Y:{pos.y:F2} Z:{pos.z:F2}"; + + GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 560, 400, 30), coordText); + } + } + catch (System.Exception) + { + } + } + } + } +} + diff --git a/DevourClient/UI/ClientTabs.Network.cs b/DevourClient/UI/ClientTabs.Network.cs new file mode 100644 index 0000000..67f0676 --- /dev/null +++ b/DevourClient/UI/ClientTabs.Network.cs @@ -0,0 +1,90 @@ +using DevourClient.Localization; +using UnityEngine; + +namespace DevourClient.UI +{ + internal static partial class ClientTabs + { + private static void NetworkTab() + { + int yOffset = 70; + int xBase = (int)Settings.Settings.x + 10; + int yBase = (int)Settings.Settings.y; + + GUI.Label(new Rect(xBase, yBase + yOffset, 300, 30), + MultiLanguageSystem.Translate("Network Info") + ": " + Network.NetworkHelper.GetRoomInfo()); + yOffset += 40; + + GUI.Label(new Rect(xBase, yBase + yOffset, 300, 30), + $"=== {MultiLanguageSystem.Translate("Lobby Manager")} ==="); + yOffset += 35; + + GUI.Label(new Rect(xBase, yBase + yOffset, 100, 30), + MultiLanguageSystem.Translate("Region") + ":"); + + string[] regionDisplayNames = Network.RegionHelper.GetRegionDisplayNames(); + + if (GUI.Button(new Rect(xBase + 110, yBase + yOffset, 200, 30), regionDisplayNames[ClientMain.selectedRegion])) + { + ClientMain.selectedRegion = (ClientMain.selectedRegion + 1) % regionDisplayNames.Length; + } + + yOffset += 40; + + GUI.Label(new Rect(xBase, yBase + yOffset, 100, 30), + MultiLanguageSystem.Translate("Lobby Size") + ":"); + ClientMain.lobbySize = (int)GUI.HorizontalSlider(new Rect(xBase + 110, yBase + yOffset + 5, 120, 20), ClientMain.lobbySize, 1, 64); + GUI.Label(new Rect(xBase + 240, yBase + yOffset, 50, 30), ClientMain.lobbySize.ToString()); + yOffset += 35; + + ClientMain.isPrivateLobby = GUI.Toggle(new Rect(xBase, yBase + yOffset, 200, 30), + ClientMain.isPrivateLobby, MultiLanguageSystem.Translate("Private Lobby")); + yOffset += 35; + + if (GUI.Button(new Rect(xBase, yBase + yOffset, 300, 40), + MultiLanguageSystem.Translate("Create Lobby"))) + { + string regionCode = Network.RegionHelper.GetRegionCodeByIndex(ClientMain.selectedRegion); + Network.LobbyManager.CreateLobby(regionCode, ClientMain.lobbySize, ClientMain.isPrivateLobby); + } + yOffset += 50; + + GUI.Label(new Rect(xBase, yBase + yOffset, 300, 30), + $"=== {MultiLanguageSystem.Translate("Lobby Control")} ==="); + yOffset += 35; + + bool isHost = Network.NetworkHelper.IsHost(); + GUI.enabled = isHost; + if (GUI.Button(new Rect(xBase, yBase + yOffset, 300, 35), + MultiLanguageSystem.Translate("Force Start Game") + (isHost ? "" : " (" + MultiLanguageSystem.Translate("Host Only") + ")"))) + { + Network.LobbyManager.ForceLobbyStart(); + } + GUI.enabled = true; + yOffset += 45; + + if (Network.NetworkHelper.IsNetworkRunning()) + { + yOffset += 10; + GUI.Label(new Rect(xBase, yBase + yOffset, 300, 30), + $"=== {MultiLanguageSystem.Translate("Network Stats")} ==="); + yOffset += 35; + + GUI.Label(new Rect(xBase, yBase + yOffset, 200, 30), + MultiLanguageSystem.Translate("Player Count") + ": " + Network.NetworkHelper.GetPlayerCount()); + yOffset += 30; + + if (!isHost) + { + GUI.Label(new Rect(xBase, yBase + yOffset, 200, 30), + "Ping: " + Network.NetworkHelper.GetPing() + "ms"); + yOffset += 30; + } + + GUI.Label(new Rect(xBase, yBase + yOffset, 200, 30), + MultiLanguageSystem.Translate("Connection ID") + ": " + Network.NetworkHelper.GetConnectionID()); + } + } + } +} + diff --git a/DevourClient/UI/ClientTabs.Players.cs b/DevourClient/UI/ClientTabs.Players.cs new file mode 100644 index 0000000..085a787 --- /dev/null +++ b/DevourClient/UI/ClientTabs.Players.cs @@ -0,0 +1,91 @@ +using DevourClient.Helpers; +using DevourClient.Localization; +using UnityEngine; + +namespace DevourClient.UI +{ + internal static partial class ClientTabs + { + private static void PlayersTab() + { + if (Helpers.Map.GetActiveScene() != "Menu") + { + GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 150, 30), MultiLanguageSystem.Translate("Players") + ":"); + int i = 0; + if (Entities.Players != null) + { + foreach (BasePlayer? bp in Entities.Players) + { + if (bp == null || bp.Name == "") + { + continue; + } + + GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 110 + i, 150, 30), bp.Name); + + int buttonX = (int)Settings.Settings.x + 70; + int buttonY = (int)Settings.Settings.y + 105 + i; + + if (GUI.Button(new Rect(buttonX, buttonY, 70, 30), MultiLanguageSystem.Translate("Kill"))) + { + bp.Kill(); + } + buttonX += 80; + + if (GUI.Button(new Rect(buttonX, buttonY, 70, 30), MultiLanguageSystem.Translate("Revive"))) + { + if (bp.p_GameObject != null) + { + Il2Cpp.NolanBehaviour nb = bp.p_GameObject.GetComponent(); + if (nb != null) + { + ReviveHelper.TryRevive(nb); + } + } + } + buttonX += 80; + + if (GUI.Button(new Rect(buttonX, buttonY, 90, 30), MultiLanguageSystem.Translate("Jumpscare"))) + { + bp.Jumpscare(); + } + buttonX += 100; + + if (GUI.Button(new Rect(buttonX, buttonY, 80, 30), MultiLanguageSystem.Translate("Teleport to"))) + { + bp.TP(); + } + buttonX += 90; + + if (GUI.Button(new Rect(buttonX, buttonY, 100, 30), MultiLanguageSystem.Translate("Lock in cage"))) + { + bp.LockInCage(); + } + buttonX += 110; + + if (GUI.Button(new Rect(buttonX, buttonY, 90, 30), MultiLanguageSystem.Translate("TP Azazel"))) + { + bp.TPAzazel(); + } + buttonX += 100; + + if (Helpers.Map.GetActiveScene() == "Town") + { + if (GUI.Button(new Rect(buttonX, buttonY, 90, 30), MultiLanguageSystem.Translate("Shoot Player"))) + { + bp.ShootPlayer(); + } + } + + i += 45; + } + } + } + else + { + GUI.Label(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 300, 30), MultiLanguageSystem.Translate("Waiting for the game to start")); + } + } + } +} + diff --git a/DevourClient/UI/ClientTabs.Visuals.cs b/DevourClient/UI/ClientTabs.Visuals.cs new file mode 100644 index 0000000..7ebbb39 --- /dev/null +++ b/DevourClient/UI/ClientTabs.Visuals.cs @@ -0,0 +1,34 @@ +using DevourClient.Localization; +using UnityEngine; + +namespace DevourClient.UI +{ + internal static partial class ClientTabs + { + private static void VisualsTab() + { + ClientMain.flashlight_toggle = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 70, 120, 30), ClientMain.flashlight_toggle, MultiLanguageSystem.Translate("Big Flashlight")); + ClientMain.fullbright = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 100, 120, 30), ClientMain.fullbright, MultiLanguageSystem.Translate("Fullbright")); + ClientMain.unlimitedUV = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 130, 130, 30), ClientMain.unlimitedUV, MultiLanguageSystem.Translate("Unlimited UV Light")); + ClientMain.crosshair = GUI.Toggle(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 160, 130, 30), ClientMain.crosshair, MultiLanguageSystem.Translate("Crosshair")); + + if (GUI.Button(new Rect(Settings.Settings.x + 10, Settings.Settings.y + 190, 130, 30), MultiLanguageSystem.Translate("Flashlight Color"))) + { + ClientMain.flashlight_colorpick = !ClientMain.flashlight_colorpick; + MelonLoader.MelonLogger.Msg("Flashlight color picker : " + ClientMain.flashlight_colorpick.ToString()); + } + + if (ClientMain.flashlight_colorpick) + { + Color flashlight_color_input = DevourClient.Helpers.GUIHelper.ColorPick(MultiLanguageSystem.Translate("Flashlight Color"), Settings.Settings.flashlight_color); + Settings.Settings.flashlight_color = flashlight_color_input; + + if (DevourClient.Helpers.Player.IsInGame()) + { + DevourClient.Hacks.Misc.FlashlightColor(flashlight_color_input); + } + } + } + } +} + diff --git a/DevourClient/UI/ClientTabs.cs b/DevourClient/UI/ClientTabs.cs new file mode 100644 index 0000000..22f5e98 --- /dev/null +++ b/DevourClient/UI/ClientTabs.cs @@ -0,0 +1,87 @@ +using DevourClient.Localization; +using UnityEngine; +using CurrentTab = DevourClient.ClientMain.CurrentTab; + +namespace DevourClient.UI +{ + internal static partial class ClientTabs + { + internal static void DrawTabs(int windowID) + { + GUILayout.BeginHorizontal(); + + if (GUILayout.Button(MultiLanguageSystem.Translate("Visuals"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F1)) + { + ClientMain.current_tab = CurrentTab.Visuals; + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Entities"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F2)) + { + ClientMain.current_tab = CurrentTab.Entities; + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Map"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F3)) + { + ClientMain.current_tab = CurrentTab.Map; + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("ESP"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F4)) + { + ClientMain.current_tab = CurrentTab.ESP; + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Items"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F5)) + { + ClientMain.current_tab = CurrentTab.Items; + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Misc"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F6)) + { + ClientMain.current_tab = CurrentTab.Misc; + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Players"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F7)) + { + ClientMain.current_tab = CurrentTab.Players; + } + + if (GUILayout.Button(MultiLanguageSystem.Translate("Network"), GUILayout.Height(40)) || Input.GetKeyDown(KeyCode.F8)) + { + ClientMain.current_tab = CurrentTab.Network; + } + + GUILayout.EndHorizontal(); + + switch (ClientMain.current_tab) + { + case CurrentTab.Visuals: + VisualsTab(); + break; + case CurrentTab.Entities: + EntitiesTab(); + break; + case CurrentTab.Map: + MapSpecificTab(); + break; + case CurrentTab.ESP: + EspTab(); + break; + case CurrentTab.Items: + ItemsTab(); + break; + case CurrentTab.Misc: + MiscTab(); + break; + case CurrentTab.Players: + PlayersTab(); + break; + case CurrentTab.Network: + NetworkTab(); + break; + } + + GUI.DragWindow(); + } + } +} + diff --git a/README.md b/README.md index 4cd5423..2befe62 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,6 @@ Everything about spoofing ehre (steam name, server name, level...) will persist * Big Flashlight (allows your flashlight to light a lot more) * Flashlight color customization (with a home made color picker) * Unlimited UV light (thanks to [@jadis0x](https://github.com/jadis0x)) -* A chat spammer for Lobby and InGame chat (i couldn't do a text entry because of the limitations of [Il2CppAssemblyUnhollower](https://github.com/knah/Il2CppAssemblyUnhollower)) * Achievements unlocker (couldn't do all of them, my code is crashing for some reasons at some point, i may fix it, for now it's commented out) * Doors unlocker (should work fine, though it doesn't seem to work sometimes) * Keys teleporter @@ -55,6 +54,9 @@ Everything about spoofing ehre (steam name, server name, level...) will persist * Switch between realms (Manor update) * Farm Items x5 (host only) * Radial Menu (Z) +* God Mode +* instant interaction (set the speed to 0.05, and you can interact with objects instantly without any bugs) +* New revive function (only works for host. If you're host, you can revive your teammates; and if you're not host, you can only revive host.) * Customize Lobby (Public or Private, 1-64 room size, but when the number of players exceeds four, the game will have bugs) * 11 languages supported (English, 简体中文, Français, Deutsch, Español, 日本語, 한국어, Русский, Português, Italiano, Tiếng Việt) with in-game language switcher in Misc tab. Check it in misc table! * Due to the game update, I deleted "Steam name spoofer" and "Server name spoofer" these two functions.For "steam name spoofer", even changed your name by this function, your teamates can still see your name by steam profile, escape button, and your message in game.(by manafeng) @@ -129,18 +131,15 @@ If you want to modify and develop the code, please follow the [Building from sou * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\net6\Il2CppInterop.Runtime.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Assembly-CSharp.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2CppOpsive.UltimateCharacterController.dll` -* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2CppBehaviorDesigner.Runtime.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.user.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppmscorlib.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.IMGUIModule.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.InputLegacyModule.dll` -* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.HotReloadModule.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.UI.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.UIModule.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.CoreModule.dll` -* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.InputModule.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.common.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.platform.photon.dll` diff --git a/update_dependency.ps1 b/update_dependency.ps1 index 772558a..3dd6f15 100644 --- a/update_dependency.ps1 +++ b/update_dependency.ps1 @@ -104,8 +104,6 @@ function Find-DevourPathFromManifest { $RequiredDependencies = @( @{ Name = "0Harmony"; RelativePath = "steamapps\common\Devour\MelonLoader\net6\0Harmony.dll" }, @{ Name = "Assembly-CSharp"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Assembly-CSharp.dll" }, - @{ Name = "Il2CppAstarPathfindingProject"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2CppAstarPathfindingProject.dll" }, - @{ Name = "Il2CppBehaviorDesigner.Runtime"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2CppBehaviorDesigner.Runtime.dll" }, @{ Name = "Il2Cppbolt"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.dll" }, @{ Name = "Il2Cppbolt.user"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.user.dll" }, @{ Name = "Il2Cppcom.rlabrecque.steamworks.net"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppcom.rlabrecque.steamworks.net.dll" }, @@ -120,7 +118,6 @@ $RequiredDependencies = @( @{ Name = "UnityEngine"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.dll" }, @{ Name = "UnityEngine.AnimationModule"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.AnimationModule.dll" }, @{ Name = "UnityEngine.CoreModule"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.CoreModule.dll" }, - @{ Name = "UnityEngine.HotReloadModule"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.HotReloadModule.dll" }, @{ Name = "UnityEngine.IMGUIModule"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.IMGUIModule.dll" }, @{ Name = "UnityEngine.InputLegacyModule"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.InputLegacyModule.dll" }, @{ Name = "UnityEngine.PhysicsModule"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.PhysicsModule.dll" }, diff --git a/update_dependency.sh b/update_dependency.sh index 39259e9..e744cc0 100644 --- a/update_dependency.sh +++ b/update_dependency.sh @@ -56,8 +56,6 @@ find_devour_path_from_manifest() { declare -A REQUIRED_DEPENDENCIES=( ["0Harmony"]="steamapps/common/Devour/MelonLoader/net6/0Harmony.dll" ["Assembly-CSharp"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Assembly-CSharp.dll" - ["Il2CppAstarPathfindingProject"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2CppAstarPathfindingProject.dll" - ["Il2CppBehaviorDesigner.Runtime"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2CppBehaviorDesigner.Runtime.dll" ["Il2Cppbolt"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppbolt.dll" ["Il2Cppbolt.user"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppbolt.user.dll" ["Il2Cppcom.rlabrecque.steamworks.net"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppcom.rlabrecque.steamworks.net.dll" @@ -72,7 +70,6 @@ declare -A REQUIRED_DEPENDENCIES=( ["UnityEngine"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.dll" ["UnityEngine.AnimationModule"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.AnimationModule.dll" ["UnityEngine.CoreModule"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.CoreModule.dll" - ["UnityEngine.HotReloadModule"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.HotReloadModule.dll" ["UnityEngine.IMGUIModule"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.IMGUIModule.dll" ["UnityEngine.InputLegacyModule"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.InputLegacyModule.dll" ["UnityEngine.PhysicsModule"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.PhysicsModule.dll" @@ -145,8 +142,6 @@ import os required_deps = { "0Harmony": "steamapps/common/Devour/MelonLoader/net6/0Harmony.dll", "Assembly-CSharp": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Assembly-CSharp.dll", - "Il2CppAstarPathfindingProject": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2CppAstarPathfindingProject.dll", - "Il2CppBehaviorDesigner.Runtime": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2CppBehaviorDesigner.Runtime.dll", "Il2Cppbolt": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppbolt.dll", "Il2Cppbolt.user": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppbolt.user.dll", "Il2Cppcom.rlabrecque.steamworks.net": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppcom.rlabrecque.steamworks.net.dll", @@ -161,7 +156,6 @@ required_deps = { "UnityEngine": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.dll", "UnityEngine.AnimationModule": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.AnimationModule.dll", "UnityEngine.CoreModule": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.CoreModule.dll", - "UnityEngine.HotReloadModule": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.HotReloadModule.dll", "UnityEngine.IMGUIModule": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.IMGUIModule.dll", "UnityEngine.InputLegacyModule": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.InputLegacyModule.dll", "UnityEngine.PhysicsModule": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.PhysicsModule.dll",