diff --git a/Horion.vcxproj b/Horion.vcxproj index 72621c361..4a4025a32 100644 --- a/Horion.vcxproj +++ b/Horion.vcxproj @@ -361,6 +361,7 @@ + @@ -548,6 +549,7 @@ + diff --git a/Horion/Command/Commands/EnchantCommand.cpp b/Horion/Command/Commands/EnchantCommand.cpp index dc0372ef2..2af59c412 100644 --- a/Horion/Command/Commands/EnchantCommand.cpp +++ b/Horion/Command/Commands/EnchantCommand.cpp @@ -81,13 +81,16 @@ bool EnchantCommand::execute(std::vector* args) { C_InventoryAction* firstAction = nullptr; C_InventoryAction* secondAction = nullptr; + ItemDescriptor* desc = nullptr; + desc = new ItemDescriptor((*item->item)->itemId, 0); + if (isAuto) { { - firstAction = new C_InventoryAction(supplies->selectedHotbarSlot, item, nullptr); + firstAction = new C_InventoryAction(supplies->selectedHotbarSlot, desc, nullptr, item, nullptr, item->count); if (strcmp(g_Data.getRakNetInstance()->serverIp.getText(), "mco.mineplex.com") == 0) - secondAction = new C_InventoryAction(0, nullptr, item, 32766, 100); + secondAction = new C_InventoryAction(0, nullptr, desc, nullptr, item, item->count, 32766, 100); else - secondAction = new C_InventoryAction(0, nullptr, item, 507, 99999); + secondAction = new C_InventoryAction(0, nullptr, desc, nullptr, item, item->count, 507, 99999); manager->addInventoryAction(*firstAction); manager->addInventoryAction(*secondAction); delete firstAction; @@ -159,10 +162,10 @@ bool EnchantCommand::execute(std::vector* args) { if (isAuto) { if (strcmp(g_Data.getRakNetInstance()->serverIp.getText(), "mco.mineplex.com") == 0) - firstAction = new C_InventoryAction(0, item, nullptr, 32766, 100); + firstAction = new C_InventoryAction(0, desc, nullptr, item, nullptr, item->count, 32766, 100); else - firstAction = new C_InventoryAction(0, item, nullptr, 507, 99999); - secondAction = new C_InventoryAction(supplies->selectedHotbarSlot, nullptr, item); + firstAction = new C_InventoryAction(0, desc, nullptr, item, nullptr, item->count, 507, 99999); + secondAction = new C_InventoryAction(supplies->selectedHotbarSlot, nullptr, desc, nullptr, item, item->count); manager->addInventoryAction(*firstAction); manager->addInventoryAction(*secondAction); delete firstAction; diff --git a/Horion/DrawUtils.cpp b/Horion/DrawUtils.cpp index e30e52283..3bcfbc643 100644 --- a/Horion/DrawUtils.cpp +++ b/Horion/DrawUtils.cpp @@ -372,13 +372,16 @@ void DrawUtils::drawNameTags(C_Entity* ent, float textSize, bool drawHealth, boo rectPos.w = textPos.y + textHeight + 2.f * textSize; vec4_t subRectPos = rectPos; subRectPos.y = subRectPos.w - 1.f * textSize; - fillRectangle(rectPos, MC_Color(13, 29, 48), 0.8f); - fillRectangle(subRectPos, MC_Color(28, 107, 201), 0.9f); + static auto nametagsMod = moduleMgr->getModule(); + fillRectangle(rectPos, MC_Color(13, 29, 48), nametagsMod->opacity); + if (nametagsMod->underline) { + fillRectangle(subRectPos, MC_Color(30, 110, 20), 0.9f); + } drawText(textPos, &text, MC_Color(255, 255, 255), textSize); static auto nameTagsMod = moduleMgr->getModule(); - if (ent->getEntityTypeId() == 63 && nameTagsMod->displayArmor) { // is player, show armor + if (ent->getEntityTypeId() == 319 && nameTagsMod->displayArmor) { // is player, show armor auto* player = reinterpret_cast(ent); float scale = textSize * 0.6f; float spacing = scale + 15.f; @@ -399,7 +402,6 @@ void DrawUtils::drawNameTags(C_Entity* ent, float textSize, bool drawHealth, boo DrawUtils::drawItem(stack, vec2_t(rectPos.z - 1.f - 15.f * scale, y), 1.f, scale, stack->isEnchanted()); } } - } } } diff --git a/Horion/Module/ModuleManager.cpp b/Horion/Module/ModuleManager.cpp index 58f328230..4f1078579 100644 --- a/Horion/Module/ModuleManager.cpp +++ b/Horion/Module/ModuleManager.cpp @@ -101,6 +101,7 @@ void ModuleManager::initModules() { this->moduleList.push_back(std::shared_ptr(new Compass())); this->moduleList.push_back(std::shared_ptr(new Radar())); this->moduleList.push_back(std::shared_ptr(new VanillaPlus())); + this->moduleList.push_back(std::shared_ptr(new ViewModel())); this->moduleList.push_back(std::shared_ptr(new Twerk())); this->moduleList.push_back(std::shared_ptr(new FollowPathModule())); diff --git a/Horion/Module/ModuleManager.h b/Horion/Module/ModuleManager.h index a4e6af27a..7e149148d 100644 --- a/Horion/Module/ModuleManager.h +++ b/Horion/Module/ModuleManager.h @@ -94,6 +94,7 @@ #include "Modules/Compass.h" #include "Modules/Radar.h" #include "Modules/VanillaPlus.h" +#include "Modules/ViewModel.h" #include "Modules/Twerk.h" #ifdef _DEBUG diff --git a/Horion/Module/Modules/NameTags.cpp b/Horion/Module/Modules/NameTags.cpp index 43cd7e734..294e33097 100644 --- a/Horion/Module/Modules/NameTags.cpp +++ b/Horion/Module/Modules/NameTags.cpp @@ -3,8 +3,10 @@ #include "../../../Utils/Target.h" #include "../ModuleManager.h" -NameTags::NameTags() : IModule(0, Category::VISUAL, "Shows better nametags above players that can be seen from a lot more far aways") { - this->registerBoolSetting("Display Armor", &this->displayArmor, this->displayArmor); +NameTags::NameTags() : IModule(0, Category::VISUAL, "Shows betterar aways") { + this->registerBoolSetting("Underline", &this->underline, this->underline); + this->registerBoolSetting("Armor", &this->displayArmor, this->displayArmor); + this->registerFloatSetting("Opacity", &this->opacity, this->opacity, 0.f, 1.f); } NameTags::~NameTags() { @@ -14,7 +16,7 @@ const char* NameTags::getModuleName() { return ("NameTags"); } -void drawNameTags(C_Entity* ent, bool isRegularEntitie) { +void drawNameTags(C_Entity* ent, bool) { C_LocalPlayer* localPlayer = g_Data.getLocalPlayer(); static auto nameTagsMod = moduleMgr->getModule(); @@ -29,26 +31,27 @@ void drawNameTags(C_Entity* ent, bool isRegularEntitie) { DrawUtils::drawNameTags(ent, fmax(0.6f, 3.f / dist)); DrawUtils::flush(); } - } } void NameTags::onPreRender(C_MinecraftUIRenderContext* renderCtx) { C_LocalPlayer* localPlayer = g_Data.getLocalPlayer(); + if (localPlayer == nullptr || !GameData::canUseMoveKeys()) return; - if (nameTags.size() > 100) - nameTags.clear(); - - if (localPlayer != nullptr && GameData::canUseMoveKeys()) { - std::vector temp; - for (int i = 0; i < g_Data.getEntityList()->getListSize(); i++) - temp.push_back(g_Data.getEntityList()->get(i)); - std::sort(temp.begin(), temp.end(), [localPlayer](const C_Entity* lhs, const C_Entity* rhs) { - return localPlayer->getPos()->dist(*lhs->getPos()) > localPlayer->getPos()->dist(*rhs->getPos()); - }); - for (C_Entity* ent : temp) - drawNameTags(ent, true); - } else { - nameTags.clear(); - } + if (ingameNametagSetting) + if (!gotPrevSetting) { + lastSetting = *ingameNametagSetting; + gotPrevSetting = true; + *ingameNametagSetting = false; + } else + *ingameNametagSetting = false; //disable other ppl's nametags + + g_Data.forEachEntity(drawNameTags); } + +void NameTags::onDisable() { + if (ingameNametagSetting && gotPrevSetting) { + *ingameNametagSetting = lastSetting; + gotPrevSetting = false; + } +} \ No newline at end of file diff --git a/Horion/Module/Modules/NameTags.h b/Horion/Module/Modules/NameTags.h index f06a9dd2b..979d6a221 100644 --- a/Horion/Module/Modules/NameTags.h +++ b/Horion/Module/Modules/NameTags.h @@ -6,10 +6,17 @@ class NameTags : public IModule { public: std::set nameTags; bool displayArmor = true; + bool underline = true; + float opacity = 0.2f; NameTags(); ~NameTags(); + bool* ingameNametagSetting = nullptr; + bool lastSetting = true; + bool gotPrevSetting = false; + // Inherited via IModule virtual const char* getModuleName() override; virtual void onPreRender(C_MinecraftUIRenderContext* renderCtx) override; + virtual void onDisable() override; }; diff --git a/Horion/Module/Modules/ViewModel.cpp b/Horion/Module/Modules/ViewModel.cpp new file mode 100644 index 000000000..a76d5c5f6 --- /dev/null +++ b/Horion/Module/Modules/ViewModel.cpp @@ -0,0 +1,40 @@ +#include "ViewModel.h" + + +ViewModel::ViewModel() : IModule(0, Category::VISUAL, "Custom item view model") { + this->registerBoolSetting("Reset", &this->Reset, this->Reset); + this->registerBoolSetting("Translate", &this->doTranslate, this->doTranslate); + this->registerBoolSetting("Scale", &this->doScale, this->doScale); + + this->registerFloatSetting("TranslateX", &this->xTrans, 0.f, -2.f, 2.f); + this->registerFloatSetting("TranslateY", &this->yTrans, 0.f, -2.f, 2.f); + this->registerFloatSetting("TranslateZ", &this->zTrans, 0.f, -2.f, 2.f); + + this->registerFloatSetting("ScaleX", &this->xMod, 1.f, 0.f, 2.f); + this->registerFloatSetting("ScaleY", &this->yMod, 1.f, 0.f, 2.f); + this->registerFloatSetting("ScaleZ", &this->zMod, 1.f, 0.f, 2.f); +} + +ViewModel::~ViewModel() { +} + +const char* ViewModel::getModuleName() { + return "ViewModel"; +} + +void ViewModel::onTick(C_GameMode* gm) { + if (g_Data.getLocalPlayer() == nullptr) + return; + + if (Reset) { + xTrans = 0.f; + yTrans = 0.f; + zTrans = 0.f; + + xMod = 1.f; + yMod = 1.f; + zMod = 1.f; + Reset = false; + } +} + diff --git a/Horion/Module/Modules/ViewModel.h b/Horion/Module/Modules/ViewModel.h new file mode 100644 index 000000000..b8b107b7a --- /dev/null +++ b/Horion/Module/Modules/ViewModel.h @@ -0,0 +1,27 @@ +#pragma once +#include "Module.h" +class ViewModel : public IModule { +private: + int delay = 0; + +public: + bool Reset = false; + bool doTranslate = true; + bool doScale = true; + + float float1 = 0; + float xMod = 1.f; + float yMod = 1.f; + float zMod = 1.f; + + float xTrans = 0.f; + float yTrans = 0.f; + float zTrans = 0.f; + + ViewModel(); + ~ViewModel(); + + // Inherited via IModule + virtual const char* getModuleName() override; + virtual void onTick(C_GameMode* gm) override; +}; diff --git a/Horion/Module/Modules/Xray.cpp b/Horion/Module/Modules/Xray.cpp index 199e2f9fb..d3e947834 100644 --- a/Horion/Module/Modules/Xray.cpp +++ b/Horion/Module/Modules/Xray.cpp @@ -1,11 +1,28 @@ #include "Xray.h" -Xray::Xray() : IModule(VK_NUMPAD6, Category::VISUAL, "X-Ray view!") { +Xray::Xray() : IModule(0, Category::VISUAL, "Allows you to see certain blocks easier") { } Xray::~Xray() { } const char* Xray::getModuleName() { - return ("X-Ray"); + return ("Xray"); } + +void Xray::onTick(C_GameMode* gm) { + if (smoothLightningSetting != nullptr) { + if (!gotSmoothInfo) { + gotSmoothInfo = true; + wasSmooth = *smoothLightningSetting; + } + *smoothLightningSetting = 0; + } +} + +void Xray::onDisable() { + if (smoothLightningSetting != nullptr && gotSmoothInfo) { + *smoothLightningSetting = wasSmooth; + } + gotSmoothInfo = false; +} \ No newline at end of file diff --git a/Horion/Module/Modules/Xray.h b/Horion/Module/Modules/Xray.h index ea8b8139d..3bbe14f64 100644 --- a/Horion/Module/Modules/Xray.h +++ b/Horion/Module/Modules/Xray.h @@ -2,9 +2,15 @@ #include "Module.h" class Xray : public IModule { public: + bool* smoothLightningSetting = nullptr; + bool gotSmoothInfo = false; + bool wasSmooth = false; + Xray(); ~Xray(); // Inherited via IModule virtual const char* getModuleName() override; + virtual void onTick(C_GameMode* gm) override; + virtual void onDisable() override; }; diff --git a/Memory/Hooks.cpp b/Memory/Hooks.cpp index 75ab0bf6a..180beb6f4 100644 --- a/Memory/Hooks.cpp +++ b/Memory/Hooks.cpp @@ -36,17 +36,16 @@ void Hooks::Init() { g_Hooks.GameMode_attackHook = std::make_unique(gameModeVtable[14], Hooks::GameMode_attack); } } - + // BlockLegacy::vtable { intptr_t sigOffset = FindSignature("48 8D 05 ? ? ? ? 48 89 01 4C 8B 72 ? 48 B9"); // BlockLegacy constructor int offset = *reinterpret_cast(sigOffset + 3); - uintptr_t** blockLegacyVtable = reinterpret_cast(sigOffset + offset + 7); + uintptr_t** blockLegacyVtable = reinterpret_cast(sigOffset + offset + 7); if (blockLegacyVtable == 0x0 || sigOffset == 0x0) logF("C_BlockLegacy signature not working!!!"); else { g_Hooks.BlockLegacy_getRenderLayerHook = std::make_unique(blockLegacyVtable[180], Hooks::BlockLegacy_getRenderLayer); - g_Hooks.BlockLegacy_getLightEmissionHook = std::make_unique(blockLegacyVtable[183], Hooks::BlockLegacy_getLightEmission); } } @@ -221,7 +220,7 @@ void Hooks::Init() { uintptr_t** packetSenderVtable = reinterpret_cast(*(uintptr_t*)g_Data.getClientInstance()->loopbackPacketSender); g_Hooks.LoopbackPacketSender_sendToServerHook = std::make_unique(packetSenderVtable[2], Hooks::LoopbackPacketSender_sendToServer); - void* getFov = reinterpret_cast(FindSignature("40 53 48 83 EC 70 0F 29 7C 24 ? 44 0F 29 4C 24 ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 44 24 ? F3 0F 10 3D ? ? ? ? 44 0F")); + void* getFov = reinterpret_cast(FindSignature("40 53 48 83 EC ?? 0F 29 7C 24 ?? 44")); g_Hooks.LevelRendererPlayer_getFovHook = std::make_unique(getFov, Hooks::LevelRendererPlayer_getFov); void* tick_entityList = reinterpret_cast(FindSignature("48 89 ?? ?? ?? 57 48 83 EC ?? 48 8B ?? E8 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 48 8B D8 ?? ?? ?? ?? ?? ?? 48 99")); @@ -239,7 +238,7 @@ void Hooks::Init() { void* chestScreenControllerTick = reinterpret_cast(FindSignature("48 89 5C 24 08 57 48 83 EC 20 48 8B F9 E8 ?? ?? ?? ?? 48 8B 17 48 8B CF 8B D8 FF 92 ?? ?? ?? ?? 84 C0 74 31")); g_Hooks.ChestScreenController_tickHook = std::make_unique(chestScreenControllerTick, Hooks::ChestScreenController_tick); - void* fullbright = reinterpret_cast(FindSignature("48 83 EC ? 80 B9 ? ? ? ? ? 48 8D 54 24 ? 74 ? 41 B8 ? ? ? ? E8 ? ? ? ? 48 8B 10 48 85 D2 74 ? 48 8B 42 ? 48 8B 88 ? ? ? ? 48 85 C9 74 ? E8 ? ? ? ? 48 83 C4 ? C3 F3 0F 10 42")); + void* fullbright = reinterpret_cast(FindSignature("48 83 EC ?? 80 B9 ?? ?? ?? ?? ?? 48 8D 54 24 ?? 48 8B 01 74 35 41 B8 0D 01 00 00")); g_Hooks.GetGammaHook = std::make_unique(fullbright, Hooks::GetGamma); // Mob::_jumpFromGround @@ -288,25 +287,34 @@ void Hooks::Init() { static auto bobViewHookF = [](__int64 _this, glm::mat4& matrix, float lerpT){ static auto origFunc = g_Hooks.lambdaHooks.at(lambda_counter)->GetFastcall(); - - /*auto p = g_Data.getLocalPlayer(); + + static auto testMod = moduleMgr->getModule(); + auto p = g_Data.getLocalPlayer(); float degrees = fmodf(p->getPosOld()->lerp(p->getPos(), lerpT).x, 5) - 2.5f; degrees *= 180 / 2.5f; auto pos = g_Data.getClientInstance()->levelRenderer->origin; - + glm::mat4 View = matrix; - + matrix = View; - //matrix = glm::rotate(matrix, glm::radians(degrees), glm::vec3(0, 0, 1));*/ + if (testMod->isEnabled()) { + if (testMod->doTranslate) + matrix = glm::translate(matrix, glm::vec3(testMod->xTrans, testMod->yTrans, testMod->zTrans)); + + if (testMod->doScale) + matrix = glm::scale(matrix, glm::vec3(testMod->xMod, testMod->yMod, testMod->zMod)); + } return origFunc(_this, matrix, lerpT); }; - + std::shared_ptr bobViewHook = std::make_shared(levelRendererBobView, (decltype(&bobViewHookF.operator()))bobViewHookF); g_Hooks.lambdaHooks.push_back(bobViewHook); #undef lambda_counter + + logF("Hooks initialized"); } @@ -1145,9 +1153,9 @@ void Hooks::LoopbackPacketSender_sendToServer(C_LoopbackPacketSender* a, C_Packe float Hooks::LevelRendererPlayer_getFov(__int64 _this, float a2, bool a3) { static auto oGetFov = g_Hooks.LevelRendererPlayer_getFovHook->GetFastcall(); - static void* renderItemInHand = reinterpret_cast(FindSignature("0F 28 C8 F3 0F 59 0D ?? ?? ?? ?? 41 0F 28 F9")); + static void* renderItemInHand = reinterpret_cast(FindSignature("F3 0F 59 05 ?? ?? ?? ?? 45 0F 28 C2 F3")); - static void* setupCamera = reinterpret_cast(FindSignature("44 0F 28 D8 F3 44 0F 59 1D ?? ?? ?? ?? 0F")); + static void* setupCamera = reinterpret_cast(FindSignature("0F 28 F8 F3 0F 59 3D ?? ?? ?? ?? F3 0F 11 7C 24 24 F3 0F 10 87")); static auto zoomModule = moduleMgr->getModule(); @@ -1238,9 +1246,17 @@ int Hooks::BlockLegacy_getRenderLayer(C_BlockLegacy* a1) { if (strcmp(text, "lava") != NULL) if (strcmp(text, "water") != NULL) if (strcmp(text, "portal") != NULL) - if (strcmp(text, "ancient_debris") != NULL) - if (strcmp(text, "command_block") != NULL) - return 10; + if (strcmp(text, "amethyst_block") != NULL) + if (strcmp(text, "ancient_debris") != NULL) + if (strcmp(text, "command_block") != NULL) + if (strcmp(text, "repeating_command_block") != NULL) + if (strcmp(text, "chain_command_block") != NULL) + if (strcmp(text, "structure_block") != NULL) + if (strcmp(text, "deny") != NULL) + if (strcmp(text, "allow") != NULL) + if (strcmp(text, "bedrock") != NULL) + if (strcmp(text, "border_block") != NULL) + return 10; } return oFunc(a1); } @@ -1339,13 +1355,45 @@ __int64 Hooks::ChestScreenController_tick(C_ChestScreenController* a1) { } float Hooks::GetGamma(uintptr_t* a1) { - static auto fullBrightModule = moduleMgr->getModule(); - if (fullBrightModule->isEnabled()) - return fullBrightModule->intensity; + static auto fullbright = moduleMgr->getModule(); + static auto xrayMod = moduleMgr->getModule(); + static auto nametagmod = moduleMgr->getModule(); + + uintptr_t** list = (uintptr_t**)a1; + + char obtainedSettings = 0; + bool hadIt = false; + for (uint16_t i = 3; i < 450; i++) { + if (list[i] == nullptr) continue; + uintptr_t* info = *(uintptr_t**)((uintptr_t)list[i] + 8); + if (info == nullptr) continue; + + TextHolder* translateName = (TextHolder*)((uintptr_t)info + 0x1D8); + TextHolder* settingname = (TextHolder*)((uintptr_t)info + 0x188); + + if (!strcmp(translateName->getText(), "options.smoothlighting")) { + if (hadIt) continue; + bool* smoothlightning = (bool*)((uintptr_t)list[i] + 16); + xrayMod->smoothLightningSetting = smoothlightning; + obtainedSettings++; + hadIt = true; + } else if (!strcmp(settingname->getText(), "gfx_ingame_player_names")) { + bool* ingamePlayerName = (bool*)((uintptr_t)list[i] + 16); + nametagmod->ingameNametagSetting = ingamePlayerName; + obtainedSettings++; + } + + if (obtainedSettings == 2) break; + } + + if (xrayMod->isEnabled()) + return 25.f; + + if (fullbright->isEnabled()) + return fullbright->intensity; - //Get the normal gamma value - float* gamer = (float*)*(a1 + 0x27); - return *(gamer + 0x7A); + static auto ofunc = g_Hooks.GetGammaHook->GetFastcall(); + return ofunc(a1); } bool Hooks::Actor_isInWater(C_Entity* _this) { diff --git a/SDK/CBlockLegacy.h b/SDK/CBlockLegacy.h index 762290721..0c76fada7 100644 --- a/SDK/CBlockLegacy.h +++ b/SDK/CBlockLegacy.h @@ -40,10 +40,11 @@ class C_BlockLegacy { public: class C_Material* material; //0x00D8 private: - char pad_00E0[104]; //0x00E0 + char pad_00E0[108]; //0x00E0 public: - int64_t blockId; //0x0148 + short blockId; //0x014C + int liquidGetDepth(C_BlockSource*, const vec3_ti* pos); void liquidGetFlow(vec3_t* flowOut, C_BlockSource*, const vec3_ti* pos); bool getCollisionShape(AABB* collShapeOut, C_Block* block, C_BlockSource* blockSource, const vec3_ti* pos, C_Entity* actor); bool hasWater(C_BlockSource*, const vec3_ti& pos); diff --git a/SDK/CItem.cpp b/SDK/CItem.cpp index b93249444..c744f5be7 100644 --- a/SDK/CItem.cpp +++ b/SDK/CItem.cpp @@ -47,12 +47,12 @@ void C_ItemStack::fromTag(const Tag &tag) { } void C_ItemStack::save(CompoundTag **tag) { using ItemStackBase__saveF = void(__fastcall *)(C_ItemStack *, CompoundTag **); - ItemStackBase__saveF save = reinterpret_cast(FindSignature("48 89 5C 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B FA 48 8B F1 48 89 55 F7 45 33 ED")); + ItemStackBase__saveF save = reinterpret_cast(FindSignature("48 89 5C 24 ?? 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ?? 48 81 EC 90 ?? ?? ?? 48 8B F2 48 8B F9 48 89 55 17 4C 8B 79")); return save(this, tag); } void C_ItemStack::setUserData(std::unique_ptr tag) { using setUserData_t = void(__fastcall *)(C_ItemStack *, std::unique_ptr); - setUserData_t setUserData = reinterpret_cast(FindSignature("40 53 48 83 EC ? 48 8B DA 48 8D 51 10 48 3B D3 74 1F 48 8B 03 48 C7 03 ? ? ? ?")); + setUserData_t setUserData = reinterpret_cast(FindSignature("40 53 48 83 EC ? 48 8B DA 48 8D 51 20 48 3B D3 74 1F 48 8B 03 48 C7 03 ? ? ? ?")); setUserData(this, std::move(tag)); } void C_ItemStack::reinit(C_BlockLegacy &legacy, int count) {