Files
2026-04-06 13:39:39 +07:00

245 lines
9.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Reflection;
using System.IO;
using BrewMonster;
using ModelRenderer.Scripts.Common;
using ModelRenderer.Scripts.GameData;
using UnityEngine;
using PerfectWorld.Scripts.Managers;
using BrewMonster.Network;
using BrewMonster.Scripts.Managers;
using BrewMonster.Scripts;
using CSNetwork.GPDataType;
using System.Runtime.InteropServices;
namespace BrewMonster.Scripts
{
public class EC_IvtrFashion : EC_IvtrEquip
{
protected int m_iGender; // required gender
protected ushort m_wColor; // color in X1R5G5B5 format
protected uint m_color; // color in X8R8G8B8 format
protected IVTR_ESSENCE_FASHION m_Essence; // Fashion essence data
// Data in database
protected FASHION_MAJOR_TYPE m_pDBMajorType;
protected FASHION_SUB_TYPE m_pDBSubType;
protected FASHION_ESSENCE m_pDBEssence;
/// <summary>
/// Not create logic yet (add summary later)
/// </summary>
/// <param name="tid">Template id</param>
/// <param name="expire_date">Expire date</param>
public EC_IvtrFashion(int tid, int expire_date) : base(tid, expire_date)
{
m_iCID = (int)InventoryClassId.ICID_FASHION;
m_Essence = new IVTR_ESSENCE_FASHION();
// Get database data
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
m_pDBEssence = (FASHION_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
m_pDBMajorType = (FASHION_MAJOR_TYPE)pDB.get_data_ptr(m_pDBEssence.id_major_type, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
m_pDBSubType = (FASHION_SUB_TYPE)pDB.get_data_ptr(m_pDBEssence.id_sub_type, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
m_iPileLimit = m_pDBEssence.pile_num_max;
m_iPrice = m_pDBEssence.price;
m_iShopPrice = m_pDBEssence.shop_price;
m_i64EquipMask = m_pDBSubType.equip_fashion_mask;
m_iProcType = (int)m_pDBEssence.proc_type;
// reset the info
DefaultInfo();
}
public EC_IvtrFashion(EC_IvtrFashion other) : base(other)
{
m_pDBEssence = other.m_pDBEssence;
m_pDBMajorType = other.m_pDBMajorType;
m_pDBSubType = other.m_pDBSubType;
m_Essence = other.m_Essence;
m_iGender = other.m_iGender;
m_wColor = other.m_wColor;
m_color = other.m_color;
}
// Set item detail information
public override bool SetItemInfo(byte[] pInfoData, int iDataLen)
{
// Note: because fashion is not an absolute equipment, so skip
// CECIvtrEquip::SetItemInfo().
if (pInfoData == null || iDataLen == 0)
{
m_bNeedUpdate = false;
return true;
}
try
{
CECDataReader dr = new CECDataReader(pInfoData, iDataLen);
var size = Marshal.SizeOf<IVTR_ESSENCE_FASHION>();
m_Essence = new IVTR_ESSENCE_FASHION(dr.ReadData(size));
}
catch (Exception e)
{
Debug.LogError("CECIvtrFashion::SetItemInfo, data read error (" + e.GetType() + e.StackTrace + ")");
return false;
}
LevelReq = m_Essence.require_level;
m_wColor = m_Essence.color;
m_iGender = m_Essence.gender;
m_color = (uint)FASHION_WORDCOLOR_TO_A3DCOLOR(m_wColor).GetHashCode();
m_bNeedUpdate = false;
return true;
}
// Get item default information from database
public override void DefaultInfo()
{
LevelReq = m_pDBEssence.require_level;
m_wColor = 0x7fff;
m_iGender = m_pDBEssence.gender;
m_color = 0xffffffff;
// these data also stored in essence, sync it here
m_Essence.require_level = LevelReq;
m_Essence.color = m_wColor;
m_Essence.gender = (ushort)m_iGender;
}
public static Color FASHION_WORDCOLOR_TO_A3DCOLOR(ushort color)
{
return new Color(((color & (0x1f << 10)) >> 7), ((color & (0x1f << 5)) >> 2), ((color & 0x1f) << 3));
}
public ushort GetWordColor() { return m_wColor; }
public string GetSubTypeName()
{
// Try Unicode first (for Vietnamese/wide char names), then fallback to CP936
if (m_pDBSubType.name != null && m_pDBSubType.name.Length > 0)
{
string s = ByteToStringUtils.UshortArrayToUnicodeString(m_pDBSubType.name);
if (!string.IsNullOrEmpty(s) && !string.IsNullOrWhiteSpace(s))
return s;
// Fallback to legacy CP936 if Unicode was empty
s = ByteToStringUtils.UshortArrayToCP936String(m_pDBSubType.name);
if (!string.IsNullOrEmpty(s))
return s;
}
return "";
}
protected override string GetNormalDesc(bool bRepair)
{
if (m_bNeedUpdate)
return "";
m_strDesc = "";
// Try to build item description
CECStringTab pDescTab = EC_Game.GetItemDesc();
CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer();
int white = (int)DescriptipionMsg.ITEMDESC_COL_WHITE;
int red = (int)DescriptipionMsg.ITEMDESC_COL_RED;
int namecol = DecideNameCol();
// Item name
AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), GetName());
AddIDDescText();
AddBindDescText();
AddExpireTimeDesc();
// Sub class name
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_CLASSNAME), GetSubTypeName());
// Color
// Use m_iScaleType == SCALE_BUY to judge whether this item is in NPC's pack,
// this may not be a valid way
if (m_pDBEssence.equip_location != (int)enumSkinShow.enumSkinShowArmet && m_pDBEssence.equip_location != (int)enumSkinShow.enumSkinShowHand)
{
if (m_iScaleType == (int)EC_IvtrItem.ScaleType.SCALE_BUY)
{
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_COLOR));
AddDescText(white, true, (" ???"));
}
else
{
// Extract RGB components from m_color (X8R8G8B8 format)
int colorRed = (int)((m_color >> 16) & 0xFF);
int colorGreen = (int)((m_color >> 8) & 0xFF);
int colorBlue = (int)(m_color & 0xFF);
string szCol = string.Format("^{0:X2}{1:X2}{2:X2}", colorRed, colorGreen, colorBlue);
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_COLOR));
m_strDesc += " ";
AddDescText(-1, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_COLORRECT), szCol);
}
}
// Level requirment
if (LevelReq > 0)
{
int lcol = pHost.GetMaxLevelSofar() >= LevelReq ? white : red;
AddDescText(lcol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_LEVELREQ), LevelReq);
}
// fashion weapon profession requirment and weapon action type
if (m_pDBEssence.equip_location == (int)enumSkinShow.enumSkinShowHand)
{
AddDescText(-1, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_LEVEL), m_pDBEssence.level);
AddProfReqDesc(m_pDBEssence.character_combo_id);
AddActionTypeDescText((int)m_pDBEssence.action_type);
}
// Gender requirement
CECStringTab pFixMsg = EC_Game.GetFixedMsgs();
int col = (pHost.GetGender() == m_iGender) ? white : red;
AddDescText(col, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GENDERREQ));
m_strDesc += " ";
if (m_iGender == (int)GENDER.GENDER_MALE)
AddDescText(col, true, pFixMsg.GetWideString((int)FixedMsg.FIXMSG_GENDER_MALE));
else
AddDescText(col, true, pFixMsg.GetWideString((int)FixedMsg.FIXMSG_GENDER_FEMALE));
// Price
AddPriceDesc(white, bRepair);
// Fashion level
if (m_pDBEssence.level > 0)
{
m_strDesc += "\\r";
m_strDesc += pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_COL_WHITE);
for (int i=0; i < m_pDBEssence.level; i++)
m_strDesc += pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PENTAGON);
}
// Extend description
AddExtDescText();
return m_strDesc;
}
public bool HasRandomProp()
{
return false;
}
// Get drop model for shown
public override string GetDropModel()
{
return m_pDBEssence.FileMatter;
}
public int GetFashionSuiteID()
{
Dictionary<int, int> suiteEquipTab = EC_Game.GetSuiteEquipTab();
return suiteEquipTab.ContainsKey(TemplateId) ? suiteEquipTab[TemplateId] : 0;
}
}
}