diff --git a/R3nzSkin/Config.cpp b/R3nzSkin/Config.cpp index f6e2bdf2..5fcab851 100644 --- a/R3nzSkin/Config.cpp +++ b/R3nzSkin/Config.cpp @@ -40,6 +40,7 @@ void Config::save() noexcept config_json["heroName"] = this->heroName; config_json["raibowText"] = this->rainbowText; config_json["quickSkinChange"] = this->quickSkinChange; + config_json["isOpen"] = this->isOpen; config_json["fontScale"] = this->fontScale; config_json["current_combo_ward_index"] = this->current_combo_ward_index; config_json["current_ward_skin_index"] = this->current_ward_skin_index; @@ -80,6 +81,7 @@ void Config::load() noexcept this->heroName = config_json.value("heroName", true); this->rainbowText = config_json.value("raibowText", false); this->quickSkinChange = config_json.value("quickSkinChange", false); + this->isOpen = config_json.value("isOpen", true); this->fontScale = config_json.value("fontScale", 1.0f); this->current_combo_ward_index = config_json.value("current_combo_ward_index", 0); this->current_ward_skin_index = config_json.value("current_ward_skin_index", -1); @@ -111,6 +113,7 @@ void Config::reset() noexcept this->heroName = true; this->rainbowText = true; this->quickSkinChange = false; + this->isOpen = true; this->fontScale = 1.0f; this->current_combo_skin_index = 0; this->current_combo_ward_index = 0; diff --git a/R3nzSkin/Config.hpp b/R3nzSkin/Config.hpp index 0a112fe3..f8731229 100644 --- a/R3nzSkin/Config.hpp +++ b/R3nzSkin/Config.hpp @@ -24,6 +24,7 @@ class Config { float fontScale{ 1.0f }; bool heroName{ true }; bool quickSkinChange{ false }; + bool isOpen{ true }; // player std::int32_t current_combo_skin_index{ 0 }; diff --git a/R3nzSkin/GUI.cpp b/R3nzSkin/GUI.cpp index 9233f880..1aca77f2 100644 --- a/R3nzSkin/GUI.cpp +++ b/R3nzSkin/GUI.cpp @@ -53,7 +53,7 @@ void GUI::render() noexcept const auto player{ cheatManager.memory->localPlayer }; const auto heroes{ cheatManager.memory->heroList }; - static const auto my_team{ player ? player->get_team() : 100 }; + static const auto my_team{ player ? player->get_team() : 1 }; static int gear{ player ? player->get_character_data_stack()->base_skin.gear : 0 }; static const auto vector_getter_skin = [](void* vec, const std::int32_t idx, const char** out_text) noexcept { @@ -94,9 +94,10 @@ void GUI::render() noexcept ImGui::Text("Player Skins Settings:"); if (ImGui::Combo("Current Skin", &cheatManager.config->current_combo_skin_index, vector_getter_skin, static_cast(&values), values.size() + 1)) - if (cheatManager.config->current_combo_skin_index > 0) + if (cheatManager.config->current_combo_skin_index > 0) { player->change_skin(values[cheatManager.config->current_combo_skin_index - 1].model_name, values[cheatManager.config->current_combo_skin_index - 1].skin_id); - + cheatManager.config->save(); + } const auto playerHash{ fnv::hash_runtime(player->get_character_data_stack()->base_skin.model.str) }; if (const auto it{ std::ranges::find_if(cheatManager.database->specialSkins, [&skin = player->get_character_data_stack()->base_skin.skin, &ph = playerHash](const SkinDatabase::specialSkin& x) noexcept -> bool @@ -164,8 +165,10 @@ void GUI::render() noexcept auto& values{ cheatManager.database->champions_skins[champion_name_hash] }; if (ImGui::Combo(str_buffer, &fst->second, vector_getter_skin, static_cast(&values), values.size() + 1)) - if (fst->second > 0) + if (fst->second > 0) { hero->change_skin(values[fst->second - 1].model_name, values[fst->second - 1].skin_id); + cheatManager.config->save(); + } } footer(); ImGui::EndTabItem(); @@ -177,10 +180,20 @@ void GUI::render() noexcept if (ImGui::Combo("Minion Skins:", &cheatManager.config->current_combo_minion_index, vector_getter_default, static_cast(&cheatManager.database->minions_skins), cheatManager.database->minions_skins.size() + 1)) cheatManager.config->current_minion_skin_index = cheatManager.config->current_combo_minion_index - 1; ImGui::Separator(); - if (ImGui::Combo("Order Turret Skins:", &cheatManager.config->current_combo_order_turret_index, vector_getter_default, static_cast(&cheatManager.database->turret_skins), cheatManager.database->turret_skins.size() + 1)) - changeTurretSkin(cheatManager.config->current_combo_order_turret_index - 1, 100); - if (ImGui::Combo("Chaos Turret Skins:", &cheatManager.config->current_combo_chaos_turret_index, vector_getter_default, static_cast(&cheatManager.database->turret_skins), cheatManager.database->turret_skins.size() + 1)) - changeTurretSkin(cheatManager.config->current_combo_chaos_turret_index - 1, 200); + if (ImGui::Combo("Order Turret Skins:", &cheatManager.config->current_combo_order_turret_index, vector_getter_default, static_cast(&cheatManager.database->turret_skins), cheatManager.database->turret_skins.size() + 1)) + { + if (cheatManager.config->current_combo_order_turret_index >= 17) + changeTurretSkin(cheatManager.config->current_combo_order_turret_index + 1, 1); + else + changeTurretSkin(cheatManager.config->current_combo_order_turret_index - 1, 1); + } + if (ImGui::Combo("Chaos Turret Skins:", &cheatManager.config->current_combo_chaos_turret_index, vector_getter_default, static_cast(&cheatManager.database->turret_skins), cheatManager.database->turret_skins.size() + 1)) + { + if (cheatManager.config->current_combo_chaos_turret_index >= 17) + changeTurretSkin(cheatManager.config->current_combo_chaos_turret_index + 1, 2); + else + changeTurretSkin(cheatManager.config->current_combo_chaos_turret_index - 1, 2); + } ImGui::Separator(); ImGui::Text("Jungle Mobs Skins Settings:"); for (auto& [name, name_hashes, skins] : cheatManager.database->jungle_mobs_skins) { @@ -201,6 +214,8 @@ void GUI::render() noexcept if (ImGui::BeginTabItem("Extras")) { ImGui::hotkey("Menu Key", cheatManager.config->menuKey); + ImGui::Checkbox("Auto Show Menu", &cheatManager.config->isOpen); + ImGui::hoverInfo("Automatically open the menu after entering the game."); ImGui::Checkbox(cheatManager.config->heroName ? "HeroName based" : "PlayerName based", &cheatManager.config->heroName); ImGui::Checkbox("Rainbow Text", &cheatManager.config->rainbowText); ImGui::Checkbox("Quick Skin Change", &cheatManager.config->quickSkinChange); @@ -227,6 +242,7 @@ void GUI::render() noexcept if (const auto hero{ heroes->list[i] }; hero != player) hero->change_skin(hero->get_character_data_stack()->base_skin.model.str, 0); } + cheatManager.config->save(); } ImGui::hoverInfo("Sets the skins of all champions except the local player to the default skin."); if (ImGui::Button("Random Skins")) { @@ -249,6 +265,7 @@ void GUI::render() noexcept data = random(1ull, skinCount); hero->change_skin(skinDatabase[data - 1].model_name, skinDatabase[data - 1].skin_id); } + cheatManager.config->save(); } } ImGui::hoverInfo("Randomly changes the skin of all champions."); diff --git a/R3nzSkin/Hooks.cpp b/R3nzSkin/Hooks.cpp index fd79ad51..08ae3cbb 100644 --- a/R3nzSkin/Hooks.cpp +++ b/R3nzSkin/Hooks.cpp @@ -259,6 +259,7 @@ namespace d3d_vtable { } } + struct dxgi_present { static long WINAPI hooked(IDXGISwapChain* p_swap_chain, UINT sync_interval, UINT flags) noexcept { @@ -321,7 +322,7 @@ void Hooks::init() noexcept } } - const auto my_team{ player ? player->get_team() : 100 }; + const auto my_team{ player ? player->get_team() : 1 }; for (auto i{ 0u }; i < heroes->length; ++i) { const auto hero{ heroes->list[i] }; if (hero == player) @@ -360,8 +361,8 @@ void Hooks::init() noexcept for (auto i{ 0u }; i < minions->length; ++i) { const auto minion{ minions->list[i] }; - if (minion->isLaneMinion()) { - if (player && player->get_team() == 200) + if (minion->isLaneMinion() && cheatManager.config->current_minion_skin_index != -1) { + if (player && player->get_team() == 2) changeSkinForObject(minion, cheatManager.config->current_minion_skin_index * 2 + 1); else changeSkinForObject(minion, cheatManager.config->current_minion_skin_index * 2); diff --git a/R3nzSkin/R3nzSkin.cpp b/R3nzSkin/R3nzSkin.cpp index f1a0a277..6da51c20 100644 --- a/R3nzSkin/R3nzSkin.cpp +++ b/R3nzSkin/R3nzSkin.cpp @@ -56,6 +56,7 @@ __declspec(safebuffers) static void WINAPI DllAttach([[maybe_unused]] LPVOID lp) cheatManager.config->init(); cheatManager.config->load(); + cheatManager.gui->is_open = cheatManager.config->isOpen; cheatManager.logger->addLog("CFG loaded!\n"); cheatManager.hooks->install(); diff --git a/R3nzSkin/SDK/Champion.hpp b/R3nzSkin/SDK/Champion.hpp index b8986620..1337411e 100644 --- a/R3nzSkin/SDK/Champion.hpp +++ b/R3nzSkin/SDK/Champion.hpp @@ -8,6 +8,6 @@ class Champion { PAD(0x8) AString champion_name; - PAD(0xA0) + PAD(0xB0) RiotArray skins; }; diff --git a/R3nzSkin/SDK/ChampionManager.hpp b/R3nzSkin/SDK/ChampionManager.hpp index 29064322..3d430099 100644 --- a/R3nzSkin/SDK/ChampionManager.hpp +++ b/R3nzSkin/SDK/ChampionManager.hpp @@ -4,8 +4,9 @@ #include "Champion.hpp" #include "Pad.hpp" +#include "RiotArray.hpp" class ChampionManager { PAD(0x18) - std::vector champions; + RiotArray champions; }; diff --git a/R3nzSkin/SDK/GameClient.hpp b/R3nzSkin/SDK/GameClient.hpp index 2bea64d5..d3c1d119 100644 --- a/R3nzSkin/SDK/GameClient.hpp +++ b/R3nzSkin/SDK/GameClient.hpp @@ -4,6 +4,6 @@ #include "Pad.hpp" class GameClient { - PAD(0xC) + PAD(0x10) GGameState_s game_state; }; diff --git a/R3nzSkin/SDK/GameObject.hpp b/R3nzSkin/SDK/GameObject.hpp index 63c6694d..57751c8f 100644 --- a/R3nzSkin/SDK/GameObject.hpp +++ b/R3nzSkin/SDK/GameObject.hpp @@ -9,7 +9,7 @@ class GameObject { public: CLASS_GETTER_P(std::string, get_name, offsets::GameObject::Name) - CLASS_GETTER(std::int32_t, get_team, offsets::GameObject::Team) + CLASS_GETTER(std::int8_t, get_team, offsets::GameObject::Team) // Returns true for lane minions. [[nodiscard]] bool isLaneMinion() const noexcept { return CallVirtual(std::uintptr_t(this)); } diff --git a/R3nzSkin/SkinDatabase.cpp b/R3nzSkin/SkinDatabase.cpp index c6461b5d..25416e54 100644 --- a/R3nzSkin/SkinDatabase.cpp +++ b/R3nzSkin/SkinDatabase.cpp @@ -11,7 +11,8 @@ void SkinDatabase::load() noexcept { - for (const auto& champion : cheatManager.memory->championManager->champions) { + for (auto j{ 0 }; j < cheatManager.memory->championManager->champions.size;++j) { + const auto& champion = cheatManager.memory->championManager->champions.list[j]; std::vector skins_ids; for (auto i{ 0 }; i < champion->skins.size; ++i) @@ -58,7 +59,7 @@ void SkinDatabase::load() noexcept const auto ward_display_name{ "game_character_skin_displayname_SightWard_" + std::to_string(ward_skin_id) }; const auto ward_display_name_translated{ cheatManager.memory->translateString(ward_display_name.c_str()) }; - if (ward_display_name == ward_display_name_translated) + if (ward_display_name_translated == nullptr || ward_display_name_translated[0] == '\0') break; this->wards_skins.emplace_back(ward_skin_id, ward_display_name_translated); diff --git a/R3nzSkin/SkinDatabase.hpp b/R3nzSkin/SkinDatabase.hpp index 83984dcd..653e923a 100644 --- a/R3nzSkin/SkinDatabase.hpp +++ b/R3nzSkin/SkinDatabase.hpp @@ -53,7 +53,9 @@ class SkinDatabase { "Temple of Lily and Lotus Turret", "Arcane Order Turret", "Arcane Chaos Turret", "Butcher's Bridge Order Turret", "Butcher's Bridge Chaos Turret", - "Howling Abyss Order Turret", "Howling Abyss Chaos Turret" + "Howling Abyss Order Turret", "Howling Abyss Chaos Turret", + "Zaun Order Turret","Piltover Chaos Turret", + "Black Rose Turret" }; std::vector jungle_mobs_skins{ @@ -93,6 +95,13 @@ class SkinDatabase { { FNV("Katarina"), 29, 36, { "Dagger 1", "Dagger 2", "Dagger 3", "Dagger 4", "Dagger 5", "Dagger 6" }}, { FNV("Renekton"), 26, 32, { "Head off", "Head on", "Fins", "Ultimate" } }, { FNV("MissFortune"), 16, 16, { "Scarlet fair", "Zero hour", "Royal arms", "Starswarm" } }, - { FNV("Ezreal"), 5, 5, { "Level 1", "Level 2", "Level 3" } } + { FNV("Ezreal"), 5, 5, { "Level 1", "Level 2", "Level 3" } }, + { FNV("Ahri"), 86, 86, { "Hall of Legends", "Risen Legend", "Immortalized Legend" } }, + { FNV("Jinx"), 60, 60, { "With hood", "Parallel world", "Without hood" } }, + { FNV("Sett"), 66, 66, { "Blue", "Gold", "Red" } }, + { FNV("Mordekaiser"), 54, 54, { "Sahn-Uzal", "Unconquered King", "Iron Revenant" } }, + { FNV("Kaisa"), 71, 71, { "Hall of Legends", "Risen Legend", "Immortalized Legend" } }, + { FNV("Morgana"), 80, 80, { "Mask1", "Mask2", "Mask3", "Mask4", "Mask5", "Mask6"}}, + { FNV("Viego"), 43, 43, { "Sword1", "Sword2", "Sword3", "Sword4", "Sword5", "Sword6", "Sword7"}} }; }; diff --git a/R3nzSkin/encryption.hpp b/R3nzSkin/encryption.hpp index 3a31a2a6..ce216809 100644 --- a/R3nzSkin/encryption.hpp +++ b/R3nzSkin/encryption.hpp @@ -6,12 +6,12 @@ #pragma pack(push, 4) template class xor_value { + T xor_key; + T values_table[4]; bool xor_key_was_init{ 0 }; std::uint8_t bytes_xor_count; std::uint8_t bytes_xor_count_8; - T xor_key; std::uint8_t value_index{ 0 }; - T values_table[4]; public: T decrypt() noexcept { diff --git a/R3nzSkin/memory.hpp b/R3nzSkin/memory.hpp index 3fb464b7..a662291f 100644 --- a/R3nzSkin/memory.hpp +++ b/R3nzSkin/memory.hpp @@ -51,7 +51,7 @@ class Memory { { { { - "48 8B 05 ? ? ? ? 4C 8B FA 83 78 0C 02" + "48 8B 05 ? ? ? ? 48 8B F2 83 78" }, true, false, true, 0, &offsets::global::GameClient } }; @@ -60,12 +60,12 @@ class Memory { { { { - "48 8B 3D ? ? ? ? 48 3B CF" + "48 8B 3D ? ? ? ? 48 85 FF 74 15 48 81 C7" }, true, false, true, 0, &offsets::global::Player }, { { - "48 8B 05 ? ? ? ? 48 8B 78 08 8B 40 10 4C 8D 3C C7 49 3B FF" + "48 8B 05 ? ? ? ? 48 8B ? 08 8B 40 ? ? 8D ? ? ? 3B ? 74" }, true, false, true, 0, &offsets::global::ManagerTemplate_AIHero_ }, { @@ -75,12 +75,12 @@ class Memory { }, { { - "48 8B 0D ? ? ? ? E8 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ? 48 8B C8 48 8B 10" + "48 8B 0D ? ? ? ? E8 ? ? ? ? 48 8B 0D ? ? ? ? E8 ? ? ? ? 48 8B 0D ? ? ? ? E8 ? ? ? ? E8 ? ? ? ? 48 8B 0D ? ? ? ? 48 8B 01" }, true, false, true, 0, &offsets::global::ManagerTemplate_AIMinionClient_ }, { { - "48 8B 1D ? ? ? ? 48 8B 5B 28 48 85 DB" + "48 8B 05 ? ? ? ? 48 8B ? 28 48 85 ? 74" }, true, false, true, 0, &offsets::global::ManagerTemplate_AITurret_ }, { @@ -95,7 +95,7 @@ class Memory { }, { { - "40 38 BB ? ? 00 00 0F 85 ? ? 00 00 66 C7 83 ? ? ? ? ? ? 0F 31 48 C1 E2 20 4C 8D 83 ? ? 00 00 48 0B C2 44 8B CF 48 89 44 24 38 8B D7" + "88 86 ? ? 00 00 48 89 45 ? 0F B6 45 A8 88 86 ? 13" }, false, true, false, 0, &offsets::AIBaseCommon::SkinId }, { @@ -105,17 +105,17 @@ class Memory { }, { { - "E8 ? ? ? ? 48 8D 8D ? ? 00 00 E8 ? ? ? ? 48 85 C0 74 ? 48 85 ED" + "E8 ? ? ? ? 8B 95 ? ? 00 00 48 8B 0D ? ? ? ? E8 ? ? ? ? 48 8B D8" }, true, false, false, 0, &offsets::functions::CharacterDataStack__Push }, { { - "88 54 24 10 53 55 56 57 41 54 41 55 41 56 41" + "88 54 24 10 55 53 56 57 41 54 41 55 41 56 41" }, true, false, false, 0, &offsets::functions::CharacterDataStack__Update }, { { - "E8 ? ? ? ? 8B 57 44" + "E8 ? ? ? ? 8B 57 34 45 33 C9" }, true, false, false, 0, &offsets::functions::Riot__Renderer__MaterialRegistry__GetSingletonPtr }, { @@ -125,7 +125,7 @@ class Memory { }, { { - "E8 ? ? ? ? 4C 3B F8 0F 94 C0" + "E8 ? ? ? ? 4C 3B ? 0F 94 C0" }, true, false, false, 0, &offsets::functions::GetGoldRedirectTarget } }; diff --git a/R3nzSkin/offsets.hpp b/R3nzSkin/offsets.hpp index 7d049ddd..0fadda63 100644 --- a/R3nzSkin/offsets.hpp +++ b/R3nzSkin/offsets.hpp @@ -6,7 +6,7 @@ namespace offsets { namespace GameObject { namespace VTable { enum { - IsLaneMinion = 0xEB, // E8 ? ? ? ? 84 C0 0F 84 ? ? ? ? 39 1F + IsLaneMinion = 0xF0, // E8 ? ? ? ? 84 C0 0F 84 ? ? ? ? 39 1F IsEliteMinion = IsLaneMinion + 0x1, IsEpicMinion = IsEliteMinion + 0x1, IsMinion = IsEpicMinion + 0x4, @@ -14,8 +14,8 @@ namespace offsets { }; }; enum { - Team = 0x3C, - Name = 0x60 + Team = 0x259, + Name = 0x68 }; }; diff --git a/README.md b/README.md index efb33fe2..9c12404d 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,64 @@ 
- [![C++](https://img.shields.io/badge/Language-C%2B%2B-%23f34b7d.svg?style=plastic)](https://en.wikipedia.org/wiki/C%2B%2B) - [![LOL](https://img.shields.io/badge/Game-League%20of%20Legends-445fa5.svg?style=plastic)](https://na.leagueoflegends.com) - [![Windows](https://img.shields.io/badge/Platform-Windows-0078d7.svg?style=plastic)](https://en.wikipedia.org/wiki/Microsoft_Windows) - [![x64](https://img.shields.io/badge/Arch-x64-red.svg?style=plastic)](https://en.wikipedia.org/wiki/X86-64) - [![License](https://img.shields.io/github/license/R3nzTheCodeGOD/R3nzSkin.svg?style=plastic)](LICENSE) - [![Issues](https://img.shields.io/github/issues/R3nzTheCodeGOD/R3nzSkin.svg?style=plastic)](https://github.com/R3nzTheCodeGOD/R3nzSkin/issues) - ![Windows](https://github.com/R3nzTheCodeGOD/R3nzSkin/workflows/Windows/badge.svg?branch=main&event=push) +# R3nzSkin - # **R3nzSkin** +**> English <** | [简体中文](README_zh.md) - ## Announcement - R3nzSkin is **no longer supported** due to Riot Games implementing Valorant's Vanguard anti-cheat to League of Legends - - +
- `R3nzSkin` is an internal skin changer for League of Legends. +# **Disclaimer** - +**This project is for learning and technical exchange purposes only. Commercial use or any illegal activity is strictly prohibited. Any direct or indirect consequences arising from the use of this project shall be borne solely by the user, and the author assumes no responsibility.** -- Change the skin of your champion, your ward, other champions, towers, minions, and jungle monsters in the game. -- Automatic skin database update. -- Support for spectator mode. -- Change skins anytime and unlimited times in a single game. -- Supports all popular languages ​​in the world. -- In-game configuration with ImGui. -- JSON based configuration saving & loading +**By using this project, you fully understand and accept the above terms.** # Building - 1. Clone the source with `git clone --recursive https://github.com/R3nzTheCodeGOD/R3nzSkin.git` - 2. Build in Visual Studio 2019/2022 with configuration "Your Region - x64" + +1. Clone the source with `git clone --recursive https://github.com/hydy100/R3nzSkin.git` + + - **If you don't modify this source code, compiling and using it on Chinese servers will definitely result in a ban. The functionality is fine.** + +2. Build in Visual Studio 2019/2022 with configuration "Your Region - x64" + + > Quick tip: The original method of RiotServers cannot be injected. The injection method I currently use is `SetWindowsHookEx`. With a little effort, the injection should be possible. There is no need to say more, and don’t ask me. # Usage - 1. Compile source or download a compiled version. - 2. Use `R3nzSkin_Injector.exe` or inject the built DLL into the game yourself. - - *Administrator* privilege may be needed if the injector failed to inject the DLL. - - League client can crash if `R3nzSkin` is injected before being in the game. - - A workaround is to not inject until you are in the game (you will need to be fast to not disrupt the game). - 3. Press Insert to bring up the menu. - 4. Select the skin for you, your teammates, enemies, and wards. + +1. Compile source or [download](https://github.com/hydy100/R3nzSkin/releases/latest) a compiled version. +2. Then check: [Instructions for use](https://hydy100.top/) ,I've written the detailed instructions inside. + +# About the project + +- I include some explanations for each release in the description of [Releases](https://github.com/hydy100/R3nzSkin/releases/latest). +- **I've hardly posted this project on any other platform, so if you share it, please help solve some issues rather than redirecting everything to me. Alternatively, provide [R3nzSkin](https://github.com/hydy100/R3nzSkin) so they can submit issues there.** +- **There is no paid version or any other versions, and there is no requirement to join any groups. I've released all the files, I just left a contact method.** +- The project is currently purely non-profit, just like the original [R3nzSkin](https://github.com/R3nzTheCodeGOD/R3nzSkin). +- There are some issues I can't solve very well, so I welcome anyone with the ability to help resolve them, if you're willing. + +# About the releases +- Regarding the issue of dll size in releases, I just added some anti-cracking shells or compressed shells, and the dll function source code has been completely open source. +- Regarding the injector part in releases, it is not open source, but the quick tip also mentioned how to update it to make it available. It was not made clear before that the original version cannot be used, but the fact that I have never submitted any updates for the injector also indicates this issue. +- The releases and source codes of many open source projects are also different. I don't want anyone to kidnap me in the name of open source and ask me to do something meaningless. This goes against the original intention of open source. +- **Due to the existence of special risks, in order to avoid unnecessary trouble, the file release of the Chinese server version may be stopped in the future.** + +# Regarding views on open source (quoting ChatGPT) +If someone tries to "hijack" you through the open-source spirit, demanding that you justify the rationale behind parts of the code that are not open-source, this actually contradicts the core values of the open-source spirit. The essence of open source is to encourage sharing and collaboration, but this doesn't mean every line of code has to be open. Open-source licenses allow developers to decide whether or not to make their code public, and in some cases, certain parts of the code may not be suitable for open-source due to commercial, privacy, or security reasons. + +Here are a few points to understand this: + +1. Balance between open-source and private code: Open-source does not require all code to be open. In many open-source projects, the core functionality or sensitive parts might remain private, while other parts are made public. Developers have the right to decide which parts to share and which to keep private. + +2. Respecting the developer's choice: If a developer chooses not to open-source a part of their code, that decision should be respected. It does not mean that the developer is not adhering to the open-source spirit; they may have other reasons, such as protecting commercial interests, maintaining security, or preventing abuse. + +3. Avoiding "hijacking" behavior: The open-source community's spirit is based on freedom, collaboration, and respect. If someone uses the "open-source spirit" as a pretext to force you to explain or change your code-sharing strategy, this behavior itself deviates from the true meaning of open source. Open-source is voluntary, and any form of coercion is not to be encouraged. + +In summary, the open-source spirit advocates freedom, sharing, and collaboration, but it does not mean that all code must be open. Every developer should have the right to decide the level of openness for their own code. + # Further optimizations - If your CPU supports AVX / AVX2 / AVX-512 instruction set, you can enable it in project settings. This should result in more performant code, optimized for your CPU. Currently SSE2 instructions are selected in project settings. + +If your CPU supports AVX / AVX2 / AVX-512 instruction set, you can enable it in project settings. This should result in more performant code, optimized for your CPU. Currently SSE2 instructions are selected in project settings. # Credits - This program is an improved and updated version of the B3akers/LeagueSkinChanger project. + +This program is an improved and updated version of the [R3nzTheCodeGOD](https://github.com/R3nzTheCodeGOD)/[R3nzSkin](https://github.com/R3nzTheCodeGOD/R3nzSkin) project. diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 00000000..af3b513a --- /dev/null +++ b/README_zh.md @@ -0,0 +1,62 @@ +
+ + # Re换肤 + +[English](README.md)|**> 简体中文 <** + +
+ +# 声明 + +**本项目仅供学习和技术交流之用,禁止用于任何商业用途或违法行为。因使用本项目而引发的任何直接或间接后果,均由使用者自行承担,作者不承担任何责任。** + +**使用本项目即表示您已充分理解并接受上述条款。** + +# 编译 + +1. 通过输入命令: `git clone --recursive https://github.com/hydy100/R3nzSkin.git`或者直接下载下载 [R3nzSkin](https://github.com/hydy100/R3nzSkin/archive/refs/heads/main.zip)到本地 + + - **如果你不修改这个源代码,在中国服务器上编译和使用它肯定会导致禁令。** + +2. 在Visual Studio 2019/2022中构建,配置为 "你所在的地区 x64"。 + + > 小提示: 外服原来的方法无法注入,我目前用的注入方式是`SetWindowsHookEx`,花点心思应该能实现注入,不需要说更多了,也别在问我了。 + +# 使用 + +1. 编译源代码或下载 [编译版本](https://github.com/hydy100/R3nzSkin/releases/latest)。 +2. 然后查看: [使用说明](https://hydy100.top/zh/) ,我在里面写了详细的说明。 + +# 关于这个项目 + +- 每次发布的一些说明我都写在[Releases](https://github.com/hydy100/R3nzSkin/releases/latest)的描述里。 +- **我几乎没在其他任何平台发过此项目,所以如果你转发了,请同时帮忙解决一些问题,而不是让他们都找到我,或者提供[此项目的地址](https://github.com/hydy100/R3nzSkin),让他提issues**。 +- **没有付费版或者其他版本,没有强制加群,只不过是留了个联系方式,所有的文件我都发布了**。 +- 项目目前纯公益,像原来的[R3](https://github.com/R3nzTheCodeGOD/R3nzSkin)一样。 +- 有些问题我无法很好地解决,所以如果你愿意,我欢迎任何有能力帮助解决这些问题的人。 +# 关于发布的文件 +- 关于releases里dll大小的问题,我只是加了一些防破解的壳或者压缩壳,dll已经完全开源了。 +- 关于注入器,它不是开源的,但小提示也提到了如何更新它让其可用,之前可能并没有说清楚原版不能用,但是从我根本没有提交过注入器的更新记录来看也说明了这个问题。 +- 很多开源项目的Releases和源码也都有差异,我并不希望有人拿开源的名义绑架我,让我做一些毫无意义的事情,这也违背了开源的初衷。 +- **因存在特殊风险,为了避免不必要的麻烦,后续可能会停止中国服务器版本的文件发布。** + +# 关于开源的看法(引用ChatGPT的话) +如果有人试图通过开源精神绑架你,要求你为没有开源的部分代码提供“合理性”或解释,实际上是违背了开源精神的核心价值。开源的本质是鼓励共享与合作,但这并不意味着每一行代码都必须开源。开源许可允许开发者决定是否公开代码,并且在某些情况下,有些部分的代码可能因为商业、隐私或安全等原因不适合开源。 + +以下几点可以帮助理解这一点: + +1. 开源与私有代码的平衡:开源并不要求所有代码都必须开源。许多开源项目中,核心功能或敏感部分可能是私有的,而其他部分则公开。开发者有权决定哪些部分共享,哪些部分保密。 + +2. 尊重开发者的选择:如果某个开发者选择不开源某部分代码,应该尊重其决定。这并不意味着该开发者不遵循开源精神,而是他可能有其他原因(如保护商业利益、维护安全性或避免滥用等)。 + +3. 避免“绑架”行为:开源社区的精神是基于自由、协作和尊重。如果有人以“开源精神”为名,试图强迫你交代或改变你的代码开放策略,这种行为本身就偏离了开源精神的真正意义。开源是自愿的,任何强制行为都是不应提倡的。 + +总结来说,开源精神倡导的是自由、分享和合作,但并不意味着所有代码都必须开源。每个开发者都应有权决定自己代码的开放程度。 + +# 进一步优化 + +如果您的CPU支持AVX / AVX2 / AVX-512指令集,您可以在项目设置中启用它。这应该会产生性能更高的代码,并针对您的 CPU 进行了优化。目前在项目设置中选择了SSE2指令。 + +# 制作人员 + +该程序是 [R3nzTheCodeGOD](https://github.com/R3nzTheCodeGOD)/[R3nzSkin](https://github.com/R3nzTheCodeGOD/R3nzSkin) 项目的改进和更新版本。