Hola que tal, Soy nuevo en el foro. Me encuentro modificando y arreglando unas files que encontré en este foro llamadas FireTeam 1.02c que traían los sources, pude solucionar bastantes problemas y agregar ciertas funcionalidades útiles pero no puedo reparar la cantidad de alas que soporta.
La idea es agregar las alas S3, pero de manera estética, es decir un item independiente pero con las mismas propiedades de unas Wings s2. Al agregarlas al item(kor) del servidor, al mu maker y al item.bmd del cliente las alas son manejables y visibles, el problema radica en que las opciones de las mismas no aparecen o si aparece alguna, nada que ver con la de las Wings S2 que se uso de base, probe varios items.bmd, varios mains todos con los correspondientes fixes y varios clientes, todos con el mismo resultado.
Otro particular bug que existe con las Wings S3 es que al equiparselas y reloguear, las alas S3 se ven como unas S1 durante la selección de personaje.
esto se soluciona quitándoselas y volviéndoselas a poner.
Leí en foros en ingles que se trata de una limitación en el Gameserver. Los sources, trajeron un custom.cpp llamado Wings, la cual sus funciones o métodos están comentados en otras secciones del código (sus referencias, llamadas). Al intentar activarlas no hay ningún cambio ni tampoco revienta el Gs, supongo que esta incompleta.
Se programar en C++ pero estoy incursionando en todo lo que es programación de Mu, y quisiera entender el funcionamiento el gameserver a nivel interno, o que puntos claves debo tener en cuenta para poder realizar cuestiones mas complejas, me siento perdido ya que casi no hay información o comentarios en el código, se siente como desorganizado. me interesa saber sobre que tendría que buscar tutoriales.
Con respecto a las Wings.
Adjunto el Wings.cpp a ver si me pueden dar una mano.
#include "StdAfx.h"
__declspec(naked) void Wings1() // - Add Bless
{
_asm
{
PUSH ECX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX, 0x4FE36C
JMP EBX
Continue:
MOV EBX, 0x4FE32F
JMP EBX
}
}
__declspec(naked) void Wings2() // - Add Soul
{
_asm
{
PUSH EDX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX, 0x4FE8B2
JMP EBX
Continue:
MOV EBX, 0x4FE875
JMP EBX
}
}
__declspec(naked) void Wings3() // - Add Life
{
_asm
{
PUSH EDX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX, 0x4FF072
JMP EBX
Continue:
MOV EBX, 0x4FF035
JMP EBX
}
}
__declspec(naked) void Wings4() // - Move Icarus 1
{
_asm
{
PUSH ECX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX, 0x4FB54F
JMP EBX
Continue:
MOV EBX, 0x4FB59B
JMP EBX
}
}
__declspec(naked) void Wings5() // - Move Icarus 2
{
_asm
{
PUSH ECX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX, 0x51E4DE
JMP EBX
Continue:
MOV EBX, 0x51E523
JMP EBX
}
}
__declspec(naked) void Wings6() // - CItem::Convert 1
{
_asm
{
MOV EAX,DWORD PTR SS:[EBP-8]
PUSH EAX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX,0x50E4A1
JMP EBX
Continue:
MOV EBX,0x50E49D
JMP EBX
}
}
__declspec(naked) void Wings7() // - CItem::Convert 2
{
_asm
{
MOV EAX,DWORD PTR SS:[EBP-8]
PUSH EAX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX,0x50F276
JMP EBX
Continue:
MOV EBX,0x50F26D
JMP EBX
}
}
__declspec(naked) void Wings8() // - CItem::Convert 3
{
_asm
{
MOV EAX,DWORD PTR SS:[EBP-8]
PUSH EAX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX,0x50F33A
JMP EBX
Continue:
MOV EBX,0x50F2EF
JMP EBX
}
}
__declspec(naked) void Wings9() // - CItem::Convert 4
{
_asm
{
MOV EAX,DWORD PTR SS:[EBP-8]
PUSH EAX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX,0x50F54F
JMP EBX
Continue:
MOV EBX,0x50F538
JMP EBX
}
}
__declspec(naked) void Wings10() // - CItem::Convert 5
{
_asm
{
MOV EAX,DWORD PTR SS:[EBP-8]
PUSH EAX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX,0x50F74A
JMP EBX
Continue:
MOV EBX,0x50F715
JMP EBX
}
}
__declspec(naked) void Wings11() // - CItem::Convert 6
{
_asm
{
MOV EAX,DWORD PTR SS:[EBP-8]
PUSH EAX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX,0x50FA78
JMP EBX
Continue:
MOV EBX,0x50FA43
JMP EBX
}
}
__declspec(naked) void Wings12() // - CItem::Convert 7
{
_asm
{
MOV EAX,DWORD PTR SS:[EBP-8]
PUSH EAX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX,0x50FEB5
JMP EBX
Continue:
MOV EBX,0x50FDFE
JMP EBX
}
}
__declspec(naked) void Wings13() // - Move Kanturu 1
{
_asm
{
PUSH ECX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX,0x4FB8D0
JMP EBX
Continue:
MOV EBX,0x4FB918
JMP EBX
}
}
__declspec(naked) void Wings14() // - Move Kanturu 2
{
_asm
{
PUSH EDX
CALL [CheckWings]
TEST EAX,EAX
JNZ Continue
MOV EBX,0x583855
JMP EBX
Continue:
MOV EBX,0x5838E0
JMP EBX
}
}
bool CheckWings(int Index)
{
if (Index >= ITEMGET(12,44) && Index <= ITEMGET(12,66) || Index == ITEMGET(13,30))
{
return false;
}
return true;
}
BOOL gObjWingSprite(LPOBJ lpObj)
{
if (lpObj->Type != PLAYER || lpObj->pInventory[7].IsItem() == FALSE)
{
return FALSE;
}
CItem * Item = &lpObj->pInventory[7];
if ((Item->m_Type >= 0x1800 && Item->m_Type <= 0x1806) || (Item->m_Type >= 0x1824 && Item->m_Type <= 0x182B) || Item->m_Type == 0x1A1E)
{
if (Item->m_Durability > 0.0f)
{
return TRUE;
}
}
return FALSE;
}
void gObjMakePreviewCharSetEx(int aIndex)
{
gObjMakePreviewCharSet(aIndex);
if ((gObj[aIndex].pInventory[7].m_Type >= ITEMGET(12,34) && gObj[aIndex].pInventory[7].m_Type <= ITEMGET(12,66)))
{
gObj[aIndex].CharSet[5] |= CS_SET_WING(3);
gObj[aIndex].CharSet[17] |= (gObj[aIndex].pInventory[7].m_Type - ITEMGET(12,36) + 1) << 2;
}
}
bool Wings()
{
Func.HookJump(0x4FE327, Wings1);
Func.HookJump(0x4FE86D, Wings2);
Func.HookJump(0x4FF02D, Wings3);
Func.HookJump(0x4FB547, Wings4);
Func.HookJump(0x51E4D7, Wings5);
Func.HookJump(0x50E494, Wings6);
Func.HookJump(0x50F264, Wings7);
Func.HookJump(0x50F2E6, Wings8);
Func.HookJump(0x50F52F, Wings9);
Func.HookJump(0x50F70C, Wings10);
Func.HookJump(0x50FA3A, Wings11);
Func.HookJump(0x50FDF1, Wings12);
Func.HookJump(0x4FB8C8, Wings13);
Func.HookJump(0x583849, Wings14);
return true;
}
Deduzco que el problema se encuentra por el metodo MakePreviewCharSetEx pero no estoy seguro.
En el caso que sea necesario puedo adjuntar fotos.
Muchas gracias.