Salve... Recentemente depois de vários dias de trabalho, consegui liberar novas Wings para as versões 97d e 99z. Como aqui no Brasil as pessoas quase nunca contribuem com nada em Mu Online, aqui deixo uma contribuição para quem busca fazer seus updates e Custons em versões clássicas de Mu Online.
Claro que isso não é o código completo para vc liberar estes itens, mas pode poupar vários dias de trabalho para quem já está trabalhando nisso.
Função MakePreviewCharSet Completa Main 99z ou 1.0
Código:
#define Func_0x41E1C0 ((int(__cdecl*)(int a1)) 0x0041E1C0)
#define Func_0x4340A0 ((void(__cdecl*)(int a1)) 0x004340A0)
#define Func_0x4342F0 ((char(__cdecl*)(int a1, int a2, int a3, int a4)) 0x004342F0)
#define Func_0x4340D0 ((char(__cdecl*)(__int16 a1, int a2, int a3, int a4, int a5)) 0x004340D0)
#define Func_0x412530 ((void(__cdecl*)(int a1)) 0x00412530)
#define Func_0x4FA8D0 ((signed int(__cdecl*)(char a1)) 0x004FA8D0)
#define Func_0x4038A0 ((int(__cdecl*)(int a1)) 0x004038A0)
#define Func_0x4F9EC0 ((int(__cdecl*)(int a1)) 0x004F9EC0)
void __cdecl MakePreviwCharSet(int aIndex, BYTE* CharSet, int PreviewObject, BYTE* Mode)
{
int pPreviewObject; // esi@1
char v5; // al@7
unsigned __int8 Wings; // al@14
unsigned __int8 v7; // al@23
int v8; // eax@32
unsigned __int8 v9; // al@43
signed int v10; // ebx@50
char v11; // al@50
char v12; // dl@51
unsigned __int8 v13; // al@54
char v14; // cl@57
char v15; // dl@60
char v16; // cl@63
__int16 v17; // [sp-18h] [bp-24h]@27
int v18; // [sp-14h] [bp-20h]@27
int v19; // [sp-10h] [bp-1Ch]@27
int v20; // [sp-Ch] [bp-18h]@27
char v21; // [sp+1Ch] [bp+10h]@23
BYTE NewWing; // al@23
pPreviewObject = PreviewObject;
if (!PreviewObject)
pPreviewObject = *(DWORD*)0x73C81E4 + 1068 * aIndex;
if (*(WORD*)(pPreviewObject + 2) == 497)
{
// Preview Itens das mãos
if (*(BYTE*)CharSet == -1)
{
*(BYTE*)(pPreviewObject + 691) = 0;
*(WORD*)(pPreviewObject + 688) = -1;
*(BYTE*)(pPreviewObject + 692) = 0;
}
else
{
*(WORD*)(pPreviewObject + 688) = *(BYTE*)CharSet + 505;
}
v5 = *(BYTE*)(CharSet + 1);
if (v5 == -1)
{
*(WORD*)(pPreviewObject + 720) = -1;
*(BYTE*)(pPreviewObject + 723) = 0;
*(BYTE*)(pPreviewObject + 724) = 0;
}
else if ((*(BYTE*)(pPreviewObject + 452) & 7) != 4 || v5 != -91)
{
*(WORD*)(pPreviewObject + 720) = *(BYTE*)(CharSet + 1) + 505;
}
else
{
*(WORD*)(pPreviewObject + 720) = 926;
Func_0x41E1C0(pPreviewObject);
}
// Preview Wings na SeletChar
if (((*(BYTE*)(CharSet + 4) >> 2) & 3) == 3)
{
}
if (Mode)
*Mode = 0;
else
Func_0x4340A0(pPreviewObject);
v7 = *(BYTE*)(CharSet + 4) & 3;
v21 = *(BYTE*)(CharSet + 4) & 3;
if (v7 == 3)
{
if ((*(BYTE*)(CharSet + 9) & 1) != 1)
{
*(WORD*)(pPreviewObject + 784) = -1;
*(BYTE*)(pPreviewObject + 787) = 0;
*(BYTE*)(pPreviewObject + 788) = 0;
goto LABEL_39;
}
*(WORD*)(pPreviewObject + 784) = 924;
if (!Mode)
{
Func_0x4342F0(269, pPreviewObject + 16, pPreviewObject, 0);
LABEL_39:
if ((*(BYTE*)(CharSet + 11) & 1) == 1)
{
*(WORD*)(pPreviewObject + 784) = 925;
if (Mode)
Func_0x4340D0(191, pPreviewObject + 16, pPreviewObject, (int)Mode, 0);
else
Func_0x4342F0(191, pPreviewObject + 16, pPreviewObject, 0);
}
Func_0x412530(pPreviewObject);
v9 = *(BYTE*)(pPreviewObject + 856);
if ((*(BYTE*)(CharSet + 11) & 2) == 2)
{
if (!v9 || v9 > 3u)
*(BYTE*)(pPreviewObject + 856) = 4;
}
else if (!v9 || v9 > 3u)
{
*(BYTE*)(pPreviewObject + 856) = 0;
}
v10 = *(BYTE*)(CharSet + 7) + ((*(BYTE*)(CharSet + 6) + (*(BYTE*)(CharSet + 5) << 8)) << 8);
*(BYTE*)(pPreviewObject + 690) = Func_0x4FA8D0(*(BYTE*)(CharSet + 7) & 7);
*(BYTE*)(pPreviewObject + 722) = Func_0x4FA8D0((v10 >> 3) & 7);
v11 = *(BYTE*)(pPreviewObject + 987);
*(BYTE*)(pPreviewObject + 754) = 0;
*(BYTE*)(pPreviewObject + 786) = 0;
if (!v11)
{
v12 = *(BYTE*)(CharSet + 2) >> 4;
if (v12 + 16 * (*(BYTE*)(CharSet + 8) >> 7) == 31)
*(WORD*)(pPreviewObject + 528) = 5 * (unsigned __int8)(*(BYTE*)(pPreviewObject + 452) >> 3) + (*(BYTE*)(pPreviewObject + 452) & 7) + 1017;
else
*(WORD*)(pPreviewObject + 528) = (unsigned __int8)(v12 + 16 * (*(BYTE*)(CharSet + 8) >> 7)) + 729;
v13 = (*(BYTE*)(CharSet + 2) & 0xF) + 16 * ((*(BYTE*)(CharSet + 8) >> 6) & 1);
if (v13 == 31)
*(WORD*)(pPreviewObject + 560) = (*(BYTE*)(pPreviewObject + 452) & 7) + 5 * ((unsigned __int8)(*(BYTE*)(pPreviewObject + 452) >> 3) + 205);
else
*(WORD*)(pPreviewObject + 560) = v13 + 761;
v14 = *(BYTE*)(CharSet + 3) >> 4;
if (v14 + 16 * ((*(BYTE*)(CharSet + 8) >> 5) & 1) == 31)
*(WORD*)(pPreviewObject + 592) = 5 * (unsigned __int8)(*(BYTE*)(pPreviewObject + 452) >> 3) + (*(BYTE*)(pPreviewObject + 452) & 7) + 1033;
else
*(WORD*)(pPreviewObject + 592) = (unsigned __int8)(v14 + 16 * ((*(BYTE*)(CharSet + 8) >> 5) & 1)) + 793;
v15 = *(BYTE*)(CharSet + 3) & 0xF;
if (v15 + 16 * ((*(BYTE*)(CharSet + 8) >> 4) & 1) == 31)
*(WORD*)(pPreviewObject + 624) = 5 * (unsigned __int8)(*(BYTE*)(pPreviewObject + 452) >> 3) + (*(BYTE*)(pPreviewObject + 452) & 7) + 1041;
else
*(WORD*)(pPreviewObject + 624) = (unsigned __int8)(v15 + 16 * ((*(BYTE*)(CharSet + 8) >> 4) & 1)) + 825;
v16 = *(BYTE*)(CharSet + 4) >> 4;
if (v16 + 16 * ((*(BYTE*)(CharSet + 8) >> 3) & 1) == 31)
*(WORD*)(pPreviewObject + 656) = 5 * (unsigned __int8)(*(BYTE*)(pPreviewObject + 452) >> 3) + (*(BYTE*)(pPreviewObject + 452) & 7) + 1049;
else
*(WORD*)(pPreviewObject + 656) = (unsigned __int8)(v16 + 16 * ((*(BYTE*)(CharSet + 8) >> 3) & 1)) + 857;
//-- Preview Itens do Corpo do Char
*(BYTE*)(pPreviewObject + 530) = Func_0x4FA8D0((v10 >> 6) & 7);
*(BYTE*)(pPreviewObject + 562) = Func_0x4FA8D0((v10 >> 9) & 7);
*(BYTE*)(pPreviewObject + 594) = Func_0x4FA8D0((v10 >> 12) & 7);
*(BYTE*)(pPreviewObject + 626) = Func_0x4FA8D0((v10 >> 15) & 7);
*(BYTE*)(pPreviewObject + 658) = Func_0x4FA8D0((v10 >> 18) & 7);
*(BYTE*)(pPreviewObject + 531) = *(BYTE*)(CharSet + 9) >> 7;
*(BYTE*)(pPreviewObject + 563) = (*(BYTE*)(CharSet + 9) >> 6) & 1;
*(BYTE*)(pPreviewObject + 595) = (*(BYTE*)(CharSet + 9) >> 5) & 1;
*(BYTE*)(pPreviewObject + 627) = (*(BYTE*)(CharSet + 9) >> 4) & 1;
*(BYTE*)(pPreviewObject + 659) = (*(BYTE*)(CharSet + 9) >> 3) & 1;
*(BYTE*)(pPreviewObject + 532) = *(BYTE*)(CharSet + 10) >> 7;
*(BYTE*)(pPreviewObject + 564) = (*(BYTE*)(CharSet + 10) >> 6) & 1;
*(BYTE*)(pPreviewObject + 596) = (*(BYTE*)(CharSet + 10) >> 5) & 1;
*(BYTE*)(pPreviewObject + 628) = (*(BYTE*)(CharSet + 10) >> 4) & 1;
*(BYTE*)(pPreviewObject + 660) = (*(BYTE*)(CharSet + 10) >> 3) & 1;
*(BYTE*)(pPreviewObject + 691) = (*(BYTE*)(CharSet + 9) >> 2) & 1;
*(BYTE*)(pPreviewObject + 723) = (*(BYTE*)(CharSet + 9) >> 1) & 1;
*(BYTE*)(pPreviewObject + 692) = (*(BYTE*)(CharSet + 10) >> 2) & 1;
*(BYTE*)(pPreviewObject + 724) = (*(BYTE*)(CharSet + 10) >> 1) & 1;
*(BYTE*)(pPreviewObject + 848) = *(BYTE*)(CharSet + 10) & 1;
Func_0x4038A0(pPreviewObject);
Func_0x4F9EC0(pPreviewObject);
}
return;
}
v20 = (int)Mode;
v19 = pPreviewObject;
v18 = pPreviewObject + 16;
v17 = 269;
}
else
{
*(WORD*)(pPreviewObject + 784) = v7 + 921;
if (v21)
{
if (v21 == 2)
{
v8 = 198;
}
else
{
if (v21 != 3)
goto LABEL_39;
v8 = 269;
}
}
else
{
v8 = 921;
}
if (!Mode)
{
Func_0x4342F0(v8, pPreviewObject + 16, pPreviewObject, 0);
goto LABEL_39;
}
v20 = (int)Mode;
v19 = pPreviewObject;
v18 = pPreviewObject + 16;
v17 = v8;
}
Func_0x4340D0(v17, v18, v19, v20, 0);
goto LABEL_39;
}
}
Source Liberar Options das Wings no GameServer 0.97.00
Código:
void __declspec(naked) LiberarOptionsNewWingsFix()
{
static DWORD Retornar = 0x0047F0B9;
static DWORD JmpReturn = 0x0047F05D;
__asm
{
CMP DWORD PTR SS : [EBP - 0x8] , 0x186
JNZ ITEM1
JMP JmpReturn
ITEM1 :
CMP DWORD PTR SS : [EBP - 0x8] , 0x199 //NEW Wing 01
JNZ ITEM2
JMP JmpReturn
ITEM2 :
CMP DWORD PTR SS : [EBP - 0x8] , 0x19A //NEW Wing 02
JNZ ITEM3
JMP JmpReturn
ITEM3 :
CMP DWORD PTR SS : [EBP - 0x8] , 0x19B //NEW Wing 03
JNZ ITEM4
JMP JmpReturn
ITEM4 :
CMP DWORD PTR SS : [EBP - 0x8] , 0x19C //NEW Wing 04
JNZ ITEM5
JMP JmpReturn
ITEM5 :
CMP DWORD PTR SS : [EBP - 0x8] , 0x19D //NEW Wing 05
JNZ EXIT
JMP JmpReturn
EXIT :
JMP Retornar;
}
}
Créditos: Romário Leite