maybe you can share your source for 1.04.10 ?
Printable View
Yes why not :) I would send it when i weel be back from work ;)
I was fixing wings in Gameserver and Main...
I was using fixes of 3rd wings and summoner wings from 7.11.66b
But it BUUUUUGGED...
-=DarkSim=-
i have problems for Pets(Ex:Fenrir & Dark Raven)
Pet effects incorrects position and Pet Black,Blue & Gold not excellent in invetarion
Main 1.03.07 VTM
Attachment 134522Attachment 134525
Attachment 134523Attachment 134524
can someone share client 1.03Y JPN ?
please offset 1.04d of
thank you very muchCode:#define SetItemSpecialStat ((int(*)(short ItemID, int Arg2, BYTE SpecialOption, BYTE SpecialValue, int Arg5)) 0x5A6360) //5C0DC0 1.03Y+
#define oSetItemSpecialStat 0x005AF065 //005CA0B0 1.03Y+
sorry bad english
i use source CharSet of -=darksim=- for main 1.04J not work.
to -=darksim=- you can fix for main1.04j (ss3.1)
Guys, sure, please stop ask about "u can make research? u can fix it for my main.exe? please please?".
For own main.exe need research struct positions, offsets / calls and etc, maybe in some main.exe remake function elements.
If u can't make it - go out, this sources not help u in create own wings.
And stop write me in PM and Skype please, i can't help if u don't know how it work.
-=DarkSim=-, That's right, Guys want much in hand ¬ ¬ '
I got to my main.exe, However I have some questions that I think is not encomodo, Since + / - 90% of that Source is Ok for Me
Quote:
i have problems for Pets(Ex:Fenrir & Dark Raven)
Pet effects incorrects position and Pet Black,Blue & Gold not excellent in invetarion
Main 1.03.07 VTM
Attachment 134522Attachment 134525
Attachment 134523Attachment 134524
Hello And for 1.03 (JPN) have a working source code without visual bug? I in any case after a teleport, or a change in character - there is a bug (((
Source for 1.04d gmo. Tested
.h
.cppCode:#define ITEM_INTER 1171
#define ITEM(x,y) ((x * 512) + y)
#define ITEM2(x, y) ((x * 512) + y + ITEM_INTER)
#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 9389
#define CS_ARMOR CS_HELM + 24
#define CS_PANTS CS_ARMOR + 24
#define CS_GLOVES CS_PANTS + 24
#define CS_BOOTS CS_GLOVES + 24
#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) )
typedef int (__thiscall *SetObjPreview)(LPVOID This, signed int a2);
extern SetObjPreview gSetObjPreview;
//---------------------------------------------------------------------------
typedef LPVOID (__cdecl *SetObjPreviewThis)(void);
extern SetObjPreviewThis gSetObjPreviewThis;
//---------------------------------------------------------------------------
typedef int (__cdecl *ObjPreviewDarkRaven)(int Struct);
extern ObjPreviewDarkRaven gObjPreviewDarkRaven;
//---------------------------------------------------------------------------
typedef int (__cdecl *ReturnPetSlot)(int Arg1);
extern ReturnPetSlot gReturnPetSlot;
//---------------------------------------------------------------------------
typedef void (__thiscall *SetObjPetReset)(LPVOID This, int Arg1, int Arg2);
extern SetObjPetReset gSetObjPetReset;
//---------------------------------------------------------------------------
typedef void (__thiscall *SetObjPetOnSwitch)(LPVOID This, int Arg1, int Arg2, int Arg3, int Arg4, int Arg5, int Arg6);
extern SetObjPetOnSwitch gSetObjPetOnSwitch;
//---------------------------------------------------------------------------
typedef LPVOID (__cdecl *ObjPetGetThis)(void);
extern ObjPetGetThis gObjPetGetThis;
//---------------------------------------------------------------------------
typedef int (__cdecl *SetObjMaunt)(int MauntCode, int Arg2, int Arg3, int Arg4, int Arg5);
extern SetObjMaunt gSetObjMaunt;
//---------------------------------------------------------------------------
typedef bool (__cdecl *SetObjMaunt2)(int Arg1, int Arg2, int Arg3, int Arg4, int Arg5);
extern SetObjMaunt2 gSetObjMaunt2;
//---------------------------------------------------------------------------
typedef int (__cdecl *CheckPetStatus)(int Arg1);
extern CheckPetStatus gCheckPetStatus;
typedef int * (__cdecl *Objsub_4F9930)(int Arg1);
extern Objsub_4F9930 sub_4F9930;
//---------------------------------------------------------------------------
typedef int (__cdecl *Objsub_4E6670)(int Arg1);
extern Objsub_4E6670 sub_4E6670;
//---------------------------------------------------------------------------
typedef int (__cdecl *Objsub_57F020)(int Arg1);
extern Objsub_57F020 sub_57F020;
typedef DWORD (*Objdword_E7C224);
extern Objdword_E7C224 dword_E7C224;
typedef DWORD (*Objdword_8128AC4);
extern Objdword_8128AC4 dword_8128AC4;
enum eMauntType
{
DarkHorse = 226,
Uniria = 233,
Dinorant = 323,
BlackFenrir = 384,
RedFenrir = 385,
BlueFenrir = 386,
GoldenFenrir = 387,
};
Local calls from 0048FB8C, 0063D2D8, 00641189, 00641F42, 00642598, 0065EA2DCode:BYTE gLevelSmallConvert(int value)
{
BYTE result;
switch(value)
{
case 0:
result = 0;
break;
case 1:
result = 3;
break;
case 2:
result = 5;
break;
case 3:
result = 7;
break;
case 4:
result = 9;
break;
case 5:
result = 11;
break;
case 6:
result = 13;
break;
case 7:
result = 15;
break;
default:
result = 0;
break;
}
return result;
}
int gAmpersandConvert(char a1)
{
return a1 & 7;
}
char sub_587500(unsigned __int8 a1)
{
unsigned __int8 v2;
char v3;
char v4;
v2 = a1 & 7;
v3 = ((signed int)a1 >> 4) & 1;
if ( a1 & 7 && v2 != 1 && v2 != 2 && v2 != 5 )
v4 = 14 * v3 + v2;
else
v4 = 7 * (v3 + (((signed int)a1 >> 3) & 1)) + v2;
return v4;
}
SetObjPreview gSetObjPreview = (SetObjPreview)0x96A340;
SetObjPreviewThis gSetObjPreviewThis = (SetObjPreviewThis)0x402BC0;
ObjPreviewDarkRaven gObjPreviewDarkRaven = (ObjPreviewDarkRaven)0x4F8B80;
ReturnPetSlot gReturnPetSlot = (ReturnPetSlot)0x5012D0;
SetObjPetReset gSetObjPetReset = (SetObjPetReset)0x925280;
SetObjPetOnSwitch gSetObjPetOnSwitch = (SetObjPetOnSwitch)0x924F90;
ObjPetGetThis gObjPetGetThis = (ObjPetGetThis)0x4DB230;
SetObjMaunt gSetObjMaunt = (SetObjMaunt)0x501700;
SetObjMaunt2 gSetObjMaunt2 = (SetObjMaunt2)0x5013B0;
CheckPetStatus gCheckPetStatus = (CheckPetStatus)0x4EFF70;
Objsub_4F9930 sub_4F9930 = (Objsub_4F9930)0x4F9930;
Objsub_4E6670 sub_4E6670 = (Objsub_4E6670)0x4E6670;
Objsub_57F020 sub_57F020 = (Objsub_57F020)0x57F020;
Objdword_E7C224 dword_E7C224 = (Objdword_E7C224)0xE7C224;
Objdword_8128AC4 dword_8128AC4 = (Objdword_8128AC4)0x8128AC4;
void gObjMakePreviewCharSet(int Index, BYTE *CharSet, int UseStruct, int Mode)
{
int ObjPreview;
if (UseStruct)
{
ObjPreview = UseStruct;
}
else
{
ObjPreview = gSetObjPreview(gSetObjPreviewThis(), Index);
}
if (ObjPreview)
{
if (*(DWORD *)(ObjPreview + 824) == (ITEM_INTER - 8))
{
short WeaponFirstType = CS_GET_WEAPON(CharSet[11], CharSet[0]);
if (WeaponFirstType == CS_EMPTY_WEAPON)
{
*(WORD *)(ObjPreview + 448) = CS_EMPTY_SLOT;
*(BYTE *)(ObjPreview + 451) = NULL;
*(BYTE *)(ObjPreview + 452) = NULL;
}
else
{
*(WORD *)(ObjPreview + 448) = WeaponFirstType + ITEM_INTER;
}
short WeaponSecondType = CS_GET_WEAPON(CharSet[12], CharSet[1]);
if (WeaponSecondType == CS_EMPTY_WEAPON)
{
*(WORD *)(ObjPreview + 484) = CS_EMPTY_SLOT;
*(BYTE *)(ObjPreview + 487) = NULL;
*(BYTE *)(ObjPreview + 488) = NULL;
}
else
{
if (gAmpersandConvert(*(BYTE *)(ObjPreview + 19)) != 4 || WeaponSecondType != ITEM(5,5))
{
*(WORD *)(ObjPreview + 484) = WeaponSecondType + ITEM_INTER;
}
else
{
//int CallArg = *(int*)sub_4F9930(*(int*)dword_8128AC4 + 4779);
gObjPreviewDarkRaven(ObjPreview);
//if (!sub_4E65A0(dword_E61E18))
// sub_4FA780(CallArg);
}
}
BYTE WingsType = CharSet[8] & 7;
switch (CS_SET_1(CharSet[4]) & 3)
{
case 1:
if (WingsType == 4)
*(WORD *)(ObjPreview + 520) = ITEM2(12,41);
else
*(WORD *)(ObjPreview + 520) = WingsType + ITEM2(12,0);
break;
case 2:
switch (WingsType)
{
case 5:
*(WORD *)(ObjPreview + 520) = ITEM2(13,30);
break;
case 6:
*(WORD *)(ObjPreview + 520) = ITEM2(12,42);
break;
case 7:
*(WORD *)(ObjPreview + 520) = ITEM2(12,49);
break;
default:
*(WORD *)(ObjPreview + 520) = WingsType + ITEM2(12,2);
break;
}
break;
case 3:
if (WingsType)
{
if (WingsType == 6)
*(WORD *)(ObjPreview + 520) = ITEM2(12,43);
else if (WingsType == 7)
*(WORD *)(ObjPreview + 520) = ITEM2(12,50);
else
*(WORD *)(ObjPreview + 520) = WingsType + ITEM2(12,35);
}
else
{
*(WORD *)(ObjPreview + 520) = (CharSet[16] >> 5) + ITEM2(12,129);
}
break;
default:
*(WORD *)(ObjPreview + 520) = CS_EMPTY_SLOT;
*(BYTE *)(ObjPreview + 523) = NULL;
*(BYTE *)(ObjPreview + 524) = NULL;
break;
}
if (Mode)
{
*(BYTE *)(Mode + 4) = NULL;
}
else
{
ReturnPetSlot(ObjPreview + 776);
WORD pPetSlot = *(WORD *)(ObjPreview + 556);
//sub_4DB230();
//sub_925280(ObjPreview, pPetSlot);
gSetObjPetReset(gObjPetGetThis(), ObjPreview, pPetSlot);
}
BYTE NormalPetType = CharSet[4] & 3;
if (NormalPetType == 3)
{
if ((CharSet[9] & 1) == 1)
{
*(WORD *)(ObjPreview + 556) = ITEM2(13,3);
if (Mode)
gSetObjMaunt2(eMauntType::Dinorant, ObjPreview + 1028, ObjPreview + 776, Mode, 0);
else
gSetObjMaunt(eMauntType::Dinorant, ObjPreview + 1028, ObjPreview + 776, 0, 0);
}
else
{
*(WORD *)(ObjPreview + 556) = CS_EMPTY_SLOT;
*(BYTE *)(ObjPreview + 559) = NULL;
*(BYTE *)(ObjPreview + 560) = NULL;
}
}
else
{
BYTE PetCharSet = CharSet[15] & 0xE0;
if (PetCharSet != 32 &&
PetCharSet != 64 &&
PetCharSet != 128 &&
PetCharSet != 224 &&
PetCharSet != 160 &&
PetCharSet != 96)
{
*(WORD *)(ObjPreview + 556) = NormalPetType + ITEM2(13,0);
int MauntCode = 0;
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 + 1028, ObjPreview + 776, Mode, 0);
else
gSetObjMaunt(MauntCode, ObjPreview + 1028, ObjPreview + 776, 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;
break;
case 0x60: // Skeleton
ShopPetType = 123;
break;
}
*(WORD *)(ObjPreview + 556) = ShopPetType + ITEM2(13,0);
WORD pPetSlot = *(WORD *)(ObjPreview + 556);
//sub_4DB230();
//sub_924F90(ShopPetType + ITEM(13,0), pPetSlot, ObjPreview + 1028, ObjPreview, 0, 0);
gSetObjPetOnSwitch(gObjPetGetThis(), ShopPetType + ITEM(13,0), pPetSlot, ObjPreview + 1028, ObjPreview, 0, 0);
}
}
if ((CharSet[11] & 1) == 1)
{
*(WORD *)(ObjPreview + 556) = ITEM2(13,4);
if (Mode)
gSetObjMaunt2(eMauntType::DarkHorse, ObjPreview + 1028, ObjPreview + 776, Mode, 0);
else
gSetObjMaunt(eMauntType::DarkHorse, ObjPreview + 1028, ObjPreview + 776, 0, 0);
}
if ((CharSet[11] & 4) == 4)
{
*(WORD *)(ObjPreview + 556) = ITEM2(13,37);
BYTE FenrirCharSet = CharSet[15] & 3;
if (CharSet[16] & 1)
FenrirCharSet = 4;
*(BYTE *)(ObjPreview + 559) = FenrirCharSet;
switch (FenrirCharSet)
{
case 1:
if (Mode)
gSetObjMaunt2(eMauntType::BlackFenrir, ObjPreview + 1028, ObjPreview + 776, Mode, 0);
else
gSetObjMaunt(eMauntType::BlackFenrir, ObjPreview + 1028, ObjPreview + 776, 0, 0);
break;
case 2:
if (Mode)
gSetObjMaunt2(eMauntType::BlueFenrir, ObjPreview + 1028, ObjPreview + 776, Mode, 0);
else
gSetObjMaunt(eMauntType::BlueFenrir, ObjPreview + 1028, ObjPreview + 776, 0, 0);
break;
case 4:
if (Mode)
gSetObjMaunt2(eMauntType::GoldenFenrir, ObjPreview + 1028, ObjPreview + 776, Mode, 0);
else
gSetObjMaunt(eMauntType::GoldenFenrir, ObjPreview + 1028, ObjPreview + 776, 0, 0);
break;
default:
if (Mode)
gSetObjMaunt2(eMauntType::RedFenrir, ObjPreview + 1028, ObjPreview + 776, Mode, 0);
else
gSetObjMaunt(eMauntType::RedFenrir, ObjPreview + 1028, ObjPreview + 776, 0, 0);
break;
}
}
gCheckPetStatus(ObjPreview);
if (((CharSet[11] >> 1) & 1) == 1)
{
if ( *(BYTE *)(ObjPreview + 23) <= NULL || *(BYTE *)(ObjPreview + 23) > 3 )
*(BYTE *)(ObjPreview + 23) = 4;
}
else
{
if ( *(BYTE *)(ObjPreview + 23) <= NULL || *(BYTE *)(ObjPreview + 23) > 3 )
*(BYTE *)(ObjPreview + 23) = 0;
}
int TempBuff = CharSet[7] + (CharSet[6] << 8) + (CharSet[5] << 16);
*(BYTE *)(ObjPreview + 450) = gLevelSmallConvert(CharSet[7] & 7);
*(BYTE *)(ObjPreview + 486) = gLevelSmallConvert((TempBuff >> 3) & 7);
*(BYTE *)(ObjPreview + 522) = NULL;
*(BYTE *)(ObjPreview + 558) = NULL;
if ( !*(BYTE *)(ObjPreview + 15) )
{
short HelmType = CS_GET_HELM(CharSet[8], CharSet[2], CharSet[12]);
if (HelmType == CS_EMPTY_ITEM)
*(WORD *)(ObjPreview + 268) = sub_587500(*(BYTE *)(ObjPreview + 19)) + CS_HELM;
else
*(WORD *)(ObjPreview + 268) = HelmType + ITEM2(7,0);
short ArmorType = CS_GET_ARMOR(CharSet[8], CharSet[2], CharSet[13]);
if (ArmorType == CS_EMPTY_ITEM)
*(WORD *)(ObjPreview + 304) = sub_587500(*(BYTE *)(ObjPreview + 19)) + CS_ARMOR;
else
*(WORD *)(ObjPreview + 304) = ArmorType + ITEM2(8,0);
short PantsType = CS_GET_PANTS(CharSet[8], CharSet[3], CharSet[13]);
if (PantsType == CS_EMPTY_ITEM)
*(WORD *)(ObjPreview + 340) = sub_587500(*(BYTE *)(ObjPreview + 19)) + CS_PANTS;
else
*(WORD *)(ObjPreview + 340) = PantsType + ITEM2(9,0);
short GlovesType = CS_GET_GLOVES(CharSet[8], CharSet[3], CharSet[14]);
if (GlovesType == CS_EMPTY_ITEM)
*(WORD *)(ObjPreview + 376) = sub_587500(*(BYTE *)(ObjPreview + 19)) + CS_GLOVES;
else
*(WORD *)(ObjPreview + 376) = GlovesType + ITEM2(10,0);
short BootsType = CS_GET_BOOTS(CharSet[8], CharSet[4], CharSet[14]);
if (BootsType == CS_EMPTY_ITEM)
*(WORD *)(ObjPreview + 412) = sub_587500(*(BYTE *)(ObjPreview + 19)) + CS_BOOTS;
else
*(WORD *)(ObjPreview + 412) = BootsType + ITEM2(11,0);
*(BYTE *)(ObjPreview + 270) = gLevelSmallConvert((TempBuff >> 6) & 7);
*(BYTE *)(ObjPreview + 306) = gLevelSmallConvert((TempBuff >> 9) & 7);
*(BYTE *)(ObjPreview + 342) = gLevelSmallConvert((TempBuff >> 12) & 7);
*(BYTE *)(ObjPreview + 378) = gLevelSmallConvert((TempBuff >> 15) & 7);
*(BYTE *)(ObjPreview + 414) = gLevelSmallConvert((TempBuff >> 18) & 7);
*(BYTE *)(ObjPreview + 271) = (CharSet[9] & 0x80) >> 7;
*(BYTE *)(ObjPreview + 307) = (CharSet[9] & 0x40) >> 6;
*(BYTE *)(ObjPreview + 343) = (CharSet[9] & 0x20) >> 5;
*(BYTE *)(ObjPreview + 379) = (CharSet[9] & 0x10) >> 4;
*(BYTE *)(ObjPreview + 415) = (CharSet[9] & 8) >> 3;
*(BYTE *)(ObjPreview + 272) = (CharSet[10] & 0x80) >> 7;
*(BYTE *)(ObjPreview + 308) = (CharSet[10] & 0x40) >> 6;
*(BYTE *)(ObjPreview + 344) = (CharSet[10] & 0x20) >> 5;
*(BYTE *)(ObjPreview + 380) = (CharSet[10] & 0x10) >> 4;
*(BYTE *)(ObjPreview + 416) = (CharSet[10] & 8) >> 3;
*(BYTE *)(ObjPreview + 451) = (CharSet[9] & 4) >> 2;
*(BYTE *)(ObjPreview + 487) = (CharSet[9] & 2) >> 1;
*(BYTE *)(ObjPreview + 452) = (CharSet[10] & 4) >> 2;
*(BYTE *)(ObjPreview + 488) = (CharSet[10] & 2) >> 1;
*(BYTE *)(ObjPreview + 22) = CharSet[10] & 1;
sub_4E6670(ObjPreview);
sub_57F020(ObjPreview);
}
}
}
}
Can you explan what it do?
// No comment -> too hard to understand :(
thanks, can sure source of GS 1.00.90 JPN , for new wings ? ty
Source For Main 1.04x please