Jump to content
View in the app

A better way to browse. Learn more.

Shaiya.gg

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

  • 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);
}

  • 3 weeks later...
Not like this cause placeholder .tga find real path and file and boom but breaks titles

Create an account or sign in to comment

Account

Navigation

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.