6 Commits

Author SHA1 Message Date
5f73135eaa version 4.8
new revive function
god mode
instant interaction
custom shortcut keys
2026-01-15 21:53:32 +11:00
62dc974fa7 add update_dependency script 2025-12-07 15:33:15 +11:00
b134834170 Version 4.7 - Radial Menu
Add a new button-"Radial Menu (Z)" instead of "Recall (B)"
2025-12-04 03:45:07 +11:00
17dc31dd10 Update README.md 2025-12-02 13:51:46 +11:00
084d39ff57 更新 DevourClient/DevourClient.csproj 2025-12-01 06:21:11 +00:00
33164f700a recall function & show coordinates 2025-11-30 16:52:41 +11:00
42 changed files with 4179 additions and 2470 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo> <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
@@ -19,9 +19,6 @@
<Reference Include="Assembly-CSharp"> <Reference Include="Assembly-CSharp">
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Assembly-CSharp.dll</HintPath> <HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Assembly-CSharp.dll</HintPath>
</Reference> </Reference>
<Reference Include="Il2CppBehaviorDesigner.Runtime">
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2CppBehaviorDesigner.Runtime.dll</HintPath>
</Reference>
<Reference Include="Il2Cppbolt"> <Reference Include="Il2Cppbolt">
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.dll</HintPath> <HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.dll</HintPath>
</Reference> </Reference>
@@ -64,9 +61,6 @@
<Reference Include="UnityEngine.CoreModule"> <Reference Include="UnityEngine.CoreModule">
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.CoreModule.dll</HintPath> <HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.CoreModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.HotReloadModule">
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.HotReloadModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.IMGUIModule"> <Reference Include="UnityEngine.IMGUIModule">
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.IMGUIModule.dll</HintPath> <HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.IMGUIModule.dll</HintPath>
</Reference> </Reference>

View File

@@ -2,9 +2,7 @@ using System.Collections.Generic;
namespace DevourClient.ESP namespace DevourClient.ESP
{ {
/// <summary> // Item ESP configuration management class - dynamically display different item types based on map
/// Item ESP configuration management class - dynamically display different item types based on map
/// </summary>
public static class ItemESPConfig public static class ItemESPConfig
{ {
// ESP type enumeration // ESP type enumeration
@@ -20,7 +18,7 @@ namespace DevourClient.ESP
Gasoline, // Gasoline Gasoline, // Gasoline
// Asylum (Molly) specific // Asylum (Molly) specific
RottonFood, // Rotten Food RottenFood, // Rotten Food
Fuse, // Fuse Fuse, // Fuse
// Inn specific // Inn specific
@@ -63,7 +61,7 @@ namespace DevourClient.ESP
// Enemy ESP - Slaughterhouse // Enemy ESP - Slaughterhouse
Corpse, // Corpse Corpse, // Corpse
Roar, // Roar Boar, // Boar
Pig, // Pig Pig, // Pig
// Enemy ESP - Manor // Enemy ESP - Manor
@@ -101,7 +99,7 @@ namespace DevourClient.ESP
ESPType.FirstAid, // Common: First Aid ESPType.FirstAid, // Common: First Aid
ESPType.Battery, // Common: Battery ESPType.Battery, // Common: Battery
ESPType.Keys, // Common: Keys ESPType.Keys, // Common: Keys
ESPType.RottonFood, // Specific: Rotten Food ESPType.RottenFood, // Specific: Rotten Food
ESPType.Fuse, // Specific: Fuse ESPType.Fuse, // Specific: Fuse
ESPType.Inmates, // Enemy: Inmates ESPType.Inmates, // Enemy: Inmates
ESPType.Rat // Enemy: Rat ESPType.Rat // Enemy: Rat
@@ -142,7 +140,7 @@ namespace DevourClient.ESP
ESPType.Bone, // Specific: Bone ESPType.Bone, // Specific: Bone
ESPType.Gasoline, // Specific: Gasoline ESPType.Gasoline, // Specific: Gasoline
ESPType.Corpse, // Enemy: Corpse ESPType.Corpse, // Enemy: Corpse
ESPType.Roar, // Enemy: Roar ESPType.Boar, // Enemy: Boar
ESPType.Pig // Enemy: Pig ESPType.Pig // Enemy: Pig
} }
}, },
@@ -204,7 +202,7 @@ namespace DevourClient.ESP
{ ESPType.Gasoline, false }, { ESPType.Gasoline, false },
// Asylum specific // Asylum specific
{ ESPType.RottonFood, false }, { ESPType.RottenFood, false },
{ ESPType.Fuse, false }, { ESPType.Fuse, false },
// Inn specific // Inn specific
@@ -244,7 +242,7 @@ namespace DevourClient.ESP
// Enemy - Slaughterhouse // Enemy - Slaughterhouse
{ ESPType.Corpse, false }, { ESPType.Corpse, false },
{ ESPType.Roar, false }, { ESPType.Boar, false },
{ ESPType.Pig, false }, { ESPType.Pig, false },
// Enemy - Manor // Enemy - Manor
@@ -260,9 +258,6 @@ namespace DevourClient.ESP
{ ESPType.Collectables, false } { ESPType.Collectables, false }
}; };
/// <summary>
/// Get list of ESP types supported by specified map
/// </summary>
public static List<ESPType> GetMapESPTypes(string sceneName) public static List<ESPType> GetMapESPTypes(string sceneName)
{ {
// If in menu, return empty list // If in menu, return empty list
@@ -284,35 +279,23 @@ namespace DevourClient.ESP
}; };
} }
/// <summary>
/// Get ESP type enable status
/// </summary>
public static bool GetESPState(ESPType type) public static bool GetESPState(ESPType type)
{ {
return espStates.ContainsKey(type) ? espStates[type] : false; return espStates.ContainsKey(type) ? espStates[type] : false;
} }
/// <summary>
/// Set ESP type enable status
/// </summary>
public static void SetESPState(ESPType type, bool enabled) public static void SetESPState(ESPType type, bool enabled)
{ {
if (espStates.ContainsKey(type)) if (espStates.ContainsKey(type))
espStates[type] = enabled; espStates[type] = enabled;
} }
/// <summary>
/// Toggle ESP type enable status
/// </summary>
public static void ToggleESPState(ESPType type) public static void ToggleESPState(ESPType type)
{ {
if (espStates.ContainsKey(type)) if (espStates.ContainsKey(type))
espStates[type] = !espStates[type]; espStates[type] = !espStates[type];
} }
/// <summary>
/// Get ESP type display name (for translation key)
/// </summary>
public static string GetESPTypeName(ESPType type) public static string GetESPTypeName(ESPType type)
{ {
switch (type) switch (type)
@@ -332,8 +315,8 @@ namespace DevourClient.ESP
return "Gasoline ESP"; return "Gasoline ESP";
// Asylum specific // Asylum specific
case ESPType.RottonFood: case ESPType.RottenFood:
return "Rotton Food ESP"; return "Rotten Food ESP";
case ESPType.Fuse: case ESPType.Fuse:
return "Fuse ESP"; return "Fuse ESP";
@@ -392,8 +375,8 @@ namespace DevourClient.ESP
// Enemy - Slaughterhouse // Enemy - Slaughterhouse
case ESPType.Corpse: case ESPType.Corpse:
return "Corpse ESP"; return "Corpse ESP";
case ESPType.Roar: case ESPType.Boar:
return "Roar ESP"; return "Boar ESP";
case ESPType.Pig: case ESPType.Pig:
return "Pig ESP"; return "Pig ESP";
@@ -420,9 +403,6 @@ namespace DevourClient.ESP
} }
} }
/// <summary>
/// Get corresponding ESP type based on item name
/// </summary>
public static ESPType? GetESPTypeByItemName(string itemName) public static ESPType? GetESPTypeByItemName(string itemName)
{ {
if (string.IsNullOrEmpty(itemName)) if (string.IsNullOrEmpty(itemName))
@@ -459,10 +439,10 @@ namespace DevourClient.ESP
return ESPType.Gasoline; return ESPType.Gasoline;
// Asylum specific // Asylum specific
case "rottonfoodpickup": case "rottenfoodpickup":
case "rotton food": case "rotten food":
case "rottonfood": case "rottenfood":
return ESPType.RottonFood; return ESPType.RottenFood;
case "fusepickup": case "fusepickup":
case "fuse": case "fuse":
@@ -554,13 +534,12 @@ namespace DevourClient.ESP
case "corpsebehaviour": case "corpsebehaviour":
return ESPType.Corpse; return ESPType.Corpse;
case "roar":
case "roarbehaviour":
return ESPType.Roar;
case "pig":
case "boar": case "boar":
case "boarbehaviour": case "boarbehaviour":
return ESPType.Boar;
case "pig":
case "pigbehaviour": case "pigbehaviour":
return ESPType.Pig; return ESPType.Pig;
@@ -617,9 +596,6 @@ namespace DevourClient.ESP
} }
} }
/// <summary>
/// Check if ESP should be shown for specified item
/// </summary>
public static bool ShouldShowESP(string itemName) public static bool ShouldShowESP(string itemName)
{ {
ESPType? espType = GetESPTypeByItemName(itemName); ESPType? espType = GetESPTypeByItemName(itemName);
@@ -629,9 +605,6 @@ namespace DevourClient.ESP
return GetESPState(espType.Value); return GetESPState(espType.Value);
} }
/// <summary>
/// Reset all ESP states
/// </summary>
public static void ResetAllStates() public static void ResetAllStates()
{ {
var keys = new List<ESPType>(espStates.Keys); var keys = new List<ESPType>(espStates.Keys);
@@ -649,7 +622,7 @@ namespace DevourClient.ESP
GetESPState(ESPType.Keys) || GetESPState(ESPType.Keys) ||
GetESPState(ESPType.Hay) || GetESPState(ESPType.Hay) ||
GetESPState(ESPType.Gasoline) || GetESPState(ESPType.Gasoline) ||
GetESPState(ESPType.RottonFood) || GetESPState(ESPType.RottenFood) ||
GetESPState(ESPType.Fuse) || GetESPState(ESPType.Fuse) ||
GetESPState(ESPType.Bleach) || GetESPState(ESPType.Bleach) ||
GetESPState(ESPType.Egg) || GetESPState(ESPType.Egg) ||
@@ -678,7 +651,7 @@ namespace DevourClient.ESP
GetESPState(ESPType.Spider) || GetESPState(ESPType.Spider) ||
GetESPState(ESPType.Ghost) || GetESPState(ESPType.Ghost) ||
GetESPState(ESPType.Corpse) || GetESPState(ESPType.Corpse) ||
GetESPState(ESPType.Roar) || GetESPState(ESPType.Boar) ||
GetESPState(ESPType.Pig) || GetESPState(ESPType.Pig) ||
GetESPState(ESPType.Crow) || GetESPState(ESPType.Crow) ||
GetESPState(ESPType.DirtyHead) || GetESPState(ESPType.DirtyHead) ||

View File

@@ -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<Il2Cpp.GameUI>();
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<Collider>();
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<Collider>();
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<Il2CppOpsive.UltimateCharacterController.Character.UltimateCharacterLocomotion>();
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;
}
}
}
}

View File

@@ -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}");
}
}
}
}

View File

@@ -1,4 +1,4 @@
using UnityEngine; using UnityEngine;
using MelonLoader; using MelonLoader;
using UnityEngine.UI; using UnityEngine.UI;
using System.Reflection; using System.Reflection;
@@ -47,14 +47,14 @@ namespace DevourClient.Hacks
public static void WalkInLobby(bool walk) public static void WalkInLobby(bool walk)
{ {
GameObject LocalPlayer = Helpers.Entities.LocalPlayer_.p_GameObject; GameObject? LocalPlayer = Helpers.Entities.LocalPlayer_.p_GameObject;
if (LocalPlayer == null) if (LocalPlayer == null)
{ {
return; return;
} }
//GetComponent called only once as AddComponent returns a component //GetComponent called only once as AddComponent returns a component
UltimateCharacterLocomotionHandler cmp = Helpers.Entities.LocalPlayer_.p_GameObject.GetComponent<UltimateCharacterLocomotionHandler>(); UltimateCharacterLocomotionHandler? cmp = LocalPlayer.GetComponent<UltimateCharacterLocomotionHandler>();
if (cmp == null) if (cmp == null)
{ {
@@ -143,7 +143,7 @@ namespace DevourClient.Hacks
return; return;
} }
GameObject _localPlayer = Helpers.Entities.LocalPlayer_.p_GameObject; GameObject? _localPlayer = Helpers.Entities.LocalPlayer_.p_GameObject;
if (_localPlayer != null) if (_localPlayer != null)
{ {
@@ -174,7 +174,17 @@ namespace DevourClient.Hacks
public static void CarryObject(string name) public static void CarryObject(string name)
{ {
Il2Cpp.NolanBehaviour nb = Helpers.Entities.LocalPlayer_.p_GameObject.GetComponent<Il2Cpp.NolanBehaviour>(); GameObject? localPlayerGameObject = Helpers.Entities.LocalPlayer_.p_GameObject;
if (localPlayerGameObject == null)
{
return;
}
Il2Cpp.NolanBehaviour? nb = localPlayerGameObject.GetComponent<Il2Cpp.NolanBehaviour>();
if (nb == null)
{
return;
}
nb.StartCarry(name); nb.StartCarry(name);
} }
@@ -203,12 +213,24 @@ namespace DevourClient.Hacks
} }
public static void TPItems() public static void TPItems()
{ {
Il2Cpp.NolanBehaviour Nolan = Player.GetPlayer(); Il2Cpp.NolanBehaviour? Nolan = Player.GetPlayer();
if (Nolan == null)
foreach (Il2Cpp.SurvivalInteractable item in Helpers.Entities.SurvivalInteractables)
{ {
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); item.transform.position = Nolan.transform.position + Nolan.transform.forward * UnityEngine.Random.RandomRange(1f, 3f);
} }
}
} }
public static void CreateCustomizedLobby(int lobbySize = 4, bool isPrivate = false, Il2CppUdpKit.Platform.Photon.PhotonRegion.Regions __region = Il2CppUdpKit.Platform.Photon.PhotonRegion.Regions.BEST_REGION) public static void CreateCustomizedLobby(int lobbySize = 4, bool isPrivate = false, Il2CppUdpKit.Platform.Photon.PhotonRegion.Regions __region = Il2CppUdpKit.Platform.Photon.PhotonRegion.Regions.BEST_REGION)
@@ -298,7 +320,11 @@ namespace DevourClient.Hacks
public static void Fullbright(bool reset) public static void Fullbright(bool reset)
{ {
Il2Cpp.NolanBehaviour Nolan = Player.GetPlayer(); Il2Cpp.NolanBehaviour? Nolan = Player.GetPlayer();
if (Nolan == null)
{
return;
}
if (Nolan == null) if (Nolan == null)
{ {
return; return;
@@ -330,7 +356,11 @@ namespace DevourClient.Hacks
} }
public static void FlashlightColor(Color color) public static void FlashlightColor(Color color)
{ {
Il2Cpp.NolanBehaviour Nolan = Player.GetPlayer(); Il2Cpp.NolanBehaviour? Nolan = Player.GetPlayer();
if (Nolan == null)
{
return;
}
Light flashlightSpot = Nolan.flashlightSpot; Light flashlightSpot = Nolan.flashlightSpot;
flashlightSpot.color = color; flashlightSpot.color = color;
@@ -339,7 +369,11 @@ namespace DevourClient.Hacks
public static void TPKeys() public static void TPKeys()
{ {
//TOFIX: spawn manually the missing key in slaughterhouse //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) foreach (Il2Cpp.KeyBehaviour keyBehaviour in Helpers.Entities.Keys)
{ {
@@ -353,7 +387,7 @@ namespace DevourClient.Hacks
public static void SetRank(int rank) public static void SetRank(int rank)
{ {
Il2Cpp.NolanRankController NolanRank = UnityEngine.Object.FindObjectOfType<Il2Cpp.NolanRankController>(); Il2Cpp.NolanRankController? NolanRank = UnityEngine.Object.FindObjectOfType<Il2Cpp.NolanRankController>();
if (NolanRank == null) if (NolanRank == null)
{ {
return; return;
@@ -363,6 +397,8 @@ namespace DevourClient.Hacks
public static void DespawnDemons() public static void DespawnDemons()
{
if (Helpers.Entities.Demons != null)
{ {
foreach (Il2Cpp.SurvivalDemonBehaviour demon in Helpers.Entities.Demons) foreach (Il2Cpp.SurvivalDemonBehaviour demon in Helpers.Entities.Demons)
{ {
@@ -372,10 +408,13 @@ namespace DevourClient.Hacks
} }
} }
} }
}
public static void DespawnSpiders() public static void DespawnSpiders()
{ {
foreach (Il2Cpp.SpiderBehaviour spider in Helpers.Entities.Spiders) if (Helpers.Entities.Spiders != null)
{
foreach (Il2Cpp.SpiderBehaviour? spider in Helpers.Entities.Spiders)
{ {
if (spider != null) if (spider != null)
{ {
@@ -383,8 +422,11 @@ namespace DevourClient.Hacks
} }
} }
} }
}
public static void DespawnGhosts() public static void DespawnGhosts()
{
if (Helpers.Entities.Ghosts != null)
{ {
foreach (Il2Cpp.GhostBehaviour ghost in Helpers.Entities.Ghosts) foreach (Il2Cpp.GhostBehaviour ghost in Helpers.Entities.Ghosts)
{ {
@@ -394,8 +436,11 @@ namespace DevourClient.Hacks
} }
} }
} }
}
public static void DespawnBoars() public static void DespawnBoars()
{
if (Helpers.Entities.Boars != null)
{ {
foreach (Il2Cpp.BoarBehaviour boar in Helpers.Entities.Boars) foreach (Il2Cpp.BoarBehaviour boar in Helpers.Entities.Boars)
{ {
@@ -405,8 +450,11 @@ namespace DevourClient.Hacks
} }
} }
} }
}
public static void DespawnCorpses() public static void DespawnCorpses()
{
if (Helpers.Entities.Corpses != null)
{ {
foreach (Il2Cpp.CorpseBehaviour corpse in Helpers.Entities.Corpses) foreach (Il2Cpp.CorpseBehaviour corpse in Helpers.Entities.Corpses)
{ {
@@ -416,10 +464,13 @@ namespace DevourClient.Hacks
} }
} }
} }
}
public static void DespawnCrows() public static void DespawnCrows()
{ {
foreach (Il2Cpp.CrowBehaviour crow in Helpers.Entities.Crows) if (Helpers.Entities.Crows != null)
{
foreach (Il2Cpp.CrowBehaviour? crow in Helpers.Entities.Crows)
{ {
if (crow != null) if (crow != null)
{ {
@@ -427,8 +478,11 @@ namespace DevourClient.Hacks
} }
} }
} }
}
public static void DespawnLumps() public static void DespawnLumps()
{
if (Helpers.Entities.Lumps != null)
{ {
foreach (Il2Cpp.ManorLumpController lump in Helpers.Entities.Lumps) foreach (Il2Cpp.ManorLumpController lump in Helpers.Entities.Lumps)
{ {
@@ -437,6 +491,7 @@ namespace DevourClient.Hacks
lump.Dissolve(); lump.Dissolve();
} }
} }
}
} }
public static void DespawnMonkeys() public static void DespawnMonkeys()
@@ -504,6 +559,11 @@ namespace DevourClient.Hacks
} }
} }
public static void InstantInteractTick(bool enabled)
{
return;
}
public static void FreezeAzazel() public static void FreezeAzazel()
{ {
if (Helpers.Map.GetActiveScene() == "Menu") if (Helpers.Map.GetActiveScene() == "Menu")

View File

@@ -9,12 +9,12 @@ namespace DevourClient.Helpers
private static float G; private static float G;
private static float B; private static float B;
private static Texture2D previewTexture = null; private static Texture2D? previewTexture = null;
private static Dictionary<Color, Texture2D> colorTextureCache = new Dictionary<Color, Texture2D>(); private static Dictionary<Color, Texture2D> colorTextureCache = new Dictionary<Color, Texture2D>();
private static Dictionary<int, Texture2D> circularTextureCache = new Dictionary<int, Texture2D>(); private static Dictionary<int, Texture2D> circularTextureCache = new Dictionary<int, Texture2D>();
private static Color lastPreviewColor = Color.clear; private static Color lastPreviewColor = Color.clear;
private static GUIStyle cachedBoxStyle = null; private static GUIStyle? cachedBoxStyle = null;
public static Color ColorPick(string title, Color color) 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) 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) if (cachedTexture != null)
{ {
@@ -85,7 +85,7 @@ namespace DevourClient.Helpers
{ {
int cacheKey = width; int cacheKey = width;
if (circularTextureCache.TryGetValue(cacheKey, out Texture2D cachedTexture)) if (circularTextureCache.TryGetValue(cacheKey, out Texture2D? cachedTexture))
{ {
if (cachedTexture != null) if (cachedTexture != null)
{ {

View File

@@ -1,4 +1,4 @@
namespace DevourClient.Helpers namespace DevourClient.Helpers
{ {
class Map class Map
{ {
@@ -11,6 +11,7 @@
{ {
switch (sceneName) switch (sceneName)
{ {
case "Devour":
case "Anna": case "Anna":
return "Farmhouse"; return "Farmhouse";
case "Molly": case "Molly":
@@ -30,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; return Helpers.Entities.Azazels[0].gameObject;
} }

View File

@@ -2,20 +2,19 @@ using System;
using DevourClient.Network; using DevourClient.Network;
using MelonLoader; using MelonLoader;
using UnityEngine; using UnityEngine;
using Il2CppPhoton.Bolt;
using Il2Cpp;
using Il2CppOpsive.UltimateCharacterController.Character;
namespace DevourClient.Helpers namespace DevourClient.Helpers
{ {
/// <summary> // Shared revive utilities. When running as host we mirror DevourX's revive flow.
/// Shared revive utilities. When running as host we mirror DevourX's revive flow.
/// </summary>
public static class ReviveHelper public static class ReviveHelper
{ {
private static readonly Vector3 HostFallbackPosition = new Vector3(0f, -150f, 0f); private static readonly Vector3 HostFallbackPosition = new Vector3(0f, -150f, 0f);
/// <summary> // Try to revive the provided NolanBehaviour using host-specific logic first,
/// Try to revive the provided NolanBehaviour using host-specific logic first, // then fall back to the standard interactable flow.
/// then fall back to the standard interactable flow.
/// </summary>
public static bool TryRevive(Il2Cpp.NolanBehaviour target) public static bool TryRevive(Il2Cpp.NolanBehaviour target)
{ {
if (target == null || target.gameObject == null) if (target == null || target.gameObject == null)
@@ -23,10 +22,20 @@ namespace DevourClient.Helpers
return false; return false;
} }
if (NetworkHelper.IsHost() && Player.IsInGame())
{
if (TryHostRevive(target)) if (TryHostRevive(target))
{ {
return true; return true;
} }
}
else
{
if (TryClientRevive(target))
{
return true;
}
}
return TryInteractRevive(target); return TryInteractRevive(target);
} }
@@ -45,16 +54,70 @@ namespace DevourClient.Helpers
try try
{ {
Il2Cpp.SurvivalReviveInteractable interactable = UnityEngine.Object.FindObjectOfType<Il2Cpp.SurvivalReviveInteractable>(); var reviverEntity = GetLocalPlayerEntity();
if (interactable == null) if (reviverEntity == null)
{ {
target.TeleportTo(HostFallbackPosition, Quaternion.identity); return false;
MelonLogger.Msg("[ReviveHelper] Host fallback teleport executed (no interactable found).");
return true;
} }
interactable.Interact(target.gameObject); var targetEntity = target.entity;
MelonLogger.Msg("[ReviveHelper] Host revive interactable triggered."); ReviveEvent.Post(GlobalTargets.Others, targetEntity, reviverEntity);
var survival = UnityEngine.Object.FindObjectOfType<Il2Cpp.Survival>();
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<CharacterLayerManager>();
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<IPlayerState>();
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<Il2Cpp.NolanNameplateController>();
if (nameplate != null) nameplate.OnReviveEvent(targetEntity, reviverEntity);
var perkController = target.gameObject.GetComponent<Il2Cpp.NolanPerkController>();
if (perkController != null) perkController.OnReviveEvent(targetEntity, reviverEntity);
if (Il2Cpp.IngameStatsTracker.singleton != null)
{
Il2Cpp.IngameStatsTracker.singleton.OnReviveEvent(targetEntity, reviverEntity);
}
NotifySceneListeners(targetEntity, reviverEntity);
return true; return true;
} }
catch (Exception ex) catch (Exception ex)
@@ -64,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) private static bool TryInteractRevive(Il2Cpp.NolanBehaviour target)
{ {
try try
@@ -88,23 +177,54 @@ namespace DevourClient.Helpers
return false; return false;
} }
/// <summary> private static BoltEntity? GetLocalPlayerEntity()
/// Legacy revive method migrated from StateHelper.BasePlayer.Revive().
/// This method preserves the original implementation from StateHelper.
/// </summary>
/// <param name="targetGameObject">The GameObject of the player to revive</param>
public static void ReviveLegacy(GameObject targetGameObject)
{ {
if (targetGameObject == null) var players = GameObject.FindGameObjectsWithTag("Player");
for (int i = 0; i < players.Length; i++)
{ {
return; var nb = players[i].GetComponent<Il2Cpp.NolanBehaviour>();
if (nb != null && nb.entity != null && nb.entity.IsAttached && nb.entity.IsOwner)
{
return nb.entity;
}
}
return null;
} }
Il2Cpp.NolanBehaviour nb = targetGameObject.GetComponent<Il2Cpp.NolanBehaviour>(); private static void NotifySceneListeners(BoltEntity player, BoltEntity reviver)
Il2Cpp.SurvivalReviveInteractable _reviveInteractable = UnityEngine.Object.FindObjectOfType<Il2Cpp.SurvivalReviveInteractable>(); {
foreach (var pet in UnityEngine.Object.FindObjectsOfType<Il2Cpp.PetController>())
if (_reviveInteractable.CanInteract(nb.gameObject) == true) { _reviveInteractable.Interact(nb.gameObject); } {
} pet.OnReviveEvent(player, reviver);
}
} }
foreach (var mgr in UnityEngine.Object.FindObjectsOfType<Il2Cpp.ReconnectManager>())
{
mgr.OnReviveEvent(player, reviver);
}
foreach (var web in UnityEngine.Object.FindObjectsOfType<Il2Cpp.InnWebController>())
{
web.OnReviveEvent(player, reviver);
}
foreach (var crawl in UnityEngine.Object.FindObjectsOfType<Il2Cpp.InnShojiDoorCrawlRendering>())
{
crawl.OnReviveEvent(player, reviver);
}
foreach (var deadRealm in UnityEngine.Object.FindObjectsOfType<Il2Cpp.ManorDeadRealmTrigger>())
{
deadRealm.OnReviveEvent(player, reviver);
}
foreach (var poison in UnityEngine.Object.FindObjectsOfType<Il2Cpp.PoisonBox>())
{
poison.OnReviveEvent(player, reviver);
}
foreach (var stairs in UnityEngine.Object.FindObjectsOfType<Il2Cpp.TriggerStairsCrawlState>())
{
stairs.OnReviveEvent(player, reviver);
}
}
}
}

View File

@@ -9,7 +9,7 @@ namespace DevourClient.Helpers
{ {
public class BasePlayer 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 Name { get; set; } = default!;
public string Id { get; set; } = default!; public string Id { get; set; } = default!;
@@ -121,6 +121,7 @@ namespace DevourClient.Helpers
_azazelSam.OnShootPlayer(p_GameObject, true); _azazelSam.OnShootPlayer(p_GameObject, true);
} }
} }
} }
public class Player public class Player
{ {
@@ -164,22 +165,22 @@ namespace DevourClient.Helpers
public static int MAX_PLAYERS = 4; //will change by calling CreateCustomizedLobby public static int MAX_PLAYERS = 4; //will change by calling CreateCustomizedLobby
public static BasePlayer LocalPlayer_ = new BasePlayer(); public static BasePlayer LocalPlayer_ = new BasePlayer();
public static BasePlayer[] Players = default!; public static BasePlayer[]? Players = default!;
public static Il2Cpp.GoatBehaviour[] GoatsAndRats = default!; public static Il2Cpp.GoatBehaviour[]? GoatsAndRats = default!;
public static Il2Cpp.SurvivalInteractable[] SurvivalInteractables = default!; public static Il2Cpp.SurvivalInteractable[]? SurvivalInteractables = default!;
public static Il2Cpp.KeyBehaviour[] Keys = default!; public static Il2Cpp.KeyBehaviour[]? Keys = default!;
public static Il2Cpp.SurvivalDemonBehaviour[] Demons = default!; public static Il2Cpp.SurvivalDemonBehaviour[]? Demons = default!;
public static Il2Cpp.SpiderBehaviour[] Spiders = default!; public static Il2Cpp.SpiderBehaviour[]? Spiders = default!;
public static Il2Cpp.GhostBehaviour[] Ghosts = default!; public static Il2Cpp.GhostBehaviour[]? Ghosts = default!;
public static Il2Cpp.SurvivalAzazelBehaviour[] Azazels = default!; public static Il2Cpp.SurvivalAzazelBehaviour[]? Azazels = default!;
public static Il2Cpp.BoarBehaviour[] Boars = default!; public static Il2Cpp.BoarBehaviour[]? Boars = default!;
public static Il2Cpp.CorpseBehaviour[] Corpses = default!; public static Il2Cpp.CorpseBehaviour[]? Corpses = default!;
public static Il2Cpp.CrowBehaviour[] Crows = default!; public static Il2Cpp.CrowBehaviour[]? Crows = default!;
public static Il2Cpp.ManorLumpController[] Lumps = default!; public static Il2Cpp.ManorLumpController[]? Lumps = default!;
public static Il2Cpp.GoatBehaviour[] DirtyHeads = default!; public static Il2Cpp.GoatBehaviour[]? DirtyHeads = default!;
public static Il2Cpp.MonkeyBehaviour[] Monkeys = default!; public static Il2Cpp.MonkeyBehaviour[]? Monkeys = default!;
public static Il2Cpp.GoatBehaviour[] Dolls = default!; public static Il2Cpp.GoatBehaviour[]? Dolls = default!;
public static Il2Cpp.CollectableInteractable[] Collectables = default!; public static Il2Cpp.CollectableInteractable[]? Collectables = default!;
// Coroutine lifecycle management // Coroutine lifecycle management
private static List<object> activeCoroutines = new List<object>(); private static List<object> activeCoroutines = new List<object>();

View File

@@ -1,5 +1,7 @@
using HarmonyLib; using HarmonyLib;
using Il2Cpp; using Il2Cpp;
using UnityEngine;
using System;
namespace DevourClient.Hooks namespace DevourClient.Hooks
{ {
@@ -19,6 +21,8 @@ namespace DevourClient.Hooks
} }
} }
[HarmonyPatch(typeof(Il2Cpp.RankHelpers))] [HarmonyPatch(typeof(Il2Cpp.RankHelpers))]
[HarmonyPatch(nameof(Il2Cpp.RankHelpers.CalculateExpGain))] //annotation boiler plate to tell Harmony what to patch. Refer to docs. [HarmonyPatch(nameof(Il2Cpp.RankHelpers.CalculateExpGain))] //annotation boiler plate to tell Harmony what to patch. Refer to docs.
static class RankHelpers_CalculateExpGain static class RankHelpers_CalculateExpGain
@@ -128,5 +132,20 @@ namespace DevourClient.Hooks
__result = false; __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;
}
}
} }
} }

View File

@@ -108,8 +108,8 @@ namespace DevourClient.Localization
// Keep AddTranslation method for backward compatibility (used by AddCustomTranslation) // Keep AddTranslation method for backward compatibility (used by AddCustomTranslation)
private static void AddTranslation(string english, private static void AddTranslation(string english,
string cn = null, string fr = null, string de = null, string es = 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) string? ja = null, string? ko = null, string? ru = null, string? pt = null, string? it = null, string? vi = null)
{ {
var translations = new Dictionary<Language, string> var translations = new Dictionary<Language, string>
{ {

View File

@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
{ "Ping", "延迟" }, { "Ping", "延迟" },
{ "Play Random Sound", "播放随机音效" }, { "Play Random Sound", "播放随机音效" },
{ "Player", "玩家" }, { "Player", "玩家" },
{ "Instant Interaction", "立即交互" },
{ "Player Count", "玩家数" }, { "Player Count", "玩家数" },
{ "Player ESP", "玩家透视" }, { "Player ESP", "玩家透视" },
{ "Player ESP Color", "玩家透视颜色" }, { "Player ESP Color", "玩家透视颜色" },
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
{ "Rat ESP", "老鼠透视" }, { "Rat ESP", "老鼠透视" },
{ "Region", "区域" }, { "Region", "区域" },
{ "Revive", "复活" }, { "Revive", "复活" },
{ "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", "咆哮者透视" }, { "Boar ESP", "野猪透视" },
{ "Role", "角色" }, { "Role", "角色" },
{ "RottenFood", "腐烂食物" }, { "RottenFood", "腐烂食物" },
{ "Rotton Food ESP", "腐烂食物透视" }, { "Rotten Food ESP", "腐烂食物透视" },
{ "Sam", "萨姆" }, { "Sam", "萨姆" },
{ "Shoot Player", "射击玩家" }, { "Shoot Player", "射击玩家" },
{ "Show Coordinates", "显示坐标" },
{ "Skeleton ESP", "骨骼透视" }, { "Skeleton ESP", "骨骼透视" },
{ "Slaughterhouse", "屠宰场" }, { "Slaughterhouse", "屠宰场" },
{ "SlaughterhouseFireEscapeDoor", "屠宰场消防门" }, { "SlaughterhouseFireEscapeDoor", "屠宰场消防门" },
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
{ "TV", "电视" }, { "TV", "电视" },
{ "Teleport Keys", "传送钥匙" }, { "Teleport Keys", "传送钥匙" },
{ "Teleport to", "传送至" }, { "Teleport to", "传送至" },
{ "TP Base", "传送至基地" },
{ "TP Altar", "传送至祭坛" },
{ "TP Basin", "传送至水池" },
{ "TP Fountain", "传送至喷泉" },
{ "Ticket", "票券" }, { "Ticket", "票券" },
{ "Town", "小镇" }, { "Town", "小镇" },
{ "TownDoor", "小镇门" }, { "TownDoor", "小镇门" },
@@ -268,10 +275,22 @@ namespace DevourClient.Localization.Translations
{ "Unlimited UV Light", "无限紫外线" }, { "Unlimited UV Light", "无限紫外线" },
{ "Unlock Achievements", "解锁成就" }, { "Unlock Achievements", "解锁成就" },
{ "Unlock Doors", "解锁门" }, { "Unlock Doors", "解锁门" },
{ "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", "园丁" },
{ "Butler", "管家" },
{ "Bridesmaid 1", "伴娘 1" },
{ "Bridesmaid 2", "伴娘 2" },
{ "Cook", "厨师" },
{ "Groomsman 1", "伴郎 1" },
{ "Groomsman 2", "伴郎 2" },
{ "Maid", "女仆" },
{ "Photographer", "摄影师" },
{ "Priest", "牧师" },
{ "Menu Key", "菜单键" },
}; };
} }
} }

View File

@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
{ "Ping", "Ping" }, { "Ping", "Ping" },
{ "Play Random Sound", "Play Random Sound" }, { "Play Random Sound", "Play Random Sound" },
{ "Player", "Player" }, { "Player", "Player" },
{ "Instant Interaction", "Instant Interaction" },
{ "Player Count", "Player Count" }, { "Player Count", "Player Count" },
{ "Player ESP", "Player ESP" }, { "Player ESP", "Player ESP" },
{ "Player ESP Color", "Player ESP Color" }, { "Player ESP Color", "Player ESP Color" },
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
{ "Rat ESP", "Rat ESP" }, { "Rat ESP", "Rat ESP" },
{ "Region", "Region" }, { "Region", "Region" },
{ "Revive", "Revive" }, { "Revive", "Revive" },
{ "Radial Menu", "Radial Menu" },
{ "Ritual Book", "Ritual Book" }, { "Ritual Book", "Ritual Book" },
{ "Rose", "Rose" }, { "Rose", "Rose" },
{ "Ritual Book ESP", "Ritual Book ESP" }, { "Ritual Book ESP", "Ritual Book ESP" },
{ "Ritual Object ESP", "Ritual Object ESP" }, { "Ritual Object ESP", "Ritual Object ESP" },
{ "Ritual Objects", "Ritual Objects" }, { "Ritual Objects", "Ritual Objects" },
{ "RitualBook", "RitualBook" }, { "RitualBook", "RitualBook" },
{ "Roar ESP", "Roar ESP" }, { "Boar ESP", "Boar ESP" },
{ "Role", "Role" }, { "Role", "Role" },
{ "RottenFood", "RottenFood" }, { "RottenFood", "RottenFood" },
{ "Rotton Food ESP", "Rotton Food ESP" }, { "Rotten Food ESP", "Rotten Food ESP" },
{ "Sam", "Sam" }, { "Sam", "Sam" },
{ "Shoot Player", "Shoot Player" }, { "Shoot Player", "Shoot Player" },
{ "Show Coordinates", "Show Coordinates" },
{ "Skeleton ESP", "Skeleton ESP" }, { "Skeleton ESP", "Skeleton ESP" },
{ "Slaughterhouse", "Slaughterhouse" }, { "Slaughterhouse", "Slaughterhouse" },
{ "SlaughterhouseFireEscapeDoor", "SlaughterhouseFireEscapeDoor" }, { "SlaughterhouseFireEscapeDoor", "SlaughterhouseFireEscapeDoor" },
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
{ "TV", "TV" }, { "TV", "TV" },
{ "Teleport Keys", "Teleport Keys" }, { "Teleport Keys", "Teleport Keys" },
{ "Teleport to", "Teleport to" }, { "Teleport to", "Teleport to" },
{ "TP Base", "TP Base" },
{ "TP Altar", "TP Altar" },
{ "TP Basin", "TP Basin" },
{ "TP Fountain", "TP Fountain" },
{ "Ticket", "Ticket" }, { "Ticket", "Ticket" },
{ "Town", "Town" }, { "Town", "Town" },
{ "TownDoor", "TownDoor" }, { "TownDoor", "TownDoor" },
@@ -268,10 +275,22 @@ namespace DevourClient.Localization.Translations
{ "Unlimited UV Light", "Unlimited UV Light" }, { "Unlimited UV Light", "Unlimited UV Light" },
{ "Unlock Achievements", "Unlock Achievements" }, { "Unlock Achievements", "Unlock Achievements" },
{ "Unlock Doors", "Unlock Doors" }, { "Unlock Doors", "Unlock Doors" },
{ "God Mode", "God Mode" },
{ "Visuals", "Visuals" }, { "Visuals", "Visuals" },
{ "Waiting for the game to start", "Waiting for the game to start" }, { "Waiting for the game to start", "Waiting for the game to start" },
{ "Walk In Lobby", "Walk In Lobby" }, { "Walk In Lobby", "Walk In Lobby" },
{ "Zara", "Zara" }, { "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" },
}; };
} }
} }

View File

@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
{ "Ping", "Ping" }, { "Ping", "Ping" },
{ "Play Random Sound", "Jouer son aléatoire" }, { "Play Random Sound", "Jouer son aléatoire" },
{ "Player", "Joueur" }, { "Player", "Joueur" },
{ "Instant Interaction", "Interaction instantanée" },
{ "Player Count", "Nombre de joueurs" }, { "Player Count", "Nombre de joueurs" },
{ "Player ESP", "ESP joueur" }, { "Player ESP", "ESP joueur" },
{ "Player ESP Color", "Couleur ESP joueur" }, { "Player ESP Color", "Couleur ESP joueur" },
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
{ "Rat ESP", "ESP rat" }, { "Rat ESP", "ESP rat" },
{ "Region", "Région" }, { "Region", "Région" },
{ "Revive", "Réanimer" }, { "Revive", "Réanimer" },
{ "Radial Menu", "Menu radial" },
{ "Ritual Book", "Livre rituel" }, { "Ritual Book", "Livre rituel" },
{ "Rose", "Rose" }, { "Rose", "Rose" },
{ "Ritual Book ESP", "ESP livre rituel" }, { "Ritual Book ESP", "ESP livre rituel" },
{ "Ritual Object ESP", "ESP objet rituel" }, { "Ritual Object ESP", "ESP objet rituel" },
{ "Ritual Objects", "Objets rituels" }, { "Ritual Objects", "Objets rituels" },
{ "RitualBook", "Livre rituel" }, { "RitualBook", "Livre rituel" },
{ "Roar ESP", "ESP rugissement" }, { "Boar ESP", "ESP Sanglier" },
{ "Role", "Rôle" }, { "Role", "Rôle" },
{ "RottenFood", "Nourriture pourrie" }, { "RottenFood", "Nourriture pourrie" },
{ "Rotton Food ESP", "ESP nourriture pourrie" }, { "Rotten Food ESP", "ESP Nourriture Pourrie" },
{ "Sam", "Sam" }, { "Sam", "Sam" },
{ "Shoot Player", "Tirer sur le joueur" }, { "Shoot Player", "Tirer sur le joueur" },
{ "Show Coordinates", "Afficher coordonnées" },
{ "Skeleton ESP", "ESP squelette" }, { "Skeleton ESP", "ESP squelette" },
{ "Slaughterhouse", "Abattoir" }, { "Slaughterhouse", "Abattoir" },
{ "SlaughterhouseFireEscapeDoor", "Porte de secours d'abattoir" }, { "SlaughterhouseFireEscapeDoor", "Porte de secours d'abattoir" },
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
{ "TV", "Télévision" }, { "TV", "Télévision" },
{ "Teleport Keys", "Téléporter clés" }, { "Teleport Keys", "Téléporter clés" },
{ "Teleport to", "Téléporter" }, { "Teleport to", "Téléporter" },
{ "TP Base", "TP base" },
{ "TP Altar", "TP autel" },
{ "TP Basin", "TP bassin" },
{ "TP Fountain", "TP fontaine" },
{ "Ticket", "Billet" }, { "Ticket", "Billet" },
{ "Town", "Ville" }, { "Town", "Ville" },
{ "TownDoor", "Porte de ville" }, { "TownDoor", "Porte de ville" },
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
{ "US South Central", "Centre-Sud des États-Unis" }, { "US South Central", "Centre-Sud des États-Unis" },
{ "US West", "Ouest des États-Unis" }, { "US West", "Ouest des États-Unis" },
{ "Unlimited Stamina", "Endurance illimitée" }, { "Unlimited Stamina", "Endurance illimitée" },
{ "Unlimited UV Light", "UV illimitée" }, { "Unlimited UV Light", "UV illimité" },
{ "Unlock Achievements", "Débloquer succès" }, { "Unlock Achievements", "Débloquer succès" },
{ "Unlock Doors", "Déverrouiller portes" }, { "Unlock Doors", "Déverrouiller portes" },
{ "God Mode", "Mode Dieu" },
{ "Visuals", "Visuels" }, { "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" }, { "Walk In Lobby", "Marcher dans le lobby" },
{ "Zara", "Zara" }, { "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" },
}; };
} }
} }

View File

@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
{ "Ping", "Ping" }, { "Ping", "Ping" },
{ "Play Random Sound", "Zufälligen Sound abspielen" }, { "Play Random Sound", "Zufälligen Sound abspielen" },
{ "Player", "Spieler" }, { "Player", "Spieler" },
{ "Instant Interaction", "Sofortige Interaktion" },
{ "Player Count", "Spieleranzahl" }, { "Player Count", "Spieleranzahl" },
{ "Player ESP", "Spieler ESP" }, { "Player ESP", "Spieler ESP" },
{ "Player ESP Color", "Spieler ESP Farbe" }, { "Player ESP Color", "Spieler ESP Farbe" },
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
{ "Rat ESP", "Ratte-ESP" }, { "Rat ESP", "Ratte-ESP" },
{ "Region", "Region" }, { "Region", "Region" },
{ "Revive", "Wiederbeleben" }, { "Revive", "Wiederbeleben" },
{ "Radial Menu", "Radiales Menü" },
{ "Ritual Book", "Ritualbuch" }, { "Ritual Book", "Ritualbuch" },
{ "Rose", "Rose" }, { "Rose", "Rose" },
{ "Ritual Book ESP", "Ritualbuch-ESP" }, { "Ritual Book ESP", "Ritualbuch-ESP" },
{ "Ritual Object ESP", "Ritualobjekt ESP" }, { "Ritual Object ESP", "Ritualobjekt ESP" },
{ "Ritual Objects", "Rituelle Objekte" }, { "Ritual Objects", "Rituelle Objekte" },
{ "RitualBook", "Ritualbuch" }, { "RitualBook", "Ritualbuch" },
{ "Roar ESP", "Brüllen-ESP" }, { "Boar ESP", "Wildschwein-ESP" },
{ "Role", "Rolle" }, { "Role", "Rolle" },
{ "RottenFood", "Verdorbenes Essen" }, { "RottenFood", "Verdorbenes Essen" },
{ "Rotton Food ESP", "Verdorbenes-Essen-ESP" }, { "Rotten Food ESP", "Verrottetes Essen ESP" },
{ "Sam", "Sam" }, { "Sam", "Sam" },
{ "Shoot Player", "Spieler erschießen" }, { "Shoot Player", "Spieler erschießen" },
{ "Show Coordinates", "Koordinaten anzeigen" },
{ "Skeleton ESP", "Skelett ESP" }, { "Skeleton ESP", "Skelett ESP" },
{ "Slaughterhouse", "Schlachthaus" }, { "Slaughterhouse", "Schlachthaus" },
{ "SlaughterhouseFireEscapeDoor", "Schlachthof-Feuerschutztür" }, { "SlaughterhouseFireEscapeDoor", "Schlachthof-Feuerschutztür" },
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
{ "TV", "Fernseher" }, { "TV", "Fernseher" },
{ "Teleport Keys", "Schlüssel teleportieren" }, { "Teleport Keys", "Schlüssel teleportieren" },
{ "Teleport to", "Teleportieren" }, { "Teleport to", "Teleportieren" },
{ "TP Base", "TP Basis" },
{ "TP Altar", "TP Altar" },
{ "TP Basin", "TP Becken" },
{ "TP Fountain", "TP Brunnen" },
{ "Ticket", "Ticket" }, { "Ticket", "Ticket" },
{ "Town", "Stadt" }, { "Town", "Stadt" },
{ "TownDoor", "Stadttür" }, { "TownDoor", "Stadttür" },
@@ -264,14 +271,26 @@ namespace DevourClient.Localization.Translations
{ "US East", "USA Ost" }, { "US East", "USA Ost" },
{ "US South Central", "USA Süd-Zentral" }, { "US South Central", "USA Süd-Zentral" },
{ "US West", "USA West" }, { "US West", "USA West" },
{ "Unlimited Stamina", "Unbegrenzte Ausdauer" }, { "Unlimited Stamina", "Unendliche Ausdauer" },
{ "Unlimited UV Light", "Unbegrenzte UV" }, { "Unlimited UV Light", "Unendliches UV-Licht" },
{ "Unlock Achievements", "Erfolge freischalten" }, { "Unlock Achievements", "Erfolge freischalten" },
{ "Unlock Doors", "Türen öffnen" }, { "Unlock Doors", "Türen öffnen" },
{ "God Mode", "Gottmodus" },
{ "Visuals", "Visuals" }, { "Visuals", "Visuals" },
{ "Waiting for the game to start", "Warte auf Spielstart" }, { "Waiting for the game to start", "Warte auf Spielstart" },
{ "Walk In Lobby", "Im Lobby laufen" }, { "Walk In Lobby", "Im Lobby laufen" },
{ "Zara", "Zara" }, { "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" },
}; };
} }
} }

View File

@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
{ "Ping", "Ping" }, { "Ping", "Ping" },
{ "Play Random Sound", "Riproduci suono casuale" }, { "Play Random Sound", "Riproduci suono casuale" },
{ "Player", "Giocatore" }, { "Player", "Giocatore" },
{ "Instant Interaction", "Interazione istantanea" },
{ "Player Count", "Numero di giocatori" }, { "Player Count", "Numero di giocatori" },
{ "Player ESP", "ESP giocatore" }, { "Player ESP", "ESP giocatore" },
{ "Player ESP Color", "Colore ESP giocatore" }, { "Player ESP Color", "Colore ESP giocatore" },
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
{ "Rat ESP", "ESP ratto" }, { "Rat ESP", "ESP ratto" },
{ "Region", "Regione" }, { "Region", "Regione" },
{ "Revive", "Rianima" }, { "Revive", "Rianima" },
{ "Radial Menu", "Menu radiale" },
{ "Ritual Book", "Libro rituale" }, { "Ritual Book", "Libro rituale" },
{ "Rose", "Rosa" }, { "Rose", "Rosa" },
{ "Ritual Book ESP", "ESP libro rituale" }, { "Ritual Book ESP", "ESP libro rituale" },
{ "Ritual Object ESP", "ESP oggetto rituale" }, { "Ritual Object ESP", "ESP oggetto rituale" },
{ "Ritual Objects", "Oggetti rituali" }, { "Ritual Objects", "Oggetti rituali" },
{ "RitualBook", "Libro rituale" }, { "RitualBook", "Libro rituale" },
{ "Roar ESP", "ESP ruggito" }, { "Boar ESP", "ESP Cinghiale" },
{ "Role", "Ruolo" }, { "Role", "Ruolo" },
{ "RottenFood", "Cibo marcio" }, { "RottenFood", "Cibo marcio" },
{ "Rotton Food ESP", "ESP cibo marcio" }, { "Rotten Food ESP", "ESP Cibo Avariato" },
{ "Sam", "Sam" }, { "Sam", "Sam" },
{ "Shoot Player", "Spara al giocatore" }, { "Shoot Player", "Spara al giocatore" },
{ "Show Coordinates", "Mostra coordinate" },
{ "Skeleton ESP", "ESP scheletro" }, { "Skeleton ESP", "ESP scheletro" },
{ "Slaughterhouse", "Macello" }, { "Slaughterhouse", "Macello" },
{ "SlaughterhouseFireEscapeDoor", "Porta antincendio del mattatoio" }, { "SlaughterhouseFireEscapeDoor", "Porta antincendio del mattatoio" },
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
{ "TV", "Televisione" }, { "TV", "Televisione" },
{ "Teleport Keys", "Teletrasporta chiavi" }, { "Teleport Keys", "Teletrasporta chiavi" },
{ "Teleport to", "Teletrasporta" }, { "Teleport to", "Teletrasporta" },
{ "TP Base", "TP Base" },
{ "TP Altar", "TP Altare" },
{ "TP Basin", "TP Bacino" },
{ "TP Fountain", "TP Fontana" },
{ "Ticket", "Biglietto" }, { "Ticket", "Biglietto" },
{ "Town", "Città" }, { "Town", "Città" },
{ "TownDoor", "Porta della città" }, { "TownDoor", "Porta della città" },
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
{ "US South Central", "Centro-Sud USA" }, { "US South Central", "Centro-Sud USA" },
{ "US West", "Ovest USA" }, { "US West", "Ovest USA" },
{ "Unlimited Stamina", "Resistenza illimitata" }, { "Unlimited Stamina", "Resistenza illimitata" },
{ "Unlimited UV Light", "UV illimitata" }, { "Unlimited UV Light", "UV illimitato" },
{ "Unlock Achievements", "Sblocca obiettivi" }, { "Unlock Achievements", "Sblocca obiettivi" },
{ "Unlock Doors", "Sblocca porte" }, { "Unlock Doors", "Sblocca porte" },
{ "Visuals", "Visivi" }, { "God Mode", "Modalità Dio" },
{ "Waiting for the game to start", "In attesa dell'inizio del gioco" }, { "Visuals", "Visuali" },
{ "Walk In Lobby", "Camminare in lobby" }, { "Waiting for the game to start", "In attesa dell'inizio della partita" },
{ "Walk In Lobby", "Cammina nel lobby" },
{ "Zara", "Zara" }, { "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" },
}; };
} }
} }

View File

@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
{ "Ping", "Ping" }, { "Ping", "Ping" },
{ "Play Random Sound", "ランダム音再生" }, { "Play Random Sound", "ランダム音再生" },
{ "Player", "プレイヤー" }, { "Player", "プレイヤー" },
{ "Instant Interaction", "即時インタラクション" },
{ "Player Count", "プレイヤー数" }, { "Player Count", "プレイヤー数" },
{ "Player ESP", "プレイヤーESP" }, { "Player ESP", "プレイヤーESP" },
{ "Player ESP Color", "プレイヤーESP色" }, { "Player ESP Color", "プレイヤーESP色" },
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
{ "Rat ESP", "ネズミESP" }, { "Rat ESP", "ネズミESP" },
{ "Region", "地域" }, { "Region", "地域" },
{ "Revive", "蘇生" }, { "Revive", "蘇生" },
{ "Radial Menu", "ラジアルメニュー" },
{ "Ritual Book", "儀式の本" }, { "Ritual Book", "儀式の本" },
{ "Rose", "バラ" }, { "Rose", "バラ" },
{ "Ritual Book ESP", "儀式の本ESP" }, { "Ritual Book ESP", "儀式の本ESP" },
{ "Ritual Object ESP", "儀式オブジェクトESP" }, { "Ritual Object ESP", "儀式オブジェクトESP" },
{ "Ritual Objects", "儀式の品" }, { "Ritual Objects", "儀式の品" },
{ "RitualBook", "儀式の本" }, { "RitualBook", "儀式の本" },
{ "Roar ESP", "咆哮ESP" }, { "Boar ESP", "イノシシESP" },
{ "Role", "役割" }, { "Role", "役割" },
{ "RottenFood", "腐った食べ物" }, { "RottenFood", "腐った食べ物" },
{ "Rotton Food ESP", "腐った食べ物ESP" }, { "Rotten Food ESP", "腐った食べ物ESP" },
{ "Sam", "サム" }, { "Sam", "サム" },
{ "Shoot Player", "プレイヤーを撃つ" }, { "Shoot Player", "プレイヤーを撃つ" },
{ "Show Coordinates", "座標を表示" },
{ "Skeleton ESP", "スケルトンESP" }, { "Skeleton ESP", "スケルトンESP" },
{ "Slaughterhouse", "屠殺場" }, { "Slaughterhouse", "屠殺場" },
{ "SlaughterhouseFireEscapeDoor", "屠殺場の非常口" }, { "SlaughterhouseFireEscapeDoor", "屠殺場の非常口" },
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
{ "TV", "テレビ" }, { "TV", "テレビ" },
{ "Teleport Keys", "鍵をテレポート" }, { "Teleport Keys", "鍵をテレポート" },
{ "Teleport to", "テレポート" }, { "Teleport to", "テレポート" },
{ "TP Base", "ベースTP" },
{ "TP Altar", "祭壇TP" },
{ "TP Basin", "水盤TP" },
{ "TP Fountain", "噴水TP" },
{ "Ticket", "チケット" }, { "Ticket", "チケット" },
{ "Town", "町" }, { "Town", "町" },
{ "TownDoor", "町のドア" }, { "TownDoor", "町のドア" },
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
{ "US South Central", "米国中南部" }, { "US South Central", "米国中南部" },
{ "US West", "米国西部" }, { "US West", "米国西部" },
{ "Unlimited Stamina", "無限スタミナ" }, { "Unlimited Stamina", "無限スタミナ" },
{ "Unlimited UV Light", "無限UV" }, { "Unlimited UV Light", "無限UV" },
{ "Unlock Achievements", "実績解除" }, { "Unlock Achievements", "実績解除" },
{ "Unlock Doors", "ドアを開ける" }, { "Unlock Doors", "ドアの解除" },
{ "God Mode", "神モード" },
{ "Visuals", "ビジュアル" }, { "Visuals", "ビジュアル" },
{ "Waiting for the game to start", "ゲーム開始を待っています" }, { "Waiting for the game to start", "ゲーム開始を待っています" },
{ "Walk In Lobby", "ロビーで歩く" }, { "Walk In Lobby", "ロビーで歩く" },
{ "Zara", "ザラ" }, { "Zara", "ザラ" },
{ "Bridesmaid 1", "ブライズメイド 1" },
{ "Bridesmaid 2", "ブライズメイド 2" },
{ "Butler", "執事" },
{ "Cook", "料理人" },
{ "Gardener", "庭師" },
{ "Groomsman 1", "グルームズマン 1" },
{ "Groomsman 2", "グルームズマン 2" },
{ "Maid", "メイド" },
{ "Photographer", "写真家" },
{ "Priest", "司祭" },
{ "Menu Key", "メニューキー" },
}; };
} }
} }

View File

@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
{ "Ping", "핑" }, { "Ping", "핑" },
{ "Play Random Sound", "랜덤 사운드 재생" }, { "Play Random Sound", "랜덤 사운드 재생" },
{ "Player", "플레이어" }, { "Player", "플레이어" },
{ "Instant Interaction", "즉시 상호작용" },
{ "Player Count", "플레이어 수" }, { "Player Count", "플레이어 수" },
{ "Player ESP", "플레이어 ESP" }, { "Player ESP", "플레이어 ESP" },
{ "Player ESP Color", "플레이어 ESP 색상" }, { "Player ESP Color", "플레이어 ESP 색상" },
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
{ "Rat ESP", "쥐 ESP" }, { "Rat ESP", "쥐 ESP" },
{ "Region", "지역" }, { "Region", "지역" },
{ "Revive", "부활" }, { "Revive", "부활" },
{ "Radial Menu", "방사형 메뉴" },
{ "Ritual Book", "의식서" }, { "Ritual Book", "의식서" },
{ "Rose", "장미" }, { "Rose", "장미" },
{ "Ritual Book ESP", "의식서 ESP" }, { "Ritual Book ESP", "의식서 ESP" },
{ "Ritual Object ESP", "의식 물체 ESP" }, { "Ritual Object ESP", "의식 물체 ESP" },
{ "Ritual Objects", "의식 물품" }, { "Ritual Objects", "의식 물품" },
{ "RitualBook", "의식서" }, { "RitualBook", "의식서" },
{ "Roar ESP", "으르렁 ESP" }, { "Boar ESP", "멧돼지 ESP" },
{ "Role", "역할" }, { "Role", "역할" },
{ "RottenFood", "썩은 음식" }, { "RottenFood", "썩은 음식" },
{ "Rotton Food ESP", "썩은 음식 ESP" }, { "Rotten Food ESP", "썩은 음식 ESP" },
{ "Sam", "샘" }, { "Sam", "샘" },
{ "Shoot Player", "플레이어 쏘기" }, { "Shoot Player", "플레이어 쏘기" },
{ "Show Coordinates", "좌표 표시" },
{ "Skeleton ESP", "스켈레톤 ESP" }, { "Skeleton ESP", "스켈레톤 ESP" },
{ "Slaughterhouse", "도살장" }, { "Slaughterhouse", "도살장" },
{ "SlaughterhouseFireEscapeDoor", "도축장 비상구" }, { "SlaughterhouseFireEscapeDoor", "도축장 비상구" },
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
{ "TV", "TV" }, { "TV", "TV" },
{ "Teleport Keys", "열쇠 텔레포트" }, { "Teleport Keys", "열쇠 텔레포트" },
{ "Teleport to", "텔레포트" }, { "Teleport to", "텔레포트" },
{ "TP Base", "기지 TP" },
{ "TP Altar", "제단 TP" },
{ "TP Basin", "대야 TP" },
{ "TP Fountain", "분수 TP" },
{ "Ticket", "티켓" }, { "Ticket", "티켓" },
{ "Town", "마을" }, { "Town", "마을" },
{ "TownDoor", "마을 문" }, { "TownDoor", "마을 문" },
@@ -268,10 +275,22 @@ namespace DevourClient.Localization.Translations
{ "Unlimited UV Light", "무제한 UV" }, { "Unlimited UV Light", "무제한 UV" },
{ "Unlock Achievements", "업적 잠금 해제" }, { "Unlock Achievements", "업적 잠금 해제" },
{ "Unlock Doors", "문 잠금 해제" }, { "Unlock Doors", "문 잠금 해제" },
{ "God Mode", "신 모드" },
{ "Visuals", "비주얼" }, { "Visuals", "비주얼" },
{ "Waiting for the game to start", "게임 시작 대기 중" }, { "Waiting for the game to start", "게임 시작 대기 중" },
{ "Walk In Lobby", "로비에서 걷기" }, { "Walk In Lobby", "로비에서 걷기" },
{ "Zara", "자라" }, { "Zara", "자라" },
{ "Bridesmaid 1", "신부 들러리 1" },
{ "Bridesmaid 2", "신부 들러리 2" },
{ "Butler", "집사" },
{ "Cook", "요리사" },
{ "Gardener", "정원사" },
{ "Groomsman 1", "신랑 들러리 1" },
{ "Groomsman 2", "신랑 들러리 2" },
{ "Maid", "하녀" },
{ "Photographer", "사진가" },
{ "Priest", "사제" },
{ "Menu Key", "메뉴 키" },
}; };
} }
} }

View File

@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
{ "Ping", "Ping" }, { "Ping", "Ping" },
{ "Play Random Sound", "Reproduzir som aleatório" }, { "Play Random Sound", "Reproduzir som aleatório" },
{ "Player", "Jogador" }, { "Player", "Jogador" },
{ "Instant Interaction", "Interação instantânea" },
{ "Player Count", "Número de jogadores" }, { "Player Count", "Número de jogadores" },
{ "Player ESP", "ESP jogador" }, { "Player ESP", "ESP jogador" },
{ "Player ESP Color", "Cor ESP jogador" }, { "Player ESP Color", "Cor ESP jogador" },
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
{ "Rat ESP", "ESP rato" }, { "Rat ESP", "ESP rato" },
{ "Region", "Região" }, { "Region", "Região" },
{ "Revive", "Reviver" }, { "Revive", "Reviver" },
{ "Radial Menu", "Menu radial" },
{ "Ritual Book", "Livro ritual" }, { "Ritual Book", "Livro ritual" },
{ "Rose", "Rosa" }, { "Rose", "Rosa" },
{ "Ritual Book ESP", "ESP livro ritual" }, { "Ritual Book ESP", "ESP livro ritual" },
{ "Ritual Object ESP", "ESP objeto ritual" }, { "Ritual Object ESP", "ESP objeto ritual" },
{ "Ritual Objects", "Objetos rituais" }, { "Ritual Objects", "Objetos rituais" },
{ "RitualBook", "Livro ritual" }, { "RitualBook", "Livro ritual" },
{ "Roar ESP", "ESP rugido" }, { "Boar ESP", "ESP Javali" },
{ "Role", "Função" }, { "Role", "Função" },
{ "RottenFood", "Comida podre" }, { "RottenFood", "Comida podre" },
{ "Rotton Food ESP", "ESP comida podre" }, { "Rotten Food ESP", "ESP comida podre" },
{ "Sam", "Sam" }, { "Sam", "Sam" },
{ "Shoot Player", "Atirar no jogador" }, { "Shoot Player", "Atirar no jogador" },
{ "Show Coordinates", "Mostrar coordenadas" },
{ "Skeleton ESP", "ESP esqueleto" }, { "Skeleton ESP", "ESP esqueleto" },
{ "Slaughterhouse", "Matadouro" }, { "Slaughterhouse", "Matadouro" },
{ "SlaughterhouseFireEscapeDoor", "Porta de incêndio do matadouro" }, { "SlaughterhouseFireEscapeDoor", "Porta de incêndio do matadouro" },
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
{ "TV", "Televisão" }, { "TV", "Televisão" },
{ "Teleport Keys", "Teletransportar chaves" }, { "Teleport Keys", "Teletransportar chaves" },
{ "Teleport to", "Teletransportar" }, { "Teleport to", "Teletransportar" },
{ "TP Base", "TP base" },
{ "TP Altar", "TP altar" },
{ "TP Basin", "TP bacia" },
{ "TP Fountain", "TP fonte" },
{ "Ticket", "Bilhete" }, { "Ticket", "Bilhete" },
{ "Town", "Cidade" }, { "Town", "Cidade" },
{ "TownDoor", "Porta da cidade" }, { "TownDoor", "Porta da cidade" },
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
{ "US South Central", "Centro-Sul dos EUA" }, { "US South Central", "Centro-Sul dos EUA" },
{ "US West", "Oeste dos EUA" }, { "US West", "Oeste dos EUA" },
{ "Unlimited Stamina", "Resistência ilimitada" }, { "Unlimited Stamina", "Resistência ilimitada" },
{ "Unlimited UV Light", "UV ilimitada" }, { "Unlimited UV Light", "UV ilimitado" },
{ "Unlock Achievements", "Desbloquear conquistas" }, { "Unlock Achievements", "Desbloquear conquistas" },
{ "Unlock Doors", "Desbloquear portas" }, { "Unlock Doors", "Desbloquear portas" },
{ "God Mode", "Modo Deus" },
{ "Visuals", "Visuais" }, { "Visuals", "Visuais" },
{ "Waiting for the game to start", "Aguardando início do jogo" }, { "Waiting for the game to start", "Aguardando início do jogo" },
{ "Walk In Lobby", "Andar no lobby" }, { "Walk In Lobby", "Andar no lobby" },
{ "Zara", "Zara" }, { "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" },
}; };
} }
} }

View File

@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
{ "Ping", "Пинг" }, { "Ping", "Пинг" },
{ "Play Random Sound", "Воспроизвести случайный звук" }, { "Play Random Sound", "Воспроизвести случайный звук" },
{ "Player", "Игрок" }, { "Player", "Игрок" },
{ "Instant Interaction", "Мгновенное взаимодействие" },
{ "Player Count", "Количество игроков" }, { "Player Count", "Количество игроков" },
{ "Player ESP", "ESP игрока" }, { "Player ESP", "ESP игрока" },
{ "Player ESP Color", "Цвет ESP игрока" }, { "Player ESP Color", "Цвет ESP игрока" },
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
{ "Rat ESP", "ESP крысы" }, { "Rat ESP", "ESP крысы" },
{ "Region", "Регион" }, { "Region", "Регион" },
{ "Revive", "Воскресить" }, { "Revive", "Воскресить" },
{ "Radial Menu", "Радиальное меню" },
{ "Ritual Book", "Ритуальная книга" }, { "Ritual Book", "Ритуальная книга" },
{ "Rose", "Роза" }, { "Rose", "Роза" },
{ "Ritual Book ESP", "ESP ритуальной книги" }, { "Ritual Book ESP", "ESP ритуальной книги" },
{ "Ritual Object ESP", "ESP ритуального предмета" }, { "Ritual Object ESP", "ESP ритуального предмета" },
{ "Ritual Objects", "Ритуальные предметы" }, { "Ritual Objects", "Ритуальные предметы" },
{ "RitualBook", "Ритуальная книга" }, { "RitualBook", "Ритуальная книга" },
{ "Roar ESP", "ESP рёва" }, { "Boar ESP", "ESP Кабана" },
{ "Role", "Роль" }, { "Role", "Роль" },
{ "RottenFood", "Гнилая еда" }, { "RottenFood", "Гнилая еда" },
{ "Rotton Food ESP", "ESP гнилой еды" }, { "Rotten Food ESP", "ESP Гнилая Еда" },
{ "Sam", "Сэм" }, { "Sam", "Сэм" },
{ "Shoot Player", "Стрелять в игрока" }, { "Shoot Player", "Стрелять в игрока" },
{ "Show Coordinates", "Показать координаты" },
{ "Skeleton ESP", "ESP скелета" }, { "Skeleton ESP", "ESP скелета" },
{ "Slaughterhouse", "Бойня" }, { "Slaughterhouse", "Бойня" },
{ "SlaughterhouseFireEscapeDoor", "Пожарная дверь бойни" }, { "SlaughterhouseFireEscapeDoor", "Пожарная дверь бойни" },
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
{ "TV", "Телевизор" }, { "TV", "Телевизор" },
{ "Teleport Keys", "Телепорт ключей" }, { "Teleport Keys", "Телепорт ключей" },
{ "Teleport to", "Телепорт" }, { "Teleport to", "Телепорт" },
{ "TP Base", "ТП база" },
{ "TP Altar", "ТП алтарь" },
{ "TP Basin", "ТП чаша" },
{ "TP Fountain", "ТП фонтан" },
{ "Ticket", "Билет" }, { "Ticket", "Билет" },
{ "Town", "Город" }, { "Town", "Город" },
{ "TownDoor", "Дверь города" }, { "TownDoor", "Дверь города" },
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
{ "US South Central", "Юго-Центральная часть США" }, { "US South Central", "Юго-Центральная часть США" },
{ "US West", "Запад США" }, { "US West", "Запад США" },
{ "Unlimited Stamina", "Безлимитная выносливость" }, { "Unlimited Stamina", "Безлимитная выносливость" },
{ "Unlimited UV Light", "Безлимитный УФ" }, { "Unlimited UV Light", "Неограниченный УФ" },
{ "Unlock Achievements", "Разблокировать достижения" }, { "Unlock Achievements", "Разблокировать достижения" },
{ "Unlock Doors", "Открыть двери" }, { "Unlock Doors", "Открыть двери" },
{ "Visuals", "Визуалы" }, { "God Mode", "Режим Бога" },
{ "Visuals", "Визуализация" },
{ "Waiting for the game to start", "Ожидание начала игры" }, { "Waiting for the game to start", "Ожидание начала игры" },
{ "Walk In Lobby", "Ходить в лобби" }, { "Walk In Lobby", "Ходить в лобби" },
{ "Zara", "Зара" }, { "Zara", "Зара" },
{ "Bridesmaid 1", "Подружка невесты 1" },
{ "Bridesmaid 2", "Подружка невесты 2" },
{ "Butler", "Дворецкий" },
{ "Cook", "Повар" },
{ "Gardener", "Садовник" },
{ "Groomsman 1", "Шафер 1" },
{ "Groomsman 2", "Шафер 2" },
{ "Maid", "Горничная" },
{ "Photographer", "Фотограф" },
{ "Priest", "Священник" },
{ "Menu Key", "Клавиша меню" },
}; };
} }
} }

View File

@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
{ "Ping", "Ping" }, { "Ping", "Ping" },
{ "Play Random Sound", "Reproducir sonido aleatorio" }, { "Play Random Sound", "Reproducir sonido aleatorio" },
{ "Player", "Jugador" }, { "Player", "Jugador" },
{ "Instant Interaction", "Interacción instantánea" },
{ "Player Count", "Número de jugadores" }, { "Player Count", "Número de jugadores" },
{ "Player ESP", "ESP jugador" }, { "Player ESP", "ESP jugador" },
{ "Player ESP Color", "Color ESP jugador" }, { "Player ESP Color", "Color ESP jugador" },
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
{ "Rat ESP", "ESP rata" }, { "Rat ESP", "ESP rata" },
{ "Region", "Región" }, { "Region", "Región" },
{ "Revive", "Revivir" }, { "Revive", "Revivir" },
{ "Radial Menu", "Menú radial" },
{ "Ritual Book", "Libro ritual" }, { "Ritual Book", "Libro ritual" },
{ "Rose", "Rosa" }, { "Rose", "Rosa" },
{ "Ritual Book ESP", "ESP libro ritual" }, { "Ritual Book ESP", "ESP libro ritual" },
{ "Ritual Object ESP", "ESP objeto ritual" }, { "Ritual Object ESP", "ESP objeto ritual" },
{ "Ritual Objects", "Objetos rituales" }, { "Ritual Objects", "Objetos rituales" },
{ "RitualBook", "Libro ritual" }, { "RitualBook", "Libro ritual" },
{ "Roar ESP", "ESP rugido" }, { "Boar ESP", "ESP Jabalí" },
{ "Role", "Rol" }, { "Role", "Rol" },
{ "RottenFood", "Comida podrida" }, { "RottenFood", "Comida podrida" },
{ "Rotton Food ESP", "ESP comida podrida" }, { "Rotten Food ESP", "ESP Comida Podrida" },
{ "Sam", "Sam" }, { "Sam", "Sam" },
{ "Shoot Player", "Disparar al jugador" }, { "Shoot Player", "Disparar al jugador" },
{ "Show Coordinates", "Mostrar coordenadas" },
{ "Skeleton ESP", "ESP esqueleto" }, { "Skeleton ESP", "ESP esqueleto" },
{ "Slaughterhouse", "Matadero" }, { "Slaughterhouse", "Matadero" },
{ "SlaughterhouseFireEscapeDoor", "Puerta de escape de matadero" }, { "SlaughterhouseFireEscapeDoor", "Puerta de escape de matadero" },
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
{ "TV", "Televisión" }, { "TV", "Televisión" },
{ "Teleport Keys", "Teletransportar llaves" }, { "Teleport Keys", "Teletransportar llaves" },
{ "Teleport to", "Teletransportar" }, { "Teleport to", "Teletransportar" },
{ "TP Base", "TP base" },
{ "TP Altar", "TP altar" },
{ "TP Basin", "TP pila" },
{ "TP Fountain", "TP fuente" },
{ "Ticket", "Boleto" }, { "Ticket", "Boleto" },
{ "Town", "Pueblo" }, { "Town", "Pueblo" },
{ "TownDoor", "Puerta de pueblo" }, { "TownDoor", "Puerta de pueblo" },
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
{ "US South Central", "Centro-Sur de EE.UU." }, { "US South Central", "Centro-Sur de EE.UU." },
{ "US West", "Oeste de EE.UU." }, { "US West", "Oeste de EE.UU." },
{ "Unlimited Stamina", "Resistencia ilimitada" }, { "Unlimited Stamina", "Resistencia ilimitada" },
{ "Unlimited UV Light", "UV ilimitada" }, { "Unlimited UV Light", "UV ilimitado" },
{ "Unlock Achievements", "Desbloquear logros" }, { "Unlock Achievements", "Desbloquear logros" },
{ "Unlock Doors", "Desbloquear puertas" }, { "Unlock Doors", "Desbloquear puertas" },
{ "God Mode", "Modo Dios" },
{ "Visuals", "Visuales" }, { "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" }, { "Walk In Lobby", "Caminar en lobby" },
{ "Zara", "Zara" }, { "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ú" },
}; };
} }
} }

View File

@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
{ "Ping", "Ping" }, { "Ping", "Ping" },
{ "Play Random Sound", "Phát âm thanh ngẫu nhiên" }, { "Play Random Sound", "Phát âm thanh ngẫu nhiên" },
{ "Player", "Người chơi" }, { "Player", "Người chơi" },
{ "Instant Interaction", "Tương tác tức thì" },
{ "Player Count", "Số người chơi" }, { "Player Count", "Số người chơi" },
{ "Player ESP", "Người chơi ESP" }, { "Player ESP", "Người chơi ESP" },
{ "Player ESP Color", "Màu người chơi ESP" }, { "Player ESP Color", "Màu người chơi ESP" },
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
{ "Rat ESP", "Chuột ESP" }, { "Rat ESP", "Chuột ESP" },
{ "Region", "Khu vực" }, { "Region", "Khu vực" },
{ "Revive", "Hồi sinh" }, { "Revive", "Hồi sinh" },
{ "Radial Menu", "Menu vòng tròn" },
{ "Ritual Book", "Sách nghi lễ" }, { "Ritual Book", "Sách nghi lễ" },
{ "Rose", "Hoa hồng" }, { "Rose", "Hoa hồng" },
{ "Ritual Book ESP", "Sách nghi lễ ESP" }, { "Ritual Book ESP", "Sách nghi lễ ESP" },
{ "Ritual Object ESP", "Vật phẩm nghi lễ ESP" }, { "Ritual Object ESP", "Vật phẩm nghi lễ ESP" },
{ "Ritual Objects", "Vật phẩm nghi lễ" }, { "Ritual Objects", "Vật phẩm nghi lễ" },
{ "RitualBook", "RitualBook" }, { "RitualBook", "RitualBook" },
{ "Roar ESP", "Tiếng gầm ESP" }, { "Boar ESP", "Lợn rừng ESP" },
{ "Role", "Vai trò" }, { "Role", "Vai trò" },
{ "RottenFood", "RottenFood" }, { "RottenFood", "RottenFood" },
{ "Rotton Food ESP", "Thức ăn thối ESP" }, { "Rotten Food ESP", "Thức ăn thối ESP" },
{ "Sam", "Sam" }, { "Sam", "Sam" },
{ "Shoot Player", "Bắn người chơi" }, { "Shoot Player", "Bắn người chơi" },
{ "Show Coordinates", "Hiển thị tọa độ" },
{ "Skeleton ESP", "Bộ xương ESP" }, { "Skeleton ESP", "Bộ xương ESP" },
{ "Slaughterhouse", "Slaughterhouse" }, { "Slaughterhouse", "Slaughterhouse" },
{ "SlaughterhouseFireEscapeDoor", "SlaughterhouseFireEscapeDoor" }, { "SlaughterhouseFireEscapeDoor", "SlaughterhouseFireEscapeDoor" },
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
{ "TV", "TV" }, { "TV", "TV" },
{ "Teleport Keys", "Phím dịch chuyển" }, { "Teleport Keys", "Phím dịch chuyển" },
{ "Teleport to", "Dịch chuyển đến" }, { "Teleport to", "Dịch chuyển đến" },
{ "TP Base", "TP căn cứ" },
{ "TP Altar", "TP bàn thờ" },
{ "TP Basin", "TP bể nước" },
{ "TP Fountain", "TP đài phun nước" },
{ "Ticket", "Vé" }, { "Ticket", "Vé" },
{ "Town", "Town" }, { "Town", "Town" },
{ "TownDoor", "TownDoor" }, { "TownDoor", "TownDoor" },
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
{ "US South Central", "US Nam Trung" }, { "US South Central", "US Nam Trung" },
{ "US West", "US Tây" }, { "US West", "US Tây" },
{ "Unlimited Stamina", "Thể lực vô hạn" }, { "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 Achievements", "Mở khóa thành tựu" },
{ "Unlock Doors", "Mở khóa cửa" }, { "Unlock Doors", "Mở khóa cửa" },
{ "God Mode", "Chế độ Thần" },
{ "Visuals", "Hình ảnh" }, { "Visuals", "Hình ảnh" },
{ "Waiting for the game to start", "Đang chờ game bắt đầu" }, { "Waiting for the game to start", "Đang chờ bắt đầu trò chơi" },
{ "Walk In Lobby", "Đi bộ trong phòng chờ" }, { "Walk In Lobby", "Đi trong sảnh" },
{ "Zara", "Zara" }, { "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" },
}; };
} }
} }

View File

@@ -1,4 +1,4 @@
/* /*
Note about license. As stated in the GPL FAQ : 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. 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, 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 UnityEngine;
using Il2CppInterop.Runtime.Injection; 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.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")] [assembly: MelonLoader.MelonInfo(typeof(DevourClient.Load), "DevourClient", "2", "ALittlePatate & Jadis0x")]
@@ -34,6 +36,25 @@ namespace DevourClient
public override void OnInitializeMelon() public override void OnInitializeMelon()
{ {
Init(); 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.");
}
} }
} }
} }

View File

@@ -8,17 +8,13 @@ using UnityEngine;
namespace DevourClient.Network namespace DevourClient.Network
{ {
/// <summary> // Lobby creation and management class
/// Lobby creation and management class
/// </summary>
public static class LobbyManager public static class LobbyManager
{ {
/// <summary> // Create game lobby/room.
/// Create game lobby/room // regionCode: Region code (e.g.: "eu", "us", "asia", "usw", "sa", "jp", "au", "ru", "in", "kr").
/// </summary> // lobbyLimit: Maximum player limit (1-64).
/// <param name="regionCode">Region code (e.g.: "eu", "us", "asia", "usw", "sa", "jp", "au", "ru", "in", "kr")</param> // isPrivate: Whether this is a private room.
/// <param name="lobbyLimit">Maximum player limit (1-64)</param>
/// <param name="isPrivate">Whether this is a private room</param>
public static void CreateLobby(string regionCode, int lobbyLimit, bool isPrivate) public static void CreateLobby(string regionCode, int lobbyLimit, bool isPrivate)
{ {
try try
@@ -32,7 +28,7 @@ namespace DevourClient.Network
} }
// Get PhotonRegion // Get PhotonRegion
PhotonRegion region = GetPhotonRegion(regionCode); PhotonRegion? region = GetPhotonRegion(regionCode);
if (region == null) if (region == null)
{ {
MelonLogger.Error($"[LobbyManager] Failed to find region: {regionCode}"); MelonLogger.Error($"[LobbyManager] Failed to find region: {regionCode}");
@@ -40,7 +36,7 @@ namespace DevourClient.Network
} }
// Find Menu controller // Find Menu controller
Il2CppHorror.Menu menu = FindMenuController(); Il2CppHorror.Menu? menu = FindMenuController();
if (menu == null) if (menu == null)
{ {
MelonLogger.Error("[LobbyManager] Failed to find MenuController"); MelonLogger.Error("[LobbyManager] Failed to find MenuController");
@@ -96,10 +92,7 @@ namespace DevourClient.Network
} }
} }
/// <summary> private static PhotonRegion? GetPhotonRegion(string regionCode)
/// Get PhotonRegion object for specified region
/// </summary>
private static PhotonRegion GetPhotonRegion(string regionCode)
{ {
try try
{ {
@@ -113,10 +106,7 @@ namespace DevourClient.Network
} }
} }
/// <summary> private static Il2CppHorror.Menu? FindMenuController()
/// Find Menu controller
/// </summary>
private static Il2CppHorror.Menu FindMenuController()
{ {
try try
{ {
@@ -142,9 +132,6 @@ namespace DevourClient.Network
} }
} }
/// <summary>
/// Check if in game
/// </summary>
private static bool IsInGame() private static bool IsInGame()
{ {
try try
@@ -159,9 +146,6 @@ namespace DevourClient.Network
} }
} }
/// <summary>
/// Force start lobby game (host only)
/// </summary>
public static void ForceLobbyStart() public static void ForceLobbyStart()
{ {
try try
@@ -172,7 +156,7 @@ namespace DevourClient.Network
return; return;
} }
Il2CppHorror.Menu menu = FindMenuController(); Il2CppHorror.Menu? menu = FindMenuController();
if (menu == null) if (menu == null)
{ {
MelonLogger.Error("[LobbyManager] Failed to find MenuController"); MelonLogger.Error("[LobbyManager] Failed to find MenuController");
@@ -189,14 +173,11 @@ namespace DevourClient.Network
} }
} }
/// <summary>
/// Show message box
/// </summary>
public static void ShowMessageBox(string message) public static void ShowMessageBox(string message)
{ {
try try
{ {
Il2CppHorror.Menu menu = FindMenuController(); Il2CppHorror.Menu? menu = FindMenuController();
if (menu != null) if (menu != null)
{ {
menu.ShowMessageModal(message); menu.ShowMessageModal(message);

View File

@@ -62,7 +62,7 @@ namespace DevourClient.Network
// Get display name by region code (multilanguage support) // Get display name by region code (multilanguage support)
public static string GetDisplayNameByCode(string code) 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 // Use MultiLanguageSystem to translate region names
return MultiLanguageSystem.Translate(englishName); return MultiLanguageSystem.Translate(englishName);

View File

@@ -0,0 +1,699 @@
using System;
using System.Collections.Generic;
using MelonLoader;
using UnityEngine;
using DevourClient.Helpers;
using DevourClient.Localization;
using System.Globalization;
namespace DevourClient
{
// Manages the Z-key radial menu: building options, drawing the UI, and executing actions.
// Public static methods are called from the appropriate ClientMain lifecycle hooks.
internal static class RadialMenuManager
{
private static bool _active;
private static int _selectedIndex = -1;
private static readonly List<RadialOption> _options = new List<RadialOption>();
private static bool _cursorStateStored;
private static bool _prevCursorVisible;
private static CursorLockMode _prevCursorLockState;
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;
// Public property to enable/disable the radial menu
public static bool Enabled
{
get => _enabled;
set => _enabled = value;
}
private enum RadialActionType
{
None,
SpawnItem,
TeleportBase,
TeleportFixedPoint
}
private class RadialOption
{
public string Label = string.Empty;
public RadialActionType ActionType = RadialActionType.None;
public string Payload = string.Empty;
}
// Called from Update: handles input, builds / closes the radial menu and executes actions.
public static void HandleUpdate()
{
if (!_enabled || !Player.IsInGameOrLobby())
return;
KeyCode key = Settings.Settings.radialMenuKey;
if (key != KeyCode.None && Input.GetKeyDown(key))
{
BuildForCurrentScene();
}
if (key != KeyCode.None && Input.GetKeyUp(key) && _active)
{
if (_selectedIndex >= 0 && _selectedIndex < _options.Count)
{
ExecuteOption(_options[_selectedIndex]);
}
_active = false;
_selectedIndex = -1;
_options.Clear();
RestoreCursorState();
}
}
// Called from OnGUI: draws the radial menu if it is active.
public static void HandleOnGUI()
{
if (!_enabled || !_active || !Player.IsInGameOrLobby())
return;
Draw();
}
private static void BuildForCurrentScene()
{
_options.Clear();
_selectedIndex = -1;
string sceneName = Helpers.Map.GetActiveScene();
if (string.IsNullOrEmpty(sceneName) || sceneName == "Menu")
{
_active = false;
return;
}
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("First aid"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalFirstAid"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("Battery"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalBattery"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("TP Base"),
ActionType = RadialActionType.TeleportBase,
Payload = string.Empty
});
switch (sceneName)
{
case "Devour":
case "Anna":
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("TP Altar"),
ActionType = RadialActionType.TeleportFixedPoint,
Payload = "8.57 0.01 -65.19"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("Hay"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalHay"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("Gasoline"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalGasoline"
});
break;
case "Molly":
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("TP Altar"),
ActionType = RadialActionType.TeleportFixedPoint,
Payload = "18.12 -8.80 21.06"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("Fuse"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalFuse"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("RottenFood"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalRottenFood"
});
break;
case "Inn":
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("TP Fountain"),
ActionType = RadialActionType.TeleportFixedPoint,
Payload = "-3.43 0.06 24.31"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("Bleach"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalBleach"
});
break;
case "Town":
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("TP Altar"),
ActionType = RadialActionType.TeleportFixedPoint,
Payload = "-56.88 7.17 -34.51"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("Matchbox"),
ActionType = RadialActionType.SpawnItem,
Payload = "Matchbox-3"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("Gasoline"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalGasoline"
});
break;
case "Slaughterhouse":
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("TP Altar"),
ActionType = RadialActionType.TeleportFixedPoint,
Payload = "26.68 4.01 -9.27"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("Bone"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalBone"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("Gasoline"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalGasoline"
});
break;
case "Manor":
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("TP Basin"),
ActionType = RadialActionType.TeleportFixedPoint,
Payload = "38.93 -4.62 -3.86"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("Bleach"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalBleach"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("Cake"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalCake"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("Spade"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalSpade"
});
break;
case "Carnival":
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("TP Altar"),
ActionType = RadialActionType.TeleportFixedPoint,
Payload = "-114.65 4.07 -4.12"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("Coin"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalCoin"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("MusicBox"),
ActionType = RadialActionType.SpawnItem,
Payload = "MusicBox-Idle"
});
_options.Add(new RadialOption
{
Label = MultiLanguageSystem.Translate("DollHead"),
ActionType = RadialActionType.SpawnItem,
Payload = "SurvivalDollHead"
});
break;
}
if (_options.Count == 0)
{
_active = false;
return;
}
_active = true;
HideCursorForRadial();
}
private static void Draw()
{
Event e = Event.current;
if (e == null)
return;
bool isRepaint = e.type == EventType.Repaint;
float centerX = Screen.width / 2f;
float centerY = Screen.height / 2f;
Vector2 center = new Vector2(centerX, centerY);
float radiusOuter = 140f;
float radiusInner = 40f;
Vector2 mouse = e.mousePosition;
Vector2 dir = mouse - center;
float dist = dir.magnitude;
_selectedIndex = -1;
if (dist >= radiusInner && dist <= radiusOuter && _options.Count > 0)
{
// Normalize angles: convert GUI coordinates (y down) to math coordinates (y up)
// and treat "up" as 0° increasing clockwise.
Vector2 upDir = new Vector2(dir.x, -dir.y);
float mathAngle = Mathf.Atan2(upDir.y, upDir.x); // [-PI, PI], 0 is on the right, counterclockwise is positive
float logicalAngle = (Mathf.PI / 2f) - mathAngle;
if (logicalAngle < 0f)
{
logicalAngle += Mathf.PI * 2f;
}
float logicalSectorAngle = (Mathf.PI * 2f) / _options.Count;
int index = Mathf.Clamp(Mathf.FloorToInt(logicalAngle / logicalSectorAngle), 0, _options.Count - 1);
_selectedIndex = index;
}
int count = _options.Count;
if (count == 0)
return;
if (isRepaint)
{
EnsureRadialMaterial();
DrawFilledCircle(center, radiusOuter + 6f, new Color(0f, 0f, 0f, 0.55f));
}
// Sector layout and label radius
float logicalAnglePerSector = (Mathf.PI * 2f) / count;
float radiusFactor;
if (count <= 6)
radiusFactor = 0.55f;
else if (count == 7)
radiusFactor = 0.48f;
else if (count <= 8)
radiusFactor = 0.5f;
else
radiusFactor = 0.45f;
float labelRadius = radiusInner + (radiusOuter - radiusInner) * radiusFactor;
if (isRepaint)
{
for (int i = 0; i < count; i++)
{
float logicalStart = logicalAnglePerSector * i;
float logicalEnd = logicalAnglePerSector * (i + 1);
float displayStart = (Mathf.PI / 2f) - logicalStart;
float displayEnd = (Mathf.PI / 2f) - logicalEnd;
Color sectorColor = (i == _selectedIndex)
? new Color(0.15f, 0.7f, 0.3f, 0.8f)
: new Color(0.1f, 0.1f, 0.1f, 0.7f);
DrawFilledSector(center, radiusInner, radiusOuter, displayStart, displayEnd, sectorColor);
}
}
GUIStyle labelStyle = new GUIStyle(GUI.skin.label)
{
alignment = TextAnchor.MiddleCenter,
normal = { textColor = Color.white },
fontSize = (count <= 6) ? 14 : (count <= 8 ? 12 : 10),
wordWrap = true
};
for (int i = 0; i < count; i++)
{
float logicalMid = logicalAnglePerSector * (i + 0.5f);
float displayMid = (Mathf.PI / 2f) - logicalMid;
float lx = centerX + Mathf.Cos(displayMid) * labelRadius;
float ly = centerY - Mathf.Sin(displayMid) * labelRadius;
float arcLength = logicalAnglePerSector * labelRadius;
float arcFactor;
float minWidth;
float maxWidth;
if (count <= 6)
{
arcFactor = 0.8f;
minWidth = 60f;
maxWidth = 120f;
}
else if (count == 7)
{
arcFactor = 0.6f;
minWidth = 45f;
maxWidth = 75f;
}
else if (count <= 8)
{
arcFactor = 0.65f;
minWidth = 45f;
maxWidth = 80f;
}
else
{
arcFactor = 0.55f;
minWidth = 40f;
maxWidth = 70f;
}
float baseWidth = arcLength * arcFactor;
float labelWidth = Mathf.Clamp(baseWidth, minWidth, maxWidth);
float labelHeight = 32f;
Rect labelRect = new Rect(lx - labelWidth / 2f, ly - labelHeight / 2f, labelWidth, labelHeight);
GUI.Label(labelRect, _options[i].Label, labelStyle);
}
}
private static void EnsureRadialMaterial()
{
if (_radialMaterial != null)
return;
Shader shader = Shader.Find("Hidden/Internal-Colored");
if (shader == null)
return;
_radialMaterial = new Material(shader)
{
hideFlags = HideFlags.HideAndDontSave
};
_radialMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
_radialMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
_radialMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off);
_radialMaterial.SetInt("_ZWrite", 0);
}
private static void DrawFilledCircle(Vector2 center, float radius, Color color)
{
if (_radialMaterial == null)
return;
_radialMaterial.SetPass(0);
GL.PushMatrix();
GL.LoadPixelMatrix(0, Screen.width, Screen.height, 0);
GL.Begin(GL.TRIANGLES);
GL.Color(color);
const int steps = 64;
for (int i = 0; i < steps; i++)
{
float t0 = (float)i / steps;
float t1 = (float)(i + 1) / steps;
float ang0 = t0 * Mathf.PI * 2f;
float ang1 = t1 * Mathf.PI * 2f;
float x0 = center.x + Mathf.Cos(ang0) * radius;
float y0 = center.y - Mathf.Sin(ang0) * radius;
float x1 = center.x + Mathf.Cos(ang1) * radius;
float y1 = center.y - Mathf.Sin(ang1) * radius;
GL.Vertex3(center.x, center.y, 0f);
GL.Vertex3(x0, y0, 0f);
GL.Vertex3(x1, y1, 0f);
}
GL.End();
GL.PopMatrix();
}
private static void DrawFilledSector(Vector2 center, float innerRadius, float outerRadius,
float startAngle, float endAngle, Color color)
{
if (_radialMaterial == null)
return;
_radialMaterial.SetPass(0);
GL.PushMatrix();
GL.LoadPixelMatrix(0, Screen.width, Screen.height, 0);
GL.Begin(GL.TRIANGLES);
GL.Color(color);
int steps = Mathf.Max(8, Mathf.CeilToInt(Mathf.Abs(endAngle - startAngle) / (Mathf.PI / 24f)));
float delta = (endAngle - startAngle) / steps;
for (int i = 0; i < steps; i++)
{
float a0 = startAngle + delta * i;
float a1 = startAngle + delta * (i + 1);
Vector2 o0 = new Vector2(
center.x + Mathf.Cos(a0) * outerRadius,
center.y - Mathf.Sin(a0) * outerRadius);
Vector2 o1 = new Vector2(
center.x + Mathf.Cos(a1) * outerRadius,
center.y - Mathf.Sin(a1) * outerRadius);
Vector2 i0 = new Vector2(
center.x + Mathf.Cos(a0) * innerRadius,
center.y - Mathf.Sin(a0) * innerRadius);
Vector2 i1 = new Vector2(
center.x + Mathf.Cos(a1) * innerRadius,
center.y - Mathf.Sin(a1) * innerRadius);
GL.Vertex3(o0.x, o0.y, 0f);
GL.Vertex3(o1.x, o1.y, 0f);
GL.Vertex3(i1.x, i1.y, 0f);
GL.Vertex3(o0.x, o0.y, 0f);
GL.Vertex3(i1.x, i1.y, 0f);
GL.Vertex3(i0.x, i0.y, 0f);
}
GL.End();
GL.PopMatrix();
}
private static void ExecuteOption(RadialOption option)
{
if (option == null || option.ActionType == RadialActionType.None)
return;
try
{
switch (option.ActionType)
{
case RadialActionType.SpawnItem:
if (string.IsNullOrEmpty(option.Payload))
return;
ClientMain_HandleItemCarry(option.Payload);
break;
case RadialActionType.TeleportBase:
TeleportToBase();
break;
case RadialActionType.TeleportFixedPoint:
TeleportToFixedPoint(option.Payload);
break;
}
}
catch (Exception ex)
{
MelonLogger.Error($"Radial option execution failed: {ex.Message}");
}
}
private static void HideCursorForRadial()
{
if (!_cursorStateStored)
{
_prevCursorVisible = Cursor.visible;
_prevCursorLockState = Cursor.lockState;
_cursorStateStored = true;
}
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
private static void RestoreCursorState()
{
if (!_cursorStateStored)
return;
Cursor.lockState = _prevCursorLockState;
Cursor.visible = _prevCursorVisible;
_cursorStateStored = false;
}
// Calls ClientMain.HandleItemCarry via reflection to avoid tight coupling,
// and falls back to Hacks.Misc.CarryObject if that fails.
private static void ClientMain_HandleItemCarry(string payload)
{
try
{
var type = typeof(ClientMain);
var method = type.GetMethod("HandleItemCarry",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
if (method != null)
{
method.Invoke(null, new object[] { payload });
return;
}
}
catch
{
// ignore and fallback
}
Hacks.Misc.CarryObject(payload);
}
// Teleports the player to a fixed world position.
// Payload format: "x y z" using '.' as decimal separator.
private static void TeleportToFixedPoint(string payload)
{
if (string.IsNullOrWhiteSpace(payload))
return;
try
{
string[] parts = payload.Split(new[] { ' ', '\t', ',' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length < 3)
return;
float x = float.Parse(parts[0], CultureInfo.InvariantCulture);
float y = float.Parse(parts[1], CultureInfo.InvariantCulture);
float z = float.Parse(parts[2], CultureInfo.InvariantCulture);
Il2Cpp.NolanBehaviour nb = Player.GetPlayer();
if (nb == null)
return;
Vector3 target = new Vector3(x, y, z);
nb.TeleportTo(target, Quaternion.identity);
}
catch (Exception ex)
{
MelonLogger.Error($"TeleportToFixedPoint failed: {ex.Message}");
}
}
// Teleports the player to the map-specific base coordinates (former RecallToBase logic).
private static void TeleportToBase()
{
try
{
Il2Cpp.NolanBehaviour nb = Player.GetPlayer();
if (nb == null)
{
MelonLogger.Warning("Player not found!");
return;
}
string sceneName = Helpers.Map.GetActiveScene();
Vector3 targetPos = Vector3.zero;
string mapName = "";
switch (sceneName)
{
case "Devour":
case "Anna": // Farmhouse
targetPos = new Vector3(5.03f, 4.20f, -50.02f);
mapName = "Farm";
break;
case "Molly": // Asylum
targetPos = new Vector3(17.52f, 1.38f, 7.04f);
mapName = "Asylum";
break;
case "Inn":
targetPos = new Vector3(3.53f, 0.84f, 2.47f);
mapName = "Inn";
break;
case "Town":
targetPos = new Vector3(-63.51f, 10.88f, -12.32f);
mapName = "Town";
break;
case "Slaughterhouse":
targetPos = new Vector3(6.09f, 0.70f, -17.58f);
mapName = "Slaughterhouse";
break;
case "Manor":
targetPos = new Vector3(3.67f, 1.32f, -23.34f);
mapName = "Manor";
break;
case "Carnival":
targetPos = new Vector3(-91.46f, 8.13f, -24.51f);
mapName = "Carnival";
break;
default:
MelonLogger.Warning($"Teleport not available for scene: {sceneName}");
return;
}
nb.locomotion.SetPosition(targetPos, false);
MelonLogger.Msg($"Teleported to {mapName} coordinates: X:{targetPos.x:F2} Y:{targetPos.y:F2} Z:{targetPos.z:F2}");
}
catch (Exception ex)
{
MelonLogger.Error($"Failed to teleport to base: {ex.Message}");
}
}
}
}

View File

@@ -14,7 +14,10 @@ namespace DevourClient.Settings
public static Color player_esp_color = new Color(0.00f, 1.00f, 0.00f, 1); 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 Color azazel_esp_color = new Color(1.00f, 0.00f, 0.00f, 1);
public static float speed = 1f; public static float speed = 1f;
public static KeyCode menuToggleKey = KeyCode.Insert;
public static KeyCode flyKey = KeyCode.None; 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 itemsScrollPosition = Vector2.zero;
public static Vector2 rituelObjectsScrollPosition = Vector2.zero; public static Vector2 rituelObjectsScrollPosition = Vector2.zero;
public static Vector2 stuffsScrollPosition = Vector2.zero; public static Vector2 stuffsScrollPosition = Vector2.zero;

View File

@@ -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<Il2Cpp.NolanBehaviour>();
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);
}
}
}
}
}
}

View File

@@ -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<ESP.ItemESPConfig.ESPType> espTypes = ESP.ItemESPConfig.GetMapESPTypes(currentScene);
if (espTypes.Count == 0 && currentScene != "Menu")
{
espTypes = new List<ESP.ItemESPConfig.ESPType>();
}
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 }
);
}
}
}
}

View File

@@ -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");
}
}
}
}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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<Il2Cpp.ManorDeadRealmTrigger>();
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<Il2Cpp.ManorDeadRealmTrigger>();
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");
}
}
}
}

View File

@@ -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<CharacterLayerManager>();
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)
{
}
}
}
}
}

View File

@@ -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());
}
}
}
}

View File

@@ -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<Il2Cpp.NolanBehaviour>();
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"));
}
}
}
}

View File

@@ -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);
}
}
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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) * Big Flashlight (allows your flashlight to light a lot more)
* Flashlight color customization (with a home made color picker) * Flashlight color customization (with a home made color picker)
* Unlimited UV light (thanks to [@jadis0x](https://github.com/jadis0x)) * 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) * 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) * Doors unlocker (should work fine, though it doesn't seem to work sometimes)
* Keys teleporter * Keys teleporter
@@ -42,10 +41,10 @@ Everything about spoofing ehre (steam name, server name, level...) will persist
* Azazel ESP (with a home made color picker) * Azazel ESP (with a home made color picker)
* Azazel Skeleton ESP * Azazel Skeleton ESP
* Azazel snapline (with a home made color picker) * Azazel snapline (with a home made color picker)
* 10 languages supported (English, 简体中文, Français, Deutsch, Español, 日本語, 한국어, Русский, Português, Italiano) with in-game language switcher in Misc tab. Check it in misc table! * Item ESP (with multi-language translation) (Now you can specify the display of a single item)
* Item ESP (with multi-language translation)
* Demon ESP (with multi-language translation) * Demon ESP (with multi-language translation)
* Goat/Rat ESP (with multi-language translation) * Goat/Rat ESP (with multi-language translation)
* Collection ESP (Collected items of 25 per map, similar to roses, horseshoes, etc)
* TP all the items to your position ! (thanks to [@jadis0x](https://github.com/jadis0x)) * TP all the items to your position ! (thanks to [@jadis0x](https://github.com/jadis0x))
* Spawn any item/entity to your position * Spawn any item/entity to your position
* Walk in the lobby * Walk in the lobby
@@ -53,6 +52,13 @@ Everything about spoofing ehre (steam name, server name, level...) will persist
* Fullbright * Fullbright
* Infinite mirrors (Manor update) * Infinite mirrors (Manor update)
* Switch between realms (Manor update) * 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) * 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)
## English Installation Tutorial ## English Installation Tutorial
@@ -67,28 +73,43 @@ For my French fellas out there, 1tap2times made a French video tutorial for the
For my German friends, KiwiJuice02 made a german video tutorial right here : [link](https://www.youtube.com/watch?v=Ntablvo6y-I)<br> For my German friends, KiwiJuice02 made a german video tutorial right here : [link](https://www.youtube.com/watch?v=Ntablvo6y-I)<br>
In order to get all of this working you need to generate the DevourClient.dll file by building the source code.<br>
0. Install [.NET 6 SDK and runtime](https://dotnet.microsoft.com/en-us/download/dotnet/6.0).
1. [Build the cheat from source](https://github.com/ALittlePatate/DevourClient#building-from-source). ## English Installation Guide
2. Put the DevourClient.dll file located in `DevourClient\bin\Release\net6.0` inside `C:\Program Files (x86)\Steam\steamapps\common\Devour\Mods` folder. If you just want to install this plugin and use it directly in the game:
3. Start the game, now you have successfully installed DevourClient. Use INSERT to open the menu
1. Install the [.NET 6](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) runtime environment
2. Install [MelonLoader](https://github.com/LavaGang/MelonLoader/releases)
There are no version restrictions, just try to choose the latest version. After opening the MelonLoader page, click on Devour to enter the installation interface. Keep all default settings, no need to check or modify any other options, then click Install to proceed
3. Install the DLL file → Download the latest DLL file from the releases section of this project, then add this file to the Mods folder in your Devour installation directory (If you don't know the directory location, you can right-click Devour in Steam, select "Manage" → "Browse local files")
4. Run Devour → If the installation is successful, you will see a Windows window showing various installation prompts, then the game will automatically launch. Press the 'INSERT' or 'INS' key to open and close the DevourClient window
**Note:** Some computers may show a "fatal error" message after installing MelonLoader. I haven't encountered this issue myself, but the main cause is usually that files extracted to the MelonLoader folder in the Devour root directory during the MelonLoader installation process have problems. Simple solutions include: (1) Copy the MelonLoader folder from another computer with the same system and bit-width (x86, x32), then paste it directly into your computer. (2) Completely delete the MelonLoader folder and reinstall.
**Note:** Some computers may display "0 mod" when loading. Please check if your DLL file is working correctly and ensure that you have placed the DLL file in the Devour "Mods" folder.
If you want to modify and develop the code, please follow the [Building from source](#building-from-source) steps below.
## 中文安装指南 ## 中文安装指南
如果你只是想要安装这个插件,直接在游戏里使用的话 如果你只是想要安装这个插件,直接在游戏里使用的话
1、安装 .net 6 的运行环境 → (https://dotnet.microsoft.com/en-us/download/dotnet/6.0) 1、安装 [.net 6](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) 的运行环境
2、安装melonloader → (https://github.com/LavaGang/MelonLoader/releases) 2、安装 [melonloader](https://github.com/LavaGang/MelonLoader/releases)
版本无限制尽量选择新版即可。打开melonloader页面后点击devour进入安装界面全部默认即可无需勾选或修改其他选项点击install进行安装安装过程中可能需要vpn支持 版本无限制尽量选择新版即可。打开melonloader页面后点击devour进入安装界面全部默认即可无需勾选或修改其他选项点击install进行安装安装过程中可能需要vpn支持
3、安装dll文件 → 从本项目的release中下载最新的dll文件然后将此文件添加到你的devour的安装目录中的mods文件夹里不知道目录的情况下可以在steam中右键devour选择“管理”-“浏览本地文件”即可) 3、安装dll文件 → 从本项目的release中下载最新的dll文件然后将此文件添加到你的devour的安装目录中的mods文件夹里不知道目录的情况下可以在steam中右键devour选择“管理”-“浏览本地文件”即可)
4、运行devour → 如果安装成功你会看到一个windows窗口进行各类安装提示后自动进入游戏。点击insert键即可打开和关闭devourclient窗口 4、运行devour → 如果安装成功你会看到一个windows窗口进行各类安装提示后自动进入游戏。点击insert键即可打开和关闭devourclient窗口
ps:有些电脑在安装melonloader之后会出现fatal error的提示这个我目前并没有碰到过。但是出现这个提示的主要原因基本是melonloader安装过程中提取到devour根目录的melonloader文件夹里的文件出现了问题比较简单的解决办法就是1在别人的同系统同位宽x86x32的电脑里拷贝出来他的melonloader文件夹然后直接粘贴到自己的电脑里。2将melonloader文件夹完全删除然后重装。(3)在直到游戏完全运行菜单正常工作之前保持VPN线路通畅。 注意:有些电脑在安装melonloader之后会出现fatal error的提示这个我目前并没有碰到过。但是出现这个提示的主要原因基本是melonloader安装过程中提取到devour根目录的melonloader文件夹里的文件出现了问题比较简单的解决办法就是1在别人的同系统同位宽x86x32的电脑里拷贝出来他的melonloader文件夹然后直接粘贴到自己的电脑里。2将melonloader文件夹完全删除然后重装。(3)在直到游戏完全运行菜单正常工作之前保持VPN线路通畅。
如果你想要对代码进行修改和开发请按照下面的”building from source“的步骤逐步进行 注意:如果在加载时提示 “0 mod”请检查你的dll文件是否正常是否已经将dll文件放置到devour的“mods”文件夹中。
如果你想要对代码进行修改和开发,请按照下面的 [building from source](#building-from-source) 的步骤,逐步进行
## Uninstallation ## Uninstallation
@@ -110,18 +131,15 @@ ps:有些电脑在安装melonloader之后会出现fatal error的提示
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\net6\Il2CppInterop.Runtime.dll` * `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\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\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.user.dll`
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.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\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.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.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.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.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.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.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.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.dll`
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.platform.photon.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.platform.photon.dll`
@@ -129,8 +147,11 @@ ps:有些电脑在安装melonloader之后会出现fatal error的提示
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.PhysicsModule.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.PhysicsModule.dll`
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppcom.rlabrecque.steamworks.net.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppcom.rlabrecque.steamworks.net.dll`
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\unity.TextMeshPro.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\unity.TextMeshPro.dll`
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.TextRenderingModule.dll`
8. Build the solutions in Release | Any CPU 8. Build the solutions in Release | Any CPU
**Note**: Now you can add these dependencies automatically by 'update_dependency' script.
## Contact ## Contact
You can add me on discord at _.patate or on the [discord server](https://discord.gg/2amMFvqjYd) You can add me on discord at _.patate or on the [discord server](https://discord.gg/2amMFvqjYd)

28
update_dependency.bat Normal file
View File

@@ -0,0 +1,28 @@
@echo off
chcp 65001 >nul
echo ========================================
echo DevourClient Dependency Path Update Script
echo ========================================
echo.
REM Check if PowerShell is available
powershell -Command "exit 0" >nul 2>&1
if errorlevel 1 (
echo Error: PowerShell not found, cannot run script
pause
exit /b 1
)
REM Run PowerShell script
powershell -ExecutionPolicy Bypass -File "%~dp0update_dependency.ps1"
if errorlevel 1 (
echo.
echo Script execution failed!
pause
exit /b 1
) else (
echo.
pause
)

293
update_dependency.ps1 Normal file
View File

@@ -0,0 +1,293 @@
# PowerShell script: Automatically update dependency paths in DevourClient.csproj (Windows)
# Function: Automatically find Devour installation path in Steam libraries and replace hardcoded paths in csproj file
param(
[string]$CsprojPath = "DevourClient\DevourClient.csproj"
)
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "DevourClient Dependency Path Update Script" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""
$DevourAppId = "1274570"
function Find-SteamLibraries {
$steamLibraries = @()
$defaultSteamPath = "${env:ProgramFiles(x86)}\Steam"
if (Test-Path $defaultSteamPath) {
$steamLibraries += $defaultSteamPath
} else {
$alternativePaths = @(
"${env:ProgramFiles}\Steam",
"$env:LOCALAPPDATA\Steam",
"C:\Steam",
"D:\Steam"
)
foreach ($altPath in $alternativePaths) {
if (Test-Path $altPath) {
$steamLibraries += $altPath
$defaultSteamPath = $altPath
break
}
}
}
$libraryFoldersPath = Join-Path $defaultSteamPath "steamapps\libraryfolders.vdf"
if (Test-Path $libraryFoldersPath) {
try {
$content = Get-Content $libraryFoldersPath -Raw -ErrorAction Stop
$pathPattern = '"path"\s+"([^"]+)"'
$pathMatches = [regex]::Matches($content, $pathPattern)
foreach ($match in $pathMatches) {
$libraryPath = $match.Groups[1].Value -replace '\\\\', '\'
if (Test-Path $libraryPath) {
$steamLibraries += $libraryPath
}
}
} catch {
Write-Host "Error reading libraryfolders.vdf: $($_.Exception.Message)" -ForegroundColor Red
}
} else {
$driveLetters = @("C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")
foreach ($drive in $driveLetters) {
$pathsToCheck = @(
"${drive}:\SteamLibrary",
"${drive}:\Steam",
"${drive}:\steam",
"${drive}:\Steam\SteamLibrary",
"${drive}:\Games\Steam"
)
foreach ($checkPath in $pathsToCheck) {
if (Test-Path $checkPath) {
$steamappsPath = Join-Path $checkPath "steamapps"
if (Test-Path $steamappsPath) {
$steamLibraries += $checkPath
}
}
}
}
}
return $steamLibraries | Select-Object -Unique
}
function Find-DevourPathFromManifest {
param([string]$SteamLibraryPath)
$appManifestPath = Join-Path $SteamLibraryPath "steamapps\appmanifest_$DevourAppId.acf"
if (Test-Path $appManifestPath) {
$content = Get-Content $appManifestPath -Raw
$installDirPattern = '"installdir"\s+"([^"]+)"'
$installDirMatch = [regex]::Match($content, $installDirPattern)
if ($installDirMatch.Success) {
$installDir = $installDirMatch.Groups[1].Value
$devourPath = Join-Path $SteamLibraryPath "steamapps\common\$installDir"
if (Test-Path $devourPath) {
return $devourPath
}
}
}
return $null
}
$RequiredDependencies = @(
@{ Name = "0Harmony"; RelativePath = "steamapps\common\Devour\MelonLoader\net6\0Harmony.dll" },
@{ Name = "Assembly-CSharp"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Assembly-CSharp.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" },
@{ Name = "Il2CppInterop.Runtime"; RelativePath = "steamapps\common\Devour\MelonLoader\net6\Il2CppInterop.Runtime.dll" },
@{ Name = "Il2Cppmscorlib"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppmscorlib.dll" },
@{ Name = "Il2CppOpsive.UltimateCharacterController"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2CppOpsive.UltimateCharacterController.dll" },
@{ Name = "Il2Cppudpkit"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.dll" },
@{ Name = "Il2Cppudpkit.common"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.common.dll" },
@{ Name = "Il2Cppudpkit.platform.photon"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.platform.photon.dll" },
@{ Name = "MelonLoader"; RelativePath = "steamapps\common\Devour\MelonLoader\net6\MelonLoader.dll" },
@{ Name = "Unity.TextMeshPro"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Unity.TextMeshPro.dll" },
@{ 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.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" },
@{ Name = "UnityEngine.TextRenderingModule"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.TextRenderingModule.dll" },
@{ Name = "UnityEngine.UI"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.UI.dll" },
@{ Name = "UnityEngine.UIModule"; RelativePath = "steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.UIModule.dll" }
)
function Find-DevourPath {
Write-Host "Searching for Devour installation path..." -ForegroundColor Yellow
$steamLibraries = Find-SteamLibraries
if ($steamLibraries.Count -eq 0) {
Write-Host "No Steam libraries found!" -ForegroundColor Red
Write-Host "Please check if Steam is installed." -ForegroundColor Yellow
return $null
}
$devourPath = $null
foreach ($library in $steamLibraries) {
$foundPath = Find-DevourPathFromManifest -SteamLibraryPath $library
if ($foundPath) {
$melonLoaderPath = Join-Path $foundPath "MelonLoader"
if (Test-Path $melonLoaderPath) {
$devourPath = $foundPath
Write-Host "Found Devour: $devourPath" -ForegroundColor Green
return $devourPath
}
}
}
foreach ($library in $steamLibraries) {
$possiblePath = Join-Path $library "steamapps\common\Devour"
if (Test-Path $possiblePath) {
$melonLoaderPath = Join-Path $possiblePath "MelonLoader"
if (Test-Path $melonLoaderPath) {
$devourPath = $possiblePath
Write-Host "Found Devour: $devourPath" -ForegroundColor Green
break
}
}
}
if (-not $devourPath) {
Write-Host "Devour installation path not found!" -ForegroundColor Red
Write-Host "Please ensure:" -ForegroundColor Yellow
Write-Host " 1. Devour is installed via Steam" -ForegroundColor Yellow
Write-Host " 2. MelonLoader is installed in the game" -ForegroundColor Yellow
Write-Host ""
return $null
}
return $devourPath
}
function Update-CsprojDependencies {
param(
[string]$CsprojContent,
[string]$DevourPath
)
[xml]$xmlDoc = $CsprojContent
$itemGroup = $xmlDoc.Project.ItemGroup | Where-Object { $null -ne $_.Reference } | Select-Object -First 1
if (-not $itemGroup) {
$itemGroup = $xmlDoc.CreateElement("ItemGroup")
$xmlDoc.Project.AppendChild($itemGroup) | Out-Null
}
$addedCount = 0
$updatedCount = 0
foreach ($dep in $RequiredDependencies) {
$relativePart = $dep.RelativePath -replace '^steamapps\\common\\Devour\\', ''
$fullPath = Join-Path $DevourPath $relativePart
$existingRef = $itemGroup.Reference | Where-Object { $_.Include -eq $dep.Name } | Select-Object -First 1
if ($existingRef) {
$hintPathNode = $existingRef.SelectSingleNode("HintPath")
if (-not $hintPathNode) {
$hintPathNode = $xmlDoc.CreateElement("HintPath")
$existingRef.AppendChild($hintPathNode) | Out-Null
}
$hintPathNode.InnerText = $fullPath
$updatedCount++
} else {
$newRef = $xmlDoc.CreateElement("Reference")
$newRef.SetAttribute("Include", $dep.Name)
$hintPathNode = $xmlDoc.CreateElement("HintPath")
$hintPathNode.InnerText = $fullPath
$newRef.AppendChild($hintPathNode) | Out-Null
$itemGroup.AppendChild($newRef) | Out-Null
$addedCount++
}
}
$stringWriter = New-Object System.IO.StringWriter
$xmlWriter = New-Object System.Xml.XmlTextWriter($stringWriter)
$xmlWriter.Formatting = [System.Xml.Formatting]::Indented
$xmlWriter.Indentation = 2
$xmlDoc.WriteContentTo($xmlWriter)
$xmlWriter.Flush()
$updatedContent = $stringWriter.ToString()
return @{
Content = $updatedContent
Added = $addedCount
Updated = $updatedCount
}
}
try {
if (-not (Test-Path $CsprojPath)) {
Write-Host "Error: csproj file not found: $CsprojPath" -ForegroundColor Red
exit 1
}
$devourPath = Find-DevourPath
if (-not $devourPath) {
exit 1
}
Write-Host ""
Write-Host "Updating csproj file..." -ForegroundColor Yellow
$csprojContent = Get-Content $CsprojPath -Raw -Encoding UTF8
$originalContent = $csprojContent
$oldPathPattern = '[A-Z]:\\SteamLibrary\\steamapps\\common\\Devour'
$escapedNewPath = $devourPath -replace '\\', '\\'
$csprojContent = $csprojContent -replace $oldPathPattern, $escapedNewPath
$result = Update-CsprojDependencies -CsprojContent $csprojContent -DevourPath $devourPath
$updatedContent = $result.Content
if ($originalContent -eq $updatedContent -and $result.Added -eq 0 -and $result.Updated -eq 0) {
Write-Host "Note: No changes needed (all dependencies are up to date)" -ForegroundColor Yellow
} else {
$backupPath = "$CsprojPath.backup"
Copy-Item $CsprojPath $backupPath -Force
Write-Host "Backup created: $backupPath" -ForegroundColor Gray
$fullPath = (Resolve-Path $CsprojPath).Path
[System.IO.File]::WriteAllText($fullPath, $updatedContent, [System.Text.Encoding]::UTF8)
Write-Host "Successfully updated csproj file!" -ForegroundColor Green
if ($result.Added -gt 0) {
Write-Host "Added $($result.Added) new dependency reference(s)" -ForegroundColor Cyan
}
if ($result.Updated -gt 0) {
Write-Host "Updated $($result.Updated) existing dependency reference(s)" -ForegroundColor Cyan
}
}
Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "Update completed!" -ForegroundColor Green
Write-Host "Devour path: $devourPath" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
} catch {
Write-Host ""
Write-Host "Error: $($_.Exception.Message)" -ForegroundColor Red
Write-Host $_.ScriptStackTrace -ForegroundColor Red
exit 1
}

274
update_dependency.sh Normal file
View File

@@ -0,0 +1,274 @@
#!/bin/bash
# Bash script: Automatically update dependency paths in DevourClient.csproj (macOS)
# Function: Automatically find Devour installation path in Steam libraries and replace hardcoded paths in csproj file
CSPROJ_PATH="${1:-DevourClient/DevourClient.csproj}"
echo "========================================"
echo "DevourClient Dependency Path Update Script"
echo "========================================"
echo ""
DEVOUR_APP_ID="1274570"
find_steam_libraries() {
local steam_libraries=()
local default_steam_path="$HOME/Library/Application Support/Steam"
if [ -d "$default_steam_path" ]; then
steam_libraries+=("$default_steam_path")
fi
local library_folders_path="$default_steam_path/steamapps/libraryfolders.vdf"
if [ -f "$library_folders_path" ]; then
while IFS= read -r line; do
if [[ $line =~ \"path\"[[:space:]]+\"([^\"]+)\" ]]; then
local library_path="${BASH_REMATCH[1]}"
library_path="${library_path//\\\\/\/}"
if [ -d "$library_path" ]; then
steam_libraries+=("$library_path")
fi
fi
done < "$library_folders_path"
fi
printf '%s\n' "${steam_libraries[@]}" | sort -u
}
find_devour_path_from_manifest() {
local steam_library_path="$1"
local app_manifest_path="$steam_library_path/steamapps/appmanifest_${DEVOUR_APP_ID}.acf"
if [ -f "$app_manifest_path" ]; then
local install_dir=$(grep -o '"installdir"[[:space:]]*"[^"]*"' "$app_manifest_path" | sed 's/.*"\([^"]*\)".*/\1/')
if [ -n "$install_dir" ]; then
local devour_path="$steam_library_path/steamapps/common/$install_dir"
if [ -d "$devour_path" ]; then
echo "$devour_path"
return 0
fi
fi
fi
return 1
}
declare -A REQUIRED_DEPENDENCIES=(
["0Harmony"]="steamapps/common/Devour/MelonLoader/net6/0Harmony.dll"
["Assembly-CSharp"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Assembly-CSharp.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"
["Il2CppInterop.Runtime"]="steamapps/common/Devour/MelonLoader/net6/Il2CppInterop.Runtime.dll"
["Il2Cppmscorlib"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppmscorlib.dll"
["Il2CppOpsive.UltimateCharacterController"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2CppOpsive.UltimateCharacterController.dll"
["Il2Cppudpkit"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppudpkit.dll"
["Il2Cppudpkit.common"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppudpkit.common.dll"
["Il2Cppudpkit.platform.photon"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppudpkit.platform.photon.dll"
["MelonLoader"]="steamapps/common/Devour/MelonLoader/net6/MelonLoader.dll"
["Unity.TextMeshPro"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Unity.TextMeshPro.dll"
["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.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"
["UnityEngine.TextRenderingModule"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.TextRenderingModule.dll"
["UnityEngine.UI"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.UI.dll"
["UnityEngine.UIModule"]="steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.UIModule.dll"
)
find_devour_path() {
echo "Searching for Devour installation path..." >&2
local steam_libraries
steam_libraries=$(find_steam_libraries)
if [ -z "$steam_libraries" ]; then
echo "No Steam libraries found!" >&2
echo "Please check if Steam is installed." >&2
return 1
fi
local devour_path=""
while IFS= read -r library; do
[ -z "$library" ] && continue
local found_path=$(find_devour_path_from_manifest "$library")
if [ -n "$found_path" ]; then
local melon_loader_path="$found_path/MelonLoader"
if [ -d "$melon_loader_path" ]; then
devour_path="$found_path"
echo "Found Devour: $devour_path" >&2
echo "$devour_path"
return 0
fi
fi
done <<< "$steam_libraries"
while IFS= read -r library; do
[ -z "$library" ] && continue
local possible_path="$library/steamapps/common/Devour"
if [ -d "$possible_path" ]; then
local melon_loader_path="$possible_path/MelonLoader"
if [ -d "$melon_loader_path" ]; then
devour_path="$possible_path"
echo "Found Devour: $devour_path" >&2
echo "$devour_path"
return 0
fi
fi
done <<< "$steam_libraries"
echo "Devour installation path not found!" >&2
echo "Please ensure:" >&2
echo " 1. Devour is installed via Steam" >&2
echo " 2. MelonLoader is installed in the game" >&2
echo "" >&2
return 1
}
update_csproj_dependencies() {
local csproj_file="$1"
local devour_path="$2"
python3 << EOF
import xml.etree.ElementTree as ET
import sys
import os
required_deps = {
"0Harmony": "steamapps/common/Devour/MelonLoader/net6/0Harmony.dll",
"Assembly-CSharp": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Assembly-CSharp.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",
"Il2CppInterop.Runtime": "steamapps/common/Devour/MelonLoader/net6/Il2CppInterop.Runtime.dll",
"Il2Cppmscorlib": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppmscorlib.dll",
"Il2CppOpsive.UltimateCharacterController": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2CppOpsive.UltimateCharacterController.dll",
"Il2Cppudpkit": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppudpkit.dll",
"Il2Cppudpkit.common": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppudpkit.common.dll",
"Il2Cppudpkit.platform.photon": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Il2Cppudpkit.platform.photon.dll",
"MelonLoader": "steamapps/common/Devour/MelonLoader/net6/MelonLoader.dll",
"Unity.TextMeshPro": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/Unity.TextMeshPro.dll",
"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.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",
"UnityEngine.TextRenderingModule": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.TextRenderingModule.dll",
"UnityEngine.UI": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.UI.dll",
"UnityEngine.UIModule": "steamapps/common/Devour/MelonLoader/Il2CppAssemblies/UnityEngine.UIModule.dll"
}
try:
tree = ET.parse("$csproj_file")
root = tree.getroot()
item_group = None
for ig in root.findall(".//ItemGroup"):
if ig.find("Reference") is not None:
item_group = ig
break
if item_group is None:
item_group = ET.SubElement(root, "ItemGroup")
added_count = 0
updated_count = 0
for dep_name, rel_path in required_deps.items():
relative_part = rel_path.replace("steamapps/common/Devour/", "")
full_path = os.path.join("$devour_path", relative_part)
existing_ref = None
for ref in item_group.findall("Reference"):
if ref.get("Include") == dep_name:
existing_ref = ref
break
if existing_ref is not None:
hint_path = existing_ref.find("HintPath")
if hint_path is None:
hint_path = ET.SubElement(existing_ref, "HintPath")
hint_path.text = full_path
updated_count += 1
else:
new_ref = ET.SubElement(item_group, "Reference")
new_ref.set("Include", dep_name)
hint_path = ET.SubElement(new_ref, "HintPath")
hint_path.text = full_path
added_count += 1
try:
ET.indent(tree, space=" ")
except AttributeError:
pass
tree.write("$csproj_file", encoding="utf-8", xml_declaration=True)
print(f"ADDED:{added_count}")
print(f"UPDATED:{updated_count}")
except Exception as e:
print(f"ERROR:{str(e)}", file=sys.stderr)
sys.exit(1)
EOF
}
if [ ! -f "$CSPROJ_PATH" ]; then
echo "Error: csproj file not found: $CSPROJ_PATH" >&2
exit 1
fi
DEVOUR_PATH=$(find_devour_path)
if [ $? -ne 0 ] || [ -z "$DEVOUR_PATH" ]; then
exit 1
fi
echo ""
echo "Updating csproj file..."
BACKUP_PATH="${CSPROJ_PATH}.backup"
cp "$CSPROJ_PATH" "$BACKUP_PATH"
echo "Backup created: $BACKUP_PATH"
sed -i '' "s|[A-Z]:\\\\SteamLibrary\\\\steamapps\\\\common\\\\Devour|$DEVOUR_PATH|g" "$CSPROJ_PATH" 2>/dev/null || \
sed -i "s|[A-Z]:\\\\SteamLibrary\\\\steamapps\\\\common\\\\Devour|$DEVOUR_PATH|g" "$CSPROJ_PATH"
RESULT=$(update_csproj_dependencies "$CSPROJ_PATH" "$DEVOUR_PATH")
if [ $? -ne 0 ]; then
echo "Error updating dependencies!" >&2
exit 1
fi
ADDED=$(echo "$RESULT" | grep "ADDED:" | cut -d: -f2)
UPDATED=$(echo "$RESULT" | grep "UPDATED:" | cut -d: -f2)
if [ -z "$ADDED" ]; then
ADDED=0
fi
if [ -z "$UPDATED" ]; then
UPDATED=0
fi
if [ "$ADDED" -eq 0 ] && [ "$UPDATED" -eq 0 ]; then
echo "Note: No changes needed (all dependencies are up to date)"
else
echo "Successfully updated csproj file!"
if [ "$ADDED" -gt 0 ]; then
echo "Added $ADDED new dependency reference(s)"
fi
if [ "$UPDATED" -gt 0 ]; then
echo "Updated $UPDATED existing dependency reference(s)"
fi
fi
echo ""
echo "========================================"
echo "Update completed!"
echo "Devour path: $DEVOUR_PATH"
echo "========================================"