MakePreviewCharSet~~Клиент

Автор DarkSim, 2013 Фев. 25, 10:51

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

DarkSim

В общем вот мой старый метод добавления новых крыльев в вижуал порт, особо объяснять, что-то смысла не вижу, ибо кому это нужно тот уже знает как заставить это работать =D

С помощью всего этого можно добавить новые крылья, исправить баги протоколов, заставить животных бегать, даже если они не одеты, переодеть эльфа как на показе моды и т.д.

Структура моя не оригинальная, просто эмулированный кусок с гапами, но использовать можно довольно широко, всем кто хочет трахать клиент советую эту структуру как родную принимать, она будет нужна и для добавления новых мобов и для работы с эффектами, в общем почти для всего визуального (можно кстати получить адрес цели и забить свой хп бар нормальный и не только)

MakePreviewCharSet.h
Спойлер
#pragma once
//---------------------------------------------------------------------------

namespace ASM
{
enum T
{
JMP = 0xE9,
JE = 0x74,
JNE  = 0x75,
JGE  = 0x7D,
NOP = 0x90,
CALL = 0xE8,
};
};
//---------------------------------------------------------------------------

enum eItemOption
{
Damage = 80, //-> Additional Damage +<N>
WizardryDamage = 81,
CurseSpell = 82,
Defense = 84, //-> Additional Defense +<N>
Luck = 85, //-> Default: 0
HPRecovery = 86,
IncreaseDamage = 95, //-> Increase Damage +<N>%
IncreaseSpeed = 98, //-> Increase Attacking(Wizardry)speed +<N>
IgnorOpDefense = 103,
ReturnAttack = 106, //-> Return's the enemy's attack power in <N>%
CompleteLife = 107, //-> Complete recovery of life in <N>% rate
CompleteMana = 108, //-> Complete recovery of Mana in <N>% rate
};
//---------------------------------------------------------------------------

enum ObjClass // -> Complete -> Season 5.2 JPN
{
DarkWizard = 0,
SoulMaster = 8,
GrandMaster = 24,
// ----
DarkKnight = 1,
BladeKnight = 9,
BladeMaster = 25,
// ----
Elf = 2,
MuseElf = 10,
HightElf = 26,
// ----
MagicGladiator = 3,
DuelMaster = 19,
// ----
DarkLord = 4,
LordEmperor = 20,
// ----
Summoner = 5,
BloodySummoner = 13,
DimensionMaster = 29,
};
//---------------------------------------------------------------------------

enum eEffectState
{
AtDarkHorse = 1,
AtFenrir = 4,
AtGameMaster = 5,
};
//---------------------------------------------------------------------------

enum ObjState // -> Complete
{
SelectServer = 2,
SwitchCharacter = 4,
GameProcess = 5,
};
//---------------------------------------------------------------------------

enum eMauntType
{
#if CLIENT_VERSION == 0
DarkHorse = 226,
#else
DarkHorse = 225,
#endif
Uniria = 233,
Dinorant = 323,
BlackFenrir = 384,
RedFenrir = 385,
BlueFenrir = 386,
GoldenFenrir = 387,
};
//---------------------------------------------------------------------------

#define pVisible(x) *(BYTE*)(x + 15)
#define pPlayerClass(x) *(BYTE*)(x + 19)
#define pAncientEffect(x) *(BYTE*)(x + 22)
#define pAtEffect(x) *(BYTE*)(x + 23)
#define pHelmSlot(x) *(WORD*)(x + 232)
#define pHelmSetLevel(x) *(BYTE*)(x + 234)
#define pHelmSetExcellent(x) *(BYTE*)(x + 235)
#define pHelmSetAncient(x) *(BYTE*)(x + 236)
#define pArmorSlot(x) *(WORD*)(x + 264)
#define pArmorSetLevel(x) *(BYTE*)(x + 266)
#define pArmorSetExcellent(x) *(BYTE*)(x + 267)
#define pArmorSetAncient(x) *(BYTE*)(x + 268)
#define pPantsSlot(x) *(WORD*)(x + 296)
#define pPantsSetLevel(x) *(BYTE*)(x + 298)
#define pPantsSetExcellent(x) *(BYTE*)(x + 299)
#define pPantsSetAncient(x) *(BYTE*)(x + 300)
#define pGlovesSlot(x) *(WORD*)(x + 328)
#define pGlovesSetLevel(x) *(BYTE*)(x + 330)
#define pGlovesSetExcellent(x) *(BYTE*)(x + 331)
#define pGlovesSetAncient(x) *(BYTE*)(x + 332)
#define pBootsSlot(x) *(WORD*)(x + 360)
#define pBootsSetLevel(x) *(BYTE*)(x + 362)
#define pBootsSetExcellent(x) *(BYTE*)(x + 363)
#define pBootsSetAncient(x) *(BYTE*)(x + 364)
#define pWeaponFirstSlot(x) *(WORD*)(x + 392)
#define pWeaponFirstSetLevel(x) *(BYTE*)(x + 394)
#define pWeaponFirstSetExcellent(x) *(BYTE*)(x + 395)
#define pWeaponFirstSetAncient(x) *(BYTE*)(x + 396)
#define pWeaponSecondSlot(x) *(WORD*)(x + 424)
#define pWeaponSecondSetLevel(x) *(BYTE*)(x + 426)
#define pWeaponSecondSetExcellent(x) *(BYTE*)(x + 427)
#define pWeaponSecondSetAncient(x) *(BYTE*)(x + 428)
#define pWingsSlot(x) *(WORD*)(x + 456)
#define pSetUnknown1(x) *(BYTE*)(x + 458)
#define pSetUnknown2(x) *(BYTE*)(x + 459)
#define pSetUnknown3(x) *(BYTE*)(x + 460)
#define pPetSlot(x) *(WORD*)(x + 488)
#define pSetUnknown4(x) *(BYTE*)(x + 490)
#define pFenrirCharSet(x) *(BYTE*)(x + 491)
#define pExpectPet(x) *(BYTE*)(x + 492)
#define pObjAction(x) *(BYTE*)(x + 718)
#define pObjScale(x) *(DWORD*)(x + 796)
#define pObjSelectZone(x) *(float*)(x + 924)
#define pGetPosition(x) *(WORD*)(x + 952)
//---------------------------------------------------------------------------

struct Preview
{
BYTE Shift1[14];

/*4*/ //BYTE Unknown4; // -> 100%
/*8*/ //DWORD Unknown8; // -> 100%

/*14*/ BYTE IsSafeZone;
/*15*/ BYTE Visible;
/*16*/ BYTE Unknown16;
/*17*/ BYTE IsLiveObject;
/*18*/ BYTE Unknown18;
/*19*/ BYTE Class;
/*20*/ BYTE Unknown20;
/*21*/ BYTE CtrlCode;
/*22*/ BYTE AncientEffect;
/*23*/ BYTE PetStatus;
/*24*/ BYTE Unknown24;
/*25*/ BYTE Unknown25;
/*26*/ BYTE Unknown26;
/*27*/ BYTE Unknown27;
/*28*/ BYTE Unknown28;
/*29*/ BYTE Unknown29;
/*30*/ BYTE Unknown30;
/*31*/ BYTE Unknown31;
/*32*/ BYTE PKLevel;
/*33*/ BYTE Unknown33;
/*34*/ BYTE Unknown34;
/*35*/ BYTE Unknown35;
/*36*/ BYTE Unknown36;
/*37*/ BYTE Unknown37;
/*38*/ WORD Unknown38;
/*40*/ BYTE Unknown40;
/*41*/ BYTE Unknown41;
/*42*/ BYTE Unknown42;
/*43*/ BYTE Unknown43;
/*44*/ BYTE Unknown44;
/*45*/ BYTE MapPosX;
/*46*/ BYTE MapPosY;
BYTE Shift47[9];
/*56*/ char Name[25]; //-> Need check size

/*50*/ //BYTE Unknown50; // -> 100%
/*88*/ //BYTE Unknown88; // -> 100%
/*90*/ //BYTE Unknown90; // -> 100%
/*91*/ //BYTE Unknown91; // -> 100%
/*92*/ //WORD InGuild; // -> 100%
/*94*/ //WORD ObjIndex; // -> 100%
/*96*/ //WORD Unknown96; // -> 100%
/*98*/ //WORD Unknown98; // -> 100%
/*100*/ //WORD Unknown100; // -> 100%
/*106*/ //WORD Unknown106; // -> 100%
/*112*/ //DWORD Unknown112; // -> 100%
/*116*/ //DWORD Unknown116; // -> 100%
/*124*/ //DWORD Unknown124; // -> 100%
/*140*/ //DWORD MapPosX; // -> 100%
/*144*/ //DWORD MapPosY; // -> 100%
/*156*/ //DWORD Unknown156; // -> 100%
/*172*/ //DWORD Unknown172; // -> 100%
/*188*/ //DWORD Unknown188; // -> 100%
/*192*/ //DWORD Unknown192; // -> 100%
/*196*/ //DWORD Unknown196; // -> 100%

BYTE Shift2[150];

/*232*/ WORD HelmSlot;
/*234*/ BYTE HelmLevel;
/*235*/ BYTE HelmExcellent;
/*236*/ BYTE HelmAncient;
BYTE Shift5[27];
/*264*/ WORD ArmorSlot;
/*266*/ BYTE ArmorLevel;
/*267*/ BYTE ArmorExcellent;
/*268*/ BYTE ArmorAncient;
BYTE Shift6[27];
/*296*/ WORD PantsSlot;
/*298*/ BYTE PantsLevel;
/*299*/ BYTE PantsExcellent;
/*300*/ BYTE PantsAncient;
BYTE Shift7[27];
/*328*/ WORD GlovesSlot;
/*330*/ BYTE GlovesLevel;
/*331*/ BYTE GlovesExcellent;
/*332*/ BYTE GlovesAncient;
BYTE Shift8[27];
/*360*/ WORD BootsSlot;
/*362*/ BYTE BootsLevel;
/*363*/ BYTE BootsExcellent;
/*364*/ BYTE BootsAncient;
BYTE Shift9[27];
/*392*/ WORD WeaponFirstSlot;
/*394*/ BYTE WeaponFirstLevel;
/*395*/ BYTE WeaponFirstExcellent;
/*396*/ BYTE WeaponFirstAncient;
/*397*/ BYTE Unknown397;
BYTE Shift10[26];
/*424*/ WORD WeaponSecondSlot;
/*426*/ BYTE WeaponSecondLevel;
/*427*/ BYTE WeaponSecondExcellent;
/*428*/ BYTE WeaponSecondAncient;
/*429*/ BYTE Unknown429;
BYTE Shift11[26];
/*456*/ WORD WingsSlot;
/*458*/ BYTE Unknown458;
/*459*/ BYTE Unknown459;
/*460*/ BYTE Unknown460;
BYTE Shift12[27];
/*488*/ WORD PetSlot;
/*490*/ BYTE Unknown490;
/*491*/ BYTE FenrirCharSet;
/*492*/ BYTE ExpectPet;

/*520*/ //WORD Unknown520; // -> 100%
/*596*/ //DWORD Unknown596; // -> 100%
/*688*/ //DWORD Unknown688; //
BYTE Shift13[207];

/*700*/ DWORD Unknown700; // -> # Need check
/*704*/ BYTE Unknown704;

BYTE Shift14[2];

/*707*/ BYTE Unknown707;
/*708*/ BYTE Unknown708;
/*709*/ BYTE Unknown709;
/*710*/ BYTE Unknown710; // -> 100%
/*711*/ BYTE Unknown711;
/*712*/ BYTE Unknown712;
BYTE Shift16[5];
/*718*/ BYTE Action;
/*719*/ BYTE Unknown719;
/*720*/ BYTE Unknown720; //-> 100%
/*721*/ BYTE Unknown721; //-> 100%
/*722*/ BYTE ObjectType; //-> Object Type (1 = Player, 2 = Monster, 4 = NPC) 100%
BYTE Shift17[25];
/*748*/ DWORD Unknown748;
/*752*/ DWORD Unknown752;
/*756*/ DWORD Unknown756;
/*760*/ DWORD Unknown760;

/*768*/ //DWORD Unknown768; // -> 100%

BYTE Shift18[32];
/*796*/ DWORD ModelScale;
BYTE Shift19[16];

/*800*/ //DWORD Unknown800; // -> 100%

/*816*/ DWORD Unknown816;

/*824*/ //DWORD Unknown824; // -> 100%

BYTE Shift20[103];

/*856*/ //DWORD Unknown856; // -> 100%
/*860*/ //DWORD Unknown860; // -> 100%
/*864*/ //DWORD Unknown864; // -> 100%
/*972*/ //DWORD Unknown972; // -> 100%
/*904*/ //DWORD Unknown904; // -> 100%
/*908*/ //DWORD Unknown908; // -> 100%
/*912*/ //DWORD Unknown912; // -> 100%
/*916*/ //DWORD Unknown916; // -> 100% / Maybe float
/*920*/ //DWORD Unknown920; // -> 100% / Maybe float

/*924*/ float SelectZone; // -> Maybe DWORD
BYTE Shift21[32];

/*952*/ //float Unknown952; // -> 100%
/*956*/ //float Unknown956; // -> 100%

/*960*/ float Unknown960;

/*964*/ //DWORD Unknown964; // -> 100%
/*968*/ //DWORD Unknown968; // -> 100%
/*972*/ //DWORD Unknown972; // -> 100%
/*1120*/ //DWORD Unknown1120; // -> 100%
/*1184*/ //void?
};
//---------------------------------------------------------------------------

#define ITEM_INTER 887 //1095 for 5.4 GMO
#define ITEM(x, y) ((x * 512) + y)
#define ITEM2(x, y) ((x * 512) + y + ITEM_INTER)
#define oObjState 0x00946F9C
#define oMapNumber 0x00934540
#define LODWORD(h) ((DWORD)(__int64(h) & __int64(0xffffffff)))
// ----
#define CS_START 1304
// ----
#define CS_EMPTY_SLOT -1
#define CS_EMPTY_ITEM 511
#define CS_EMPTY_WEAPON 4095 // ITEM(7, 511)
// ----
#define CS_SET_1(x) ( x >> 2)
// ----
#define CS_HELM 9089 // 9297 for 5.4, need check, maybe it value from * on ITEM_INTER
#define CS_ARMOR CS_HELM + 20
#define CS_PANTS CS_ARMOR + 20
#define CS_GLOVES CS_PANTS + 20
#define CS_BOOTS CS_GLOVES + 20
// ----
#define CS_GET_STRUCT(x, y) (CS_START * x + *(int*)y)
#define CS_GET_WEAPON(x, y) ( y | (16 * (x & 0xF0)) )
#define CS_GET_HELM(x, y, z) ( (32 * (z & 0xF)) + 16 * ((x >> 7) & 1) + (y >> 4) )
#define CS_GET_ARMOR(x, y, z) ( (32 * ((z >> 4) & 0xF)) + 16 * ((x >> 6) & 1) + (y & 0xF) )
#define CS_GET_PANTS(x, y, z) ( (32 * (z & 0xF)) + 16 * ((x >> 5) & 1) + (y >> 4) )
#define CS_GET_GLOVES(x, y, z) ( (32 * ((z >> 4) & 0xF)) + 16 * ((x >> 4) & 1) + (y & 0xF) )
#define CS_GET_BOOTS(x, y, z) ( (32 * (z & 0xF)) + 16 * ((x >> 3) & 1) + (y >> 4) )
//---------------------------------------------------------------------------

//bool __cdecl sub_49A450(signed int a1) -> return bool
typedef bool (__cdecl *IsChaosCastle)(int MapNumber);
extern IsChaosCastle gIsChaosCastle;
//---------------------------------------------------------------------------

//char __cdecl sub_51C4EC(BYTE a1) -> return WORD
typedef WORD (__cdecl *ItemCharSetConvert)(BYTE Pointer);
extern ItemCharSetConvert gItemCharSetConvert;
//---------------------------------------------------------------------------

//int __cdecl sub_463890(char a1) -> return BYTE or WORD
typedef BYTE (__cdecl *AmpersandConvert)(BYTE Pointer);
extern AmpersandConvert gAmpersandConvert;
//---------------------------------------------------------------------------

typedef int (__cdecl *ObjMakePreviewCharSet)(int a1, BYTE * CharSet, int a3, int a4);
extern ObjMakePreviewCharSet mObjMakePreviewCharSet;
//---------------------------------------------------------------------------

//int __cdecl sub_49A50A(int a1)
typedef int (__cdecl *Objsub_49A50A)(int Arg1);
extern Objsub_49A50A sub_49A50A;
//---------------------------------------------------------------------------

//int __cdecl sub_514A21(int a1)
typedef int (__cdecl *Objsub_514A21)(int Arg1);
extern Objsub_514A21 sub_514A21;
//---------------------------------------------------------------------------

//int __cdecl sub_4A3A7D(int a1) -> return int
typedef int (__cdecl *CheckPetStatus)(int Arg1);
extern CheckPetStatus gCheckPetStatus;
//---------------------------------------------------------------------------

//int __cdecl sub_4B6740(int a1) -> return int
typedef int (__cdecl *ReturnPetSlot)(int Arg1);
extern ReturnPetSlot gReturnPetSlot;
//---------------------------------------------------------------------------

//int __cdecl sub_4B6B54(int a1, int a2, int a3, int a4) -> return int
typedef int (__cdecl *SetObjMaunt)(int MauntCode, int Arg2, int Arg3, int Arg4, int Arg5);
extern SetObjMaunt gSetObjMaunt;
//---------------------------------------------------------------------------

//char __cdecl sub_4B680C(int a1, int a2, int a3, int a4, int a5) -> return bool
typedef bool (__cdecl *SetObjMaunt2)(int Arg1, int Arg2, int Arg3, int Arg4, int Arg5);
extern SetObjMaunt2 gSetObjMaunt2;
//---------------------------------------------------------------------------

//int __cdecl sub_8831F1() -> return THIS
typedef LPVOID (__cdecl *ObjPetGetThis)(void);
extern ObjPetGetThis gObjPetGetThis;
//---------------------------------------------------------------------------

//void __stdcall sub_88457C(int a1, int a2, char a3)
typedef void (__thiscall *SetObjPetReset)(LPVOID This, int Arg1, int Arg2, int Arg3);
extern SetObjPetReset gSetObjPetReset;
//---------------------------------------------------------------------------

//char __thiscall sub_884245(void *this, int a2, int a3, int a4, int a5, int a6, int a7) -> return bool
typedef void (__thiscall *SetObjPetOnSwitch)(LPVOID This, int Arg1, int Arg2, int Arg3, int Arg4, int Arg5, int Arg6);
extern SetObjPetOnSwitch gSetObjPetOnSwitch;
//---------------------------------------------------------------------------

//int *__cdecl sub_4ADABB(int a1) -> return int const
typedef int * (__cdecl *Objsub_4ADABB)(int Arg1);
extern Objsub_4ADABB sub_4ADABB;
//---------------------------------------------------------------------------

//int __cdecl sub_4ACDA6(int Preview * gPreview) -> return int
typedef int (__cdecl *ObjPreviewDarkRaven)(int Struct);
extern ObjPreviewDarkRaven gObjPreviewDarkRaven;
//---------------------------------------------------------------------------

typedef DWORD (*Objdword_7B65114);
extern Objdword_7B65114 dword_7B65114;
//---------------------------------------------------------------------------

typedef DWORD (*Objdword_7BA6278);
extern Objdword_7BA6278 dword_7BA6278;
//---------------------------------------------------------------------------

typedef DWORD (*Objdword_7B650F8);
extern Objdword_7B650F8 dword_7B650F8;
//---------------------------------------------------------------------------

void cMakePreviewCharSetLoad();
//---------------------------------------------------------------------------
[свернуть]

MakePreviewCharSet.cpp
Спойлер
#include "stdafx.h"
#include "MakePreviewCharSet.h"
//---------------------------------------------------------------------------

ObjMakePreviewCharSet mObjMakePreviewCharSet = (ObjMakePreviewCharSet)0x51564C;
// ----
IsChaosCastle gIsChaosCastle = (IsChaosCastle)0x49A450;
ItemCharSetConvert gItemCharSetConvert = (ItemCharSetConvert)0x51C4EC;
AmpersandConvert gAmpersandConvert = (AmpersandConvert)0x463890;
SetObjMaunt gSetObjMaunt = (SetObjMaunt)0x4B6B54;
SetObjMaunt2 gSetObjMaunt2 = (SetObjMaunt2)0x4B680C;
ObjPetGetThis gObjPetGetThis = (ObjPetGetThis)0x8831F1;
SetObjPetOnSwitch gSetObjPetOnSwitch = (SetObjPetOnSwitch)0x884245;
SetObjPetReset gSetObjPetReset = (SetObjPetReset)0x88457C;
CheckPetStatus gCheckPetStatus = (CheckPetStatus)0x4A3A7D;
ReturnPetSlot gReturnPetSlot = (ReturnPetSlot)0x4B6740;
ObjPreviewDarkRaven gObjPreviewDarkRaven = (ObjPreviewDarkRaven)0x4ACDA6;
// ----
Objsub_49A50A sub_49A50A = (Objsub_49A50A)0x49A50A;
Objsub_514A21 sub_514A21 = (Objsub_514A21)0x514A21;
Objsub_4ADABB sub_4ADABB = (Objsub_4ADABB)0x4ADABB;
//---------------------------------------------------------------------------

Objdword_7B65114 dword_7B65114 = (Objdword_7B65114)0x7B65114;
Objdword_7BA6278 dword_7BA6278 = (Objdword_7BA6278)0x7BA6278;
Objdword_7B650F8 dword_7B650F8 = (Objdword_7B650F8)0x7B650F8;
DWORD gObjGameState = *(DWORD*)oObjState;
//---------------------------------------------------------------------------

//51551C -> 14 Calls
BYTE gLevelSmallConvert(int SmallValue)
{
BYTE ResultValue;
// ----
switch(SmallValue)
{
case 0:
ResultValue = 0;
break;
// --
case 1:
ResultValue = 3;
break;
// --
case 2:
ResultValue = 5;
break;
// --
case 3:
ResultValue = 7;
break;
// --
case 4:
ResultValue = 9;
break;
// --
case 5:
ResultValue = 11;
break;
// --
case 6:
ResultValue = 13;
break;
// --
case 7:
ResultValue = 15;
break;
// --
default:
ResultValue = 0;
break;
}
// ----
return ResultValue;
}
//---------------------------------------------------------------------------

//515596 -> 1 Call
int gMakePreviewSoldierElf(int Struct)
{
Preview * gPreview = &*(Preview*)Struct;
// ----
//gPreview->WeaponFirstSlot = ITEM2(2, 16);
//gPreview->WeaponFirstLevel = 13;
// ----
//gPreview->WeaponSecondSlot = ITEM2(6, 21);
//gPreview->WeaponSecondLevel = 13;
// ----
gPreview->WingsSlot = ITEM2(12, 3);
// ----
gPreview->HelmSlot = ITEM2(7, 24);
gPreview->HelmLevel = 13;
// ----
gPreview->ArmorSlot = ITEM2(8, 24);
gPreview->ArmorLevel = 13;
// ----
gPreview->PantsSlot = ITEM2(9, 24);
gPreview->PantsLevel = 13;
// ----
gPreview->GlovesSlot = ITEM2(10, 24);
gPreview->GlovesLevel = 13;
// ----
gPreview->BootsSlot = ITEM2(11, 24);
gPreview->BootsLevel = 13;
// ----
gPreview->Action = 11;
gPreview->ModelScale = 0x3F800000;
gPreview->SelectZone += 70.0;
// ----
//gPreview->PKLevel = 10;
return gPreview->Unknown700;
}
//---------------------------------------------------------------------------

//51564C -> 7 Calls
int gObjMakePreviewCharSet(int Index, BYTE * CharSet, int UseStruct, int Mode)
{
if( Mode )
{
TDEBUG("Mode == %d");
}
int Result;
int ObjPreview;
// ----
if( UseStruct )
{
ObjPreview = UseStruct;
}
else
{
ObjPreview = CS_GET_STRUCT(Index, dword_7B650F8);
}
// ----
Result = ObjPreview + 700;
// ----
Preview * gPreview = &*(Preview*)ObjPreview;
// ----
if( gPreview->Unknown748 == (ITEM_INTER - 8) )
{
short WeaponFirstType = CS_GET_WEAPON(CharSet[11], CharSet[0]);
// ----
if( WeaponFirstType == CS_EMPTY_WEAPON )
{
gPreview->WeaponFirstSlot = CS_EMPTY_SLOT;
gPreview->WeaponFirstExcellent = NULL;
gPreview->WeaponFirstAncient = NULL;
}
else
{
gPreview->WeaponFirstSlot = WeaponFirstType + ITEM_INTER;
}
// ----
short WeaponSecondType = CS_GET_WEAPON(CharSet[12], CharSet[1]);
// ----
if( WeaponSecondType == CS_EMPTY_WEAPON )
{
gPreview->WeaponSecondSlot = CS_EMPTY_SLOT;
gPreview->WeaponSecondExcellent = NULL;
gPreview->WeaponSecondAncient = NULL;
}
else
{
if( gAmpersandConvert(pPlayerClass(ObjPreview)) != ObjClass::DarkLord || WeaponSecondType != ITEM(5, 5) )
{
gPreview->WeaponSecondSlot = WeaponSecondType + ITEM_INTER;
}
else
{
int CallArg = *(int*)sub_4ADABB(*(int*)dword_7BA6278 + 4413); // # Need check
gObjPreviewDarkRaven(ObjPreview);
// ----
if ( !gIsChaosCastle(gObjUser.MapNumber) )
{
TDEBUG("sub_4AECB0(CallArg)");
//sub_4AECB0(CallArg);
}
}
}
if( (CS_SET_1(CharSet[4]) & 3) == 3 )
{
BYTE SecondWingsType = CharSet[8] & 7;
// ----
if( SecondWingsType )
{
switch( SecondWingsType )
{
case 5: // Cape Of Lord
gPreview->WingsSlot = ITEM2(13, 30);
break;
// --
case 6: // Wings Of Curse
gPreview->WingsSlot = ITEM2(12, 41);
break;
// --
case 7: // Wings Of Despair
gPreview->WingsSlot = ITEM2(12, 42);
break;
// --
default: // Other Wings
gPreview->WingsSlot = ITEM2(12, 2) + SecondWingsType;
break;
}
}
else
{
gPreview->WingsSlot = CS_EMPTY_SLOT;
gPreview->Unknown459 = NULL;
gPreview->Unknown460 = NULL;
}
}
else
{
gPreview->WingsSlot = ITEM2(12, 0) + (CS_SET_1(CharSet[4]) & 3);
}
// ----
BYTE ThirdWingsType = CS_SET_1(CharSet[15]) & 7;
// ----
if( ThirdWingsType > 0 )
{
if( ThirdWingsType == 6 )
{
gPreview->WingsSlot = ITEM2(12, 43);
}
else
{
gPreview->WingsSlot = ITEM2(12, 35) + ThirdWingsType;
}
}
// ----
#if CLIENT_TYPE == 1 //-> Season 5.4 GMO
BYTE MiniWingsType = CharSet[16] >> 5;
// ----
if( MiniWingsType > 0 )
{
switch( MiniWingsType )
{
case 1:
gPreview->WingsSlot = ITEM2(12, 130);
break;
// --
case 2:
gPreview->WingsSlot = ITEM2(12, 131);
break;
// --
case 3:
gPreview->WingsSlot = ITEM2(12, 132);
break;
// --
case 4:
gPreview->WingsSlot = ITEM2(12, 133);
break;
// --
case 5:
gPreview->WingsSlot = ITEM2(12, 134);
break;
}
}
#endif
// ----
#ifdef CLIENT_0 //-> Custom
BYTE CustomWings = CharSet[16] >> 2;
// ----
if( CustomWings > 0 )
{
//TDEBUG("Wings Switch: [%d]", CustomWings);
// ----
switch( CustomWings )
{
case 1:
gPreview->WingsSlot = ITEM2(12, 180);
break;
// --
case 2:
gPreview->WingsSlot = ITEM2(12, 181);
break;
// --
case 3:
gPreview->WingsSlot = ITEM2(12, 182);
break;
// --
case 4:
gPreview->WingsSlot = ITEM2(12, 183);
break;
// --
case 5:
gPreview->WingsSlot = ITEM2(12, 184);
break;
// --
case 6:
gPreview->WingsSlot = ITEM2(12, 185);
break;
}
}
#endif
// ----
if( Mode )
{
*(BYTE *)(Mode + 4) = NULL;
}
else
{
ReturnPetSlot(ObjPreview + 700);
gSetObjPetReset(gObjPetGetThis(), ObjPreview, pPetSlot(ObjPreview), 1);
}
// ----
BYTE NormalPetType = CharSet[4] & 3;
// ----
if( NormalPetType == 3 )
{
if( (CharSet[9] & 1) == 1 )
{
gPreview->PetSlot = ITEM(13, 3);
// ----
if( Mode )
{
gSetObjMaunt2(eMauntType::Dinorant, ObjPreview + 952, ObjPreview + 700, Mode, 0);
}
else
{
gSetObjMaunt(eMauntType::Dinorant, ObjPreview + 952, ObjPreview + 700, 0, 0);
}
}
else
{
gPreview->PetSlot = CS_EMPTY_SLOT;
gPreview->FenrirCharSet = NULL;
gPreview->ExpectPet = 1;
}
}
else
{
BYTE PetCharSet = CharSet[15] & 0xE0;
// ----
if( PetCharSet != 32 && PetCharSet != 64
&& PetCharSet != 128 && PetCharSet != 224
&& PetCharSet != 160 && PetCharSet != 96 )
{
gPreview->PetSlot = ITEM2(13, 0) + NormalPetType;
int MauntCode = NULL;
bool Check = true;
// ----
if( NormalPetType )
{
if( NormalPetType == 2 )
{
MauntCode = eMauntType::Uniria;
}
else
{
if( NormalPetType == 3 )
{
MauntCode = eMauntType::Dinorant;
}
else
{
Check = false;
}
}
}
else
{
MauntCode = ITEM2(13, 0);
}
// ----
if( Check == true )
{
if( Mode )
{
gSetObjMaunt2(MauntCode, ObjPreview + 952, ObjPreview + 700, Mode, 0);
}
else
{
gSetObjMaunt(MauntCode, ObjPreview + 952, ObjPreview + 700, 0, 0);
}
}
}
else
{
short ShopPetType = NULL;
// ----
switch( PetCharSet )
{
case 0x20: // Demon
ShopPetType = 64;
break;
// --
case 0x40: // Spirit Of Guardian
ShopPetType = 65;
break;
// --
case 0x80: // Rudolf
ShopPetType = 67;
break;
// --
case 0xE0: // Panda
ShopPetType = 80;
break;
// --
case 0xA0: // Unicorn
ShopPetType = 106; //-> Not in use on GMO
break;
// --
case 0x60: // Skeleton
ShopPetType = 123;
break;
}
// ----
gPreview->PetSlot = ITEM2(13, 0) + ShopPetType;
// ----
if( *(DWORD*)oObjState == ObjState::SwitchCharacter || ObjPreview == LODWORD(dword_7B65114) )
{
gSetObjPetOnSwitch(gObjPetGetThis(), ITEM(13, 0) + ShopPetType, pPetSlot(ObjPreview), ObjPreview + 952, ObjPreview, 0, 0);
}
}
}
if( (CharSet[11] & 1) == 1 )
{
gPreview->PetSlot = ITEM2(13, 4);
// ----
if( Mode )
{
gSetObjMaunt2(eMauntType::DarkHorse, ObjPreview + 952, ObjPreview + 700, Mode, 0);
}
else
{
gSetObjMaunt(eMauntType::DarkHorse, ObjPreview + 952, ObjPreview + 700, 0, 0);
}
}
if( (CharSet[11] & 4) == 4 )
{
gPreview->PetSlot = ITEM2(13, 37);
gPreview->FenrirCharSet = CharSet[15] & 3;
// ----
if( (CharSet[16] & 1) == 1 )
{
gPreview->FenrirCharSet = 4;
}
// ----
switch(gPreview->FenrirCharSet)
{
case 1: // Black Fenrir
{
if( Mode )
{
gSetObjMaunt2(eMauntType::BlackFenrir, ObjPreview + 952, ObjPreview + 700, Mode, 0);
}
else
{
gSetObjMaunt(eMauntType::BlackFenrir, ObjPreview + 952, ObjPreview + 700, 0, 0);
}
}
break;
// --
case 2: // Blue Fenrir
{
if( Mode )
{
gSetObjMaunt2(eMauntType::BlueFenrir, ObjPreview + 952, ObjPreview + 700, Mode, 0);
}
else
{
gSetObjMaunt(eMauntType::BlueFenrir, ObjPreview + 952, ObjPreview + 700, 0, 0);
}
}
break;
// --
case 4: // Golden Fenrir
{
if( Mode )
{
gSetObjMaunt2(eMauntType::GoldenFenrir, ObjPreview + 952, ObjPreview + 700, Mode, 0);
}
else
{
gSetObjMaunt(eMauntType::GoldenFenrir, ObjPreview + 952, ObjPreview + 700, 0, 0);
}
}
break;
// --
default: // Red Fenrir
{
if( Mode )
{
gSetObjMaunt2(eMauntType::RedFenrir, ObjPreview + 952, ObjPreview + 700, Mode, 0);
}
else
{
gSetObjMaunt(eMauntType::RedFenrir, ObjPreview + 952, ObjPreview + 700, 0, 0);
}
}
break;
}
}
// ----
gCheckPetStatus(ObjPreview);
// ----
if( ((CharSet[11] >> 1) & 1) == 1 )
{
if( gPreview->PetStatus <= NULL || gPreview->PetStatus > 3 )
{
gPreview->PetStatus = eEffectState::AtFenrir;
}
}
else
{
if( gPreview->PetStatus <= NULL || gPreview->PetStatus > 3 )
{
gPreview->PetStatus = NULL;
}
}
// ----
int TempBuff = CharSet[7] + (CharSet[6] << 8) + (CharSet[5] << 16);
gPreview->WeaponFirstLevel = gLevelSmallConvert(CharSet[7] & 7);
gPreview->WeaponSecondLevel = gLevelSmallConvert((TempBuff >> 3) & 7);
gPreview->Unknown458 = NULL;
gPreview->Unknown490 = NULL;
Result = ObjPreview;
// ----
if( !pVisible(ObjPreview) )
{
short HelmType = CS_GET_HELM(CharSet[8], CharSet[2], CharSet[12]);
// ----
if( HelmType == CS_EMPTY_ITEM )
{
gPreview->HelmSlot = (BYTE)gItemCharSetConvert(gPreview->Class) + CS_HELM;
}
else
{
gPreview->HelmSlot = ITEM2(7, 0) + HelmType;
}
// ----
short ArmorType = CS_GET_ARMOR(CharSet[8], CharSet[2], CharSet[13]);
// ----
if( ArmorType == CS_EMPTY_ITEM )
{
gPreview->ArmorSlot = (BYTE)gItemCharSetConvert(gPreview->Class) + CS_ARMOR;
}
else
{
gPreview->ArmorSlot = ITEM2(8, 0) + ArmorType;
}
// ----
short PantsType = CS_GET_PANTS(CharSet[8], CharSet[3], CharSet[13]);
// ----
if( PantsType == CS_EMPTY_ITEM )
{
gPreview->PantsSlot = (BYTE)gItemCharSetConvert(gPreview->Class) + CS_PANTS;
}
else
{
gPreview->PantsSlot = ITEM2(9, 0) + PantsType;
}
// ----
short GlovesType = CS_GET_GLOVES(CharSet[8], CharSet[3], CharSet[14]);
// ----
if( GlovesType == CS_EMPTY_ITEM )
{
gPreview->GlovesSlot = (BYTE)gItemCharSetConvert(gPreview->Class) + CS_GLOVES;
}
else
{
gPreview->GlovesSlot = ITEM2(10, 0) + GlovesType;
}
// ----
short BootsType = CS_GET_BOOTS(CharSet[8], CharSet[4], CharSet[14]);
// ----
if( BootsType == CS_EMPTY_ITEM )
{
gPreview->BootsSlot = (BYTE)gItemCharSetConvert(gPreview->Class) + CS_BOOTS;
}
else
{
gPreview->BootsSlot = ITEM2(11, 0) + BootsType;
}
// ----
gPreview->HelmLevel = gLevelSmallConvert((TempBuff >> 6) & 7);
gPreview->HelmExcellent = (CharSet[9] & 0x80) >> 7;
gPreview->HelmAncient = (CharSet[9] & 0x80) >> 7;
// ----
gPreview->ArmorLevel = gLevelSmallConvert((TempBuff >> 9) & 7);
gPreview->ArmorExcellent = (CharSet[9] & 0x40) >> 6;
gPreview->ArmorAncient = (CharSet[9] & 0x40) >> 6;
// ----
gPreview->PantsLevel = gLevelSmallConvert((TempBuff >> 12) & 7);
gPreview->PantsExcellent = (CharSet[9] & 0x20) >> 5;
gPreview->PantsAncient = (CharSet[9] & 0x20) >> 5;
// ----
gPreview->GlovesLevel = gLevelSmallConvert((TempBuff >> 15) & 7);
gPreview->GlovesExcellent = (CharSet[9] & 0x10) >> 4;
gPreview->GlovesAncient = (CharSet[9] & 0x10) >> 4;
// ----
gPreview->BootsLevel = gLevelSmallConvert((TempBuff >> 18) & 7);
gPreview->BootsExcellent = (CharSet[9] & 8) >> 3;
gPreview->BootsAncient = (CharSet[9] & 8) >> 3;
// ----
gPreview->WeaponFirstExcellent = (CharSet[9] & 4) >> 2;
gPreview->WeaponFirstAncient = (CharSet[10] & 4) >> 2;
// ----
gPreview->WeaponSecondExcellent = (CharSet[9] & 2) >> 1;
gPreview->WeaponSecondAncient = (CharSet[10] & 2) >> 1;
// ----
gPreview->AncientEffect = CharSet[10] & 1;
// ----
sub_49A50A(ObjPreview);
// ----
Result = sub_514A21(ObjPreview);
}
}
// ----
return Result;
}
//---------------------------------------------------------------------------

void cMakePreviewCharSetLoad()
{
SetHook((LPVOID)gObjMakePreviewCharSet, (LPVOID)0x0047797F, ASM::CALL);
SetHook((LPVOID)gObjMakePreviewCharSet, (LPVOID)0x006317A3, ASM::CALL);
SetHook((LPVOID)gObjMakePreviewCharSet, (LPVOID)0x00637C15, ASM::CALL);
SetHook((LPVOID)gObjMakePreviewCharSet, (LPVOID)0x00638702, ASM::CALL);
SetHook((LPVOID)gObjMakePreviewCharSet, (LPVOID)0x00638CF3, ASM::CALL);
SetHook((LPVOID)gObjMakePreviewCharSet, (LPVOID)0x0065EDCC, ASM::CALL);
SetHook((LPVOID)gObjMakePreviewCharSet, (LPVOID)0x00663A57, ASM::CALL);
// ----
SetHook((LPVOID)gMakePreviewSoldierElf, (LPVOID)0x00519CCF, ASM::CALL);
}
//---------------------------------------------------------------------------
[свернуть]

Оффсеты от 5.2 JPN (1.03.25), всем удачи)

P.S.: Скрины, что б интересней было
## здесь был скриншот ##
## здесь был скриншот ##
## здесь был скриншот ##
## здесь был скриншот ##
## здесь был скриншот ##

Почините споилер пожалуйста

Soker

Омг Сум там просто жесть )

Mr.Kernighan

#2
Ага, а можно еще и карликов делать, но при этом текстуры вытягиваются.

Было дело :)
https://prntscr.com/u3qo6
Красивый эффект спектатора
https://prntscr.com/u3qvt
Даже и дерево на голову одеть можно  :loool:
https://prntscr.com/u3qze

madias

Не издевайтесь над МУ, сумку рахиткой сделали =)

wizik

#4
как я понял в этом куске можно так же менять размер монстров?
Хм, в общем будет время начну потихоньку вкуривать эту штуку, по инфе которая есть пользы будет очень много.

а оффсет для bloodcatle есть?

ps DarkSim respect.

f1x

А в 4 сезон возможно добавить 4 винги?

KissFM

#6
Цитата: f1x от 2013 Май 20, 13:00  А в 4 сезон возможно добавить 4 винги?

Конечно можно, тебе нужно скачать тимын Сорс, который он выкладывал в качестве Новогоднего подарка, перискать оффсеты, по сути с вингами проблем не будет, а вот с Чарсетом тут уже напряг, так как нужно переделывать структуру под твой мейн.

Furion

Ещё бы гайд написали как всё это заставить работать  Так интересно конечно.

KissFM

Честно говоря не пойму какой гайд нужен
Всё по сути есть, DarkSim выложил в паблик свои сорсы, просто вставляешь так сказать этот сорс к себе, и начинаешь искать оффсеты, DarkSim выкладывал сорсы под 1.03.25 мейн.
Нужно открыть два мейна в OlyDbg, и переискать все оффсеты...
Дело кончено не быстроё, но всё же если заняться можно всё сделать.

Profesor08

Данный код полезен только разработчикам. Если вы такими не являетесь, то проходите мимо и не пускайте слюни.

f1x

#10
Цитата: Profesor08 от 2013 Май 20, 18:24  Данный код полезен только разработчикам. Если вы такими не являетесь, то проходите мимо и не пускайте слюни.
Я не разработчик.
Пусканул слюну и пошел ка все таки добавлять 4 винги.
Если долго мучатся, что нибудь получится :trollface:

Блин, дайте исходник
#include "Item.h" :mellow:

Profesor08

#11

Bason4ik


f1x

Цитата: Profesor08 от 2013 Май 20, 20:34  
https://bdmtss.net/<br> :trollface: <br>
Умно.
Но без исходника этого я ничего по идеи сделать не смогу.

Sil3nT

ДаркСим ,за сколько сможешь запилить 4 уровня винги в джулию ?

Похожие темы (5)

Сообщений: 14
Просмотров: 9395

Сообщений: 295
Просмотров: 45770

Сообщений: 8
Просмотров: 5494

Сообщений: 2
Просмотров: 1930