Merge remote-tracking branch 'origin/develop' into feature/produce-equipment

This commit is contained in:
HungDK
2026-01-16 18:31:41 +07:00
152 changed files with 3561 additions and 1646 deletions
@@ -42,6 +42,9 @@ namespace BrewMonster
else
{
BMLogger.Log("ElementDataManProvider: Successfully loaded element data");
// Build suite equip tab now that data is loaded
// 数据加载完成后构建套装装备表
BrewMonster.Network.EC_Game.BuildSuiteEquipTab();
}
}
catch (Exception ex)
@@ -204,3 +204,21 @@ public struct ROLEEXTPROP_DEF
armor = 0;
}
};
// Profession
public enum PROFESSION
{
PROF_WARRIOR = 0, // 0:
PROF_MAGE, // 1:ʦ
PROF_MONK, // 2:ʦ
PROF_HAG, // 3:
PROF_ORC, // 4:
PROF_GHOST, // 5:̿
PROF_ARCHOR, // 6:â
PROF_ANGEL, // 7:
PROF_JIANLING, // 8:
PROF_MEILING, // 9:
PROF_YEYING, // 10:ҹӰ
PROF_YUEXIAN, // 11:
NUM_PROFESSION,
};
@@ -30,6 +30,8 @@ namespace BrewMonster
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public ushort[] name; // Name
public string Name => ByteToStringUtils.UshortArrayToUnicodeString(name);
public int num_params; // Number of parameters
public int param1; // Parameter 1
public int param2; // Parameter 2
@@ -559,6 +561,8 @@ namespace BrewMonster
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public ushort[] name; // Suite name, max 15 characters
public string Name => ByteToStringUtils.UshortArrayToUnicodeString(name);
public int max_equips; // Maximum equipment in suite
[StructLayout(LayoutKind.Sequential, Pack = 1)]
@@ -25,6 +25,8 @@ namespace BrewMonster.Network
private static BrewMonster.CECStringTab m_ItemDesc; // Item desciption string table
private static BrewMonster.CECStringTab m_ItemExtDesc; // Item extend description string table
private static BrewMonster.CECStringTab m_ItemExtProp; // Item extend prop string table
private static BrewMonster.CECStringTab ItemColTab; // Item color string table
private static Dictionary<int, int> m_SuiteEquipTab; // Item suite string table
private static BrewMonster.CECStringTab m_SkillDesc = new CECStringTab(); // Skill description string table
private static BrewMonster.CECStringTab m_BuffDesc; // Buff description string table
@@ -76,7 +78,15 @@ namespace BrewMonster.Network
{
return m_ItemExtProp;
}
public static BrewMonster.CECStringTab GetItemColTab()
{
return ItemColTab;
}
public static Dictionary<int, int> GetSuiteEquipTab()
{
Debug.Log("[EC_Game] GetSuiteEquipTab: " + m_SuiteEquipTab.Count);
return m_SuiteEquipTab;
}
public static bool TryGetItemMsg(int templateId, out int messageId, out int displayMode)
{
messageId = 0;
@@ -140,6 +150,8 @@ namespace BrewMonster.Network
m_SkillDesc = new BrewMonster.CECStringTab();
m_BuffDesc = new BrewMonster.CECStringTab();
m_ItemExtProp = new BrewMonster.CECStringTab();
ItemColTab = new BrewMonster.CECStringTab();
m_SuiteEquipTab = new Dictionary<int, int>();
try
{
// Addressables-only loading (no StreamingAssets/configs file IO).
@@ -174,10 +186,17 @@ namespace BrewMonster.Network
{
Debug.LogWarning("[EC_Game] Failed to load item_ext_prop.txt");
}
var itemColTa = Addressables.LoadAssetAsync<TextAsset>("Assets/Addressable/item_col.txt").WaitForCompletion();
if (!ItemColTab.InitFromTextAsset(itemColTa, true))
{
Debug.LogWarning("[EC_Game] Failed to load item_col.txt");
}
// Note: There's no buff_desc.txt file in the configs folder
// You may need to create this file or use a different source for buff descriptions
// (If you add it to Addressables later, load it here.)
// BuildSuiteEquipTab() is now called from ElementDataManProvider after data is loaded
// BuildSuiteEquipTab() 现在在 ElementDataManProvider 数据加载完成后调用
// Load item message map (template -> message id)
LoadItemMsgMap();
@@ -433,6 +452,86 @@ namespace BrewMonster.Network
map = list[0].strMap;
return true;
}
/// <summary>
/// Build suite equip tab mapping. Must be called after m_pElementDataMan is initialized and data is loaded.
/// 构建套装装备表映射。必须在 m_pElementDataMan 初始化且数据加载完成后调用。
/// </summary>
public static void BuildSuiteEquipTab()
{
if (m_pElementDataMan == null)
{
return;
}
// Ensure m_SuiteEquipTab is initialized
// 确保 m_SuiteEquipTab 已初始化
if (m_SuiteEquipTab == null)
{
m_SuiteEquipTab = new Dictionary<int, int>();
}
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
elementdataman _edm = ElementDataManProvider.GetElementDataMan();
for (int i = 0; i < _edm.essence_id_data_type_map.Count; i++)
{
uint tid = _edm.get_data_id(ID_SPACE.ID_SPACE_ESSENCE, i, ref DataType);
object pData = _edm.get_data_ptr(tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
switch (DataType)
{
case DATA_TYPE.DT_SUITE_ESSENCE:
SUITE_ESSENCE pSuiteEss = (SUITE_ESSENCE)pData;
pSuiteEss.max_equips = 0;
for (int j=0; j<12; j++)
{
if( pSuiteEss.equipments[j].id != 0 )
{
pSuiteEss.max_equips ++;
int index = (int)pSuiteEss.equipments[j].id;
m_SuiteEquipTab[index] = (int)tid;
}
}
break;
case DATA_TYPE.DT_POKER_SUITE_ESSENCE:
POKER_SUITE_ESSENCE pPokerSuiteEss = (POKER_SUITE_ESSENCE)pData;
for (int j=0; j<6; j++)
{
if( pPokerSuiteEss.list[j] != 0 )
{
int index = (int)pPokerSuiteEss.list[j];
m_SuiteEquipTab[index] = (int)tid;
}
}
break;
case DATA_TYPE.DT_FASHION_SUITE_ESSENCE:
FASHION_SUITE_ESSENCE pFashionSuiteEss = (FASHION_SUITE_ESSENCE)pData;
for (int j=0; j<6; j++)
{
if( pFashionSuiteEss.list[j] != 0 )
{
int index = (int)pFashionSuiteEss.list[j];
m_SuiteEquipTab[index] = (int)tid;
}
}
break;
}
}
}
public static int GetItemNameColorIdx(int tid, int iDefIndex = 0)
{
int iIndex = iDefIndex;
string color = ItemColTab.GetWideString(tid);
if (!string.IsNullOrEmpty(color))
iIndex = color.GetHashCode();
if (iIndex < 0 || iIndex >= 10)
{
iIndex = 0;
}
return iIndex;
}
#endregion
}
}
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
namespace BrewMonster.Scripts.Managers
@@ -24,13 +25,13 @@ namespace BrewMonster.Scripts.Managers
IVTRTYPE_TRASHBOX2 = 4, // Trash box - material box
IVTRTYPE_TRASHBOX3 = 5, // Trash box - fashion box
IVTRTYPE_ACCOUNT_BOX = 6, // User account box
IVTRTYPE_GENERALCARD_BOX = 7; // 卡牌包裹
IVTRTYPE_GENERALCARD_BOX = 7; // ư
};
// 注意 IVTRTYPE_CLIENT_GENERALCARD_PACK 枚举值不能喝上面的 Inventory type 值重复!!
// ע IVTRTYPE_CLIENT_GENERALCARD_PACK öֵܺ Inventory type ֵظ
public static class IVTRTYPE_PACK_CLIENT_GENERALCAR
{
public const int IVTRTYPE_CLIENT_GENERALCARD_PACK = 1024; // 客户端本地包裹, 由于卡牌图鉴要求对已获得卡牌通过聊天发送。为了统一处理聊天窗口的物品,添加本地包裹。
public const int IVTRTYPE_CLIENT_GENERALCARD_PACK = 1024; // ͻ˱ذ ڿͼҪѻÿͨ͡ΪͳһڵƷӱذ
};
public EC_Inventory()
@@ -168,14 +169,7 @@ namespace BrewMonster.Scripts.Managers
{
return false;
}
var newItem = new EC_IvtrItem(tid, iExpireDate)
{
Slot = firstEmpty,
State = 0,
Crc = 0,
Content = null
};
var newItem = EC_IvtrItem.CreateItem(tid, iExpireDate, iAmount);
newItem.SetCount(iAmount);
m_aItems[firstEmpty] = newItem;
@@ -203,15 +197,7 @@ namespace BrewMonster.Scripts.Managers
if (pDst == null)
{
var clone = new EC_IvtrItem(pSrc.GetTemplateID(), pSrc.GetExpireDate())
{
Slot = iDest,
Package = pSrc.Package,
State = pSrc.State,
Crc = pSrc.Crc,
Content = pSrc.Content != null ? (byte[])pSrc.Content.Clone() : null
};
clone.SetCount(iAmount);
var clone = EC_IvtrItem.CreateItem(pSrc.GetTemplateID(), pSrc.GetExpireDate(), iAmount);
m_aItems[iDest] = clone;
}
else
@@ -85,7 +85,7 @@ namespace BrewMonster.Scripts.Managers
private byte currentSelectedPackage;
private int currentSelectedSlot;
private EC_IvtrItem currentSelectedItem;
private EC_IvtrEquip currentSelectedEquipment;
private EC_IvtrItem currentSelectedEquipment;
private const byte PKG_INVENTORY = 0;
private const byte PKG_EQUIPMENT = 1;
@@ -281,18 +281,12 @@ namespace BrewMonster.Scripts.Managers
/// <summary>
/// Create EC_IvtrEquip object from InventoryItemData
/// </summary>
private EC_IvtrEquip CreateEquipmentFromItemData(EC_IvtrItem itemData)
private EC_IvtrItem CreateEquipmentFromItemData(EC_IvtrItem itemData)
{
if (itemData == null)
return null;
var equipment = new EC_IvtrEquip(itemData.m_tid, itemData.m_expire_date);
// Set basic properties (use default values since InventoryItemData doesn't have these)
equipment.Price = 0;
equipment.Count = itemData.m_iCount;
equipment.PriceScale = 1.0f;
equipment.ScaleType = 0;
var equipment = EC_IvtrItem.CreateItem(itemData.m_tid, itemData.m_expire_date, itemData.m_iCount);
// Parse item info if available (use Content field)
if (itemData.Content != null && itemData.Content.Length > 0)
@@ -856,11 +850,11 @@ namespace BrewMonster.Scripts.Managers
string fullDesc = null;
if (showEquipmentDetails && currentSelectedEquipment != null)
{
fullDesc = currentSelectedEquipment.GetDesc();
fullDesc = currentSelectedEquipment.GetDesc(EC_IvtrItem.DescType.DESC_NORMAL, EC_Game.GetGameRun().GetHostPlayer().GetEquipment());
}
else
{
fullDesc = item.GetDesc();
fullDesc = item.GetDesc(EC_IvtrItem.DescType.DESC_NORMAL, EC_Game.GetGameRun().GetHostPlayer().GetEquipment());
}
if (!string.IsNullOrEmpty(fullDesc))
@@ -880,55 +874,7 @@ namespace BrewMonster.Scripts.Managers
// C++ code doesn't check IsInitialized() - it just calls GetWideString() directly
// 完全按照C++代码获取扩展描述:g_pGame->GetItemExtDesc(m_tid)
// C++代码不检查IsInitialized() - 它直接调用GetWideString()
string szExtDesc = null;
try
{
var itemExtDescTab = EC_Game.GetItemExtDesc();
if (itemExtDescTab != null)
{
// First try to get mapped message ID (like TryGetItemExtDesc does)
// 首先尝试获取映射的消息ID(如TryGetItemExtDesc所做)
if (EC_Game.TryGetItemMsg(item.m_tid, out int messageId, out int displayMode))
{
szExtDesc = itemExtDescTab.GetWideString(messageId);
}
// Fallback: direct lookup using tid (exactly like C++: m_ItemExtDesc.GetWideString(tid))
// 回退:直接使用tid查找(完全像C++m_ItemExtDesc.GetWideString(tid)
if (string.IsNullOrEmpty(szExtDesc))
{
szExtDesc = itemExtDescTab.GetWideString(item.m_tid);
}
}
}
catch (System.Exception ex)
{
// Only log once to avoid spam
// 仅记录一次以避免垃圾日志
if (!m_HasLoggedExtDescError)
{
Debug.LogWarning($"[InventoryUI] Error getting extended description: {ex.Message}");
m_HasLoggedExtDescError = true;
}
}
// Display extended description if found (exactly like C++ checks: if (!szExtDesc || !szExtDesc[0]))
// 如果找到扩展描述则显示(完全像C++检查:if (!szExtDesc || !szExtDesc[0])
string displayText = !string.IsNullOrEmpty(szExtDesc)
? szExtDesc.Replace("\\r", "\n")
: "";
// Debug logging to diagnose issues
// 调试日志以诊断问题
if (string.IsNullOrEmpty(displayText))
{
Debug.Log($"[InventoryUI] Extended description is empty for tid={item.m_tid}. szExtDesc was null/empty.");
}
else
{
Debug.Log($"[InventoryUI] Found extended description for tid={item.m_tid}, length={displayText.Length}");
}
// Setup equip and drop buttons
SetupEquipButton(package, item);
SetupDropButton(package, item);
@@ -937,17 +883,7 @@ namespace BrewMonster.Scripts.Managers
// 先显示面板
ShowDetailPanel(true);
// Set text directly - if this causes rebuild issues, we'll use coroutine
// 直接设置文本 - 如果这导致重建问题,我们将使用协程
if (extendedDescText != null)
{
extendedDescText.Set(displayText);
Debug.Log($"[InventoryUI] Set extended description text, extendedDescText is {(extendedDescText == null ? "null" : "not null")}");
}
else
{
Debug.LogWarning("[InventoryUI] extendedDescText is null! Check Inspector assignment.");
}
}
private void SetupEquipButton(byte package, EC_IvtrItem item)
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: c94b2c779cdb94d398d4aa10eb44cac6
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 50210c0839c503b42843db0237a9c3a8
@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 423a6efd71f143f08096d684ca414bba
timeCreated: 1757752654
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c5535276db3184cac9313d3cc28bca47
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -77,7 +77,7 @@ namespace PerfectWorld.Scripts.Managers
public EC_IvtrArmor(int tid, int expire_date) : base(tid, expire_date)
{
m_iCID = ICID_WEAPON;
m_iCID = (int)InventoryClassId.ICID_ARMOR;
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
m_pDBEssence = (ARMOR_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
@@ -86,7 +86,7 @@ namespace PerfectWorld.Scripts.Managers
m_iPileLimit = m_pDBEssence.pile_num_max;
m_iPrice = m_pDBEssence.price;
m_iShopPrice = m_pDBEssence.shop_price;
m_i64EquipMask = EC_IvtrEquip.ICID_WEAPON;
m_i64EquipMask = m_pDBSubType.equip_mask;
m_iProcType = (int)m_pDBEssence.proc_type;
FixProps = m_pDBEssence.fixed_props;
@@ -499,6 +499,7 @@ namespace PerfectWorld.Scripts.Managers
AddSharpenerDesc();
AddEngravedDesc();
AddMakerDesc();
m_strDesc += "\\r";
AddSuiteDesc();
AddExtDescText();
return m_strDesc;
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 30e9ab67f87a542d59ff94440cb4e78c
@@ -0,0 +1,16 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrArmorrune : EC_IvtrItem
{
public EC_IvtrArmorrune(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrArmorrune(EC_IvtrArmorrune other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a1e7bdbebb3744fd78b3c9906d93f2ab
@@ -0,0 +1,14 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrArrow : EC_IvtrEquip
{
public EC_IvtrArrow(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrArrow(EC_IvtrArrow other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: d252cb1fcb2e946688fd6836548fd0d4
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrAutoHp : EC_IvtrItem
{
public EC_IvtrAutoHp(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrAutoHp(EC_IvtrAutoHp other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 67deebf01a6fc4678a8eb801cae72d0e
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrAutoMp : EC_IvtrItem
{
public EC_IvtrAutoMp(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrAutoMp(EC_IvtrAutoMp other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 5e4aa169619834c7fa8e2421d81b9f36
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrBible : EC_IvtrItem
{
public EC_IvtrBible(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrBible(EC_IvtrBible other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: f352a8dce1daf4a078e5f1df0222d854
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrCertificate : EC_IvtrItem
{
public EC_IvtrCertificate(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrCertificate(EC_IvtrCertificate other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 150298d1bd0fb446a8cc9231d5145cad
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrCongregate : EC_IvtrItem
{
public EC_IvtrCongregate(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrCongregate(EC_IvtrCongregate other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: bf279660c3b2b4027bc9d97e691c1870
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrDamagerune : EC_IvtrItem
{
public EC_IvtrDamagerune(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrDamagerune(EC_IvtrDamagerune other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: d2481f9333ffc4852bb83fb78511f6da
@@ -0,0 +1,79 @@
///////////////////////////////////////////////////////////////////////////
//
// Define and Macro
//
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//
// Reference to External variables and functions
//
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//
// Local Types and Variables and Global variables
//
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//
// Local functions
//
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//
// Implement CECIvtrDecoration
//
///////////////////////////////////////////////////////////////////////////
using BrewMonster;
using ModelRenderer.Scripts.GameData;
using System.Collections.Generic;
using BrewMonster.Network;
using BrewMonster.Scripts.Managers;
using BrewMonster.Scripts;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrDecoration : EC_IvtrEquip
{
protected IVTR_ESSENCE_DECORATION m_Essence;
protected DECORATION_MAJOR_TYPE m_pDBMajorType;
protected DECORATION_SUB_TYPE m_pDBSubType;
protected DECORATION_ESSENCE m_pDBEssence;
public EC_IvtrDecoration(int tid, int expire_date) : base(tid, expire_date)
{
m_iCID = (int)InventoryClassId.ICID_DECORATION;
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
m_pDBEssence = (DECORATION_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
m_pDBMajorType = (DECORATION_MAJOR_TYPE)pDB.get_data_ptr(m_pDBEssence.id_major_type, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
m_pDBSubType = (DECORATION_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_mask;
m_iProcType = (int)m_pDBEssence.proc_type;
FixProps = m_pDBEssence.fixed_props;
RepairFee = m_pDBEssence.repairfee;
ReputationReq = m_pDBEssence.require_reputation;
}
public EC_IvtrDecoration(EC_IvtrDecoration other) : base(other)
{
m_pDBEssence = other.m_pDBEssence;
m_pDBMajorType = other.m_pDBMajorType;
m_pDBSubType = other.m_pDBSubType;
m_Essence = other.m_Essence;
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 238a4e2d1554d44b0a9f3f283a9badd7
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrDestroyingEssence : EC_IvtrItem
{
public EC_IvtrDestroyingEssence(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrDestroyingEssence(EC_IvtrDestroyingEssence other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 584e97711b3bb4f97a18866bd56ce985
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrDoubleExp : EC_IvtrItem
{
public EC_IvtrDoubleExp(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrDoubleExp(EC_IvtrDoubleExp other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 684f0b389343e420dbf9d02a184554b8
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrDyeTicket : EC_IvtrItem
{
public EC_IvtrDyeTicket(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrDyeTicket(EC_IvtrDyeTicket other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 2b30a0678c3bb488e8579f6b1cff0847
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrDynSkillEquip : EC_IvtrEquip
{
public EC_IvtrDynSkillEquip(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrDynSkillEquip(EC_IvtrDynSkillEquip other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a1a5aae82e25b4ce5aeb499cb804f9fa
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrElement : EC_IvtrItem
{
public EC_IvtrElement(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrElement(EC_IvtrElement other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 28e3dc4074f0246449da8b794ca2a018
@@ -15,6 +15,8 @@ using System.Reflection;
using BrewMonster.Scripts.Managers;
using BrewMonster.Scripts;
using UnityEngine.AddressableAssets;
using CSNetwork.Protocols;
using Unity.VisualScripting;
namespace PerfectWorld.Scripts.Managers
{
@@ -26,12 +28,75 @@ namespace PerfectWorld.Scripts.Managers
{
#region Constants and Enums
// Item Class IDs
public const int ICID_EQUIP = 1;
public const int ICID_WEAPON = 2;
public enum EQUIP_CLASS_ID
{
ICID_ITEM = -100,
ICID_EQUIP = -101,
ICID_ARMOR = 0,
ICID_ARMORRUNE,
ICID_ARROW,
ICID_DECORATION,
ICID_DMGRUNE,
ICID_ELEMENT,
ICID_FASHION,
ICID_FLYSWORD,
ICID_MATERIAL,
ICID_MEDICINE,
ICID_REVSCROLL,
ICID_SKILLTOME,
ICID_TOSSMAT,
ICID_TOWNSCROLL,
ICID_UNIONSCROLL,
ICID_WEAPON,
ICID_TASKITEM,
ICID_STONE,
ICID_WING,
ICID_TASKDICE,
ICID_TASKNMMATTER,
ICID_ERRORITEM,
ICID_FACETICKET,
ICID_FACEPILL,
ICID_GM_GENERATOR,
ICID_RECIPE,
ICID_PETEGG,
ICID_PETFOOD,
ICID_PETFACETICKET,
ICID_FIREWORK,
ICID_TANKCALLIN,
ICID_SKILLMATTER,
ICID_REFINETICKET,
ICID_DESTROYINGESSENCE,
ICID_BIBLE,
ICID_SPEAKER,
ICID_AUTOHP,
ICID_AUTOMP,
ICID_DOUBLEEXP,
ICID_TRANSMITSCROLL,
ICID_DYETICKET,
ICID_GOBLIN,
ICID_GOBLIN_EQUIP,
ICID_GOBLIN_EXPPILL,
ICID_CERTIFICATE,
ICID_TARGETITEM,
ICID_LOOKINFOITEM,
ICID_INCSKILLABILITY,
ICID_WEDDINGBOOKCARD,
ICID_WEDDINGINVITECARD,
ICID_SHARPENER,
ICID_FACTIONMATERIAL,
ICID_CONGREGATE,
ICID_FORCETOKEN,
ICID_DYNSKILLEQUIP,
ICID_MONEYCONVERTIBLE,
ICID_MONSTERSPIRIT,
ICID_GENERALCARD,
ICID_GENERALCARD_DICE,
ICID_SHOPTOKEN,
ICID_UNIVERSAL_TOKEN,
}
// Item Made From Types
public enum ITEM_MAKE_TAG
public enum ITEM_MAKE_TAG
{
IMT_NULL,
IMT_CREATE, // GM
@@ -109,6 +174,9 @@ namespace PerfectWorld.Scripts.Managers
// Basic Item Properties
public int TemplateId { get; set; }
public int ExpireDate { get; set; }
/// <summary>
/// class id
/// </summary>
public int CID { get; set; }
public int Price { get; set; }
public int Count { get; set; }
@@ -506,7 +574,7 @@ namespace PerfectWorld.Scripts.Managers
{
TemplateId = tid;
ExpireDate = expireDate;
CID = ICID_EQUIP;
CID = (int)InventoryClassId.ICID_EQUIP;
Price = 0;
Count = 1;
PriceScale = 1.0f;
@@ -583,7 +651,6 @@ namespace PerfectWorld.Scripts.Managers
// [6 x short requirements][2 x int endurance][short essenceSize][maker info][essence bytes][short numHole][WORD stoneMask][numHole x int holes][int numProp][props]
if (TryParseEquipInfoNative(infoData, dataLen))
{
BMLogger.Log("CECIvtrEquip::SetItemInfo, native order success");
ParseProperties();
return true;
}
@@ -591,7 +658,6 @@ namespace PerfectWorld.Scripts.Managers
// Fallback to legacy/custom order if server payload differs
if (TryParseEquipInfoLegacy(infoData, dataLen))
{
BMLogger.Log("CECIvtrEquip::SetItemInfo, legacy order success");
ParseProperties();
return true;
}
@@ -1233,7 +1299,6 @@ namespace PerfectWorld.Scripts.Managers
}
}
Debug.Log($"[EC_IvtrEquip] Loaded {s_propIdToType.Count} property mappings from Addressables");
}
else
{
@@ -1304,7 +1369,7 @@ namespace PerfectWorld.Scripts.Managers
/// <summary>
/// Decide equipment name color
/// </summary>
public int DecideNameCol()
protected override int DecideNameCol()
{
int index = GetColorStrID(TemplateId);
if (index >= 0)
@@ -1329,10 +1394,16 @@ namespace PerfectWorld.Scripts.Managers
/// <summary>
/// Get color string ID for template
/// </summary>
private int GetColorStrID(int templateId)
public override int GetColorStrID(int templateId)
{
// This would normally query the game's color system
return -1;
int iIndex = EC_Game.GetItemNameColorIdx(templateId);
if (iIndex <= 0)
return -1;
else if (iIndex < 7)
return (int)DescriptipionMsg.ITEMDESC_COL_LIGHTBLUE + iIndex - 1;
else
return (int)DescriptipionMsg.ITEMDESC_COL2_START + iIndex - 7 + 1;
}
#endregion
@@ -1409,7 +1480,7 @@ namespace PerfectWorld.Scripts.Managers
// 5) Add-on properties (non-embedded, non-suite, non-engraved)
if (!string.IsNullOrEmpty(strAddon))
m_strDesc += strAddon;
AddPriceDesc(white, false);
// 6) Tessera / stones (socketed gems)
BuildTesseraDesc();
@@ -1425,10 +1496,10 @@ namespace PerfectWorld.Scripts.Managers
// 10) Maker & destroying info if any
AddMakerDesc();
// Destroying description is added by caller when needed; keep it optional here.
m_strDesc += "\\r";
AddExtDescText();
Debug.Log("m_strDesc add ext desc text: " + m_strDesc);
// 11) Price (sell price scaled)
AddPriceDesc(white, false);
return m_strDesc;
}
@@ -2177,6 +2248,11 @@ namespace PerfectWorld.Scripts.Managers
public int GetSuiteID()
{
// This would normally query the game's suite equip table
Dictionary<int, int> suiteEquipTab = EC_Game.GetSuiteEquipTab();
if (suiteEquipTab.TryGetValue(GetTemplateID(), out int suiteId))
{
return suiteId;
}
return 0;
}
@@ -4134,6 +4210,19 @@ namespace PerfectWorld.Scripts.Managers
}
}
struct SUITEITEM
{
public bool bEnabled;
public int tid;
public char[] szName;
public string Name => new string(szName);
public SUITEITEM(bool bEnabled, int tid)
{
this.bEnabled = bEnabled;
this.tid = tid;
this.szName = new char[32];
}
}
/// <summary>
/// Add suite description
/// </summary>
@@ -4152,63 +4241,128 @@ namespace PerfectWorld.Scripts.Managers
// ASSERT in C++
return;
}
// In C#, we'd need to cast to SUITE_ESSENCE struct
// For now, use placeholder values
string suiteName = "Suite"; // TODO: Get from SUITE_ESSENCE.name
int maxEquips = 12; // TODO: Get from SUITE_ESSENCE.max_equips
// Get host player (would normally come from EC_Game.GetGameRun().GetHostPlayer())
// Check if this equipment is in host's equipment pack
bool showDetail = false; // TODO: Check if m_pDescIvtr == pHostPlayer->GetEquipment()
SUITE_ESSENCE pSuiteEss = (SUITE_ESSENCE)pData;
CECHostPlayer hostPlayer = EC_Game.GetGameRun().GetHostPlayer();
// Colors
int nameCol = DecideNameCol();
int iNameCol = DecideNameCol();
int lblue = (int)DescriptipionMsg.ITEMDESC_COL_LIGHTBLUE;
int green = (int)DescriptipionMsg.ITEMDESC_COL_GREEN;
int gray = (int)DescriptipionMsg.ITEMDESC_COL_GRAY;
int white = (int)DescriptipionMsg.ITEMDESC_COL_WHITE;
int yellow = (int)DescriptipionMsg.ITEMDESC_COL_YELLOW;
// Save current description
string strCurDesc = m_strDesc;
if (!showDetail)
bool bShowDetail = true;
if (hostPlayer.GetEquipment() != m_pDescIvtr)
bShowDetail = false;
else
{
// Isn't equipment inventory, only add total suite number info.
for(int i = 0; i < m_pDescIvtr.GetSize(); i++)
{
EC_IvtrItem pItem = m_pDescIvtr.GetItem(i);
if (pItem == null)
{
bShowDetail = false;
continue;
}
if (pItem.m_tid == this.m_tid)
{
bShowDetail = true;
break;
}
}
}
if (!bShowDetail)
{
m_strDesc = "\\r\\r";
AddDescText(nameCol, false, "{0} ({1})", suiteName, maxEquips);
AddDescText(iNameCol, true, "{0} {1}/{2}", pSuiteEss.Name, 0, pSuiteEss.max_equips);
m_strDesc = strCurDesc + m_strDesc;
return;
}
// Maximum number of suite items
// Maximum number of suite items
const int MAX_NUM = 12;
SUITEITEM[] aSuiteItems = new SUITEITEM[MAX_NUM];
// Get equipped suite item list
int[] aEquipped = new int[MAX_NUM];
int itemCnt = 0; // TODO: Get from pHostPlayer->GetEquippedSuiteItem(idSuite, aEquipped)
if (itemCnt == 0)
return;
m_strDesc = "\\r\\r";
// Build suite addon properties at first
if (itemCnt > 1)
int maxEquips = (pSuiteEss.max_equips > MAX_NUM) ? MAX_NUM : (int)pSuiteEss.max_equips;
for(int i = 0; i < maxEquips; i++)
{
// Change color
AddDescText(lblue, false, "");
// In C++, this loops through suite addons and displays them
// For now, skip detailed addon display
aSuiteItems[i].bEnabled = false;
aSuiteItems[i].tid = (int)pSuiteEss.equipments[i].id;
aSuiteItems[i].szName = new char[32];
aSuiteItems[i].szName[0] = '\0';
EC_IvtrItem pEquipItem = CreateItem((int)pSuiteEss.equipments[i].id, 0,1);
if (pEquipItem != null)
{
aSuiteItems[i].szName = pEquipItem.GetName().ToCharArray();
//delete pEquipItem;
}
else
{
aSuiteItems[i].tid = 0;
}
}
int iItemCnt;
int[] aEquipped = new int[MAX_NUM];
iItemCnt = hostPlayer.GetEquippedSuiteItem(idSuite,ref aEquipped);
if(iItemCnt == 0) return;
m_strDesc += "\\r\\r";
// Build suite addon properties at first
for (int i = 0; i < MAX_NUM; i++)
{
for(int j = 0; j < iItemCnt; j++)
{
if (aSuiteItems[i].tid == aEquipped[j])
{
aSuiteItems[i].bEnabled = true;
break;
}
}
}
// Add suite name
AddDescText(yellow, true, "{0} ({1} / {2})", suiteName, itemCnt, maxEquips);
// List suite item names would go here
// In C++, this creates SUITEITEM array and lists enabled/disabled items
// green, gray, white colors would be used here for enabled/disabled items
// For now, simplified version
if(iItemCnt > 1)
{
// Change color
AddDescText(lblue, false, "");
for (int i=1; i < iItemCnt; i++)
{
int idProp = (int)pSuiteEss.addons[i-1].id;
if (idProp == 0)
continue;
pData = dataMan.get_data_ptr((uint)idProp, ID_SPACE.ID_SPACE_ADDON, ref dataType);
if (dataType != DATA_TYPE.DT_EQUIPMENT_ADDON)
{
continue;
}
EQUIPMENT_ADDON pAddOn = (EQUIPMENT_ADDON)pData;
AddDescText(-1, false, "(%d) ", i+1);
AddDescText(-1, true, "%s", pAddOn.Name);
}
}
// Add suite name
AddDescText(yellow/*iNameCol*/, true, "{0} ({1} / {2})", pSuiteEss.Name, iItemCnt, pSuiteEss.max_equips);
for (int i=0; i < pSuiteEss.max_equips; i++)
{
SUITEITEM suiteItem = aSuiteItems[i];
if (suiteItem.tid == 0)
continue;
int col = suiteItem.bEnabled ? green : gray;
bool bRet = (i == pSuiteEss.max_equips-1) ? false : true;
// Add item name
AddDescText(col, bRet, " %s", suiteItem.Name);
}
}
/// <summary>
/// Add destroying description
/// </summary>
@@ -4493,27 +4647,22 @@ namespace PerfectWorld.Scripts.Managers
if (string.IsNullOrEmpty(Maker))
return;
BMLogger.Log("[THN]EC_IvtrEquip: AddMakerDesc: Maker: " + Maker);
m_strDesc += "\\r";
m_strDesc += "\\r";
// For signed marks (IMT_SIGN), Maker already contains color codes and formatted text.
if (MadeFrom == (byte)ITEM_MAKE_TAG.IMT_SIGN)
{
BMLogger.Log("[THN]EC_IvtrEquip: AddMakerDesc IF: Maker: " + Maker);
m_strDesc += Maker;
}
else
{
BMLogger.Log("[THN]EC_IvtrEquip: AddMakerDesc ELSE: Maker: " + Maker);
// Normal "made by" line using item-desc string if available
string fmt = GetItemDescString(DescriptipionMsg.ITEMDESC_MADEFROM);
if (string.IsNullOrEmpty(fmt))
{
fmt = "Made by {0}";
}
BMLogger.Log("[THN]EC_IvtrEquip: AddMakerDesc ELSE: fmt: " + fmt);
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_GREEN, false, fmt, Maker);
BMLogger.Log("[THN]EC_IvtrEquip: AddMakerDesc ELSE: m_strDesc: " + m_strDesc);
}
}
}
/// <summary>
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: f740d7d39c73f41a7a352c569c5442db
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrFacePill : EC_IvtrItem
{
public EC_IvtrFacePill(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrFacePill(EC_IvtrFacePill other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a8785f321cb1c42e784355f0e452a2f8
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrFaceTicket : EC_IvtrItem
{
public EC_IvtrFaceTicket(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrFaceTicket(EC_IvtrFaceTicket other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 97a6a36bce3c046a88e5c12e8ac79b03
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrFactionMaterial : EC_IvtrItem
{
public EC_IvtrFactionMaterial(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrFactionMaterial(EC_IvtrFactionMaterial other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: e3a3f865615ba4eaca9942d99698c332
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrFashion : EC_IvtrItem
{
public EC_IvtrFashion(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrFashion(EC_IvtrFashion other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 8cbdfe37e56eb46be91ac835220dfb25
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrFirework : EC_IvtrItem
{
public EC_IvtrFirework(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrFirework(EC_IvtrFirework other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 9a4c28d0768f341b2aef5ec207875a31
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrFlysword : EC_IvtrItem
{
public EC_IvtrFlysword(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrFlysword(EC_IvtrFlysword other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 76745e0d1f528425eac71363b77c8cdd
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrForceToken : EC_IvtrItem
{
public EC_IvtrForceToken(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrForceToken(EC_IvtrForceToken other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: de39c4a9aa1e1434c96ce485ea144291
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrGeneralCard : EC_IvtrItem
{
public EC_IvtrGeneralCard(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrGeneralCard(EC_IvtrGeneralCard other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: bfe40c592c38542d2a590310173f5c8c
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrGeneralCardDice : EC_IvtrItem
{
public EC_IvtrGeneralCardDice(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrGeneralCardDice(EC_IvtrGeneralCardDice other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: ab3e2b5b4e09949a69cfc003d0103804
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrGmGenerator : EC_IvtrItem
{
public EC_IvtrGmGenerator(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrGmGenerator(EC_IvtrGmGenerator other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 92617801fcd734adfa84fb4d4ca84f0c
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrGoblin : EC_IvtrItem
{
public EC_IvtrGoblin(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrGoblin(EC_IvtrGoblin other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: c8726058514b64b129c6b619e7e1d3fa
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrGoblinEquip : EC_IvtrEquip
{
public EC_IvtrGoblinEquip(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrGoblinEquip(EC_IvtrGoblinEquip other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 89be2e126b8d44151bdd559226b0f306
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrGoblinExpPill : EC_IvtrItem
{
public EC_IvtrGoblinExpPill(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrGoblinExpPill(EC_IvtrGoblinExpPill other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 4b383fd16faa444fa8dc9a5c4e4aac86
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrIncSkillAbility : EC_IvtrItem
{
public EC_IvtrIncSkillAbility(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrIncSkillAbility(EC_IvtrIncSkillAbility other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 4050b6d604fee48c399953ca2707f650
@@ -167,17 +167,14 @@ namespace BrewMonster.Scripts.Managers
}
}
Debug.Log($"[Inventory] Loaded multi-sprite atlas with {atlasSprites.Length} sprites");
}
else
{
Debug.LogWarning("[Inventory] Failed to load multi-sprite atlas: iconlist_ivtrm_multisprite");
_multiSpriteAtlas = new Sprite[0]; // Prevent repeated loading attempts
}
}
catch (Exception ex)
{
Debug.LogError($"[Inventory] Error loading multi-sprite atlas: {ex.Message}");
_multiSpriteAtlas = new Sprite[0]; // Prevent repeated loading attempts
}
}
@@ -332,7 +329,6 @@ namespace BrewMonster.Scripts.Managers
try
{
var val = getNameMethod.Invoke(data, null) as string;
Debug.Log($"[Inventory] GetName method result: '{val}' (length: {val?.Length ?? 0})");
if (!string.IsNullOrEmpty(val) && !string.IsNullOrWhiteSpace(val)) return val;
}
catch (Exception ex)
@@ -459,15 +455,12 @@ namespace BrewMonster.Scripts.Managers
ci += extraLen;
}
var item = new EC_IvtrItem(tid, expireDate)
{
Package = byPackage,
Slot = slotIndex,
State = state,
Crc = crc,
Content = extra
};
item.SetCount(amount);
var item = EC_IvtrItem.CreateItem(tid, expireDate, amount);
item.Package = byPackage;
item.Slot = slotIndex;
item.State = state;
item.Crc = crc;
item.Content = extra;
items.Add(item);
}
@@ -814,16 +807,191 @@ namespace BrewMonster.Scripts.Managers
var pItem = new EC_IvtrItem(tid, expire_date);
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
object data = ElementDataManProvider.GetElementDataMan().get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
Debug.Log("DataType: " + DataType);
switch(DataType)
{
case DATA_TYPE.DT_WEAPON_ESSENCE:
pItem = new EC_IvtrWeapon(tid, expire_date);
break;
case DATA_TYPE.DT_PROJECTILE_ESSENCE:
pItem = new EC_IvtrArrow(tid, expire_date);
break;
case DATA_TYPE.DT_ARMOR_ESSENCE:
pItem = new EC_IvtrArmor(tid, expire_date);
break;
case DATA_TYPE.DT_DECORATION_ESSENCE:
pItem = new EC_IvtrDecoration(tid, expire_date);
break;
case DATA_TYPE.DT_FASHION_ESSENCE:
pItem = new EC_IvtrFashion(tid, expire_date);
break;
case DATA_TYPE.DT_MEDICINE_ESSENCE:
pItem = new EC_IvtrMedicine(tid, expire_date);
break;
case DATA_TYPE.DT_MATERIAL_ESSENCE:
pItem = new EC_IvtrMaterial(tid, expire_date);
break;
case DATA_TYPE.DT_DAMAGERUNE_ESSENCE:
pItem = new EC_IvtrDamagerune(tid, expire_date);
break;
case DATA_TYPE.DT_ARMORRUNE_ESSENCE:
pItem = new EC_IvtrArmorrune(tid, expire_date);
break;
case DATA_TYPE.DT_SKILLTOME_ESSENCE:
pItem = new EC_IvtrSkilltome(tid, expire_date);
break;
case DATA_TYPE.DT_FLYSWORD_ESSENCE:
pItem = new EC_IvtrFlysword(tid, expire_date);
break;
case DATA_TYPE.DT_TOWNSCROLL_ESSENCE:
pItem = new EC_IvtrTownscroll(tid, expire_date);
break;
case DATA_TYPE.DT_UNIONSCROLL_ESSENCE:
pItem = new EC_IvtrUnionscroll(tid, expire_date);
break;
case DATA_TYPE.DT_REVIVESCROLL_ESSENCE:
pItem = new EC_IvtrRevScroll(tid, expire_date);
break;
case DATA_TYPE.DT_ELEMENT_ESSENCE:
pItem = new EC_IvtrElement(tid, expire_date);
break;
case DATA_TYPE.DT_TOSSMATTER_ESSENCE:
pItem = new EC_IvtrTossMat(tid, expire_date);
break;
case DATA_TYPE.DT_TASKMATTER_ESSENCE:
pItem = new EC_IvtrTaskmatter(tid, expire_date);
break;
case DATA_TYPE.DT_STONE_ESSENCE:
pItem = new EC_IvtrStone(tid, expire_date);
break;
case DATA_TYPE.DT_WINGMANWING_ESSENCE:
pItem = new EC_IvtrWing(tid, expire_date);
break;
case DATA_TYPE.DT_TASKDICE_ESSENCE:
pItem = new EC_IvtrTaskDice(tid, expire_date);
break;
case DATA_TYPE.DT_TASKNORMALMATTER_ESSENCE:
pItem = new EC_IvtrTaskNmMatter(tid, expire_date);
break;
case DATA_TYPE.DT_FACETICKET_ESSENCE:
pItem = new EC_IvtrFaceTicket(tid, expire_date);
break;
case DATA_TYPE.DT_FACEPILL_ESSENCE:
pItem = new EC_IvtrFacePill(tid, expire_date);
break;
case DATA_TYPE.DT_GM_GENERATOR_ESSENCE:
pItem = new EC_IvtrGmGenerator(tid, expire_date);
break;
case DATA_TYPE.DT_RECIPE_ESSENCE:
pItem = new EC_IvtrRecipe(tid, expire_date);
break;
case DATA_TYPE.DT_PET_EGG_ESSENCE:
pItem = new EC_IvtrPetEgg(tid, expire_date);
break;
case DATA_TYPE.DT_PET_FOOD_ESSENCE:
pItem = new EC_IvtrPetFood(tid, expire_date);
break;
case DATA_TYPE.DT_PET_FACETICKET_ESSENCE:
pItem = new EC_IvtrPetFaceTicket(tid, expire_date);
break;
case DATA_TYPE.DT_FIREWORKS_ESSENCE:
pItem = new EC_IvtrFirework(tid, expire_date);
break;
case DATA_TYPE.DT_WAR_TANKCALLIN_ESSENCE:
pItem = new EC_IvtrWarTankCallin(tid, expire_date);
break;
case DATA_TYPE.DT_SKILLMATTER_ESSENCE:
pItem = new EC_IvtrSkillMat(tid, expire_date);
break;
case DATA_TYPE.DT_INC_SKILL_ABILITY_ESSENCE:
pItem = new EC_IvtrIncSkillAbility(tid, expire_date);
break;
case DATA_TYPE.DT_REFINE_TICKET_ESSENCE:
pItem = new EC_IvtrRefineTicket(tid, expire_date);
break;
case DATA_TYPE.DT_DESTROYING_ESSENCE:
pItem = new EC_IvtrDestroyingEssence(tid, expire_date);
break;
case DATA_TYPE.DT_BIBLE_ESSENCE:
pItem = new EC_IvtrBible(tid, expire_date);
break;
case DATA_TYPE.DT_SPEAKER_ESSENCE:
pItem = new EC_IvtrSpeaker(tid, expire_date);
break;
case DATA_TYPE.DT_AUTOHP_ESSENCE:
pItem = new EC_IvtrAutoHp(tid, expire_date);
break;
case DATA_TYPE.DT_AUTOMP_ESSENCE:
pItem = new EC_IvtrAutoMp(tid, expire_date);
break;
case DATA_TYPE.DT_DOUBLE_EXP_ESSENCE:
pItem = new EC_IvtrDoubleExp(tid, expire_date);
break;
case DATA_TYPE.DT_DYE_TICKET_ESSENCE:
pItem = new EC_IvtrDyeTicket(tid, expire_date);
break;
case DATA_TYPE.DT_TRANSMITSCROLL_ESSENCE:
pItem = new EC_IvtrTransmitScroll(tid, expire_date);
break;
case DATA_TYPE.DT_GOBLIN_ESSENCE:
pItem = new EC_IvtrGoblin(tid, expire_date);
break;
case DATA_TYPE.DT_GOBLIN_EQUIP_ESSENCE:
pItem = new EC_IvtrGoblinEquip(tid, expire_date);
break;
case DATA_TYPE.DT_GOBLIN_EXPPILL_ESSENCE:
pItem = new EC_IvtrGoblinExpPill(tid, expire_date);
break;
case DATA_TYPE.DT_SELL_CERTIFICATE_ESSENCE:
pItem = new EC_IvtrCertificate(tid, expire_date);
break;
case DATA_TYPE.DT_TARGET_ITEM_ESSENCE:
pItem = new EC_IvtrTargetItem(tid, expire_date);
break;
case DATA_TYPE.DT_LOOK_INFO_ESSENCE:
pItem = new EC_IvtrLookInfoItem(tid, expire_date);
break;
case DATA_TYPE.DT_WEDDING_BOOKCARD_ESSENCE:
pItem = new EC_IvtrWeddingBookCard(tid, expire_date);
break;
case DATA_TYPE.DT_WEDDING_INVITECARD_ESSENCE:
pItem = new EC_IvtrWeddingInviteCard(tid, expire_date);
break;
case DATA_TYPE.DT_SHARPENER_ESSENCE:
pItem = new EC_IvtrSharpener(tid, expire_date);
break;
case DATA_TYPE.DT_FACTION_MATERIAL_ESSENCE:
pItem = new EC_IvtrFactionMaterial(tid, expire_date);
break;
case DATA_TYPE.DT_CONGREGATE_ESSENCE:
pItem = new EC_IvtrCongregate(tid, expire_date);
break;
case DATA_TYPE.DT_FORCE_TOKEN_ESSENCE:
pItem = new EC_IvtrForceToken(tid, expire_date);
break;
case DATA_TYPE.DT_DYNSKILLEQUIP_ESSENCE:
pItem = new EC_IvtrDynSkillEquip(tid, expire_date);
break;
case DATA_TYPE.DT_MONEY_CONVERTIBLE_ESSENCE:
pItem = new EC_IvtrMoneyConvertible(tid, expire_date);
break;
case DATA_TYPE.DT_MONSTER_SPIRIT_ESSENCE:
pItem = new EC_IvtrMonsterSpirit(tid, expire_date);
break;
case DATA_TYPE.DT_POKER_ESSENCE:
pItem = new EC_IvtrGeneralCard(tid, expire_date);
break;
case DATA_TYPE.DT_POKER_DICE_ESSENCE:
pItem = new EC_IvtrGeneralCardDice(tid, expire_date);
break;
case DATA_TYPE.DT_SHOP_TOKEN_ESSENCE:
pItem = new EC_IvtrShopToken(tid, expire_date);
break;
case DATA_TYPE.DT_UNIVERSAL_TOKEN_ESSENCE:
pItem = new EC_IvtrUniversalToken(tid, expire_date);
break;
default:
BMLogger.Log("[THN]EC_IvtrItem: CreateItem: Default Item: tid: " + tid + ", expire_date: " + expire_date + ", pItem: " + pItem.GetName());
pItem = new EC_IvtrUnknown(tid, expire_date);
break;
}
pItem.SetCount(iCount);
@@ -965,7 +1133,7 @@ namespace BrewMonster.Scripts.Managers
/// <summary>Clone item (shallow copy, same as C++ default).</summary>
public virtual EC_IvtrItem Clone()
{
return new EC_IvtrItem(this);
return CreateItem(m_tid, m_expire_date, m_iCount, m_iCID);
}
/// <summary>Get item cool time in milliseconds (0 by default).</summary>
@@ -1298,10 +1466,23 @@ namespace BrewMonster.Scripts.Managers
// Add special properties description / 添加特殊属性描述
var pDescTab = EC_Game.GetItemDesc();
// Note: ITEMDESC_COL2_BRIGHTBLUE constant - adjust based on actual string table / 注意:ITEMDESC_COL2_BRIGHTBLUE常量 - 根据实际字符串表调整
int green = 1000; // ITEMDESC_COL2_BRIGHTBLUE placeholder - adjust this value
int green = (int)DescriptipionMsg.ITEMDESC_COL2_BRIGHTBLUE; // ITEMDESC_COL2_BRIGHTBLUE placeholder - adjust this value
if(typeof(EC_IvtrArmor) == this.GetType())
{
Debug.Log("This is an armor");
}
Debug.Log("armor m_iCID: " + m_iCID);
Debug.Log("armor m_iProcType: " + m_iProcType);
if (m_iCID != (int)InventoryClassId.ICID_GOBLIN) // goblin does not need to display these special properties / 地精不需要显示这些特殊属性
{
Debug.Log("m_iCID != (int)InventoryClassId.ICID_GOBLIN");
Debug.Log("m_iProcType: " + m_iProcType);
Debug.Log("m_iProcType & (int)ProcType.PROC_NO_USER_TRASH: " + (m_iProcType & (int)ProcType.PROC_NO_USER_TRASH));
Debug.Log("!((m_iProcType & (int)ProcType.PROC_BINDING) != 0): " + !((m_iProcType & (int)ProcType.PROC_BINDING) != 0));
Debug.Log("((m_iProcType & (int)ProcType.PROC_DROPWHENDIE) != 0): " + ((m_iProcType & (int)ProcType.PROC_DROPWHENDIE) != 0));
Debug.Log("((m_iProcType & (int)ProcType.PROC_DROPPABLE) != 0): " + ((m_iProcType & (int)ProcType.PROC_DROPPABLE) != 0));
Debug.Log("((m_iProcType & (int)ProcType.PROC_SELLABLE) != 0): " + ((m_iProcType & (int)ProcType.PROC_SELLABLE) != 0));
// Exact C++ logic: (PROC_NO_USER_TRASH) || (!PROC_BINDING && (PROC_DROPWHENDIE || ...))
// 精确的C++逻辑:(PROC_NO_USER_TRASH) || (!PROC_BINDING && (PROC_DROPWHENDIE || ...))
if ((m_iProcType & (int)ProcType.PROC_NO_USER_TRASH) != 0
@@ -1325,121 +1506,140 @@ namespace BrewMonster.Scripts.Managers
m_strDesc += szCol;
}
}
// Note: These message IDs are placeholders - adjust based on actual string table / 注意:这些消息ID是占位符 - 根据实际字符串表调整
Debug.Log("m_iProcType: " + m_iProcType);
Debug.Log("m_iProcType & (int)ProcType.PROC_DROPWHENDIE: " + (m_iProcType & (int)ProcType.PROC_DROPWHENDIE));
if ((m_iProcType & (int)ProcType.PROC_DROPWHENDIE) != 0)
{
m_strDesc += "\\r";
if (pDescTab != null && pDescTab.IsInitialized())
{
// ITEMDESC_DEAD_PROTECT placeholder - adjust this value
string desc = pDescTab.GetWideString(2000); // Placeholder ID
string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_DEAD_PROTECT);
if (!string.IsNullOrEmpty(desc))
m_strDesc += desc;
}
Debug.Log("m_strDesc: " + m_strDesc);
}
Debug.Log("m_iProcType: " + m_iProcType);
Debug.Log("m_iProcType & (int)ProcType.PROC_DROPPABLE: " + (m_iProcType & (int)ProcType.PROC_DROPPABLE));
if ((m_iProcType & (int)ProcType.PROC_DROPPABLE) != 0)
{
m_strDesc += "\\r";
if (pDescTab != null && pDescTab.IsInitialized())
{
// ITEMDESC_NO_DROP placeholder - adjust this value
string desc = pDescTab.GetWideString(2001); // Placeholder ID
string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NO_DROP);
if (!string.IsNullOrEmpty(desc))
m_strDesc += desc;
}
Debug.Log("m_strDesc: " + m_strDesc);
}
Debug.Log("m_iProcType: " + m_iProcType);
Debug.Log("m_iProcType & (int)ProcType.PROC_SELLABLE: " + (m_iProcType & (int)ProcType.PROC_SELLABLE));
if ((m_iProcType & (int)ProcType.PROC_SELLABLE) != 0)
{
m_strDesc += "\\r";
if (pDescTab != null && pDescTab.IsInitialized())
{
// ITEMDESC_NO_TRADE placeholder - adjust this value
string desc = pDescTab.GetWideString(2002); // Placeholder ID
string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NO_TRADE);
if (!string.IsNullOrEmpty(desc))
m_strDesc += desc;
}
Debug.Log("m_strDesc: " + m_strDesc);
}
Debug.Log("m_iProcType: " + m_iProcType);
Debug.Log("m_iProcType & (int)ProcType.PROC_TRADEABLE: " + (m_iProcType & (int)ProcType.PROC_TRADEABLE));
if ((m_iProcType & (int)ProcType.PROC_TRADEABLE) != 0)
{
m_strDesc += "\\r";
if (pDescTab != null && pDescTab.IsInitialized())
{
// ITEMDESC_NO_PLAYER_TRADE placeholder - adjust this value
string desc = pDescTab.GetWideString(2003); // Placeholder ID
string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NO_PLAYER_TRADE);
if (!string.IsNullOrEmpty(desc))
m_strDesc += desc;
}
Debug.Log("m_strDesc: " + m_strDesc);
}
Debug.Log("m_iProcType: " + m_iProcType);
Debug.Log("m_iProcType & (int)ProcType.PROC_DISAPEAR: " + (m_iProcType & (int)ProcType.PROC_DISAPEAR));
if ((m_iProcType & (int)ProcType.PROC_DISAPEAR) != 0)
{
m_strDesc += "\\r";
if (pDescTab != null && pDescTab.IsInitialized())
{
// ITEMDESC_LEAVE_SCENE_DISAPEAR placeholder - adjust this value
string desc = pDescTab.GetWideString(2004); // Placeholder ID
string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_LEAVE_SCENE_DISAPEAR);
if (!string.IsNullOrEmpty(desc))
m_strDesc += desc;
}
Debug.Log("m_strDesc: " + m_strDesc);
}
Debug.Log("m_iProcType: " + m_iProcType);
Debug.Log("m_iProcType & (int)ProcType.PROC_USE: " + (m_iProcType & (int)ProcType.PROC_USE));
if ((m_iProcType & (int)ProcType.PROC_USE) != 0)
{
m_strDesc += "\\r";
if (pDescTab != null && pDescTab.IsInitialized())
{
// ITEMDESC_USE_AFTER_PICK_UP placeholder - adjust this value
string desc = pDescTab.GetWideString(2005); // Placeholder ID
string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_USE_AFTER_PICK_UP);
if (!string.IsNullOrEmpty(desc))
m_strDesc += desc;
}
Debug.Log("m_strDesc: " + m_strDesc);
}
Debug.Log("m_iProcType: " + m_iProcType);
Debug.Log("m_iProcType & (int)ProcType.PROC_DEADDROP: " + (m_iProcType & (int)ProcType.PROC_DEADDROP));
if ((m_iProcType & (int)ProcType.PROC_DEADDROP) != 0)
{
m_strDesc += "\\r";
if (pDescTab != null && pDescTab.IsInitialized())
{
// ITEMDESC_DROP_WHEN_DEAD placeholder - adjust this value
string desc = pDescTab.GetWideString(2006); // Placeholder ID
string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_DROP_WHEN_DEAD);
if (!string.IsNullOrEmpty(desc))
m_strDesc += desc;
}
Debug.Log("m_strDesc: " + m_strDesc);
}
Debug.Log("m_iProcType: " + m_iProcType);
Debug.Log("m_iProcType & (int)ProcType.PROC_OFFLINE: " + (m_iProcType & (int)ProcType.PROC_OFFLINE));
if ((m_iProcType & (int)ProcType.PROC_OFFLINE) != 0)
{
m_strDesc += "\\r";
if (pDescTab != null && pDescTab.IsInitialized())
{
// ITEMDESC_DROP_WHEN_OFFLINE placeholder - adjust this value
string desc = pDescTab.GetWideString(2007); // Placeholder ID
string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_DROP_WHEN_OFFLINE);
if (!string.IsNullOrEmpty(desc))
m_strDesc += desc;
}
Debug.Log("m_strDesc: " + m_strDesc);
}
Debug.Log("m_iProcType: " + m_iProcType);
Debug.Log("m_iProcType & (int)ProcType.PROC_UNREPAIRABLE: " + (m_iProcType & (int)ProcType.PROC_UNREPAIRABLE));
if ((m_iProcType & (int)ProcType.PROC_UNREPAIRABLE) != 0)
{
m_strDesc += "\\r";
if (pDescTab != null && pDescTab.IsInitialized())
{
// ITEMDESC_UNREPAIRABLE placeholder - adjust this value
string desc = pDescTab.GetWideString(2008); // Placeholder ID
string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_UNREPAIRABLE);
if (!string.IsNullOrEmpty(desc))
m_strDesc += desc;
}
Debug.Log("m_strDesc: " + m_strDesc);
}
Debug.Log("m_iProcType: " + m_iProcType);
Debug.Log("m_iProcType & (int)ProcType.PROC_NO_USER_TRASH: " + (m_iProcType & (int)ProcType.PROC_NO_USER_TRASH));
if ((m_iProcType & (int)ProcType.PROC_NO_USER_TRASH) != 0)
{
m_strDesc += "\\r";
if (pDescTab != null && pDescTab.IsInitialized())
{
// ITEMDESC_NO_USER_TRASH placeholder - adjust this value
string desc = pDescTab.GetWideString(2009); // Placeholder ID
string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NO_USER_TRASH);
if (!string.IsNullOrEmpty(desc))
m_strDesc += desc;
}
Debug.Log("m_strDesc: " + m_strDesc);
}
}
else
{
Debug.Log("m_iCID == (int)InventoryClassId.ICID_GOBLIN");
TrimLastReturn();
}
}
@@ -1516,7 +1716,7 @@ namespace BrewMonster.Scripts.Managers
str = iPrice.ToString();
}
protected int GetColorStrID(int tid)
public virtual int GetColorStrID(int templateId)
{
// Placeholder: color index lookup; return -1 (white) by default.
return -1;
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 566fc2d24eefe48e7bd10ed67d15563f
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrLookInfoItem : EC_IvtrItem
{
public EC_IvtrLookInfoItem(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrLookInfoItem(EC_IvtrLookInfoItem other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 384fce986646f438698912f0c15b9ba8
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrMaterial : EC_IvtrItem
{
public EC_IvtrMaterial(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrMaterial(EC_IvtrMaterial other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: e681cc9149ec5499fa6584a02a3916e1
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrMedicine : EC_IvtrItem
{
public EC_IvtrMedicine(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrMedicine(EC_IvtrMedicine other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: ed110c7e41c6f437791bdf92da68019c
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrMoneyConvertible : EC_IvtrItem
{
public EC_IvtrMoneyConvertible(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrMoneyConvertible(EC_IvtrMoneyConvertible other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 6b6e854a6db4c4d87aaaeba867d72bae
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrMonsterSpirit : EC_IvtrItem
{
public EC_IvtrMonsterSpirit(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrMonsterSpirit(EC_IvtrMonsterSpirit other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: b3ec2fe733bae45c982969aed8b8eae0
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrPetEgg : EC_IvtrItem
{
public EC_IvtrPetEgg(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrPetEgg(EC_IvtrPetEgg other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 31d39c5195d7e45fa91082d7db9b3204
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrPetFaceTicket : EC_IvtrItem
{
public EC_IvtrPetFaceTicket(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrPetFaceTicket(EC_IvtrPetFaceTicket other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 7c61b694d841e4db5ac2811b04531e7f
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrPetFood : EC_IvtrItem
{
public EC_IvtrPetFood(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrPetFood(EC_IvtrPetFood other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 5d8c5f936052f4ed0b63e061797eefbb
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrRecipe : EC_IvtrItem
{
public EC_IvtrRecipe(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrRecipe(EC_IvtrRecipe other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 8aa46bf1a8e2045fcb18711081dcfe56
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrRefineTicket : EC_IvtrItem
{
public EC_IvtrRefineTicket(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrRefineTicket(EC_IvtrRefineTicket other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 4b2d8c8d5a4104436b97dfb062ddea9e
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrRevScroll : EC_IvtrItem
{
public EC_IvtrRevScroll(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrRevScroll(EC_IvtrRevScroll other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 372c6fa94e6ba473a89724868d182446
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrSharpener : EC_IvtrItem
{
public EC_IvtrSharpener(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrSharpener(EC_IvtrSharpener other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 3745d3b71429d4e70bd85ff957d53edd
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrShopToken : EC_IvtrItem
{
public EC_IvtrShopToken(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrShopToken(EC_IvtrShopToken other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: cbc68d3b08ef143159eed39309cbb601
@@ -0,0 +1,15 @@
using BrewMonster.Scripts.Managers;
namespace PerfectWorld.Scripts.Managers
{
public class EC_IvtrSkillMat : EC_IvtrItem
{
public EC_IvtrSkillMat(int tid, int expire_date) : base(tid, expire_date)
{
}
public EC_IvtrSkillMat(EC_IvtrSkillMat other) : base(other)
{
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 8345b2a53fffb4e638d9712b6e9e49fa

Some files were not shown because too many files have changed in this diff Show More