Compare commits
6 Commits
4.6
...
MelonLoade
| Author | SHA1 | Date | |
|---|---|---|---|
| 5f73135eaa | |||
| 62dc974fa7 | |||
| b134834170 | |||
| 17dc31dd10 | |||
| 084d39ff57 | |||
| 33164f700a |
File diff suppressed because it is too large
Load Diff
@@ -1,89 +1,83 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<OutputType>Library</OutputType>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<WarningLevel>0</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<WarningLevel>0</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="0Harmony">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\net6\0Harmony.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Assembly-CSharp">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Assembly-CSharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2CppBehaviorDesigner.Runtime">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2CppBehaviorDesigner.Runtime.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppbolt">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppbolt.user">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.user.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppcom.rlabrecque.steamworks.net">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppcom.rlabrecque.steamworks.net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2CppInterop.Runtime">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\net6\Il2CppInterop.Runtime.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppmscorlib">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppmscorlib.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2CppOpsive.UltimateCharacterController">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2CppOpsive.UltimateCharacterController.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppudpkit">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppudpkit.common">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.common.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppudpkit.platform.photon">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.platform.photon.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MelonLoader">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\net6\MelonLoader.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Unity.TextMeshPro">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Unity.TextMeshPro.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.AnimationModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.AnimationModule.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.CoreModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.CoreModule.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.HotReloadModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.HotReloadModule.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.IMGUIModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.IMGUIModule.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.InputLegacyModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.InputLegacyModule.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.PhysicsModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.PhysicsModule.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.TextRenderingModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.TextRenderingModule.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.UI">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.UI.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.UIModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.UIModule.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<OutputType>Library</OutputType>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<WarningLevel>0</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<WarningLevel>0</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="0Harmony">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\net6\0Harmony.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Assembly-CSharp">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Assembly-CSharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppbolt">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppbolt.user">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.user.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppcom.rlabrecque.steamworks.net">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppcom.rlabrecque.steamworks.net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2CppInterop.Runtime">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\net6\Il2CppInterop.Runtime.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppmscorlib">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppmscorlib.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2CppOpsive.UltimateCharacterController">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2CppOpsive.UltimateCharacterController.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppudpkit">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppudpkit.common">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.common.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppudpkit.platform.photon">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.platform.photon.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MelonLoader">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\net6\MelonLoader.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Unity.TextMeshPro">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Unity.TextMeshPro.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.AnimationModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.AnimationModule.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.CoreModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.CoreModule.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.IMGUIModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.IMGUIModule.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.InputLegacyModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.InputLegacyModule.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.PhysicsModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.PhysicsModule.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.TextRenderingModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.TextRenderingModule.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.UI">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.UI.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.UIModule">
|
||||
<HintPath>E:\SteamLibrary\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.UIModule.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -2,9 +2,7 @@ using System.Collections.Generic;
|
||||
|
||||
namespace DevourClient.ESP
|
||||
{
|
||||
/// <summary>
|
||||
/// Item ESP configuration management class - dynamically display different item types based on map
|
||||
/// </summary>
|
||||
// Item ESP configuration management class - dynamically display different item types based on map
|
||||
public static class ItemESPConfig
|
||||
{
|
||||
// ESP type enumeration
|
||||
@@ -20,7 +18,7 @@ namespace DevourClient.ESP
|
||||
Gasoline, // Gasoline
|
||||
|
||||
// Asylum (Molly) specific
|
||||
RottonFood, // Rotten Food
|
||||
RottenFood, // Rotten Food
|
||||
Fuse, // Fuse
|
||||
|
||||
// Inn specific
|
||||
@@ -63,7 +61,7 @@ namespace DevourClient.ESP
|
||||
|
||||
// Enemy ESP - Slaughterhouse
|
||||
Corpse, // Corpse
|
||||
Roar, // Roar
|
||||
Boar, // Boar
|
||||
Pig, // Pig
|
||||
|
||||
// Enemy ESP - Manor
|
||||
@@ -101,7 +99,7 @@ namespace DevourClient.ESP
|
||||
ESPType.FirstAid, // Common: First Aid
|
||||
ESPType.Battery, // Common: Battery
|
||||
ESPType.Keys, // Common: Keys
|
||||
ESPType.RottonFood, // Specific: Rotten Food
|
||||
ESPType.RottenFood, // Specific: Rotten Food
|
||||
ESPType.Fuse, // Specific: Fuse
|
||||
ESPType.Inmates, // Enemy: Inmates
|
||||
ESPType.Rat // Enemy: Rat
|
||||
@@ -142,7 +140,7 @@ namespace DevourClient.ESP
|
||||
ESPType.Bone, // Specific: Bone
|
||||
ESPType.Gasoline, // Specific: Gasoline
|
||||
ESPType.Corpse, // Enemy: Corpse
|
||||
ESPType.Roar, // Enemy: Roar
|
||||
ESPType.Boar, // Enemy: Boar
|
||||
ESPType.Pig // Enemy: Pig
|
||||
}
|
||||
},
|
||||
@@ -204,7 +202,7 @@ namespace DevourClient.ESP
|
||||
{ ESPType.Gasoline, false },
|
||||
|
||||
// Asylum specific
|
||||
{ ESPType.RottonFood, false },
|
||||
{ ESPType.RottenFood, false },
|
||||
{ ESPType.Fuse, false },
|
||||
|
||||
// Inn specific
|
||||
@@ -244,7 +242,7 @@ namespace DevourClient.ESP
|
||||
|
||||
// Enemy - Slaughterhouse
|
||||
{ ESPType.Corpse, false },
|
||||
{ ESPType.Roar, false },
|
||||
{ ESPType.Boar, false },
|
||||
{ ESPType.Pig, false },
|
||||
|
||||
// Enemy - Manor
|
||||
@@ -260,9 +258,6 @@ namespace DevourClient.ESP
|
||||
{ ESPType.Collectables, false }
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Get list of ESP types supported by specified map
|
||||
/// </summary>
|
||||
public static List<ESPType> GetMapESPTypes(string sceneName)
|
||||
{
|
||||
// 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)
|
||||
{
|
||||
return espStates.ContainsKey(type) ? espStates[type] : false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set ESP type enable status
|
||||
/// </summary>
|
||||
public static void SetESPState(ESPType type, bool enabled)
|
||||
{
|
||||
if (espStates.ContainsKey(type))
|
||||
espStates[type] = enabled;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Toggle ESP type enable status
|
||||
/// </summary>
|
||||
public static void ToggleESPState(ESPType type)
|
||||
{
|
||||
if (espStates.ContainsKey(type))
|
||||
espStates[type] = !espStates[type];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get ESP type display name (for translation key)
|
||||
/// </summary>
|
||||
public static string GetESPTypeName(ESPType type)
|
||||
{
|
||||
switch (type)
|
||||
@@ -332,8 +315,8 @@ namespace DevourClient.ESP
|
||||
return "Gasoline ESP";
|
||||
|
||||
// Asylum specific
|
||||
case ESPType.RottonFood:
|
||||
return "Rotton Food ESP";
|
||||
case ESPType.RottenFood:
|
||||
return "Rotten Food ESP";
|
||||
case ESPType.Fuse:
|
||||
return "Fuse ESP";
|
||||
|
||||
@@ -392,8 +375,8 @@ namespace DevourClient.ESP
|
||||
// Enemy - Slaughterhouse
|
||||
case ESPType.Corpse:
|
||||
return "Corpse ESP";
|
||||
case ESPType.Roar:
|
||||
return "Roar ESP";
|
||||
case ESPType.Boar:
|
||||
return "Boar ESP";
|
||||
case ESPType.Pig:
|
||||
return "Pig ESP";
|
||||
|
||||
@@ -420,9 +403,6 @@ namespace DevourClient.ESP
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get corresponding ESP type based on item name
|
||||
/// </summary>
|
||||
public static ESPType? GetESPTypeByItemName(string itemName)
|
||||
{
|
||||
if (string.IsNullOrEmpty(itemName))
|
||||
@@ -459,10 +439,10 @@ namespace DevourClient.ESP
|
||||
return ESPType.Gasoline;
|
||||
|
||||
// Asylum specific
|
||||
case "rottonfoodpickup":
|
||||
case "rotton food":
|
||||
case "rottonfood":
|
||||
return ESPType.RottonFood;
|
||||
case "rottenfoodpickup":
|
||||
case "rotten food":
|
||||
case "rottenfood":
|
||||
return ESPType.RottenFood;
|
||||
|
||||
case "fusepickup":
|
||||
case "fuse":
|
||||
@@ -554,13 +534,12 @@ namespace DevourClient.ESP
|
||||
case "corpsebehaviour":
|
||||
return ESPType.Corpse;
|
||||
|
||||
case "roar":
|
||||
case "roarbehaviour":
|
||||
return ESPType.Roar;
|
||||
|
||||
case "pig":
|
||||
|
||||
case "boar":
|
||||
case "boarbehaviour":
|
||||
return ESPType.Boar;
|
||||
|
||||
case "pig":
|
||||
case "pigbehaviour":
|
||||
return ESPType.Pig;
|
||||
|
||||
@@ -617,9 +596,6 @@ namespace DevourClient.ESP
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check if ESP should be shown for specified item
|
||||
/// </summary>
|
||||
public static bool ShouldShowESP(string itemName)
|
||||
{
|
||||
ESPType? espType = GetESPTypeByItemName(itemName);
|
||||
@@ -629,9 +605,6 @@ namespace DevourClient.ESP
|
||||
return GetESPState(espType.Value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reset all ESP states
|
||||
/// </summary>
|
||||
public static void ResetAllStates()
|
||||
{
|
||||
var keys = new List<ESPType>(espStates.Keys);
|
||||
@@ -649,7 +622,7 @@ namespace DevourClient.ESP
|
||||
GetESPState(ESPType.Keys) ||
|
||||
GetESPState(ESPType.Hay) ||
|
||||
GetESPState(ESPType.Gasoline) ||
|
||||
GetESPState(ESPType.RottonFood) ||
|
||||
GetESPState(ESPType.RottenFood) ||
|
||||
GetESPState(ESPType.Fuse) ||
|
||||
GetESPState(ESPType.Bleach) ||
|
||||
GetESPState(ESPType.Egg) ||
|
||||
@@ -678,7 +651,7 @@ namespace DevourClient.ESP
|
||||
GetESPState(ESPType.Spider) ||
|
||||
GetESPState(ESPType.Ghost) ||
|
||||
GetESPState(ESPType.Corpse) ||
|
||||
GetESPState(ESPType.Roar) ||
|
||||
GetESPState(ESPType.Boar) ||
|
||||
GetESPState(ESPType.Pig) ||
|
||||
GetESPState(ESPType.Crow) ||
|
||||
GetESPState(ESPType.DirtyHead) ||
|
||||
|
||||
167
DevourClient/Features/ClientRuntime.cs
Normal file
167
DevourClient/Features/ClientRuntime.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
117
DevourClient/Features/ItemHandling.cs
Normal file
117
DevourClient/Features/ItemHandling.cs
Normal 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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine;
|
||||
using MelonLoader;
|
||||
using UnityEngine.UI;
|
||||
using System.Reflection;
|
||||
@@ -47,14 +47,14 @@ namespace DevourClient.Hacks
|
||||
|
||||
public static void WalkInLobby(bool walk)
|
||||
{
|
||||
GameObject LocalPlayer = Helpers.Entities.LocalPlayer_.p_GameObject;
|
||||
GameObject? LocalPlayer = Helpers.Entities.LocalPlayer_.p_GameObject;
|
||||
if (LocalPlayer == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//GetComponent called only once as AddComponent returns a component
|
||||
UltimateCharacterLocomotionHandler cmp = Helpers.Entities.LocalPlayer_.p_GameObject.GetComponent<UltimateCharacterLocomotionHandler>();
|
||||
UltimateCharacterLocomotionHandler? cmp = LocalPlayer.GetComponent<UltimateCharacterLocomotionHandler>();
|
||||
|
||||
if (cmp == null)
|
||||
{
|
||||
@@ -143,7 +143,7 @@ namespace DevourClient.Hacks
|
||||
return;
|
||||
}
|
||||
|
||||
GameObject _localPlayer = Helpers.Entities.LocalPlayer_.p_GameObject;
|
||||
GameObject? _localPlayer = Helpers.Entities.LocalPlayer_.p_GameObject;
|
||||
|
||||
if (_localPlayer != null)
|
||||
{
|
||||
@@ -174,7 +174,17 @@ namespace DevourClient.Hacks
|
||||
|
||||
public static void CarryObject(string name)
|
||||
{
|
||||
Il2Cpp.NolanBehaviour nb = Helpers.Entities.LocalPlayer_.p_GameObject.GetComponent<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);
|
||||
}
|
||||
@@ -203,11 +213,23 @@ namespace DevourClient.Hacks
|
||||
}
|
||||
public static void TPItems()
|
||||
{
|
||||
Il2Cpp.NolanBehaviour Nolan = Player.GetPlayer();
|
||||
|
||||
foreach (Il2Cpp.SurvivalInteractable item in Helpers.Entities.SurvivalInteractables)
|
||||
Il2Cpp.NolanBehaviour? Nolan = Player.GetPlayer();
|
||||
if (Nolan == null)
|
||||
{
|
||||
item.transform.position = Nolan.transform.position + Nolan.transform.forward * UnityEngine.Random.RandomRange(1f, 3f);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Helpers.Entities.SurvivalInteractables != null)
|
||||
{
|
||||
foreach (Il2Cpp.SurvivalInteractable? item in Helpers.Entities.SurvivalInteractables)
|
||||
{
|
||||
if (item == null || item.transform == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
item.transform.position = Nolan.transform.position + Nolan.transform.forward * UnityEngine.Random.RandomRange(1f, 3f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -298,7 +320,11 @@ namespace DevourClient.Hacks
|
||||
|
||||
public static void Fullbright(bool reset)
|
||||
{
|
||||
Il2Cpp.NolanBehaviour Nolan = Player.GetPlayer();
|
||||
Il2Cpp.NolanBehaviour? Nolan = Player.GetPlayer();
|
||||
if (Nolan == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (Nolan == null)
|
||||
{
|
||||
return;
|
||||
@@ -330,7 +356,11 @@ namespace DevourClient.Hacks
|
||||
}
|
||||
public static void FlashlightColor(Color color)
|
||||
{
|
||||
Il2Cpp.NolanBehaviour Nolan = Player.GetPlayer();
|
||||
Il2Cpp.NolanBehaviour? Nolan = Player.GetPlayer();
|
||||
if (Nolan == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Light flashlightSpot = Nolan.flashlightSpot;
|
||||
|
||||
flashlightSpot.color = color;
|
||||
@@ -339,7 +369,11 @@ namespace DevourClient.Hacks
|
||||
public static void TPKeys()
|
||||
{
|
||||
//TOFIX: spawn manually the missing key in slaughterhouse
|
||||
Il2Cpp.NolanBehaviour Nolan = Player.GetPlayer();
|
||||
Il2Cpp.NolanBehaviour? Nolan = Player.GetPlayer();
|
||||
if (Nolan == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (Il2Cpp.KeyBehaviour keyBehaviour in Helpers.Entities.Keys)
|
||||
{
|
||||
@@ -353,7 +387,7 @@ namespace DevourClient.Hacks
|
||||
|
||||
public static void SetRank(int rank)
|
||||
{
|
||||
Il2Cpp.NolanRankController NolanRank = UnityEngine.Object.FindObjectOfType<Il2Cpp.NolanRankController>();
|
||||
Il2Cpp.NolanRankController? NolanRank = UnityEngine.Object.FindObjectOfType<Il2Cpp.NolanRankController>();
|
||||
if (NolanRank == null)
|
||||
{
|
||||
return;
|
||||
@@ -364,77 +398,98 @@ namespace DevourClient.Hacks
|
||||
|
||||
public static void DespawnDemons()
|
||||
{
|
||||
foreach (Il2Cpp.SurvivalDemonBehaviour demon in Helpers.Entities.Demons)
|
||||
if (Helpers.Entities.Demons != null)
|
||||
{
|
||||
if (demon != null)
|
||||
foreach (Il2Cpp.SurvivalDemonBehaviour demon in Helpers.Entities.Demons)
|
||||
{
|
||||
demon.Despawn();
|
||||
if (demon != null)
|
||||
{
|
||||
demon.Despawn();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void DespawnSpiders()
|
||||
{
|
||||
foreach (Il2Cpp.SpiderBehaviour spider in Helpers.Entities.Spiders)
|
||||
if (Helpers.Entities.Spiders != null)
|
||||
{
|
||||
if (spider != null)
|
||||
foreach (Il2Cpp.SpiderBehaviour? spider in Helpers.Entities.Spiders)
|
||||
{
|
||||
spider.Despawn();
|
||||
if (spider != null)
|
||||
{
|
||||
spider.Despawn();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void DespawnGhosts()
|
||||
{
|
||||
foreach (Il2Cpp.GhostBehaviour ghost in Helpers.Entities.Ghosts)
|
||||
if (Helpers.Entities.Ghosts != null)
|
||||
{
|
||||
if (ghost != null)
|
||||
foreach (Il2Cpp.GhostBehaviour ghost in Helpers.Entities.Ghosts)
|
||||
{
|
||||
ghost.Despawn();
|
||||
if (ghost != null)
|
||||
{
|
||||
ghost.Despawn();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void DespawnBoars()
|
||||
{
|
||||
foreach (Il2Cpp.BoarBehaviour boar in Helpers.Entities.Boars)
|
||||
if (Helpers.Entities.Boars != null)
|
||||
{
|
||||
if (boar != null)
|
||||
foreach (Il2Cpp.BoarBehaviour boar in Helpers.Entities.Boars)
|
||||
{
|
||||
boar.Despawn();
|
||||
if (boar != null)
|
||||
{
|
||||
boar.Despawn();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void DespawnCorpses()
|
||||
{
|
||||
foreach (Il2Cpp.CorpseBehaviour corpse in Helpers.Entities.Corpses)
|
||||
if (Helpers.Entities.Corpses != null)
|
||||
{
|
||||
if (corpse != null)
|
||||
foreach (Il2Cpp.CorpseBehaviour corpse in Helpers.Entities.Corpses)
|
||||
{
|
||||
corpse.Despawn();
|
||||
if (corpse != null)
|
||||
{
|
||||
corpse.Despawn();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void DespawnCrows()
|
||||
{
|
||||
foreach (Il2Cpp.CrowBehaviour crow in Helpers.Entities.Crows)
|
||||
if (Helpers.Entities.Crows != null)
|
||||
{
|
||||
if (crow != null)
|
||||
foreach (Il2Cpp.CrowBehaviour? crow in Helpers.Entities.Crows)
|
||||
{
|
||||
crow.Despawn();
|
||||
if (crow != null)
|
||||
{
|
||||
crow.Despawn();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void DespawnLumps()
|
||||
{
|
||||
foreach (Il2Cpp.ManorLumpController lump in Helpers.Entities.Lumps)
|
||||
if (Helpers.Entities.Lumps != null)
|
||||
{
|
||||
if (lump != null)
|
||||
foreach (Il2Cpp.ManorLumpController lump in Helpers.Entities.Lumps)
|
||||
{
|
||||
lump.Dissolve();
|
||||
if (lump != null)
|
||||
{
|
||||
lump.Dissolve();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -504,6 +559,11 @@ namespace DevourClient.Hacks
|
||||
}
|
||||
}
|
||||
|
||||
public static void InstantInteractTick(bool enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
public static void FreezeAzazel()
|
||||
{
|
||||
if (Helpers.Map.GetActiveScene() == "Menu")
|
||||
|
||||
@@ -9,12 +9,12 @@ namespace DevourClient.Helpers
|
||||
private static float G;
|
||||
private static float B;
|
||||
|
||||
private static Texture2D previewTexture = null;
|
||||
private static Texture2D? previewTexture = null;
|
||||
private static Dictionary<Color, Texture2D> colorTextureCache = new Dictionary<Color, Texture2D>();
|
||||
private static Dictionary<int, Texture2D> circularTextureCache = new Dictionary<int, Texture2D>();
|
||||
|
||||
private static Color lastPreviewColor = Color.clear;
|
||||
private static GUIStyle cachedBoxStyle = null;
|
||||
private static GUIStyle? cachedBoxStyle = null;
|
||||
|
||||
public static Color ColorPick(string title, Color color)
|
||||
{
|
||||
@@ -59,7 +59,7 @@ namespace DevourClient.Helpers
|
||||
|
||||
public static Texture2D MakeTex(int width, int height, Color col)
|
||||
{
|
||||
if (colorTextureCache.TryGetValue(col, out Texture2D cachedTexture))
|
||||
if (colorTextureCache.TryGetValue(col, out Texture2D? cachedTexture))
|
||||
{
|
||||
if (cachedTexture != null)
|
||||
{
|
||||
@@ -85,7 +85,7 @@ namespace DevourClient.Helpers
|
||||
{
|
||||
int cacheKey = width;
|
||||
|
||||
if (circularTextureCache.TryGetValue(cacheKey, out Texture2D cachedTexture))
|
||||
if (circularTextureCache.TryGetValue(cacheKey, out Texture2D? cachedTexture))
|
||||
{
|
||||
if (cachedTexture != null)
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DevourClient.Helpers
|
||||
namespace DevourClient.Helpers
|
||||
{
|
||||
class Map
|
||||
{
|
||||
@@ -11,6 +11,7 @@
|
||||
{
|
||||
switch (sceneName)
|
||||
{
|
||||
case "Devour":
|
||||
case "Anna":
|
||||
return "Farmhouse";
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,20 +2,19 @@ using System;
|
||||
using DevourClient.Network;
|
||||
using MelonLoader;
|
||||
using UnityEngine;
|
||||
using Il2CppPhoton.Bolt;
|
||||
using Il2Cpp;
|
||||
using Il2CppOpsive.UltimateCharacterController.Character;
|
||||
|
||||
namespace DevourClient.Helpers
|
||||
{
|
||||
/// <summary>
|
||||
/// Shared revive utilities. When running as host we mirror DevourX's revive flow.
|
||||
/// </summary>
|
||||
// Shared revive utilities. When running as host we mirror DevourX's revive flow.
|
||||
public static class ReviveHelper
|
||||
{
|
||||
private static readonly Vector3 HostFallbackPosition = new Vector3(0f, -150f, 0f);
|
||||
|
||||
/// <summary>
|
||||
/// Try to revive the provided NolanBehaviour using host-specific logic first,
|
||||
/// then fall back to the standard interactable flow.
|
||||
/// </summary>
|
||||
// Try to revive the provided NolanBehaviour using host-specific logic first,
|
||||
// then fall back to the standard interactable flow.
|
||||
public static bool TryRevive(Il2Cpp.NolanBehaviour target)
|
||||
{
|
||||
if (target == null || target.gameObject == null)
|
||||
@@ -23,9 +22,19 @@ namespace DevourClient.Helpers
|
||||
return false;
|
||||
}
|
||||
|
||||
if (TryHostRevive(target))
|
||||
if (NetworkHelper.IsHost() && Player.IsInGame())
|
||||
{
|
||||
return true;
|
||||
if (TryHostRevive(target))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (TryClientRevive(target))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return TryInteractRevive(target);
|
||||
@@ -45,16 +54,70 @@ namespace DevourClient.Helpers
|
||||
|
||||
try
|
||||
{
|
||||
Il2Cpp.SurvivalReviveInteractable interactable = UnityEngine.Object.FindObjectOfType<Il2Cpp.SurvivalReviveInteractable>();
|
||||
if (interactable == null)
|
||||
var reviverEntity = GetLocalPlayerEntity();
|
||||
if (reviverEntity == null)
|
||||
{
|
||||
target.TeleportTo(HostFallbackPosition, Quaternion.identity);
|
||||
MelonLogger.Msg("[ReviveHelper] Host fallback teleport executed (no interactable found).");
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
interactable.Interact(target.gameObject);
|
||||
MelonLogger.Msg("[ReviveHelper] Host revive interactable triggered.");
|
||||
var targetEntity = target.entity;
|
||||
ReviveEvent.Post(GlobalTargets.Others, targetEntity, reviverEntity);
|
||||
|
||||
var survival = UnityEngine.Object.FindObjectOfType<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;
|
||||
}
|
||||
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)
|
||||
{
|
||||
try
|
||||
@@ -88,23 +177,54 @@ namespace DevourClient.Helpers
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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)
|
||||
private static BoltEntity? GetLocalPlayerEntity()
|
||||
{
|
||||
if (targetGameObject == null)
|
||||
var players = GameObject.FindGameObjectsWithTag("Player");
|
||||
for (int i = 0; i < players.Length; i++)
|
||||
{
|
||||
return;
|
||||
var nb = players[i].GetComponent<Il2Cpp.NolanBehaviour>();
|
||||
if (nb != null && nb.entity != null && nb.entity.IsAttached && nb.entity.IsOwner)
|
||||
{
|
||||
return nb.entity;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static void NotifySceneListeners(BoltEntity player, BoltEntity reviver)
|
||||
{
|
||||
foreach (var pet in UnityEngine.Object.FindObjectsOfType<Il2Cpp.PetController>())
|
||||
{
|
||||
pet.OnReviveEvent(player, reviver);
|
||||
}
|
||||
|
||||
Il2Cpp.NolanBehaviour nb = targetGameObject.GetComponent<Il2Cpp.NolanBehaviour>();
|
||||
Il2Cpp.SurvivalReviveInteractable _reviveInteractable = UnityEngine.Object.FindObjectOfType<Il2Cpp.SurvivalReviveInteractable>();
|
||||
foreach (var mgr in UnityEngine.Object.FindObjectsOfType<Il2Cpp.ReconnectManager>())
|
||||
{
|
||||
mgr.OnReviveEvent(player, reviver);
|
||||
}
|
||||
|
||||
if (_reviveInteractable.CanInteract(nb.gameObject) == true) { _reviveInteractable.Interact(nb.gameObject); }
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace DevourClient.Helpers
|
||||
{
|
||||
public class BasePlayer
|
||||
{
|
||||
public GameObject p_GameObject { get; set; } = default!;
|
||||
public GameObject? p_GameObject { get; set; } = default!;
|
||||
public string Name { get; set; } = default!;
|
||||
public string Id { get; set; } = default!;
|
||||
|
||||
@@ -121,6 +121,7 @@ namespace DevourClient.Helpers
|
||||
_azazelSam.OnShootPlayer(p_GameObject, true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public class Player
|
||||
{
|
||||
@@ -164,22 +165,22 @@ namespace DevourClient.Helpers
|
||||
public static int MAX_PLAYERS = 4; //will change by calling CreateCustomizedLobby
|
||||
|
||||
public static BasePlayer LocalPlayer_ = new BasePlayer();
|
||||
public static BasePlayer[] Players = default!;
|
||||
public static Il2Cpp.GoatBehaviour[] GoatsAndRats = default!;
|
||||
public static Il2Cpp.SurvivalInteractable[] SurvivalInteractables = default!;
|
||||
public static Il2Cpp.KeyBehaviour[] Keys = default!;
|
||||
public static Il2Cpp.SurvivalDemonBehaviour[] Demons = default!;
|
||||
public static Il2Cpp.SpiderBehaviour[] Spiders = default!;
|
||||
public static Il2Cpp.GhostBehaviour[] Ghosts = default!;
|
||||
public static Il2Cpp.SurvivalAzazelBehaviour[] Azazels = default!;
|
||||
public static Il2Cpp.BoarBehaviour[] Boars = default!;
|
||||
public static Il2Cpp.CorpseBehaviour[] Corpses = default!;
|
||||
public static Il2Cpp.CrowBehaviour[] Crows = default!;
|
||||
public static Il2Cpp.ManorLumpController[] Lumps = default!;
|
||||
public static Il2Cpp.GoatBehaviour[] DirtyHeads = default!;
|
||||
public static Il2Cpp.MonkeyBehaviour[] Monkeys = default!;
|
||||
public static Il2Cpp.GoatBehaviour[] Dolls = default!;
|
||||
public static Il2Cpp.CollectableInteractable[] Collectables = default!;
|
||||
public static BasePlayer[]? Players = default!;
|
||||
public static Il2Cpp.GoatBehaviour[]? GoatsAndRats = default!;
|
||||
public static Il2Cpp.SurvivalInteractable[]? SurvivalInteractables = default!;
|
||||
public static Il2Cpp.KeyBehaviour[]? Keys = default!;
|
||||
public static Il2Cpp.SurvivalDemonBehaviour[]? Demons = default!;
|
||||
public static Il2Cpp.SpiderBehaviour[]? Spiders = default!;
|
||||
public static Il2Cpp.GhostBehaviour[]? Ghosts = default!;
|
||||
public static Il2Cpp.SurvivalAzazelBehaviour[]? Azazels = default!;
|
||||
public static Il2Cpp.BoarBehaviour[]? Boars = default!;
|
||||
public static Il2Cpp.CorpseBehaviour[]? Corpses = default!;
|
||||
public static Il2Cpp.CrowBehaviour[]? Crows = default!;
|
||||
public static Il2Cpp.ManorLumpController[]? Lumps = default!;
|
||||
public static Il2Cpp.GoatBehaviour[]? DirtyHeads = default!;
|
||||
public static Il2Cpp.MonkeyBehaviour[]? Monkeys = default!;
|
||||
public static Il2Cpp.GoatBehaviour[]? Dolls = default!;
|
||||
public static Il2Cpp.CollectableInteractable[]? Collectables = default!;
|
||||
|
||||
// Coroutine lifecycle management
|
||||
private static List<object> activeCoroutines = new List<object>();
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
using HarmonyLib;
|
||||
using HarmonyLib;
|
||||
using Il2Cpp;
|
||||
using UnityEngine;
|
||||
using System;
|
||||
|
||||
namespace DevourClient.Hooks
|
||||
{
|
||||
@@ -17,8 +19,10 @@ namespace DevourClient.Hooks
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
[HarmonyPatch(typeof(Il2Cpp.RankHelpers))]
|
||||
[HarmonyPatch(nameof(Il2Cpp.RankHelpers.CalculateExpGain))] //annotation boiler plate to tell Harmony what to patch. Refer to docs.
|
||||
static class RankHelpers_CalculateExpGain
|
||||
@@ -128,5 +132,20 @@ namespace DevourClient.Hooks
|
||||
__result = false;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(Il2Cpp.DevourInput))]
|
||||
[HarmonyPatch(nameof(Il2Cpp.DevourInput.GetLongPress))]
|
||||
static class DevourInput_GetLongPress_Patch
|
||||
{
|
||||
static bool Prefix(ref bool __result, string name, ref float duration, bool waitForRelease)
|
||||
{
|
||||
if (!DevourClient.ClientMain.InstantInteractionEnabled)
|
||||
return true;
|
||||
duration = 0.05f;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,8 +108,8 @@ namespace DevourClient.Localization
|
||||
// Keep AddTranslation method for backward compatibility (used by AddCustomTranslation)
|
||||
|
||||
private static void AddTranslation(string english,
|
||||
string cn = null, string fr = null, string de = null, string es = null,
|
||||
string ja = null, string ko = null, string ru = null, string pt = null, string it = null, string vi = null)
|
||||
string? cn = null, string? fr = null, string? de = null, string? es = null,
|
||||
string? ja = null, string? ko = null, string? ru = null, string? pt = null, string? it = null, string? vi = null)
|
||||
{
|
||||
var translations = new Dictionary<Language, string>
|
||||
{
|
||||
|
||||
@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Ping", "延迟" },
|
||||
{ "Play Random Sound", "播放随机音效" },
|
||||
{ "Player", "玩家" },
|
||||
{ "Instant Interaction", "立即交互" },
|
||||
{ "Player Count", "玩家数" },
|
||||
{ "Player ESP", "玩家透视" },
|
||||
{ "Player ESP Color", "玩家透视颜色" },
|
||||
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Rat ESP", "老鼠透视" },
|
||||
{ "Region", "区域" },
|
||||
{ "Revive", "复活" },
|
||||
{ "Radial Menu", "轮盘菜单" },
|
||||
{ "Ritual Book", "仪式书" },
|
||||
{ "Rose", "玫瑰" },
|
||||
{ "Ritual Book ESP", "仪式书透视" },
|
||||
{ "Ritual Object ESP", "仪式物品透视" },
|
||||
{ "Ritual Objects", "仪式物品" },
|
||||
{ "RitualBook", "仪式书" },
|
||||
{ "Roar ESP", "咆哮者透视" },
|
||||
{ "Boar ESP", "野猪透视" },
|
||||
{ "Role", "角色" },
|
||||
{ "RottenFood", "腐烂食物" },
|
||||
{ "Rotton Food ESP", "腐烂食物透视" },
|
||||
{ "Rotten Food ESP", "腐烂食物透视" },
|
||||
{ "Sam", "萨姆" },
|
||||
{ "Shoot Player", "射击玩家" },
|
||||
{ "Show Coordinates", "显示坐标" },
|
||||
{ "Skeleton ESP", "骨骼透视" },
|
||||
{ "Slaughterhouse", "屠宰场" },
|
||||
{ "SlaughterhouseFireEscapeDoor", "屠宰场消防门" },
|
||||
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
|
||||
{ "TV", "电视" },
|
||||
{ "Teleport Keys", "传送钥匙" },
|
||||
{ "Teleport to", "传送至" },
|
||||
{ "TP Base", "传送至基地" },
|
||||
{ "TP Altar", "传送至祭坛" },
|
||||
{ "TP Basin", "传送至水池" },
|
||||
{ "TP Fountain", "传送至喷泉" },
|
||||
{ "Ticket", "票券" },
|
||||
{ "Town", "小镇" },
|
||||
{ "TownDoor", "小镇门" },
|
||||
@@ -268,10 +275,22 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Unlimited UV Light", "无限紫外线" },
|
||||
{ "Unlock Achievements", "解锁成就" },
|
||||
{ "Unlock Doors", "解锁门" },
|
||||
{ "God Mode", "上帝模式" },
|
||||
{ "Visuals", "视觉" },
|
||||
{ "Waiting for the game to start", "等待游戏开始" },
|
||||
{ "Walk In Lobby", "大厅行走" },
|
||||
{ "Zara", "扎拉" },
|
||||
{ "Gardener", "园丁" },
|
||||
{ "Butler", "管家" },
|
||||
{ "Bridesmaid 1", "伴娘 1" },
|
||||
{ "Bridesmaid 2", "伴娘 2" },
|
||||
{ "Cook", "厨师" },
|
||||
{ "Groomsman 1", "伴郎 1" },
|
||||
{ "Groomsman 2", "伴郎 2" },
|
||||
{ "Maid", "女仆" },
|
||||
{ "Photographer", "摄影师" },
|
||||
{ "Priest", "牧师" },
|
||||
{ "Menu Key", "菜单键" },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Ping", "Ping" },
|
||||
{ "Play Random Sound", "Play Random Sound" },
|
||||
{ "Player", "Player" },
|
||||
{ "Instant Interaction", "Instant Interaction" },
|
||||
{ "Player Count", "Player Count" },
|
||||
{ "Player ESP", "Player ESP" },
|
||||
{ "Player ESP Color", "Player ESP Color" },
|
||||
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Rat ESP", "Rat ESP" },
|
||||
{ "Region", "Region" },
|
||||
{ "Revive", "Revive" },
|
||||
{ "Radial Menu", "Radial Menu" },
|
||||
{ "Ritual Book", "Ritual Book" },
|
||||
{ "Rose", "Rose" },
|
||||
{ "Ritual Book ESP", "Ritual Book ESP" },
|
||||
{ "Ritual Object ESP", "Ritual Object ESP" },
|
||||
{ "Ritual Objects", "Ritual Objects" },
|
||||
{ "RitualBook", "RitualBook" },
|
||||
{ "Roar ESP", "Roar ESP" },
|
||||
{ "Boar ESP", "Boar ESP" },
|
||||
{ "Role", "Role" },
|
||||
{ "RottenFood", "RottenFood" },
|
||||
{ "Rotton Food ESP", "Rotton Food ESP" },
|
||||
{ "Rotten Food ESP", "Rotten Food ESP" },
|
||||
{ "Sam", "Sam" },
|
||||
{ "Shoot Player", "Shoot Player" },
|
||||
{ "Show Coordinates", "Show Coordinates" },
|
||||
{ "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 Base" },
|
||||
{ "TP Altar", "TP Altar" },
|
||||
{ "TP Basin", "TP Basin" },
|
||||
{ "TP Fountain", "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", "God Mode" },
|
||||
{ "Visuals", "Visuals" },
|
||||
{ "Waiting for the game to start", "Waiting for the game to start" },
|
||||
{ "Walk In Lobby", "Walk In Lobby" },
|
||||
{ "Zara", "Zara" },
|
||||
{ "Gardener", "Gardener" },
|
||||
{ "Butler", "Butler" },
|
||||
{ "Bridesmaid 1", "Bridesmaid 1" },
|
||||
{ "Bridesmaid 2", "Bridesmaid 2" },
|
||||
{ "Cook", "Cook" },
|
||||
{ "Groomsman 1", "Groomsman 1" },
|
||||
{ "Groomsman 2", "Groomsman 2" },
|
||||
{ "Maid", "Maid" },
|
||||
{ "Photographer", "Photographer" },
|
||||
{ "Priest", "Priest" },
|
||||
{ "Menu Key", "Menu Key" },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Ping", "Ping" },
|
||||
{ "Play Random Sound", "Jouer son aléatoire" },
|
||||
{ "Player", "Joueur" },
|
||||
{ "Instant Interaction", "Interaction instantanée" },
|
||||
{ "Player Count", "Nombre de joueurs" },
|
||||
{ "Player ESP", "ESP joueur" },
|
||||
{ "Player ESP Color", "Couleur ESP joueur" },
|
||||
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Rat ESP", "ESP rat" },
|
||||
{ "Region", "Région" },
|
||||
{ "Revive", "Réanimer" },
|
||||
{ "Radial Menu", "Menu radial" },
|
||||
{ "Ritual Book", "Livre rituel" },
|
||||
{ "Rose", "Rose" },
|
||||
{ "Ritual Book ESP", "ESP livre rituel" },
|
||||
{ "Ritual Object ESP", "ESP objet rituel" },
|
||||
{ "Ritual Objects", "Objets rituels" },
|
||||
{ "RitualBook", "Livre rituel" },
|
||||
{ "Roar ESP", "ESP rugissement" },
|
||||
{ "Boar ESP", "ESP Sanglier" },
|
||||
{ "Role", "Rôle" },
|
||||
{ "RottenFood", "Nourriture pourrie" },
|
||||
{ "Rotton Food ESP", "ESP nourriture pourrie" },
|
||||
{ "Rotten Food ESP", "ESP Nourriture Pourrie" },
|
||||
{ "Sam", "Sam" },
|
||||
{ "Shoot Player", "Tirer sur le joueur" },
|
||||
{ "Show Coordinates", "Afficher coordonnées" },
|
||||
{ "Skeleton ESP", "ESP squelette" },
|
||||
{ "Slaughterhouse", "Abattoir" },
|
||||
{ "SlaughterhouseFireEscapeDoor", "Porte de secours d'abattoir" },
|
||||
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
|
||||
{ "TV", "Télévision" },
|
||||
{ "Teleport Keys", "Téléporter clés" },
|
||||
{ "Teleport to", "Téléporter" },
|
||||
{ "TP Base", "TP base" },
|
||||
{ "TP Altar", "TP autel" },
|
||||
{ "TP Basin", "TP bassin" },
|
||||
{ "TP Fountain", "TP fontaine" },
|
||||
{ "Ticket", "Billet" },
|
||||
{ "Town", "Ville" },
|
||||
{ "TownDoor", "Porte de ville" },
|
||||
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
|
||||
{ "US South Central", "Centre-Sud des États-Unis" },
|
||||
{ "US West", "Ouest des États-Unis" },
|
||||
{ "Unlimited Stamina", "Endurance illimitée" },
|
||||
{ "Unlimited UV Light", "UV illimitée" },
|
||||
{ "Unlimited UV Light", "UV illimité" },
|
||||
{ "Unlock Achievements", "Débloquer succès" },
|
||||
{ "Unlock Doors", "Déverrouiller portes" },
|
||||
{ "God Mode", "Mode Dieu" },
|
||||
{ "Visuals", "Visuels" },
|
||||
{ "Waiting for the game to start", "En attente du démarrage" },
|
||||
{ "Waiting for the game to start", "En attente du début de la partie" },
|
||||
{ "Walk In Lobby", "Marcher dans le lobby" },
|
||||
{ "Zara", "Zara" },
|
||||
{ "Bridesmaid 1", "Demoiselle d'honneur 1" },
|
||||
{ "Bridesmaid 2", "Demoiselle d'honneur 2" },
|
||||
{ "Butler", "Majordome" },
|
||||
{ "Cook", "Cuisinier" },
|
||||
{ "Gardener", "Jardinier" },
|
||||
{ "Groomsman 1", "Garçon d'honneur 1" },
|
||||
{ "Groomsman 2", "Garçon d'honneur 2" },
|
||||
{ "Maid", "Domestique" },
|
||||
{ "Photographer", "Photographe" },
|
||||
{ "Priest", "Prêtre" },
|
||||
{ "Menu Key", "Touche Menu" },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Ping", "Ping" },
|
||||
{ "Play Random Sound", "Zufälligen Sound abspielen" },
|
||||
{ "Player", "Spieler" },
|
||||
{ "Instant Interaction", "Sofortige Interaktion" },
|
||||
{ "Player Count", "Spieleranzahl" },
|
||||
{ "Player ESP", "Spieler ESP" },
|
||||
{ "Player ESP Color", "Spieler ESP Farbe" },
|
||||
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Rat ESP", "Ratte-ESP" },
|
||||
{ "Region", "Region" },
|
||||
{ "Revive", "Wiederbeleben" },
|
||||
{ "Radial Menu", "Radiales Menü" },
|
||||
{ "Ritual Book", "Ritualbuch" },
|
||||
{ "Rose", "Rose" },
|
||||
{ "Ritual Book ESP", "Ritualbuch-ESP" },
|
||||
{ "Ritual Object ESP", "Ritualobjekt ESP" },
|
||||
{ "Ritual Objects", "Rituelle Objekte" },
|
||||
{ "RitualBook", "Ritualbuch" },
|
||||
{ "Roar ESP", "Brüllen-ESP" },
|
||||
{ "Boar ESP", "Wildschwein-ESP" },
|
||||
{ "Role", "Rolle" },
|
||||
{ "RottenFood", "Verdorbenes Essen" },
|
||||
{ "Rotton Food ESP", "Verdorbenes-Essen-ESP" },
|
||||
{ "Rotten Food ESP", "Verrottetes Essen ESP" },
|
||||
{ "Sam", "Sam" },
|
||||
{ "Shoot Player", "Spieler erschießen" },
|
||||
{ "Show Coordinates", "Koordinaten anzeigen" },
|
||||
{ "Skeleton ESP", "Skelett ESP" },
|
||||
{ "Slaughterhouse", "Schlachthaus" },
|
||||
{ "SlaughterhouseFireEscapeDoor", "Schlachthof-Feuerschutztür" },
|
||||
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
|
||||
{ "TV", "Fernseher" },
|
||||
{ "Teleport Keys", "Schlüssel teleportieren" },
|
||||
{ "Teleport to", "Teleportieren" },
|
||||
{ "TP Base", "TP Basis" },
|
||||
{ "TP Altar", "TP Altar" },
|
||||
{ "TP Basin", "TP Becken" },
|
||||
{ "TP Fountain", "TP Brunnen" },
|
||||
{ "Ticket", "Ticket" },
|
||||
{ "Town", "Stadt" },
|
||||
{ "TownDoor", "Stadttür" },
|
||||
@@ -264,14 +271,26 @@ namespace DevourClient.Localization.Translations
|
||||
{ "US East", "USA Ost" },
|
||||
{ "US South Central", "USA Süd-Zentral" },
|
||||
{ "US West", "USA West" },
|
||||
{ "Unlimited Stamina", "Unbegrenzte Ausdauer" },
|
||||
{ "Unlimited UV Light", "Unbegrenzte UV" },
|
||||
{ "Unlimited Stamina", "Unendliche Ausdauer" },
|
||||
{ "Unlimited UV Light", "Unendliches UV-Licht" },
|
||||
{ "Unlock Achievements", "Erfolge freischalten" },
|
||||
{ "Unlock Doors", "Türen öffnen" },
|
||||
{ "God Mode", "Gottmodus" },
|
||||
{ "Visuals", "Visuals" },
|
||||
{ "Waiting for the game to start", "Warte auf Spielstart" },
|
||||
{ "Walk In Lobby", "Im Lobby laufen" },
|
||||
{ "Zara", "Zara" },
|
||||
{ "Bridesmaid 1", "Brautjungfer 1" },
|
||||
{ "Bridesmaid 2", "Brautjungfer 2" },
|
||||
{ "Butler", "Butler" },
|
||||
{ "Cook", "Koch" },
|
||||
{ "Gardener", "Gärtner" },
|
||||
{ "Groomsman 1", "Trauzeuge 1" },
|
||||
{ "Groomsman 2", "Trauzeuge 2" },
|
||||
{ "Maid", "Dienstmädchen" },
|
||||
{ "Photographer", "Fotograf" },
|
||||
{ "Priest", "Priester" },
|
||||
{ "Menu Key", "Menütaste" },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Ping", "Ping" },
|
||||
{ "Play Random Sound", "Riproduci suono casuale" },
|
||||
{ "Player", "Giocatore" },
|
||||
{ "Instant Interaction", "Interazione istantanea" },
|
||||
{ "Player Count", "Numero di giocatori" },
|
||||
{ "Player ESP", "ESP giocatore" },
|
||||
{ "Player ESP Color", "Colore ESP giocatore" },
|
||||
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Rat ESP", "ESP ratto" },
|
||||
{ "Region", "Regione" },
|
||||
{ "Revive", "Rianima" },
|
||||
{ "Radial Menu", "Menu radiale" },
|
||||
{ "Ritual Book", "Libro rituale" },
|
||||
{ "Rose", "Rosa" },
|
||||
{ "Ritual Book ESP", "ESP libro rituale" },
|
||||
{ "Ritual Object ESP", "ESP oggetto rituale" },
|
||||
{ "Ritual Objects", "Oggetti rituali" },
|
||||
{ "RitualBook", "Libro rituale" },
|
||||
{ "Roar ESP", "ESP ruggito" },
|
||||
{ "Boar ESP", "ESP Cinghiale" },
|
||||
{ "Role", "Ruolo" },
|
||||
{ "RottenFood", "Cibo marcio" },
|
||||
{ "Rotton Food ESP", "ESP cibo marcio" },
|
||||
{ "Rotten Food ESP", "ESP Cibo Avariato" },
|
||||
{ "Sam", "Sam" },
|
||||
{ "Shoot Player", "Spara al giocatore" },
|
||||
{ "Show Coordinates", "Mostra coordinate" },
|
||||
{ "Skeleton ESP", "ESP scheletro" },
|
||||
{ "Slaughterhouse", "Macello" },
|
||||
{ "SlaughterhouseFireEscapeDoor", "Porta antincendio del mattatoio" },
|
||||
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
|
||||
{ "TV", "Televisione" },
|
||||
{ "Teleport Keys", "Teletrasporta chiavi" },
|
||||
{ "Teleport to", "Teletrasporta" },
|
||||
{ "TP Base", "TP Base" },
|
||||
{ "TP Altar", "TP Altare" },
|
||||
{ "TP Basin", "TP Bacino" },
|
||||
{ "TP Fountain", "TP Fontana" },
|
||||
{ "Ticket", "Biglietto" },
|
||||
{ "Town", "Città" },
|
||||
{ "TownDoor", "Porta della città" },
|
||||
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
|
||||
{ "US South Central", "Centro-Sud USA" },
|
||||
{ "US West", "Ovest USA" },
|
||||
{ "Unlimited Stamina", "Resistenza illimitata" },
|
||||
{ "Unlimited UV Light", "UV illimitata" },
|
||||
{ "Unlimited UV Light", "UV illimitato" },
|
||||
{ "Unlock Achievements", "Sblocca obiettivi" },
|
||||
{ "Unlock Doors", "Sblocca porte" },
|
||||
{ "Visuals", "Visivi" },
|
||||
{ "Waiting for the game to start", "In attesa dell'inizio del gioco" },
|
||||
{ "Walk In Lobby", "Camminare in lobby" },
|
||||
{ "God Mode", "Modalità Dio" },
|
||||
{ "Visuals", "Visuali" },
|
||||
{ "Waiting for the game to start", "In attesa dell'inizio della partita" },
|
||||
{ "Walk In Lobby", "Cammina nel lobby" },
|
||||
{ "Zara", "Zara" },
|
||||
{ "Bridesmaid 1", "Damigella 1" },
|
||||
{ "Bridesmaid 2", "Damigella 2" },
|
||||
{ "Butler", "Maggiordomo" },
|
||||
{ "Cook", "Cuoco" },
|
||||
{ "Gardener", "Giardiniere" },
|
||||
{ "Groomsman 1", "Testimone 1" },
|
||||
{ "Groomsman 2", "Testimone 2" },
|
||||
{ "Maid", "Cameriera" },
|
||||
{ "Photographer", "Fotografo" },
|
||||
{ "Priest", "Prete" },
|
||||
{ "Menu Key", "Tasto Menu" },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Ping", "Ping" },
|
||||
{ "Play Random Sound", "ランダム音再生" },
|
||||
{ "Player", "プレイヤー" },
|
||||
{ "Instant Interaction", "即時インタラクション" },
|
||||
{ "Player Count", "プレイヤー数" },
|
||||
{ "Player ESP", "プレイヤーESP" },
|
||||
{ "Player ESP Color", "プレイヤーESP色" },
|
||||
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Rat ESP", "ネズミESP" },
|
||||
{ "Region", "地域" },
|
||||
{ "Revive", "蘇生" },
|
||||
{ "Radial Menu", "ラジアルメニュー" },
|
||||
{ "Ritual Book", "儀式の本" },
|
||||
{ "Rose", "バラ" },
|
||||
{ "Ritual Book ESP", "儀式の本ESP" },
|
||||
{ "Ritual Object ESP", "儀式オブジェクトESP" },
|
||||
{ "Ritual Objects", "儀式の品" },
|
||||
{ "RitualBook", "儀式の本" },
|
||||
{ "Roar ESP", "咆哮ESP" },
|
||||
{ "Boar ESP", "イノシシESP" },
|
||||
{ "Role", "役割" },
|
||||
{ "RottenFood", "腐った食べ物" },
|
||||
{ "Rotton Food ESP", "腐った食べ物ESP" },
|
||||
{ "Rotten Food ESP", "腐った食べ物ESP" },
|
||||
{ "Sam", "サム" },
|
||||
{ "Shoot Player", "プレイヤーを撃つ" },
|
||||
{ "Show Coordinates", "座標を表示" },
|
||||
{ "Skeleton ESP", "スケルトンESP" },
|
||||
{ "Slaughterhouse", "屠殺場" },
|
||||
{ "SlaughterhouseFireEscapeDoor", "屠殺場の非常口" },
|
||||
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
|
||||
{ "TV", "テレビ" },
|
||||
{ "Teleport Keys", "鍵をテレポート" },
|
||||
{ "Teleport to", "テレポート" },
|
||||
{ "TP Base", "ベースTP" },
|
||||
{ "TP Altar", "祭壇TP" },
|
||||
{ "TP Basin", "水盤TP" },
|
||||
{ "TP Fountain", "噴水TP" },
|
||||
{ "Ticket", "チケット" },
|
||||
{ "Town", "町" },
|
||||
{ "TownDoor", "町のドア" },
|
||||
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
|
||||
{ "US South Central", "米国中南部" },
|
||||
{ "US West", "米国西部" },
|
||||
{ "Unlimited Stamina", "無限スタミナ" },
|
||||
{ "Unlimited UV Light", "無限UV" },
|
||||
{ "Unlock Achievements", "実績解除" },
|
||||
{ "Unlock Doors", "ドアを開ける" },
|
||||
{ "Unlimited UV Light", "無制限UV" },
|
||||
{ "Unlock Achievements", "実績の解除" },
|
||||
{ "Unlock Doors", "ドアの解除" },
|
||||
{ "God Mode", "神モード" },
|
||||
{ "Visuals", "ビジュアル" },
|
||||
{ "Waiting for the game to start", "ゲーム開始を待っています" },
|
||||
{ "Walk In Lobby", "ロビーで歩く" },
|
||||
{ "Zara", "ザラ" },
|
||||
{ "Bridesmaid 1", "ブライズメイド 1" },
|
||||
{ "Bridesmaid 2", "ブライズメイド 2" },
|
||||
{ "Butler", "執事" },
|
||||
{ "Cook", "料理人" },
|
||||
{ "Gardener", "庭師" },
|
||||
{ "Groomsman 1", "グルームズマン 1" },
|
||||
{ "Groomsman 2", "グルームズマン 2" },
|
||||
{ "Maid", "メイド" },
|
||||
{ "Photographer", "写真家" },
|
||||
{ "Priest", "司祭" },
|
||||
{ "Menu Key", "メニューキー" },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Ping", "핑" },
|
||||
{ "Play Random Sound", "랜덤 사운드 재생" },
|
||||
{ "Player", "플레이어" },
|
||||
{ "Instant Interaction", "즉시 상호작용" },
|
||||
{ "Player Count", "플레이어 수" },
|
||||
{ "Player ESP", "플레이어 ESP" },
|
||||
{ "Player ESP Color", "플레이어 ESP 색상" },
|
||||
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Rat ESP", "쥐 ESP" },
|
||||
{ "Region", "지역" },
|
||||
{ "Revive", "부활" },
|
||||
{ "Radial Menu", "방사형 메뉴" },
|
||||
{ "Ritual Book", "의식서" },
|
||||
{ "Rose", "장미" },
|
||||
{ "Ritual Book ESP", "의식서 ESP" },
|
||||
{ "Ritual Object ESP", "의식 물체 ESP" },
|
||||
{ "Ritual Objects", "의식 물품" },
|
||||
{ "RitualBook", "의식서" },
|
||||
{ "Roar ESP", "으르렁 ESP" },
|
||||
{ "Boar ESP", "멧돼지 ESP" },
|
||||
{ "Role", "역할" },
|
||||
{ "RottenFood", "썩은 음식" },
|
||||
{ "Rotton Food ESP", "썩은 음식 ESP" },
|
||||
{ "Rotten Food ESP", "썩은 음식 ESP" },
|
||||
{ "Sam", "샘" },
|
||||
{ "Shoot Player", "플레이어 쏘기" },
|
||||
{ "Show Coordinates", "좌표 표시" },
|
||||
{ "Skeleton ESP", "스켈레톤 ESP" },
|
||||
{ "Slaughterhouse", "도살장" },
|
||||
{ "SlaughterhouseFireEscapeDoor", "도축장 비상구" },
|
||||
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
|
||||
{ "TV", "TV" },
|
||||
{ "Teleport Keys", "열쇠 텔레포트" },
|
||||
{ "Teleport to", "텔레포트" },
|
||||
{ "TP Base", "기지 TP" },
|
||||
{ "TP Altar", "제단 TP" },
|
||||
{ "TP Basin", "대야 TP" },
|
||||
{ "TP Fountain", "분수 TP" },
|
||||
{ "Ticket", "티켓" },
|
||||
{ "Town", "마을" },
|
||||
{ "TownDoor", "마을 문" },
|
||||
@@ -268,10 +275,22 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Unlimited UV Light", "무제한 UV" },
|
||||
{ "Unlock Achievements", "업적 잠금 해제" },
|
||||
{ "Unlock Doors", "문 잠금 해제" },
|
||||
{ "God Mode", "신 모드" },
|
||||
{ "Visuals", "비주얼" },
|
||||
{ "Waiting for the game to start", "게임 시작 대기 중" },
|
||||
{ "Walk In Lobby", "로비에서 걷기" },
|
||||
{ "Zara", "자라" },
|
||||
{ "Bridesmaid 1", "신부 들러리 1" },
|
||||
{ "Bridesmaid 2", "신부 들러리 2" },
|
||||
{ "Butler", "집사" },
|
||||
{ "Cook", "요리사" },
|
||||
{ "Gardener", "정원사" },
|
||||
{ "Groomsman 1", "신랑 들러리 1" },
|
||||
{ "Groomsman 2", "신랑 들러리 2" },
|
||||
{ "Maid", "하녀" },
|
||||
{ "Photographer", "사진가" },
|
||||
{ "Priest", "사제" },
|
||||
{ "Menu Key", "메뉴 키" },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Ping", "Ping" },
|
||||
{ "Play Random Sound", "Reproduzir som aleatório" },
|
||||
{ "Player", "Jogador" },
|
||||
{ "Instant Interaction", "Interação instantânea" },
|
||||
{ "Player Count", "Número de jogadores" },
|
||||
{ "Player ESP", "ESP jogador" },
|
||||
{ "Player ESP Color", "Cor ESP jogador" },
|
||||
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Rat ESP", "ESP rato" },
|
||||
{ "Region", "Região" },
|
||||
{ "Revive", "Reviver" },
|
||||
{ "Radial Menu", "Menu radial" },
|
||||
{ "Ritual Book", "Livro ritual" },
|
||||
{ "Rose", "Rosa" },
|
||||
{ "Ritual Book ESP", "ESP livro ritual" },
|
||||
{ "Ritual Object ESP", "ESP objeto ritual" },
|
||||
{ "Ritual Objects", "Objetos rituais" },
|
||||
{ "RitualBook", "Livro ritual" },
|
||||
{ "Roar ESP", "ESP rugido" },
|
||||
{ "Boar ESP", "ESP Javali" },
|
||||
{ "Role", "Função" },
|
||||
{ "RottenFood", "Comida podre" },
|
||||
{ "Rotton Food ESP", "ESP comida podre" },
|
||||
{ "Rotten Food ESP", "ESP comida podre" },
|
||||
{ "Sam", "Sam" },
|
||||
{ "Shoot Player", "Atirar no jogador" },
|
||||
{ "Show Coordinates", "Mostrar coordenadas" },
|
||||
{ "Skeleton ESP", "ESP esqueleto" },
|
||||
{ "Slaughterhouse", "Matadouro" },
|
||||
{ "SlaughterhouseFireEscapeDoor", "Porta de incêndio do matadouro" },
|
||||
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
|
||||
{ "TV", "Televisão" },
|
||||
{ "Teleport Keys", "Teletransportar chaves" },
|
||||
{ "Teleport to", "Teletransportar" },
|
||||
{ "TP Base", "TP base" },
|
||||
{ "TP Altar", "TP altar" },
|
||||
{ "TP Basin", "TP bacia" },
|
||||
{ "TP Fountain", "TP fonte" },
|
||||
{ "Ticket", "Bilhete" },
|
||||
{ "Town", "Cidade" },
|
||||
{ "TownDoor", "Porta da cidade" },
|
||||
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
|
||||
{ "US South Central", "Centro-Sul dos EUA" },
|
||||
{ "US West", "Oeste dos EUA" },
|
||||
{ "Unlimited Stamina", "Resistência ilimitada" },
|
||||
{ "Unlimited UV Light", "UV ilimitada" },
|
||||
{ "Unlimited UV Light", "UV ilimitado" },
|
||||
{ "Unlock Achievements", "Desbloquear conquistas" },
|
||||
{ "Unlock Doors", "Desbloquear portas" },
|
||||
{ "God Mode", "Modo Deus" },
|
||||
{ "Visuals", "Visuais" },
|
||||
{ "Waiting for the game to start", "Aguardando início do jogo" },
|
||||
{ "Walk In Lobby", "Andar no lobby" },
|
||||
{ "Zara", "Zara" },
|
||||
{ "Bridesmaid 1", "Dama de honra 1" },
|
||||
{ "Bridesmaid 2", "Dama de honra 2" },
|
||||
{ "Butler", "Mordomo" },
|
||||
{ "Cook", "Cozinheiro" },
|
||||
{ "Gardener", "Jardineiro" },
|
||||
{ "Groomsman 1", "Padrinho 1" },
|
||||
{ "Groomsman 2", "Padrinho 2" },
|
||||
{ "Maid", "Empregada" },
|
||||
{ "Photographer", "Fotógrafo" },
|
||||
{ "Priest", "Padre" },
|
||||
{ "Menu Key", "Tecla de Menu" },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Ping", "Пинг" },
|
||||
{ "Play Random Sound", "Воспроизвести случайный звук" },
|
||||
{ "Player", "Игрок" },
|
||||
{ "Instant Interaction", "Мгновенное взаимодействие" },
|
||||
{ "Player Count", "Количество игроков" },
|
||||
{ "Player ESP", "ESP игрока" },
|
||||
{ "Player ESP Color", "Цвет ESP игрока" },
|
||||
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Rat ESP", "ESP крысы" },
|
||||
{ "Region", "Регион" },
|
||||
{ "Revive", "Воскресить" },
|
||||
{ "Radial Menu", "Радиальное меню" },
|
||||
{ "Ritual Book", "Ритуальная книга" },
|
||||
{ "Rose", "Роза" },
|
||||
{ "Ritual Book ESP", "ESP ритуальной книги" },
|
||||
{ "Ritual Object ESP", "ESP ритуального предмета" },
|
||||
{ "Ritual Objects", "Ритуальные предметы" },
|
||||
{ "RitualBook", "Ритуальная книга" },
|
||||
{ "Roar ESP", "ESP рёва" },
|
||||
{ "Boar ESP", "ESP Кабана" },
|
||||
{ "Role", "Роль" },
|
||||
{ "RottenFood", "Гнилая еда" },
|
||||
{ "Rotton Food ESP", "ESP гнилой еды" },
|
||||
{ "Rotten Food ESP", "ESP Гнилая Еда" },
|
||||
{ "Sam", "Сэм" },
|
||||
{ "Shoot Player", "Стрелять в игрока" },
|
||||
{ "Show Coordinates", "Показать координаты" },
|
||||
{ "Skeleton ESP", "ESP скелета" },
|
||||
{ "Slaughterhouse", "Бойня" },
|
||||
{ "SlaughterhouseFireEscapeDoor", "Пожарная дверь бойни" },
|
||||
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
|
||||
{ "TV", "Телевизор" },
|
||||
{ "Teleport Keys", "Телепорт ключей" },
|
||||
{ "Teleport to", "Телепорт" },
|
||||
{ "TP Base", "ТП база" },
|
||||
{ "TP Altar", "ТП алтарь" },
|
||||
{ "TP Basin", "ТП чаша" },
|
||||
{ "TP Fountain", "ТП фонтан" },
|
||||
{ "Ticket", "Билет" },
|
||||
{ "Town", "Город" },
|
||||
{ "TownDoor", "Дверь города" },
|
||||
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
|
||||
{ "US South Central", "Юго-Центральная часть США" },
|
||||
{ "US West", "Запад США" },
|
||||
{ "Unlimited Stamina", "Безлимитная выносливость" },
|
||||
{ "Unlimited UV Light", "Безлимитный УФ" },
|
||||
{ "Unlimited UV Light", "Неограниченный УФ" },
|
||||
{ "Unlock Achievements", "Разблокировать достижения" },
|
||||
{ "Unlock Doors", "Открыть двери" },
|
||||
{ "Visuals", "Визуалы" },
|
||||
{ "God Mode", "Режим Бога" },
|
||||
{ "Visuals", "Визуализация" },
|
||||
{ "Waiting for the game to start", "Ожидание начала игры" },
|
||||
{ "Walk In Lobby", "Ходить в лобби" },
|
||||
{ "Zara", "Зара" },
|
||||
{ "Bridesmaid 1", "Подружка невесты 1" },
|
||||
{ "Bridesmaid 2", "Подружка невесты 2" },
|
||||
{ "Butler", "Дворецкий" },
|
||||
{ "Cook", "Повар" },
|
||||
{ "Gardener", "Садовник" },
|
||||
{ "Groomsman 1", "Шафер 1" },
|
||||
{ "Groomsman 2", "Шафер 2" },
|
||||
{ "Maid", "Горничная" },
|
||||
{ "Photographer", "Фотограф" },
|
||||
{ "Priest", "Священник" },
|
||||
{ "Menu Key", "Клавиша меню" },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Ping", "Ping" },
|
||||
{ "Play Random Sound", "Reproducir sonido aleatorio" },
|
||||
{ "Player", "Jugador" },
|
||||
{ "Instant Interaction", "Interacción instantánea" },
|
||||
{ "Player Count", "Número de jugadores" },
|
||||
{ "Player ESP", "ESP jugador" },
|
||||
{ "Player ESP Color", "Color ESP jugador" },
|
||||
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Rat ESP", "ESP rata" },
|
||||
{ "Region", "Región" },
|
||||
{ "Revive", "Revivir" },
|
||||
{ "Radial Menu", "Menú radial" },
|
||||
{ "Ritual Book", "Libro ritual" },
|
||||
{ "Rose", "Rosa" },
|
||||
{ "Ritual Book ESP", "ESP libro ritual" },
|
||||
{ "Ritual Object ESP", "ESP objeto ritual" },
|
||||
{ "Ritual Objects", "Objetos rituales" },
|
||||
{ "RitualBook", "Libro ritual" },
|
||||
{ "Roar ESP", "ESP rugido" },
|
||||
{ "Boar ESP", "ESP Jabalí" },
|
||||
{ "Role", "Rol" },
|
||||
{ "RottenFood", "Comida podrida" },
|
||||
{ "Rotton Food ESP", "ESP comida podrida" },
|
||||
{ "Rotten Food ESP", "ESP Comida Podrida" },
|
||||
{ "Sam", "Sam" },
|
||||
{ "Shoot Player", "Disparar al jugador" },
|
||||
{ "Show Coordinates", "Mostrar coordenadas" },
|
||||
{ "Skeleton ESP", "ESP esqueleto" },
|
||||
{ "Slaughterhouse", "Matadero" },
|
||||
{ "SlaughterhouseFireEscapeDoor", "Puerta de escape de matadero" },
|
||||
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
|
||||
{ "TV", "Televisión" },
|
||||
{ "Teleport Keys", "Teletransportar llaves" },
|
||||
{ "Teleport to", "Teletransportar" },
|
||||
{ "TP Base", "TP base" },
|
||||
{ "TP Altar", "TP altar" },
|
||||
{ "TP Basin", "TP pila" },
|
||||
{ "TP Fountain", "TP fuente" },
|
||||
{ "Ticket", "Boleto" },
|
||||
{ "Town", "Pueblo" },
|
||||
{ "TownDoor", "Puerta de pueblo" },
|
||||
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
|
||||
{ "US South Central", "Centro-Sur de EE.UU." },
|
||||
{ "US West", "Oeste de EE.UU." },
|
||||
{ "Unlimited Stamina", "Resistencia ilimitada" },
|
||||
{ "Unlimited UV Light", "UV ilimitada" },
|
||||
{ "Unlimited UV Light", "UV ilimitado" },
|
||||
{ "Unlock Achievements", "Desbloquear logros" },
|
||||
{ "Unlock Doors", "Desbloquear puertas" },
|
||||
{ "God Mode", "Modo Dios" },
|
||||
{ "Visuals", "Visuales" },
|
||||
{ "Waiting for the game to start", "Esperando inicio del juego" },
|
||||
{ "Waiting for the game to start", "Esperando a que empiece la partida" },
|
||||
{ "Walk In Lobby", "Caminar en lobby" },
|
||||
{ "Zara", "Zara" },
|
||||
{ "Bridesmaid 1", "Dama de honor 1" },
|
||||
{ "Bridesmaid 2", "Dama de honor 2" },
|
||||
{ "Butler", "Mayordomo" },
|
||||
{ "Cook", "Cocinero" },
|
||||
{ "Gardener", "Jardinero" },
|
||||
{ "Groomsman 1", "Padrino 1" },
|
||||
{ "Groomsman 2", "Padrino 2" },
|
||||
{ "Maid", "Criada" },
|
||||
{ "Photographer", "Fotógrafo" },
|
||||
{ "Priest", "Sacerdote" },
|
||||
{ "Menu Key", "Tecla de Menú" },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,6 +195,7 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Ping", "Ping" },
|
||||
{ "Play Random Sound", "Phát âm thanh ngẫu nhiên" },
|
||||
{ "Player", "Người chơi" },
|
||||
{ "Instant Interaction", "Tương tác tức thì" },
|
||||
{ "Player Count", "Số người chơi" },
|
||||
{ "Player ESP", "Người chơi ESP" },
|
||||
{ "Player ESP Color", "Màu người chơi ESP" },
|
||||
@@ -207,18 +208,20 @@ namespace DevourClient.Localization.Translations
|
||||
{ "Rat ESP", "Chuột ESP" },
|
||||
{ "Region", "Khu vực" },
|
||||
{ "Revive", "Hồi sinh" },
|
||||
{ "Radial Menu", "Menu vòng tròn" },
|
||||
{ "Ritual Book", "Sách nghi lễ" },
|
||||
{ "Rose", "Hoa hồng" },
|
||||
{ "Ritual Book ESP", "Sách nghi lễ ESP" },
|
||||
{ "Ritual Object ESP", "Vật phẩm nghi lễ ESP" },
|
||||
{ "Ritual Objects", "Vật phẩm nghi lễ" },
|
||||
{ "RitualBook", "RitualBook" },
|
||||
{ "Roar ESP", "Tiếng gầm ESP" },
|
||||
{ "Boar ESP", "Lợn rừng ESP" },
|
||||
{ "Role", "Vai trò" },
|
||||
{ "RottenFood", "RottenFood" },
|
||||
{ "Rotton Food ESP", "Thức ăn thối ESP" },
|
||||
{ "Rotten Food ESP", "Thức ăn thối ESP" },
|
||||
{ "Sam", "Sam" },
|
||||
{ "Shoot Player", "Bắn người chơi" },
|
||||
{ "Show Coordinates", "Hiển thị tọa độ" },
|
||||
{ "Skeleton ESP", "Bộ xương ESP" },
|
||||
{ "Slaughterhouse", "Slaughterhouse" },
|
||||
{ "SlaughterhouseFireEscapeDoor", "SlaughterhouseFireEscapeDoor" },
|
||||
@@ -253,6 +256,10 @@ namespace DevourClient.Localization.Translations
|
||||
{ "TV", "TV" },
|
||||
{ "Teleport Keys", "Phím dịch chuyể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é" },
|
||||
{ "Town", "Town" },
|
||||
{ "TownDoor", "TownDoor" },
|
||||
@@ -265,13 +272,25 @@ namespace DevourClient.Localization.Translations
|
||||
{ "US South Central", "US Nam Trung" },
|
||||
{ "US West", "US Tây" },
|
||||
{ "Unlimited Stamina", "Thể lực vô hạn" },
|
||||
{ "Unlimited UV Light", "Ánh sáng UV vô hạn" },
|
||||
{ "Unlimited UV Light", "UV không giới hạn" },
|
||||
{ "Unlock Achievements", "Mở khóa thành tựu" },
|
||||
{ "Unlock Doors", "Mở khóa cửa" },
|
||||
{ "God Mode", "Chế độ Thần" },
|
||||
{ "Visuals", "Hình ảnh" },
|
||||
{ "Waiting for the game to start", "Đang chờ game bắt đầu" },
|
||||
{ "Walk In Lobby", "Đi bộ trong phòng chờ" },
|
||||
{ "Waiting for the game to start", "Đang chờ bắt đầu trò chơi" },
|
||||
{ "Walk In Lobby", "Đi trong sảnh" },
|
||||
{ "Zara", "Zara" },
|
||||
{ "Bridesmaid 1", "Phù dâu 1" },
|
||||
{ "Bridesmaid 2", "Phù dâu 2" },
|
||||
{ "Butler", "Quản gia" },
|
||||
{ "Cook", "Đầu bếp" },
|
||||
{ "Gardener", "Người làm vườn" },
|
||||
{ "Groomsman 1", "Phù rể 1" },
|
||||
{ "Groomsman 2", "Phù rể 2" },
|
||||
{ "Maid", "Hầu gái" },
|
||||
{ "Photographer", "Nhiếp ảnh gia" },
|
||||
{ "Priest", "Linh mục" },
|
||||
{ "Menu Key", "Phím Menu" },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*
|
||||
Note about license. As stated in the GPL FAQ :
|
||||
You are allowed to sell copies of the modified program commercially, but only under the terms of the GNU GPL.
|
||||
Thus, for instance, you must make the source code available to the users of the program as described in the GPL,
|
||||
@@ -9,6 +9,8 @@ If you decide to modify and then sell this software you have to agree with the G
|
||||
|
||||
using UnityEngine;
|
||||
using Il2CppInterop.Runtime.Injection;
|
||||
using HarmonyLib;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: MelonLoader.VerifyLoaderVersion(0, 6, 0, true)] //Minimum MelonLoader version is V6.0.0, sanity check for people who use 5.7 and wonder why it crashes :)
|
||||
[assembly: MelonLoader.MelonInfo(typeof(DevourClient.Load), "DevourClient", "2", "ALittlePatate & Jadis0x")]
|
||||
@@ -34,6 +36,25 @@ namespace DevourClient
|
||||
public override void OnInitializeMelon()
|
||||
{
|
||||
Init();
|
||||
try
|
||||
{
|
||||
var harmony = new HarmonyLib.Harmony("DevourClient.Hooks");
|
||||
harmony.PatchAll(Assembly.GetExecutingAssembly());
|
||||
MelonLoader.MelonLogger.Msg("Harmony patches applied.");
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
MelonLoader.MelonLogger.Error($"Failed to apply Harmony patches: {ex.Message}");
|
||||
}
|
||||
}
|
||||
public override void OnSceneWasLoaded(int buildIndex, string sceneName)
|
||||
{
|
||||
if (sceneName == "Menu" && ClientMain.godMode)
|
||||
{
|
||||
ClientMain.godMode = false;
|
||||
ClientMain.godModeOriginalLayer = -1;
|
||||
MelonLoader.MelonLogger.Msg("God Mode disabled on return to menu.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,17 +8,13 @@ using UnityEngine;
|
||||
|
||||
namespace DevourClient.Network
|
||||
{
|
||||
/// <summary>
|
||||
/// Lobby creation and management class
|
||||
/// </summary>
|
||||
// Lobby creation and management class
|
||||
public static class LobbyManager
|
||||
{
|
||||
/// <summary>
|
||||
/// Create game lobby/room
|
||||
/// </summary>
|
||||
/// <param name="regionCode">Region code (e.g.: "eu", "us", "asia", "usw", "sa", "jp", "au", "ru", "in", "kr")</param>
|
||||
/// <param name="lobbyLimit">Maximum player limit (1-64)</param>
|
||||
/// <param name="isPrivate">Whether this is a private room</param>
|
||||
// Create game lobby/room.
|
||||
// regionCode: Region code (e.g.: "eu", "us", "asia", "usw", "sa", "jp", "au", "ru", "in", "kr").
|
||||
// lobbyLimit: Maximum player limit (1-64).
|
||||
// isPrivate: Whether this is a private room.
|
||||
public static void CreateLobby(string regionCode, int lobbyLimit, bool isPrivate)
|
||||
{
|
||||
try
|
||||
@@ -32,7 +28,7 @@ namespace DevourClient.Network
|
||||
}
|
||||
|
||||
// Get PhotonRegion
|
||||
PhotonRegion region = GetPhotonRegion(regionCode);
|
||||
PhotonRegion? region = GetPhotonRegion(regionCode);
|
||||
if (region == null)
|
||||
{
|
||||
MelonLogger.Error($"[LobbyManager] Failed to find region: {regionCode}");
|
||||
@@ -40,7 +36,7 @@ namespace DevourClient.Network
|
||||
}
|
||||
|
||||
// Find Menu controller
|
||||
Il2CppHorror.Menu menu = FindMenuController();
|
||||
Il2CppHorror.Menu? menu = FindMenuController();
|
||||
if (menu == null)
|
||||
{
|
||||
MelonLogger.Error("[LobbyManager] Failed to find MenuController");
|
||||
@@ -96,10 +92,7 @@ namespace DevourClient.Network
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get PhotonRegion object for specified region
|
||||
/// </summary>
|
||||
private static PhotonRegion GetPhotonRegion(string regionCode)
|
||||
private static PhotonRegion? GetPhotonRegion(string regionCode)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -113,10 +106,7 @@ namespace DevourClient.Network
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Find Menu controller
|
||||
/// </summary>
|
||||
private static Il2CppHorror.Menu FindMenuController()
|
||||
private static Il2CppHorror.Menu? FindMenuController()
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -142,9 +132,6 @@ namespace DevourClient.Network
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check if in game
|
||||
/// </summary>
|
||||
private static bool IsInGame()
|
||||
{
|
||||
try
|
||||
@@ -159,9 +146,6 @@ namespace DevourClient.Network
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Force start lobby game (host only)
|
||||
/// </summary>
|
||||
public static void ForceLobbyStart()
|
||||
{
|
||||
try
|
||||
@@ -172,7 +156,7 @@ namespace DevourClient.Network
|
||||
return;
|
||||
}
|
||||
|
||||
Il2CppHorror.Menu menu = FindMenuController();
|
||||
Il2CppHorror.Menu? menu = FindMenuController();
|
||||
if (menu == null)
|
||||
{
|
||||
MelonLogger.Error("[LobbyManager] Failed to find MenuController");
|
||||
@@ -189,14 +173,11 @@ namespace DevourClient.Network
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Show message box
|
||||
/// </summary>
|
||||
public static void ShowMessageBox(string message)
|
||||
{
|
||||
try
|
||||
{
|
||||
Il2CppHorror.Menu menu = FindMenuController();
|
||||
Il2CppHorror.Menu? menu = FindMenuController();
|
||||
if (menu != null)
|
||||
{
|
||||
menu.ShowMessageModal(message);
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace DevourClient.Network
|
||||
// Get display name by region code (multilanguage support)
|
||||
public static string GetDisplayNameByCode(string code)
|
||||
{
|
||||
if (AvailableRegions.TryGetValue(code, out string englishName))
|
||||
if (AvailableRegions.TryGetValue(code, out string? englishName))
|
||||
{
|
||||
// Use MultiLanguageSystem to translate region names
|
||||
return MultiLanguageSystem.Translate(englishName);
|
||||
|
||||
699
DevourClient/RadialMenuManager.cs
Normal file
699
DevourClient/RadialMenuManager.cs
Normal 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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 azazel_esp_color = new Color(1.00f, 0.00f, 0.00f, 1);
|
||||
public static float speed = 1f;
|
||||
public static KeyCode menuToggleKey = KeyCode.Insert;
|
||||
public static KeyCode flyKey = KeyCode.None;
|
||||
public static KeyCode teleportKey = KeyCode.B;
|
||||
public static KeyCode radialMenuKey = KeyCode.Z;
|
||||
public static Vector2 itemsScrollPosition = Vector2.zero;
|
||||
public static Vector2 rituelObjectsScrollPosition = Vector2.zero;
|
||||
public static Vector2 stuffsScrollPosition = Vector2.zero;
|
||||
|
||||
362
DevourClient/UI/ClientMenu.cs
Normal file
362
DevourClient/UI/ClientMenu.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
116
DevourClient/UI/ClientTabs.ESP.cs
Normal file
116
DevourClient/UI/ClientTabs.ESP.cs
Normal 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 }
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
146
DevourClient/UI/ClientTabs.Entities.cs
Normal file
146
DevourClient/UI/ClientTabs.Entities.cs
Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
416
DevourClient/UI/ClientTabs.Items.cs
Normal file
416
DevourClient/UI/ClientTabs.Items.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
279
DevourClient/UI/ClientTabs.Map.cs
Normal file
279
DevourClient/UI/ClientTabs.Map.cs
Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
173
DevourClient/UI/ClientTabs.Misc.cs
Normal file
173
DevourClient/UI/ClientTabs.Misc.cs
Normal 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)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
90
DevourClient/UI/ClientTabs.Network.cs
Normal file
90
DevourClient/UI/ClientTabs.Network.cs
Normal 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
91
DevourClient/UI/ClientTabs.Players.cs
Normal file
91
DevourClient/UI/ClientTabs.Players.cs
Normal 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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
34
DevourClient/UI/ClientTabs.Visuals.cs
Normal file
34
DevourClient/UI/ClientTabs.Visuals.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
87
DevourClient/UI/ClientTabs.cs
Normal file
87
DevourClient/UI/ClientTabs.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
51
README.md
51
README.md
@@ -25,7 +25,6 @@ Everything about spoofing ehre (steam name, server name, level...) will persist
|
||||
* Big Flashlight (allows your flashlight to light a lot more)
|
||||
* Flashlight color customization (with a home made color picker)
|
||||
* Unlimited UV light (thanks to [@jadis0x](https://github.com/jadis0x))
|
||||
* A chat spammer for Lobby and InGame chat (i couldn't do a text entry because of the limitations of [Il2CppAssemblyUnhollower](https://github.com/knah/Il2CppAssemblyUnhollower))
|
||||
* Achievements unlocker (couldn't do all of them, my code is crashing for some reasons at some point, i may fix it, for now it's commented out)
|
||||
* Doors unlocker (should work fine, though it doesn't seem to work sometimes)
|
||||
* Keys teleporter
|
||||
@@ -42,10 +41,10 @@ Everything about spoofing ehre (steam name, server name, level...) will persist
|
||||
* Azazel ESP (with a home made color picker)
|
||||
* Azazel Skeleton ESP
|
||||
* 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)
|
||||
* Item ESP (with multi-language translation) (Now you can specify the display of a single item)
|
||||
* Demon 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))
|
||||
* Spawn any item/entity to your position
|
||||
* Walk in the lobby
|
||||
@@ -53,6 +52,13 @@ Everything about spoofing ehre (steam name, server name, level...) will persist
|
||||
* Fullbright
|
||||
* Infinite mirrors (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)
|
||||
|
||||
## 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>
|
||||
|
||||
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).
|
||||
2. Put the DevourClient.dll file located in `DevourClient\bin\Release\net6.0` inside `C:\Program Files (x86)\Steam\steamapps\common\Devour\Mods` folder.
|
||||
3. Start the game, now you have successfully installed DevourClient. Use INSERT to open the menu
|
||||
|
||||
## English Installation Guide
|
||||
If you just want to install this plugin and use it directly in the game:
|
||||
|
||||
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支持)
|
||||
|
||||
3、安装dll文件 → 从本项目的release中下载最新的dll文件,然后将此文件添加到你的devour的安装目录中的mods文件夹里(不知道目录的情况下,可以在steam中右键devour,选择“管理”-“浏览本地文件”即可)
|
||||
|
||||
4、运行devour → 如果安装成功,你会看到一个windows窗口进行各类安装提示后,自动进入游戏。点击insert键即可打开和关闭devourclient窗口
|
||||
|
||||
ps:有些电脑在安装melonloader之后,会出现fatal error的提示,这个我目前并没有碰到过。但是出现这个提示的主要原因,基本是melonloader安装过程中,提取到devour根目录的melonloader文件夹里的文件出现了问题,比较简单的解决办法就是(1)在别人的同系统同位宽(x86,x32)的电脑里拷贝出来他的melonloader文件夹,然后直接粘贴到自己的电脑里。(2)将melonloader文件夹完全删除,然后重装。(3)在直到游戏完全运行,菜单正常工作之前,保持VPN线路通畅。
|
||||
注意:有些电脑在安装melonloader之后,会出现fatal error的提示,这个我目前并没有碰到过。但是出现这个提示的主要原因,基本是melonloader安装过程中,提取到devour根目录的melonloader文件夹里的文件出现了问题,比较简单的解决办法就是(1)在别人的同系统同位宽(x86,x32)的电脑里拷贝出来他的melonloader文件夹,然后直接粘贴到自己的电脑里。(2)将melonloader文件夹完全删除,然后重装。(3)在直到游戏完全运行,菜单正常工作之前,保持VPN线路通畅。
|
||||
|
||||
如果你想要对代码进行修改和开发,请按照下面的”building from source“的步骤,逐步进行
|
||||
注意:如果在加载时提示 “0 mod”,请检查你的dll文件是否正常,是否已经将dll文件放置到devour的“mods”文件夹中。
|
||||
|
||||
如果你想要对代码进行修改和开发,请按照下面的 [building from source](#building-from-source) 的步骤,逐步进行
|
||||
|
||||
|
||||
## 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\Il2CppAssemblies\Assembly-CSharp.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2CppOpsive.UltimateCharacterController.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2CppBehaviorDesigner.Runtime.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.user.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppbolt.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppmscorlib.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.IMGUIModule.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.InputLegacyModule.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.HotReloadModule.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.UI.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.UIModule.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.CoreModule.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.InputModule.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.common.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.dll`
|
||||
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppudpkit.platform.photon.dll`
|
||||
@@ -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\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\UnityEngine.TextRenderingModule.dll`
|
||||
8. Build the solutions in Release | Any CPU
|
||||
|
||||
**Note**: Now you can add these dependencies automatically by 'update_dependency' script.
|
||||
|
||||
## Contact
|
||||
|
||||
You can add me on discord at _.patate or on the [discord server](https://discord.gg/2amMFvqjYd)
|
||||
|
||||
28
update_dependency.bat
Normal file
28
update_dependency.bat
Normal 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
293
update_dependency.ps1
Normal 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
274
update_dependency.sh
Normal 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 "========================================"
|
||||
|
||||
Reference in New Issue
Block a user