26 Commits
4.2 ... 4.4

Author SHA1 Message Date
92101631af add translation function 2025-11-02 22:39:21 +11:00
a76b3d27e7 fix: spoof level, achievements list, removed useless popups 2025-10-19 14:57:48 +02:00
ALittlePatate
f8ce7336f6 Merge pull request #85 from mana-feng/MelonLoader
fix crashed issue
2025-10-13 21:28:44 +02:00
e720da278b Update README.md 2025-10-13 16:45:48 +11:00
Hao Feng
e01dd26d6f update for "carnival" 2025-10-13 16:05:56 +11:00
manafeng
ccffaf352f Update README.md 2025-10-12 20:34:00 +11:00
manafeng
3c0d57e308 Update README.md 2025-07-27 19:24:22 +10:00
manafeng
a5aed348fd Update Settings.cs 2025-06-08 03:50:58 +10:00
manafeng
b450fa1cbf Update GUIHelper.cs 2025-06-08 03:50:02 +10:00
manafeng
7a2815681c Update README.md 2025-06-08 03:20:48 +10:00
manafeng
9f93c16dc3 Update README.md 2025-06-08 03:20:24 +10:00
manafeng
e52f29f702 Update README.md 2025-06-08 03:19:31 +10:00
manafeng
2ce4fea684 Update README.md 2025-06-08 03:06:42 +10:00
manafeng
83ffed3c86 Add files via upload 2025-06-08 03:05:49 +10:00
manafeng
d7597b055f Add files via upload 2025-06-08 03:05:16 +10:00
manafeng
360aa1061c Add files via upload 2025-06-08 03:04:48 +10:00
manafeng
aa0eb090ba Add files via upload 2025-06-08 03:02:55 +10:00
manafeng
64e6fd785d Delete ClientMain.cs 2025-06-08 03:02:35 +10:00
manafeng
cfb3235a97 Add files via upload 2025-06-08 03:01:34 +10:00
manafeng
84fc72ab59 Update ClientMain.cs 2025-06-08 02:58:12 +10:00
ALittlePatate
a9c2611427 fix: readme formatting 2024-09-21 19:23:12 +02:00
ALittlePatate
8280ed6362 add: updated english installation tutorial 2024-09-20 19:49:49 +02:00
ALittlePatate
b8ad6a1625 fix: MelonLoader required version 2024-09-20 19:29:47 +02:00
47538a7483 fix: typo 2024-09-20 18:20:53 +02:00
15d1a91806 add: infinite mirors in Manor 2024-09-20 18:11:06 +02:00
ALittlePatate
f32e3b0eb7 fix: discord handle 2024-09-20 16:10:54 +02:00
13 changed files with 2753 additions and 1393 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -230,26 +230,6 @@ namespace DevourClient.Hacks
_menu.ShowCanvasGroup(_menu.mainMenuCanvasGroup, false); _menu.ShowCanvasGroup(_menu.mainMenuCanvasGroup, false);
} }
public static void SetSteamName(string name)
{
Il2CppHorror.Menu Menu_ = UnityEngine.Object.FindObjectOfType<Il2CppHorror.Menu>();
if (Menu_ == null)
{
return;
}
Menu_.steamName = name;
}
public static void SetServerName(string name)
{
Il2CppHorror.Menu Menu_ = UnityEngine.Object.FindObjectOfType<Il2CppHorror.Menu>();
if (Menu_ == null)
{
return;
}
Menu_.serverNameText.text = name;
}
public static void BigFlashlight(bool reset) public static void BigFlashlight(bool reset)
{ {
@@ -376,23 +356,6 @@ namespace DevourClient.Hacks
NolanRank.SetRank(rank); NolanRank.SetRank(rank);
} }
public static void MessageSpam(string message)
{
//TOFIX : not spamming anymore :/
if (Helpers.Player.IsInGame())
{
Il2Cpp.GameUI game_ui_class = UnityEngine.Object.FindObjectOfType<Il2Cpp.GameUI>();
game_ui_class.textChatInput.text = message;
game_ui_class.OnChatMessageSubmit();
}
else
{
Il2CppHorror.Menu menu_class = UnityEngine.Object.FindObjectOfType<Il2CppHorror.Menu>();
menu_class.textChatInput.text = message;
menu_class.OnChatMessageSubmit();
}
}
public static void DespawnDemons() public static void DespawnDemons()
{ {
@@ -471,6 +434,17 @@ namespace DevourClient.Hacks
} }
} }
public static void DespawnMonkeys()
{
foreach (Il2Cpp.MonkeyBehaviour monkey in Helpers.Entities.Monkeys)
{
if (monkey != null)
{
monkey.Despawn();
}
}
}
public static int ShowMessageBox(string message) public static int ShowMessageBox(string message)
{ {
//not used, might be useful, some day //not used, might be useful, some day

View File

@@ -7,9 +7,9 @@ namespace DevourClient.Hacks
public static void Achievements() public static void Achievements()
{ {
//Il2Cpp.AchievementHelpers ah = UnityEngine.Object.FindObjectOfType<Il2Cpp.AchievementHelpers>(); //Il2Cpp.AchievementHelpers ah = UnityEngine.Object.FindObjectOfType<Il2Cpp.AchievementHelpers>();
string[] achievements = { "ACH_666_DOLL_HEADS_DESTROYED", "ACH_1000_HEADS_BURIED", "ACH_1000_PIGS_DESTROYED", "ACH_1000_BOOKS_DESTROYED", "ACH_100_EGGS_DESTROYED", "ACH_100_FUSES_USED", "ACH_100_GASOLINE_USED", "ACH_WON_Manor_NIGHTMARE_SP", "ACH_WON_NIGHTMARE_", "ACH_WON_TOWN_HARD", "ACH_WON_MANOR_NIGHTMARE_SP", "ACH_WON_INN_HARD_SP", "ACH_WON_SLAUGHTERHOUSE_COOP", "ACH_ALL_FEATHERS", "ACH_WON_INN_HARD", "ACH_ALL_BARBED_WIRES", "ACH_WON_CARNIVAL_NIGHTMARE_SP", "ACH_WON_MOLLY_HARD", "ACH_WON_MOLLY_HARD_SP", "ACH_ALL_HORSESHOES", "ACH_WON_INN_SP", "ACH_WON_TOWN_NIGHTMARE_SP", "ACH_WON_MANOR_HARD_SP", "ACH_WON_MOLLY_SP", "ACH_WON_CARNIVAL_HARD_SP", "ACH_WON_SLAUGHTERHOUSE_HARD_SP", "ACH_WON_TOWN_COOP", "ACH_WON_MOLLY_COOP", "ACH_ALL_PATCHES", "ACH_WON_MOLLY_NIGHTMARE_SP", "ACH_WON_TOWN_NIGHTMARE", "ACH_WON_SLAUGHTERHOUSE_SP", "ACH_WON_INN_COOP", "ACH_WON_CARNIVAL_HARD", "ACH_ALL_CHERRY_BLOSSOM", "ACH_WON_MOLLY_NIGHTMARE", "ACH_WON_TOWN_HARD_SP", "ACH_WON_CARNIVAL_NIGHTMARE", "ACH_WON_CARNIVAL_SP", "ACH_ALL_ROSES", "ACH_WON_INN_NIGHTMARE_SP", "ACH_ALL_TICKETS", "ACH_WON_SLAUGHTERHOUSE_NIGHTMARE_SP", "ACH_WON_TOWN_SP", "ACH_WON_INN_NIGHTMARE", "ACH_WON_CARNIVAL_COOP", "ACH_WON_MANOR_COOP", "ACH_WON_SLAUGHTERHOUSE_NIGHTMARE", "ACH_WON_SLAUGHTERHOUSE_HARD", "ACH_WON_MANOR_NIGHTMARE", "ACH_WON_MANOR_HARD", "ACH_WON_MANOR_SP", "ACH_ALL_CLIPBOARDS_READ", "ACH_ALL_NOTES_READ", "ACH_UNLOCKED_CAGE", "ACH_UNLOCKED_ATTIC_CAGE", "ACH_CALMED_ANNA", "ACH_FRIED_RAT", "ACH_BURNT_GOAT", "ACH_KNOCKED_OUT_BY_ANNA", "ACH_KNOCKOUT_OUT_BY_DEMON", "ACH_KNOCKED_OUT_IN_HIDING", "STAT_NUM_BLEACH_USED", "ACH_WON_SP", "ACH_WIN_NIGHTMARE", "ACH_WON_HARD_SP", "ACH_WON_COOP", "ACH_WON_HARD", "ACH_WIN_NIGHTMARE_SP", "ACH_LOST", "ACH_NEVER_KNOCKED_OUT", "ACH_ONLY_ONE_KNOCKED_OUT", "ACH_WON_HARD_NO_MEDKITS", "ACH_WON_NO_MEDKITS", "ACH_WON_NO_BATTERIES", "ACH_WON_NIGHTMARE_NO_MEDKITS", "ACH_WON_NO_KNOCKOUT_COOP", "ACH_WON_HARD_NO_BATTERIES", "ACH_WON_HARD_{0}", "ACH_WON_NIGHTMARE_{0}", "ACH_WON_NIGHTMARE_NO_BATTERIES", "ACH_SURVIVED_TO_7_GOATS", "ACH_SURVIVED_TO_5_GOATS", "ACH_SURVIVED_TO_3_GOATS", };
string[] stats = { "STAT_TRASH_CANS_KICKED", "STAT_NUM_BOOKS_DESTROYED", "STAT_NUM_ANNA_STAGGERS", "STAT_KNOCKOUTS_BY_GHOST", "STAT_KNOCKOUTS_BY_NATHAN", "STAT_NUM_REVIVES", "STAT_INMATES", "STAT_GHOSTS", "STAT_PRESENTS_COLLECTED", "STAT_ROSES_COLLECTED", "STAT_HEADS", "STAT_KNOCKOUTS_BY_MONKEY", "STAT_GOATS_LURED", "STAT_NUM_NATHAN_STAGGERS", "STAT_DOLLS", "STAT_HORSESHOES_COLLECTED", "STAT_KNOCKOUTS_BY_BOAR", "STAT_KNOCKOUTS_BY_MOLLY", "STAT_KNOCKOUTS_BY_SPIDER", "STAT_DEMONS", "STAT_BARBED_WIRES_COLLECTED", "STAT_CATEGORY_MISC", "STAT_BOOKS", "STAT_CATEGORY_COLLECTABLES", "STAT_HEADS_CLEANSED", "STAT_KNOCKOUTS_BY_SAM", "STAT_NUM_APRIL_STAGGERS", "STAT_BOARS", "STAT_RATS", "STAT_KNOCKOUTS_BY_APRIL", "STAT_CATEGORY_MINIONS_BANISHED", "STAT_HEADS_LURED", "STAT_PIGS", "STAT_CROWS", "STAT_NUM_ZARA_STAGGERS", "STAT_PIGS_LURED", "STAT_NUM_SAM_STAGGERS", "STAT_CATEGORY_AZAZEL_STAGGERS", "STAT_NUM_MOLLY_STAGGERS", "STAT_CHERRY_BLOSSOM_COLLECTED", "STAT_GOATS", "STAT_PUMPKINS_COLLECTED", "STAT_KNOCKOUTS_BY_ZARA", "STAT_PATCHES_COLLECTED", "STAT_KNOCKOUTS_BY_DEMON", "STAT_NUM_KAI_STAGGERS", "STAT_FEATHERS_COLLECTED", "STAT_EGGS", "STAT_KNOCKOUTS_BY_ANNA", "STAT_CATEGORY_ANIMALS_LURED", "STAT_DOLLS_LURED", "STAT_CORPSES_FREED", "STAT_DOLL_HEADS", "STAT_KNOCKOUTS_BY_INMATE", "STAT_RATS_LURED", "STAT_SPIDERS", "STAT_COINS_USED", "STAT_MONKEYS", "STAT_CATEGORY_ITEMS_USED", "STAT_CATEGORY_RITUAL_ITEMS_DESTROYED", "STAT_KNOCKOUTS_BY_CROW", "STAT_DOLL_HEADS_DESTROYED", "STAT_CATEGORY_KNOCKOUTS", "STAT_TICKETS_COLLECTED", "STAT_KNOCKOUTS_BY_KAI", "STAT_CATEGORY_WINS", "STAT_NUM_WON_NORMAL", "STAT_DOLLS_EXPLODED", "STAT_NUM_EGGS_DESTROYED", "STAT_NUM_HEADS_BURIED", "STAT_NUM_CORPSES_FRIED", "STAT_NUM_GHOSTS_FRIED", "STAT_NUM_MOLLY_CALMED_DOWN", "STAT_NUM_ANNA_CALMED_DOWN", "STAT_NUM_", "STAT_MONKEYS_FRIED", "STAT_NUM_CROWS_FRIED", "STAT_NUM_BOARS_FRIED", "STAT_NUM_SPIDERS_FRIED", "STAT_NUM_INMATES_FRIED", "STAT_NUM_DEMONS_FRIED", "STAT_NUM_KNOCKOUTS", "STAT_KNOCKOUTS_BY_", "STAT_NUM_BOOKS_CURSED", "STAT_NUM_ALCOHOL_USED", "STAT_NUM_BLEACH_USED", "STAT_EXP", "STAT_POOPS_SEARCHED", "STAT_NUM_PIGS_DESTROYED", "STAT_NUM_WON_HARD", "STAT_NUM_WON_NIGHTMARE", "STAT_NUM_WON_EASY", "STAT_NUM_WON", "STAT_NUM_GASOLINE_USED", "STAT_NUM_GOATS_DESTROYED", "STAT_NUM_RATS_DESTROYED", "STAT_NUM_FUSES_USED", };
string[] achievements = { "ACH_WON_Manor_NIGHTMARE_SP", "ACH_WON_NIGHTMARE_", "ACH_WON_TOWN_HARD", "ACH_WON_MANOR_NIGHTMARE_SP", "ACH_WON_INN_HARD_SP", "ACH_WON_SLAUGHTERHOUSE_COOP", "ACH_ALL_FEATHERS", "ACH_WON_INN_HARD", "ACH_ALL_BARBED_WIRES", "ACH_ALL_HORSESHOES", "ACH_WON_MOLLY_HARD", "ACH_WON_TOWN_NIGHTMARE_SP", "ACH_WON_MOLLY_HARD_SP", "ACH_WON_INN_SP", "ACH_100_GASOLINE_USED", "ACH_WON_MANOR_HARD_SP", "ACH_WON_MOLLY_SP", "ACH_100_EGGS_DESTROYED", "ACH_1000_PIGS_DESTROYED", "ACH_WON_TOWN_COOP", "ACH_WON_SLAUGHTERHOUSE_HARD_SP", "ACH_WON_MOLLY_COOP", "ACH_100_FUSES_USED", "ACH_1000_BOOKS_DESTROYED", "ACH_WON_MOLLY_NIGHTMARE_SP", "ACH_WON_SLAUGHTERHOUSE_SP", "ACH_ALL_PATCHES", "ACH_WON_INN_COOP", "ACH_WON_TOWN_NIGHTMARE", "ACH_ALL_CHERRY_BLOSSOM", "ACH_WON_MOLLY_NIGHTMARE", "ACH_WON_TOWN_HARD_SP", "ACH_ALL_ROSES", "ACH_WON_INN_NIGHTMARE_SP", "ACH_1000_HEADS_BURIED", "ACH_WON_SLAUGHTERHOUSE_NIGHTMARE_SP", "ACH_WON_TOWN_SP", "ACH_WON_INN_NIGHTMARE", "ACH_WON_SLAUGHTERHOUSE_HARD", "ACH_WON_MANOR_COOP", "ACH_WON_MANOR_HARD", "ACH_WON_SLAUGHTERHOUSE_NIGHTMARE", "ACH_WON_MANOR_SP", "ACH_WON_MANOR_NIGHTMARE", "ACH_ALL_CLIPBOARDS_READ", "ACH_ALL_NOTES_READ", "ACH_UNLOCKED_ATTIC_CAGE", "ACH_UNLOCKED_CAGE", "ACH_CALMED_ANNA", "ACH_FRIED_RAT", "ACH_BURNT_GOAT", "ACH_KNOCKED_OUT_BY_ANNA", "ACH_KNOCKOUT_OUT_BY_DEMON", "ACH_KNOCKED_OUT_IN_HIDING", "STAT_NUM_BLEACH_USED", "ACH_WON_SP", "ACH_WIN_NIGHTMARE", "ACH_WON_HARD_SP", "ACH_WON_COOP", "ACH_WON_HARD", "ACH_WIN_NIGHTMARE_SP", "ACH_LOST", "ACH_NEVER_KNOCKED_OUT", "ACH_ONLY_ONE_KNOCKED_OUT", "ACH_WON_HARD_NO_MEDKITS", "ACH_WON_NO_MEDKITS", "ACH_WON_NO_BATTERIES", "ACH_WON_NIGHTMARE_NO_MEDKITS", "ACH_WON_NO_KNOCKOUT_COOP", "ACH_WON_HARD_NO_BATTERIES", "ACH_WON_HARD_{0}", "ACH_WON_NIGHTMARE_{0}", "ACH_WON_NIGHTMARE_NO_BATTERIES", "ACH_SURVIVED_TO_7_GOATS", "ACH_SURVIVED_TO_5_GOATS", "ACH_SURVIVED_TO_3_GOATS", };
string[] stats = { "STAT_ROSES_COLLECTED", "STAT_BARBED_WIRES_COLLECTED", "STAT_HORSESHOES_COLLECTED", "STAT_PATCHES_COLLECTED", "STAT_CHERRY_BLOSSOM_COLLECTED", "STAT_FEATHERS_COLLECTED", "STAT_NUM_CORPSES_FRIED", "STAT_NUM_GHOSTS_FRIED", "STAT_NUM_MOLLY_CALMED_DOWN", "STAT_NUM_ANNA_CALMED_DOWN", "STAT_NUM_ANNA_STAGGERS", "STAT_NUM_NATHAN_STAGGERS", "STAT_NUM_APRIL_STAGGERS", "STAT_NUM_ZARA_STAGGERS", "STAT_NUM_SAM_STAGGERS", "STAT_NUM_MOLLY_STAGGERS", "STAT_NUM_CROWS_FRIED", "STAT_NUM_BOARS_FRIED", "STAT_NUM_SPIDERS_FRIED", "STAT_NUM_INMATES_FRIED", "STAT_NUM_DEMONS_FRIED", "STAT_NUM_KNOCKOUTS", "STAT_KNOCKOUTS_BY_", "STAT_NUM_BOOKS_CURSED", "STAT_NUM_ALCOHOL_USED", "STAT_NUM_BLEACH_USED", "STAT_NUM_HEADS_BURIED", "STAT_POOPS_SEARCHED", "STAT_EXP", "STAT_NUM_PIGS_DESTROYED", "STAT_NUM_WON_HARD", "STAT_NUM_WON_NIGHTMARE", "STAT_NUM_WON", "STAT_NUM_BOOKS_DESTROYED", "STAT_NUM_GASOLINE_USED", "STAT_NUM_GOATS_DESTROYED", "STAT_NUM_RATS_DESTROYED", "STAT_NUM_FUSES_USED", "STAT_KNOCKOUTS_BY_NATHAN", "STAT_KNOCKOUTS_BY_GHOST", "STAT_INMATES", "STAT_NUM_REVIVES", "STAT_GHOSTS", "STAT_HEADS", "STAT_GOATS_LURED", "STAT_KNOCKOUTS_BY_MOLLY", "STAT_KNOCKOUTS_BY_BOAR", "STAT_NUM_EGGS_DESTROYED", "STAT_DEMONS", "STAT_KNOCKOUTS_BY_SPIDER", "STAT_CATEGORY_MISC", "STAT_BOOKS", "STAT_CATEGORY_WINS", "STAT_KNOCKOUTS_BY_SAM", "STAT_HEADS_CLEANSED", "STAT_BOARS", "STAT_KNOCKOUTS_BY_APRIL", "STAT_RATS", "STAT_HEADS_LURED", "STAT_CATEGORY_MINIONS_BANISHED", "STAT_CROWS", "STAT_PIGS", "STAT_PIGS_LURED", "STAT_CATEGORY_AZAZEL_STAGGERS", "STAT_GOATS", "STAT_KNOCKOUTS_BY_ZARA", "STAT_KNOCKOUTS_BY_DEMON", "STAT_KNOCKOUTS_BY_ANNA", "STAT_EGGS", "STAT_CATEGORY_ANIMALS_LURED", "STAT_CORPSES_FREED", "STAT_KNOCKOUTS_BY_INMATE", "STAT_SPIDERS", "STAT_RATS_LURED", "STAT_CATEGORY_RITUAL_ITEMS_DESTROYED", "STAT_CATEGORY_ITEMS_USED", "STAT_KNOCKOUTS_BY_CROW", "STAT_CATEGORY_KNOCKOUTS", "STAT_NUM_WON_NORMAL", "STAT_TOTAL", "STAT_TRASH_CANS_KICKED", };
for (int i = 0; i < achievements.Length; i++) for (int i = 0; i < achievements.Length; i++)
{ {
Il2CppSteamworks.SteamUserStats.SetAchievement(achievements[i]); Il2CppSteamworks.SteamUserStats.SetAchievement(achievements[i]);

View File

@@ -1,4 +1,5 @@
using UnityEngine; using UnityEngine;
using System.Collections.Generic;
namespace DevourClient.Helpers namespace DevourClient.Helpers
{ {
@@ -8,6 +9,13 @@ namespace DevourClient.Helpers
private static float G; private static float G;
private static float B; private static float B;
private static Texture2D previewTexture = null;
private static 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;
public static Color ColorPick(string title, Color color) public static Color ColorPick(string title, Color color)
{ {
GUI.Label(new Rect(Settings.Settings.x + 195, Settings.Settings.y + 70, 250, 30), title); GUI.Label(new Rect(Settings.Settings.x + 195, Settings.Settings.y + 70, 250, 30), title);
@@ -24,12 +32,24 @@ namespace DevourClient.Helpers
void DrawPreview(Rect position, Color color_to_draw) void DrawPreview(Rect position, Color color_to_draw)
{ {
Texture2D texture = new Texture2D(1, 1); if (previewTexture == null || lastPreviewColor != color_to_draw)
texture.SetPixel(0, 0, color_to_draw); {
texture.Apply(); if (previewTexture == null)
GUIStyle boxStyle = new GUIStyle(GUI.skin.box); {
boxStyle.normal.background = texture; previewTexture = new Texture2D(1, 1);
GUI.Box(position, GUIContent.none, boxStyle); }
previewTexture.SetPixel(0, 0, color_to_draw);
previewTexture.Apply();
lastPreviewColor = color_to_draw;
}
if (cachedBoxStyle == null)
{
cachedBoxStyle = new GUIStyle(GUI.skin.box);
}
cachedBoxStyle.normal.background = previewTexture;
GUI.Box(position, GUIContent.none, cachedBoxStyle);
} }
DrawPreview(new Rect(Settings.Settings.x + 195, Settings.Settings.y + 100, 20, 90), color); DrawPreview(new Rect(Settings.Settings.x + 195, Settings.Settings.y + 100, 20, 90), color);
@@ -39,6 +59,14 @@ namespace DevourClient.Helpers
public static Texture2D MakeTex(int width, int height, Color col) public static Texture2D MakeTex(int width, int height, Color col)
{ {
if (colorTextureCache.TryGetValue(col, out Texture2D cachedTexture))
{
if (cachedTexture != null)
{
return cachedTexture;
}
}
Color[] pix = new Color[width * height]; Color[] pix = new Color[width * height];
for (int i = 0; i < pix.Length; ++i) for (int i = 0; i < pix.Length; ++i)
{ {
@@ -47,11 +75,24 @@ namespace DevourClient.Helpers
Texture2D result = new Texture2D(width, height); Texture2D result = new Texture2D(width, height);
result.SetPixels(pix); result.SetPixels(pix);
result.Apply(); result.Apply();
colorTextureCache[col] = result;
return result; return result;
} }
public static Texture2D GetCircularTexture(int width, int height) public static Texture2D GetCircularTexture(int width, int height)
{ {
int cacheKey = width;
if (circularTextureCache.TryGetValue(cacheKey, out Texture2D cachedTexture))
{
if (cachedTexture != null)
{
return cachedTexture;
}
}
Texture2D texture = new Texture2D(width, height); Texture2D texture = new Texture2D(width, height);
for (int x = 0; x < texture.width; x++) for (int x = 0; x < texture.width; x++)
{ {
@@ -70,7 +111,36 @@ namespace DevourClient.Helpers
texture.Apply(); texture.Apply();
circularTextureCache[cacheKey] = texture;
return texture; return texture;
} }
public static void Cleanup()
{
if (previewTexture != null)
{
UnityEngine.Object.Destroy(previewTexture);
previewTexture = null;
}
foreach (var texture in colorTextureCache.Values)
{
if (texture != null)
{
UnityEngine.Object.Destroy(texture);
}
}
colorTextureCache.Clear();
foreach (var texture in circularTextureCache.Values)
{
if (texture != null)
{
UnityEngine.Object.Destroy(texture);
}
}
circularTextureCache.Clear();
}
} }
} }

View File

@@ -11,7 +11,7 @@
{ {
switch (sceneName) switch (sceneName)
{ {
case "Devour": case "Anna":
return "Farmhouse"; return "Farmhouse";
case "Molly": case "Molly":
return "Asylum"; return "Asylum";
@@ -23,6 +23,8 @@
return "Slaughterhouse"; return "Slaughterhouse";
case "Manor": case "Manor":
return "Manor"; return "Manor";
case "Carnival":
return "Carnival";
default: default:
return "Menu"; return "Menu";
} }

View File

@@ -12,14 +12,32 @@ namespace DevourClient.Render
{ {
public static GUIStyle StringStyle { get; set; } = new GUIStyle(GUI.skin.label); public static GUIStyle StringStyle { get; set; } = new GUIStyle(GUI.skin.label);
private static GUIContent cachedContent = new GUIContent();
private static Dictionary<string, Vector2> sizeCache = new Dictionary<string, Vector2>();
private static int frameCacheClearCounter = 0;
private const int CACHE_CLEAR_INTERVAL = 1800;
public static void DrawString(Vector2 position, Color color, string label, bool centered = true) public static void DrawString(Vector2 position, Color color, string label, bool centered = true)
{ {
var content = new GUIContent(label); cachedContent.text = label;
var size = StringStyle.CalcSize(content);
if (!sizeCache.TryGetValue(label, out Vector2 size))
{
size = StringStyle.CalcSize(cachedContent);
sizeCache[label] = size;
frameCacheClearCounter++;
if (frameCacheClearCounter >= CACHE_CLEAR_INTERVAL)
{
sizeCache.Clear();
frameCacheClearCounter = 0;
}
}
var upperLeft = centered ? position - size / 2f : position; var upperLeft = centered ? position - size / 2f : position;
Color color2 = GUI.color; Color color2 = GUI.color;
GUI.color = color; GUI.color = color;
GUI.Label(new Rect(upperLeft, size), content); GUI.Label(new Rect(upperLeft, size), cachedContent);
GUI.color = color2; GUI.color = color2;
} }
@@ -63,7 +81,7 @@ namespace DevourClient.Render
} }
public static void DrawBones(Transform bone1, Transform bone2, Color c) public static void DrawBones(Transform bone1, Transform bone2, Color c)
{ {
if (!Camera.main) //fix the crash maybe if (!Camera.main)
{ {
return; return;
} }

View File

@@ -40,10 +40,11 @@ namespace DevourClient.Helpers
Il2Cpp.NolanBehaviour nb = p_GameObject.GetComponent<Il2Cpp.NolanBehaviour>(); Il2Cpp.NolanBehaviour nb = p_GameObject.GetComponent<Il2Cpp.NolanBehaviour>();
Il2Cpp.SurvivalReviveInteractable _reviveInteractable = UnityEngine.Object.FindObjectOfType<Il2Cpp.SurvivalReviveInteractable>(); Il2Cpp.SurvivalReviveInteractable _reviveInteractable = UnityEngine.Object.FindObjectOfType<Il2Cpp.SurvivalReviveInteractable>();
_reviveInteractable.Interact(nb.gameObject); if (_reviveInteractable.CanInteract(nb.gameObject) == true) { _reviveInteractable.Interact(nb.gameObject); }
} }
public void Jumpscare() public void Jumpscare() //TOFIX doesn't seem to be working
{ {
if (!BoltNetwork.IsServer) if (!BoltNetwork.IsServer)
{ {
@@ -189,10 +190,15 @@ namespace DevourClient.Helpers
public static Il2Cpp.CorpseBehaviour[] Corpses = default!; public static Il2Cpp.CorpseBehaviour[] Corpses = default!;
public static Il2Cpp.CrowBehaviour[] Crows = default!; public static Il2Cpp.CrowBehaviour[] Crows = default!;
public static Il2Cpp.ManorLumpController[] Lumps = default!; public static Il2Cpp.ManorLumpController[] Lumps = default!;
public static Il2Cpp.MonkeyBehaviour[] Monkeys = default!;
// 协程生命周期管理
private static List<object> activeCoroutines = new List<object>();
private static bool isRunning = false;
public static IEnumerator GetLocalPlayer() public static IEnumerator GetLocalPlayer()
{ {
while (true) while (isRunning)
{ {
GameObject[] currentPlayers = GameObject.FindGameObjectsWithTag("Player"); GameObject[] currentPlayers = GameObject.FindGameObjectsWithTag("Player");
@@ -212,7 +218,7 @@ namespace DevourClient.Helpers
public static IEnumerator GetAllPlayers() public static IEnumerator GetAllPlayers()
{ {
while (true) while (isRunning)
{ {
GameObject[] players = GameObject.FindGameObjectsWithTag("Player"); GameObject[] players = GameObject.FindGameObjectsWithTag("Player");
Players = new BasePlayer[players.Length]; Players = new BasePlayer[players.Length];
@@ -249,7 +255,7 @@ namespace DevourClient.Helpers
} }
public static IEnumerator GetGoatsAndRats() public static IEnumerator GetGoatsAndRats()
{ {
while (true) while (isRunning)
{ {
GoatsAndRats = Il2Cpp.GoatBehaviour.FindObjectsOfType<Il2Cpp.GoatBehaviour>(); GoatsAndRats = Il2Cpp.GoatBehaviour.FindObjectsOfType<Il2Cpp.GoatBehaviour>();
@@ -260,7 +266,7 @@ namespace DevourClient.Helpers
public static IEnumerator GetSurvivalInteractables() public static IEnumerator GetSurvivalInteractables()
{ {
while (true) while (isRunning)
{ {
SurvivalInteractables = Il2Cpp.SurvivalInteractable.FindObjectsOfType<Il2Cpp.SurvivalInteractable>(); SurvivalInteractables = Il2Cpp.SurvivalInteractable.FindObjectsOfType<Il2Cpp.SurvivalInteractable>();
@@ -271,7 +277,7 @@ namespace DevourClient.Helpers
public static IEnumerator GetKeys() public static IEnumerator GetKeys()
{ {
while (true) while (isRunning)
{ {
Keys = Il2Cpp.KeyBehaviour.FindObjectsOfType<Il2Cpp.KeyBehaviour>(); Keys = Il2Cpp.KeyBehaviour.FindObjectsOfType<Il2Cpp.KeyBehaviour>();
@@ -282,7 +288,7 @@ namespace DevourClient.Helpers
public static IEnumerator GetDemons() public static IEnumerator GetDemons()
{ {
while (true) while (isRunning)
{ {
Demons = Il2Cpp.SurvivalDemonBehaviour.FindObjectsOfType<Il2Cpp.SurvivalDemonBehaviour>(); Demons = Il2Cpp.SurvivalDemonBehaviour.FindObjectsOfType<Il2Cpp.SurvivalDemonBehaviour>();
@@ -293,7 +299,7 @@ namespace DevourClient.Helpers
public static IEnumerator GetSpiders() public static IEnumerator GetSpiders()
{ {
while (true) while (isRunning)
{ {
Spiders = Il2Cpp.SpiderBehaviour.FindObjectsOfType<Il2Cpp.SpiderBehaviour>(); Spiders = Il2Cpp.SpiderBehaviour.FindObjectsOfType<Il2Cpp.SpiderBehaviour>();
@@ -304,7 +310,7 @@ namespace DevourClient.Helpers
public static IEnumerator GetGhosts() public static IEnumerator GetGhosts()
{ {
while (true) while (isRunning)
{ {
Ghosts = Il2Cpp.GhostBehaviour.FindObjectsOfType<Il2Cpp.GhostBehaviour>(); Ghosts = Il2Cpp.GhostBehaviour.FindObjectsOfType<Il2Cpp.GhostBehaviour>();
@@ -315,7 +321,7 @@ namespace DevourClient.Helpers
public static IEnumerator GetBoars() public static IEnumerator GetBoars()
{ {
while (true) while (isRunning)
{ {
Boars = Il2Cpp.BoarBehaviour.FindObjectsOfType<Il2Cpp.BoarBehaviour>(); Boars = Il2Cpp.BoarBehaviour.FindObjectsOfType<Il2Cpp.BoarBehaviour>();
@@ -326,7 +332,7 @@ namespace DevourClient.Helpers
public static IEnumerator GetCorpses() public static IEnumerator GetCorpses()
{ {
while (true) while (isRunning)
{ {
Corpses = Il2Cpp.CorpseBehaviour.FindObjectsOfType<Il2Cpp.CorpseBehaviour>(); Corpses = Il2Cpp.CorpseBehaviour.FindObjectsOfType<Il2Cpp.CorpseBehaviour>();
@@ -337,7 +343,7 @@ namespace DevourClient.Helpers
public static IEnumerator GetCrows() public static IEnumerator GetCrows()
{ {
while (true) while (isRunning)
{ {
Crows = Il2Cpp.CrowBehaviour.FindObjectsOfType<Il2Cpp.CrowBehaviour>(); Crows = Il2Cpp.CrowBehaviour.FindObjectsOfType<Il2Cpp.CrowBehaviour>();
@@ -348,7 +354,7 @@ namespace DevourClient.Helpers
public static IEnumerator GetLumps() public static IEnumerator GetLumps()
{ {
while (true) while (isRunning)
{ {
Lumps = Il2Cpp.ManorLumpController.FindObjectsOfType<Il2Cpp.ManorLumpController>(); Lumps = Il2Cpp.ManorLumpController.FindObjectsOfType<Il2Cpp.ManorLumpController>();
@@ -357,12 +363,20 @@ namespace DevourClient.Helpers
} }
} }
public static IEnumerator GetMonkeys()
{
while (isRunning)
{
Monkeys = Il2Cpp.MonkeyBehaviour.FindObjectsOfType<Il2Cpp.MonkeyBehaviour>();
// Wait 5 seconds before caching objects again.
yield return new WaitForSeconds(5f);
}
}
public static IEnumerator GetAzazels() public static IEnumerator GetAzazels()
{ {
/* while (isRunning)
* ikr AzazelS, because in case we spawn multiple we want the esp to render all of them
*/
while (true)
{ {
Azazels = Il2Cpp.SurvivalAzazelBehaviour.FindObjectsOfType<Il2Cpp.SurvivalAzazelBehaviour>(); Azazels = Il2Cpp.SurvivalAzazelBehaviour.FindObjectsOfType<Il2Cpp.SurvivalAzazelBehaviour>();
@@ -370,5 +384,86 @@ namespace DevourClient.Helpers
yield return new WaitForSeconds(5f); yield return new WaitForSeconds(5f);
} }
} }
public static void StartAllCoroutines()
{
isRunning = true;
}
public static void StopAllCoroutines()
{
try
{
isRunning = false;
foreach (var coroutine in activeCoroutines)
{
if (coroutine != null)
{
MelonCoroutines.Stop(coroutine);
}
}
activeCoroutines.Clear();
CleanupCachedObjects();
MelonLogger.Msg("All coroutines stopped and cleaned up successfully.");
}
catch (System.Exception ex)
{
MelonLogger.Error($"Error stopping coroutines: {ex.Message}");
}
}
public static void CleanupCachedObjects()
{
try
{
if (Players != null)
{
foreach (var player in Players)
{
if (player != null)
{
player.p_GameObject = null;
}
}
}
Players = null;
GoatsAndRats = null;
SurvivalInteractables = null;
Keys = null;
Demons = null;
Spiders = null;
Ghosts = null;
Azazels = null;
Boars = null;
Corpses = null;
Crows = null;
Lumps = null;
Monkeys = null;
if (LocalPlayer_ != null)
{
LocalPlayer_.p_GameObject = null;
}
MelonLogger.Msg("Cached objects cleaned up successfully.");
}
catch (System.Exception ex)
{
MelonLogger.Error($"Error cleaning up cached objects: {ex.Message}");
}
}
public static void RegisterCoroutine(object coroutine)
{
if (coroutine != null && !activeCoroutines.Contains(coroutine))
{
activeCoroutines.Add(coroutine);
}
}
} }
} }

View File

@@ -1,4 +1,5 @@
using HarmonyLib; using HarmonyLib;
using Il2Cpp;
namespace DevourClient.Hooks namespace DevourClient.Hooks
{ {
@@ -116,5 +117,16 @@ namespace DevourClient.Hooks
return; return;
} }
} }
[HarmonyPatch(typeof(ManorMirrorController))]
[HarmonyPatch(nameof(ManorMirrorController.IsBroken))] //annotation boiler plate to tell Harmony what to patch. Refer to docs.
static class ManorMirrorController_IsBroken
{
static void Postfix(ref bool __result)
{
if (ClientMain.infinite_mirrors)
__result = false;
}
}
} }
} }

View File

@@ -0,0 +1,789 @@
using System.Collections.Generic;
namespace DevourClient.Localization
{
public enum Language
{
English,
Chinese,
French,
German,
Spanish,
Japanese,
Korean,
Russian,
Portuguese,
Italian
}
public static class MultiLanguageSystem
{
public static Language CurrentLanguage { get; set; } = Language.English;
private static readonly Dictionary<Language, string> LanguageDisplayNames = new Dictionary<Language, string>
{
{ Language.English, "English" },
{ Language.Chinese, "简体中文" },
{ Language.French, "Français" },
{ Language.German, "Deutsch" },
{ Language.Spanish, "Español" },
{ Language.Japanese, "日本語" },
{ Language.Korean, "한국어" },
{ Language.Russian, "Русский" },
{ Language.Portuguese, "Português" },
{ Language.Italian, "Italiano" }
};
private static readonly Dictionary<string, Dictionary<Language, string>> Translations =
new Dictionary<string, Dictionary<Language, string>>();
static MultiLanguageSystem()
{
InitializeTranslations();
}
private static void InitializeTranslations()
{
AddTranslation("Key",
cn: "钥匙", fr: "Clé", de: "Schlüssel", es: "Llave",
ja: "鍵", ko: "열쇠", ru: "Ключ", pt: "Chave", it: "Chiave");
AddTranslation("Hay",
cn: "干草", fr: "Foin", de: "Heu", es: "Heno",
ja: "干し草", ko: "건초", ru: "Сено", pt: "Feno", it: "Fieno");
AddTranslation("FirstAid",
cn: "急救包", fr: "Trousse de premiers soins", de: "Erste Hilfe", es: "Botiquín",
ja: "救急箱", ko: "응급처치", ru: "Аптечка", pt: "Primeiros socorros", it: "Pronto soccorso");
AddTranslation("Battery",
cn: "电池", fr: "Batterie", de: "Batterie", es: "Batería",
ja: "バッテリー", ko: "배터리", ru: "Батарея", pt: "Bateria", it: "Batteria");
AddTranslation("Gasoline",
cn: "汽油", fr: "Essence", de: "Benzin", es: "Gasolina",
ja: "ガソリン", ko: "휘발유", ru: "Бензин", pt: "Gasolina", it: "Benzina");
AddTranslation("Fuse",
cn: "保险丝", fr: "Fusible", de: "Sicherung", es: "Fusible",
ja: "ヒューズ", ko: "퓨즈", ru: "Предохранитель", pt: "Fusível", it: "Fusibile");
AddTranslation("Food",
cn: "食物", fr: "Nourriture", de: "Essen", es: "Comida",
ja: "食べ物", ko: "음식", ru: "Еда", pt: "Comida", it: "Cibo");
AddTranslation("RottenFood",
cn: "腐烂食物", fr: "Nourriture pourrie", de: "Verdorbenes Essen", es: "Comida podrida",
ja: "腐った食べ物", ko: "썩은 음식", ru: "Гнилая еда", pt: "Comida podre", it: "Cibo marcio");
AddTranslation("Bone",
cn: "骨头", fr: "Os", de: "Knochen", es: "Hueso",
ja: "骨", ko: "뼈", ru: "Кость", pt: "Osso", it: "Osso");
AddTranslation("Bleach",
cn: "漂白剂", fr: "Eau de Javel", de: "Bleichmittel", es: "Lejía",
ja: "漂白剤", ko: "표백제", ru: "Отбеливатель", pt: "Alvejante", it: "Candeggina");
AddTranslation("Matchbox",
cn: "火柴盒", fr: "Boîte d'allumettes", de: "Streichholzschachtel", es: "Caja de cerillas",
ja: "マッチ箱", ko: "성냥갑", ru: "Спички", pt: "Caixa de fósforos", it: "Scatola di fiammiferi");
AddTranslation("Spade",
cn: "铲子", fr: "Pelle", de: "Spaten", es: "Pala",
ja: "シャベル", ko: "삽", ru: "Лопата", pt: "Pá", it: "Vanga");
AddTranslation("Cake",
cn: "蛋糕", fr: "Gâteau", de: "Kuchen", es: "Pastel",
ja: "ケーキ", ko: "케이크", ru: "Торт", pt: "Bolo", it: "Torta");
AddTranslation("MusicBox",
cn: "音乐盒", fr: "Boîte à musique", de: "Spieluhr", es: "Caja de música",
ja: "オルゴール", ko: "오르골", ru: "Музыкальная шкатулка", pt: "Caixa de música", it: "Carillon");
AddTranslation("MusicBox-Idle",
cn: "音乐盒", fr: "Boîte à musique", de: "Spieluhr", es: "Caja de música",
ja: "オルゴール", ko: "오르골", ru: "Музыкальная шкатулка", pt: "Caixa de música", it: "Carillon");
AddTranslation("Coin",
cn: "硬币", fr: "Pièce", de: "Münze", es: "Moneda",
ja: "コイン", ko: "동전", ru: "Монета", pt: "Moeda", it: "Moneta");
// 仪式物品
AddTranslation("Egg",
cn: "鸡蛋", fr: "Œuf", de: "Ei", es: "Huevo",
ja: "卵", ko: "달걀", ru: "Яйцо", pt: "Ovo", it: "Uovo");
for (int i = 1; i <= 10; i++)
{
AddTranslation($"Egg-Clean-{i}",
cn: $"鸡蛋-{i}", fr: $"Œuf-{i}", de: $"Ei-{i}", es: $"Huevo-{i}",
ja: $"卵-{i}", ko: $"달걀-{i}", ru: $"Яйцо-{i}", pt: $"Ovo-{i}", it: $"Uovo-{i}");
}
AddTranslation("RitualBook",
cn: "仪式书", fr: "Livre rituel", de: "Ritualbuch", es: "Libro ritual",
ja: "儀式の本", ko: "의식서", ru: "Ритуальная книга", pt: "Livro ritual", it: "Libro rituale");
AddTranslation("DollHead",
cn: "玩偶头", fr: "Tête de poupée", de: "Puppenkopf", es: "Cabeza de muñeca",
ja: "人形の頭", ko: "인형 머리", ru: "Голова куклы", pt: "Cabeça de boneca", it: "Testa di bambola");
AddTranslation("Head",
cn: "头颅", fr: "Tête", de: "Kopf", es: "Cabeza",
ja: "頭", ko: "머리", ru: "Голова", pt: "Cabeça", it: "Testa");
AddTranslation("CleanHead",
cn: "干净的头颅", fr: "Tête propre", de: "Sauberer Kopf", es: "Cabeza limpia",
ja: "きれいな頭", ko: "깨끗한 머리", ru: "Чистая голова", pt: "Cabeça limpa", it: "Testa pulita");
AddTranslation("Goat",
cn: "山羊", fr: "Chèvre", de: "Ziege", es: "Cabra",
ja: "ヤギ", ko: "염소", ru: "Коза", pt: "Cabra", it: "Capra");
AddTranslation("Rat",
cn: "老鼠", fr: "Rat", de: "Ratte", es: "Rata",
ja: "ネズミ", ko: "쥐", ru: "Крыса", pt: "Rato", it: "Ratto");
AddTranslation("Pig",
cn: "猪", fr: "Cochon", de: "Schwein", es: "Cerdo",
ja: "豚", ko: "돼지", ru: "Свинья", pt: "Porco", it: "Maiale");
AddTranslation("Azazel",
cn: "Azazel", fr: "Azazel", de: "Azazel", es: "Azazel",
ja: "Azazel", ko: "Azazel", ru: "Azazel", pt: "Azazel", it: "Azazel");
AddTranslation("Demon",
cn: "恶魔", fr: "Démon", de: "Dämon", es: "Demonio",
ja: "悪魔", ko: "악마", ru: "Демон", pt: "Demônio", it: "Demone");
AddTranslation("Spider",
cn: "蜘蛛", fr: "Araignée", de: "Spinne", es: "Araña",
ja: "クモ", ko: "거미", ru: "Паук", pt: "Aranha", it: "Ragno");
AddTranslation("Ghost",
cn: "鬼魂", fr: "Fantôme", de: "Geist", es: "Fantasma",
ja: "幽霊", ko: "유령", ru: "Призрак", pt: "Fantasma", it: "Fantasma");
AddTranslation("Boar",
cn: "野猪", fr: "Sanglier", de: "Wildschwein", es: "Jabalí",
ja: "イノシシ", ko: "멧돼지", ru: "Кабан", pt: "Javali", it: "Cinghiale");
AddTranslation("Corpse",
cn: "尸体", fr: "Cadavre", de: "Leiche", es: "Cadáver",
ja: "死体", ko: "시체", ru: "Труп", pt: "Cadáver", it: "Cadavere");
AddTranslation("Crow",
cn: "乌鸦", fr: "Corbeau", de: "Krähe", es: "Cuervo",
ja: "カラス", ko: "까마귀", ru: "Ворона", pt: "Corvo", it: "Corvo");
AddTranslation("Lump",
cn: "肿块", fr: "Masse", de: "Klumpen", es: "Bulto",
ja: "塊", ko: "덩어리", ru: "Комок", pt: "Caroço", it: "Grumo");
AddTranslation("Monkey",
cn: "猴子", fr: "Singe", de: "Affe", es: "Mono",
ja: "猿", ko: "원숭이", ru: "Обезьяна", pt: "Macaco", it: "Scimmia");
AddTranslation("Inmate",
cn: "囚犯", fr: "Détenu", de: "Häftling", es: "Recluso",
ja: "囚人", ko: "수감자", ru: "Заключенный", pt: "Detento", it: "Detenuto");
AddTranslation("AzazelSam",
cn: "Azazel-Sam", fr: "Azazel-Sam", de: "Azazel-Sam", es: "Azazel-Sam",
ja: "Azazel-Sam", ko: "Azazel-Sam", ru: "Azazel-Sam", pt: "Azazel-Sam", it: "Azazel-Sam");
AddTranslation("AzazelMolly",
cn: "Azazel-Molly", fr: "Azazel-Molly", de: "Azazel-Molly", es: "Azazel-Molly",
ja: "Azazel-Molly", ko: "Azazel-Molly", ru: "Azazel-Molly", pt: "Azazel-Molly", it: "Azazel-Molly");
AddTranslation("AzazelAnna",
cn: "Azazel-Anna", fr: "Azazel-Anna", de: "Azazel-Anna", es: "Azazel-Anna",
ja: "Azazel-Anna", ko: "Azazel-Anna", ru: "Azazel-Anna", pt: "Azazel-Anna", it: "Azazel-Anna");
AddTranslation("AzazelZara",
cn: "Azazel-Zara", fr: "Azazel-Zara", de: "Azazel-Zara", es: "Azazel-Zara",
ja: "Azazel-Zara", ko: "Azazel-Zara", ru: "Azazel-Zara", pt: "Azazel-Zara", it: "Azazel-Zara");
AddTranslation("AzazelNathan",
cn: "Azazel-Nathan", fr: "Azazel-Nathan", de: "Azazel-Nathan", es: "Azazel-Nathan",
ja: "Azazel-Nathan", ko: "Azazel-Nathan", ru: "Azazel-Nathan", pt: "Azazel-Nathan", it: "Azazel-Nathan");
AddTranslation("AzazelApril",
cn: "Azazel-April", fr: "Azazel-April", de: "Azazel-April", es: "Azazel-April",
ja: "Azazel-April", ko: "Azazel-April", ru: "Azazel-April", pt: "Azazel-April", it: "Azazel-April");
AddTranslation("AzazelKai",
cn: "Azazel-Kai", fr: "Azazel-Kai", de: "Azazel-Kai", es: "Azazel-Kai",
ja: "Azazel-Kai", ko: "Azazel-Kai", ru: "Azazel-Kai", pt: "Azazel-Kai", it: "Azazel-Kai");
AddTranslation("Sam",
cn: "萨姆", fr: "Sam", de: "Sam", es: "Sam",
ja: "サム", ko: "샘", ru: "Сэм", pt: "Sam", it: "Sam");
AddTranslation("Anna",
cn: "安娜", fr: "Anna", de: "Anna", es: "Anna",
ja: "アンナ", ko: "안나", ru: "Анна", pt: "Anna", it: "Anna");
AddTranslation("Zara",
cn: "扎拉", fr: "Zara", de: "Zara", es: "Zara",
ja: "ザラ", ko: "자라", ru: "Зара", pt: "Zara", it: "Zara");
AddTranslation("Devour",
cn: "农舍", fr: "Ferme", de: "Bauernhof", es: "Granja",
ja: "農家", ko: "농가", ru: "Ферма", pt: "Fazenda", it: "Fattoria");
AddTranslation("Farmhouse",
cn: "农舍", fr: "Ferme", de: "Bauernhof", es: "Granja",
ja: "農家", ko: "농가", ru: "Ферма", pt: "Fazenda", it: "Fattoria");
AddTranslation("Molly",
cn: "精神病院", fr: "Asile", de: "Anstalt", es: "Asilo",
ja: "精神病院", ko: "정신병원", ru: "Психбольница", pt: "Asilo", it: "Manicomio");
AddTranslation("Asylum",
cn: "精神病院", fr: "Asile", de: "Anstalt", es: "Asilo",
ja: "精神病院", ko: "정신병원", ru: "Психбольница", pt: "Asilo", it: "Manicomio");
AddTranslation("Inn",
cn: "旅馆", fr: "Auberge", de: "Gasthaus", es: "Posada",
ja: "旅館", ko: "여관", ru: "Гостиница", pt: "Pousada", it: "Locanda");
AddTranslation("Town",
cn: "小镇", fr: "Ville", de: "Stadt", es: "Pueblo",
ja: "町", ko: "마을", ru: "Город", pt: "Cidade", it: "Città");
AddTranslation("Slaughterhouse",
cn: "屠宰场", fr: "Abattoir", de: "Schlachthaus", es: "Matadero",
ja: "屠殺場", ko: "도살장", ru: "Бойня", pt: "Matadouro", it: "Macello");
AddTranslation("Manor",
cn: "庄园", fr: "Manoir", de: "Herrenhaus", es: "Mansión",
ja: "邸宅", ko: "저택", ru: "Усадьба", pt: "Solar", it: "Villa");
AddTranslation("Carnival",
cn: "嘉年华", fr: "Carnaval", de: "Karneval", es: "Carnaval",
ja: "カーニバル", ko: "카니발", ru: "Карнавал", pt: "Carnaval", it: "Carnevale");
AddTranslation("Menu",
cn: "菜单", fr: "Menu", de: "Menü", es: "Menú",
ja: "メニュー", ko: "메뉴", ru: "Меню", pt: "Menu", it: "Menu");
AddTranslation("Player",
cn: "玩家", fr: "Joueur", de: "Spieler", es: "Jugador",
ja: "プレイヤー", ko: "플레이어", ru: "Игрок", pt: "Jogador", it: "Giocatore");
AddTranslation("Door",
cn: "门", fr: "Porte", de: "Tür", es: "Puerta",
ja: "ドア", ko: "문", ru: "Дверь", pt: "Porta", it: "Porta");
AddTranslation("Gate",
cn: "大门", fr: "Portail", de: "Tor", es: "Portal",
ja: "門", ko: "대문", ru: "Ворота", pt: "Portão", it: "Cancello");
AddTranslation("Altar",
cn: "祭坛", fr: "Autel", de: "Altar", es: "Altar",
ja: "祭壇", ko: "제단", ru: "Алтарь", pt: "Altar", it: "Altare");
AddTranslation("Fountain",
cn: "喷泉", fr: "Fontaine", de: "Brunnen", es: "Fuente",
ja: "噴水", ko: "분수", ru: "Фонтан", pt: "Fonte", it: "Fontana");
AddTranslation("Mirror",
cn: "镜子", fr: "Miroir", de: "Spiegel", es: "Espejo",
ja: "鏡", ko: "거울", ru: "Зеркало", pt: "Espelho", it: "Specchio");
AddTranslation("Cage",
cn: "笼子", fr: "Cage", de: "Käfig", es: "Jaula",
ja: "檻", ko: "우리", ru: "Клетка", pt: "Gaiola", it: "Gabbia");
AddTranslation("Big Flashlight",
cn: "大手电筒", fr: "Grande lampe", de: "Große Taschenlampe", es: "Linterna grande",
ja: "大型懐中電灯", ko: "큰 손전등", ru: "Большой фонарик", pt: "Lanterna grande", it: "Grande torcia");
AddTranslation("Fullbright",
cn: "全亮", fr: "Luminosité max", de: "Vollhelligkeit", es: "Brillo completo",
ja: "フルブライト", ko: "전체 밝기", ru: "Полная яркость", pt: "Brilho total", it: "Luminosità piena");
AddTranslation("Unlimited UV Light",
cn: "无限紫外线", fr: "UV illimitée", de: "Unbegrenzte UV", es: "UV ilimitada",
ja: "無限UV", ko: "무제한 UV", ru: "Безлимитный УФ", pt: "UV ilimitada", it: "UV illimitata");
AddTranslation("Crosshair",
cn: "准星", fr: "Réticule", de: "Fadenkreuz", es: "Punto de mira",
ja: "照準", ko: "조준점", ru: "Прицел", pt: "Mira", it: "Mirino");
AddTranslation("Flashlight Color",
cn: "手电筒颜色", fr: "Couleur lampe", de: "Taschenlampenfarbe", es: "Color linterna",
ja: "懐中電灯の色", ko: "손전등 색상", ru: "Цвет фонарика", pt: "Cor da lanterna", it: "Colore torcia");
AddTranslation("TP items to you",
cn: "传送物品到你", fr: "TP objets vers vous", de: "TP Gegenstände zu dir", es: "TP objetos a ti",
ja: "アイテムをテレポート", ko: "아이템 텔레포트", ru: "ТП предметы к вам", pt: "TP itens para você", it: "TP oggetti a te");
AddTranslation("Freeze azazel",
cn: "冻结 Azazel", fr: "Geler Azazel", de: "Azazel einfrieren", es: "Congelar Azazel",
ja: "Azazelを凍結", ko: "Azazel 얼리기", ru: "Заморозить Azazel", pt: "Congelar Azazel", it: "Congela Azazel");
AddTranslation("Azazel & Demons",
cn: "Azazel 和恶魔", fr: "Azazel et démons", de: "Azazel & Dämonen", es: "Azazel y demonios",
ja: "Azazelと悪魔", ko: "Azazel과 악마", ru: "Azazel и демоны", pt: "Azazel e demônios", it: "Azazel e demoni");
AddTranslation("Instant Win",
cn: "瞬间胜利", fr: "Victoire instantanée", de: "Sofortiger Sieg", es: "Victoria instantánea",
ja: "即勝利", ko: "즉시 승리", ru: "Мгновенная победа", pt: "Vitória instantânea", it: "Vittoria istantanea");
AddTranslation("Burn a ritual object",
cn: "燃烧一个仪式物品", fr: "Brûler un objet rituel", de: "Ritualobjekt verbrennen", es: "Quemar objeto ritual",
ja: "儀式の物を燃やす", ko: "의식 물체 태우기", ru: "Сжечь ритуальный объект", pt: "Queimar objeto ritual", it: "Brucia oggetto rituale");
AddTranslation("Burn all ritual objects",
cn: "燃烧所有仪式物品", fr: "Brûler tous les objets", de: "Alle Objekte verbrennen", es: "Quemar todos los objetos",
ja: "すべての物を燃やす", ko: "모든 물체 태우기", ru: "Сжечь все объекты", pt: "Queimar todos os objetos", it: "Brucia tutti gli oggetti");
AddTranslation("Force Start Game",
cn: "强制开始游戏", fr: "Forcer le démarrage", de: "Spiel erzwingen", es: "Forzar inicio",
ja: "強制開始", ko: "강제 시작", ru: "Принудительный старт", pt: "Forçar início", it: "Forza avvio");
AddTranslation("TP to Azazel",
cn: "传送到 Azazel", fr: "TP vers Azazel", de: "TP zu Azazel", es: "TP a Azazel",
ja: "Azazelへテレポート", ko: "Azazel로 텔레포트", ru: "ТП к Azazel", pt: "TP para Azazel", it: "TP ad Azazel");
AddTranslation("Despawn Demons",
cn: "移除恶魔", fr: "Retirer démons", de: "Dämonen entfernen", es: "Eliminar demonios",
ja: "悪魔を削除", ko: "악마 제거", ru: "Удалить демонов", pt: "Remover demônios", it: "Rimuovi demoni");
AddTranslation("Despawn Inmates",
cn: "移除囚犯", fr: "Retirer détenus", de: "Häftlinge entfernen", es: "Eliminar reclusos",
ja: "囚人を削除", ko: "수감자 제거", ru: "Удалить заключенных", pt: "Remover detentos", it: "Rimuovi detenuti");
AddTranslation("Clean The Fountains",
cn: "清洁喷泉", fr: "Nettoyer fontaines", de: "Brunnen reinigen", es: "Limpiar fuentes",
ja: "噴水を掃除", ko: "분수 청소", ru: "Очистить фонтаны", pt: "Limpar fontes", it: "Pulisci fontane");
AddTranslation("Despawn Spiders",
cn: "移除蜘蛛", fr: "Retirer araignées", de: "Spinnen entfernen", es: "Eliminar arañas",
ja: "クモを削除", ko: "거미 제거", ru: "Удалить пауков", pt: "Remover aranhas", it: "Rimuovi ragni");
AddTranslation("Despawn Ghosts",
cn: "移除幽灵", fr: "Retirer fantômes", de: "Geister entfernen", es: "Eliminar fantasmas",
ja: "ゴーストを削除", ko: "유령 제거", ru: "Удалить призраков", pt: "Remover fantasmas", it: "Rimuovi fantasmi");
AddTranslation("Despawn Boars",
cn: "移除野猪", fr: "Retirer sangliers", de: "Wildschweine entfernen", es: "Eliminar jabalíes",
ja: "イノシシを削除", ko: "멧돼지 제거", ru: "Удалить кабанов", pt: "Remover javalis", it: "Rimuovi cinghiali");
AddTranslation("Despawn Corpses",
cn: "移除尸体", fr: "Retirer cadavres", de: "Leichen entfernen", es: "Eliminar cadáveres",
ja: "死体を削除", ko: "시체 제거", ru: "Удалить трупы", pt: "Remover cadáveres", it: "Rimuovi cadaveri");
AddTranslation("Despawn Crows",
cn: "移除乌鸦", fr: "Retirer corbeaux", de: "Krähen entfernen", es: "Eliminar cuervos",
ja: "カラスを削除", ko: "까마귀 제거", ru: "Удалить воронов", pt: "Remover corvos", it: "Rimuovi corvi");
AddTranslation("Despawn Lumps",
cn: "移除肿块", fr: "Retirer masses", de: "Klumpen entfernen", es: "Eliminar bultos",
ja: "塊を削除", ko: "덩어리 제거", ru: "Удалить комки", pt: "Remover massas", it: "Rimuovi grumi");
AddTranslation("Switch realm",
cn: "切换领域", fr: "Changer de royaume", de: "Reich wechseln", es: "Cambiar reino",
ja: "領域を切り替え", ko: "영역 전환", ru: "Сменить мир", pt: "Trocar reino", it: "Cambia regno");
AddTranslation("Switch realm (house)",
cn: "切换领域(房屋)", fr: "Changer (maison)", de: "Reich wechseln (Haus)", es: "Cambiar (casa)",
ja: "領域切替(家)", ko: "영역 전환 (집)", ru: "Сменить (дом)", pt: "Trocar (casa)", it: "Cambia (casa)");
AddTranslation("Infinite mirrors",
cn: "无限镜子", fr: "Miroirs infinis", de: "Unendliche Spiegel", es: "Espejos infinitos",
ja: "無限の鏡", ko: "무한 거울", ru: "Бесконечные зеркала", pt: "Espelhos infinitos", it: "Specchi infiniti");
AddTranslation("Despawn Monkeys",
cn: "移除猴子", fr: "Retirer singes", de: "Affen entfernen", es: "Eliminar monos",
ja: "サルを削除", ko: "원숭이 제거", ru: "Удалить обезьян", pt: "Remover macacos", it: "Rimuovi scimmie");
AddTranslation("Load Map:",
cn: "加载地图:", fr: "Charger carte:", de: "Karte laden:", es: "Cargar mapa:",
ja: "マップ読込:", ko: "맵 로드:", ru: "Загрузить карту:", pt: "Carregar mapa:", it: "Carica mappa:");
AddTranslation("Player ESP",
cn: "玩家透视", fr: "ESP joueur", de: "Spieler ESP", es: "ESP jugador",
ja: "プレイヤーESP", ko: "플레이어 ESP", ru: "ESP игрока", pt: "ESP jogador", it: "ESP giocatore");
AddTranslation("Skeleton ESP",
cn: "骨骼透视", fr: "ESP squelette", de: "Skelett ESP", es: "ESP esqueleto",
ja: "スケルトンESP", ko: "스켈레톤 ESP", ru: "ESP скелета", pt: "ESP esqueleto", it: "ESP scheletro");
AddTranslation("Player Snapline",
cn: "玩家连线", fr: "Ligne joueur", de: "Spieler-Linie", es: "Línea jugador",
ja: "プレイヤーライン", ko: "플레이어 라인", ru: "Линия к игроку", pt: "Linha jogador", it: "Linea giocatore");
AddTranslation("Player ESP Color",
cn: "玩家透视颜色", fr: "Couleur ESP joueur", de: "Spieler ESP Farbe", es: "Color ESP jugador",
ja: "プレイヤーESP色", ko: "플레이어 ESP 색상", ru: "Цвет ESP игрока", pt: "Cor ESP jogador", it: "Colore ESP giocatore");
AddTranslation("Azazel ESP",
cn: "Azazel 透视", fr: "ESP Azazel", de: "Azazel ESP", es: "ESP Azazel",
ja: "Azazel ESP", ko: "Azazel ESP", ru: "ESP Azazel", pt: "ESP Azazel", it: "ESP Azazel");
AddTranslation("Azazel Snapline",
cn: "Azazel 连线", fr: "Ligne Azazel", de: "Azazel-Linie", es: "Línea Azazel",
ja: "Azazelライン", ko: "Azazel 라인", ru: "Линия к Azazel", pt: "Linha Azazel", it: "Linea Azazel");
AddTranslation("Azazel ESP Color",
cn: "Azazel 透视颜色", fr: "Couleur ESP Azazel", de: "Azazel ESP Farbe", es: "Color ESP Azazel",
ja: "Azazel ESP色", ko: "Azazel ESP 색상", ru: "Цвет ESP Azazel", pt: "Cor ESP Azazel", it: "Colore ESP Azazel");
AddTranslation("Item ESP",
cn: "物品透视", fr: "ESP objet", de: "Gegenstands-ESP", es: "ESP objeto",
ja: "アイテムESP", ko: "아이템 ESP", ru: "ESP предметов", pt: "ESP item", it: "ESP oggetto");
AddTranslation("Goat/Rat ESP",
cn: "山羊/老鼠透视", fr: "ESP chèvre/rat", de: "Ziege/Ratte ESP", es: "ESP cabra/rata",
ja: "ヤギ/ネズミESP", ko: "염소/쥐 ESP", ru: "ESP козы/крысы", pt: "ESP cabra/rato", it: "ESP capra/ratto");
AddTranslation("Demon ESP",
cn: "恶魔透视", fr: "ESP démon", de: "Dämon ESP", es: "ESP demonio",
ja: "悪魔ESP", ko: "악마 ESP", ru: "ESP демона", pt: "ESP demônio", it: "ESP demone");
AddTranslation("Unlimited Stamina",
cn: "无限耐力", fr: "Endurance illimitée", de: "Unbegrenzte Ausdauer", es: "Resistencia ilimitada",
ja: "無限スタミナ", ko: "무제한 스태미나", ru: "Безлимитная выносливость", pt: "Resistência ilimitada", it: "Resistenza illimitata");
AddTranslation("Walk In Lobby",
cn: "大厅行走", fr: "Marcher dans le lobby", de: "Im Lobby laufen", es: "Caminar en lobby",
ja: "ロビーで歩く", ko: "로비에서 걷기", ru: "Ходить в лобби", pt: "Andar no lobby", it: "Camminare in lobby");
AddTranslation("Fly",
cn: "飞行", fr: "Voler", de: "Fliegen", es: "Volar",
ja: "飛行", ko: "비행", ru: "Полет", pt: "Voar", it: "Volare");
AddTranslation("Fly Speed",
cn: "飞行速度", fr: "Vitesse vol", de: "Fluggeschwindigkeit", es: "Velocidad vuelo",
ja: "飛行速度", ko: "비행 속도", ru: "Скорость полета", pt: "Velocidade voo", it: "Velocità volo");
AddTranslation("Fast Move",
cn: "快速移动", fr: "Déplacement rapide", de: "Schnelle Bewegung", es: "Movimiento rápido",
ja: "高速移動", ko: "빠른 이동", ru: "Быстрое движение", pt: "Movimento rápido", it: "Movimento veloce");
AddTranslation("Speed Multiplier",
cn: "速度倍数", fr: "Multiplicateur vitesse", de: "Geschwindigkeitsmultiplikator", es: "Multiplicador velocidad",
ja: "速度倍率", ko: "속도 배율", ru: "Множитель скорости", pt: "Multiplicador velocidade", it: "Moltiplicatore velocità");
AddTranslation("Auto Respawn",
cn: "自动重生", fr: "Réapparition auto", de: "Auto-Respawn", es: "Reaparición auto",
ja: "自動リスポーン", ko: "자동 부활", ru: "Авто-возрождение", pt: "Respawn automático", it: "Respawn automatico");
AddTranslation("Exp Modifier",
cn: "经验修改", fr: "Modificateur XP", de: "Erfahrungsmodifikator", es: "Modificador exp",
ja: "経験値変更", ko: "경험치 수정", ru: "Модификатор опыта", pt: "Modificador exp", it: "Modificatore exp");
AddTranslation("Exp Value",
cn: "经验值", fr: "Valeur XP", de: "Erfahrungswert", es: "Valor exp",
ja: "経験値", ko: "경험치 값", ru: "Значение опыта", pt: "Valor exp", it: "Valore exp");
AddTranslation("Unlock Achievements",
cn: "解锁成就", fr: "Débloquer succès", de: "Erfolge freischalten", es: "Desbloquear logros",
ja: "実績解除", ko: "업적 잠금 해제", ru: "Разблокировать достижения", pt: "Desbloquear conquistas", it: "Sblocca obiettivi");
AddTranslation("Unlock Doors",
cn: "解锁门", fr: "Déverrouiller portes", de: "Türen öffnen", es: "Desbloquear puertas",
ja: "ドアを開ける", ko: "문 잠금 해제", ru: "Открыть двери", pt: "Desbloquear portas", it: "Sblocca porte");
AddTranslation("Teleport Keys",
cn: "传送钥匙", fr: "Téléporter clés", de: "Schlüssel teleportieren", es: "Teletransportar llaves",
ja: "鍵をテレポート", ko: "열쇠 텔레포트", ru: "Телепорт ключей", pt: "Teletransportar chaves", it: "Teletrasporta chiavi");
AddTranslation("Play Random Sound",
cn: "播放随机音效", fr: "Jouer son aléatoire", de: "Zufälligen Sound abspielen", es: "Reproducir sonido aleatorio",
ja: "ランダム音再生", ko: "랜덤 사운드 재생", ru: "Воспроизвести случайный звук", pt: "Reproduzir som aleatório", it: "Riproduci suono casuale");
AddTranslation("Spam Chat",
cn: "刷屏聊天", fr: "Spam chat", de: "Chat spammen", es: "Spam chat",
ja: "チャットスパム", ko: "채팅 도배", ru: "Спам в чате", pt: "Spam no chat", it: "Spam chat");
AddTranslation("Spoof Name",
cn: "伪装名字", fr: "Usurper nom", de: "Namen fälschen", es: "Falsificar nombre",
ja: "名前偽装", ko: "이름 위장", ru: "Подменить имя", pt: "Falsificar nome", it: "Falsifica nome");
AddTranslation("Spoof Server Name",
cn: "伪装服务器名", fr: "Usurper nom serveur", de: "Servernamen fälschen", es: "Falsificar nombre servidor",
ja: "サーバー名偽装", ko: "서버 이름 위장", ru: "Подменить имя сервера", pt: "Falsificar nome servidor", it: "Falsifica nome server");
AddTranslation("Spoof Level",
cn: "伪装等级", fr: "Usurper niveau", de: "Level fälschen", es: "Falsificar nivel",
ja: "レベル偽装", ko: "레벨 위장", ru: "Подменить уровень", pt: "Falsificar nível", it: "Falsifica livello");
AddTranslation("Level",
cn: "等级", fr: "Niveau", de: "Level", es: "Nivel",
ja: "レベル", ko: "레벨", ru: "Уровень", pt: "Nível", it: "Livello");
AddTranslation("Players",
cn: "玩家", fr: "Joueurs", de: "Spieler", es: "Jugadores",
ja: "プレイヤー", ko: "플레이어", ru: "Игроки", pt: "Jogadores", it: "Giocatori");
AddTranslation("Teleport to",
cn: "传送到", fr: "Téléporter vers", de: "Teleportieren zu", es: "Teletransportar a",
ja: "テレポート先", ko: "텔레포트", ru: "Телепорт к", pt: "Teletransportar para", it: "Teletrasporta a");
AddTranslation("Kill",
cn: "击杀", fr: "Tuer", de: "Töten", es: "Matar",
ja: "キル", ko: "죽이기", ru: "Убить", pt: "Matar", it: "Uccidi");
AddTranslation("Revive",
cn: "复活", fr: "Réanimer", de: "Wiederbeleben", es: "Revivir",
ja: "蘇生", ko: "부활", ru: "Воскресить", pt: "Reviver", it: "Rianima");
AddTranslation("Visuals",
cn: "视觉", fr: "Visuels", de: "Visuals", es: "Visuales",
ja: "ビジュアル", ko: "비주얼", ru: "Визуалы", pt: "Visuais", it: "Visivi");
AddTranslation("Entities",
cn: "实体", fr: "Entités", de: "Entitäten", es: "Entidades",
ja: "エンティティ", ko: "엔티티", ru: "Сущности", pt: "Entidades", it: "Entità");
AddTranslation("Map",
cn: "地图", fr: "Carte", de: "Karte", es: "Mapa",
ja: "マップ", ko: "맵", ru: "Карта", pt: "Mappa", it: "Mappa");
AddTranslation("ESP",
cn: "透视", fr: "ESP", de: "ESP", es: "ESP",
ja: "ESP", ko: "ESP", ru: "ESP", pt: "ESP", it: "ESP");
AddTranslation("Items",
cn: "物品", fr: "Objets", de: "Gegenstände", es: "Objetos",
ja: "アイテム", ko: "아이템", ru: "Предметы", pt: "Itens", it: "Oggetti");
AddTranslation("Misc",
cn: "杂项", fr: "Divers", de: "Sonstiges", es: "Varios",
ja: "その他", ko: "기타", ru: "Разное", pt: "Diversos", it: "Varie");
AddTranslation("First aid",
cn: "急救包", fr: "Premiers soins", de: "Erste Hilfe", es: "Primeros auxilios",
ja: "救急箱", ko: "응급처치", ru: "Первая помощь", pt: "Primeiros socorros", it: "Pronto soccorso");
AddTranslation("Ritual Objects",
cn: "仪式物品", fr: "Objets rituels", de: "Rituelle Objekte", es: "Objetos rituales",
ja: "儀式の品", ko: "의식 물품", ru: "Ритуальные предметы", pt: "Objetos rituais", it: "Oggetti rituali");
AddTranslation("Spawnable Prefabs",
cn: "可生成物体", fr: "Préfabriqués générables", de: "Erzeugbare Objekte", es: "Objetos generables",
ja: "生成可能なオブジェクト", ko: "생성 가능한 오브젝트", ru: "Создаваемые объекты", pt: "Objetos geráveis", it: "Oggetti generabili");
for (int i = 1; i <= 10; i++)
{
AddTranslation($"Egg-{i}",
cn: $"鸡蛋-{i}", fr: $"Œuf-{i}", de: $"Ei-{i}", es: $"Huevo-{i}",
ja: $"卵-{i}", ko: $"달걀-{i}", ru: $"Яйцо-{i}", pt: $"Ovo-{i}", it: $"Uovo-{i}");
}
AddTranslation("Ritual Book",
cn: "仪式书", fr: "Livre rituel", de: "Ritualbuch", es: "Libro ritual",
ja: "儀式の本", ko: "의식서", ru: "Ритуальная книга", pt: "Livro ritual", it: "Libro rituale");
AddTranslation("Doll Head",
cn: "玩偶头", fr: "Tête de poupée", de: "Puppenkopf", es: "Cabeza de muñeca",
ja: "人形の頭", ko: "인형 머리", ru: "Голова куклы", pt: "Cabeça de boneca", it: "Testa di bambola");
AddTranslation("Animal_Gate",
cn: "动物大门", fr: "Porte des animaux", de: "Tiertor", es: "Puerta de animales",
ja: "動物のゲート", ko: "동물 문", ru: "Ворота для животных", pt: "Portão de animais", it: "Cancello degli animali");
AddTranslation("AsylumDoor",
cn: "精神病院门", fr: "Porte d'asile", de: "Asyltür", es: "Puerta de asilo",
ja: "精神病院のドア", ko: "정신병원 문", ru: "Дверь приюта", pt: "Porta do asilo", it: "Porta dell'asilo");
AddTranslation("AsylumDoubleDoor",
cn: "精神病院双开门", fr: "Double porte d'asile", de: "Asyl-Doppeltür", es: "Puerta doble de asilo",
ja: "精神病院の二重ドア", ko: "정신병원 이중문", ru: "Двойная дверь приюта", pt: "Porta dupla do asilo", it: "Doppia porta dell'asilo");
AddTranslation("AsylumWhiteDoor",
cn: "精神病院白门", fr: "Porte blanche d'asile", de: "Weiße Asyltür", es: "Puerta blanca de asilo",
ja: "精神病院の白いドア", ko: "정신병원 흰색 문", ru: "Белая дверь приюта", pt: "Porta branca do asilo", it: "Porta bianca dell'asilo");
AddTranslation("DevourDoorBack",
cn: "后门", fr: "Porte arrière", de: "Hintertür", es: "Puerta trasera",
ja: "裏口", ko: "뒷문", ru: "Задняя дверь", pt: "Porta traseira", it: "Porta posteriore");
AddTranslation("DevourDoorMain",
cn: "主门", fr: "Porte principale", de: "Haupttür", es: "Puerta principal",
ja: "正面玄関", ko: "정문", ru: "Главная дверь", pt: "Porta principal", it: "Porta principale");
AddTranslation("DevourDoorRoom",
cn: "房间门", fr: "Porte de chambre", de: "Zimmertür", es: "Puerta de habitación",
ja: "部屋のドア", ko: "방문", ru: "Дверь комнаты", pt: "Porta do quarto", it: "Porta della stanza");
AddTranslation("Elevator_Door",
cn: "电梯门", fr: "Porte d'ascenseur", de: "Aufzugstür", es: "Puerta de ascensor",
ja: "エレベーターのドア", ko: "엘리베이터 문", ru: "Дверь лифта", pt: "Porta do elevador", it: "Porta dell'ascensore");
AddTranslation("InnDoor",
cn: "旅馆门", fr: "Porte d'auberge", de: "Gasthoftür", es: "Puerta de posada",
ja: "旅館のドア", ko: "여관 문", ru: "Дверь гостиницы", pt: "Porta da pousada", it: "Porta della locanda");
AddTranslation("InnDoubleDoor",
cn: "旅馆双开门", fr: "Double porte d'auberge", de: "Gasthof-Doppeltür", es: "Puerta doble de posada",
ja: "旅館の二重ドア", ko: "여관 이중문", ru: "Двойная дверь гостиницы", pt: "Porta dupla da pousada", it: "Doppia porta della locanda");
AddTranslation("InnShojiDoor",
cn: "旅馆障子门", fr: "Porte shoji d'auberge", de: "Gasthof-Shoji-Tür", es: "Puerta shoji de posada",
ja: "旅館の障子", ko: "여관 장지문", ru: "Сёдзи дверь гостиницы", pt: "Porta shoji da pousada", it: "Porta shoji della locanda");
AddTranslation("InnShrine",
cn: "旅馆神社", fr: "Sanctuaire d'auberge", de: "Gasthof-Schrein", es: "Santuario de posada",
ja: "旅館の神社", ko: "여관 신사", ru: "Святилище гостиницы", pt: "Santuário da pousada", it: "Santuario della locanda");
AddTranslation("InnWardrobe",
cn: "旅馆衣柜", fr: "Armoire d'auberge", de: "Gasthof-Kleiderschrank", es: "Armario de posada",
ja: "旅館のワードローブ", ko: "여관 옷장", ru: "Шкаф гостиницы", pt: "Guarda-roupa da pousada", it: "Armadio della locanda");
AddTranslation("InnWoodenDoor",
cn: "旅馆木门", fr: "Porte en bois d'auberge", de: "Gasthof-Holztür", es: "Puerta de madera de posada",
ja: "旅館の木製ドア", ko: "여관 나무문", ru: "Деревянная дверь гостиницы", pt: "Porta de madeira da pousada", it: "Porta di legno della locanda");
AddTranslation("PigExcrement",
cn: "猪粪", fr: "Excréments de porc", de: "Schweinekot", es: "Excremento de cerdo",
ja: "豚の排泄物", ko: "돼지 배설물", ru: "Свиной навоз", pt: "Excremento de porco", it: "Escrementi di maiale");
AddTranslation("SlaughterhouseFireEscapeDoor",
cn: "屠宰场消防门", fr: "Porte de secours d'abattoir", de: "Schlachthof-Feuerschutztür", es: "Puerta de escape de matadero",
ja: "屠殺場の非常口", ko: "도축장 비상구", ru: "Пожарная дверь бойни", pt: "Porta de incêndio do matadouro", it: "Porta antincendio del mattatoio");
AddTranslation("SurvivalAltarMolly",
cn: "莫莉祭坛", fr: "Autel de Molly", de: "Molly-Altar", es: "Altar de Molly",
ja: "モリーの祭壇", ko: "몰리 제단", ru: "Алтарь Молли", pt: "Altar de Molly", it: "Altare di Molly");
AddTranslation("SurvivalAltarSlaughterhouse",
cn: "屠宰场祭坛", fr: "Autel d'abattoir", de: "Schlachthof-Altar", es: "Altar de matadero",
ja: "屠殺場の祭壇", ko: "도축장 제단", ru: "Алтарь бойни", pt: "Altar do matadouro", it: "Altare del mattatoio");
AddTranslation("SurvivalAltarTown",
cn: "小镇祭坛", fr: "Autel de ville", de: "Stadt-Altar", es: "Altar de pueblo",
ja: "町の祭壇", ko: "마을 제단", ru: "Алтарь города", pt: "Altar da cidade", it: "Altare della città");
AddTranslation("SurvivalCultist",
cn: "邪教徒", fr: "Cultiste", de: "Kultist", es: "Cultista",
ja: "カルト信者", ko: "광신도", ru: "Культист", pt: "Cultista", it: "Cultista");
AddTranslation("SurvivalKai",
cn: "凯", fr: "Kai", de: "Kai", es: "Kai",
ja: "カイ", ko: "카이", ru: "Кай", pt: "Kai", it: "Kai");
AddTranslation("SurvivalNathan",
cn: "内森", fr: "Nathan", de: "Nathan", es: "Nathan",
ja: "ネイサン", ko: "네이선", ru: "Натан", pt: "Nathan", it: "Nathan");
AddTranslation("SurvivalMolly",
cn: "莫莉", fr: "Molly", de: "Molly", es: "Molly",
ja: "モリー", ko: "몰리", ru: "Молли", pt: "Molly", it: "Molly");
AddTranslation("SurvivalApril",
cn: "艾普尔", fr: "April", de: "April", es: "April",
ja: "エイプリル", ko: "에이프릴", ru: "Эйприл", pt: "April", it: "April");
AddTranslation("SurvivalFrank",
cn: "弗兰克", fr: "Frank", de: "Frank", es: "Frank",
ja: "フランク", ko: "프랭크", ru: "Фрэнк", pt: "Frank", it: "Frank");
AddTranslation("SurvivalRose",
cn: "罗斯", fr: "Rose", de: "Rose", es: "Rose",
ja: "ローズ", ko: "로즈", ru: "Роуз", pt: "Rose", it: "Rose");
AddTranslation("SurvivalSmashableWindow",
cn: "可破坏窗户", fr: "Fenêtre cassable", de: "Zerbrechliches Fenster", es: "Ventana rompible",
ja: "破壊可能な窓", ko: "파괴 가능한 창문", ru: "Разбиваемое окно", pt: "Janela quebrável", it: "Finestra distruttibile");
AddTranslation("TownDoor",
cn: "小镇门", fr: "Porte de ville", de: "Stadttür", es: "Puerta de pueblo",
ja: "町のドア", ko: "마을 문", ru: "Дверь города", pt: "Porta da cidade", it: "Porta della città");
AddTranslation("TownDoor2",
cn: "小镇门2", fr: "Porte de ville 2", de: "Stadttür 2", es: "Puerta de pueblo 2",
ja: "町のドア2", ko: "마을 문2", ru: "Дверь города 2", pt: "Porta da cidade 2", it: "Porta della città 2");
AddTranslation("TownPentagram",
cn: "小镇五芒星", fr: "Pentagramme de ville", de: "Stadt-Pentagramm", es: "Pentagrama de pueblo",
ja: "町の五芒星", ko: "마을 오각별", ru: "Пентаграмма города", pt: "Pentagrama da cidade", it: "Pentagramma della città");
AddTranslation("TrashCan",
cn: "垃圾桶", fr: "Poubelle", de: "Mülleimer", es: "Papelera",
ja: "ゴミ箱", ko: "쓰레기통", ru: "Мусорный бак", pt: "Lixeira", it: "Cestino");
AddTranslation("Truck_Shutter",
cn: "卡车卷帘门", fr: "Volet de camion", de: "LKW-Rolltor", es: "Persiana de camión",
ja: "トラックのシャッター", ko: "트럭 셔터", ru: "Ставни грузовика", pt: "Persiana de caminhão", it: "Serranda del camion");
AddTranslation("TV",
cn: "电视", fr: "Télévision", de: "Fernseher", es: "Televisión",
ja: "テレビ", ko: "TV", ru: "Телевизор", pt: "Televisão", it: "Televisione");
}
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)
{
var translations = new Dictionary<Language, string>
{
{ Language.English, english }
};
if (cn != null) translations[Language.Chinese] = cn;
if (fr != null) translations[Language.French] = fr;
if (de != null) translations[Language.German] = de;
if (es != null) translations[Language.Spanish] = es;
if (ja != null) translations[Language.Japanese] = ja;
if (ko != null) translations[Language.Korean] = ko;
if (ru != null) translations[Language.Russian] = ru;
if (pt != null) translations[Language.Portuguese] = pt;
if (it != null) translations[Language.Italian] = it;
Translations[english] = translations;
}
public static string Translate(string englishText)
{
if (string.IsNullOrEmpty(englishText))
return englishText;
if (CurrentLanguage == Language.English)
return englishText;
if (Translations.TryGetValue(englishText, out var languageDict))
{
if (languageDict.TryGetValue(CurrentLanguage, out var translation))
{
return translation;
}
}
return englishText;
}
public static string GetLanguageDisplayName(Language language)
{
return LanguageDisplayNames.TryGetValue(language, out var name) ? name : language.ToString();
}
public static Language[] GetAllLanguages()
{
return (Language[])System.Enum.GetValues(typeof(Language));
}
public static int GetTotalTranslationCount()
{
return Translations.Count;
}
public static void AddCustomTranslation(string englishText, Language language, string translation)
{
if (!Translations.ContainsKey(englishText))
{
Translations[englishText] = new Dictionary<Language, string>
{
{ Language.English, englishText }
};
}
Translations[englishText][language] = translation;
}
}
}

View File

@@ -0,0 +1,154 @@
using System.Collections.Generic;
namespace DevourClient.Localization
{
public static class TranslationDict
{
public static bool EnableChineseTranslation { get; set; } = true;
private static readonly Dictionary<string, string> ItemTranslations = new Dictionary<string, string>
{
{ "Key", "钥匙" },
{ "Hay", "干草" },
{ "FirstAid", "急救包" },
{ "Battery", "电池" },
{ "Gasoline", "汽油" },
{ "Fuse", "保险丝" },
{ "Food", "食物" },
{ "RottenFood", "腐烂食物" },
{ "Bone", "骨头" },
{ "Bleach", "漂白剂" },
{ "Matchbox", "火柴盒" },
{ "Spade", "铲子" },
{ "Cake", "蛋糕" },
{ "MusicBox", "音乐盒" },
{ "Coin", "硬币" },
{ "Egg", "鸡蛋" },
{ "Egg-Clean-1", "鸡蛋-1" },
{ "Egg-Clean-2", "鸡蛋-2" },
{ "Egg-Clean-3", "鸡蛋-3" },
{ "Egg-Clean-4", "鸡蛋-4" },
{ "Egg-Clean-5", "鸡蛋-5" },
{ "Egg-Clean-6", "鸡蛋-6" },
{ "Egg-Clean-7", "鸡蛋-7" },
{ "Egg-Clean-8", "鸡蛋-8" },
{ "Egg-Clean-9", "鸡蛋-9" },
{ "Egg-Clean-10", "鸡蛋-10" },
{ "RitualBook", "仪式书" },
{ "DollHead", "玩偶头" },
{ "Head", "头颅" },
{ "CleanHead", "干净的头颅" },
};
private static readonly Dictionary<string, string> AnimalTranslations = new Dictionary<string, string>
{
{ "Goat", "山羊" },
{ "Rat", "老鼠" },
{ "Pig", "猪" },
};
private static readonly Dictionary<string, string> EnemyTranslations = new Dictionary<string, string>
{
{ "Azazel", "阿撒泻勒" },
{ "Demon", "恶魔" },
{ "Spider", "蜘蛛" },
{ "Ghost", "鬼魂" },
{ "Boar", "野猪" },
{ "Corpse", "尸体" },
{ "Crow", "乌鸦" },
{ "Lump", "肿块" },
{ "Monkey", "猴子" },
{ "Inmate", "囚犯" },
{ "AzazelSam", "阿撒泻勒-萨姆" },
{ "AzazelMolly", "阿撒泻勒-莫莉" },
{ "AzazelAnna", "阿撒泻勒-安娜" },
{ "AzazelZara", "阿撒泻勒-扎拉" },
{ "AzazelNathan", "阿撒泻勒-内森" },
{ "AzazelApril", "阿撒泻勒-艾普尔" },
{ "AzazelKai", "阿撒泻勒-凯" },
};
private static readonly Dictionary<string, string> MapTranslations = new Dictionary<string, string>
{
{ "Devour", "农舍" },
{ "Farmhouse", "农舍" },
{ "Molly", "精神病院" },
{ "Asylum", "精神病院" },
{ "Inn", "旅馆" },
{ "Town", "小镇" },
{ "Slaughterhouse", "屠宰场" },
{ "Manor", "庄园" },
{ "Carnival", "嘉年华" },
{ "Menu", "菜单" },
};
private static readonly Dictionary<string, string> OtherTranslations = new Dictionary<string, string>
{
{ "Player", "玩家" },
{ "Door", "门" },
{ "Gate", "大门" },
{ "Altar", "祭坛" },
{ "Fountain", "喷泉" },
{ "Mirror", "镜子" },
{ "Cage", "笼子" },
};
public static string Translate(string englishName)
{
if (!EnableChineseTranslation || string.IsNullOrEmpty(englishName))
{
return englishName;
}
if (ItemTranslations.TryGetValue(englishName, out string itemTranslation))
{
return itemTranslation;
}
if (AnimalTranslations.TryGetValue(englishName, out string animalTranslation))
{
return animalTranslation;
}
if (EnemyTranslations.TryGetValue(englishName, out string enemyTranslation))
{
return enemyTranslation;
}
if (MapTranslations.TryGetValue(englishName, out string mapTranslation))
{
return mapTranslation;
}
if (OtherTranslations.TryGetValue(englishName, out string otherTranslation))
{
return otherTranslation;
}
return englishName;
}
public static void AddCustomTranslations(Dictionary<string, string> customTranslations)
{
if (customTranslations == null) return;
foreach (var kvp in customTranslations)
{
if (!ItemTranslations.ContainsKey(kvp.Key))
{
ItemTranslations.Add(kvp.Key, kvp.Value);
}
}
}
public static int GetTotalTranslationCount()
{
return ItemTranslations.Count + AnimalTranslations.Count +
EnemyTranslations.Count + MapTranslations.Count +
OtherTranslations.Count;
}
}
}

View File

@@ -1,4 +1,5 @@
using UnityEngine; using UnityEngine;
using DevourClient.Localization;
namespace DevourClient.Settings namespace DevourClient.Settings
{ {
@@ -19,9 +20,12 @@ namespace DevourClient.Settings
public static Vector2 rituelObjectsScrollPosition = Vector2.zero; public static Vector2 rituelObjectsScrollPosition = Vector2.zero;
public static Vector2 stuffsScrollPosition = Vector2.zero; public static Vector2 stuffsScrollPosition = Vector2.zero;
public static Language selectedLanguage = Language.English;
public static bool showLanguageSelector = false;
public static KeyCode GetKey() public static KeyCode GetKey()
{ {
Thread.Sleep(50); //TOFIX tried using anyKeydown, no success Thread.Sleep(50);
foreach (KeyCode vkey in System.Enum.GetValues(typeof(KeyCode))) foreach (KeyCode vkey in System.Enum.GetValues(typeof(KeyCode)))
{ {
if (Input.GetKey(vkey)) if (Input.GetKey(vkey))

View File

@@ -6,7 +6,12 @@ Very based cheat for the game Devour.
## Detection rate ## Detection rate
Well at this point i don't really know, i think there is some sort of native Unity anti cheat template but it doesn't seem active. You're fine, no anti cheat ! You can find the log in the directory "C:\Users\%USERNAME%\AppData\LocalLow\Straight Back Games\DEVOUR", and it's interesting that this game has the detect function and can tell the cheat engine you are using, and notice that “This Game has been MODIFIED using MelonLoader. DO NOT report any issues to the Game Developers! ~”
And if you are playing with a game developer, they will know who is using cheats in this lobby by some function in their client.
But you will never get banned by using cheats, they choose to ignore that.
## Menu ## Menu
![menu screenshot](Screenshots/menu.png) ![menu screenshot](Screenshots/menu.png)
@@ -25,8 +30,6 @@ Everything about spoofing ehre (steam name, server name, level...) will persist
* Doors unlocker (should work fine, though it doesn't seem to work sometimes) * Doors unlocker (should work fine, though it doesn't seem to work sometimes)
* Keys teleporter * Keys teleporter
* LV spoofer * LV spoofer
* Steam name spoofer (sets it to "patate", again no input text :/)
* Server name spoofer (sets it to "patate on top !", again no input text :/)
* Fly * Fly
* Unlock all, including flashlights, perks, outfits. Active by default, can't be turned off, no persistance. * Unlock all, including flashlights, perks, outfits. Active by default, can't be turned off, no persistance.
* Instant Win (allows you to win instantaniously on any map, works in singleplayer, but not as a client. May be working as host) * Instant Win (allows you to win instantaniously on any map, works in singleplayer, but not as a client. May be working as host)
@@ -39,19 +42,22 @@ Everything about spoofing ehre (steam name, server name, level...) will persist
* Azazel ESP (with a home made color picker) * Azazel ESP (with a home made color picker)
* Azazel Skeleton ESP * Azazel Skeleton ESP
* Azazel snapline (with a home made color picker) * Azazel snapline (with a home made color picker)
* Item ESP * 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!
* Demon ESP * Item ESP (with multi-language translation)
* Goat/Rat ESP * Demon ESP (with multi-language translation)
* Goat/Rat ESP (with multi-language translation)
* TP all the items to your position ! (thanks to [@jadis0x](https://github.com/jadis0x)) * TP all the items to your position ! (thanks to [@jadis0x](https://github.com/jadis0x))
* Spawn any item/entity to your position * Spawn any item/entity to your position
* Walk in the lobby * Walk in the lobby
* Change the player's speed * Change the player's speed
* Fullbright * Fullbright
* Create a lobby with no player limit * Infinite mirrors (Manor update)
* Switch between realms (Manor update)
* Due to the game update, I deleted "Steam name spoofer", "Server name spoofer" and "Create a lobby with no player limit" these three 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. For "create a lobby with no player limit", if create a lobby with more than four players, the ghost will be stuck or some of the players will not be able to move. So I have to delete this function.(by manafeng)
## English Installation Tutorial ## English Installation Tutorial
Raz did a great job at writing a guide on how to install the mod, link here : [link](https://docs.google.com/presentation/d/1YdIE5wwGWiJZ2RVughFYrlXUnFrxol-HI7QyLY_m0zc/edit#slide=id.p)<br> Raz did a great job at writing a guide on how to install the mod, link here : [link](https://docs.google.com/presentation/d/1YdIE5wwGWiJZ2RVughFYrlXUnFrxol-HI7QyLY_m0zc)<br>
## French Installation Tutorial ## French Installation Tutorial
@@ -61,12 +67,30 @@ For my French fellas out there, 1tap2times made a French video tutorial for the
For my German friends, KiwiJuice02 made a german video tutorial right here : [link](https://www.youtube.com/watch?v=Ntablvo6y-I)<br> For my German friends, KiwiJuice02 made a german video tutorial right here : [link](https://www.youtube.com/watch?v=Ntablvo6y-I)<br>
In order to get all of this working you need to generate the DevourClient.dll file by building the source code. 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). 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). 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. 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 3. Start the game, now you have successfully installed DevourClient. Use INSERT to open the menu
## 中文安装指南
如果你只是想要安装这个插件,直接在游戏里使用的话
1、安装 .net 6 的运行环境 → (https://dotnet.microsoft.com/en-us/download/dotnet/6.0)
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在别人的同系统同位宽x86x32的电脑里拷贝出来他的melonloader文件夹然后直接粘贴到自己的电脑里。2将melonloader文件夹完全删除然后重装。
如果你想要对代码进行修改和开发请按照下面的”building from source“的步骤逐步进行
## Uninstallation ## Uninstallation
0. Delete the folders `MelonLoader`, `Mods`, `Plugins`, `UserData`, and the file `version.dll` from `C:\Program Files (x86)\Steam\steamapps\common\Devour` 0. Delete the folders `MelonLoader`, `Mods`, `Plugins`, `UserData`, and the file `version.dll` from `C:\Program Files (x86)\Steam\steamapps\common\Devour`
@@ -74,12 +98,13 @@ In order to get all of this working you need to generate the DevourClient.dll fi
## Building from source ## Building from source
0. Clone the repository (or Code -> Download Zip) 0. Clone the repository (or Code -> Download Zip)
1. Install [MelonLoader](https://github.com/LavaGang/MelonLoader/releases) V0.6.0 (go to Settings -> tick "Show ALPHA Pre-Releases") to Devour. 1. Install [.NET 6 SDK and runtime](https://dotnet.microsoft.com/en-us/download/dotnet/6.0).
2. Start your game. A cmd should appear, don't close it, MelonLoader is installing and decompiling Devour's game assemblies. 2. Install [MelonLoader](https://github.com/LavaGang/MelonLoader/releases) V0.7.1 (go to Settings -> tick "Show ALPHA Pre-Releases") to Devour.
3. Wait for the process to finish, once it's done close the game. 3. Start your game. A cmd should appear, don't close it, MelonLoader is installing and decompiling Devour's game assemblies.
4. Open the solution file (DevourClient.sln) in Visual Studio 4. Wait for the process to finish, once it's done close the game.
5. Go to : Project --> Add a reference --> Browse --> Click on the browse button in the down right corner of the window. 5. Open the solution file (DevourClient.sln) in Visual Studio
6. Add those files : 6. Go to : Project --> Add a reference --> Browse --> Click on the browse button in the down right corner of the window.
7. Add those files :
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\net6\MelonLoader.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\net6\MelonLoader.dll`
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\net6\0Harmony.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\net6\0Harmony.dll`
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\net6\Il2CppInterop.Runtime.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\net6\Il2CppInterop.Runtime.dll`
@@ -103,11 +128,12 @@ In order to get all of this working you need to generate the DevourClient.dll fi
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.AnimationModule.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.AnimationModule.dll`
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.PhysicsModule.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\UnityEngine.PhysicsModule.dll`
* `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppcom.rlabrecque.steamworks.net.dll` * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\Il2Cppcom.rlabrecque.steamworks.net.dll`
7. Build the solutions in Release | Any CPU * `C:\Program Files (x86)\Steam\steamapps\common\Devour\MelonLoader\Il2CppAssemblies\unity.TextMeshPro.dll`
8. Build the solutions in Release | Any CPU
## Contact ## Contact
You can add me on discord at patate#1252 or on the [discord server](https://discord.gg/2amMFvqjYd) You can add me on discord at _.patate or on the [discord server](https://discord.gg/2amMFvqjYd)
## Code used ## Code used
@@ -137,3 +163,4 @@ Open an [issue](https://github.com/ALittlePatate/DevourClient/issues/new) or mak
## License ## License
[GPL 3.0](https://www.gnu.org/licenses/gpl-3.0.md) [GPL 3.0](https://www.gnu.org/licenses/gpl-3.0.md)