[SOURCE 5.2 BASE] Fix Sistema de Carga ItemList.xml (Full Soporte Main 5.2) - Source Mu - Mu Server Files
 

[SOURCE 5.2 BASE] Fix Sistema de Carga ItemList.xml (Full Soporte Main 5.2)

Publicado por Dakosmu, Mar 15, 2026, 04:41 PM

Tema anterior - Siguiente tema

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

Dakosmu



[SOURCE 5.2 BASE] Fix Sistema de Carga ItemList.xml (Full Soporte Main 5.2)


Actualiza la estructura de tu Source 5.2 BASE para permitir la carga de ítems mediante archivos XML. Este fix permite que tu servidor sea compatible con los archivos de ítems modernos de IGC-Network, mejorando la estabilidad y la facilidad de edición.



Mejoras introducidas en la Source 5.2
Al implementar este sistema de carga en una base 5.2, resuelves limitaciones críticas de las estructuras antiguas de ítems:
  • Compatibilidad XML: Implementación de pugixml para una lectura rápida y eficiente.
  • Soporte de Clases Season 16+: Se expande el array de clases para incluir desde el Grow Lancer hasta el Illusion Knight.
  • Atributos Modernos: Soporte para MasteryGrade, KindA/B y rutas de modelos dinámicas.
  • Gestión Multi-Lenguaje: Carga automática según la carpeta de localización activa en el cliente.

Este fix es esencial para quienes buscan modernizar una Source 5.2 BASE y quieren utilizar los archivos ItemList.xml oficiales de IGC sin errores de desalineación.



Código del Fix (CGMItemMng.cpp)
Copia y reemplaza la función de carga en tu proyecto. Recuerda verificar que las variables de clase en tu Script_Item coincidan con estos nombres.

void CGMItemMng::OpenFile(char* FileName)
{
char filename[256];
// Ruta dinámica para compatibilidad con Multi-Language en Source 5.2
sprintf_s(filename, ".\Data\Local\%s\ItemList.xml", g_strSelectedML.c_str());

pugi::xml_document file;
pugi::xml_parse_result res = file.load_file(filename);

if (res.status != pugi::status_ok)
{
return;
}

pugi::xml_node ItemList = file.child("ItemList");
int index = 0;

for (pugi::xml_node Section = ItemList.child("Section"); Section; Section = Section.next_sibling())
{
for (pugi::xml_node Item = Section.child("Item"); Item; Item = Item.next_sibling())
{
Script_Item info;

     // Lectura de Atributos Básicos
     std::string text_name = Item.attribute("Name").as_string();
     strcpy_s(info.Name, text_name.c_str());
     info.Type = Section.attribute("Index").as_int();
     info.m_byItemSlot = Item.attribute("Slot").as_int();
     info.Index = Item.attribute("Index").as_int();
     info.m_wSkillIndex = Item.attribute("SkillIndex").as_int();
     info.TwoHand = Item.attribute("TwoHand").as_int();
     info.Width = Item.attribute("Width").as_int();
     info.Height = Item.attribute("Height").as_int();
     info.Drop = Item.attribute("Drop").as_int();
     info.PowerATTK = Item.attribute("CombatPower").as_int();
     info.RequireLevel = Item.attribute("ReqLevel").as_int();
     info.DamageMin = Item.attribute("DamageMin").as_int();
     info.DamageMax = Item.attribute("DamageMax").as_int();
     info.WeaponSpeed = Item.attribute("AttackSpeed").as_int();
     info.Durability = Item.attribute("Durability").as_int();
     info.MagicDur = Item.attribute("MagicDurability").as_int();
     info.MagicPower = Item.attribute("MagicPower").as_int();
     info.RequireStrength = Item.attribute("ReqStrength").as_int();
     info.RequireDexterity = Item.attribute("ReqDexterity").as_int();
     info.RequireEnergy = Item.attribute("ReqEnergy").as_int();
     info.RequireVitality = Item.attribute("ReqVitality").as_int();
     info.RequireCharisma = Item.attribute("ReqCommand").as_int();
     info.AttType = Item.attribute("SetAttrib").as_int();
     
     // Fix de Clases para Source 5.2 Base
     info.RequireClass[0] = Item.attribute("DarkWizard").as_int();
     info.RequireClass[1] = Item.attribute("DarkKnight").as_int();
     info.RequireClass[2] = Item.attribute("FairyElf").as_int();
     info.RequireClass[3] = Item.attribute("MagicGladiator").as_int();
     info.RequireClass[4] = Item.attribute("DarkLord").as_int();
     info.RequireClass[5] = Item.attribute("Summoner").as_int();
     info.RequireClass[6] = Item.attribute("RageFighter").as_int();
     info.RequireClass[7] = Item.attribute("GrowLancer").as_int();
     info.RequireClass[8] = Item.attribute("RuneWizard").as_int();
     info.RequireClass[9] = Item.attribute("Slayer").as_int();
     info.RequireClass[10] = Item.attribute("GunCrusher").as_int();
     info.RequireClass[11] = Item.attribute("LightWizard").as_int();
     info.RequireClass[12] = Item.attribute("LemuriaMage").as_int();
     info.RequireClass[13] = Item.attribute("IllusionKnight").as_int();
     info.RequireClass[14] = Item.attribute("DarkWizard").as_int();
 
     // Flags de Ítem y Configuración IGC
     info.Type = Item.attribute("Type").as_int();
     info.Drop = Item.attribute("Dump").as_int();
     info.Trade = Item.attribute("Transaction").as_int();
     info.StorePersonal = Item.attribute("PersonalStore").as_int();
     info.WhareHouse = Item.attribute("StoreWarehouse").as_int();
     info.SellNpc = Item.attribute("SellToNPC").as_int();
     info.Expensive = Item.attribute("ExpensiveItem").as_int();
     info.Repair = Item.attribute("Repair").as_int();
     info.Kind1 = Item.attribute("KindA").as_int();
     info.Kind2 = Item.attribute("KindB").as_int();
     info.Overlap = Item.attribute("Overlap").as_int();
     info.MasteryGrade = Item.attribute("MasteryGrade").as_int();

     // Carga de Modelos
     std::string ModelPath = Item.attribute("ModelPath").as_string();
     strcpy_s(info.ModelPath, ModelPath.c_str());
     std::string ModelFile = Item.attribute("ModelFile").as_string();
     strcpy_s(info.ModelFile, ModelFile.c_str());
     
     ItemMemory[index] = info;
     index++;
  }
}
return;
}

Si al compilar notas errores en los nombres, asegúrate de guardar el archivo fuente con codificación UTF-8 (sin BOM) o ANSI para mantener la integridad de los espacios y caracteres.

Con este cambio, tu Source 5.2 BASE podrá leer cualquier ItemList.xml moderno sin crasheos al cargar los modelos o los requisitos de clase.



¿Necesitas soporte para alguna Season específica?
Si estás adaptando este código para una Season personalizada en tu Source 5.2 y tienes problemas con los índices de los ítems, deja tu duda abajo.

Regístrate para ver el enlace
Bon Dia

🡱 🡳
Real Time Web Analytics