En esta publicación, quiero compartir un fragmento de código que permite cambiar las armas durante el evento Chaos Castle en MuOnline Season 6 utilizando Muemu. Este código es útil para quienes desean personalizar la experiencia de juego y mejorar la jugabilidad en este evento tan popular.
Naked(CCDK) { static ObjectPreview* gPreview; //---- _asm { MOV ECX, DWORD PTR SS : [EBP + 0x08] MOV gPreview, ECX } gPreview->WeaponFirstSlot = ITEM2(0, 22); gPreview->WeaponSecondSlot = ITEM2(0, 22); // ---- gPreview->HelmLevel = 15; gPreview->ArmorLevel = 15; gPreview->PantsLevel = 15; gPreview->GlovesLevel = 15; gPreview->BootsLevel = 15; gPreview->WeaponFirstLevel = 15; gPreview->WeaponSecondLevel = 15; // ---- gPreview->HelmExcellent = 1; gPreview->ArmorExcellent = 1; gPreview->PantsExcellent = 1; gPreview->GlovesExcellent = 1; gPreview->BootsExcellent = 1; gPreview->WeaponFirstExcellent = 1; gPreview->WeaponSecondExcellent = 1; // ---- _asm { MOV ECX, 0x004E675B JMP ECX } } SetRange((LPVOID)0x004E6730, 5, ASM::NOP); SetOp((LPVOID)0x004E6730, (LPVOID)CCDK, ASM::JMP); you cant include this code in CustomNPC. main souce.
¿Qué Hace Este Código?
El código que voy a explicar se encarga de modificar el equipo del personaje, específicamente las armas y la armadura que se utilizan en el evento. A continuación, detallo cada parte del código:
cpp
Naked(CCDK) {
static ObjectPreview* gPreview;
//----
_asm {
MOV ECX, DWORD PTR SS : [EBP + 0x08]
MOV gPreview, ECX
}
- Definición de la Función: La función
Naked(CCDK)
es donde se realiza la modificación. Se utiliza un puntero estáticogPreview
para acceder a la vista previa del objeto. - Acceso a la Vista Previa: A través de ensamblador (
_asm
), se obtiene la dirección del objeto que se va a modificar.
cpp
gPreview->WeaponFirstSlot = ITEM2(0, 22);
gPreview->WeaponSecondSlot = ITEM2(0, 22);
- Cambio de Armas: Aquí se asignan las armas a los primeros y segundos espacios de armas del objeto. En este caso, se establece el mismo ítem (arma) para ambos espacios.
cpp
// ----
gPreview->HelmLevel = 15;
gPreview->ArmorLevel = 15;
gPreview->PantsLevel = 15;
gPreview->GlovesLevel = 15;
gPreview->BootsLevel = 15;
gPreview->WeaponFirstLevel = 15;
gPreview->WeaponSecondLevel = 15;
- Niveles del Equipo: Se establecen los niveles de todos los elementos de equipo a 15, lo que significa que el personaje estará equipado con artículos de alto nivel.
cpp
// ----
gPreview->HelmExcellent = 1;
gPreview->ArmorExcellent = 1;
gPreview->PantsExcellent = 1;
gPreview->GlovesExcellent = 1;
gPreview->BootsExcellent = 1;
gPreview->WeaponFirstExcellent = 1;
gPreview->WeaponSecondExcellent = 1;
- Calidad del Equipo: Se marca cada pieza de equipo como «excelente», lo que les otorga propiedades especiales y mejores estadísticas.
cpp
// ----
_asm {
MOV ECX, 0x004E675B
JMP ECX
}
}
- Finalización de la Función: Se utiliza ensamblador nuevamente para saltar a la dirección específica donde se debe continuar la ejecución del programa.
Configuración de Rango y Operaciones
Además, se configuran rangos y operaciones para asegurarse de que el código se ejecute correctamente:
cpp
SetRange((LPVOID)0x004E6730, 5, ASM::NOP);
SetOp((LPVOID)0x004E6730, (LPVOID)CCDK, ASM::JMP);
Esto establece un rango de 5 bytes en la dirección especificada y reemplaza la operación existente con un salto a nuestra función CCDK
.
Consideraciones Finales
Es importante mencionar que este código no debe incluirse en el CustomNPC
del código fuente principal. Asegúrate de integrarlo correctamente para evitar conflictos.
Espero que este tutorial te sea útil y te ayude a personalizar tu experiencia en MuOnline. ¡No dudes en dejar tus comentarios o preguntas!