From f69767f79495ad10c412c0cb68536e6599fd6413 Mon Sep 17 00:00:00 2001 From: Jadis0x <49281043+jadis0x@users.noreply.github.com> Date: Thu, 16 May 2024 21:37:01 +0300 Subject: [PATCH] various header files added/updated - Created a header file called players. added a helper function to get the gameobject of all players, the gameobject of the local player and the NolanBehaviour component - Added UnityCore file to make it easier for us to use unity functions - Misc file fully updated - Added Wrapper class to make it easier to use il2cpp functions - ClientHelper updated - color.hpp library was included in the project to make the console colorful --- IL2CppDLL.vcxproj | 9 +- IL2CppDLL.vcxproj.filters | 22 +- include/color.hpp | 878 ++++++++++++++++++++++++++++++++++++ lib/ClientHelper.cpp | 280 +++--------- lib/ClientHelper.h | 14 +- lib/UnityCore.cpp | 18 + lib/UnityCore.h | 44 ++ lib/wrapper.cpp | 136 +++--- lib/wrapper.h | 21 +- user/features/misc/misc.cpp | 356 ++++++++++++++- user/features/misc/misc.h | 13 +- user/players/players.cpp | 83 ++++ user/players/players.h | 11 + 13 files changed, 1593 insertions(+), 292 deletions(-) create mode 100644 include/color.hpp create mode 100644 lib/UnityCore.cpp create mode 100644 lib/UnityCore.h create mode 100644 user/players/players.cpp create mode 100644 user/players/players.h diff --git a/IL2CppDLL.vcxproj b/IL2CppDLL.vcxproj index 24cb73a..74644b9 100644 --- a/IL2CppDLL.vcxproj +++ b/IL2CppDLL.vcxproj @@ -51,11 +51,13 @@ - + + + @@ -70,6 +72,7 @@ + @@ -88,11 +91,13 @@ - + + + diff --git a/IL2CppDLL.vcxproj.filters b/IL2CppDLL.vcxproj.filters index 2152a2d..0c412ac 100644 --- a/IL2CppDLL.vcxproj.filters +++ b/IL2CppDLL.vcxproj.filters @@ -16,7 +16,7 @@ framework - + lib @@ -73,6 +73,12 @@ user\features\misc + + lib + + + user\players + @@ -108,7 +114,7 @@ framework - + lib @@ -180,6 +186,15 @@ user\features\misc + + include + + + lib + + + user\players + @@ -218,5 +233,8 @@ {116f67d1-9398-4156-8fe3-93de590b3c57} + + {54f72ffe-f8ca-4732-bd14-62d1a7a68267} + \ No newline at end of file diff --git a/include/color.hpp b/include/color.hpp new file mode 100644 index 0000000..6a65604 --- /dev/null +++ b/include/color.hpp @@ -0,0 +1,878 @@ +#ifndef COLOR_HPP +#define COLOR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace hue +{ + constexpr int DEFAULT_COLOR = 7; + constexpr int BAD_COLOR = -256; + + const std::map CODES = { + {"black", 0}, {"k", 0}, + {"blue", 1}, {"b", 1}, + {"green", 2}, {"g", 2}, + {"aqua", 3}, {"a", 3}, + {"red", 4}, {"r", 4}, + {"purple", 5}, {"p", 5}, + {"yellow", 6}, {"y", 6}, + {"white", 7}, {"w", 7}, + {"grey", 8}, {"e", 8}, + {"light blue", 9}, {"lb", 9}, + {"light green", 10}, {"lg", 10}, + {"light aqua", 11}, {"la", 11}, + {"light red", 12}, {"lr", 12}, + {"light purple", 13}, {"lp", 13}, + {"light yellow", 14}, {"ly", 14}, + {"bright white", 15}, {"bw", 15} + }; + + const std::map NAMES = { + { 0, "black"}, + { 1, "blue"}, + { 2, "green"}, + { 3, "aqua"}, + { 4, "red"}, + { 5, "purple"}, + { 6, "yellow"}, + { 7, "white"}, + { 8, "grey"}, + { 9, "light blue"}, + {10, "light green"}, + {11, "light aqua"}, + {12, "light red"}, + {13, "light purple"}, + {14, "light yellow"}, + {15, "bright white"} + }; + + inline bool is_good(int c) + { + return 0 <= c && c < 256; + } + + inline int itoc(int c) + { + return is_good(c) ? c : BAD_COLOR; + } + + inline int itoc(int a, int b) + { + return itoc(a + b * 16); + } + + // std::string to color + int stoc(std::string a) + { + // convert s to lowercase, and format variants like "light_blue" + std::transform(a.begin(), a.end(), a.begin(), [](char c) + { + if ('A' <= c && c <= 'Z') + c = c - 'A' + 'a'; + else if (c == '_' || c == '-') + c = ' '; + return c; + }); + + // operator[] on std::map is non-const, use std::map::at instead + return (CODES.find(a) != CODES.end()) ? CODES.at(a) : BAD_COLOR; + } + + int stoc(std::string a, std::string b) + { + return itoc(stoc(a), stoc(b)); + } + + std::string ctos(int c) + { + return (0 <= c && c < 256) ? + "(text) " + NAMES.at(c % 16) + " + " + + "(background) " + NAMES.at(c / 16) : + "BAD COLOR"; + } + + int get() + { + CONSOLE_SCREEN_BUFFER_INFO i; + return GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &i) ? + i.wAttributes : BAD_COLOR; + } + + int get_text() + { + return (get() != BAD_COLOR) ? get() % 16 : BAD_COLOR; + } + + int get_background() + { + return (get() != BAD_COLOR) ? get() / 16 : BAD_COLOR; + } + + void set(int c) + { + if (is_good(c)) + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); + } + + void set(int a, int b) + { + set(a + b * 16); + } + + void set(std::string a, std::string b) + { + set(stoc(a) + stoc(b) * 16); + } + + void set_text(std::string a) + { + set(stoc(a), get_background()); + } + + void set_background(std::string b) + { + set(get_text(), stoc(b)); + } + + void reset() + { + set(DEFAULT_COLOR); + } + + int invert(int c) + { + if (is_good(c)) { + int a = c % 16; + int b = c / 16; + return b + a * 16; + } + else + return BAD_COLOR; + } + + std::ostream & reset(std::ostream & os) { reset(); return os; } + std::ostream & black(std::ostream & os) { set_text("k"); return os; } + std::ostream & blue(std::ostream & os) { set_text("b"); return os; } + std::ostream & green(std::ostream & os) { set_text("g"); return os; } + std::ostream & aqua(std::ostream & os) { set_text("a"); return os; } + std::ostream & red(std::ostream & os) { set_text("r"); return os; } + std::ostream & purple(std::ostream & os) { set_text("p"); return os; } + std::ostream & yellow(std::ostream & os) { set_text("y"); return os; } + std::ostream & white(std::ostream & os) { set_text("w"); return os; } + std::ostream & grey(std::ostream & os) { set_text("e"); return os; } + std::ostream & light_blue(std::ostream & os) { set_text("lb"); return os; } + std::ostream & light_green(std::ostream & os) { set_text("lg"); return os; } + std::ostream & light_aqua(std::ostream & os) { set_text("la"); return os; } + std::ostream & light_red(std::ostream & os) { set_text("lr"); return os; } + std::ostream & light_purple(std::ostream & os) { set_text("lp"); return os; } + std::ostream & light_yellow(std::ostream & os) { set_text("ly"); return os; } + std::ostream & bright_white(std::ostream & os) { set_text("bw"); return os; } + std::ostream & on_black(std::ostream & os) { set_background("k"); return os; } + std::ostream & on_blue(std::ostream & os) { set_background("b"); return os; } + std::ostream & on_green(std::ostream & os) { set_background("g"); return os; } + std::ostream & on_aqua(std::ostream & os) { set_background("a"); return os; } + std::ostream & on_red(std::ostream & os) { set_background("r"); return os; } + std::ostream & on_purple(std::ostream & os) { set_background("p"); return os; } + std::ostream & on_yellow(std::ostream & os) { set_background("y"); return os; } + std::ostream & on_white(std::ostream & os) { set_background("w"); return os; } + std::ostream & on_grey(std::ostream & os) { set_background("e"); return os; } + std::ostream & on_light_blue(std::ostream & os) { set_background("lb"); return os; } + std::ostream & on_light_green(std::ostream & os) { set_background("lg"); return os; } + std::ostream & on_light_aqua(std::ostream & os) { set_background("la"); return os; } + std::ostream & on_light_red(std::ostream & os) { set_background("lr"); return os; } + std::ostream & on_light_purple(std::ostream & os) { set_background("lp"); return os; } + std::ostream & on_light_yellow(std::ostream & os) { set_background("ly"); return os; } + std::ostream & on_bright_white(std::ostream & os) { set_background("bw"); return os; } + std::ostream & black_on_black(std::ostream & os) { set("k", "k"); return os; } + std::ostream & black_on_blue(std::ostream & os) { set("k", "b"); return os; } + std::ostream & black_on_green(std::ostream & os) { set("k", "g"); return os; } + std::ostream & black_on_aqua(std::ostream & os) { set("k", "a"); return os; } + std::ostream & black_on_red(std::ostream & os) { set("k", "r"); return os; } + std::ostream & black_on_purple(std::ostream & os) { set("k", "p"); return os; } + std::ostream & black_on_yellow(std::ostream & os) { set("k", "y"); return os; } + std::ostream & black_on_white(std::ostream & os) { set("k", "w"); return os; } + std::ostream & black_on_grey(std::ostream & os) { set("k", "e"); return os; } + std::ostream & black_on_light_blue(std::ostream & os) { set("k", "lb"); return os; } + std::ostream & black_on_light_green(std::ostream & os) { set("k", "lg"); return os; } + std::ostream & black_on_light_aqua(std::ostream & os) { set("k", "la"); return os; } + std::ostream & black_on_light_red(std::ostream & os) { set("k", "lr"); return os; } + std::ostream & black_on_light_purple(std::ostream & os) { set("k", "lp"); return os; } + std::ostream & black_on_light_yellow(std::ostream & os) { set("k", "ly"); return os; } + std::ostream & black_on_bright_white(std::ostream & os) { set("k", "bw"); return os; } + std::ostream & blue_on_black(std::ostream & os) { set("b", "k"); return os; } + std::ostream & blue_on_blue(std::ostream & os) { set("b", "b"); return os; } + std::ostream & blue_on_green(std::ostream & os) { set("b", "g"); return os; } + std::ostream & blue_on_aqua(std::ostream & os) { set("b", "a"); return os; } + std::ostream & blue_on_red(std::ostream & os) { set("b", "r"); return os; } + std::ostream & blue_on_purple(std::ostream & os) { set("b", "p"); return os; } + std::ostream & blue_on_yellow(std::ostream & os) { set("b", "y"); return os; } + std::ostream & blue_on_white(std::ostream & os) { set("b", "w"); return os; } + std::ostream & blue_on_grey(std::ostream & os) { set("b", "e"); return os; } + std::ostream & blue_on_light_blue(std::ostream & os) { set("b", "lb"); return os; } + std::ostream & blue_on_light_green(std::ostream & os) { set("b", "lg"); return os; } + std::ostream & blue_on_light_aqua(std::ostream & os) { set("b", "la"); return os; } + std::ostream & blue_on_light_red(std::ostream & os) { set("b", "lr"); return os; } + std::ostream & blue_on_light_purple(std::ostream & os) { set("b", "lp"); return os; } + std::ostream & blue_on_light_yellow(std::ostream & os) { set("b", "ly"); return os; } + std::ostream & blue_on_bright_white(std::ostream & os) { set("b", "bw"); return os; } + std::ostream & green_on_black(std::ostream & os) { set("g", "k"); return os; } + std::ostream & green_on_blue(std::ostream & os) { set("g", "b"); return os; } + std::ostream & green_on_green(std::ostream & os) { set("g", "g"); return os; } + std::ostream & green_on_aqua(std::ostream & os) { set("g", "a"); return os; } + std::ostream & green_on_red(std::ostream & os) { set("g", "r"); return os; } + std::ostream & green_on_purple(std::ostream & os) { set("g", "p"); return os; } + std::ostream & green_on_yellow(std::ostream & os) { set("g", "y"); return os; } + std::ostream & green_on_white(std::ostream & os) { set("g", "w"); return os; } + std::ostream & green_on_grey(std::ostream & os) { set("g", "e"); return os; } + std::ostream & green_on_light_blue(std::ostream & os) { set("g", "lb"); return os; } + std::ostream & green_on_light_green(std::ostream & os) { set("g", "lg"); return os; } + std::ostream & green_on_light_aqua(std::ostream & os) { set("g", "la"); return os; } + std::ostream & green_on_light_red(std::ostream & os) { set("g", "lr"); return os; } + std::ostream & green_on_light_purple(std::ostream & os) { set("g", "lp"); return os; } + std::ostream & green_on_light_yellow(std::ostream & os) { set("g", "ly"); return os; } + std::ostream & green_on_bright_white(std::ostream & os) { set("g", "bw"); return os; } + std::ostream & aqua_on_black(std::ostream & os) { set("a", "k"); return os; } + std::ostream & aqua_on_blue(std::ostream & os) { set("a", "b"); return os; } + std::ostream & aqua_on_green(std::ostream & os) { set("a", "g"); return os; } + std::ostream & aqua_on_aqua(std::ostream & os) { set("a", "a"); return os; } + std::ostream & aqua_on_red(std::ostream & os) { set("a", "r"); return os; } + std::ostream & aqua_on_purple(std::ostream & os) { set("a", "p"); return os; } + std::ostream & aqua_on_yellow(std::ostream & os) { set("a", "y"); return os; } + std::ostream & aqua_on_white(std::ostream & os) { set("a", "w"); return os; } + std::ostream & aqua_on_grey(std::ostream & os) { set("a", "e"); return os; } + std::ostream & aqua_on_light_blue(std::ostream & os) { set("a", "lb"); return os; } + std::ostream & aqua_on_light_green(std::ostream & os) { set("a", "lg"); return os; } + std::ostream & aqua_on_light_aqua(std::ostream & os) { set("a", "la"); return os; } + std::ostream & aqua_on_light_red(std::ostream & os) { set("a", "lr"); return os; } + std::ostream & aqua_on_light_purple(std::ostream & os) { set("a", "lp"); return os; } + std::ostream & aqua_on_light_yellow(std::ostream & os) { set("a", "ly"); return os; } + std::ostream & aqua_on_bright_white(std::ostream & os) { set("a", "bw"); return os; } + std::ostream & red_on_black(std::ostream & os) { set("r", "k"); return os; } + std::ostream & red_on_blue(std::ostream & os) { set("r", "b"); return os; } + std::ostream & red_on_green(std::ostream & os) { set("r", "g"); return os; } + std::ostream & red_on_aqua(std::ostream & os) { set("r", "a"); return os; } + std::ostream & red_on_red(std::ostream & os) { set("r", "r"); return os; } + std::ostream & red_on_purple(std::ostream & os) { set("r", "p"); return os; } + std::ostream & red_on_yellow(std::ostream & os) { set("r", "y"); return os; } + std::ostream & red_on_white(std::ostream & os) { set("r", "w"); return os; } + std::ostream & red_on_grey(std::ostream & os) { set("r", "e"); return os; } + std::ostream & red_on_light_blue(std::ostream & os) { set("r", "lb"); return os; } + std::ostream & red_on_light_green(std::ostream & os) { set("r", "lg"); return os; } + std::ostream & red_on_light_aqua(std::ostream & os) { set("r", "la"); return os; } + std::ostream & red_on_light_red(std::ostream & os) { set("r", "lr"); return os; } + std::ostream & red_on_light_purple(std::ostream & os) { set("r", "lp"); return os; } + std::ostream & red_on_light_yellow(std::ostream & os) { set("r", "ly"); return os; } + std::ostream & red_on_bright_white(std::ostream & os) { set("r", "bw"); return os; } + std::ostream & purple_on_black(std::ostream & os) { set("p", "k"); return os; } + std::ostream & purple_on_blue(std::ostream & os) { set("p", "b"); return os; } + std::ostream & purple_on_green(std::ostream & os) { set("p", "g"); return os; } + std::ostream & purple_on_aqua(std::ostream & os) { set("p", "a"); return os; } + std::ostream & purple_on_red(std::ostream & os) { set("p", "r"); return os; } + std::ostream & purple_on_purple(std::ostream & os) { set("p", "p"); return os; } + std::ostream & purple_on_yellow(std::ostream & os) { set("p", "y"); return os; } + std::ostream & purple_on_white(std::ostream & os) { set("p", "w"); return os; } + std::ostream & purple_on_grey(std::ostream & os) { set("p", "e"); return os; } + std::ostream & purple_on_light_blue(std::ostream & os) { set("p", "lb"); return os; } + std::ostream & purple_on_light_green(std::ostream & os) { set("p", "lg"); return os; } + std::ostream & purple_on_light_aqua(std::ostream & os) { set("p", "la"); return os; } + std::ostream & purple_on_light_red(std::ostream & os) { set("p", "lr"); return os; } + std::ostream & purple_on_light_purple(std::ostream & os) { set("p", "lp"); return os; } + std::ostream & purple_on_light_yellow(std::ostream & os) { set("p", "ly"); return os; } + std::ostream & purple_on_bright_white(std::ostream & os) { set("p", "bw"); return os; } + std::ostream & yellow_on_black(std::ostream & os) { set("y", "k"); return os; } + std::ostream & yellow_on_blue(std::ostream & os) { set("y", "b"); return os; } + std::ostream & yellow_on_green(std::ostream & os) { set("y", "g"); return os; } + std::ostream & yellow_on_aqua(std::ostream & os) { set("y", "a"); return os; } + std::ostream & yellow_on_red(std::ostream & os) { set("y", "r"); return os; } + std::ostream & yellow_on_purple(std::ostream & os) { set("y", "p"); return os; } + std::ostream & yellow_on_yellow(std::ostream & os) { set("y", "y"); return os; } + std::ostream & yellow_on_white(std::ostream & os) { set("y", "w"); return os; } + std::ostream & yellow_on_grey(std::ostream & os) { set("y", "e"); return os; } + std::ostream & yellow_on_light_blue(std::ostream & os) { set("y", "lb"); return os; } + std::ostream & yellow_on_light_green(std::ostream & os) { set("y", "lg"); return os; } + std::ostream & yellow_on_light_aqua(std::ostream & os) { set("y", "la"); return os; } + std::ostream & yellow_on_light_red(std::ostream & os) { set("y", "lr"); return os; } + std::ostream & yellow_on_light_purple(std::ostream & os) { set("y", "lp"); return os; } + std::ostream & yellow_on_light_yellow(std::ostream & os) { set("y", "ly"); return os; } + std::ostream & yellow_on_bright_white(std::ostream & os) { set("y", "bw"); return os; } + std::ostream & white_on_black(std::ostream & os) { set("w", "k"); return os; } + std::ostream & white_on_blue(std::ostream & os) { set("w", "b"); return os; } + std::ostream & white_on_green(std::ostream & os) { set("w", "g"); return os; } + std::ostream & white_on_aqua(std::ostream & os) { set("w", "a"); return os; } + std::ostream & white_on_red(std::ostream & os) { set("w", "r"); return os; } + std::ostream & white_on_purple(std::ostream & os) { set("w", "p"); return os; } + std::ostream & white_on_yellow(std::ostream & os) { set("w", "y"); return os; } + std::ostream & white_on_white(std::ostream & os) { set("w", "w"); return os; } + std::ostream & white_on_grey(std::ostream & os) { set("w", "e"); return os; } + std::ostream & white_on_light_blue(std::ostream & os) { set("w", "lb"); return os; } + std::ostream & white_on_light_green(std::ostream & os) { set("w", "lg"); return os; } + std::ostream & white_on_light_aqua(std::ostream & os) { set("w", "la"); return os; } + std::ostream & white_on_light_red(std::ostream & os) { set("w", "lr"); return os; } + std::ostream & white_on_light_purple(std::ostream & os) { set("w", "lp"); return os; } + std::ostream & white_on_light_yellow(std::ostream & os) { set("w", "ly"); return os; } + std::ostream & white_on_bright_white(std::ostream & os) { set("w", "bw"); return os; } + std::ostream & grey_on_black(std::ostream & os) { set("e", "k"); return os; } + std::ostream & grey_on_blue(std::ostream & os) { set("e", "b"); return os; } + std::ostream & grey_on_green(std::ostream & os) { set("e", "g"); return os; } + std::ostream & grey_on_aqua(std::ostream & os) { set("e", "a"); return os; } + std::ostream & grey_on_red(std::ostream & os) { set("e", "r"); return os; } + std::ostream & grey_on_purple(std::ostream & os) { set("e", "p"); return os; } + std::ostream & grey_on_yellow(std::ostream & os) { set("e", "y"); return os; } + std::ostream & grey_on_white(std::ostream & os) { set("e", "w"); return os; } + std::ostream & grey_on_grey(std::ostream & os) { set("e", "e"); return os; } + std::ostream & grey_on_light_blue(std::ostream & os) { set("e", "lb"); return os; } + std::ostream & grey_on_light_green(std::ostream & os) { set("e", "lg"); return os; } + std::ostream & grey_on_light_aqua(std::ostream & os) { set("e", "la"); return os; } + std::ostream & grey_on_light_red(std::ostream & os) { set("e", "lr"); return os; } + std::ostream & grey_on_light_purple(std::ostream & os) { set("e", "lp"); return os; } + std::ostream & grey_on_light_yellow(std::ostream & os) { set("e", "ly"); return os; } + std::ostream & grey_on_bright_white(std::ostream & os) { set("e", "bw"); return os; } + std::ostream & light_blue_on_black(std::ostream & os) { set("lb", "k"); return os; } + std::ostream & light_blue_on_blue(std::ostream & os) { set("lb", "b"); return os; } + std::ostream & light_blue_on_green(std::ostream & os) { set("lb", "g"); return os; } + std::ostream & light_blue_on_aqua(std::ostream & os) { set("lb", "a"); return os; } + std::ostream & light_blue_on_red(std::ostream & os) { set("lb", "r"); return os; } + std::ostream & light_blue_on_purple(std::ostream & os) { set("lb", "p"); return os; } + std::ostream & light_blue_on_yellow(std::ostream & os) { set("lb", "y"); return os; } + std::ostream & light_blue_on_white(std::ostream & os) { set("lb", "w"); return os; } + std::ostream & light_blue_on_grey(std::ostream & os) { set("lb", "e"); return os; } + std::ostream & light_blue_on_light_blue(std::ostream & os) { set("lb", "lb"); return os; } + std::ostream & light_blue_on_light_green(std::ostream & os) { set("lb", "lg"); return os; } + std::ostream & light_blue_on_light_aqua(std::ostream & os) { set("lb", "la"); return os; } + std::ostream & light_blue_on_light_red(std::ostream & os) { set("lb", "lr"); return os; } + std::ostream & light_blue_on_light_purple(std::ostream & os) { set("lb", "lp"); return os; } + std::ostream & light_blue_on_light_yellow(std::ostream & os) { set("lb", "ly"); return os; } + std::ostream & light_blue_on_bright_white(std::ostream & os) { set("lb", "bw"); return os; } + std::ostream & light_green_on_black(std::ostream & os) { set("lg", "k"); return os; } + std::ostream & light_green_on_blue(std::ostream & os) { set("lg", "b"); return os; } + std::ostream & light_green_on_green(std::ostream & os) { set("lg", "g"); return os; } + std::ostream & light_green_on_aqua(std::ostream & os) { set("lg", "a"); return os; } + std::ostream & light_green_on_red(std::ostream & os) { set("lg", "r"); return os; } + std::ostream & light_green_on_purple(std::ostream & os) { set("lg", "p"); return os; } + std::ostream & light_green_on_yellow(std::ostream & os) { set("lg", "y"); return os; } + std::ostream & light_green_on_white(std::ostream & os) { set("lg", "w"); return os; } + std::ostream & light_green_on_grey(std::ostream & os) { set("lg", "e"); return os; } + std::ostream & light_green_on_light_blue(std::ostream & os) { set("lg", "lb"); return os; } + std::ostream & light_green_on_light_green(std::ostream & os) { set("lg", "lg"); return os; } + std::ostream & light_green_on_light_aqua(std::ostream & os) { set("lg", "la"); return os; } + std::ostream & light_green_on_light_red(std::ostream & os) { set("lg", "lr"); return os; } + std::ostream & light_green_on_light_purple(std::ostream & os) { set("lg", "lp"); return os; } + std::ostream & light_green_on_light_yellow(std::ostream & os) { set("lg", "ly"); return os; } + std::ostream & light_green_on_bright_white(std::ostream & os) { set("lg", "bw"); return os; } + std::ostream & light_aqua_on_black(std::ostream & os) { set("la", "k"); return os; } + std::ostream & light_aqua_on_blue(std::ostream & os) { set("la", "b"); return os; } + std::ostream & light_aqua_on_green(std::ostream & os) { set("la", "g"); return os; } + std::ostream & light_aqua_on_aqua(std::ostream & os) { set("la", "a"); return os; } + std::ostream & light_aqua_on_red(std::ostream & os) { set("la", "r"); return os; } + std::ostream & light_aqua_on_purple(std::ostream & os) { set("la", "p"); return os; } + std::ostream & light_aqua_on_yellow(std::ostream & os) { set("la", "y"); return os; } + std::ostream & light_aqua_on_white(std::ostream & os) { set("la", "w"); return os; } + std::ostream & light_aqua_on_grey(std::ostream & os) { set("la", "e"); return os; } + std::ostream & light_aqua_on_light_blue(std::ostream & os) { set("la", "lb"); return os; } + std::ostream & light_aqua_on_light_green(std::ostream & os) { set("la", "lg"); return os; } + std::ostream & light_aqua_on_light_aqua(std::ostream & os) { set("la", "la"); return os; } + std::ostream & light_aqua_on_light_red(std::ostream & os) { set("la", "lr"); return os; } + std::ostream & light_aqua_on_light_purple(std::ostream & os) { set("la", "lp"); return os; } + std::ostream & light_aqua_on_light_yellow(std::ostream & os) { set("la", "ly"); return os; } + std::ostream & light_aqua_on_bright_white(std::ostream & os) { set("la", "bw"); return os; } + std::ostream & light_red_on_black(std::ostream & os) { set("lr", "k"); return os; } + std::ostream & light_red_on_blue(std::ostream & os) { set("lr", "b"); return os; } + std::ostream & light_red_on_green(std::ostream & os) { set("lr", "g"); return os; } + std::ostream & light_red_on_aqua(std::ostream & os) { set("lr", "a"); return os; } + std::ostream & light_red_on_red(std::ostream & os) { set("lr", "r"); return os; } + std::ostream & light_red_on_purple(std::ostream & os) { set("lr", "p"); return os; } + std::ostream & light_red_on_yellow(std::ostream & os) { set("lr", "y"); return os; } + std::ostream & light_red_on_white(std::ostream & os) { set("lr", "w"); return os; } + std::ostream & light_red_on_grey(std::ostream & os) { set("lr", "e"); return os; } + std::ostream & light_red_on_light_blue(std::ostream & os) { set("lr", "lb"); return os; } + std::ostream & light_red_on_light_green(std::ostream & os) { set("lr", "lg"); return os; } + std::ostream & light_red_on_light_aqua(std::ostream & os) { set("lr", "la"); return os; } + std::ostream & light_red_on_light_red(std::ostream & os) { set("lr", "lr"); return os; } + std::ostream & light_red_on_light_purple(std::ostream & os) { set("lr", "lp"); return os; } + std::ostream & light_red_on_light_yellow(std::ostream & os) { set("lr", "ly"); return os; } + std::ostream & light_red_on_bright_white(std::ostream & os) { set("lr", "bw"); return os; } + std::ostream & light_purple_on_black(std::ostream & os) { set("lp", "k"); return os; } + std::ostream & light_purple_on_blue(std::ostream & os) { set("lp", "b"); return os; } + std::ostream & light_purple_on_green(std::ostream & os) { set("lp", "g"); return os; } + std::ostream & light_purple_on_aqua(std::ostream & os) { set("lp", "a"); return os; } + std::ostream & light_purple_on_red(std::ostream & os) { set("lp", "r"); return os; } + std::ostream & light_purple_on_purple(std::ostream & os) { set("lp", "p"); return os; } + std::ostream & light_purple_on_yellow(std::ostream & os) { set("lp", "y"); return os; } + std::ostream & light_purple_on_white(std::ostream & os) { set("lp", "w"); return os; } + std::ostream & light_purple_on_grey(std::ostream & os) { set("lp", "e"); return os; } + std::ostream & light_purple_on_light_blue(std::ostream & os) { set("lp", "lb"); return os; } + std::ostream & light_purple_on_light_green(std::ostream & os) { set("lp", "lg"); return os; } + std::ostream & light_purple_on_light_aqua(std::ostream & os) { set("lp", "la"); return os; } + std::ostream & light_purple_on_light_red(std::ostream & os) { set("lp", "lr"); return os; } + std::ostream & light_purple_on_light_purple(std::ostream & os) { set("lp", "lp"); return os; } + std::ostream & light_purple_on_light_yellow(std::ostream & os) { set("lp", "ly"); return os; } + std::ostream & light_purple_on_bright_white(std::ostream & os) { set("lp", "bw"); return os; } + std::ostream & light_yellow_on_black(std::ostream & os) { set("ly", "k"); return os; } + std::ostream & light_yellow_on_blue(std::ostream & os) { set("ly", "b"); return os; } + std::ostream & light_yellow_on_green(std::ostream & os) { set("ly", "g"); return os; } + std::ostream & light_yellow_on_aqua(std::ostream & os) { set("ly", "a"); return os; } + std::ostream & light_yellow_on_red(std::ostream & os) { set("ly", "r"); return os; } + std::ostream & light_yellow_on_purple(std::ostream & os) { set("ly", "p"); return os; } + std::ostream & light_yellow_on_yellow(std::ostream & os) { set("ly", "y"); return os; } + std::ostream & light_yellow_on_white(std::ostream & os) { set("ly", "w"); return os; } + std::ostream & light_yellow_on_grey(std::ostream & os) { set("ly", "e"); return os; } + std::ostream & light_yellow_on_light_blue(std::ostream & os) { set("ly", "lb"); return os; } + std::ostream & light_yellow_on_light_green(std::ostream & os) { set("ly", "lg"); return os; } + std::ostream & light_yellow_on_light_aqua(std::ostream & os) { set("ly", "la"); return os; } + std::ostream & light_yellow_on_light_red(std::ostream & os) { set("ly", "lr"); return os; } + std::ostream & light_yellow_on_light_purple(std::ostream & os) { set("ly", "lp"); return os; } + std::ostream & light_yellow_on_light_yellow(std::ostream & os) { set("ly", "ly"); return os; } + std::ostream & light_yellow_on_bright_white(std::ostream & os) { set("ly", "bw"); return os; } + std::ostream & bright_white_on_black(std::ostream & os) { set("bw", "k"); return os; } + std::ostream & bright_white_on_blue(std::ostream & os) { set("bw", "b"); return os; } + std::ostream & bright_white_on_green(std::ostream & os) { set("bw", "g"); return os; } + std::ostream & bright_white_on_aqua(std::ostream & os) { set("bw", "a"); return os; } + std::ostream & bright_white_on_red(std::ostream & os) { set("bw", "r"); return os; } + std::ostream & bright_white_on_purple(std::ostream & os) { set("bw", "p"); return os; } + std::ostream & bright_white_on_yellow(std::ostream & os) { set("bw", "y"); return os; } + std::ostream & bright_white_on_white(std::ostream & os) { set("bw", "w"); return os; } + std::ostream & bright_white_on_grey(std::ostream & os) { set("bw", "e"); return os; } + std::ostream & bright_white_on_light_blue(std::ostream & os) { set("bw", "lb"); return os; } + std::ostream & bright_white_on_light_green(std::ostream & os) { set("bw", "lg"); return os; } + std::ostream & bright_white_on_light_aqua(std::ostream & os) { set("bw", "la"); return os; } + std::ostream & bright_white_on_light_red(std::ostream & os) { set("bw", "lr"); return os; } + std::ostream & bright_white_on_light_purple(std::ostream & os) { set("bw", "lp"); return os; } + std::ostream & bright_white_on_light_yellow(std::ostream & os) { set("bw", "ly"); return os; } + std::ostream & bright_white_on_bright_white(std::ostream & os) { set("bw", "bw"); return os; } +} + + +namespace dye +{ + template + using bar = typename std::conditional::value, std::string, T>::type; + + template class colorful; + template class item; + + template + class colorful : private std::list> + { + public: + using std::list>::list; + + colorful & operator+=(const colorful & rhs) + { + this->insert(this->end(), rhs.begin(), rhs.end()); + return *this; + } + + colorful & operator+=(colorful && rhs) + { + this->splice(this->end(), std::move(rhs)); + return *this; + } + + colorful & operator+=(T t) + { + this->push_back(std::move(t)); + return *this; + } + + void push_front(T t) + { + this->std::list>::push_front(item(std::move(t))); + } + + void push_back(T t) + { + this->std::list>::push_back(item(std::move(t))); + } + + colorful & invert() + { + for (auto & elem : *this) + elem.invert(); + return *this; + } + + template + friend std::ostream & operator<<(std::ostream &, const colorful &); + + template + friend colorful invert(colorful col); + }; + + template + colorful operator+(colorful lhs, colorful rhs) + { + colorful res(std::move(lhs)); + return res += rhs; + } + + template + colorful operator+(colorful lhs, std::string rhs) + { + colorful res(std::move(lhs)); + res.push_back(std::move(rhs)); + return res; + } + + template + colorful operator+(const std::string & lhs, colorful rhs) + { + colorful res(std::move(rhs)); + res.push_front(std::move(lhs)); + return res; + } + + template + std::ostream & operator<<(std::ostream & os, const colorful & colorful) + { + for (const auto & elem : colorful) + os << elem; + return os; + } + + template + colorful invert(colorful col) + { + colorful res(std::move(col)); + for (auto & elem : res) + elem.invert(); + return res; + } + + template + class item + { + T thing; + int color; + + public: + item(T t) : thing(std::move(t)), color(hue::get()) {} + item(T t, int a) : thing(std::move(t)), color(hue::itoc(a)) {} + item(T t, int a, int b) : thing(std::move(t)), color(hue::itoc(a, b)) {} + item(T t, std::string a) : thing(std::move(t)), color(hue::stoc(a)) {} + item(T t, std::string a, std::string b) : thing(std::move(t)), color(hue::stoc(a, b)) {} + + item & invert() + { + color = hue::invert(color); + return *this; + } + + template + friend class colorful; + + template + friend std::ostream & operator<<(std::ostream &, const item &); + }; + + template + std::ostream & operator<<(std::ostream & os, const item & it) + { + hue::set(it.color); + os << it.thing; + hue::reset(); + return os; + } + + template using R = colorful>; + template using S = item>; + + template R colorize(T t, std::string a) { return R { S(t, a) }; } + template R vanilla(T t) { return R { S(t) }; } + template R black(T t) { return R { S(t, "k") }; } + template R blue(T t) { return R { S(t, "b") }; } + template R green(T t) { return R { S(t, "g") }; } + template R aqua(T t) { return R { S(t, "a") }; } + template R red(T t) { return R { S(t, "r") }; } + template R purple(T t) { return R { S(t, "p") }; } + template R yellow(T t) { return R { S(t, "y") }; } + template R white(T t) { return R { S(t, "w") }; } + template R grey(T t) { return R { S(t, "e") }; } + template R light_blue(T t) { return R { S(t, "lb") }; } + template R light_green(T t) { return R { S(t, "lg") }; } + template R light_aqua(T t) { return R { S(t, "la") }; } + template R light_red(T t) { return R { S(t, "lr") }; } + template R light_purple(T t) { return R { S(t, "lp") }; } + template R light_yellow(T t) { return R { S(t, "ly") }; } + template R bright_white(T t) { return R { S(t, "bw") }; } + template R on_black(T t) { return R { S(t, "k", "k") }; } + template R on_blue(T t) { return R { S(t, "k", "b") }; } + template R on_green(T t) { return R { S(t, "k", "g") }; } + template R on_aqua(T t) { return R { S(t, "k", "a") }; } + template R on_red(T t) { return R { S(t, "k", "r") }; } + template R on_purple(T t) { return R { S(t, "k", "p") }; } + template R on_yellow(T t) { return R { S(t, "k", "y") }; } + template R on_white(T t) { return R { S(t, "k", "w") }; } + template R on_grey(T t) { return R { S(t, "k", "e") }; } + template R on_light_blue(T t) { return R { S(t, "k", "lb") }; } + template R on_light_green(T t) { return R { S(t, "k", "lg") }; } + template R on_light_aqua(T t) { return R { S(t, "k", "la") }; } + template R on_light_red(T t) { return R { S(t, "k", "lr") }; } + template R on_light_purple(T t) { return R { S(t, "k", "lp") }; } + template R on_light_yellow(T t) { return R { S(t, "k", "ly") }; } + template R on_bright_white(T t) { return R { S(t, "k", "bw") }; } + template R black_on_black(T t) { return R { S(t, "k", "k") }; } + template R black_on_blue(T t) { return R { S(t, "k", "b") }; } + template R black_on_green(T t) { return R { S(t, "k", "g") }; } + template R black_on_aqua(T t) { return R { S(t, "k", "a") }; } + template R black_on_red(T t) { return R { S(t, "k", "r") }; } + template R black_on_purple(T t) { return R { S(t, "k", "p") }; } + template R black_on_yellow(T t) { return R { S(t, "k", "y") }; } + template R black_on_white(T t) { return R { S(t, "k", "w") }; } + template R black_on_grey(T t) { return R { S(t, "k", "e") }; } + template R black_on_light_blue(T t) { return R { S(t, "k", "lb") }; } + template R black_on_light_green(T t) { return R { S(t, "k", "lg") }; } + template R black_on_light_aqua(T t) { return R { S(t, "k", "la") }; } + template R black_on_light_red(T t) { return R { S(t, "k", "lr") }; } + template R black_on_light_purple(T t) { return R { S(t, "k", "lp") }; } + template R black_on_light_yellow(T t) { return R { S(t, "k", "ly") }; } + template R black_on_bright_white(T t) { return R { S(t, "k", "bw") }; } + template R blue_on_black(T t) { return R { S(t, "b", "k") }; } + template R blue_on_blue(T t) { return R { S(t, "b", "b") }; } + template R blue_on_green(T t) { return R { S(t, "b", "g") }; } + template R blue_on_aqua(T t) { return R { S(t, "b", "a") }; } + template R blue_on_red(T t) { return R { S(t, "b", "r") }; } + template R blue_on_purple(T t) { return R { S(t, "b", "p") }; } + template R blue_on_yellow(T t) { return R { S(t, "b", "y") }; } + template R blue_on_white(T t) { return R { S(t, "b", "w") }; } + template R blue_on_grey(T t) { return R { S(t, "b", "e") }; } + template R blue_on_light_blue(T t) { return R { S(t, "b", "lb") }; } + template R blue_on_light_green(T t) { return R { S(t, "b", "lg") }; } + template R blue_on_light_aqua(T t) { return R { S(t, "b", "la") }; } + template R blue_on_light_red(T t) { return R { S(t, "b", "lr") }; } + template R blue_on_light_purple(T t) { return R { S(t, "b", "lp") }; } + template R blue_on_light_yellow(T t) { return R { S(t, "b", "ly") }; } + template R blue_on_bright_white(T t) { return R { S(t, "b", "bw") }; } + template R green_on_black(T t) { return R { S(t, "g", "k") }; } + template R green_on_blue(T t) { return R { S(t, "g", "b") }; } + template R green_on_green(T t) { return R { S(t, "g", "g") }; } + template R green_on_aqua(T t) { return R { S(t, "g", "a") }; } + template R green_on_red(T t) { return R { S(t, "g", "r") }; } + template R green_on_purple(T t) { return R { S(t, "g", "p") }; } + template R green_on_yellow(T t) { return R { S(t, "g", "y") }; } + template R green_on_white(T t) { return R { S(t, "g", "w") }; } + template R green_on_grey(T t) { return R { S(t, "g", "e") }; } + template R green_on_light_blue(T t) { return R { S(t, "g", "lb") }; } + template R green_on_light_green(T t) { return R { S(t, "g", "lg") }; } + template R green_on_light_aqua(T t) { return R { S(t, "g", "la") }; } + template R green_on_light_red(T t) { return R { S(t, "g", "lr") }; } + template R green_on_light_purple(T t) { return R { S(t, "g", "lp") }; } + template R green_on_light_yellow(T t) { return R { S(t, "g", "ly") }; } + template R green_on_bright_white(T t) { return R { S(t, "g", "bw") }; } + template R aqua_on_black(T t) { return R { S(t, "a", "k") }; } + template R aqua_on_blue(T t) { return R { S(t, "a", "b") }; } + template R aqua_on_green(T t) { return R { S(t, "a", "g") }; } + template R aqua_on_aqua(T t) { return R { S(t, "a", "a") }; } + template R aqua_on_red(T t) { return R { S(t, "a", "r") }; } + template R aqua_on_purple(T t) { return R { S(t, "a", "p") }; } + template R aqua_on_yellow(T t) { return R { S(t, "a", "y") }; } + template R aqua_on_white(T t) { return R { S(t, "a", "w") }; } + template R aqua_on_grey(T t) { return R { S(t, "a", "e") }; } + template R aqua_on_light_blue(T t) { return R { S(t, "a", "lb") }; } + template R aqua_on_light_green(T t) { return R { S(t, "a", "lg") }; } + template R aqua_on_light_aqua(T t) { return R { S(t, "a", "la") }; } + template R aqua_on_light_red(T t) { return R { S(t, "a", "lr") }; } + template R aqua_on_light_purple(T t) { return R { S(t, "a", "lp") }; } + template R aqua_on_light_yellow(T t) { return R { S(t, "a", "ly") }; } + template R aqua_on_bright_white(T t) { return R { S(t, "a", "bw") }; } + template R red_on_black(T t) { return R { S(t, "r", "k") }; } + template R red_on_blue(T t) { return R { S(t, "r", "b") }; } + template R red_on_green(T t) { return R { S(t, "r", "g") }; } + template R red_on_aqua(T t) { return R { S(t, "r", "a") }; } + template R red_on_red(T t) { return R { S(t, "r", "r") }; } + template R red_on_purple(T t) { return R { S(t, "r", "p") }; } + template R red_on_yellow(T t) { return R { S(t, "r", "y") }; } + template R red_on_white(T t) { return R { S(t, "r", "w") }; } + template R red_on_grey(T t) { return R { S(t, "r", "e") }; } + template R red_on_light_blue(T t) { return R { S(t, "r", "lb") }; } + template R red_on_light_green(T t) { return R { S(t, "r", "lg") }; } + template R red_on_light_aqua(T t) { return R { S(t, "r", "la") }; } + template R red_on_light_red(T t) { return R { S(t, "r", "lr") }; } + template R red_on_light_purple(T t) { return R { S(t, "r", "lp") }; } + template R red_on_light_yellow(T t) { return R { S(t, "r", "ly") }; } + template R red_on_bright_white(T t) { return R { S(t, "r", "bw") }; } + template R purple_on_black(T t) { return R { S(t, "p", "k") }; } + template R purple_on_blue(T t) { return R { S(t, "p", "b") }; } + template R purple_on_green(T t) { return R { S(t, "p", "g") }; } + template R purple_on_aqua(T t) { return R { S(t, "p", "a") }; } + template R purple_on_red(T t) { return R { S(t, "p", "r") }; } + template R purple_on_purple(T t) { return R { S(t, "p", "p") }; } + template R purple_on_yellow(T t) { return R { S(t, "p", "y") }; } + template R purple_on_white(T t) { return R { S(t, "p", "w") }; } + template R purple_on_grey(T t) { return R { S(t, "p", "e") }; } + template R purple_on_light_blue(T t) { return R { S(t, "p", "lb") }; } + template R purple_on_light_green(T t) { return R { S(t, "p", "lg") }; } + template R purple_on_light_aqua(T t) { return R { S(t, "p", "la") }; } + template R purple_on_light_red(T t) { return R { S(t, "p", "lr") }; } + template R purple_on_light_purple(T t) { return R { S(t, "p", "lp") }; } + template R purple_on_light_yellow(T t) { return R { S(t, "p", "ly") }; } + template R purple_on_bright_white(T t) { return R { S(t, "p", "bw") }; } + template R yellow_on_black(T t) { return R { S(t, "y", "k") }; } + template R yellow_on_blue(T t) { return R { S(t, "y", "b") }; } + template R yellow_on_green(T t) { return R { S(t, "y", "g") }; } + template R yellow_on_aqua(T t) { return R { S(t, "y", "a") }; } + template R yellow_on_red(T t) { return R { S(t, "y", "r") }; } + template R yellow_on_purple(T t) { return R { S(t, "y", "p") }; } + template R yellow_on_yellow(T t) { return R { S(t, "y", "y") }; } + template R yellow_on_white(T t) { return R { S(t, "y", "w") }; } + template R yellow_on_grey(T t) { return R { S(t, "y", "e") }; } + template R yellow_on_light_blue(T t) { return R { S(t, "y", "lb") }; } + template R yellow_on_light_green(T t) { return R { S(t, "y", "lg") }; } + template R yellow_on_light_aqua(T t) { return R { S(t, "y", "la") }; } + template R yellow_on_light_red(T t) { return R { S(t, "y", "lr") }; } + template R yellow_on_light_purple(T t) { return R { S(t, "y", "lp") }; } + template R yellow_on_light_yellow(T t) { return R { S(t, "y", "ly") }; } + template R yellow_on_bright_white(T t) { return R { S(t, "y", "bw") }; } + template R white_on_black(T t) { return R { S(t, "w", "k") }; } + template R white_on_blue(T t) { return R { S(t, "w", "b") }; } + template R white_on_green(T t) { return R { S(t, "w", "g") }; } + template R white_on_aqua(T t) { return R { S(t, "w", "a") }; } + template R white_on_red(T t) { return R { S(t, "w", "r") }; } + template R white_on_purple(T t) { return R { S(t, "w", "p") }; } + template R white_on_yellow(T t) { return R { S(t, "w", "y") }; } + template R white_on_white(T t) { return R { S(t, "w", "w") }; } + template R white_on_grey(T t) { return R { S(t, "w", "e") }; } + template R white_on_light_blue(T t) { return R { S(t, "w", "lb") }; } + template R white_on_light_green(T t) { return R { S(t, "w", "lg") }; } + template R white_on_light_aqua(T t) { return R { S(t, "w", "la") }; } + template R white_on_light_red(T t) { return R { S(t, "w", "lr") }; } + template R white_on_light_purple(T t) { return R { S(t, "w", "lp") }; } + template R white_on_light_yellow(T t) { return R { S(t, "w", "ly") }; } + template R white_on_bright_white(T t) { return R { S(t, "w", "bw") }; } + template R grey_on_black(T t) { return R { S(t, "e", "k") }; } + template R grey_on_blue(T t) { return R { S(t, "e", "b") }; } + template R grey_on_green(T t) { return R { S(t, "e", "g") }; } + template R grey_on_aqua(T t) { return R { S(t, "e", "a") }; } + template R grey_on_red(T t) { return R { S(t, "e", "r") }; } + template R grey_on_purple(T t) { return R { S(t, "e", "p") }; } + template R grey_on_yellow(T t) { return R { S(t, "e", "y") }; } + template R grey_on_white(T t) { return R { S(t, "e", "w") }; } + template R grey_on_grey(T t) { return R { S(t, "e", "e") }; } + template R grey_on_light_blue(T t) { return R { S(t, "e", "lb") }; } + template R grey_on_light_green(T t) { return R { S(t, "e", "lg") }; } + template R grey_on_light_aqua(T t) { return R { S(t, "e", "la") }; } + template R grey_on_light_red(T t) { return R { S(t, "e", "lr") }; } + template R grey_on_light_purple(T t) { return R { S(t, "e", "lp") }; } + template R grey_on_light_yellow(T t) { return R { S(t, "e", "ly") }; } + template R grey_on_bright_white(T t) { return R { S(t, "e", "bw") }; } + template R light_blue_on_black(T t) { return R { S(t, "lb", "k") }; } + template R light_blue_on_blue(T t) { return R { S(t, "lb", "b") }; } + template R light_blue_on_green(T t) { return R { S(t, "lb", "g") }; } + template R light_blue_on_aqua(T t) { return R { S(t, "lb", "a") }; } + template R light_blue_on_red(T t) { return R { S(t, "lb", "r") }; } + template R light_blue_on_purple(T t) { return R { S(t, "lb", "p") }; } + template R light_blue_on_yellow(T t) { return R { S(t, "lb", "y") }; } + template R light_blue_on_white(T t) { return R { S(t, "lb", "w") }; } + template R light_blue_on_grey(T t) { return R { S(t, "lb", "e") }; } + template R light_blue_on_light_blue(T t) { return R { S(t, "lb", "lb") }; } + template R light_blue_on_light_green(T t) { return R { S(t, "lb", "lg") }; } + template R light_blue_on_light_aqua(T t) { return R { S(t, "lb", "la") }; } + template R light_blue_on_light_red(T t) { return R { S(t, "lb", "lr") }; } + template R light_blue_on_light_purple(T t) { return R { S(t, "lb", "lp") }; } + template R light_blue_on_light_yellow(T t) { return R { S(t, "lb", "ly") }; } + template R light_blue_on_bright_white(T t) { return R { S(t, "lb", "bw") }; } + template R light_green_on_black(T t) { return R { S(t, "lg", "k") }; } + template R light_green_on_blue(T t) { return R { S(t, "lg", "b") }; } + template R light_green_on_green(T t) { return R { S(t, "lg", "g") }; } + template R light_green_on_aqua(T t) { return R { S(t, "lg", "a") }; } + template R light_green_on_red(T t) { return R { S(t, "lg", "r") }; } + template R light_green_on_purple(T t) { return R { S(t, "lg", "p") }; } + template R light_green_on_yellow(T t) { return R { S(t, "lg", "y") }; } + template R light_green_on_white(T t) { return R { S(t, "lg", "w") }; } + template R light_green_on_grey(T t) { return R { S(t, "lg", "e") }; } + template R light_green_on_light_blue(T t) { return R { S(t, "lg", "lb") }; } + template R light_green_on_light_green(T t) { return R { S(t, "lg", "lg") }; } + template R light_green_on_light_aqua(T t) { return R { S(t, "lg", "la") }; } + template R light_green_on_light_red(T t) { return R { S(t, "lg", "lr") }; } + template R light_green_on_light_purple(T t) { return R { S(t, "lg", "lp") }; } + template R light_green_on_light_yellow(T t) { return R { S(t, "lg", "ly") }; } + template R light_green_on_bright_white(T t) { return R { S(t, "lg", "bw") }; } + template R light_aqua_on_black(T t) { return R { S(t, "la", "k") }; } + template R light_aqua_on_blue(T t) { return R { S(t, "la", "b") }; } + template R light_aqua_on_green(T t) { return R { S(t, "la", "g") }; } + template R light_aqua_on_aqua(T t) { return R { S(t, "la", "a") }; } + template R light_aqua_on_red(T t) { return R { S(t, "la", "r") }; } + template R light_aqua_on_purple(T t) { return R { S(t, "la", "p") }; } + template R light_aqua_on_yellow(T t) { return R { S(t, "la", "y") }; } + template R light_aqua_on_white(T t) { return R { S(t, "la", "w") }; } + template R light_aqua_on_grey(T t) { return R { S(t, "la", "e") }; } + template R light_aqua_on_light_blue(T t) { return R { S(t, "la", "lb") }; } + template R light_aqua_on_light_green(T t) { return R { S(t, "la", "lg") }; } + template R light_aqua_on_light_aqua(T t) { return R { S(t, "la", "la") }; } + template R light_aqua_on_light_red(T t) { return R { S(t, "la", "lr") }; } + template R light_aqua_on_light_purple(T t) { return R { S(t, "la", "lp") }; } + template R light_aqua_on_light_yellow(T t) { return R { S(t, "la", "ly") }; } + template R light_aqua_on_bright_white(T t) { return R { S(t, "la", "bw") }; } + template R light_red_on_black(T t) { return R { S(t, "lr", "k") }; } + template R light_red_on_blue(T t) { return R { S(t, "lr", "b") }; } + template R light_red_on_green(T t) { return R { S(t, "lr", "g") }; } + template R light_red_on_aqua(T t) { return R { S(t, "lr", "a") }; } + template R light_red_on_red(T t) { return R { S(t, "lr", "r") }; } + template R light_red_on_purple(T t) { return R { S(t, "lr", "p") }; } + template R light_red_on_yellow(T t) { return R { S(t, "lr", "y") }; } + template R light_red_on_white(T t) { return R { S(t, "lr", "w") }; } + template R light_red_on_grey(T t) { return R { S(t, "lr", "e") }; } + template R light_red_on_light_blue(T t) { return R { S(t, "lr", "lb") }; } + template R light_red_on_light_green(T t) { return R { S(t, "lr", "lg") }; } + template R light_red_on_light_aqua(T t) { return R { S(t, "lr", "la") }; } + template R light_red_on_light_red(T t) { return R { S(t, "lr", "lr") }; } + template R light_red_on_light_purple(T t) { return R { S(t, "lr", "lp") }; } + template R light_red_on_light_yellow(T t) { return R { S(t, "lr", "ly") }; } + template R light_red_on_bright_white(T t) { return R { S(t, "lr", "bw") }; } + template R light_purple_on_black(T t) { return R { S(t, "lp", "k") }; } + template R light_purple_on_blue(T t) { return R { S(t, "lp", "b") }; } + template R light_purple_on_green(T t) { return R { S(t, "lp", "g") }; } + template R light_purple_on_aqua(T t) { return R { S(t, "lp", "a") }; } + template R light_purple_on_red(T t) { return R { S(t, "lp", "r") }; } + template R light_purple_on_purple(T t) { return R { S(t, "lp", "p") }; } + template R light_purple_on_yellow(T t) { return R { S(t, "lp", "y") }; } + template R light_purple_on_white(T t) { return R { S(t, "lp", "w") }; } + template R light_purple_on_grey(T t) { return R { S(t, "lp", "e") }; } + template R light_purple_on_light_blue(T t) { return R { S(t, "lp", "lb") }; } + template R light_purple_on_light_green(T t) { return R { S(t, "lp", "lg") }; } + template R light_purple_on_light_aqua(T t) { return R { S(t, "lp", "la") }; } + template R light_purple_on_light_red(T t) { return R { S(t, "lp", "lr") }; } + template R light_purple_on_light_purple(T t) { return R { S(t, "lp", "lp") }; } + template R light_purple_on_light_yellow(T t) { return R { S(t, "lp", "ly") }; } + template R light_purple_on_bright_white(T t) { return R { S(t, "lp", "bw") }; } + template R light_yellow_on_black(T t) { return R { S(t, "ly", "k") }; } + template R light_yellow_on_blue(T t) { return R { S(t, "ly", "b") }; } + template R light_yellow_on_green(T t) { return R { S(t, "ly", "g") }; } + template R light_yellow_on_aqua(T t) { return R { S(t, "ly", "a") }; } + template R light_yellow_on_red(T t) { return R { S(t, "ly", "r") }; } + template R light_yellow_on_purple(T t) { return R { S(t, "ly", "p") }; } + template R light_yellow_on_yellow(T t) { return R { S(t, "ly", "y") }; } + template R light_yellow_on_white(T t) { return R { S(t, "ly", "w") }; } + template R light_yellow_on_grey(T t) { return R { S(t, "ly", "e") }; } + template R light_yellow_on_light_blue(T t) { return R { S(t, "ly", "lb") }; } + template R light_yellow_on_light_green(T t) { return R { S(t, "ly", "lg") }; } + template R light_yellow_on_light_aqua(T t) { return R { S(t, "ly", "la") }; } + template R light_yellow_on_light_red(T t) { return R { S(t, "ly", "lr") }; } + template R light_yellow_on_light_purple(T t) { return R { S(t, "ly", "lp") }; } + template R light_yellow_on_light_yellow(T t) { return R { S(t, "ly", "ly") }; } + template R light_yellow_on_bright_white(T t) { return R { S(t, "ly", "bw") }; } + template R bright_white_on_black(T t) { return R { S(t, "bw", "k") }; } + template R bright_white_on_blue(T t) { return R { S(t, "bw", "b") }; } + template R bright_white_on_green(T t) { return R { S(t, "bw", "g") }; } + template R bright_white_on_aqua(T t) { return R { S(t, "bw", "a") }; } + template R bright_white_on_red(T t) { return R { S(t, "bw", "r") }; } + template R bright_white_on_purple(T t) { return R { S(t, "bw", "p") }; } + template R bright_white_on_yellow(T t) { return R { S(t, "bw", "y") }; } + template R bright_white_on_white(T t) { return R { S(t, "bw", "w") }; } + template R bright_white_on_grey(T t) { return R { S(t, "bw", "e") }; } + template R bright_white_on_light_blue(T t) { return R { S(t, "bw", "lb") }; } + template R bright_white_on_light_green(T t) { return R { S(t, "bw", "lg") }; } + template R bright_white_on_light_aqua(T t) { return R { S(t, "bw", "la") }; } + template R bright_white_on_light_red(T t) { return R { S(t, "bw", "lr") }; } + template R bright_white_on_light_purple(T t) { return R { S(t, "bw", "lp") }; } + template R bright_white_on_light_yellow(T t) { return R { S(t, "bw", "ly") }; } + template R bright_white_on_bright_white(T t) { return R { S(t, "bw", "bw") }; } +} + +#endif diff --git a/lib/ClientHelper.cpp b/lib/ClientHelper.cpp index f6f7995..12418aa 100644 --- a/lib/ClientHelper.cpp +++ b/lib/ClientHelper.cpp @@ -1,10 +1,10 @@ #include "pch-il2cpp.h" -#include "helpers.h" -#include +#include #include "ClientHelper.h" -#include "wrapper.h" +#include "players/players.h" +#include "UnityCore.h" bool IsSinglePlayer() { @@ -21,226 +21,92 @@ bool IsHost() return app::BoltNetwork_get_IsServer(NULL); } -app::Menu* get_HorrorMenu() { - Wrapper wrapper; - - const Il2CppImage* image = wrapper.GetImage("Assembly-CSharp.dll"); - - // DO_APP_FUNC(0x0065B240, void, Menu_OnLobbyStartButtonClick, (Menu * __this, MethodInfo * method)); - // menu.OnLobbyStartButtonClick(); - - Il2CppObject* object = wrapper.GetObjectFromClass(image, "Horror", "Menu"); - - if (object != nullptr) { - - app::Object_1* Horror_MenuObject = app::Object_1_FindObjectOfType(reinterpret_cast(object), nullptr); - - if (Horror_MenuObject) { - app::Menu* HorrorMenu = reinterpret_cast(Horror_MenuObject); - - if (HorrorMenu) { - return HorrorMenu; - } - } - } - - return nullptr; -} - -std::string get_SceneName() +bool IsLocalPlayer(app::NolanBehaviour* player) { - app::SaveHelpers* SaveHelper = app::SaveHelpers_get_singleton(nullptr); + auto boltEntity = app::EntityBehaviour_get_entity((app::EntityBehaviour*)player, NULL); - if (SaveHelper) { + if (not boltEntity + || not app::BoltEntity_get_IsAttached(boltEntity, NULL) + || not app::BoltEntity_get_IsOwner(boltEntity, NULL)) + return false; - std::string str = il2cppi_to_string(SaveHelper->fields.sceneName); - - return str; - } - - return std::string("unknown"); + return true; } -void BurnRitualObj(bool burnAll) +bool IsPlayerCrawling() { - // Devour: SurvivalObjectBurnController - // Molly: SurvivalMollyAltarController - // Inn: InnMapController - // Town: SurvivalTownAltarController - // Slaughterhouse: SlaughterhouseAltarController + if (!Player::GetLocalPlayer()) + return false; - /* MAP: TOWN, DEVOUR - DO_APP_FUNC(0x00562320, void, SurvivalObjectBurnController_BurnGoat, (SurvivalObjectBurnController * __this, MethodInfo * method)); - DO_APP_FUNC(0x00562590, void, SurvivalObjectBurnController_SkipToGoat, (SurvivalObjectBurnController * __this, int32_t number, MethodInfo * method)); - */ - - if (!IsHost()) { - return; - } - - Wrapper wrapper; - const Il2CppImage* image = wrapper.GetImage("Assembly-CSharp.dll"); - - std::string sceneName = get_SceneName(); - - std::cout << "call..\n"; - - // !!!!Check if Azazel is awake. - BurnManager(sceneName, wrapper, image, burnAll); + return app::NolanBehaviour_IsCrawling(Player::GetNolan(), nullptr); } -void BurnManager(std::string& sceneName, Wrapper& wrapper, const Il2CppImage* image, bool burnAll) +bool IsPlayerCrawling(app::GameObject* go) { - int32_t num = 10; + if (go == NULL) + return false; - if (sceneName == std::string("Devour")) { + app::String* str = reinterpret_cast(il2cpp_string_new("NolanBehaviour")); - Il2CppObject* object = wrapper.GetObjectFromClass(image, "", "SurvivalObjectBurnController"); + if (app::GameObject_GetComponentByName != NULL) { + app::Component* nbComponent = app::GameObject_GetComponentByName(go, str, nullptr); - if (object != nullptr) { - auto SurvivalObjectBurnController_Object = app::Object_1_FindObjectOfType(reinterpret_cast(object), nullptr); + if (nbComponent) { + app::NolanBehaviour* nb = reinterpret_cast(nbComponent); - if (SurvivalObjectBurnController_Object) { - auto SurvivalObjectBurnController = reinterpret_cast(SurvivalObjectBurnController_Object); - - if (SurvivalObjectBurnController) { - - if (burnAll) { - if (app::SurvivalObjectBurnController_SkipToGoat) { - app::SurvivalObjectBurnController_SkipToGoat(SurvivalObjectBurnController, num, nullptr); - } - } - else { - if (app::SurvivalObjectBurnController_BurnGoat) { - app::SurvivalObjectBurnController_BurnGoat(SurvivalObjectBurnController, nullptr); - } - } - } + if (nb) { + return app::NolanBehaviour_IsCrawling(nb, nullptr); } } } - else if (sceneName == std::string("Molly")) { - /* - MAP: MOLLY - DO_APP_FUNC(0x0055C100, void, SurvivalMollyAltarController_SkipToGoat, (SurvivalMollyAltarController * __this, int32_t number, MethodInfo * method)); - DO_APP_FUNC(0x0055C8E0, void, SurvivalMollyAltarController_OnGoat, (SurvivalMollyAltarController * __this, MethodInfo * method)); - */ - - Il2CppObject* object = wrapper.GetObjectFromClass(image, "", "SurvivalMollyAltarController"); - - if (object != nullptr) { - auto MollyAltarController_Object = app::Object_1_FindObjectOfType(reinterpret_cast(object), nullptr); - - if (MollyAltarController_Object) { - auto SurvivalMollyAltarController = reinterpret_cast(MollyAltarController_Object); - - if (SurvivalMollyAltarController) { - - if (burnAll) { - if (app::SurvivalMollyAltarController_SkipToGoat) { - app::SurvivalMollyAltarController_SkipToGoat(SurvivalMollyAltarController, num, nullptr); - } - } - else { - if (app::SurvivalMollyAltarController_OnGoat) { - app::SurvivalMollyAltarController_OnGoat(SurvivalMollyAltarController, nullptr); - } - } - - } - } - } - } - else if (sceneName == std::string("Inn")) { - - /* MAP: INN - DO_APP_FUNC(0x00930CD0, void, MapController_SetProgressTo, (MapController * __this, int32_t progress, MethodInfo * method)); - DO_APP_FUNC(0x00930EA0, void, MapController_IncreaseProgress, (MapController * __this, MethodInfo * method)); - */ - - Il2CppObject* object = wrapper.GetObjectFromClass(image, "", "SurvivalMollyAltarController"); - - if (object != nullptr) { - auto MapController_Object = app::Object_1_FindObjectOfType(reinterpret_cast(object), nullptr); - - if (MapController_Object) { - auto MapController = reinterpret_cast(MapController_Object); - - if (MapController) { - - if (burnAll) { - if (app::MapController_SetProgressTo) { - app::MapController_SetProgressTo(MapController, num, nullptr); - } - } - else { - if (app::MapController_IncreaseProgress) { - app::MapController_IncreaseProgress(MapController, nullptr); - } - } - } - } - } - } - else if (sceneName == std::string("Town")) { - /* MAP: TOWN, DEVOUR - DO_APP_FUNC(0x00562320, void, SurvivalObjectBurnController_BurnGoat, (SurvivalObjectBurnController * __this, MethodInfo * method)); - DO_APP_FUNC(0x00562590, void, SurvivalObjectBurnController_SkipToGoat, (SurvivalObjectBurnController * __this, int32_t number, MethodInfo * method)); - */ - - Il2CppObject* object = wrapper.GetObjectFromClass(image, "", "SurvivalMollyAltarController"); - - if (object != nullptr) { - auto MapController_Object = app::Object_1_FindObjectOfType(reinterpret_cast(object), nullptr); - - if (MapController_Object) { - auto MapController = reinterpret_cast(MapController_Object); - - if (MapController) { - - if (burnAll) { - if (app::MapController_SetProgressTo) { - app::MapController_SetProgressTo(MapController, num, nullptr); - } - } - else { - if (app::MapController_IncreaseProgress) { - app::MapController_IncreaseProgress(MapController, nullptr); - } - } - } - } - } - } - else if (sceneName == std::string("Slaughterhouse")) { - /* MAP: Slaughterhouse - DO_APP_FUNC(0x0050DEB0, void, SlaughterhouseAltarController_SkipToGoat, (SlaughterhouseAltarController * __this, int32_t number, MethodInfo * method)); - */ - - Il2CppObject* object = wrapper.GetObjectFromClass(image, "", "SlaughterhouseAltarController"); - - if (object != nullptr) { - auto SlaughterhouseAltarController_Object = app::Object_1_FindObjectOfType(reinterpret_cast(object), nullptr); - - if (SlaughterhouseAltarController_Object) { - auto SlaughterhouseAltarController = reinterpret_cast(SlaughterhouseAltarController_Object); - - if (SlaughterhouseAltarController) { - - if (burnAll) { - if (app::SlaughterhouseAltarController_SkipToGoat) { - app::SlaughterhouseAltarController_SkipToGoat(SlaughterhouseAltarController, num, nullptr); - } - } - else { - return; - } - } - } - } - } - else { - return; - } + return app::NolanBehaviour_IsCrawling(Player::GetNolan(), nullptr); +} + +bool IsInGame() +{ + app::OptionsHelpers* optionsHelpers = UnityCore::Object::FindObjectOfType("OptionsHelpers"); + + if (optionsHelpers) + return optionsHelpers->fields._inGame_k__BackingField; + + return false; +} + +app::GameObject* GetAzazel(app::Survival* survival) +{ + app::GameObject* ai = app::Survival_GetAzazel(survival, nullptr); + + if (ai) { + return ai; + } + + return NULL; +} + + +std::string SceneName() +{ + if (app::SaveHelpers_get_singleton != nullptr) { + app::SaveHelpers* SaveHelper = app::SaveHelpers_get_singleton(nullptr); + + if (SaveHelper) { + + std::string str = il2cppi_to_string(SaveHelper->fields.sceneName); + + return str; + } + } + + return std::string(""); +} + + +float Time_DeltaTime() +{ + if (app::Time_1_get_deltaTime) { + return app::Time_1_get_deltaTime(nullptr); + } + + return 0.0f; } diff --git a/lib/ClientHelper.h b/lib/ClientHelper.h index 7e05291..653c061 100644 --- a/lib/ClientHelper.h +++ b/lib/ClientHelper.h @@ -1,15 +1,15 @@ #pragma once -#include - -class Wrapper; bool IsSinglePlayer(); bool IsOnline(); bool IsHost(); +bool IsLocalPlayer(app::NolanBehaviour* player); +bool IsPlayerCrawling(); +bool IsPlayerCrawling(app::GameObject* go); +bool IsInGame(); -app::Menu* get_HorrorMenu(); -std::string get_SceneName(); +app::GameObject* GetAzazel(app::Survival* survival); -void BurnRitualObj(bool burnAll); -void BurnManager(std::string& sceneName, Wrapper& wrapper, const Il2CppImage* image, bool burnAll); \ No newline at end of file +std::string SceneName(); +float Time_DeltaTime(); \ No newline at end of file diff --git a/lib/UnityCore.cpp b/lib/UnityCore.cpp new file mode 100644 index 0000000..2295412 --- /dev/null +++ b/lib/UnityCore.cpp @@ -0,0 +1,18 @@ +#include "pch-il2cpp.h" + +#include "UnityCore.h" + +app::Component* Unity::GameObject::GetComponentByName(app::GameObject* go, const char* type) +{ + app::String* str = reinterpret_cast(il2cpp_string_new(type)); + + if (str != nullptr) { + app::Component* component = app::GameObject_GetComponentByName(go, str, nullptr); + + if (component != nullptr) { + return component; + } + } + + return nullptr; +} diff --git a/lib/UnityCore.h b/lib/UnityCore.h new file mode 100644 index 0000000..5eba9ec --- /dev/null +++ b/lib/UnityCore.h @@ -0,0 +1,44 @@ +#pragma once + +#include "Wrapper.h" +#include + +namespace Unity { + namespace GameObject { + // DO_APP_FUNC(0x02D34DA0, Component *, GameObject_GetComponentByName, (GameObject * __this, String * type, MethodInfo * method)); + app::Component* GetComponentByName(app::GameObject* go, const char* type); + } +} + +namespace UnityCore { + template + class Object { + public: + Object() = default; + + static T* FindObjectOfType(const char* className, const char* classNamespace = ""); + }; + + template + inline T* Object::FindObjectOfType(const char* className, const char* classNamespace) + { + Wrapper obj("Assembly-CSharp.dll"); + + Il2CppObject* object = obj.find_class(classNamespace, className).get_class(); + if (object) { + + if (app::Object_1_FindObjectOfType == nullptr) return nullptr; + + app::Object_1* obj_1 = app::Object_1_FindObjectOfType(reinterpret_cast(object), nullptr); + + if (obj_1) { + T* foundObject = reinterpret_cast(obj_1); + if (foundObject) { + return foundObject; + } + } + } + + return nullptr; + } +} diff --git a/lib/wrapper.cpp b/lib/wrapper.cpp index 5ba74b8..90c8e20 100644 --- a/lib/wrapper.cpp +++ b/lib/wrapper.cpp @@ -1,64 +1,98 @@ #include "pch-il2cpp.h" -#include "wrapper.h" +#include "Wrapper.h" #include +#include -Wrapper::Wrapper() +Wrapper::Wrapper(const char* imageName) : image(GetImage(imageName)), obj(nullptr) {} + +const Il2CppImage* Wrapper::GetImage(const char* imageName) { - const Il2CppDomain* domain = il2cpp_domain_get(); + if (image) + return image; - const Il2CppAssembly** assemblies; - size_t size; + const Il2CppDomain* domain = il2cpp_domain_get(); + size_t size; + const Il2CppAssembly** assemblies = il2cpp_domain_get_assemblies(domain, &size); - assemblies = il2cpp_domain_get_assemblies(domain, &size); - - assemblyMap.clear(); - - for (size_t i = 0; i < size; ++i) { - const Il2CppAssembly* assembly = assemblies[i]; - - if (assembly) { - const char* assemblyName = il2cpp_image_get_name(assembly->image); - assemblyMap[assemblyName] = assembly; - } - } + for (size_t i = 0; i < size; ++i) { + const Il2CppAssembly* assembly = assemblies[i]; + if (assembly) { + const char* assemblyName = il2cpp_image_get_name(assembly->image); + if (std::string(assemblyName) == imageName) { + return assembly->image; + } + } + } + return nullptr; } -const Il2CppAssembly* Wrapper::GetAssembly(const char* _assembly) { - for (const auto& entry : assemblyMap) { - if (strcmp(entry.first, _assembly) == 0) { - return entry.second; - } - } - return nullptr; -} - -const Il2CppImage* Wrapper::GetImage(const char* _assembly) { - for (const auto& entry : assemblyMap) { - if (strcmp(entry.first, _assembly) == 0) { - return entry.second->image; - } - } - - return nullptr; -} - -Il2CppObject* Wrapper::GetObjectFromClass(const Il2CppImage* _image, const char* _namespaze, const char* _name) +Wrapper& Wrapper::find_class(const char* classNamespace, const char* className) { - Il2CppClass* _class = il2cpp_class_from_name(_image, _namespaze, _name); + Il2CppClass* _class = il2cpp_class_from_name(image, classNamespace, className); + if (_class) { + const Il2CppType* _type = il2cpp_class_get_type(_class); + if (_type) { + obj = il2cpp_type_get_object(_type); + } + } - if (_class) { - const Il2CppType* _type = il2cpp_class_get_type(_class); - - if (_type) { - Il2CppObject* _object = il2cpp_type_get_object(_type); - - if (_object) { - return _object; - } - } - } - - return nullptr; + return *this; +} + +void Wrapper::get_fields(const char* classNamespace, const char* className) +{ + +} + +void Wrapper::method_info(const char* classNamespace, const char* className) +{ + +} + + +void Wrapper::classList() +{ + size_t classCount = il2cpp_image_get_class_count(image); + + std::cout << "{\n"; + + for (size_t i = 0; i < classCount; ++i) { + const Il2CppClass* _klass = il2cpp_image_get_class(image, i); + + if (_klass) { + char* _name = const_cast(il2cpp_class_get_name(const_cast(_klass))); + char* _namespace = const_cast(il2cpp_class_get_namespace(const_cast(_klass))); + + std::cout << " [\n"; + std::cout << "\tName: " << _name << "\n"; + std::cout << "\tNamespace: " << _namespace << "\n"; + + std::cout << " ],\n"; + } + } + + std::cout << "\n}\n"; +} + +Il2CppObject* Wrapper::get_class() +{ + return obj; +} + +const char* Wrapper::GetImageName() +{ + if (image) + return il2cpp_image_get_name(image); + + return nullptr; +} + +const Il2CppImage* Wrapper::get_image() +{ + if (image) + return image; + + return nullptr; } diff --git a/lib/wrapper.h b/lib/wrapper.h index 8a94f13..7ea185b 100644 --- a/lib/wrapper.h +++ b/lib/wrapper.h @@ -1,15 +1,20 @@ #pragma once -#include +struct Il2CppObject; +struct Il2CppImage; class Wrapper { public: - Wrapper(); - - const Il2CppAssembly* GetAssembly(const char* _assembly); - const Il2CppImage* GetImage(const char* _assembly); - - Il2CppObject* GetObjectFromClass(const Il2CppImage* _image, const char* _namespaze, const char* _name); + Wrapper(const char* imageName); + Wrapper& find_class(const char* classNamespace, const char* className); + void get_fields(const char* classNamespace, const char* className); + void method_info(const char* classNamespace, const char* className); + void classList(); + Il2CppObject* get_class(); + const char* GetImageName(); + const Il2CppImage* get_image(); private: - std::map assemblyMap; + const Il2CppImage* GetImage(const char* image); + const Il2CppImage* image; + Il2CppObject* obj; }; diff --git a/user/features/misc/misc.cpp b/user/features/misc/misc.cpp index ccc8f0c..8ced730 100644 --- a/user/features/misc/misc.cpp +++ b/user/features/misc/misc.cpp @@ -1,21 +1,351 @@ #include "pch-il2cpp.h" -#include "misc.h" +#include "Misc.h" +#include "Wrapper.h" #include "ClientHelper.h" - -void Misc::SetRank(int rank) -{ - // -} - -void Misc::SetSteamName(std::string& name) -{ - get_HorrorMenu()->fields.steamName = reinterpret_cast(il2cpp_string_new("0x")); -} +#include "players/players.h" +#include "helpers.h" +#include "UnityCore.h" +#include +#include "Windows.h" +#include void Misc::ForceStart() { - if (IsHost()) { - app::Menu_OnLobbyStartButtonClick(get_HorrorMenu(), nullptr); + std::string _scene = SceneName(); + + if (IsHost() && _scene == std::string("Menu")) { + app::Menu* _menu = UnityCore::Object::FindObjectOfType("Menu", "Horror"); + + if (_menu) { + if (app::Menu_OnLobbyStartButtonClick) { + app::Menu_OnLobbyStartButtonClick(_menu, nullptr); + } + } + } +} + +void Misc::CarryItem(const char* itemName) +{ + std::string _scene = SceneName(); + + if (_scene == std::string("Menu")) { + return; + } + + std::map itemMap = { + {"Hay", "SurvivalHay"}, + {"First aid", "SurvivalFirstAid"}, + {"Bone", "SurvivalBone"}, + {"Battery", "SurvivalBattery"}, + {"Gasoline", "SurvivalGasoline"}, + {"Fuse", "SurvivalFuse"}, + {"Food", "SurvivalRottenFood"}, + {"Bleach", "SurvivalBleach"}, + {"Ritual Book (inactive)", "RitualBook-InActive-1"}, + {"Ritual Book (active)", "RitualBook-Active-1"}, + {"Matchbox", "Matchbox-3"}, + {"Egg 1", "Egg-Clean-1"}, + {"Egg 2", "Egg-Clean-2"}, + {"Egg 3", "Egg-Clean-3"}, + {"Egg 4", "Egg-Clean-4"}, + {"Egg 5", "Egg-Clean-5"}, + {"Egg 6", "Egg-Clean-6"}, + {"Egg 7", "Egg-Clean-7"}, + {"Egg 8", "Egg-Clean-8"}, + {"Egg 9", "Egg-Clean-9"}, + {"Egg 10", "Egg-Clean-10"} + }; + + std::string carryItem = itemMap[itemName]; + + if (!carryItem.empty() && Player::GetLocalPlayer()) { + app::String* str2 = reinterpret_cast(il2cpp_string_new(carryItem.c_str())); + app::NolanBehaviour_StartCarry(Player::GetNolan(), str2, nullptr); + } +} + +void Misc::CarryAnimal(const char* animalName) +{ + std::string _scene = SceneName(); + + if (_scene == std::string("Menu")) { + return; + } + + std::map animalMap = { + {"Rat", "SurvivalRat"}, + {"Goat", "SurvivalGoat"}, + {"Pig", "SurvivalPig"} + }; + + std::string carryAnimal = animalMap[animalName]; + + if (!carryAnimal.empty() && Player::GetLocalPlayer()) { + app::String* str2 = reinterpret_cast(il2cpp_string_new(carryAnimal.c_str())); + app::NolanBehaviour_StartCarry(Player::GetNolan(), str2, nullptr); + } +} + +void Misc::InstantWin() +{ + // app::InnMapController -> Inn + // app::SlaughterhouseAltarController -> Slaughterhouse + // SurvivalObjectBurnController -> other + + std::string _scene = SceneName(); + + if (_scene == std::string("Menu") && !IsHost() && !Player::GetLocalPlayer()) { + return; + } + + int32_t progress = 10; + + if (_scene == std::string("Inn")) { + app::MapController* _MapController = UnityCore::Object::FindObjectOfType("MapController"); + + if (_MapController) { + + // DO_APP_FUNC(0x00930CD0, void, MapController_SetProgressTo, (MapController * __this, int32_t progress, MethodInfo * method)); + + if (app::MapController_SetProgressTo != nullptr) { + app::MapController_SetProgressTo(_MapController, progress, nullptr); + } + } + } + else if (_scene == std::string("Slaughterhouse")) { + app::SlaughterhouseAltarController* _SlaughterhouseAltarController = UnityCore::Object::FindObjectOfType("SlaughterhouseAltarController"); + + if (_SlaughterhouseAltarController) { + + // DO_APP_FUNC(0x0050DEB0, void, SlaughterhouseAltarController_SkipToGoat, (SlaughterhouseAltarController * __this, int32_t number, MethodInfo * method)); + + if (app::SlaughterhouseAltarController_SkipToGoat != nullptr) { + app::SlaughterhouseAltarController_SkipToGoat(_SlaughterhouseAltarController, progress, nullptr); + } + } + } + else { + app::SurvivalObjectBurnController* _SurvivalObjectBurnController = UnityCore::Object::FindObjectOfType("SurvivalObjectBurnController"); + + if (_SurvivalObjectBurnController) { + // DO_APP_FUNC(0x00562590, void, SurvivalObjectBurnController_SkipToGoat, (SurvivalObjectBurnController * __this, int32_t number, MethodInfo * method)); + + if (app::SurvivalObjectBurnController_SkipToGoat != nullptr) { + app::SurvivalObjectBurnController_SkipToGoat(_SurvivalObjectBurnController, progress, nullptr); + } + } + } +} + +void Misc::CustomizedLobby() +{ + +} + +void Misc::RankSpoofer(int value) { + + app::GameObject* player = Player::GetLocalPlayer(); + + if (player == nullptr) { + return; + } + else { + app::NolanRankController* rankController = UnityCore::Object::FindObjectOfType("NolanRankController"); + + if (rankController != nullptr) { + if (app::NolanRankController_SetRank != nullptr) { + app::NolanRankController_SetRank(rankController, value, nullptr); + } + } + } +} + +void Misc::FullBright() +{ + std::string _scene = SceneName(); + + if (_scene == std::string("Menu")) { + return; + } + + app::NolanBehaviour* nb = Player::GetNolan(); + + if (nb != nullptr) { + app::Light* _flashlight = nb->fields.flashlightSpot; + + app::Light_set_intensity(_flashlight, 0.7f, nullptr); + app::Light_set_range(_flashlight, 400.0f, nullptr); + app::Light_set_spotAngle(_flashlight, 179.0f, nullptr); + + app::Light_set_shadows(_flashlight, app::LightShadows__Enum::None, nullptr); + } +} + +void Misc::Fly() { + +} + +void Misc::Revive(bool self) +{ + std::string _scene = SceneName(); + + if (_scene == std::string("Menu")) { + return; + } + + // app::SurvivalReviveInteractable + app::SurvivalReviveInteractable* revive = UnityCore::Object::FindObjectOfType("SurvivalReviveInteractable"); + + if (revive == NULL) { + if (self) { + app::GameObject* localPlayer = Player::GetLocalPlayer(); + + if (IsPlayerCrawling() && localPlayer != NULL) { + app::NolanBehaviour* nb = Player::GetNolan(); + if (nb != NULL) { + app::Vector3 vec{ 0.f, -100.f, 0.f }; + + if (app::Quaternion_get_identity != nullptr && app::NolanBehaviour_TeleportTo != nullptr) { + app::NolanBehaviour_TeleportTo(nb, vec, app::Quaternion_get_identity(nullptr), false, nullptr); + } + } + } + } + } + else { + if (self) { + app::GameObject* localPlayer = Player::GetLocalPlayer(); + + if (localPlayer != NULL) { + if (IsPlayerCrawling()) { + app::SurvivalReviveInteractable_Interact(revive, localPlayer, nullptr); + } + } + } + else { + app::GameObject__Array* players = Players::GetAllPlayers(); + + if (players != NULL) { + for (int i = 0; i < players->max_length; i++) { + app::GameObject* currentGo = players->vector[i]; + + if (currentGo) { + if (IsPlayerCrawling(currentGo)) { + app::SurvivalReviveInteractable_Interact(revive, currentGo, nullptr); + } + } + } + } + } + } +} + +void Misc::GetKeys() { + +} + +void Misc::Jumpscare() { + std::string _scene = SceneName(); + + if (_scene == std::string("Menu")) { + return; + } + + if (IsHost() == false) { + return; + } + + app::Survival* survival = UnityCore::Object::FindObjectOfType("Survival"); + if (survival == NULL) { return; } + + app::SurvivalAzazelBehaviour* azazel = UnityCore::Object::FindObjectOfType("SurvivalAzazelBehaviour"); + + app::GameObject* ai = GetAzazel(survival); + + if (azazel != NULL) { + + app::GameObject__Array* players = Players::GetAllPlayers(); + if (players == NULL) { return; } + + for (int i = 0; i < players->max_length; i++) { + app::GameObject* currentPlayer = players->vector[i]; + + if (currentPlayer == NULL) continue; + + app::Component* component = Unity::GameObject::GetComponentByName(currentPlayer, "NolanBehaviour"); + + if (component != NULL) { + app::NolanBehaviour* nb = reinterpret_cast(component); + + if (nb != NULL) { + if (!IsLocalPlayer(nb)) { + if (app::SurvivalAzazelBehaviour_OnPickedUpPlayer != nullptr) { + app::SurvivalAzazelBehaviour_OnPickedUpPlayer(azazel, ai, currentPlayer, true, nullptr); + } + } + } + } + } + } +} + +void Misc::Kill(bool self) { + std::string _scene = SceneName(); + + if (_scene == std::string("Menu")) { + return; + } + + if (IsHost() == false) { + return; + } + + app::Survival* survival = UnityCore::Object::FindObjectOfType("Survival"); + if (survival == NULL) { return; } + + app::SurvivalAzazelBehaviour* azazel = UnityCore::Object::FindObjectOfType("SurvivalAzazelBehaviour"); + + app::GameObject* ai = GetAzazel(survival); + + if (azazel != NULL) { + + if (self) { + app::GameObject* localPlayer = Player::GetLocalPlayer(); + + if (localPlayer == NULL) return; + + //DO_APP_FUNC(0x00622990, void, SurvivalAzazelBehaviour_OnKnockout, (SurvivalAzazelBehaviour * __this, GameObject * ai, GameObject * player, MethodInfo * method)); + if (app::SurvivalAzazelBehaviour_OnKnockout != nullptr) { + app::SurvivalAzazelBehaviour_OnKnockout(azazel, ai, localPlayer, nullptr); + } + } + else { + app::GameObject__Array* players = Players::GetAllPlayers(); + if (players == NULL) { return; } + + for (int i = 0; i < players->max_length; i++) { + app::GameObject* currentPlayer = players->vector[i]; + + if (currentPlayer == NULL) continue; + + app::Component* component = Unity::GameObject::GetComponentByName(currentPlayer, "NolanBehaviour"); + + if (component != NULL) { + app::NolanBehaviour* nb = reinterpret_cast(component); + + if (nb != NULL) { + + if (IsLocalPlayer(nb) && !self) + continue; + + //DO_APP_FUNC(0x00622990, void, SurvivalAzazelBehaviour_OnKnockout, (SurvivalAzazelBehaviour * __this, GameObject * ai, GameObject * player, MethodInfo * method)); + if (app::SurvivalAzazelBehaviour_OnKnockout != nullptr) { + app::SurvivalAzazelBehaviour_OnKnockout(azazel, ai, currentPlayer, nullptr); + } + } + } + } + } } } diff --git a/user/features/misc/misc.h b/user/features/misc/misc.h index 18bcc6c..85723b0 100644 --- a/user/features/misc/misc.h +++ b/user/features/misc/misc.h @@ -5,7 +5,16 @@ #include namespace Misc { - void SetRank(int rank); - void SetSteamName(std::string& name); void ForceStart(); + void CarryItem(const char* itemName); + void CarryAnimal(const char* animalName); + void InstantWin(); + void CustomizedLobby(); + void FullBright(); + void Fly(); + void Revive(bool self); + void GetKeys(); + void Jumpscare(); + void Kill(bool self); + void RankSpoofer(int value); } \ No newline at end of file diff --git a/user/players/players.cpp b/user/players/players.cpp new file mode 100644 index 0000000..5b8be28 --- /dev/null +++ b/user/players/players.cpp @@ -0,0 +1,83 @@ +#include "pch-il2cpp.h" + +#include "players.h" + +#include + + +app::GameObject__Array* Players::GetAllPlayers() +{ + app::String* playerTagStr = reinterpret_cast(il2cpp_string_new("Player")); + + if (app::GameObject_FindGameObjectsWithTag) { + app::GameObject__Array* playersTag = app::GameObject_FindGameObjectsWithTag(playerTagStr, nullptr); + + if (playersTag) { + return playersTag; + } + } + + return nullptr; +} + +app::GameObject* Player::GetLocalPlayer() +{ + app::GameObject__Array* playerList = Players::GetAllPlayers(); + app::String* NolanBehaviourStr = reinterpret_cast(il2cpp_string_new("NolanBehaviour")); + + if (!playerList || playerList->max_length == 0) + return nullptr; + + il2cpp_array_size_t _size = playerList->max_length; + for (int i = 0; i < _size; i++) { + app::GameObject* currentPlayer = playerList->vector[i]; + + if (app::GameObject_GetComponentByName) { + app::Component* nbComponent = app::GameObject_GetComponentByName(currentPlayer, NolanBehaviourStr, nullptr); + + if (nbComponent) { + app::NolanBehaviour* nb = reinterpret_cast(nbComponent); + + if (nb) { + + if (app::BoltEntity_get_IsOwner != nullptr && currentPlayer != nullptr) { + + app::BoltEntity* entity = nb->fields._._._._._entity; + + if (entity) { + if (app::BoltEntity_get_IsOwner(entity, nullptr)) { + return currentPlayer; + } + } + + } + } + } + } + } + return nullptr; +} + +app::NolanBehaviour* Player::GetNolan() +{ + app::GameObject* localPlayer = Player::GetLocalPlayer(); + app::String* NolanBehaviourStr = reinterpret_cast(il2cpp_string_new("NolanBehaviour")); + + if (localPlayer) { + if (app::GameObject_GetComponentByName) { + app::Component* nbComponent = app::GameObject_GetComponentByName(localPlayer, NolanBehaviourStr, nullptr); + + if (nbComponent) { + app::NolanBehaviour* nb = reinterpret_cast(nbComponent); + + if (nb) { + return nb; + } + } + } + } + + return nullptr; +} + + diff --git a/user/players/players.h b/user/players/players.h new file mode 100644 index 0000000..772baa2 --- /dev/null +++ b/user/players/players.h @@ -0,0 +1,11 @@ +#pragma once +#include + +namespace Players { + app::GameObject__Array* GetAllPlayers(); +} + +namespace Player { + app::GameObject* GetLocalPlayer(); + app::NolanBehaviour* GetNolan(); +} \ No newline at end of file