May 17, 2025May 17 NOTHING SPECIAL :) Kindly see attached files. Use this source: https://github.com/Spelunkern/shaiya-essentials
May 17, 2025May 17 Author CTexture.h #pragma once #include "include/shaiya/common.h" namespace shaiya { #pragma pack(push, 1) struct STexture { PAD(4); //0x00 CharArray<256> fileName; //0x04 CharArray<256> path; //0x104 LPDIRECT3DTEXTURE9 texture; //0x204 // 0x208 }; #pragma pack(pop) static_assert(sizeof(STexture) == 0x208); #pragma pack(push, 1) struct CTexture { // D3DRTYPE_TEXTURE LPDIRECT3DTEXTURE9 texture; PAD(4); D2D_SIZE_F size; // 0x10 static void CreateFromFile(CTexture* texture, const char* path, const char* fileName/*.tga*/, long w, long h); static void Render(CTexture* texture, long x, long y, float z); // to-do: name the last 4 parameters static void Render(CTexture* texture, D3DCOLOR diffuse, long x, long y, float z, long w, long h, float a, float b, float c, float d ); }; #pragma pack(pop) static_assert(sizeof(CTexture) == 0x10); } CTexture.cpp #include "include/shaiya/include/CTexture.h" using namespace shaiya; void CTexture::CreateFromFile(CTexture* texture, const char* path, const char* fileName/*.tga*/, long w, long h) { typedef void(__thiscall* LPFN)(CTexture*, const char*, const char*, long, long); (*(LPFN)0x57B560)(texture, path, fileName, w, h); } void CTexture::Render(CTexture* texture, long x, long y, float z) { typedef void(__thiscall* LPFN)(CTexture*, long, long, float); (*(LPFN)0x57B680)(texture, x, y, z); } title.cpp #include <map> #include <tuple> #include <util/util.h> #include "include/main.h" #include "include/static.h" #include "include/shaiya/include/CCharacter.h" #include "include/shaiya/include/CDataFile.h" #include "include/shaiya/include/CMonster.h" #include "include/shaiya/include/CStaticText.h" #include "include/shaiya/include/ItemInfo.h" #include "include/shaiya/include/HexColor.h" #include <set> #include <include/shaiya/include/CTexture.h> using namespace shaiya; namespace title { constexpr float chat_y_add = 2.50F; std::map<ItemId, std::tuple<const char*, HexColor>> items { { 24028, { "Champion of Teos", HexColor::Red } }, { 24029, { "Gladiator", HexColor::Green } }, { 24030, { "Protector", HexColor::Blue } }, { 24031, { "Archimage", HexColor::Yellow } }, { 24032, { "Hawk Eye", HexColor::Aqua } }, { 24033, { "Outlaw", HexColor::Fuchsia } }, { 24034, { "Healer", HexColor::Maroon } }, { 24035, { "Hardcore Player", HexColor::DarkGreen } }, { 24036, { "Duelist", HexColor::NavyBlue } }, { 24037, { "Commander", HexColor::Olive } }, { 24038, { "Captain", HexColor::Purple } }, { 24039, { "Veteran", HexColor::Silver } }, { 24040, { "War Chief", HexColor::Gray } }, { 24041, { "Adventurer", HexColor::DarkPurple } }, { 24042, { "Queen", HexColor::DarkBlueGray } }, { 24043, { "King", HexColor::Teal } }, { 24044, { "Baron", HexColor::Maroon } }, { 24045, { "Baroness", HexColor::DarkGreen } }, { 24046, { "Mystic", HexColor::NavyBlue } }, { 24047, { "King of Arena", HexColor::Orange } }, { 24048, { "Elemental Master", HexColor::Purple } }, { 24049, { "Witch", HexColor::Teal } }, { 24050, { "Paladin", HexColor::MediumSpringGreen } }, { 24051, { "Shaman", HexColor::GoldenRod } }, { 24052, { "Druid", HexColor::FireBrick } }, { 24053, { "Death Knight", HexColor::GreenYellow } }, { 24054, { "High Priestess", HexColor::Chartreuse } }, { 24055, { "Interloper", HexColor::Crimson } }, { 24056, { "Crazy Cat Lady", HexColor::HotPink } }, { 24057, { "Mercenary", HexColor::Salmon } }, { 24058, { "Salty", HexColor::BlueViolet } }, { 24059, { "MVP", HexColor::CadetBlue } }, { 24060, { "Old School", HexColor::PowderBlue } }, { 24061, { "Cryptic", HexColor::FireBrick } }, { 24062, { "Chill Player", HexColor::SaddleBrown } }, { 24063, { "Farmer", HexColor::AntiqueWhite } }, { 24064, { "Enigmatic", HexColor::LawnGreen } }, { 24065, { "Rich", HexColor::Gold } }, { 24066, { "Fairy", HexColor::Orchid } }, { 24067, { "Survivor", HexColor::SpringGreen } }, { 24068, { "Untouchable", HexColor::SteelBlue } }, { 24069, { "Maniac", HexColor::LimeGreen } }, { 24104, { "Love Fool", HexColor::DeepPink } }, { 24105, { "Archivist", HexColor::LightSlateBlue } }, { 24106, { "Hero", HexColor::Turquoise } }, { 24107, { "Mad Scientist", HexColor::DodgerBlue } }, { 24108, { "Artisan", HexColor::MediumSlateBlue } }, { 24109, { "Staff Member", HexColor::DarkMagenta } }, { 24110, { "Game Master", HexColor::DarkGoldenRod } }, { 24114, { "Content Creator", HexColor::RosyBrown } } }; CTexture* sample = new CTexture{}; CTexture* sample2 = new CTexture{}; void InitiateTitles() { sample->texture = (LPDIRECT3DTEXTURE9)0x0; memset(sample->pad24, 0, sizeof(sample->pad24)); sample->size.width = 0.0f; sample->size.height = 0.0f; sample2->texture = (LPDIRECT3DTEXTURE9)0x0; memset(sample2->pad24, 0, sizeof(sample2->pad24)); sample2->size.width = 0.0f; sample2->size.height = 0.0f; } void hook(CCharacter* user, float x, float y, float extrusion) { /*if (!user->mantleType || !user->mantleTypeId) return; auto itemInfo = CDataFile::GetItemInfo(user->mantleType, user->mantleTypeId); if (!itemInfo) return; auto itemId = (itemInfo->type * 1000) + itemInfo->typeId; auto it = items.find(itemId); if (it == items.end()) return; auto text = std::get<0>(it->second); auto color = std::to_underlying(std::get<1>(it->second));*/ CTexture::CreateFromFile(sample, "data/interface/title", "sample.tga", 220, 64); CTexture::CreateFromFile(sample2, "data/interface/title", "sample2.tga", 220, 64); auto text = "SAMPLE TITLE"; auto color = std::to_underlying(HexColor::Gold); if (!user->title.text) { user->title.text = CStaticText::Create(text); auto w = CStaticText::GetTextWidth(text); user->title.pointX = int(w * 0.5); } if (!user->title.text) return; auto posY = y - 80.0; auto posX = x - user->title.pointX; if (!user->isAdmin) { CTexture::Render(sample, long(posX - 50), long(posY), float(0.10F)); } else { CTexture::Render(sample2, long(posX - 50), long(posY), float(0.10F)); } } void reset(CCharacter* user) { if (!user->title.text) return; user->title.text->texture->Release(); user->title.text = nullptr; } } unsigned u0x453E81 = 0x453E81; void __declspec(naked) naked_0x453E7C() { __asm { pushad pushfd sub esp,0xC fld dword ptr[esp+0x4C] fstp dword ptr[esp+0x8] fld dword ptr[esp+0x48] fstp dword ptr[esp+0x4] fld dword ptr[esp+0x44] fstp dword ptr[esp] push esi // user call title::hook add esp,0x10 popfd popad // original mov eax,dword ptr ds:[0x22B69A8] jmp u0x453E81 } } unsigned n0x4184CF = 0x4184CF; unsigned u0x418312 = 0x418312; void __declspec(naked) naked_0x41830D() { __asm { // monster->model cmp dword ptr[eax+0x74],0x0 je _0x4184CF // original cmp dword ptr[esp+0x38],0x0 jmp u0x418312 _0x4184CF: jmp n0x4184CF } } unsigned u0x412765 = 0x412765; void __declspec(naked) naked_0x41275F() { __asm { fld dword ptr[title::chat_y_add] jmp u0x412765 } } unsigned u0x59F0C8 = 0x59F0C8; void __declspec(naked) naked_0x59F0C3() { __asm { pushad push esi call title::reset add esp,0x4 popad // original cmp byte ptr[esp+0x14],0x0 jmp u0x59F0C8 } } void hook::title() { util::detour((void*)0x453E7C, naked_0x453E7C, 5); // hide pets without a model util::detour((void*)0x41830D, naked_0x41830D, 5); // increase chat balloon height (1.5 to 1.75) util::detour((void*)0x41275F, naked_0x41275F, 6); // 0x507 packet method util::detour((void*)0x59F0C3, naked_0x59F0C3, 5); //initiate titles CreateThread(NULL, NULL, LPTHREAD_START_ROUTINE(title::InitiateTitles), NULL, 0, 0); }
June 11, 2025Jun 11 Not like this cause placeholder .tga find real path and file and boom but breaks titles
NOTHING SPECIAL :)
Kindly see attached files.
Use this source: https://github.com/Spelunkern/shaiya-essentials