diff --git a/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset b/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset index 4f0fadf383..3a4fb1f552 100644 --- a/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset +++ b/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset @@ -31,3 +31,5 @@ MonoBehaviour: prefab: {fileID: 5750242998044155948, guid: ecf0d8daf08db6f4a8d94a4bb07847ec, type: 3} - id: Win_Inventory prefab: {fileID: 5910006447059157136, guid: 22d3972b131ebdb4288f9cbdf996d691, type: 3} + - id: Win_Enchase + prefab: {fileID: 5636724581774400035, guid: de6ac6f2630425044a55299c703670f1, type: 3} diff --git a/Assets/PerfectWorld/Scripts/Common/DataProcess/generate_item_temp.cs b/Assets/PerfectWorld/Scripts/Common/DataProcess/generate_item_temp.cs index 484ff2555f..26c91dfd33 100644 --- a/Assets/PerfectWorld/Scripts/Common/DataProcess/generate_item_temp.cs +++ b/Assets/PerfectWorld/Scripts/Common/DataProcess/generate_item_temp.cs @@ -347,7 +347,7 @@ public static class generate_item_temp itemdataman.set_to_classid(DATA_TYPE.DT_WEAPON_ESSENCE, data, -1); return 0; } - private static void generate_magic_defense(int[] res, List res_list , RAND_CLASS cls, + private static void generate_magic_defense(int[] res, List res_list , RAND_CLASS cls, bool b_fixed = false) // { float[] count_prop = {0.35f,0.25f,0.20f,0.15f,0.05f,0.051f}; @@ -403,6 +403,7 @@ public static class generate_item_temp data = new byte[size]; int offset = 0; short hole_num = 0; + if(normal_addon == GEN_ADDON_MODE.ADDON_LIST_DROP) { float[] drop_probability_socket = { ess.drop_probability_socket0, ess.drop_probability_socket1, ess.drop_probability_socket2 }; @@ -519,7 +520,7 @@ public static class generate_item_temp WriteInt(data, ref offset, element_data.RandNormal(ess.mp_enhance_low, ess.mp_enhance_high, cls, LOWER.LOWER_TREND)); WriteInt(data, ref offset, element_data.RandNormal(ess.hp_enhance_low, ess.hp_enhance_high, cls, LOWER.LOWER_TREND)); int[] res = {0,0,0,0,0}; - List res_list = ess.magic_defences.ToList(); + List res_list = ess.magic_defences.ToList(); generate_magic_defense(res, res_list, cls, ess.force_all_magic_defences != 0 || ess.fixed_props!=0); WriteInt(data, ref offset, res[0]); WriteInt(data, ref offset, res[1]); @@ -558,6 +559,366 @@ public static class generate_item_temp itemdataman.set_to_classid(DATA_TYPE.DT_ARMOR_ESSENCE, data, -1); return 0; } + public static int generate_decoration(uint id, ID_SPACE idspace, out byte[] data, out uint size, RAND_CLASS cls, + GEN_ADDON_MODE normal_addon ,item_tag_t tag,List sa_list = null) + { + DATA_TYPE datatype = DATA_TYPE.DT_INVALID; + int i=0; + data = new byte[0]; + size = 0; + object obj = itemdataman._edm.get_data_ptr(id, idspace, ref datatype); + if(obj == null || datatype != DATA_TYPE.DT_DECORATION_ESSENCE) + { + return -1; + } + DECORATION_ESSENCE ess = (DECORATION_ESSENCE)obj; + + size = (uint)(Marshal.SizeOf(typeof(item_data)) + Marshal.SizeOf(typeof(_item_content)) + Marshal.SizeOf(typeof(DECORATION_ESSENCE))); + // �׶� + uint hole_num = 0; //�׶�����Ŀ + + // ���addons + byte[] addon_buf = new byte[itemdataman.ELEMENTDATAMAN_MAX_NUM_ADDONS*Marshal.SizeOf(typeof(itemdataman._addon))]; + float[] probability_addon_num = { ess.probability_addon_num0, ess.probability_addon_num1, ess.probability_addon_num2, ess.probability_addon_num3, ess.probability_addon_num4 }; + uint addon_num = (uint)element_data.RandSelect(probability_addon_num.ToList(), cls, LOWER.LOWER_TREND); //���Ա���Ŀ����Ŀ + + uint addon_size = 0; + if(ess.fixed_props != 0) + { + addon_size = itemdataman.generate_equipment_addon_buffer_2(DATA_TYPE.DT_DECORATION_ESSENCE, ess.addons.Select(a => (int)a.id_addon).ToList(), addon_buf,0, addon_num); + } + else + { + if(normal_addon == GEN_ADDON_MODE.ADDON_LIST_DROP) + addon_size = itemdataman.generate_equipment_addon_buffer(DATA_TYPE.DT_DECORATION_ESSENCE, ess.addons.Select(a => (int)a.id_addon).ToList(), 32, addon_buf,0, addon_num); + else if(normal_addon == GEN_ADDON_MODE.ADDON_LIST_PRODUCE) + addon_size = itemdataman.generate_equipment_addon_buffer(DATA_TYPE.DT_DECORATION_ESSENCE, ess.rands.Select(a => (int)a.id_rand).ToList(), 32, addon_buf,0, addon_num); + else if (normal_addon == GEN_ADDON_MODE.ADDON_LIST_SPEC) + { + addon_size = itemdataman.generate_spec_addon_buffer(DATA_TYPE.DT_DECORATION_ESSENCE,addon_buf,0,itemdataman.ELEMENTDATAMAN_MAX_NUM_ADDONS, addon_num,sa_list); + } + else + { + addon_size = 0; + addon_num = 0; + } + } + size += addon_size; + + //����tag size + //ASSERT(tag_size >= sizeof(short)); + size += tag.size; + + + // allocate the buffer with exact length + data = new byte[size]; + int offset = 0; + + + WriteUInt(data, ref offset, id); //��Ʒ��ģ��ID + WriteUInt(data, ref offset, 1); //��Ʒ������ + WriteUInt(data, ref offset, (uint)ess.pile_num_max); //��Ʒ�Ķѵ����� + + object sub_type_temp = itemdataman._edm.get_data_ptr(ess.id_sub_type, ID_SPACE.ID_SPACE_ESSENCE, ref datatype); + if(sub_type_temp == null || datatype != DATA_TYPE.DT_DECORATION_SUB_TYPE) + { + return -1; + } + DECORATION_SUB_TYPE sub_type = (DECORATION_SUB_TYPE)sub_type_temp; + + WriteInt(data, ref offset, (int)(sub_type.equip_mask|(addon_num>0?0x40000000:0))); //��Ʒ�Ŀ�װ����־ + WriteUInt(data, ref offset, ess.proc_type); //��Ʒ�Ĵ�����ʽ + WriteInt(data, ref offset, (int)DATA_TYPE.DT_DECORATION_ESSENCE); //��Ʒ��Ӧ�����ID + WriteInt(data, ref offset, (int)DATA_TYPE.DT_DECORATION_ESSENCE); //��Ʒ��Ӧ�����ID + if(ess.has_guid == 1){ + int g1,g2; + itemdataman.get_item_guid(id,out g1,out g2); + WriteInt(data, ref offset, g1); //��Ʒ��Ӧ�����ID guid + WriteInt(data, ref offset, g2); //��Ʒ��Ӧ�����ID guid + } + else{ + WriteInt(data, ref offset, 0); //��Ʒ��Ӧ�����ID guid + WriteInt(data, ref offset, 0); //��Ʒ��Ӧ�����ID guid + } + WriteInt(data, ref offset, ess.price); //��Ʒ�ļ۸� + + WriteInt(data, ref offset, 0); //����ʱ�� + int content_length = 0; + int content_length_ptr = offset; + WriteInt(data, ref offset, 0); + int item_content = offset; + WriteInt(data, ref offset, 0); + content_length = (int)(size - offset); + WriteInt(data, ref content_length_ptr, content_length); + WriteInt(data, ref item_content, offset); + + // prerequisition + int require_ptr = offset; + WriteShort(data, ref offset, (short)ess.require_level); + WriteShort(data, ref offset, (short)(ess.character_combo_id&0xFFFF)); + WriteShort(data, ref offset, (short)ess.require_strength); + WriteShort(data, ref offset, (short)ess.require_tili); + WriteShort(data, ref offset, (short)ess.require_agility); + WriteShort(data, ref offset, (short)ess.require_energy); + + int temp2 = element_data.RandNormal(ess.durability_min, ess.durability_max, cls, LOWER.LOWER_TREND); + int temp; + if(normal_addon != GEN_ADDON_MODE.ADDON_LIST_DROP || (ess.proc_type & 0x1000) != 0) + { + temp = temp2; + } + else + { + temp = element_data.RandNormal(ess.durability_drop_min, ess.durability_drop_max, cls, UPPER.UPPER_TREND); + if(temp > temp2) temp = temp2; + } + WriteInt(data, ref offset, temp); //prerequisition durability + WriteInt(data, ref offset, temp2); //prerequisition max_durability + + //���������߱�ǩע���ǩ���ڱ����С�ͱ�������֮�� + WriteShort(data, ref offset, (short)Marshal.SizeOf(typeof(DECORATION_ESSENCE))); //װ�������С���ֽڣ� + + WriteByte(data, ref offset, tag.type); // MadeFrom + WriteByte(data, ref offset, (byte)tag.size); + + + // ���� + int essence_ptr = offset; + WriteInt(data, ref offset, element_data.RandNormal(ess.damage_low, ess.damage_high, cls, LOWER.LOWER_TREND)); //int damage; + WriteInt(data, ref offset, element_data.RandNormal(ess.magic_damage_low, ess.magic_damage_high, cls, LOWER.LOWER_TREND)); //int magic_damage; + WriteInt(data, ref offset, element_data.RandNormal(ess.defence_low, ess.defence_high, cls, LOWER.LOWER_TREND)); //int defense; + WriteInt(data, ref offset, element_data.RandNormal(ess.armor_enhance_low, ess.armor_enhance_high, cls, LOWER.LOWER_TREND)); //int armor; + + //���� + int[] res = {0,0,0,0,0}; + List res_list = ess.magic_defences.ToList(); + generate_magic_defense(res,res_list,cls,ess.fixed_props!=0); + + WriteInt(data, ref offset, res[0]); + WriteInt(data, ref offset, res[1]); + WriteInt(data, ref offset, res[2]); + WriteInt(data, ref offset, res[3]); + WriteInt(data, ref offset, res[4]); + + // �׶� + WriteShort(data, ref offset, (short)hole_num); //�׶�����Ŀ + WriteShort(data, ref offset, (short)0); //�׶��������������� + + // addon + WriteInt(data, ref offset, (int)addon_num); + int addon_sld = offset; + + addon_data addon_data = new addon_data(); + prerequisition prerequisition = new prerequisition(); + // Read prerequisition from data buffer (where it was written) once before the loop + int require_ptr_copy = require_ptr; + ReadPrerequisition(data, ref require_ptr_copy, out prerequisition); + for(i = 0; i < addon_num; i++) + { + ReadInt(addon_buf, ref addon_sld, out addon_data.id); + ReadAddonData(addon_buf, ref addon_sld, out addon_data); + itemdataman.addon_update_ess_data(addon_data, essence_ptr, Marshal.SizeOf(typeof(_weapon_essence)), prerequisition); + addon_sld += ((addon_data.id & 0x6000)>>13)*sizeof(int)+sizeof(int); + } + itemdataman.update_require_data(ref prerequisition); + int require_ptr_write = require_ptr; + WritePrerequisition(data, ref require_ptr_write, prerequisition); + if(addon_size > 0) + { + Array.Copy(addon_buf, 0, data, offset, (int)addon_size); + offset += (int)addon_size; + } + itemdataman.set_to_classid(DATA_TYPE.DT_DECORATION_ESSENCE, data, -1); + //if id == 335 log all addon data + if(id == 335) + { + BMLogger.Log("Log for item with id: " + id); + for(int j = 0; j < addon_num; j++) + { + ReadInt(addon_buf, ref addon_sld, out addon_data.id); + ReadAddonData(addon_buf, ref addon_sld, out addon_data); + BMLogger.Log("addon_data.id: " + addon_data.id); + } + } + return 0; + } + public static int generate_projectile(uint id, ID_SPACE idspace, out byte[] data, out uint size, RAND_CLASS cls) + { + DATA_TYPE datatype = DATA_TYPE.DT_INVALID; + data = new byte[0]; + size = 0; + object obj = itemdataman._edm.get_data_ptr(id, idspace, ref datatype); + if(obj == null || datatype != DATA_TYPE.DT_PROJECTILE_ESSENCE) + { + return -1; + } + PROJECTILE_ESSENCE ess = (PROJECTILE_ESSENCE)obj; + size = (uint)(Marshal.SizeOf(typeof(item_data)) + Marshal.SizeOf(typeof(_item_content)) + Marshal.SizeOf(typeof(PROJECTILE_ESSENCE))); + + byte[] addon_buf = new byte[itemdataman.ELEMENTDATAMAN_MAX_NUM_ADDONS*Marshal.SizeOf(typeof(itemdataman._addon))]; + uint addon_num = 4; //���Ա���Ŀ����Ŀ�̶� 4 + uint addon_size = 0; + + addon_size = itemdataman.generate_equipment_addon_buffer_2(DATA_TYPE.DT_PROJECTILE_ESSENCE, new List { (int)ess.id_addon0, (int)ess.id_addon1, (int)ess.id_addon2, (int)ess.id_addon3 }, addon_buf,0, addon_num); + size += addon_size; + + //����tag size + size += sizeof(short); + + // allocate the buffer with exact length + data = new byte[size]; + int offset = 0; + + WriteUInt(data, ref offset, id); //��Ʒ��ģ��ID + WriteUInt(data, ref offset, 1); //��Ʒ������ + WriteUInt(data, ref offset, (uint)ess.pile_num_max); //��Ʒ�Ķѵ����� + WriteInt(data, ref offset, (int)(itemdataman.ELEMENTDATAMAN_EQUIP_MASK_PROJECTILE|(addon_num>0?0x40000000:0))); //��Ʒ�Ŀ�װ����־ + WriteInt(data, ref offset, (int)ess.proc_type); //��Ʒ�Ĵ�����ʽ + WriteInt(data, ref offset, (int)DATA_TYPE.DT_PROJECTILE_ESSENCE); //��Ʒ��Ӧ�����ID + if(ess.has_guid == 1){ + int g1,g2; + itemdataman.get_item_guid(id,out g1,out g2); + WriteInt(data, ref offset, g1); //��Ʒ��Ӧ�����ID guid + WriteInt(data, ref offset, g2); //��Ʒ��Ӧ�����ID guid + } + else{ + WriteInt(data, ref offset, 0); //��Ʒ��Ӧ�����ID guid + WriteInt(data, ref offset, 0); //��Ʒ��Ӧ�����ID guid + } + WriteInt(data, ref offset, ess.price); //��Ʒ�ļ۸� + WriteInt(data, ref offset, 0); //����ʱ�� + + int content_length = 0; + int content_length_ptr = offset; + WriteInt(data, ref offset, 0); + int item_content = offset; + WriteInt(data, ref offset, 0); + content_length = (int)(size - offset); + WriteInt(data, ref content_length_ptr, content_length); + WriteInt(data, ref item_content, offset); + + // prerequisition + int require_ptr = offset; + //����int����6�� + WriteShort(data, ref offset, 0); //prerequisition level + WriteShort(data, ref offset, -1); // 0xFFFF = -1 + WriteShort(data, ref offset, 0); + WriteShort(data, ref offset, 0); //prerequisition strength + WriteShort(data, ref offset, 0); //prerequisition agility + WriteShort(data, ref offset, 0); //prerequisition energy + + WriteInt(data, ref offset, 1); //prerequisition durability + WriteInt(data, ref offset, 1); //prerequisition max_durability + WriteShort(data, ref offset, (short)Marshal.SizeOf(typeof(PROJECTILE_ESSENCE))); //װ�������С���ֽڣ� + WriteByte(data, ref offset, (byte)ITEM_MAKE_TAG.IMT_NULL); + WriteByte(data, ref offset, 0); + + // projectile_essence ���� + int essence_ptr = offset; + WriteInt(data, ref offset, (int)ess.type); //��ҩ���� + WriteInt(data, ref offset, ess.damage_enhance); //���������Ĺ����� + WriteInt(data, ref offset, ess.damage_scale_enhance); //���ձ������ӹ����� + WriteInt(data, ref offset, ess.require_weapon_level_min); //��Ҫ�����ȼ� + WriteInt(data, ref offset, ess.require_weapon_level_max); //��Ҫ�����ȼ� + + // �׶� + WriteShort(data, ref offset, (short)0); + WriteShort(data, ref offset, (short)0); + + + // addon + WriteInt(data, ref offset, (int)addon_num); + + int addon_sld = offset; + addon_data addon_data = new addon_data(); + prerequisition prerequisition = new prerequisition(); + // Read prerequisition from data buffer (where it was written) once before the loop + int require_ptr_copy = require_ptr; + ReadPrerequisition(data, ref require_ptr_copy, out prerequisition); + for(int i = 0; i < addon_num; i++) + { + ReadInt(addon_buf, ref addon_sld, out addon_data.id); + ReadAddonData(addon_buf, ref addon_sld, out addon_data); + itemdataman.addon_update_ess_data(addon_data, essence_ptr, Marshal.SizeOf(typeof(_weapon_essence)), prerequisition); + addon_sld += ((addon_data.id & 0x6000)>>13)*sizeof(int)+sizeof(int); + } + itemdataman.update_require_data(ref prerequisition); + int require_ptr_write = require_ptr; + WritePrerequisition(data, ref require_ptr_write, prerequisition); + if(addon_size > 0) + { + Array.Copy(addon_buf, 0, data, offset, (int)addon_size); + offset += (int)addon_size; + } + itemdataman.set_to_classid(DATA_TYPE.DT_PROJECTILE_ESSENCE, data, -1); + + return 0; + } + public static int generate_fashion_item(uint id, ID_SPACE idspace, out byte[] data, out uint size, RAND_CLASS cls, item_tag_t tag) + { + DATA_TYPE datatype = DATA_TYPE.DT_INVALID; + data = new byte[0]; + size = 0; + object obj = itemdataman._edm.get_data_ptr(id, idspace, ref datatype); + if(obj == null || datatype != DATA_TYPE.DT_FASHION_ESSENCE) + { + return -1; + } + FASHION_ESSENCE ess = (FASHION_ESSENCE)obj; + size = (uint)(Marshal.SizeOf(typeof(item_data)) + Marshal.SizeOf(typeof(FASHION_ESSENCE))); + + //ASSERT(tag_size >= 2); + size += tag.size; + object obj_sub_type = itemdataman._edm.get_data_ptr(ess.id_sub_type, idspace, ref datatype); + if(obj_sub_type == null || datatype != DATA_TYPE.DT_FASHION_SUB_TYPE) + { + return -1; + } + FASHION_SUB_TYPE sub_type = (FASHION_SUB_TYPE)obj_sub_type; + data = new byte[size]; + int offset =0; + WriteUInt(data, ref offset, id); //��Ʒ��ģ��ID + WriteUInt(data, ref offset, 1); //��Ʒ������ + WriteUInt(data, ref offset, (uint)ess.pile_num_max); //��Ʒ�Ķѵ����� + WriteUInt(data, ref offset, sub_type.equip_fashion_mask); //��Ʒ�Ŀ�װ����־���̶�ֵ���� + WriteInt(data, ref offset, (int)ess.proc_type); //��Ʒ�Ĵ�����ʽ + WriteInt(data, ref offset, (int)DATA_TYPE.DT_FASHION_ESSENCE); //��Ʒ��Ӧ�����ID + if(ess.has_guid == 1) + { + int g1,g2; + itemdataman.get_item_guid(id,out g1,out g2); + WriteInt(data, ref offset, g1); + WriteInt(data, ref offset, g2); + } + else + { + WriteInt(data, ref offset, 0); + WriteInt(data, ref offset, 0); + } + WriteInt(data, ref offset, ess.price); + WriteInt(data, ref offset, 0); + + int content_length = 0; + int content_length_ptr = offset; + WriteInt(data, ref offset, 0); + int item_content = offset; + WriteInt(data, ref offset, 0); + content_length = (int)(size - offset); + WriteInt(data, ref content_length_ptr, content_length); + WriteInt(data, ref item_content, offset); + + short color = (short)element_data.RandNormal(0, 0x7FFF, cls, ANY.ANY_TREND); + WriteShort(data, ref offset, (short)ess.require_level); + + WriteShort(data, ref offset, color); + WriteShort(data, ref offset, (short)ess.gender); + + WriteByte(data, ref offset, tag.type); + WriteByte(data, ref offset, (byte)tag.size); + + itemdataman.set_to_classid(DATA_TYPE.DT_FASHION_ESSENCE, data, -1); + return 0; + } public static int generate_tasknormalmatter(uint id, ID_SPACE idspace, out byte[] data, out uint size, RAND_CLASS cls, GEN_ADDON_MODE normal_addon ,item_tag_t tag,List sa_list = null) { @@ -950,6 +1311,51 @@ public static class generate_item_temp itemdataman.set_to_classid(DATA_TYPE.DT_PET_FOOD_ESSENCE, data, -1); return 0; } + + public static int generate_townscroll(uint id, ID_SPACE idspace, out byte[] data, out uint size, RAND_CLASS cls) + { + DATA_TYPE datatype = DATA_TYPE.DT_INVALID; + data = new byte[0]; + size = 0; + object obj = itemdataman._edm.get_data_ptr(id, idspace, ref datatype); + if(obj == null || datatype != DATA_TYPE.DT_TOWNSCROLL_ESSENCE) + return -1; + TOWNSCROLL_ESSENCE ess = (TOWNSCROLL_ESSENCE)obj; + size = (uint)(Marshal.SizeOf(typeof(item_data)) + Marshal.SizeOf(typeof(TOWNSCROLL_ESSENCE))); + data = new byte[size]; + int offset = 0; + WriteUInt(data, ref offset, id); + WriteUInt(data, ref offset, 1); + WriteUInt(data, ref offset, (uint)ess.pile_num_max); + WriteInt(data, ref offset, 0); + WriteInt(data, ref offset, (int)ess.proc_type); + WriteInt(data, ref offset, (int)DATA_TYPE.DT_TOWNSCROLL_ESSENCE); + if(ess.has_guid == 1){ + int g1,g2; + itemdataman.get_item_guid(id,out g1,out g2); + WriteInt(data, ref offset, g1); + WriteInt(data, ref offset, g2); + } + else{ + WriteInt(data, ref offset, 0); + WriteInt(data, ref offset, 0); + } + WriteInt(data, ref offset, ess.price); + WriteInt(data, ref offset, 0); + + int content_length = 0; + int content_length_ptr = offset; + WriteInt(data, ref offset, 0); + int item_content = offset; + WriteInt(data, ref offset, 0); + content_length = (int)(size - offset); + WriteInt(data, ref content_length_ptr, content_length); + WriteInt(data, ref item_content, offset); + WriteInt(data, ref offset, (int )(ess.use_time * 20)); //ʹ��ʱ�� + + itemdataman.set_to_classid(DATA_TYPE.DT_TOWNSCROLL_ESSENCE, data, -1); + return 0; + } #region Write Functions private static void WriteUInt(byte[] buf, ref int offset, uint value) { diff --git a/Assets/PerfectWorld/Scripts/Common/DataProcess/itemdataman.cs b/Assets/PerfectWorld/Scripts/Common/DataProcess/itemdataman.cs index d5338b2ced..6b96ec7f37 100644 --- a/Assets/PerfectWorld/Scripts/Common/DataProcess/itemdataman.cs +++ b/Assets/PerfectWorld/Scripts/Common/DataProcess/itemdataman.cs @@ -458,6 +458,17 @@ namespace BrewMonster ret = generate_item_temp.generate_armor(id, ID_SPACE.ID_SPACE_ESSENCE, out item,out size,SPECIFIC.SPECIFIC_RAND,GEN_ADDON_MODE.ADDON_LIST_SHOP,tag); break; + case DATA_TYPE.DT_DECORATION_ESSENCE: + ret = generate_item_temp.generate_decoration(id,ID_SPACE.ID_SPACE_ESSENCE, + out item,out size,SPECIFIC.SPECIFIC_RAND,GEN_ADDON_MODE.ADDON_LIST_SHOP,tag); + break; + case DATA_TYPE.DT_PROJECTILE_ESSENCE: + ret = generate_item_temp.generate_projectile(id,ID_SPACE.ID_SPACE_ESSENCE, + out item,out size,SPECIFIC.SPECIFIC_RAND); + break; + case DATA_TYPE.DT_FASHION_ESSENCE: + ret = generate_item_temp.generate_fashion_item(id, ID_SPACE.ID_SPACE_ESSENCE, out item, out size, SPECIFIC.SPECIFIC_RAND, tag); + break; case DATA_TYPE.DT_TASKNORMALMATTER_ESSENCE: ret = generate_item_temp.generate_tasknormalmatter(id,ID_SPACE.ID_SPACE_ESSENCE, out item,out size,SPECIFIC.SPECIFIC_RAND,GEN_ADDON_MODE.ADDON_LIST_SHOP,tag); @@ -477,6 +488,10 @@ namespace BrewMonster case DATA_TYPE.DT_PET_FOOD_ESSENCE: ret = generate_item_temp.generate_pet_food(id, ID_SPACE.ID_SPACE_ESSENCE, out item, out size, SPECIFIC.SPECIFIC_RAND); break; + case DATA_TYPE.DT_TOWNSCROLL_ESSENCE: + ret = generate_item_temp.generate_townscroll(id, ID_SPACE.ID_SPACE_ESSENCE, out item, out size, SPECIFIC.SPECIFIC_RAND); + break; + default: ret = -1; break; diff --git a/Assets/PerfectWorld/Scripts/GameData/ExpTypes.cs b/Assets/PerfectWorld/Scripts/GameData/ExpTypes.cs index 1a9494f9e8..945c631921 100644 --- a/Assets/PerfectWorld/Scripts/GameData/ExpTypes.cs +++ b/Assets/PerfectWorld/Scripts/GameData/ExpTypes.cs @@ -253,7 +253,12 @@ namespace BrewMonster + ByteToStringUtils.ByteArrayToCP936String(file_model_left) + "\n"; } } - + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct MagicDefence + { + public int low; // Minimum magic defense + public int high; // Maximum magic defense + } [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ARMOR_MAJOR_TYPE { @@ -326,12 +331,7 @@ namespace BrewMonster public int defence_low; // Minimum physical defense public int defence_high; // Maximum physical defense - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct MagicDefence - { - public int low; // Minimum magic defense - public int high; // Maximum magic defense - } + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public MagicDefence[] magic_defences; // Magic defenses for 5 elements @@ -495,13 +495,6 @@ namespace BrewMonster public int defence_low; // Minimum physical defense public int defence_high; // Maximum physical defense - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct MagicDefence - { - public int low; // Minimum magic defense - public int high; // Maximum magic defense - } - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public MagicDefence[] magic_defences; // Magic defenses for 5 elements @@ -750,6 +743,7 @@ namespace BrewMonster [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public ushort[] name; // Fashion sub-type name + public string Name => ByteToStringUtils.UshortArrayToCP936String(name); public uint equip_fashion_mask; // Fashion equipment slot mask } @@ -774,6 +768,8 @@ namespace BrewMonster [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_matter; // Matter model file path + public string FileMatter => ByteToStringUtils.ByteArrayToCP936String(file_matter); + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_icon; // Icon file path @@ -1605,10 +1601,11 @@ namespace BrewMonster [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_matter; // Material file path + public string FileMatter => ByteToStringUtils.ByteArrayToCP936String(file_matter); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_icon; // Icon file path - + public string FileIcon => ByteToStringUtils.ByteArrayToCP936String(file_icon); public float use_time; // Use time (seconds) public int price; // Price @@ -1629,9 +1626,11 @@ namespace BrewMonster [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_matter; // Material file path + public string FileMatter => ByteToStringUtils.ByteArrayToCP936String(file_matter); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_icon; // Icon file path + public string FileIcon => ByteToStringUtils.ByteArrayToCP936String(file_icon); public int price; // Price public int shop_price; // Shop price @@ -1746,6 +1745,7 @@ namespace BrewMonster [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_icon; // Icon file path + public string FileIcon { get { return ByteToStringUtils.ByteArrayToCP936String(file_icon); } } public int pile_num_max; // Max stack count public uint has_guid; // Whether item has GUID @@ -1762,9 +1762,11 @@ namespace BrewMonster [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_matter; // Material file path + public string FileMatter { get { return ByteToStringUtils.ByteArrayToCP936String(file_matter); } } [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_icon; // Icon file path + public string FileIcon { get { return ByteToStringUtils.ByteArrayToCP936String(file_icon); } } public int price; // Price public int shop_price; // Shop price @@ -1854,6 +1856,7 @@ namespace BrewMonster [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public ushort[] name; // name, max 15 chars + public string Name => ByteToStringUtils.UshortArrayToUnicodeString(name); } public struct PROJECTILE_ESSENCE @@ -1866,12 +1869,14 @@ namespace BrewMonster [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_model; // model file path + public string FileModel { get { return ByteToStringUtils.ByteArrayToCP936String(file_model); } } [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_matter; // matter file path - + public string FileMatter { get { return ByteToStringUtils.ByteArrayToCP936String(file_matter); } } [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_icon; // icon file path + public string FileIcon { get { return ByteToStringUtils.ByteArrayToCP936String(file_icon); } } [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_firegfx; // fire effect file @@ -3015,9 +3020,11 @@ namespace BrewMonster public string FileIcon1 => ByteToStringUtils.ByteArrayToCP936String(file_icon1); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_icon2; // state 2 icon path + public string FileIcon2 => ByteToStringUtils.ByteArrayToCP936String(file_icon2); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_icon3; // state 3 icon path + public string FileIcon3 => ByteToStringUtils.ByteArrayToCP936String(file_icon3); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] file_icon4; // state 4 icon path diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArrow.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArrow.cs index 0dbbef4231..b196cf02e4 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArrow.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArrow.cs @@ -1,19 +1,170 @@ +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 PerfectWorld.Scripts.Managers { + /// + /// Arrow item class (cac loai mui ten) + /// public class EC_IvtrArrow : EC_IvtrEquip { + protected IVTR_ESSENCE_ARROW m_Essence; // Arrow essence data + + // Data in database + protected PROJECTILE_TYPE m_pDBType; + protected PROJECTILE_ESSENCE m_pDBEssence; /// - /// Not create logic yet (add summary later) + /// Arrow item class (cac loai mui ten) /// /// Template id /// Expire date public EC_IvtrArrow(int tid, int expire_date) : base(tid, expire_date) { + m_iCID = (int)InventoryClassId.ICID_ARROW; + + m_Essence = new IVTR_ESSENCE_ARROW(); + + // Get database data + elementdataman pDB = ElementDataManProvider.GetElementDataMan(); + DATA_TYPE DataType = DATA_TYPE.DT_INVALID; + m_pDBEssence = (PROJECTILE_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType); + m_pDBType = (PROJECTILE_TYPE)pDB.get_data_ptr((uint)m_pDBEssence.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_iProcType = (int)m_pDBEssence.proc_type; + m_i64EquipMask = EC_IvtrType.EQUIP_MASK64_PROJECTILE; } public EC_IvtrArrow(EC_IvtrArrow other) : base(other) { + m_pDBType = other.m_pDBType; + m_pDBEssence = other.m_pDBEssence; + m_Essence = other.m_Essence; } + + public override bool SetItemInfo(byte[] pInfoData, int iDataLen) + { + base.SetItemInfo(pInfoData, iDataLen); + + if (pInfoData == null || iDataLen == 0) + return true; + + try + { + CECDataReader dr = new CECDataReader(pInfoData, iDataLen); + + // Skip equip requirements and endurance + dr.Offset(5 * sizeof (int), CECDataReader.SEEK_CUR); + + int iEssenceSize = dr.ReadInt(); + //ASSERT(iEssenceSize == sizeof (IVTR_ESSENCE_ARROW)); + + m_Essence = new IVTR_ESSENCE_ARROW(dr.ReadData(iEssenceSize)); + } + catch (Exception e) + { + Debug.LogError("CECIvtrArrow::SetItemInfo, data read error (" + e.GetType() + e.StackTrace + ")"); + return false; + } + + return true; + } + + // Get item icon file name + public override string GetIconFile() + { + return m_pDBEssence.FileIcon; + } + + // Get item name + public override string GetName() + { + // Try Unicode first (for Vietnamese/wide char names), then fallback to CP936 + if (m_pDBEssence.name != null && m_pDBEssence.name.Length > 0) + { + string s = ByteToStringUtils.UshortArrayToUnicodeString(m_pDBEssence.name); + if (!string.IsNullOrEmpty(s) && !string.IsNullOrWhiteSpace(s)) + return s; + // Fallback to legacy CP936 if Unicode was empty + s = ByteToStringUtils.UshortArrayToCP936String(m_pDBEssence.name); + if (!string.IsNullOrEmpty(s)) + return s; + } + return base.GetName(); // Fallback to base class method + } + + // Get item description text + protected override string GetNormalDesc(bool bRepair) + { + if (m_bNeedUpdate) + return ""; + + // Build addon and refine properties and save it + m_strDesc = ""; + BuildAddOnPropDesc(null, null); + string strAddon = m_strDesc; + + m_strDesc = ""; + + // Try to build item description + CECStringTab pDescTab = EC_Game.GetItemDesc(); + int white = (int)DescriptipionMsg.ITEMDESC_COL_WHITE; + int namecol = DecideNameCol(); + + if (m_iCount > 1) + AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAMENUMBER), GetName(), m_iCount); + else + AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), GetName()); + + AddIDDescText(); + + AddExpireTimeDesc(); + + // Weapon requirement + AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_WEAPONREQ), m_Essence.iWeaponReqLow, + m_Essence.iWeaponReqHigh, m_pDBType.Name); + + // Damage enhance + if (m_pDBEssence.damage_enhance != 0) + { + AddDescText(-1, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ADDPHYDAMAGE)); + AddDescText(-1, true, " %+d", m_pDBEssence.damage_enhance); + } + + // Add addon properties + if (strAddon.Length > 0) + m_strDesc += strAddon; + + // Price + AddPriceDesc(white, bRepair); + + // Suite description + AddSuiteDesc(); + + // Extend description + AddExtDescText(); + + return m_strDesc; + } + + // Get drop model for shown + public override string GetDropModel() + { + return m_pDBEssence.FileMatter; + } + } } \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrEquip.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrEquip.cs index 260b3a7a3a..90a33392f8 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrEquip.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrEquip.cs @@ -720,7 +720,7 @@ namespace PerfectWorld.Scripts.Managers prop.Suite = (type & 0x10000) != 0; prop.Engraved = (type & 0x20000) != 0; prop.Local = false; - + for (int j = 0; j < prop.NumParam; j++) { prop.Params[j] = dr.ReadInt(); @@ -2409,7 +2409,7 @@ namespace PerfectWorld.Scripts.Managers /// private int VisualizeFloatPercent(int value) { - return value / 100; + return (int)(IntToFloat(value) * 100.0f + 0.5f); } /// @@ -2610,811 +2610,743 @@ namespace PerfectWorld.Scripts.Managers int p0 = param != null && param.Length > 0 ? param[0] : 0; int p1 = param != null && param.Length > 1 ? param[1] : 0; int p2 = param != null && param.Length > 2 ? param[2] : 0; - byte propType = GetPropertyType(idProp); int color = -1; if (!IsSharpenerProperty(propType)) { switch (propType) - { + { case 0: // ������ - - if(!local) - { - if (aPEEVals != null) - aPEEVals[PEEI_PHYDAMAGE] += p0; - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDPHYDAMAGE)); - AddDescText(color, true, " %+d", p0); - break; - - case 1: // ���������� - - if(local) - { - if(p0 != p1) + if (!local) { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_MAXPHYDAMAGE), p0); - AddDescText(color, true, "~%d", p1); + if (aPEEVals != null) + aPEEVals[PEEI_PHYDAMAGE] += p0; + } + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDPHYDAMAGE)); + AddDescText(color, true, " %+d", p0); + break; + + case 1: // ���������� + if (local) + { + if (p0 != p1) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_MAXPHYDAMAGE), p0); + AddDescText(color, true, "~%d", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MAXPHYDAMAGE), p0); + } } else { + if (aPEEVals != null) + aPEEVals[PEEI_MAX_PHYDAMAGE] += p0; AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MAXPHYDAMAGE), p0); } - } - else - { - if (aPEEVals != null) - aPEEVals[PEEI_MAX_PHYDAMAGE] += p0; + break; - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MAXPHYDAMAGE), p0); - } - break; - case 2: // ������(%) - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDMGEXTRA), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDMGEXTRA), p0); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDMGEXTRA), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDMGEXTRA), p0); + } + break; + case 3: // ħ������ - - if(!local) - { - if (aPEEVals != null) - aPEEVals[PEEI_MAGICDAMAGE] += p0; - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDMAGICDAMAGE)); - AddDescText(color, true, " %+d", p0); - break; - + if (!local) + { + if (aPEEVals != null) + aPEEVals[PEEI_MAGICDAMAGE] += p0; + } + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDMAGICDAMAGE)); + AddDescText(color, true, " %+d", p0); + break; + case 4: // ħ���������� - - if(local) - { - if(p0 != p1) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_MAXMAGICDAMAGE), p0); - AddDescText(color, true, "~%d", p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MAXMAGICDAMAGE), p0); - } - } - else - { - if (aPEEVals != null) - aPEEVals[PEEI_MAX_MAGICDAMAGE] += p0; - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MAXMAGICDAMAGE), p0); - } - break; - + if (local) + { + if (p0 != p1) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_MAXMAGICDAMAGE), p0); + AddDescText(color, true, "~%d", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MAXMAGICDAMAGE), p0); + } + } + else + { + if (aPEEVals != null) + aPEEVals[PEEI_MAX_MAGICDAMAGE] += p0; + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MAXMAGICDAMAGE), p0); + } + break; + case 5: // ħ������(%) - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MAGICDMGEXTRA), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MAGICDMGEXTRA), p0); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MAGICDMGEXTRA), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MAGICDMGEXTRA), p0); + } + break; + case 6: // +���-�﹥ - - if(!local) - { - if (aPEEVals != null) - { - aPEEVals[PEEI_PHYDEF] += p0; - aPEEVals[PEEI_PHYDAMAGE] -= p1; - } - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFENCE)); - AddDescText(color, true, " %+d", p0); - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDPHYDAMAGE)); - AddDescText(color, true, " %+d", -p1); - break; - + if (!local) + { + if (aPEEVals != null) + { + aPEEVals[PEEI_PHYDEF] += p0; + aPEEVals[PEEI_PHYDAMAGE] -= p1; + } + } + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFENCE)); + AddDescText(color, true, " %+d", p0); + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDPHYDAMAGE)); + AddDescText(color, true, " %+d", -p1); + break; + case 7: // +�﹥-��� - - if(!local) - { - if (aPEEVals != null) - { - aPEEVals[PEEI_PHYDAMAGE] += p0; - aPEEVals[PEEI_PHYDEF] -= p1; - } - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDPHYDAMAGE)); - AddDescText(color, true, " %+d", p0); - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFENCE)); - AddDescText(color, true, " %+d", -p1); - break; - + if (!local) + { + if (aPEEVals != null) + { + aPEEVals[PEEI_PHYDAMAGE] += p0; + aPEEVals[PEEI_PHYDEF] -= p1; + } + } + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDPHYDAMAGE)); + AddDescText(color, true, " %+d", p0); + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFENCE)); + AddDescText(color, true, " %+d", -p1); + break; + case 8: // +ħ��-ħ�� - - if(!local) - { - if (aPEEVals != null) - { - aPEEVals[PEEI_MAGICDAMAGE] += p0; - aPEEVals[PEEI_GOLDDEF] -= p1; - aPEEVals[PEEI_WOODDEF] -= p1; - aPEEVals[PEEI_WATERDEF] -= p1; - aPEEVals[PEEI_FIREDEF] -= p1; - aPEEVals[PEEI_EARTHDEF] -= p1; - } - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDMAGICDAMAGE)); - AddDescText(color, true, " %+d", p0); - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICDEF)); - AddDescText(color, true, " %+d", -p1); - break; - + if (!local) + { + if (aPEEVals != null) + { + aPEEVals[PEEI_MAGICDAMAGE] += p0; + aPEEVals[PEEI_GOLDDEF] -= p1; + aPEEVals[PEEI_WOODDEF] -= p1; + aPEEVals[PEEI_WATERDEF] -= p1; + aPEEVals[PEEI_FIREDEF] -= p1; + aPEEVals[PEEI_EARTHDEF] -= p1; + } + } + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDMAGICDAMAGE)); + AddDescText(color, true, " %+d", p0); + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICDEF)); + AddDescText(color, true, " %+d", -p1); + break; + case 9: // �����ٶ� - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKTIME), -IntToFloat(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKTIME), -p0 * 0.05f); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKTIME), -IntToFloat(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKTIME), -p0 * 0.05f); + } + break; + case 10: // �������� - { - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDATKDIST), IntToFloat(p0)); - } - else - { - if (aPEEVals != null) - { - float fDist = IntToFloat(aPEEVals[PEEI_ATKDIST]) + IntToFloat(p0); - aPEEVals[PEEI_ATKDIST] = FloatToInt(fDist); - } - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDATKDIST), IntToFloat(p0)); - } - break; - } + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDATKDIST), IntToFloat(p0)); + } + else + { + if (aPEEVals != null) + { + float fDist = IntToFloat(aPEEVals[PEEI_ATKDIST]) + IntToFloat(p0); + aPEEVals[PEEI_ATKDIST] = FloatToInt(fDist); + } + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDATKDIST), IntToFloat(p0)); + } + break; + case 11: // ����ʱ�� - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_CASTTIME), -VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_CASTTIME), -p0); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_CASTTIME), -VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_CASTTIME), -p0); + } + break; + case 12: // ������� - - if(!local) - { - if (aPEEVals != null) - aPEEVals[PEEI_PHYDEF] += p0; - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFENCE)); - AddDescText(color, true, " %+d", p0); - break; - + if (!local) + { + if (aPEEVals != null) + aPEEVals[PEEI_PHYDEF] += p0; + } + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFENCE)); + AddDescText(color, true, " %+d", p0); + break; + case 13: // �������(%) - - if(local) - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFEXTRA), VisualizeFloatPercent(p0)); - else - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFEXTRA), p0); - - break; + if (local) + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFEXTRA), VisualizeFloatPercent(p0)); + else + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFEXTRA), p0); + break; case 14: // ���з��� - - if(!local) - { - if (aPEEVals != null) - { - aPEEVals[PEEI_GOLDDEF] += p0; - aPEEVals[PEEI_WOODDEF] += p0; - aPEEVals[PEEI_WATERDEF] += p0; - aPEEVals[PEEI_FIREDEF] += p0; - aPEEVals[PEEI_EARTHDEF] += p0; - } - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICDEF)); - AddDescText(color, true, " %+d", p0); - break; - + if (!local) + { + if (aPEEVals != null) + { + aPEEVals[PEEI_GOLDDEF] += p0; + aPEEVals[PEEI_WOODDEF] += p0; + aPEEVals[PEEI_WATERDEF] += p0; + aPEEVals[PEEI_FIREDEF] += p0; + aPEEVals[PEEI_EARTHDEF] += p0; + } + } + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICDEF)); + AddDescText(color, true, " %+d", p0); + break; + case 15: // ��� - - if(local) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFENCE)); - - if(p0 != p1) - AddDescText(color, true, " %d~%d", p0, p1); - else - AddDescText(color, true, " %d", p0); - } - else - { - if (aPEEVals != null) - aPEEVals[PEEI_GOLDDEF] += p0; - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFENCE)); - AddDescText(color, true, " %+d", p0); - } - break; - + if (local) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFENCE)); + if (p0 != p1) + AddDescText(color, true, " %d~%d", p0, p1); + else + AddDescText(color, true, " %d", p0); + } + else + { + if (aPEEVals != null) + aPEEVals[PEEI_GOLDDEF] += p0; + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFENCE)); + AddDescText(color, true, " %+d", p0); + } + break; + case 16: // ���(%) - - if(local) - { - if((p0) != (p1)) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFEXTRA), (p0)); - AddDescText(color, true, "~-%.2f%%",p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFEXTRA), (p0)); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFEXTRA), (p0)); - } - break; + if (local) + { + if ((p0) != (p1)) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFEXTRA), (p0)); + AddDescText(color, true, "~-%.2f%%", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFEXTRA), (p0)); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFEXTRA), (p0)); + } + break; case 17: // ľ�� - - if(local) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFENCE)); - - if(p0 != p1) - AddDescText(color, true, " %d~%d", p0, p1); - else - AddDescText(color, true, " %d", p0); - } - else - { - if (aPEEVals != null) - aPEEVals[PEEI_WOODDEF] += p0; - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFENCE)); - AddDescText(color, true, " %+d", p0); - } - break; - + if (local) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFENCE)); + + if (p0 != p1) + AddDescText(color, true, " %d~%d", p0, p1); + else + AddDescText(color, true, " %d", p0); + } + else + { + if (aPEEVals != null) + aPEEVals[PEEI_WOODDEF] += p0; + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFENCE)); + AddDescText(color, true, " %+d", p0); + } + break; + case 18: // ľ��(%) - - if(local) - { - if((p0) != (p1)) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFEXTRA), (p0)); - AddDescText(color, true, "~-%.2f%%",p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFEXTRA), (p0)); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFEXTRA), (p0)); - } - break; - + if (local) + { + if ((p0) != (p1)) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFEXTRA), (p0)); + AddDescText(color, true, "~-%.2f%%", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFEXTRA), (p0)); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFEXTRA), (p0)); + } + break; + case 19: // ˮ�� - - if(local) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFENCE)); - - if(p0 != p1) - AddDescText(color, true, " %d~%d", p0, p1); - else - AddDescText(color, true, " %d", p0); - } - else - { - if (aPEEVals != null) - aPEEVals[PEEI_WATERDEF] += p0; - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFENCE)); - AddDescText(color, true, " %+d", p0); - } - break; - + if (local) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFENCE)); + + if (p0 != p1) + AddDescText(color, true, " %d~%d", p0, p1); + else + AddDescText(color, true, " %d", p0); + } + else + { + if (aPEEVals != null) + aPEEVals[PEEI_WATERDEF] += p0; + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFENCE)); + AddDescText(color, true, " %+d", p0); + } + break; + case 20: // ˮ��(%) - - if(local) - { - if((p0) != (p1)) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFEXTRA), (p0)); - AddDescText(color, true, "~-%.2f%%",p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFEXTRA), (p0)); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFEXTRA), (p0)); - } - break; - + if (local) + { + if ((p0) != (p1)) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFEXTRA), (p0)); + AddDescText(color, true, "~-%.2f%%", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFEXTRA), (p0)); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFEXTRA), (p0)); + } + break; + case 21: // ��� - - if(local) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFENCE)); - - if(p0 != p1) - AddDescText(color, true, " %d~%d", p0, p1); - else - AddDescText(color, true, " %d", p0); - } - else - { - if (aPEEVals != null) - aPEEVals[PEEI_FIREDEF] += p0; - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFENCE)); - AddDescText(color, true, " %+d", p0); - } - break; - + if (local) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFENCE)); + + if (p0 != p1) + AddDescText(color, true, " %d~%d", p0, p1); + else + AddDescText(color, true, " %d", p0); + } + else + { + if (aPEEVals != null) + aPEEVals[PEEI_FIREDEF] += p0; + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFENCE)); + AddDescText(color, true, " %+d", p0); + } + break; + case 22: // ���(%) - - if(local) - { - if((p0) != (p1)) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFEXTRA), (p0)); - AddDescText(color, true, "~-%.2f%%",p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFEXTRA), (p0)); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFEXTRA), (p0)); - } - break; - + if (local) + { + if ((p0) != (p1)) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFEXTRA), (p0)); + AddDescText(color, true, "~-%.2f%%", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFEXTRA), (p0)); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFEXTRA), (p0)); + } + break; + case 23: // ���� - - if(local) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFENCE)); - - if(p0 != p1) - AddDescText(color, true, " %d~%d", p0, p1); - else - AddDescText(color, true, " %d", p0); - } - else - { - if (aPEEVals != null) - aPEEVals[PEEI_EARTHDEF] += p0; - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFENCE)); - AddDescText(color, true, " %+d", p0); - } - - break; - + if (local) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFENCE)); + + if (p0 != p1) + AddDescText(color, true, " %d~%d", p0, p1); + else + AddDescText(color, true, " %d", p0); + } + else + { + if (aPEEVals != null) + aPEEVals[PEEI_EARTHDEF] += p0; + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFENCE)); + AddDescText(color, true, " %+d", p0); + } + break; + case 24: // ����(%) - - if(local) - { - if((p0) != (p1)) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFEXTRA), (p0)); - AddDescText(color, true, "~-%.2f%%",p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFEXTRA), (p0)); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFEXTRA), (p0)); - } - break; + if (local) + { + if ((p0) != (p1)) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFEXTRA), (p0)); + AddDescText(color, true, "~-%.2f%%", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFEXTRA), (p0)); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFEXTRA), (p0)); + } + break; case 25: // +���(%)-���(%) - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFEXTRA), VisualizeFloatPercent(p0)); - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFEXTRA), -VisualizeFloatPercent(p1)); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFEXTRA), VisualizeFloatPercent(p0)); + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFEXTRA), -VisualizeFloatPercent(p1)); + break; + case 26: // +ľ��(%)-���(%) - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFEXTRA), VisualizeFloatPercent(p0)); - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFEXTRA), -VisualizeFloatPercent(p1)); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFEXTRA), VisualizeFloatPercent(p0)); + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFEXTRA), -VisualizeFloatPercent(p1)); + break; + case 27: // +ˮ��(%)-����(%) - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFEXTRA), VisualizeFloatPercent(p0)); - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFEXTRA), -VisualizeFloatPercent(p1)); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFEXTRA), VisualizeFloatPercent(p0)); + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFEXTRA), -VisualizeFloatPercent(p1)); + break; + case 28: // +���(%)-ˮ��(%) - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFEXTRA), VisualizeFloatPercent(p0)); - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFEXTRA), -VisualizeFloatPercent(p1)); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFEXTRA), VisualizeFloatPercent(p0)); + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFEXTRA), -VisualizeFloatPercent(p1)); + break; + case 29: // +����(%)-ľ��(%) - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFEXTRA), VisualizeFloatPercent(p0)); - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFEXTRA), -VisualizeFloatPercent(p1)); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFEXTRA), VisualizeFloatPercent(p0)); + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFEXTRA), -VisualizeFloatPercent(p1)); + break; + case 30: // +���-��� - - if(!local) - { - if (aPEEVals != null) - { - aPEEVals[PEEI_GOLDDEF] += p0; - aPEEVals[PEEI_FIREDEF] -= p1; - } - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFENCE)); - AddDescText(color, true, " %+d", p0); - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFENCE)); - AddDescText(color, true, " %+d", -p1); - break; - + if (!local) + { + if (aPEEVals != null) + { + aPEEVals[PEEI_GOLDDEF] += p0; + aPEEVals[PEEI_FIREDEF] -= p1; + } + } + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFENCE)); + AddDescText(color, true, " %+d", p0); + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFENCE)); + AddDescText(color, true, " %+d", -p1); + break; + case 31: // +ľ��-��� - - if(!local) - { - if (aPEEVals != null) - { - aPEEVals[PEEI_WOODDEF] += p0; - aPEEVals[PEEI_GOLDDEF] -= p1; - } - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFENCE)); - AddDescText(color, true, " %+d", p0); - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFENCE)); - AddDescText(color, true, " %+d", -p1); - break; - + if (!local) + { + if (aPEEVals != null) + { + aPEEVals[PEEI_WOODDEF] += p0; + aPEEVals[PEEI_GOLDDEF] -= p1; + } + } + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFENCE)); + AddDescText(color, true, " %+d", p0); + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_GOLDDEFENCE)); + AddDescText(color, true, " %+d", -p1); + break; + case 32: // +ˮ��-���� - - if(!local) - { - if (aPEEVals != null) - { - aPEEVals[PEEI_WATERDEF] += p0; - aPEEVals[PEEI_EARTHDEF] -= p1; - } - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFENCE)); - AddDescText(color, true, " %+d", p0); - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFENCE)); - AddDescText(color, true, " %+d", -p1); - break; - + if (!local) + { + if (aPEEVals != null) + { + aPEEVals[PEEI_WATERDEF] += p0; + aPEEVals[PEEI_EARTHDEF] -= p1; + } + } + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFENCE)); + AddDescText(color, true, " %+d", p0); + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFENCE)); + AddDescText(color, true, " %+d", -p1); + break; + case 33: // +���-ˮ�� - - if(!local) - { - if (aPEEVals != null) - { - aPEEVals[PEEI_FIREDEF] += p0; - aPEEVals[PEEI_WATERDEF] -= p1; - } - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFENCE)); - AddDescText(color, true, " %+d", p0); - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFENCE)); - AddDescText(color, true, " %+d", -p1); - break; - + if (!local) + { + if (aPEEVals != null) + { + aPEEVals[PEEI_FIREDEF] += p0; + aPEEVals[PEEI_WATERDEF] -= p1; + } + } + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFENCE)); + AddDescText(color, true, " %+d", p0); + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFENCE)); + AddDescText(color, true, " %+d", -p1); + break; + case 34: // +����-ľ�� - - if(!local) - { - if (aPEEVals != null) - { - aPEEVals[PEEI_EARTHDEF] += p0; - aPEEVals[PEEI_WOODDEF] -= p1; - } - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFENCE)); - AddDescText(color, true, " %+d", p0); - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFENCE)); - AddDescText(color, true, " %+d", -p1); - break; - + if (!local) + { + if (aPEEVals != null) + { + aPEEVals[PEEI_EARTHDEF] += p0; + aPEEVals[PEEI_WOODDEF] -= p1; + } + } + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFENCE)); + AddDescText(color, true, " %+d", p0); + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFENCE)); + AddDescText(color, true, " %+d", -p1); + break; + case 35: // HP - - if(!local) - { - if (aPEEVals != null) - aPEEVals[PEEI_HP] += p0; - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDHP)); - AddDescText(color, true, " %+d", p0); - break; - + if (!local) + { + if (aPEEVals != null) + aPEEVals[PEEI_HP] += p0; + } + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDHP)); + AddDescText(color, true, " %+d", p0); + break; + case 36: // MP - - if(!local) - { - if (aPEEVals != null) - aPEEVals[PEEI_MP] += p0; - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDMP)); - AddDescText(color, true, " %+d", p0); - break; - + if (!local) + { + if (aPEEVals != null) + aPEEVals[PEEI_MP] += p0; + } + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDMP)); + AddDescText(color, true, " %+d", p0); + break; + case 37: // HP(%) - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_HPEXTRA), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_HPEXTRA), p0); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_HPEXTRA), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_HPEXTRA), p0); + } + break; + case 38: // MP(%) - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MPEXTRA), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MPEXTRA), p0); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MPEXTRA), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MPEXTRA), p0); + } + break; + case 39: // HP�ָ��ٶ� - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_HPRECOVER), p0 / 2); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_HPRECOVER), p0 / 2); + break; + case 40: // MP�ָ��ٶ� - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MPRECOVER), p0 / 2); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_MPRECOVER), p0 / 2); + break; + case 41: // ���� - - if(local) - { - if(p0 != p1) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); - AddDescText(color, true, "~%d", p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); - } - break; - + if (local) + { + if (p0 != p1) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); + AddDescText(color, true, "~%d", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); + } + break; + case 42: // ���� - - if(local) - { - if(p0 != p1) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); - AddDescText(color, true, "~%d", p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); - } - break; - + if (local) + { + if (p0 != p1) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); + AddDescText(color, true, "~%d", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); + } + break; + case 43: // ���� - - if(local) - { - if(p0 != p1) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); - AddDescText(color, true, "~%d", p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); - } - break; - + if (local) + { + if (p0 != p1) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); + AddDescText(color, true, "~%d", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); + } + break; + case 44: // ���� - - if(local) - { - if(p0 != p1) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); - AddDescText(color, true, "~%d", p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); - } - break; + if (local) + { + if (p0 != p1) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); + AddDescText(color, true, "~%d", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); + } + break; case 45: // ����һ���� - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DEADLYSTRIKE), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DEADLYSTRIKE), p0); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DEADLYSTRIKE), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DEADLYSTRIKE), p0); + } + break; + case 46: // ���� - - if(local) - { - if(p0 != p1) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKRATING), p0); - AddDescText(color, true, "~%d", p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKRATING), p0); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKRATING), p0); - } - break; - + if (local) + { + if (p0 != p1) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKRATING), p0); + AddDescText(color, true, "~%d", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKRATING), p0); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKRATING), p0); + } + break; + case 47: // ����(%) - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKRATINGEXTRA), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKRATINGEXTRA), p0); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKRATINGEXTRA), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKRATINGEXTRA), p0); + } + break; + case 48: // �ƶ��ٶ� - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_RUNSPEED), IntToFloat(p0)); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_RUNSPEED), IntToFloat(p0)); + break; + case 49: // �ƶ��ٶ�(%) - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_RUNSPEEDEXTRA), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_RUNSPEEDEXTRA), p0); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_RUNSPEEDEXTRA), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_RUNSPEEDEXTRA), p0); + } + break; + case 50: // ���� - - if(!local) - { - if (aPEEVals != null) - aPEEVals[PEEI_DODGE] += p0; - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_DODGE)); - AddDescText(color, true, " %+d", p0); - break; - + if (!local) + { + if (aPEEVals != null) + aPEEVals[PEEI_DODGE] += p0; + } + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_DODGE)); + AddDescText(color, true, " %+d", p0); + break; + case 51: // ����(%) - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DODGEEXTRA), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DODGEEXTRA), p0); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DODGEEXTRA), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DODGEEXTRA), p0); + } + break; + case 52: // �;ö� - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ENDURANCE)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ENDURANCE)); + AddDescText(color, true, " %+d", p0); + break; + case 53: // �;ö�(%) - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ENDURANCEEXTRA), VisualizeFloatPercent(p0)); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ENDURANCEEXTRA), VisualizeFloatPercent(p0)); + break; + case 54: // �������� - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYRESIST), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYRESIST), p0); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYRESIST), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYRESIST), p0); + } + break; + case 55: // ���Ӽ��� { // Get skill description - TODO: Implement skill description retrieval @@ -3422,108 +3354,94 @@ namespace PerfectWorld.Scripts.Managers AddDescText(color, true, "{0}", skillDesc); break; } + case 56: // װ������ - - if(local) - { - if(VisualizeFloatPercent(p0) != VisualizeFloatPercent(p1)) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_REQEXTRA), -VisualizeFloatPercent(p0)); - AddDescText(color, true, "~%d", VisualizeFloatPercent(p1)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_REQEXTRA), -VisualizeFloatPercent(p0)); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_REQEXTRA), -VisualizeFloatPercent(p0)); - } - break; - + if (local) + { + if (VisualizeFloatPercent(p0) != VisualizeFloatPercent(p1)) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_REQEXTRA), -VisualizeFloatPercent(p0)); + AddDescText(color, true, "~%d", VisualizeFloatPercent(p1)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_REQEXTRA), -VisualizeFloatPercent(p0)); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_REQEXTRA), -VisualizeFloatPercent(p0)); + } + break; + case 57: // δ֪���� - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_RANDOMPROP)); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_RANDOMPROP)); + break; + case 58: // ����ֵ�ӳ� - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EXP), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EXP), p0); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EXP), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EXP), p0); + } + break; + case 59: // �����ȼ� - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATK_DEGREE), p0); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATK_DEGREE), p0); + break; + case 60: // �����ȼ� - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DEF_DEGREE), p0); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DEF_DEGREE), p0); + break; + case 61: // ���з�����%�� - - if(local) - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_TOTAL_DEFENCE_ADD), VisualizeFloatPercent(p0)); - else - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_TOTAL_DEFENCE_ADD), (p0)); - - break; - + if (local) + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_TOTAL_DEFENCE_ADD), VisualizeFloatPercent(p0)); + else + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_TOTAL_DEFENCE_ADD), (p0)); + break; + case 62: // ����֮�� - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PROFVIEW)); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PROFVIEW)); + break; + case 63: // ���� - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_SOULPOWER), p0); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_SOULPOWER), p0); + break; + case 64: // ��ϵ����(%) - - AddResistDesc(color, DescriptipionMsg.ITEMDESC_GOLDRESIST, p0, local); - break; - + AddResistDesc(color, DescriptipionMsg.ITEMDESC_GOLDRESIST, p0, local); + break; + case 65: // ľϵ����(%) - - AddResistDesc(color, DescriptipionMsg.ITEMDESC_WOODRESIST, p0, local); - break; - + AddResistDesc(color, DescriptipionMsg.ITEMDESC_WOODRESIST, p0, local); + break; + case 66: // ˮϵ����(%) - - AddResistDesc(color, DescriptipionMsg.ITEMDESC_WATERRESIST, p0, local); - break; - + AddResistDesc(color, DescriptipionMsg.ITEMDESC_WATERRESIST, p0, local); + break; + case 67: // ��ϵ����(%) - - AddResistDesc(color, DescriptipionMsg.ITEMDESC_FIRERESIST, p0, local); - break; - + AddResistDesc(color, DescriptipionMsg.ITEMDESC_FIRERESIST, p0, local); + break; + case 68: // ��ϵ����(%) - - AddResistDesc(color, DescriptipionMsg.ITEMDESC_EARTHRESIST, p0, local); - break; - + AddResistDesc(color, DescriptipionMsg.ITEMDESC_EARTHRESIST, p0, local); + break; + case 69: // ���м���(%) - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICRESIST), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICRESIST), p0); - } - break; + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICRESIST), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICRESIST), p0); + } + break; case 70: // �����ȼ���Χ������ֵ������ã� @@ -3544,273 +3462,226 @@ namespace PerfectWorld.Scripts.Managers { AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATK_DEGREE), p0); } - break; - + break; + case 71: // �����ȼ���Χ������ֵ������ã� - - AddRangeValueDescIdNormal(DescriptipionMsg.ITEMDESC_DEF_DEGREE, p0, p1, local, color); - break; - + AddRangeValueDescIdNormal(DescriptipionMsg.ITEMDESC_DEF_DEGREE, p0, p1, local, color); + break; + case 72: // ����һ����(%)��Χ������ֵ������ã� - - AddRangeValueDescIdPercent(DescriptipionMsg.ITEMDESC_DEADLYSTRIKE, p0, p1, local, color); - break; - + AddRangeValueDescIdPercent(DescriptipionMsg.ITEMDESC_DEADLYSTRIKE, p0, p1, local, color); + break; + case 73: // HP��Χ������ֵ������ã� - - AddRangeValueDescStrNormal(DescriptipionMsg.ITEMDESC_ADDHP, p0, p1, local, color); - break; - + AddRangeValueDescStrNormal(DescriptipionMsg.ITEMDESC_ADDHP, p0, p1, local, color); + break; + case 74: // MP��Χ������ֵ������ã� - - AddRangeValueDescStrNormal(DescriptipionMsg.ITEMDESC_ADDMP, p0, p1, local, color); - break; - + AddRangeValueDescStrNormal(DescriptipionMsg.ITEMDESC_ADDMP, p0, p1, local, color); + break; + case 75: // ����(%)��Χ������ֵ������ã� - - AddRangeValueDescIdPercent(DescriptipionMsg.ITEMDESC_ATKRATINGEXTRA, p0, p1, local, color); - break; - + AddRangeValueDescIdPercent(DescriptipionMsg.ITEMDESC_ATKRATINGEXTRA, p0, p1, local, color); + break; + case 76: // ���������Χ������ֵ������ã� - - AddRangeValueDescStrNormal(DescriptipionMsg.ITEMDESC_PHYDEFENCE, p0, p1, local, color); - break; - + AddRangeValueDescStrNormal(DescriptipionMsg.ITEMDESC_PHYDEFENCE, p0, p1, local, color); + break; + case 77: // ���з�����Χ������ֵ������ã� - - AddRangeValueDescStrNormal(DescriptipionMsg.ITEMDESC_ALLMAGICDEF, p0, p1, local, color); - break; - + AddRangeValueDescStrNormal(DescriptipionMsg.ITEMDESC_ALLMAGICDEF, p0, p1, local, color); + break; + case 78: // �������(%)��Χ������ֵ������ã� - - AddRangeValueDescIdPercent(DescriptipionMsg.ITEMDESC_PHYRESIST, p0, p1, local, color); - break; - + AddRangeValueDescIdPercent(DescriptipionMsg.ITEMDESC_PHYRESIST, p0, p1, local, color); + break; + case 79: // ���м���(%)��Χ������ֵ������ã� - - AddRangeValueDescIdPercent(DescriptipionMsg.ITEMDESC_ALLMAGICRESIST, p0, p1, local, color); - break; - + AddRangeValueDescIdPercent(DescriptipionMsg.ITEMDESC_ALLMAGICRESIST, p0, p1, local, color); + break; + case 80: // ����ʱ��(%)��Χ������ֵ������ã� - - AddRangeValueDescIdMinusPercent1(DescriptipionMsg.ITEMDESC_CASTTIME, p0, p1, local, color); - break; - + AddRangeValueDescIdMinusPercent1(DescriptipionMsg.ITEMDESC_CASTTIME, p0, p1, local, color); + break; + case 81: // �������뷶Χ������ֵ������ã� - - AddRangeValueDescIdFloat(DescriptipionMsg.ITEMDESC_ADDATKDIST, p0, p1, local, color); - break; - + AddRangeValueDescIdFloat(DescriptipionMsg.ITEMDESC_ADDATKDIST, p0, p1, local, color); + break; + case 82: // MP�ָ��ٶȷ�Χ������ֵ������ã� - - AddRangeValueDescIdHalf(DescriptipionMsg.ITEMDESC_MPRECOVER, p0, p1, local, color); - break; - + AddRangeValueDescIdHalf(DescriptipionMsg.ITEMDESC_MPRECOVER, p0, p1, local, color); + break; + case 83: // �������(%)��Χ������ֵ������ã� - - AddRangeValueDescIdPercent(DescriptipionMsg.ITEMDESC_PHYDEFEXTRA, p0, p1, local, color); - break; - + AddRangeValueDescIdPercent(DescriptipionMsg.ITEMDESC_PHYDEFEXTRA, p0, p1, local, color); + break; + case 84: // ���з���(%)��Χ������ֵ������ã� - - AddRangeValueDescIdPercent(DescriptipionMsg.ITEMDESC_TOTAL_DEFENCE_ADD, p0, p1, local, color); - break; - + AddRangeValueDescIdPercent(DescriptipionMsg.ITEMDESC_TOTAL_DEFENCE_ADD, p0, p1, local, color); + break; + case 85: // HP�ָ��ٶȷ�Χ������ֵ������ã� - - AddRangeValueDescIdHalf(DescriptipionMsg.ITEMDESC_HPRECOVER, p0, p1, local, color); - break; - + AddRangeValueDescIdHalf(DescriptipionMsg.ITEMDESC_HPRECOVER, p0, p1, local, color); + break; + case 86: // ������Χ������ֵ������ã� - - AddRangeValueDescStrNormal(DescriptipionMsg.ITEMDESC_DODGE, p0, p1, local, color); - break; - + AddRangeValueDescStrNormal(DescriptipionMsg.ITEMDESC_DODGE, p0, p1, local, color); + break; + case 87: // ���������޷�Χ������ֵ������ã� - - AddRangeValueDescIdNormal(DescriptipionMsg.ITEMDESC_MAXPHYDAMAGE, p0, p1, local, color); - break; - + AddRangeValueDescIdNormal(DescriptipionMsg.ITEMDESC_MAXPHYDAMAGE, p0, p1, local, color); + break; + case 88: // ħ���������޷�Χ������ֵ������ã� - - AddRangeValueDescIdNormal(DescriptipionMsg.ITEMDESC_MAXMAGICDAMAGE, p0, p1, local, color); - break; - + AddRangeValueDescIdNormal(DescriptipionMsg.ITEMDESC_MAXMAGICDAMAGE, p0, p1, local, color); + break; + case 89: // װ������Χ������ֵ������ã� - - AddRangeValueDescIdMinusPercent2(DescriptipionMsg.ITEMDESC_REQEXTRA, p0, p1, local, color); - break; + AddRangeValueDescIdMinusPercent2(DescriptipionMsg.ITEMDESC_REQEXTRA, p0, p1, local, color); + break; case 90: // ��ħ�ȼ� - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PENETRATION), p0); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PENETRATION), p0); + break; + case 91: // ��ħ�ȼ� - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_RESILIENCE), p0); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_RESILIENCE), p0); + break; + case 92: // +���+ħ�� - - if(!local) - { - if (aPEEVals != null) - { - aPEEVals[PEEI_PHYDEF] += p0; - aPEEVals[PEEI_GOLDDEF] += p1; - aPEEVals[PEEI_WOODDEF] += p1; - aPEEVals[PEEI_WATERDEF] += p1; - aPEEVals[PEEI_FIREDEF] += p1; - aPEEVals[PEEI_EARTHDEF] += p1; - } - } - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFENCE)); - AddDescText(color, true, " %+d", p0); - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICDEF)); - AddDescText(color, true, " %+d", p1); - break; - + if (!local) + { + if (aPEEVals != null) + { + aPEEVals[PEEI_PHYDEF] += p0; + aPEEVals[PEEI_GOLDDEF] += p1; + aPEEVals[PEEI_WOODDEF] += p1; + aPEEVals[PEEI_WATERDEF] += p1; + aPEEVals[PEEI_FIREDEF] += p1; + aPEEVals[PEEI_EARTHDEF] += p1; + } + } + + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFENCE)); + AddDescText(color, true, " %+d", p0); + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICDEF)); + AddDescText(color, true, " %+d", p1); + break; + case 93: // ��ɫHP - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDHP)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDHP)); + AddDescText(color, true, " %+d", p0); + break; + case 94: // ��ɫHP��Χ - AddRangeValueDescStrNormal(DescriptipionMsg.ITEMDESC_ADDHP, p0, p1, local, color); - break; - + AddRangeValueDescStrNormal(DescriptipionMsg.ITEMDESC_ADDHP, p0, p1, local, color); + break; + case 95: // ���� - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); + break; + case 96: // ���� - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); + break; + case 97: // ���� - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); + break; + case 98: // ���� - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); + break; + case 99: // ��ɫMP - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDMP)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDMP)); + AddDescText(color, true, " %+d", p0); + break; + case 160: // �����̶�ֵ - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_VIGOUR)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_VIGOUR)); + AddDescText(color, true, " %+d", p0); + break; + case 200: // ���������� - if (aRefines != null) - aRefines[REFINE_PHYDAMAGE] += p0; - - break; + aRefines[REFINE_PHYDAMAGE] += p0; + break; case 201: // ����ħ������ - if (aRefines != null) - aRefines[REFINE_MAGICDAMAGE] += p0; - - break; - + aRefines[REFINE_MAGICDAMAGE] += p0; + break; + case 202: // ����������� - if (aRefines != null) - aRefines[REFINE_PHYDEF] += p0; - - break; - + aRefines[REFINE_PHYDEF] += p0; + break; + case 203: // ������� - if (aRefines != null) - aRefines[REFINE_GOLDDEF] += p0; - - break; - + aRefines[REFINE_GOLDDEF] += p0; + break; + case 204: // ����ľ�� - if (aRefines != null) - aRefines[REFINE_WOODDEF] += p0; - - break; - + aRefines[REFINE_WOODDEF] += p0; + break; + case 205: // ����ˮ�� - if (aRefines != null) - aRefines[REFINE_WATERDEF] += p0; - - break; - + aRefines[REFINE_WATERDEF] += p0; + break; + case 206: // ������� - if (aRefines != null) - aRefines[REFINE_FIREDEF] += p0; - - break; - + aRefines[REFINE_FIREDEF] += p0; + break; + case 207: // �������� - if (aRefines != null) - aRefines[REFINE_EARTHDEF] += p0; - - break; - + aRefines[REFINE_EARTHDEF] += p0; + break; + case 208: // ����HP - if (aRefines != null) - aRefines[REFINE_HP] += p0; - - break; - + aRefines[REFINE_HP] += p0; + break; + case 209: // �������� - if (aRefines != null) - aRefines[REFINE_DODGE] += p0; - - break; - + aRefines[REFINE_DODGE] += p0; + break; + case 210: // �������з��� - if (aRefines != null) - { - aRefines[REFINE_GOLDDEF] += p0; - aRefines[REFINE_WOODDEF] += p0; - aRefines[REFINE_WATERDEF] += p0; - aRefines[REFINE_FIREDEF] += p0; - aRefines[REFINE_EARTHDEF] += p0; - } - - break; - + { + aRefines[REFINE_GOLDDEF] += p0; + aRefines[REFINE_WOODDEF] += p0; + aRefines[REFINE_WATERDEF] += p0; + aRefines[REFINE_FIREDEF] += p0; + aRefines[REFINE_EARTHDEF] += p0; + } + break; + case 211: // ���������� & ħ������ - if (aRefines != null) - { - aRefines[REFINE_PHYDAMAGE] += p0; - aRefines[REFINE_MAGICDAMAGE] += p0; - } - - break; - + { + aRefines[REFINE_PHYDAMAGE] += p0; + aRefines[REFINE_MAGICDAMAGE] += p0; + } + break; + case 212: // ����������� & ħ������ - if (aRefines != null) - { - aRefines[REFINE_PHYDEF] += p0; - aRefines[REFINE_GOLDDEF] += p0; - aRefines[REFINE_WOODDEF] += p0; - aRefines[REFINE_WATERDEF] += p0; - aRefines[REFINE_FIREDEF] += p0; - aRefines[REFINE_EARTHDEF] += p0; - } + { + aRefines[REFINE_PHYDEF] += p0; + aRefines[REFINE_GOLDDEF] += p0; + aRefines[REFINE_WOODDEF] += p0; + aRefines[REFINE_WATERDEF] += p0; + aRefines[REFINE_FIREDEF] += p0; + aRefines[REFINE_EARTHDEF] += p0; + } break; @@ -3822,230 +3693,203 @@ namespace PerfectWorld.Scripts.Managers break; case 121: // �Կ�ľ�� - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFENCE)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WOODDEFENCE)); + AddDescText(color, true, " %+d", p0); + break; + case 122: // �Կ�ˮ�� - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFENCE)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_WATERDEFENCE)); + AddDescText(color, true, " %+d", p0); + break; + case 123: // �Կ̻�� - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFENCE)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_FIREDEFENCE)); + AddDescText(color, true, " %+d", p0); + break; + case 124: // �Կ����� - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFENCE)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_EARTHDEFENCE)); + AddDescText(color, true, " %+d", p0); + break; + case 125: // �Կ����� - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKRATING), p0); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATKRATING), p0); + break; + case 126: // �Կ̶��� - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_DODGE)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_DODGE)); + AddDescText(color, true, " %+d", p0); + break; + case 127: // �Կ�MP - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDMP)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDMP)); + AddDescText(color, true, " %+d", p0); + break; + case 128: // �Կ����� - - if(local) - { - if(p0 != p1) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); - AddDescText(color, true, "~%d", p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); - } - break; - + if (local) + { + if (p0 != p1) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); + AddDescText(color, true, "~%d", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_VITALITY), p0); + } + break; + case 129: // �Կ����� - - if(local) - { - if(p0 != p1) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); - AddDescText(color, true, "~%d", p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); - } - break; - + if (local) + { + if (p0 != p1) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); + AddDescText(color, true, "~%d", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_STRENGTH), p0); + } + break; + case 130: // �Կ����� - - if(local) - { - if(p0 != p1) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); - AddDescText(color, true, "~%d", p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); - } - break; - + if (local) + { + if (p0 != p1) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); + AddDescText(color, true, "~%d", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_AGILITY), p0); + } + break; + case 131: // �Կ����� - - if(local) - { - if(p0 != p1) - { - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); - AddDescText(color, true, "~%d", p1); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); - } - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); - } - break; - + if (local) + { + if (p0 != p1) + { + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); + AddDescText(color, true, "~%d", p1); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); + } + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ENERGY), p0); + } + break; + case 132: // �Կ�HP - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDHP)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDHP)); + AddDescText(color, true, " %+d", p0); + break; + case 133: // �Կ�������� - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFENCE)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYDEFENCE)); + AddDescText(color, true, " %+d", p0); + break; + case 134: // �Կ����з��� - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICDEF)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICDEF)); + AddDescText(color, true, " %+d", p0); + break; + case 135: // �Կ������� - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDPHYDAMAGE)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDPHYDAMAGE)); + AddDescText(color, true, " %+d", p0); + break; + case 136: // �Կ�ħ������ - - AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDMAGICDAMAGE)); - AddDescText(color, true, " %+d", p0); - break; - + AddDescText(color, false, GetItemDescString(DescriptipionMsg.ITEMDESC_ADDMAGICDAMAGE)); + AddDescText(color, true, " %+d", p0); + break; + case 137: // �Կ̽�ϵ����(%) - - AddResistDesc(color, DescriptipionMsg.ITEMDESC_GOLDRESIST, p0, local); - break; - + AddResistDesc(color, DescriptipionMsg.ITEMDESC_GOLDRESIST, p0, local); + break; + case 138: // �Կ�ľϵ����(%) - - AddResistDesc(color, DescriptipionMsg.ITEMDESC_WOODRESIST, p0, local); - break; - + AddResistDesc(color, DescriptipionMsg.ITEMDESC_WOODRESIST, p0, local); + break; + case 139: // �Կ�ˮϵ����(%) - - AddResistDesc(color, DescriptipionMsg.ITEMDESC_WATERRESIST, p0, local); - break; - + AddResistDesc(color, DescriptipionMsg.ITEMDESC_WATERRESIST, p0, local); + break; + case 140: // �Կ̻�ϵ����(%) - - AddResistDesc(color, DescriptipionMsg.ITEMDESC_FIRERESIST, p0, local); - break; - + AddResistDesc(color, DescriptipionMsg.ITEMDESC_FIRERESIST, p0, local); + break; + case 141: // �Կ���ϵ����(%) - - AddResistDesc(color, DescriptipionMsg.ITEMDESC_EARTHRESIST, p0, local); - break; + AddResistDesc(color, DescriptipionMsg.ITEMDESC_EARTHRESIST, p0, local); + break; case 142: // �Կ����м���(%) - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICRESIST), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICRESIST), p0); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICRESIST), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ALLMAGICRESIST), p0); + } + break; + case 143: // �Կ�����һ���� - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DEADLYSTRIKE), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DEADLYSTRIKE), p0); - } - break; - + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DEADLYSTRIKE), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DEADLYSTRIKE), p0); + } + break; + case 144: // �Կ̹����ȼ� - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATK_DEGREE), p0); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ATK_DEGREE), p0); + break; + case 145: // �Կ̷����ȼ� - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DEF_DEGREE), p0); - break; - + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_DEF_DEGREE), p0); + break; + case 146: // �Կ��������� - - if(local) - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYRESIST), VisualizeFloatPercent(p0)); - } - else - { - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYRESIST), p0); - } - break; - - default: - - AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ERRORPROP), idProp); + if (local) + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYRESIST), VisualizeFloatPercent(p0)); + } + else + { + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_PHYRESIST), p0); + } + break; + + default: + AddDescText(color, true, GetItemDescString(DescriptipionMsg.ITEMDESC_ERRORPROP), idProp); break; } } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFashion.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFashion.cs index 8b319c9e68..bc8f057142 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFashion.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrFashion.cs @@ -1,8 +1,31 @@ +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 PerfectWorld.Scripts.Managers { - public class EC_IvtrFashion : EC_IvtrItem + 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; /// /// Not create logic yet (add summary later) /// @@ -10,10 +33,210 @@ namespace PerfectWorld.Scripts.Managers /// Expire date 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(); + 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 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 suiteEquipTab = EC_Game.GetSuiteEquipTab(); + return suiteEquipTab.ContainsKey(TemplateId) ? suiteEquipTab[TemplateId] : 0; } } } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs index 67ab258250..e3f462fe8f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs @@ -807,7 +807,8 @@ 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("Create item data: DataType: " + DataType); + //Active this to log the data type of item when creating an item + //Debug.Log("Create item data: DataType: " + DataType + " tid: " + tid ); switch(DataType) { case DATA_TYPE.DT_WEAPON_ESSENCE: @@ -844,7 +845,7 @@ namespace BrewMonster.Scripts.Managers pItem = new EC_IvtrFlysword(tid, expire_date); break; case DATA_TYPE.DT_TOWNSCROLL_ESSENCE: - pItem = new EC_IvtrTownscroll(tid, expire_date); + pItem = new EC_IvtrTownScroll(tid, expire_date); break; case DATA_TYPE.DT_UNIONSCROLL_ESSENCE: pItem = new EC_IvtrUnionscroll(tid, expire_date); @@ -859,7 +860,7 @@ namespace BrewMonster.Scripts.Managers pItem = new EC_IvtrTossMat(tid, expire_date); break; case DATA_TYPE.DT_TASKMATTER_ESSENCE: - pItem = new EC_IvtrTaskmatter(tid, expire_date); + pItem = new EC_IvtrTaskItem(tid, expire_date); break; case DATA_TYPE.DT_STONE_ESSENCE: pItem = new EC_IvtrStone(tid, expire_date); diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMaterial.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMaterial.cs index 8c19d7a8ca..c0a2f041e9 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMaterial.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrMaterial.cs @@ -77,7 +77,6 @@ namespace PerfectWorld.Scripts.Managers CECStringTab pDescTab = EC_Game.GetItemDesc(); int white = (int)DescriptipionMsg.ITEMDESC_COL_WHITE; int namecol = DecideNameCol(); - BMLogger.Log("GetNormalDesc: m_pDBEssence.Name:" + m_pDBEssence.Name + " m_iCount:" + m_iCount); if (m_iCount > 1) AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAMENUMBER), GetName(), m_iCount); else diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskItem.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskItem.cs new file mode 100644 index 0000000000..876649a2ca --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskItem.cs @@ -0,0 +1,105 @@ +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 PerfectWorld.Scripts.Managers +{ + public class EC_IvtrTaskItem : EC_IvtrItem + { + protected TASKMATTER_ESSENCE m_pDBEssence; + /// + /// Not create logic yet (add summary later) + /// + /// Template id + /// Expire date + public EC_IvtrTaskItem(int tid, int expire_date) : base(tid, expire_date) + { + m_iCID = (int)InventoryClassId.ICID_TASKITEM; + + // Get database data + elementdataman pDB = ElementDataManProvider.GetElementDataMan(); + DATA_TYPE DataType = DATA_TYPE.DT_INVALID; + m_pDBEssence = (TASKMATTER_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType); + + m_iPileLimit = m_pDBEssence.pile_num_max; + m_iPrice = 0; + m_iShopPrice = 0; + m_iProcType = (int)m_pDBEssence.proc_type; + m_i64EquipMask = 0; + + m_bNeedUpdate = false; + } + + public EC_IvtrTaskItem(EC_IvtrTaskItem other) : base(other) + { + m_pDBEssence = other.m_pDBEssence; + } + + public override bool SetItemInfo(byte[] pInfoData, int iDataLen) + { + base.SetItemInfo(pInfoData, iDataLen); + return true; + } + + // Get item icon file name + public override string GetIconFile() + { + return m_pDBEssence.FileIcon; + } + + // Get item name + public override string GetName() + { + // Try Unicode first (for Vietnamese/wide char names), then fallback to CP936 + if (m_pDBEssence.name != null && m_pDBEssence.name.Length > 0) + { + string s = ByteToStringUtils.UshortArrayToUnicodeString(m_pDBEssence.name); + if (!string.IsNullOrEmpty(s) && !string.IsNullOrWhiteSpace(s)) + return s; + // Fallback to legacy CP936 if Unicode was empty + s = ByteToStringUtils.UshortArrayToCP936String(m_pDBEssence.name); + if (!string.IsNullOrEmpty(s)) + return s; + } + return base.GetName(); // Fallback to base class method + } + // Get item description text + protected override string GetNormalDesc(bool bRepair) + { + m_strDesc = string.Empty; + + // Try to build item description + CECStringTab pDescTab = EC_Game.GetItemDesc(); + int white = (int)DescriptipionMsg.ITEMDESC_COL_WHITE; + int namecol = DecideNameCol(); + + if (m_iCount > 1) + AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAMENUMBER), GetName(), m_iCount); + else + AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), GetName()); + + AddIDDescText(); + + AddExpireTimeDesc(); + + // Task item + AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_TASKITEM)); + + // Extend description + AddExtDescText(); + + return m_strDesc; + } + } +} + diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskItem.cs.meta b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskItem.cs.meta new file mode 100644 index 0000000000..a20bdd2538 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskItem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ec738837a1a3f40e38926d3365da3df5 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskNmMatter.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskNmMatter.cs index b76fe9960a..9212fb9644 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskNmMatter.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskNmMatter.cs @@ -1,20 +1,93 @@ +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 PerfectWorld.Scripts.Managers { + /// + /// Task Normal Matter Item.(non interactable quest item). it is a part of IvtrTaskItem(C++) + /// public class EC_IvtrTaskNmMatter : EC_IvtrItem { + protected TASKNORMALMATTER_ESSENCE m_pDBEssence; /// - /// Not create logic yet (add summary later) + /// Constructor for Task Normal Matter Item. /// /// Template id /// Expire date public EC_IvtrTaskNmMatter(int tid, int expire_date) : base(tid, expire_date) { + m_iCID = (int)InventoryClassId.ICID_TASKNMMATTER; + + // Get database data + elementdataman pDB = ElementDataManProvider.GetElementDataMan(); + DATA_TYPE DataType = DATA_TYPE.DT_INVALID; + m_pDBEssence = (TASKNORMALMATTER_ESSENCE)pDB.get_data_ptr((uint)tid, 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_iProcType = (int)m_pDBEssence.proc_type; + m_bNeedUpdate = false; } public EC_IvtrTaskNmMatter(EC_IvtrTaskNmMatter other) : base(other) { + m_pDBEssence = other.m_pDBEssence; } + public override bool SetItemInfo(byte[] pInfoData, int iDataLen) + { + base.SetItemInfo(pInfoData, iDataLen); + return true; + } + + // Get item icon file name + public override string GetIconFile() + { + return m_pDBEssence.FileIcon; + } + + // Get item description text + protected override string GetNormalDesc(bool bRepair) + { + m_strDesc = string.Empty; + + // Try to build item description + CECStringTab pDescTab = EC_Game.GetItemDesc(); + int white = (int)DescriptipionMsg.ITEMDESC_COL_WHITE; + int namecol = DecideNameCol(); + + if (m_iCount > 1) + AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAMENUMBER), GetName(), m_iCount); + else + AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), GetName()); + + AddIDDescText(); + + AddExpireTimeDesc(); + + // Price + AddPriceDesc(white, bRepair); + + // Extend description + AddExtDescText(); + + return m_strDesc; + } + public override string GetDropModel() + { + return m_pDBEssence.FileMatter; + } } } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskmatter.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskmatter.cs deleted file mode 100644 index 902b9688bd..0000000000 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskmatter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using BrewMonster.Scripts.Managers; -namespace PerfectWorld.Scripts.Managers -{ - public class EC_IvtrTaskmatter : EC_IvtrItem - { - /// - /// Not create logic yet (add summary later) - /// - /// Template id - /// Expire date - public EC_IvtrTaskmatter(int tid, int expire_date) : base(tid, expire_date) - { - } - - public EC_IvtrTaskmatter(EC_IvtrTaskmatter other) : base(other) - { - } - } -} - diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskmatter.cs.meta b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskmatter.cs.meta deleted file mode 100644 index a1f695d266..0000000000 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskmatter.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: ee5181c9a0786409fb452d21d947eab7 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTownscroll.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTownscroll.cs index 2c7934f0cf..ae7e84bf56 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTownscroll.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTownscroll.cs @@ -1,20 +1,95 @@ +using BrewMonster; +using ModelRenderer.Scripts.GameData; +using BrewMonster.Network; using BrewMonster.Scripts.Managers; +using BrewMonster.Scripts; +using CSNetwork.GPDataType; namespace PerfectWorld.Scripts.Managers { - public class EC_IvtrTownscroll : EC_IvtrItem + /// + /// Town scroll item class (hoi thanh phu). It is a part of EC_IvtrScroll(c++) + /// TownScroll allow player to teleport to towns inside one map. + /// + public class EC_IvtrTownScroll : EC_IvtrItem { + protected TOWNSCROLL_ESSENCE m_pDBEssence; /// - /// Not create logic yet (add summary later) + /// Constructor for Town Scroll /// /// Template id /// Expire date - public EC_IvtrTownscroll(int tid, int expire_date) : base(tid, expire_date) + public EC_IvtrTownScroll(int tid, int expire_date) : base(tid, expire_date) { + m_iCID = (int)InventoryClassId.ICID_TOWNSCROLL; + + // Get database data + elementdataman pDB = ElementDataManProvider.GetElementDataMan(); + DATA_TYPE DataType = DATA_TYPE.DT_INVALID; + m_pDBEssence = (TOWNSCROLL_ESSENCE)pDB.get_data_ptr((uint)tid, 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_iProcType = (int)m_pDBEssence.proc_type; + m_i64EquipMask = 0; + m_bUseable = true; + m_dwUseFlags = (uint)UseCondition.USE_PERSIST; + + m_bNeedUpdate = false; } - public EC_IvtrTownscroll(EC_IvtrTownscroll other) : base(other) + public EC_IvtrTownScroll(EC_IvtrTownScroll other) : base(other) { + m_pDBEssence = other.m_pDBEssence; } + public override bool SetItemInfo(byte[] pInfoData, int iDataLen) + { + base.SetItemInfo(pInfoData, iDataLen); + return true; + } + public override string GetIconFile() + { + return m_pDBEssence.FileIcon; + } + // Get item cool time + public int GetCoolTime(ref int piMax) + { + CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer(); + return pHost ? pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_TOWNSCROLL, ref piMax) : 0; + } + + protected override string GetNormalDesc(bool bRepair) + { + m_strDesc = string.Empty; + + // Try to build item description + CECStringTab pDescTab = EC_Game.GetItemDesc(); + int white = (int)DescriptipionMsg.ITEMDESC_COL_WHITE; + int namecol = DecideNameCol(); + + if (m_iCount > 1) + AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAMENUMBER), GetName(), m_iCount); + else + AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), GetName()); + + AddIDDescText(); + + AddExpireTimeDesc(); + + // Price + AddPriceDesc(white, bRepair); + + // Extend description + AddExtDescText(); + + return m_strDesc; + } + // Get drop model for shown + public override string GetDropModel() + { + return m_pDBEssence.FileMatter; + } + } } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTransmitScroll.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTransmitScroll.cs index fd8e25ba6b..25fb933b02 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTransmitScroll.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTransmitScroll.cs @@ -1,19 +1,104 @@ +using BrewMonster; +using ModelRenderer.Scripts.GameData; +using BrewMonster.Network; using BrewMonster.Scripts.Managers; +using BrewMonster.Scripts; +using CSNetwork.GPDataType; namespace PerfectWorld.Scripts.Managers { + /// + /// Transmit scroll item(Da dich chuyen). It is a part of EC_IvtrConsume(c++) + /// TransmitScroll allow player to teleport to other maps' towns. + /// public class EC_IvtrTransmitScroll : EC_IvtrItem { + protected TRANSMITSCROLL_ESSENCE m_pDBEssence; /// - /// Not create logic yet (add summary later) + /// Constructor for Transmit Scroll /// /// Template id /// Expire date public EC_IvtrTransmitScroll(int tid, int expire_date) : base(tid, expire_date) { + m_iCID = (int)InventoryClassId.ICID_TRANSMITSCROLL; + + // Get database data + elementdataman pDB = ElementDataManProvider.GetElementDataMan(); + DATA_TYPE DataType = DATA_TYPE.DT_INVALID; + m_pDBEssence = (TRANSMITSCROLL_ESSENCE)pDB.get_data_ptr((uint)tid, 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_iProcType = (int)m_pDBEssence.proc_type; + m_i64EquipMask = 0; + m_bUseable = true; + m_dwUseFlags = (uint)UseCondition.USE_PERSIST; + + m_bNeedUpdate = false; } public EC_IvtrTransmitScroll(EC_IvtrTransmitScroll other) : base(other) { + m_pDBEssence = other.m_pDBEssence; + } + public override bool SetItemInfo(byte[] pInfoData, int iDataLen) + { + base.SetItemInfo(pInfoData, iDataLen); + return true; + } + public override string GetIconFile() + { + return m_pDBEssence.FileIcon; + } + public int GetCoolTime(ref int piMax) + { + CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer(); + if (!pHost) + return 0; + int iTime = pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_TOWNSCROLL, ref piMax); + return iTime; + } + + protected override string GetNormalDesc(bool bRepair) + { + m_strDesc = string.Empty; + + // Try to build item description + CECStringTab pDescTab = EC_Game.GetItemDesc(); + int white = (int)DescriptipionMsg.ITEMDESC_COL_WHITE; + int namecol = DecideNameCol(); + + if (m_iCount > 1) + AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAMENUMBER), GetName(), m_iCount); + else + AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), GetName()); + + AddIDDescText(); + + AddExpireTimeDesc(); + + // Price + AddPriceDesc(white, bRepair); + + // Extend description + AddExtDescText(); + + return m_strDesc; + } + // Get drop model for shown + public override string GetDropModel() + { + return m_pDBEssence.FileMatter; + } + + // Check item use condition + public override bool CheckUseCondition() + { + if( EC_Game.GetGameRun().GetHostPlayer().IsFighting() ) + return false; + + return true; } } } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrType.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrType.cs index 67085b3509..81d67669b0 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrType.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrType.cs @@ -69,7 +69,6 @@ namespace BrewMonster.Scripts.Managers public float attack_short_range; public IVTR_ESSENCE_WEAPON( byte[] data) { - Debug.Log("IVTR_ESSENCE_WEAPON: data.Length: " + data.Length); CECDataReader dr = new (data, data.Length); weapon_type = dr.ReadShort(); weapon_dealy = dr.ReadShort(); @@ -87,12 +86,20 @@ namespace BrewMonster.Scripts.Managers }; public struct IVTR_ESSENCE_ARROW { - // TODO : implement data later - // DWORD dwBowMask; - // int iDamage; - // int iDamageScale; - // int iWeaponReqLow; - // int iWeaponReqHigh; + public int dwBowMask; + public int iDamage; + public int iDamageScale; + public int iWeaponReqLow; + public int iWeaponReqHigh; + public IVTR_ESSENCE_ARROW(byte[] data) + { + CECDataReader dr = new (data, data.Length); + dwBowMask = dr.ReadInt(); + iDamage = dr.ReadInt(); + iDamageScale = dr.ReadInt(); + iWeaponReqLow = dr.ReadInt(); + iWeaponReqHigh = dr.ReadInt(); + } }; public struct IVTR_ESSENCE_DECORATION { @@ -103,7 +110,6 @@ namespace BrewMonster.Scripts.Managers public int[] resistance; public IVTR_ESSENCE_DECORATION(byte[] data) { - Debug.Log("IVTR_ESSENCE_DECORATION: data.Length: " + data.Length); CECDataReader dr = new (data, data.Length); damage = dr.ReadInt(); magic_damage = dr.ReadInt(); @@ -141,10 +147,16 @@ namespace BrewMonster.Scripts.Managers }; public struct IVTR_ESSENCE_FASHION { - // TODO : implement data later - // int require_level; - // unsigned short color; - // unsigned short gender; + public int require_level; + public ushort color; + public ushort gender; + public IVTR_ESSENCE_FASHION(byte[] data) + { + CECDataReader dr = new (data, data.Length); + require_level = dr.ReadInt(); + color = dr.ReadUShort(); + gender = dr.ReadUShort(); + } }; public struct IVTR_ESSENCE_FLYSWORD { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeapon.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeapon.cs index 270faff894..7236b8ed82 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeapon.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeapon.cs @@ -211,7 +211,6 @@ namespace PerfectWorld.Scripts.Managers // Get item name public override string GetName() { - BMLogger.Log("[THN]EC_IvtrWeapon: GetName: m_pDBEssence.Name: " + m_pDBEssence.Name); return m_pDBEssence.Name; } // Get preview info diff --git a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs index 04b76b0d7e..37e7fe578a 100644 --- a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs @@ -1891,4 +1891,18 @@ namespace BrewMonster public static byte SKIN_FASHION_FOOT_INDEX = 9; public static byte NUM_SKIN_INDEX = 10; } + public enum enumSkinShow + { + enumSkinShowNone = 0, + enumSkinShowUpperBody, + enumSkinShowWrist, + enumSkinShowLowerBody, + enumSkinShowFoot, + enumSkinShowUpperAndLower, + enumSkinShowUpperAndWrist, + enumSkinShowLowerAndFoot, + enumSkinShowUpperLowerAndWrist, + enumSkinShowArmet, + enumSkinShowHand, + }; } \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs b/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs index 01439f3edb..8802f06b2e 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs @@ -53,7 +53,6 @@ public class CECNPC : CECObject [SerializeField] protected NPCVisual npcVisual; protected static CECStringTab m_ActionNames; - /* public string NameNPC => m_strName; public string ROLEBASICPROP => m_strName;*/ @@ -69,6 +68,54 @@ public class CECNPC : CECObject m_pNPCModelPolicy = new CECNPCModelDefaultPolicy(this); } + // Add this field to CECNPC class + private bool m_bHasRelatedTask = false; + + private float _timerCheckTask = 0; + public void UpdateTaskIcon() + { + // Check if npcUI is assigned + if (m_npcUI == null) + { + m_npcUI = GetComponentInChildren(); + if (m_npcUI == null) return; + } + + // 2. Get Host Player & Interface + var host = CECGameRun.Instance.GetHostPlayer(); + if (host == null) return; + + var taskInterface = host.GetTaskInterface(); + if (taskInterface == null) + { + if (m_bHasRelatedTask) // only update if state changed + { + m_npcUI.SetTaskIconMain(false); + m_bHasRelatedTask = false; + } + return; + } + + // Get NPC Template ID + int npcTemplateID = m_NPCInfo.tid; + + // Check if there are tasks related to this NPC + bool hasTask = taskInterface.HasTaskRelatedToNPC(npcTemplateID); + + // Update icon only if state changed + if (m_bHasRelatedTask != hasTask) + { + m_bHasRelatedTask = hasTask; + m_npcUI.SetTaskIconMain(hasTask); + + if (hasTask) + { + Debug.Log($"[Icon] NPC {m_strName} (TID: {npcTemplateID})"); + } + } + } + + public string GetName() { return m_strName; @@ -180,6 +227,7 @@ public class CECNPC : CECObject new Vector2(pHost.transform.position.x, pHost.transform.position.z)); } + UpdateTaskIcon(); return true; } @@ -513,6 +561,13 @@ public class CECNPC : CECObject { StartAdjustTransparency(-1.0f, GetTransparentLimit(), 500); } + + _timerCheckTask += Time.deltaTime; + if (_timerCheckTask > 1.0f) + { + _timerCheckTask = 0; + UpdateTaskIcon(); + } } private void TickWork_Dead(float deltaTime) diff --git a/Assets/PerfectWorld/Scripts/NPC/CECNPCServer.cs b/Assets/PerfectWorld/Scripts/NPC/CECNPCServer.cs index e0bb7eb963..83d88af57c 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECNPCServer.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECNPCServer.cs @@ -57,6 +57,8 @@ public class CECNPCServer : CECNPC transform.position = EC_Utility.ToVector3(info.pos); StartWork((int)WorkType.WT_NOTHING, (int)WorkID.WORK_STAND); + + UpdateTaskIcon(); return true; } diff --git a/Assets/PerfectWorld/Scripts/Task/ATaskTemplMan.cs b/Assets/PerfectWorld/Scripts/Task/ATaskTemplMan.cs index 74099bc7cd..b3a1af2b43 100644 --- a/Assets/PerfectWorld/Scripts/Task/ATaskTemplMan.cs +++ b/Assets/PerfectWorld/Scripts/Task/ATaskTemplMan.cs @@ -300,6 +300,97 @@ namespace BrewMonster.Scripts.Task return tasks; } + // Add this method to ATaskTemplMan class if not exists + public List GetAllTopTasks() + { + List topTasks = new List(); + + // Iterate through all task templates and collect top-level tasks + // Assuming you have a dictionary or collection of all tasks + foreach (var kvp in m_TaskTemplMap) // Replace with your actual collection name + { + var templ = kvp.Value; + if (templ != null && templ.m_pParent == null) // Top-level task has no parent + { + topTasks.Add(templ); + } + } + + return topTasks; + } + + // Alternative method if you want to check by NPC ID directly + public List GetAvailableTasksForNPC(int npcID) + { + List availableTasks = new List(); + + foreach (var kvp in m_TaskTemplMap) // Replace with your actual collection name + { + var templ = kvp.Value; + if (templ != null && + templ.m_pParent == null && + templ.m_FixedData.m_ulDelvNPC == npcID) + { + availableTasks.Add(templ); + } + } + + return availableTasks; + } + + // Add this method to ATaskTemplMan class + + /// + /// Get all task templates (for iterating to find available tasks) + /// Lấy tất cả task templates (để duyệt tìm nhiệm vụ có thể nhận) + /// + public List GetAllTaskTemplates() + { + List allTasks = new List(); + + // Assuming you have a collection storing all task templates + // Replace m_TaskMap with your actual collection name + if (m_TaskTemplMap != null) + { + foreach (var kvp in m_TaskTemplMap) + { + if (kvp.Value != null) + { + allTasks.Add(kvp.Value); + } + } + } + + return allTasks; + } + + /// + /// Get list of tasks delivered by a specific NPC + /// + public List GetTasksFromNPC(int npcID) + { + var result = new List(); + + // Check if NPC info map is available + if (m_NPCInfoMap != null && m_NPCInfoMap.TryGetValue((uint)npcID, out var npcInfo)) + { + return new List(); + } + else + { + // Fallback + foreach (var kvp in m_TaskTemplMap) + { + var templ = kvp.Value; + if (templ != null && templ.m_FixedData.m_ulDelvNPC == npcID) + { + result.Add(templ); + } + } + } + + return result; + } // General method to read a struct from a FileStream private T ReadStruct(FileStream stream) where T : struct diff --git a/Assets/PerfectWorld/Scripts/Task/CECTaskInterface.cs b/Assets/PerfectWorld/Scripts/Task/CECTaskInterface.cs index 49dd15cca7..2a6ca41983 100644 --- a/Assets/PerfectWorld/Scripts/Task/CECTaskInterface.cs +++ b/Assets/PerfectWorld/Scripts/Task/CECTaskInterface.cs @@ -1,17 +1,19 @@ +using BrewMonster.Managers; using BrewMonster.Network; +using BrewMonster.Scripts; // For CECNavigateCtrl +using BrewMonster.UI; +using CSNetwork; using CSNetwork.GPDataType; +using Cysharp.Threading.Tasks; using PerfectWorld.Scripts.Task; +using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; using System.Threading; -using BrewMonster.UI; -using CSNetwork; -using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.Networking; -using System; -using BrewMonster.Scripts; // For CECNavigateCtrl +using static BrewMonster.TASKDICE_ESSENCE; namespace BrewMonster.Scripts.Task { @@ -528,85 +530,164 @@ namespace BrewMonster.Scripts.Task { return m_pActiveListBuf; } - - // private void InitActiveTaskList() - // { - // ActiveTaskList pLst = GetActiveTaskList(); - // if (pLst == null) return; - // - // ATaskTemplMan pMan = GetTaskTemplMan(); - // if (pMan == null) return; - // - // // reset counters - // pLst.m_uTopShowTaskCount = 0; - // pLst.m_uTopHideTaskCount = 0; - // pLst.m_uTitleTaskCount = 0; - // - // byte i = 0; - // while (i < pLst.m_uTaskCount) - // { - // ActiveTaskEntry entry = pLst.m_TaskEntries[i]; - // if (entry == null) - // { - // i++; - // continue; - // } - // - // // repair sibling linkage - // if (entry.m_NextSblIndex != (char)0xff) - // { - // ActiveTaskEntry entryNextSbl = pLst.m_TaskEntries[entry.m_NextSblIndex]; - // if (entryNextSbl == null || entryNextSbl.m_PrevSblIndex != (char)i) - // { - // entry.m_NextSblIndex = (char)0xff; - // } - // } - // - // // resolve template for top-level entries; children left unresolved in C# - // if (entry.m_ParentIndex == (char)0xff) - // { - // // entry.m_ulTemplAddr = 0u; - // entry.m_ulTemplAddr = pMan.GetTopTaskByID(entry.m_ID) != null ? 1u : 0u; - // - // ATaskTempl topTempl = pMan.GetTopTaskByID(entry.m_ID); - // if (topTempl != null) - // { - // if (topTempl.m_FixedData.m_bHidden) - // pLst.m_uTopHideTaskCount++; - // else if (topTempl.m_FixedData.m_bDisplayInTitleTaskUI) - // pLst.m_uTitleTaskCount++; - // else - // pLst.m_uTopShowTaskCount++; - // } - // } - // else - // { - // entry.m_ulTemplAddr = 0u; - // } - // - // // cap template best-effort (no pointer in managed) - // if (entry.m_uCapTaskId != 0) - // { - // ATaskTempl cap = pMan.GetTopTaskByID(entry.m_uCapTaskId); - // entry.m_ulCapTemplAddr = 0u; - // if (cap == null) - // { - // entry.m_uCapTaskId = 0; - // } - // } - // else - // { - // entry.m_ulCapTemplAddr = 0u; - // } - // - // i++; - // } - // - // // approximate used count - // pLst.m_uUsedCount = pLst.m_uTaskCount; - // } - - public void InitActiveTaskList() + + // Trong file CECTaskInterface.cs + + public bool HasTaskRelatedToNPC(int npcID) + { + // Check tasks is active + ActiveTaskList activeList = GetActiveTaskList(); + if (activeList != null && activeList.m_TaskEntries != null) + { + for (int i = 0; i < activeList.m_uTaskCount; i++) + { + var entry = activeList.m_TaskEntries[i]; + if (entry == null) continue; + + ATaskTempl templ = entry.GetTempl(); + if (templ == null) continue; + + // Check if this NPC is the target of the task + if (IsNPCTargetOfTask(templ, entry, npcID)) + { + return true; + } + } + } + + // Check tasks new + ATaskTemplMan taskMan = GetTaskTemplMan(); + if (taskMan != null) + { + List npcTasks = taskMan.GetTasksFromNPC(npcID); + if (npcTasks != null) + { + uint ulCurTime = GetCurTime(); + foreach (var templ in npcTasks) + { + // Check prerequisite + if (templ.CheckPrerequisite(this, activeList, ulCurTime) == 0) + { + return true; + } + } + } + } + + return false; + } + + // Check NPC is target of the task + private bool IsNPCTargetOfTask(ATaskTempl templ, ActiveTaskEntry entry, int npcID) + { + var data = templ.m_FixedData; + + // Task completed case + if (entry.IsFinished()) + { + if (data.m_ulAwardNPC == npcID) return true; + } + else + { + // NPC target + if (data.m_ulNPCMoving == npcID) return true; + + // Pos target + if (data.m_ulNPCDestSite == npcID) return true; + + // Security target + if (data.m_ulNPCToProtect == npcID) return true; + + if (data.m_enumMethod == (ulong)TaskCompletionMethod.enumTMTalkToNPC) + { + if (data.m_ulNPCMoving == 0 && data.m_ulAwardNPC == npcID) + { + return true; + } + } + } + return false; + } + + + // private void InitActiveTaskList() + // { + // ActiveTaskList pLst = GetActiveTaskList(); + // if (pLst == null) return; + // + // ATaskTemplMan pMan = GetTaskTemplMan(); + // if (pMan == null) return; + // + // // reset counters + // pLst.m_uTopShowTaskCount = 0; + // pLst.m_uTopHideTaskCount = 0; + // pLst.m_uTitleTaskCount = 0; + // + // byte i = 0; + // while (i < pLst.m_uTaskCount) + // { + // ActiveTaskEntry entry = pLst.m_TaskEntries[i]; + // if (entry == null) + // { + // i++; + // continue; + // } + // + // // repair sibling linkage + // if (entry.m_NextSblIndex != (char)0xff) + // { + // ActiveTaskEntry entryNextSbl = pLst.m_TaskEntries[entry.m_NextSblIndex]; + // if (entryNextSbl == null || entryNextSbl.m_PrevSblIndex != (char)i) + // { + // entry.m_NextSblIndex = (char)0xff; + // } + // } + // + // // resolve template for top-level entries; children left unresolved in C# + // if (entry.m_ParentIndex == (char)0xff) + // { + // // entry.m_ulTemplAddr = 0u; + // entry.m_ulTemplAddr = pMan.GetTopTaskByID(entry.m_ID) != null ? 1u : 0u; + // + // ATaskTempl topTempl = pMan.GetTopTaskByID(entry.m_ID); + // if (topTempl != null) + // { + // if (topTempl.m_FixedData.m_bHidden) + // pLst.m_uTopHideTaskCount++; + // else if (topTempl.m_FixedData.m_bDisplayInTitleTaskUI) + // pLst.m_uTitleTaskCount++; + // else + // pLst.m_uTopShowTaskCount++; + // } + // } + // else + // { + // entry.m_ulTemplAddr = 0u; + // } + // + // // cap template best-effort (no pointer in managed) + // if (entry.m_uCapTaskId != 0) + // { + // ATaskTempl cap = pMan.GetTopTaskByID(entry.m_uCapTaskId); + // entry.m_ulCapTemplAddr = 0u; + // if (cap == null) + // { + // entry.m_uCapTaskId = 0; + // } + // } + // else + // { + // entry.m_ulCapTemplAddr = 0u; + // } + // + // i++; + // } + // + // // approximate used count + // pLst.m_uUsedCount = pLst.m_uTaskCount; + // } + + public void InitActiveTaskList() { ActiveTaskList pLst = GetActiveTaskList(); FinishedTaskList pFnsh = GetFinishedTaskList(); @@ -1058,10 +1139,11 @@ namespace BrewMonster.Scripts.Task // TODO: Expose account total cash on host/session return 0u; } - + + #if _TASK_CLIENT - // Prepare award preview based on task and state - public void GetTaskAwardPreview(uint ulTaskId, ref Task_Award_Preview p, bool bActiveTask=true) + // Prepare award preview based on task and state + public void GetTaskAwardPreview(uint ulTaskId, ref Task_Award_Preview p, bool bActiveTask=true) { // Zero and init output p = default; @@ -1644,7 +1726,7 @@ namespace BrewMonster.Scripts.Task { UnityEngine.Debug.Log($"[CECTaskInterface] OnNewTask: Task {iTaskID} is not a force navigate task (pTempl={pTempl != null}, method={pTempl?.m_FixedData.m_enumMethod})"); } - } + } public void OnTaskConfirmUpdate() { @@ -1676,7 +1758,7 @@ namespace BrewMonster.Scripts.Task { UnityEngine.Debug.Log($"[CECTaskInterface] OnCompleteTask: Task {iTaskID} is not a force navigate task"); } - } + } public void TakeAwayCommonItem(uint ulTemplId, uint ulNum) {} @@ -1699,7 +1781,7 @@ namespace BrewMonster.Scripts.Task { UnityEngine.Debug.Log($"[CECTaskInterface] OnGiveupTask: Task {iTaskID} is not a force navigate task"); } - } + } // Handle task text click in UI - trigger navigation if it's a force navigate task // 处理任务UI文本点击 - 如果是强制导航任务则触发导航 // This is called when user clicks on task name/link in the task UI // 当用户在任务UI中点击任务名称/链接时调用 diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs new file mode 100644 index 0000000000..6f306b8923 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs @@ -0,0 +1,322 @@ +using BrewMonster.Network; +using BrewMonster.Scripts.Managers; +using BrewMonster.Scripts.Task; +using BrewMonster.UI; +using CSNetwork; +using ModelRenderer.Scripts.Common; +using PerfectWorld.Scripts.Managers; +using PerfectWorld.Scripts.Task; +using System; +using System.Collections.Generic; +using System.Text; +using TMPro; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace BrewMonster +{ + public class DlgInstall : AUIDialog + { + [Header("Slot First")] + [SerializeField] private Transform m_SlotFirstParent; + [SerializeField] private TextMeshProUGUI m_TxtFirstName; + + [Header("Slot Second")] + [SerializeField] private Transform m_SlotSecondlParent; + [SerializeField] private TextMeshProUGUI m_TxtSecondName; + + [Header("Buttons and Money")] + [SerializeField] private TextMeshProUGUI m_TxtMoney; + [SerializeField] private Button m_BtnInstall; + [SerializeField] private Button m_BtnCancel; + + [SerializeField] private Sprite khung_item; + + private EC_IvtrItem m_SelectedEquip; + private EC_IvtrItem m_SelectedMaterial; + + private int m_FirstInvSlot = -1; + private int m_SecondInvSlot = -1; + + public override void Awake() + { + base.Awake(); + RegisterDrop(m_SlotFirstParent, OnDropEquip); + RegisterDrop(m_SlotSecondlParent, OnDropMaterial); + RegisterClick(m_SlotFirstParent, OnClickEquipSlot); + RegisterClick(m_SlotSecondlParent, OnClickMaterialSlot); + } + + public void OnpenInstall(uint npcId) + { + + } + + public void CloseInstall() + { + gameObject.SetActive(false); + RestoreInventoryColors(); + } + + private void RestoreInventoryColors() + { + var canvas = FindFirstObjectByType(); + if (canvas == null) + return; + + if (m_FirstInvSlot >= 0) + { + var btn = FindInventoryButtonBySlot(m_FirstInvSlot); + SetInventorySlotGray(btn, false); + m_FirstInvSlot = -1; + } + + if (m_SecondInvSlot >= 0) + { + var btn = FindInventoryButtonBySlot(m_SecondInvSlot); + SetInventorySlotGray(btn, false); + m_SecondInvSlot = -1; + } + } + + private Button FindInventoryButtonBySlot(int slot) + { + var inventoryUI = FindFirstObjectByType(); + if (inventoryUI == null) + return null; + + var field = typeof(EC_InventoryUI) + .GetField("inventoryPackButtons", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + + if (field == null) + return null; + + var list = field.GetValue(inventoryUI) as List