WhatsApp Discord
Custom Item Stats: Aumentar Daño y Defensa (Season 6 - 1.04D) - Source Mu - Mu Server Files
 

Custom Item Stats: Aumentar Daño y Defensa (Season 6 - 1.04D)

Publicado por Dakosmu, Nov 27, 2025, 07:04 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Dakosmu

Custom Item Stats: Aumentar Daño y Defensa (Season 6 - 1.04D)



Crédito: ElfCheat

Esta guía detalla cómo implementar un sistema de estadísticas personalizadas para ítems en el cliente (Season 6 - 1.04D) utilizando archivos custom. Esto permite definir valores de Damage Min/Max y Defense/Magic Defense directamente en un archivo de texto.

---

🛠� 1. Archivos Requeridos

Necesitarás crear e incluir los siguientes archivos en tu proyecto del cliente:

  • Header: ItemInfoEx.h
  • Source: ItemInfoEx.cpp
  • Modificación: Object.h (para la estructura ObjectItem)
  • Data: client\Data\Custom\ItemInfo.txt

---

📄 2. Archivo de Datos (ItemInfo.txt)

Crea este archivo en la ruta client\Data\Custom\ItemInfo.txt. Aquí defines las estadísticas personalizadas para los ítems que desees modificar.

client\Data\Custom\ItemInfo.txt

//*****************************
//** File  : ItemInfoEx
//** Version:
//** Date  : 2020-03-31
//** Author : ElfCheat
//*****************************
//type index DamageMin DamageMax Defend MagicDefend
0 51 300 1000 0 0
8 1 0 0 1000 1000
end

* Ejemplo 1 (0 51): Ítem de tipo 0, índice 51 (Arma) tendrá un Daño Mínimo de 300 y Máximo de 1000.
* Ejemplo 2 (8 1): Ítem de tipo 8, índice 1 (Casco) tendrá Defensa de 1000 y Defensa Mágica de 1000.

---

⚙️ 3. Código del Header

ItemInfoEx.h

#define EXITEMINFO_PATH ".\\Data\\Custom\\ItemInfo.txt"

struct EXITEM {
short ItemId;
WORD DamageMin;
WORD DamageMax;
WORD Defense;
WORD MagicDefense;
};
class cItemInfoEx
{
public:
cItemInfoEx();
~cItemInfoEx();
void Load();
void Read(char*);
EXITEM* GetItemInfo(short);
private:
std::vector<EXITEM> m_data;
// ----
}; extern cItemInfoEx gItemInfoEx;

---

💻 4. Código del Source

ItemInfoEx.cpp

#include "stdafx.h"
#include "ItemInfoEx.h"
#include "ReadScript.h"
#include "TMemory.h"
#include "Util.h"
#include "Defines.h"
#include "Import.h"
#include "Object.h"



#define pGetItemAtt(id, offset) (*(DWORD*)0x8128AC0 + 84 * id + offset) //1.04D || 1.04E may be -0x150
#define pSetItemOption ((void(__cdecl*)(ObjectItem * lpItem, BYTE Option, BYTE Special, BYTE Value)) 0x58B910) //1.04D || 1.04E may be -0x150

void SetNewOption(ObjectItem * lpItem, BYTE Option, BYTE Special, BYTE Value);

cItemInfoEx gItemInfoEx;

cItemInfoEx::cItemInfoEx() {

}

cItemInfoEx::~cItemInfoEx() {

}

EXITEM* cItemInfoEx::GetItemInfo(short a1) {
for (short i = 0; i < this->m_data.size(); i++)
if (this->m_data[i].ItemId == a1)
return &this->m_data[i];
return 0;
}

void cItemInfoEx::Read(char* File) {
this->m_data.clear();

SMDToken Token;


SMDFile = fopen(File, "r");

if (SMDFile == NULL)
return;


while (true)
{
Token = (SMDToken)GetToken();

if (!strcmp("end", TokenString))
break;
// ----
EXITEM pData;

BYTE type = TokenNumber;
Token = GetToken();
pData.ItemId = ITEM(type, TokenNumber);
Token = GetToken();
pData.DamageMin = TokenNumber;
Token = GetToken();
pData.DamageMax = TokenNumber;
Token = GetToken();
pData.Defense = TokenNumber;
Token = GetToken();
pData.MagicDefense = TokenNumber;

this->m_data.push_back(pData);
}
fclose(SMDFile);
}


void cItemInfoEx::Load() {
this->Read(EXITEMINFO_PATH);

SetOp((LPVOID)0x58B77E, SetNewOption, ASM::CALL);
SetOp((LPVOID)0x5C7833, SetNewOption, ASM::CALL);
SetOp((LPVOID)0x5C7D71, SetNewOption, ASM::CALL);
SetOp((LPVOID)0x5C7F1B, SetNewOption, ASM::CALL);
SetOp((LPVOID)0x5C80BE, SetNewOption, ASM::CALL);
SetOp((LPVOID)0x7E216A, SetNewOption, ASM::CALL);
}

void SetNewOption(ObjectItem * lpItem, BYTE Option, BYTE Special, BYTE Value) {
pSetItemOption(lpItem, Option, Special, Value);

EXITEM* Exdata = gItemInfoEx.GetItemInfo(lpItem->ItemID);

if (Exdata) {
lpItem->DamageMin = Exdata->DamageMin;
lpItem->DamageMax = Exdata->DamageMax;
lpItem->Defense = Exdata->Defense;
lpItem->MagicDefense = Exdata->MagicDefense;
DWORD v6 = 0;
DWORD v7 = 0;
DWORD v8 = 0;
DWORD v9 = 0;
DWORD v10 = 0;
DWORD v13 = 0;
DWORD v14 = 0;
int v16 = Special & 0x3F;
signed int v17 = *(WORD *)pGetItemAtt(lpItem->ItemID, 32) + 30;
char v22 = 0;
int v24 = (Option >> 3) & 0xF;

if (lpItem->ItemID >= 6147 && lpItem->ItemID <= 6150
|| lpItem->ItemID >= 6180 && lpItem->ItemID <= 6184
|| lpItem->ItemID >= 6186 && lpItem->ItemID <= 6187
|| lpItem->ItemID == 19
|| lpItem->ItemID == 2066
|| lpItem->ItemID == 2570
|| lpItem->ItemID == 1037
|| lpItem->ItemID == 6686
|| lpItem->ItemID >= 6274 && lpItem->ItemID <= 6278
|| lpItem->ItemID >= 6193 && lpItem->ItemID <= 6194
|| lpItem->ItemID == 6279
|| lpItem->ItemID == 2596)
{
v16 = 0;
}

if (Value % 4 == 1 || Value % 4 == 2)
{
v16 = 1;
v22 = 1;
}

signed int v18 = 0;

switch (lpItem->ItemID)
{
case 0x406:
v18 = 15;
break;
case 0x806:
v18 = 30;
break;
case 0xA07:
v18 = 25;
break;
}

if (Exdata->DamageMin > 0)
{
if (v16 > 0 && *(WORD *)pGetItemAtt(lpItem->ItemID, 32))
{
if (v18)
lpItem->DamageMin += v18;
else
lpItem->DamageMin += (25 * Exdata->DamageMin / *(WORD *)pGetItemAtt(lpItem->ItemID, 32)) + 5;
}
if (v22)
lpItem->DamageMin += v17 / 40 + 5;
if (v24 <= 9)
v14 = (Option >> 3) & 0xF;
else
v14 = 9;
lpItem->DamageMin += 3 * v14;
switch (v24)
{
case 15:
lpItem->DamageMin += 9;
case 14:
lpItem->DamageMin += 8;
case 13:
lpItem->DamageMin += 7;
case 12:
lpItem->DamageMin += 6;
case 11:
lpItem->DamageMin += 5;
case 10:
lpItem->DamageMin += 4;
break;
default:
break;
}
}
if (Exdata->DamageMax > 0)
{
if (v16 > 0 && *(WORD *)pGetItemAtt(lpItem->ItemID, 32))
{
if (v18)
lpItem->DamageMax += v18;
else
lpItem->DamageMax += (25 * Exdata->DamageMax / *(WORD *)pGetItemAtt(lpItem->ItemID, 32)) + 5;
}
if (v22)
lpItem->DamageMax += v17 / 40 + 5;
if (v24 <= 9)
v13 = (Option >> 3) & 0xF;
else
v13 = 9;
lpItem->DamageMax += 3 * v13;
switch (v24)
{
case 15:
lpItem->DamageMax += 9;
case 14:
lpItem->DamageMax += 8;
case 13:
lpItem->DamageMax += 7;
case 12:
lpItem->DamageMax += 6;
case 11:
lpItem->DamageMax += 5;
case 10:
lpItem->DamageMax += 4;
break;
default:
break;
}
}
if (lpItem->ItemID == 6686) //???
{
lpItem->Defense = 15;
}
if (Exdata->Defense > 0)
{
if (lpItem->ItemID < 3072 || lpItem->ItemID >= 3584)
{
if (v16 > 0 && *(WORD *)pGetItemAtt(lpItem->ItemID, 32))
lpItem->Defense += 12 * Exdata->Defense / *(WORD *)pGetItemAtt(lpItem->ItemID, 32) + *(WORD *)pGetItemAtt(lpItem->ItemID, 32) / 5 + 4;
if (v22)
lpItem->Defense += 3 * lpItem->Defense / v17 + v17 / 30 + 2;
if ((lpItem->ItemID < 6147 || lpItem->ItemID > 6150) && lpItem->ItemID != 6186)
{
if (lpItem->ItemID != 6686 && lpItem->ItemID != 6193)
{
if ((lpItem->ItemID < 6180 || lpItem->ItemID > 6184)
&& lpItem->ItemID != 6187
&& lpItem->ItemID != 6194)
{
if (v24 <= 9)
v7 = (Option >> 3) & 0xF;
else
v7 = 9;
lpItem->Defense += 3 * v7;
}
else
{
if (v24 <= 9)
v8 = (Option >> 3) & 0xF;
else
v8 = 9;
lpItem->Defense += 4 * v8;
}
}
else
{
if (v24 <= 9)
v9 = (Option >> 3) & 0xF;
else
v9 = 9;
lpItem->Defense += 2 * v9;
}
}
else
{
if (v24 <= 9)
v10 = (Option >> 3) & 0xF;
else
v10 = 9;
lpItem->Defense += 2 * v10;
}
if ((lpItem->ItemID < 6180 || lpItem->ItemID > 6184)
&& lpItem->ItemID != 6187
&& lpItem->ItemID != 6194)
{
switch (v24)
{
case 15:
lpItem->Defense += 9;
case 14:
lpItem->Defense += 8;
case 13:
lpItem->Defense += 7;
case 12:
lpItem->Defense += 6;
case 11:
lpItem->Defense += 5;
case 10:
lpItem->Defense += 4;
break;
default:
break;
}
}
else
{
switch (v24)
{
case 15:
lpItem->Defense += 10;
case 14:
lpItem->Defense += 9;
case 13:
lpItem->Defense += 8;
case 12:
lpItem->Defense += 7;
case 11:
lpItem->Defense += 6;
case 10:
lpItem->Defense += 5;
break;
default:
break;
}
}
}
else
{
lpItem->Defense += v24;
if (v22)
lpItem->Defense += (unsigned int)(20 * lpItem->Defense / v17) + 2;
}
}
if (Exdata->MagicDefense > 0)
{
if (v24 <= 9)
v6 = (Option >> 3) & 0xF;
else
v6 = 9;
lpItem->MagicDefense += 3 * v6;
switch (v24)
{
case 15:
lpItem->MagicDefense += 9;
case 14:
lpItem->MagicDefense += 8;
case 13:
lpItem->MagicDefense += 7;
case 12:
lpItem->MagicDefense += 6;
case 11:
lpItem->MagicDefense += 5;
case 10:
lpItem->MagicDefense += 4;
break;
default:
break;
}
}

}
}

---

5. Verificación de la Estructura Object.h

Asegúrate de que los offsets de la estructura `ObjectItem` en tu Object.h sean correctos, especialmente para las estadísticas que estás modificando.

Object.h

#pragma pack(push, 1)
typedef struct //-> Complete (size: 107)
{
/*+0*/ short ItemID;
/*+2*/ int Level;
/*+6*/ char Unknown6;
/*+7*/ char Unknown7;
/*+8*/ char Unknown8;
/*+9*/ WORD DamageMin;
/*+11*/ WORD DamageMax;
/*+13*/ char Unknown13;
/*+14*/ WORD Defense;
/*+16*/ WORD MagicDefense;
/*+18*/ char Unknown18;
// ... (resto de la estructura)
} ObjectItem, * lpItemObj;
#pragma pack(pop)

---

🚀 Pasos Finales

  • Asegúrate de agregar ItemInfoEx.cpp a tu proyecto de Visual Studio.
  • Llama a la función de carga gItemInfoEx.Load() en el inicio de tu cliente para cargar el archivo ItemInfo.txt.
  • ¡Compila tu cliente y prueba los nuevos stats!
Bon Dia

🡱 🡳
Real Time Web Analytics